diff options
author | balrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-12-24 14:33:24 +0000 |
---|---|---|
committer | balrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-12-24 14:33:24 +0000 |
commit | 33f002714be2ed58ed05ae3870d5ea6915df4b47 (patch) | |
tree | 6b5f907e0c0b42bc6ca4222f1e14462be5e30c1a /hw | |
parent | 3e98dc8ec6af89c7f4f1e006b979eb405b431629 (diff) |
Add "cache" parameter to "-drive" (Laurent Vivier).
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3848 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw')
-rw-r--r-- | hw/fdc.c | 7 | ||||
-rw-r--r-- | hw/ide.c | 18 | ||||
-rw-r--r-- | hw/scsi-disk.c | 3 | ||||
-rw-r--r-- | hw/sd.c | 40 |
4 files changed, 41 insertions, 27 deletions
@@ -382,7 +382,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; @@ -598,6 +598,11 @@ fdctrl_t *fdctrl_init (qemu_irq irq, 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); @@ -365,7 +365,7 @@ typedef struct IDEState { EndTransferFunc *end_transfer_func; uint8_t *data_ptr; uint8_t *data_end; - uint8_t io_buffer[MAX_MULT_SECTORS*512 + 4]; + uint8_t *io_buffer; QEMUTimer *sector_write_timer; /* only used for win2k install hack */ uint32_t irq_count; /* counts IRQs when using win2k install hack */ /* CF-ATA extended error */ @@ -2377,17 +2377,24 @@ struct partition { static int guess_disk_lchs(IDEState *s, int *pcylinders, int *pheads, int *psectors) { - uint8_t buf[512]; + uint8_t *buf; int ret, i, heads, sectors, cylinders; struct partition *p; uint32_t nr_sects; + buf = qemu_memalign(512, 512); + if (buf == NULL) + return -1; ret = bdrv_read(s->bs, 0, buf, 1); - if (ret < 0) + if (ret < 0) { + qemu_free(buf); return -1; + } /* test msdos magic */ - if (buf[510] != 0x55 || buf[511] != 0xaa) + if (buf[510] != 0x55 || buf[511] != 0xaa) { + qemu_free(buf); return -1; + } for(i = 0; i < 4; i++) { p = ((struct partition *)(buf + 0x1be)) + i; nr_sects = le32_to_cpu(p->nr_sects); @@ -2408,9 +2415,11 @@ static int guess_disk_lchs(IDEState *s, printf("guessed geometry: LCHS=%d %d %d\n", cylinders, heads, sectors); #endif + qemu_free(buf); return 0; } } + qemu_free(buf); return -1; } @@ -2425,6 +2434,7 @@ static void ide_init2(IDEState *ide_state, for(i = 0; i < 2; i++) { s = ide_state + i; + s->io_buffer = qemu_memalign(512, MAX_MULT_SECTORS*512 + 4); if (i == 0) s->bs = hd0; else diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index 220b1997cc..b3e1ed71b0 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -46,7 +46,7 @@ typedef struct SCSIRequest { int sector_count; /* The amounnt of data in the buffer. */ int buf_len; - uint8_t dma_buf[SCSI_DMA_BUF_SIZE]; + uint8_t *dma_buf; BlockDriverAIOCB *aiocb; struct SCSIRequest *next; } SCSIRequest; @@ -78,6 +78,7 @@ static SCSIRequest *scsi_new_request(SCSIDeviceState *s, uint32_t tag) free_requests = r->next; } else { r = qemu_malloc(sizeof(SCSIRequest)); + r->dma_buf = qemu_memalign(512, SCSI_DMA_BUF_SIZE); } r->dev = s; r->tag = tag; @@ -96,6 +96,7 @@ struct SDState { qemu_irq readonly_cb; qemu_irq inserted_cb; BlockDriverState *bdrv; + uint8_t *buf; }; static void sd_set_status(SDState *sd) @@ -405,6 +406,7 @@ SDState *sd_init(BlockDriverState *bs, int is_spi) SDState *sd; sd = (SDState *) qemu_mallocz(sizeof(SDState)); + sd->buf = qemu_memalign(512, 512); sd->spi = is_spi; sd_reset(sd, bs); bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd); @@ -1281,64 +1283,60 @@ int sd_do_command(SDState *sd, struct sd_request_s *req, } /* No real need for 64 bit addresses here */ -static void sd_blk_read(BlockDriverState *bdrv, - void *data, uint32_t addr, uint32_t len) +static void sd_blk_read(SDState *sd, uint32_t addr, uint32_t len) { - uint8_t buf[512]; uint32_t end = addr + len; - if (!bdrv || bdrv_read(bdrv, addr >> 9, buf, 1) == -1) { + if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) == -1) { printf("sd_blk_read: read error on host side\n"); return; } if (end > (addr & ~511) + 512) { - memcpy(data, buf + (addr & 511), 512 - (addr & 511)); + memcpy(sd->data, sd->buf + (addr & 511), 512 - (addr & 511)); - if (bdrv_read(bdrv, end >> 9, buf, 1) == -1) { + if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) == -1) { printf("sd_blk_read: read error on host side\n"); return; } - memcpy(data + 512 - (addr & 511), buf, end & 511); + memcpy(sd->data + 512 - (addr & 511), sd->buf, end & 511); } else - memcpy(data, buf + (addr & 511), len); + memcpy(sd->data, sd->buf + (addr & 511), len); } -static void sd_blk_write(BlockDriverState *bdrv, - void *data, uint32_t addr, uint32_t len) +static void sd_blk_write(SDState *sd, uint32_t addr, uint32_t len) { - uint8_t buf[512]; uint32_t end = addr + len; if ((addr & 511) || len < 512) - if (!bdrv || bdrv_read(bdrv, addr >> 9, buf, 1) == -1) { + if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) == -1) { printf("sd_blk_write: read error on host side\n"); return; } if (end > (addr & ~511) + 512) { - memcpy(buf + (addr & 511), data, 512 - (addr & 511)); - if (bdrv_write(bdrv, addr >> 9, buf, 1) == -1) { + memcpy(sd->buf + (addr & 511), sd->data, 512 - (addr & 511)); + if (bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) == -1) { printf("sd_blk_write: write error on host side\n"); return; } - if (bdrv_read(bdrv, end >> 9, buf, 1) == -1) { + if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) == -1) { printf("sd_blk_write: read error on host side\n"); return; } - memcpy(buf, data + 512 - (addr & 511), end & 511); - if (bdrv_write(bdrv, end >> 9, buf, 1) == -1) + memcpy(sd->buf, sd->data + 512 - (addr & 511), end & 511); + if (bdrv_write(sd->bdrv, end >> 9, sd->buf, 1) == -1) printf("sd_blk_write: write error on host side\n"); } else { - memcpy(buf + (addr & 511), data, len); - if (!bdrv || bdrv_write(bdrv, addr >> 9, buf, 1) == -1) + memcpy(sd->buf + (addr & 511), sd->data, len); + if (!sd->bdrv || bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) == -1) printf("sd_blk_write: write error on host side\n"); } } -#define BLK_READ_BLOCK(a, len) sd_blk_read(sd->bdrv, sd->data, a, len) -#define BLK_WRITE_BLOCK(a, len) sd_blk_write(sd->bdrv, sd->data, a, len) +#define BLK_READ_BLOCK(a, len) sd_blk_read(sd, a, len) +#define BLK_WRITE_BLOCK(a, len) sd_blk_write(sd, a, len) #define APP_READ_BLOCK(a, len) memset(sd->data, 0xec, len) #define APP_WRITE_BLOCK(a, len) |