]> xenbits.xensource.com Git - xen.git/commitdiff
ioemu: backport upstream's qemu_memalign.
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 14 Feb 2008 09:26:38 +0000 (09:26 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 14 Feb 2008 09:26:38 +0000 (09:26 +0000)
Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
tools/ioemu/block-vbd.c
tools/ioemu/hw/fdc.c
tools/ioemu/hw/ide.c
tools/ioemu/hw/scsi-disk.c
tools/ioemu/osdep.c
tools/ioemu/osdep.h

index 5561cf1787a108162f2505715c0d95c29cd2fc6b..937bb5e62d1497a0715435b3901df5c26efbbac7 100644 (file)
@@ -227,7 +227,7 @@ static int vbd_read(BlockDriverState *bs,
      * copying */
     if (!((uintptr_t)buf & (SECTOR_SIZE-1)))
        return vbd_aligned_io(bs, sector_num, buf, nb_sectors, 0);
-    iobuf = memalign(PAGE_SIZE, nb_sectors * SECTOR_SIZE);
+    iobuf = qemu_memalign(PAGE_SIZE, nb_sectors * SECTOR_SIZE);
     ret = vbd_aligned_io(bs, sector_num, iobuf, nb_sectors, 0);
     memcpy(buf, iobuf, nb_sectors * SECTOR_SIZE);
     free(iobuf);
@@ -246,7 +246,7 @@ static int vbd_write(BlockDriverState *bs,
     int ret;
     if (!((uintptr_t)buf & (SECTOR_SIZE-1)))
        return vbd_aligned_io(bs, sector_num, (uint8_t*) buf, nb_sectors, 1);
-    iobuf = memalign(PAGE_SIZE, nb_sectors * SECTOR_SIZE);
+    iobuf = qemu_memalign(PAGE_SIZE, nb_sectors * SECTOR_SIZE);
     memcpy(iobuf, buf, nb_sectors * SECTOR_SIZE);
     ret = vbd_aligned_io(bs, sector_num, iobuf, nb_sectors, 1);
     free(iobuf);
index dc2ea6ebffc978fefc640d97a557c203f72ca4f7..5989afd7d07bbf68121bbba87b10d398cc906904 100644 (file)
@@ -378,7 +378,7 @@ struct fdctrl_t {
     uint8_t cur_drv;
     uint8_t bootsel;
     /* Command FIFO */
-    uint8_t fifo[FD_SECTOR_LEN];
+    uint8_t *fifo;
     uint32_t data_pos;
     uint32_t data_len;
     uint8_t data_state;
@@ -497,6 +497,11 @@ fdctrl_t *fdctrl_init (int irq_lvl, int dma_chann, int mem_mapped,
     fdctrl = qemu_mallocz(sizeof(fdctrl_t));
     if (!fdctrl)
         return NULL;
+    fdctrl->fifo = qemu_memalign(512, FD_SECTOR_LEN);
+    if (fdctrl->fifo == NULL) {
+        qemu_free(fdctrl);
+        return NULL;
+    }
     fdctrl->result_timer = qemu_new_timer(vm_clock, 
                                           fdctrl_result_timer, fdctrl);
 
index cba064bd101d1218c918bf6c8aed0c04279ba3a2..9dd9653aa91877907f99daf0bff2cddc179cd237 100644 (file)
@@ -2306,7 +2306,7 @@ static void ide_init2(IDEState *ide_state,
 
     for(i = 0; i < 2; i++) {
         s = ide_state + i;
-        s->io_buffer = memalign(getpagesize(), MAX_MULT_SECTORS*512 + 4);
+        s->io_buffer = qemu_memalign(getpagesize(), MAX_MULT_SECTORS*512 + 4);
         if (i == 0)
             s->bs = hd0;
         else
index d62d4d0d9580774759b384407028aa7f67deae9e..acbe75fc98030d8c22e125d008fa2bae62a1700d 100644 (file)
@@ -81,7 +81,7 @@ static SCSIRequest *scsi_new_request(SCSIDevice *s, uint32_t tag)
         free_requests = r->next;
     } else {
         r = qemu_malloc(sizeof(SCSIRequest));
-       r->dma_buf = memalign(getpagesize(), SCSI_DMA_BUF_SIZE);
+       r->dma_buf = qemu_memalign(getpagesize(), SCSI_DMA_BUF_SIZE);
     }
     r->dev = s;
     r->tag = tag;
index d1eff8deb5cb0c2a529971c8a4b052d425c88554..5ec16b47da8b8233fbf2d4a7b086d037060d8404 100644 (file)
@@ -61,6 +61,10 @@ void *qemu_malloc(size_t size)
 }
 
 #if defined(_WIN32)
+void *qemu_memalign(size_t alignment, size_t size)
+{
+    return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
+}
 
 void *qemu_vmalloc(size_t size)
 {
@@ -172,6 +176,22 @@ void kqemu_vfree(void *ptr)
 
 #endif
 
+void *qemu_memalign(size_t alignment, size_t size)
+{
+#if defined(_POSIX_C_SOURCE)
+    int ret;
+    void *ptr;
+    ret = posix_memalign(&ptr, alignment, size);
+    if (ret != 0)
+        return NULL;
+    return ptr;
+#elif defined(_BSD)
+    return valloc(size);
+#else
+    return memalign(alignment, size);
+#endif
+}
+
 /* alloc shared memory pages */
 void *qemu_vmalloc(size_t size)
 {
index bd6ffc1713931ecb52dde373a653ae00aa705fc5..6df1d87d12023adbc6286be034a890b01febc245 100644 (file)
@@ -14,6 +14,7 @@ void *qemu_mallocz(size_t size);
 void qemu_free(void *ptr);
 char *qemu_strdup(const char *str);
 
+void *qemu_memalign(size_t alignment, size_t size);
 void *qemu_vmalloc(size_t size);
 void qemu_vfree(void *ptr);