mirror of https://github.com/xemu-project/xemu.git
Add "cache" parameter to "-drive" (Laurent Vivier).
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3848 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
3e98dc8ec6
commit
33f002714b
|
@ -106,6 +106,10 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags)
|
||||||
}
|
}
|
||||||
if (flags & BDRV_O_CREAT)
|
if (flags & BDRV_O_CREAT)
|
||||||
open_flags |= O_CREAT | O_TRUNC;
|
open_flags |= O_CREAT | O_TRUNC;
|
||||||
|
#ifdef O_DIRECT
|
||||||
|
if (flags & BDRV_O_DIRECT)
|
||||||
|
open_flags |= O_DIRECT;
|
||||||
|
#endif
|
||||||
|
|
||||||
s->type = FTYPE_FILE;
|
s->type = FTYPE_FILE;
|
||||||
|
|
||||||
|
@ -659,6 +663,10 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags)
|
||||||
open_flags |= O_RDONLY;
|
open_flags |= O_RDONLY;
|
||||||
bs->read_only = 1;
|
bs->read_only = 1;
|
||||||
}
|
}
|
||||||
|
#ifdef O_DIRECT
|
||||||
|
if (flags & BDRV_O_DIRECT)
|
||||||
|
open_flags |= O_DIRECT;
|
||||||
|
#endif
|
||||||
|
|
||||||
s->type = FTYPE_FILE;
|
s->type = FTYPE_FILE;
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
|
|
|
@ -105,6 +105,8 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags)
|
||||||
#else
|
#else
|
||||||
overlapped = FILE_FLAG_OVERLAPPED;
|
overlapped = FILE_FLAG_OVERLAPPED;
|
||||||
#endif
|
#endif
|
||||||
|
if (flags & BDRV_O_DIRECT)
|
||||||
|
overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH;
|
||||||
s->hfile = CreateFile(filename, access_flags,
|
s->hfile = CreateFile(filename, access_flags,
|
||||||
FILE_SHARE_READ, NULL,
|
FILE_SHARE_READ, NULL,
|
||||||
create_flags, overlapped, NULL);
|
create_flags, overlapped, NULL);
|
||||||
|
@ -473,6 +475,8 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags)
|
||||||
#else
|
#else
|
||||||
overlapped = FILE_FLAG_OVERLAPPED;
|
overlapped = FILE_FLAG_OVERLAPPED;
|
||||||
#endif
|
#endif
|
||||||
|
if (flags & BDRV_O_DIRECT)
|
||||||
|
overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH;
|
||||||
s->hfile = CreateFile(filename, access_flags,
|
s->hfile = CreateFile(filename, access_flags,
|
||||||
FILE_SHARE_READ, NULL,
|
FILE_SHARE_READ, NULL,
|
||||||
create_flags, overlapped, NULL);
|
create_flags, overlapped, NULL);
|
||||||
|
|
2
block.c
2
block.c
|
@ -380,7 +380,7 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
|
||||||
/* Note: for compatibility, we open disk image files as RDWR, and
|
/* Note: for compatibility, we open disk image files as RDWR, and
|
||||||
RDONLY as fallback */
|
RDONLY as fallback */
|
||||||
if (!(flags & BDRV_O_FILE))
|
if (!(flags & BDRV_O_FILE))
|
||||||
open_flags = BDRV_O_RDWR;
|
open_flags = BDRV_O_RDWR | (flags & BDRV_O_DIRECT);
|
||||||
else
|
else
|
||||||
open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT);
|
open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT);
|
||||||
ret = drv->bdrv_open(bs, filename, open_flags);
|
ret = drv->bdrv_open(bs, filename, open_flags);
|
||||||
|
|
1
block.h
1
block.h
|
@ -44,6 +44,7 @@ typedef struct QEMUSnapshotInfo {
|
||||||
use a disk image format on top of
|
use a disk image format on top of
|
||||||
it (default for
|
it (default for
|
||||||
bdrv_file_open()) */
|
bdrv_file_open()) */
|
||||||
|
#define BDRV_O_DIRECT 0x0020
|
||||||
|
|
||||||
#ifndef QEMU_IMG
|
#ifndef QEMU_IMG
|
||||||
void bdrv_info(void);
|
void bdrv_info(void);
|
||||||
|
|
7
hw/fdc.c
7
hw/fdc.c
|
@ -382,7 +382,7 @@ struct fdctrl_t {
|
||||||
uint8_t cur_drv;
|
uint8_t cur_drv;
|
||||||
uint8_t bootsel;
|
uint8_t bootsel;
|
||||||
/* Command FIFO */
|
/* Command FIFO */
|
||||||
uint8_t fifo[FD_SECTOR_LEN];
|
uint8_t *fifo;
|
||||||
uint32_t data_pos;
|
uint32_t data_pos;
|
||||||
uint32_t data_len;
|
uint32_t data_len;
|
||||||
uint8_t data_state;
|
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));
|
fdctrl = qemu_mallocz(sizeof(fdctrl_t));
|
||||||
if (!fdctrl)
|
if (!fdctrl)
|
||||||
return NULL;
|
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 = qemu_new_timer(vm_clock,
|
||||||
fdctrl_result_timer, fdctrl);
|
fdctrl_result_timer, fdctrl);
|
||||||
|
|
||||||
|
|
18
hw/ide.c
18
hw/ide.c
|
@ -365,7 +365,7 @@ typedef struct IDEState {
|
||||||
EndTransferFunc *end_transfer_func;
|
EndTransferFunc *end_transfer_func;
|
||||||
uint8_t *data_ptr;
|
uint8_t *data_ptr;
|
||||||
uint8_t *data_end;
|
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 */
|
QEMUTimer *sector_write_timer; /* only used for win2k install hack */
|
||||||
uint32_t irq_count; /* counts IRQs when using win2k install hack */
|
uint32_t irq_count; /* counts IRQs when using win2k install hack */
|
||||||
/* CF-ATA extended error */
|
/* CF-ATA extended error */
|
||||||
|
@ -2377,17 +2377,24 @@ struct partition {
|
||||||
static int guess_disk_lchs(IDEState *s,
|
static int guess_disk_lchs(IDEState *s,
|
||||||
int *pcylinders, int *pheads, int *psectors)
|
int *pcylinders, int *pheads, int *psectors)
|
||||||
{
|
{
|
||||||
uint8_t buf[512];
|
uint8_t *buf;
|
||||||
int ret, i, heads, sectors, cylinders;
|
int ret, i, heads, sectors, cylinders;
|
||||||
struct partition *p;
|
struct partition *p;
|
||||||
uint32_t nr_sects;
|
uint32_t nr_sects;
|
||||||
|
|
||||||
|
buf = qemu_memalign(512, 512);
|
||||||
|
if (buf == NULL)
|
||||||
|
return -1;
|
||||||
ret = bdrv_read(s->bs, 0, buf, 1);
|
ret = bdrv_read(s->bs, 0, buf, 1);
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
|
qemu_free(buf);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
/* test msdos magic */
|
/* test msdos magic */
|
||||||
if (buf[510] != 0x55 || buf[511] != 0xaa)
|
if (buf[510] != 0x55 || buf[511] != 0xaa) {
|
||||||
|
qemu_free(buf);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
for(i = 0; i < 4; i++) {
|
for(i = 0; i < 4; i++) {
|
||||||
p = ((struct partition *)(buf + 0x1be)) + i;
|
p = ((struct partition *)(buf + 0x1be)) + i;
|
||||||
nr_sects = le32_to_cpu(p->nr_sects);
|
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",
|
printf("guessed geometry: LCHS=%d %d %d\n",
|
||||||
cylinders, heads, sectors);
|
cylinders, heads, sectors);
|
||||||
#endif
|
#endif
|
||||||
|
qemu_free(buf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
qemu_free(buf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2425,6 +2434,7 @@ static void ide_init2(IDEState *ide_state,
|
||||||
|
|
||||||
for(i = 0; i < 2; i++) {
|
for(i = 0; i < 2; i++) {
|
||||||
s = ide_state + i;
|
s = ide_state + i;
|
||||||
|
s->io_buffer = qemu_memalign(512, MAX_MULT_SECTORS*512 + 4);
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
s->bs = hd0;
|
s->bs = hd0;
|
||||||
else
|
else
|
||||||
|
|
|
@ -46,7 +46,7 @@ typedef struct SCSIRequest {
|
||||||
int sector_count;
|
int sector_count;
|
||||||
/* The amounnt of data in the buffer. */
|
/* The amounnt of data in the buffer. */
|
||||||
int buf_len;
|
int buf_len;
|
||||||
uint8_t dma_buf[SCSI_DMA_BUF_SIZE];
|
uint8_t *dma_buf;
|
||||||
BlockDriverAIOCB *aiocb;
|
BlockDriverAIOCB *aiocb;
|
||||||
struct SCSIRequest *next;
|
struct SCSIRequest *next;
|
||||||
} SCSIRequest;
|
} SCSIRequest;
|
||||||
|
@ -78,6 +78,7 @@ static SCSIRequest *scsi_new_request(SCSIDeviceState *s, uint32_t tag)
|
||||||
free_requests = r->next;
|
free_requests = r->next;
|
||||||
} else {
|
} else {
|
||||||
r = qemu_malloc(sizeof(SCSIRequest));
|
r = qemu_malloc(sizeof(SCSIRequest));
|
||||||
|
r->dma_buf = qemu_memalign(512, SCSI_DMA_BUF_SIZE);
|
||||||
}
|
}
|
||||||
r->dev = s;
|
r->dev = s;
|
||||||
r->tag = tag;
|
r->tag = tag;
|
||||||
|
|
40
hw/sd.c
40
hw/sd.c
|
@ -96,6 +96,7 @@ struct SDState {
|
||||||
qemu_irq readonly_cb;
|
qemu_irq readonly_cb;
|
||||||
qemu_irq inserted_cb;
|
qemu_irq inserted_cb;
|
||||||
BlockDriverState *bdrv;
|
BlockDriverState *bdrv;
|
||||||
|
uint8_t *buf;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void sd_set_status(SDState *sd)
|
static void sd_set_status(SDState *sd)
|
||||||
|
@ -405,6 +406,7 @@ SDState *sd_init(BlockDriverState *bs, int is_spi)
|
||||||
SDState *sd;
|
SDState *sd;
|
||||||
|
|
||||||
sd = (SDState *) qemu_mallocz(sizeof(SDState));
|
sd = (SDState *) qemu_mallocz(sizeof(SDState));
|
||||||
|
sd->buf = qemu_memalign(512, 512);
|
||||||
sd->spi = is_spi;
|
sd->spi = is_spi;
|
||||||
sd_reset(sd, bs);
|
sd_reset(sd, bs);
|
||||||
bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd);
|
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 */
|
/* No real need for 64 bit addresses here */
|
||||||
static void sd_blk_read(BlockDriverState *bdrv,
|
static void sd_blk_read(SDState *sd, uint32_t addr, uint32_t len)
|
||||||
void *data, uint32_t addr, uint32_t len)
|
|
||||||
{
|
{
|
||||||
uint8_t buf[512];
|
|
||||||
uint32_t end = addr + len;
|
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");
|
printf("sd_blk_read: read error on host side\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (end > (addr & ~511) + 512) {
|
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");
|
printf("sd_blk_read: read error on host side\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
memcpy(data + 512 - (addr & 511), buf, end & 511);
|
memcpy(sd->data + 512 - (addr & 511), sd->buf, end & 511);
|
||||||
} else
|
} else
|
||||||
memcpy(data, buf + (addr & 511), len);
|
memcpy(sd->data, sd->buf + (addr & 511), len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sd_blk_write(BlockDriverState *bdrv,
|
static void sd_blk_write(SDState *sd, uint32_t addr, uint32_t len)
|
||||||
void *data, uint32_t addr, uint32_t len)
|
|
||||||
{
|
{
|
||||||
uint8_t buf[512];
|
|
||||||
uint32_t end = addr + len;
|
uint32_t end = addr + len;
|
||||||
|
|
||||||
if ((addr & 511) || len < 512)
|
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");
|
printf("sd_blk_write: read error on host side\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (end > (addr & ~511) + 512) {
|
if (end > (addr & ~511) + 512) {
|
||||||
memcpy(buf + (addr & 511), data, 512 - (addr & 511));
|
memcpy(sd->buf + (addr & 511), sd->data, 512 - (addr & 511));
|
||||||
if (bdrv_write(bdrv, addr >> 9, buf, 1) == -1) {
|
if (bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) == -1) {
|
||||||
printf("sd_blk_write: write error on host side\n");
|
printf("sd_blk_write: write error on host side\n");
|
||||||
return;
|
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");
|
printf("sd_blk_write: read error on host side\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
memcpy(buf, data + 512 - (addr & 511), end & 511);
|
memcpy(sd->buf, sd->data + 512 - (addr & 511), end & 511);
|
||||||
if (bdrv_write(bdrv, end >> 9, buf, 1) == -1)
|
if (bdrv_write(sd->bdrv, end >> 9, sd->buf, 1) == -1)
|
||||||
printf("sd_blk_write: write error on host side\n");
|
printf("sd_blk_write: write error on host side\n");
|
||||||
} else {
|
} else {
|
||||||
memcpy(buf + (addr & 511), data, len);
|
memcpy(sd->buf + (addr & 511), sd->data, len);
|
||||||
if (!bdrv || bdrv_write(bdrv, addr >> 9, buf, 1) == -1)
|
if (!sd->bdrv || bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) == -1)
|
||||||
printf("sd_blk_write: write error on host side\n");
|
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_READ_BLOCK(a, len) sd_blk_read(sd, a, len)
|
||||||
#define BLK_WRITE_BLOCK(a, len) sd_blk_write(sd->bdrv, sd->data, 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_READ_BLOCK(a, len) memset(sd->data, 0xec, len)
|
||||||
#define APP_WRITE_BLOCK(a, len)
|
#define APP_WRITE_BLOCK(a, len)
|
||||||
|
|
||||||
|
|
20
osdep.c
20
osdep.c
|
@ -61,6 +61,10 @@ void *qemu_malloc(size_t size)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#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)
|
void *qemu_vmalloc(size_t size)
|
||||||
{
|
{
|
||||||
|
@ -172,6 +176,22 @@ static void kqemu_vfree(void *ptr)
|
||||||
|
|
||||||
#endif
|
#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 */
|
/* alloc shared memory pages */
|
||||||
void *qemu_vmalloc(size_t size)
|
void *qemu_vmalloc(size_t size)
|
||||||
{
|
{
|
||||||
|
|
1
osdep.h
1
osdep.h
|
@ -48,6 +48,7 @@ void *qemu_mallocz(size_t size);
|
||||||
void qemu_free(void *ptr);
|
void qemu_free(void *ptr);
|
||||||
char *qemu_strdup(const char *str);
|
char *qemu_strdup(const char *str);
|
||||||
|
|
||||||
|
void *qemu_memalign(size_t alignment, size_t size);
|
||||||
void *qemu_vmalloc(size_t size);
|
void *qemu_vmalloc(size_t size);
|
||||||
void qemu_vfree(void *ptr);
|
void qemu_vfree(void *ptr);
|
||||||
|
|
||||||
|
|
|
@ -250,6 +250,8 @@ This option defines the type of the media: disk or cdrom.
|
||||||
These options have the same definition as they have in @option{-hdachs}.
|
These options have the same definition as they have in @option{-hdachs}.
|
||||||
@item snapshot=@var{snapshot}
|
@item snapshot=@var{snapshot}
|
||||||
@var{snapshot} is "on" or "off" and allows to enable snapshot for given drive (see @option{-snapshot}).
|
@var{snapshot} is "on" or "off" and allows to enable snapshot for given drive (see @option{-snapshot}).
|
||||||
|
@item cache=@var{cache}
|
||||||
|
@var{cache} is "on" or "off" and allows to disable host cache to access data.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
Instead of @option{-cdrom} you can use:
|
Instead of @option{-cdrom} you can use:
|
||||||
|
|
28
vl.c
28
vl.c
|
@ -4880,8 +4880,11 @@ static int drive_init(const char *str, int snapshot, QEMUMachine *machine)
|
||||||
BlockDriverState *bdrv;
|
BlockDriverState *bdrv;
|
||||||
int max_devs;
|
int max_devs;
|
||||||
int index;
|
int index;
|
||||||
|
int cache;
|
||||||
|
int bdrv_flags;
|
||||||
char *params[] = { "bus", "unit", "if", "index", "cyls", "heads",
|
char *params[] = { "bus", "unit", "if", "index", "cyls", "heads",
|
||||||
"secs", "trans", "media", "snapshot", "file", NULL };
|
"secs", "trans", "media", "snapshot", "file",
|
||||||
|
"cache", NULL };
|
||||||
|
|
||||||
if (check_params(buf, sizeof(buf), params, str) < 0) {
|
if (check_params(buf, sizeof(buf), params, str) < 0) {
|
||||||
fprintf(stderr, "qemu: unknowm parameter '%s' in '%s'\n",
|
fprintf(stderr, "qemu: unknowm parameter '%s' in '%s'\n",
|
||||||
|
@ -4895,6 +4898,7 @@ static int drive_init(const char *str, int snapshot, QEMUMachine *machine)
|
||||||
unit_id = -1;
|
unit_id = -1;
|
||||||
translation = BIOS_ATA_TRANSLATION_AUTO;
|
translation = BIOS_ATA_TRANSLATION_AUTO;
|
||||||
index = -1;
|
index = -1;
|
||||||
|
cache = 1;
|
||||||
|
|
||||||
if (!strcmp(machine->name, "realview") ||
|
if (!strcmp(machine->name, "realview") ||
|
||||||
!strcmp(machine->name, "SS-5") ||
|
!strcmp(machine->name, "SS-5") ||
|
||||||
|
@ -5037,6 +5041,17 @@ static int drive_init(const char *str, int snapshot, QEMUMachine *machine)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (get_param_value(buf, sizeof(buf), "cache", str)) {
|
||||||
|
if (!strcmp(buf, "off"))
|
||||||
|
cache = 0;
|
||||||
|
else if (!strcmp(buf, "on"))
|
||||||
|
cache = 1;
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "qemu: invalid cache option\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
get_param_value(file, sizeof(file), "file", str);
|
get_param_value(file, sizeof(file), "file", str);
|
||||||
|
|
||||||
/* compute bus and unit according index */
|
/* compute bus and unit according index */
|
||||||
|
@ -5131,8 +5146,12 @@ static int drive_init(const char *str, int snapshot, QEMUMachine *machine)
|
||||||
}
|
}
|
||||||
if (!file[0])
|
if (!file[0])
|
||||||
return 0;
|
return 0;
|
||||||
if (bdrv_open(bdrv, file, snapshot ? BDRV_O_SNAPSHOT : 0) < 0 ||
|
bdrv_flags = 0;
|
||||||
qemu_key_check(bdrv, file)) {
|
if (snapshot)
|
||||||
|
bdrv_flags |= BDRV_O_SNAPSHOT;
|
||||||
|
if (!cache)
|
||||||
|
bdrv_flags |= BDRV_O_DIRECT;
|
||||||
|
if (bdrv_open(bdrv, file, bdrv_flags) < 0 || qemu_key_check(bdrv, file)) {
|
||||||
fprintf(stderr, "qemu: could not open disk image %s\n",
|
fprintf(stderr, "qemu: could not open disk image %s\n",
|
||||||
file);
|
file);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -7480,7 +7499,8 @@ static void help(int exitcode)
|
||||||
"-hdc/-hdd file use 'file' as IDE hard disk 2/3 image\n"
|
"-hdc/-hdd file use 'file' as IDE hard disk 2/3 image\n"
|
||||||
"-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
|
"-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
|
||||||
"-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][index=i]\n"
|
"-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][index=i]\n"
|
||||||
" [,cyls=c,heads=h,secs=s[,trans=t]][snapshot=on|off]\n"
|
" [,cyls=c,heads=h,secs=s[,trans=t]][snapshot=on|off]"
|
||||||
|
" [,cache=on|off]\n"
|
||||||
" use 'file' as a drive image\n"
|
" use 'file' as a drive image\n"
|
||||||
"-mtdblock file use 'file' as on-board Flash memory image\n"
|
"-mtdblock file use 'file' as on-board Flash memory image\n"
|
||||||
"-sd file use 'file' as SecureDigital card image\n"
|
"-sd file use 'file' as SecureDigital card image\n"
|
||||||
|
|
Loading…
Reference in New Issue