Compare commits
35 Commits
qemu-sparc
...
v0.10.1
Author | SHA1 | Date | |
---|---|---|---|
|
d35381c874 | ||
|
7648bb760d | ||
|
ebb7184720 | ||
|
7712c5850e | ||
|
3f546bd0b1 | ||
|
00614a4cb4 | ||
|
7c14db42cb | ||
|
e58843d0f1 | ||
|
0e39d3f89b | ||
|
5389a9df53 | ||
|
21fd832512 | ||
|
15d4afd55b | ||
|
3df962a30d | ||
|
4827c90cef | ||
|
0f56231dce | ||
|
523faf1b92 | ||
|
414c078104 | ||
|
9cecf0f570 | ||
|
4ca9f3dd71 | ||
|
f902c4192e | ||
|
b96a313d3d | ||
|
d9aa1fce5a | ||
|
8a11f5ff08 | ||
|
b786b7ccbd | ||
|
d3be2b2f71 | ||
|
e36fb2a3a2 | ||
|
4978045781 | ||
|
cb5745c529 | ||
|
295b492cfa | ||
|
af8222c0f8 | ||
|
249139f4e6 | ||
|
8ae0978ed5 | ||
|
c0024a8257 | ||
|
e9af78a859 | ||
|
25c4fde177 |
27
Changelog
27
Changelog
@@ -1,3 +1,30 @@
|
|||||||
|
version 0.10.1:
|
||||||
|
|
||||||
|
- virtio-net: allow masking of notifications on empty queue (Alex Williamson)
|
||||||
|
- e1000: fix rx descriptor low threshold logic (Alex Willaimson)
|
||||||
|
- x86 tcg: add NULL checks to lsl instruction (Jan Kiszka)
|
||||||
|
- kvm vga: fix screen corruption with -std-vga and Windows (Avi Kivity)
|
||||||
|
- kvm vga: fix screen corruption with Ubuntu installations (Glauber Costa)
|
||||||
|
- virtio-net: check right return size on sg list (Alex Williamson)
|
||||||
|
- Make qemu_announce_self handle holes (live migration after hotplug)
|
||||||
|
(Marcelo Tosatti)
|
||||||
|
- Revert r6804-r6808 (qcow2 allocation info). This series of changes added
|
||||||
|
a high cost to startup for large qcow2 images (Anthony Liguori)
|
||||||
|
- qemu-img: fix help message (Aurelien Jarno)
|
||||||
|
- Fix build for non-default installs of SDL (Anthony Liguori)
|
||||||
|
- Fix race condition in env->interrupt_request. When using TCG and a dynticks
|
||||||
|
host timer, this condition could cause TCG to get stuck in an infinite
|
||||||
|
loop (Aurelien Jarno)
|
||||||
|
- Fix reading encrypted hard disk passwords during early startup (Jan Kiszka)
|
||||||
|
- Fix encrypted disk reporting in 'info block' (Jan Kiszka)
|
||||||
|
- Fix console size with tiny displays (MusicPal) (Jan Kiszka)
|
||||||
|
- Improve error handling in bdrv_open2 (Jan Kiszka)
|
||||||
|
- Avoid leaking data in mux'ed character devices (Jan Kiszka)
|
||||||
|
- Fix initial character device reset (no banner in monitor) (Jan Kiszka)
|
||||||
|
- Fix cpuid KVM crash on i386 host (Lubomir Rintel)
|
||||||
|
- Fix SLES10sp2 installation by adding ISTAT1 register to LSI SCSI emulation
|
||||||
|
(Ryan Harper)
|
||||||
|
|
||||||
version 0.10.0:
|
version 0.10.0:
|
||||||
|
|
||||||
- TCG support (No longer requires GCC 3.x)
|
- TCG support (No longer requires GCC 3.x)
|
||||||
|
@@ -143,10 +143,6 @@ typedef struct BDRVQcowState {
|
|||||||
uint32_t crypt_method_header;
|
uint32_t crypt_method_header;
|
||||||
AES_KEY aes_encrypt_key;
|
AES_KEY aes_encrypt_key;
|
||||||
AES_KEY aes_decrypt_key;
|
AES_KEY aes_decrypt_key;
|
||||||
|
|
||||||
int64_t highest_alloc; /* highest cluester allocated (in clusters) */
|
|
||||||
int64_t nc_free; /* num of free clusters below highest_alloc */
|
|
||||||
|
|
||||||
uint64_t snapshots_offset;
|
uint64_t snapshots_offset;
|
||||||
int snapshots_size;
|
int snapshots_size;
|
||||||
int nb_snapshots;
|
int nb_snapshots;
|
||||||
@@ -174,8 +170,6 @@ static void free_clusters(BlockDriverState *bs,
|
|||||||
#ifdef DEBUG_ALLOC
|
#ifdef DEBUG_ALLOC
|
||||||
static void check_refcounts(BlockDriverState *bs);
|
static void check_refcounts(BlockDriverState *bs);
|
||||||
#endif
|
#endif
|
||||||
static void scan_refcount(BlockDriverState *bs, int64_t *high, int64_t *free);
|
|
||||||
|
|
||||||
|
|
||||||
static int qcow_probe(const uint8_t *buf, int buf_size, const char *filename)
|
static int qcow_probe(const uint8_t *buf, int buf_size, const char *filename)
|
||||||
{
|
{
|
||||||
@@ -276,8 +270,6 @@ static int qcow_open(BlockDriverState *bs, const char *filename, int flags)
|
|||||||
if (refcount_init(bs) < 0)
|
if (refcount_init(bs) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
scan_refcount(bs, &s->highest_alloc, &s->nc_free);
|
|
||||||
|
|
||||||
/* read the backing file name */
|
/* read the backing file name */
|
||||||
if (header.backing_file_offset != 0) {
|
if (header.backing_file_offset != 0) {
|
||||||
len = header.backing_file_size;
|
len = header.backing_file_size;
|
||||||
@@ -1646,8 +1638,6 @@ static int qcow_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
|||||||
bdi->cluster_size = s->cluster_size;
|
bdi->cluster_size = s->cluster_size;
|
||||||
bdi->vm_state_offset = (int64_t)s->l1_vm_state_index <<
|
bdi->vm_state_offset = (int64_t)s->l1_vm_state_index <<
|
||||||
(s->cluster_bits + s->l2_bits);
|
(s->cluster_bits + s->l2_bits);
|
||||||
bdi->highest_alloc = s->highest_alloc << s->cluster_bits;
|
|
||||||
bdi->num_free_bytes = s->nc_free << s->cluster_bits;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2166,39 +2156,6 @@ static int load_refcount_block(BlockDriverState *bs,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void scan_refcount(BlockDriverState *bs, int64_t *high, int64_t *free)
|
|
||||||
{
|
|
||||||
BDRVQcowState *s = bs->opaque;
|
|
||||||
int64_t refcnt_index, cluster_index, cluster_end, h = 0, f = 0;
|
|
||||||
int64_t tail = 0; /* do not count last consecutive free entries */
|
|
||||||
|
|
||||||
for (refcnt_index=0; refcnt_index < s->refcount_table_size; refcnt_index++){
|
|
||||||
if (s->refcount_table[refcnt_index] == 0) {
|
|
||||||
f += 1 << (s->cluster_bits - REFCOUNT_SHIFT);
|
|
||||||
tail += 1 << (s->cluster_bits - REFCOUNT_SHIFT);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
cluster_index = refcnt_index << (s->cluster_bits - REFCOUNT_SHIFT);
|
|
||||||
cluster_end = (refcnt_index + 1) << (s->cluster_bits - REFCOUNT_SHIFT);
|
|
||||||
for ( ; cluster_index < cluster_end; cluster_index++) {
|
|
||||||
if (get_refcount(bs, cluster_index) == 0) {
|
|
||||||
f++;
|
|
||||||
tail++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
h = cluster_index;
|
|
||||||
tail = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
f -= tail;
|
|
||||||
if (free)
|
|
||||||
*free = f;
|
|
||||||
if (high)
|
|
||||||
*high = (h+1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int get_refcount(BlockDriverState *bs, int64_t cluster_index)
|
static int get_refcount(BlockDriverState *bs, int64_t cluster_index)
|
||||||
{
|
{
|
||||||
BDRVQcowState *s = bs->opaque;
|
BDRVQcowState *s = bs->opaque;
|
||||||
@@ -2239,12 +2196,6 @@ retry:
|
|||||||
size,
|
size,
|
||||||
(s->free_cluster_index - nb_clusters) << s->cluster_bits);
|
(s->free_cluster_index - nb_clusters) << s->cluster_bits);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (s->highest_alloc < s->free_cluster_index) {
|
|
||||||
s->nc_free += (s->free_cluster_index - s->highest_alloc);
|
|
||||||
s->highest_alloc = s->free_cluster_index;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (s->free_cluster_index - nb_clusters) << s->cluster_bits;
|
return (s->free_cluster_index - nb_clusters) << s->cluster_bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2418,12 +2369,6 @@ static int update_cluster_refcount(BlockDriverState *bs,
|
|||||||
block_index = cluster_index &
|
block_index = cluster_index &
|
||||||
((1 << (s->cluster_bits - REFCOUNT_SHIFT)) - 1);
|
((1 << (s->cluster_bits - REFCOUNT_SHIFT)) - 1);
|
||||||
refcount = be16_to_cpu(s->refcount_block_cache[block_index]);
|
refcount = be16_to_cpu(s->refcount_block_cache[block_index]);
|
||||||
|
|
||||||
if (refcount == 1 && addend == -1)
|
|
||||||
s->nc_free += 1;
|
|
||||||
else if (refcount == 0 && addend == 1)
|
|
||||||
s->nc_free -= 1;
|
|
||||||
|
|
||||||
refcount += addend;
|
refcount += addend;
|
||||||
if (refcount < 0 || refcount > 0xffff)
|
if (refcount < 0 || refcount > 0xffff)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
85
block.c
85
block.c
@@ -311,8 +311,6 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
bs = bdrv_new("");
|
bs = bdrv_new("");
|
||||||
if (!bs)
|
|
||||||
return -ENOMEM;
|
|
||||||
ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL);
|
ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
bdrv_delete(bs);
|
bdrv_delete(bs);
|
||||||
@@ -338,6 +336,7 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
|
|||||||
bs->read_only = 0;
|
bs->read_only = 0;
|
||||||
bs->is_temporary = 0;
|
bs->is_temporary = 0;
|
||||||
bs->encrypted = 0;
|
bs->encrypted = 0;
|
||||||
|
bs->valid_key = 0;
|
||||||
|
|
||||||
if (flags & BDRV_O_SNAPSHOT) {
|
if (flags & BDRV_O_SNAPSHOT) {
|
||||||
BlockDriverState *bs1;
|
BlockDriverState *bs1;
|
||||||
@@ -349,12 +348,10 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
|
|||||||
|
|
||||||
/* if there is a backing file, use it */
|
/* if there is a backing file, use it */
|
||||||
bs1 = bdrv_new("");
|
bs1 = bdrv_new("");
|
||||||
if (!bs1) {
|
ret = bdrv_open(bs1, filename, 0);
|
||||||
return -ENOMEM;
|
if (ret < 0) {
|
||||||
}
|
|
||||||
if (bdrv_open(bs1, filename, 0) < 0) {
|
|
||||||
bdrv_delete(bs1);
|
bdrv_delete(bs1);
|
||||||
return -1;
|
return ret;
|
||||||
}
|
}
|
||||||
total_size = bdrv_getlength(bs1) >> SECTOR_BITS;
|
total_size = bdrv_getlength(bs1) >> SECTOR_BITS;
|
||||||
|
|
||||||
@@ -372,9 +369,10 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
|
|||||||
else
|
else
|
||||||
realpath(filename, backing_filename);
|
realpath(filename, backing_filename);
|
||||||
|
|
||||||
if (bdrv_create(&bdrv_qcow2, tmp_filename,
|
ret = bdrv_create(&bdrv_qcow2, tmp_filename,
|
||||||
total_size, backing_filename, 0) < 0) {
|
total_size, backing_filename, 0);
|
||||||
return -1;
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
filename = tmp_filename;
|
filename = tmp_filename;
|
||||||
bs->is_temporary = 1;
|
bs->is_temporary = 1;
|
||||||
@@ -383,14 +381,12 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
|
|||||||
pstrcpy(bs->filename, sizeof(bs->filename), filename);
|
pstrcpy(bs->filename, sizeof(bs->filename), filename);
|
||||||
if (flags & BDRV_O_FILE) {
|
if (flags & BDRV_O_FILE) {
|
||||||
drv = find_protocol(filename);
|
drv = find_protocol(filename);
|
||||||
if (!drv)
|
} else if (!drv) {
|
||||||
return -ENOENT;
|
drv = find_image_format(filename);
|
||||||
} else {
|
}
|
||||||
if (!drv) {
|
if (!drv) {
|
||||||
drv = find_image_format(filename);
|
ret = -ENOENT;
|
||||||
if (!drv)
|
goto unlink_and_fail;
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
bs->drv = drv;
|
bs->drv = drv;
|
||||||
bs->opaque = qemu_mallocz(drv->instance_size);
|
bs->opaque = qemu_mallocz(drv->instance_size);
|
||||||
@@ -409,6 +405,9 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
|
|||||||
qemu_free(bs->opaque);
|
qemu_free(bs->opaque);
|
||||||
bs->opaque = NULL;
|
bs->opaque = NULL;
|
||||||
bs->drv = NULL;
|
bs->drv = NULL;
|
||||||
|
unlink_and_fail:
|
||||||
|
if (bs->is_temporary)
|
||||||
|
unlink(filename);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (drv->bdrv_getlength) {
|
if (drv->bdrv_getlength) {
|
||||||
@@ -422,15 +421,13 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
|
|||||||
if (bs->backing_file[0] != '\0') {
|
if (bs->backing_file[0] != '\0') {
|
||||||
/* if there is a backing file, use it */
|
/* if there is a backing file, use it */
|
||||||
bs->backing_hd = bdrv_new("");
|
bs->backing_hd = bdrv_new("");
|
||||||
if (!bs->backing_hd) {
|
|
||||||
fail:
|
|
||||||
bdrv_close(bs);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
path_combine(backing_filename, sizeof(backing_filename),
|
path_combine(backing_filename, sizeof(backing_filename),
|
||||||
filename, bs->backing_file);
|
filename, bs->backing_file);
|
||||||
if (bdrv_open(bs->backing_hd, backing_filename, open_flags) < 0)
|
ret = bdrv_open(bs->backing_hd, backing_filename, open_flags);
|
||||||
goto fail;
|
if (ret < 0) {
|
||||||
|
bdrv_close(bs);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* call the change callback */
|
/* call the change callback */
|
||||||
@@ -970,6 +967,15 @@ int bdrv_is_encrypted(BlockDriverState *bs)
|
|||||||
return bs->encrypted;
|
return bs->encrypted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bdrv_key_required(BlockDriverState *bs)
|
||||||
|
{
|
||||||
|
BlockDriverState *backing_hd = bs->backing_hd;
|
||||||
|
|
||||||
|
if (backing_hd && backing_hd->encrypted && !backing_hd->valid_key)
|
||||||
|
return 1;
|
||||||
|
return (bs->encrypted && !bs->valid_key);
|
||||||
|
}
|
||||||
|
|
||||||
int bdrv_set_key(BlockDriverState *bs, const char *key)
|
int bdrv_set_key(BlockDriverState *bs, const char *key)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@@ -982,7 +988,9 @@ int bdrv_set_key(BlockDriverState *bs, const char *key)
|
|||||||
}
|
}
|
||||||
if (!bs->encrypted || !bs->drv || !bs->drv->bdrv_set_key)
|
if (!bs->encrypted || !bs->drv || !bs->drv->bdrv_set_key)
|
||||||
return -1;
|
return -1;
|
||||||
return bs->drv->bdrv_set_key(bs, key);
|
ret = bs->drv->bdrv_set_key(bs, key);
|
||||||
|
bs->valid_key = (ret == 0);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size)
|
void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size)
|
||||||
@@ -1015,12 +1023,12 @@ BlockDriverState *bdrv_find(const char *name)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bdrv_iterate(void (*it)(void *opaque, const char *name), void *opaque)
|
void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
|
|
||||||
for (bs = bdrv_first; bs != NULL; bs = bs->next) {
|
for (bs = bdrv_first; bs != NULL; bs = bs->next) {
|
||||||
it(opaque, bs->device_name);
|
it(opaque, bs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1105,8 +1113,7 @@ void bdrv_info(void)
|
|||||||
}
|
}
|
||||||
term_printf(" ro=%d", bs->read_only);
|
term_printf(" ro=%d", bs->read_only);
|
||||||
term_printf(" drv=%s", bs->drv->format_name);
|
term_printf(" drv=%s", bs->drv->format_name);
|
||||||
if (bs->encrypted)
|
term_printf(" encrypted=%d", bdrv_is_encrypted(bs));
|
||||||
term_printf(" encrypted");
|
|
||||||
} else {
|
} else {
|
||||||
term_printf(" [not inserted]");
|
term_printf(" [not inserted]");
|
||||||
}
|
}
|
||||||
@@ -1118,7 +1125,6 @@ void bdrv_info(void)
|
|||||||
void bdrv_info_stats (void)
|
void bdrv_info_stats (void)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
BlockDriverInfo bdi;
|
|
||||||
|
|
||||||
for (bs = bdrv_first; bs != NULL; bs = bs->next) {
|
for (bs = bdrv_first; bs != NULL; bs = bs->next) {
|
||||||
term_printf ("%s:"
|
term_printf ("%s:"
|
||||||
@@ -1126,18 +1132,23 @@ void bdrv_info_stats (void)
|
|||||||
" wr_bytes=%" PRIu64
|
" wr_bytes=%" PRIu64
|
||||||
" rd_operations=%" PRIu64
|
" rd_operations=%" PRIu64
|
||||||
" wr_operations=%" PRIu64
|
" wr_operations=%" PRIu64
|
||||||
,
|
"\n",
|
||||||
bs->device_name,
|
bs->device_name,
|
||||||
bs->rd_bytes, bs->wr_bytes,
|
bs->rd_bytes, bs->wr_bytes,
|
||||||
bs->rd_ops, bs->wr_ops);
|
bs->rd_ops, bs->wr_ops);
|
||||||
if (bdrv_get_info(bs, &bdi) == 0)
|
|
||||||
term_printf(" high=%" PRId64
|
|
||||||
" bytes_free=%" PRId64,
|
|
||||||
bdi.highest_alloc, bdi.num_free_bytes);
|
|
||||||
term_printf("\n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
|
||||||
|
{
|
||||||
|
if (bs->backing_hd && bs->backing_hd->encrypted)
|
||||||
|
return bs->backing_file;
|
||||||
|
else if (bs->encrypted)
|
||||||
|
return bs->filename;
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void bdrv_get_backing_filename(BlockDriverState *bs,
|
void bdrv_get_backing_filename(BlockDriverState *bs,
|
||||||
char *filename, int filename_size)
|
char *filename, int filename_size)
|
||||||
{
|
{
|
||||||
|
10
block.h
10
block.h
@@ -26,8 +26,6 @@ typedef struct BlockDriverInfo {
|
|||||||
int cluster_size;
|
int cluster_size;
|
||||||
/* offset at which the VM state can be saved (0 if not possible) */
|
/* offset at which the VM state can be saved (0 if not possible) */
|
||||||
int64_t vm_state_offset;
|
int64_t vm_state_offset;
|
||||||
int64_t highest_alloc; /* highest allocated block offset (in bytes) */
|
|
||||||
int64_t num_free_bytes; /* below highest_alloc */
|
|
||||||
} BlockDriverInfo;
|
} BlockDriverInfo;
|
||||||
|
|
||||||
typedef struct QEMUSnapshotInfo {
|
typedef struct QEMUSnapshotInfo {
|
||||||
@@ -103,8 +101,6 @@ BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num,
|
|||||||
BlockDriverCompletionFunc *cb, void *opaque);
|
BlockDriverCompletionFunc *cb, void *opaque);
|
||||||
void bdrv_aio_cancel(BlockDriverAIOCB *acb);
|
void bdrv_aio_cancel(BlockDriverAIOCB *acb);
|
||||||
|
|
||||||
int qemu_key_check(BlockDriverState *bs, const char *name);
|
|
||||||
|
|
||||||
/* Ensure contents are flushed to disk. */
|
/* Ensure contents are flushed to disk. */
|
||||||
void bdrv_flush(BlockDriverState *bs);
|
void bdrv_flush(BlockDriverState *bs);
|
||||||
void bdrv_flush_all(void);
|
void bdrv_flush_all(void);
|
||||||
@@ -141,9 +137,12 @@ void bdrv_set_change_cb(BlockDriverState *bs,
|
|||||||
void (*change_cb)(void *opaque), void *opaque);
|
void (*change_cb)(void *opaque), void *opaque);
|
||||||
void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size);
|
void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size);
|
||||||
BlockDriverState *bdrv_find(const char *name);
|
BlockDriverState *bdrv_find(const char *name);
|
||||||
void bdrv_iterate(void (*it)(void *opaque, const char *name), void *opaque);
|
void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs),
|
||||||
|
void *opaque);
|
||||||
int bdrv_is_encrypted(BlockDriverState *bs);
|
int bdrv_is_encrypted(BlockDriverState *bs);
|
||||||
|
int bdrv_key_required(BlockDriverState *bs);
|
||||||
int bdrv_set_key(BlockDriverState *bs, const char *key);
|
int bdrv_set_key(BlockDriverState *bs, const char *key);
|
||||||
|
int bdrv_query_missing_keys(void);
|
||||||
void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
|
void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
|
||||||
void *opaque);
|
void *opaque);
|
||||||
const char *bdrv_get_device_name(BlockDriverState *bs);
|
const char *bdrv_get_device_name(BlockDriverState *bs);
|
||||||
@@ -151,6 +150,7 @@ int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num,
|
|||||||
const uint8_t *buf, int nb_sectors);
|
const uint8_t *buf, int nb_sectors);
|
||||||
int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi);
|
int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi);
|
||||||
|
|
||||||
|
const char *bdrv_get_encrypted_filename(BlockDriverState *bs);
|
||||||
void bdrv_get_backing_filename(BlockDriverState *bs,
|
void bdrv_get_backing_filename(BlockDriverState *bs,
|
||||||
char *filename, int filename_size);
|
char *filename, int filename_size);
|
||||||
int bdrv_snapshot_create(BlockDriverState *bs,
|
int bdrv_snapshot_create(BlockDriverState *bs,
|
||||||
|
@@ -96,6 +96,7 @@ struct BlockDriverState {
|
|||||||
int removable; /* if true, the media can be removed */
|
int removable; /* if true, the media can be removed */
|
||||||
int locked; /* if true, the media cannot temporarily be ejected */
|
int locked; /* if true, the media cannot temporarily be ejected */
|
||||||
int encrypted; /* if true, the media is encrypted */
|
int encrypted; /* if true, the media is encrypted */
|
||||||
|
int valid_key; /* if true, a valid encryption key has been set */
|
||||||
int sg; /* if true, the device is a /dev/sg* */
|
int sg; /* if true, the device is a /dev/sg* */
|
||||||
/* event callback when inserting/removing */
|
/* event callback when inserting/removing */
|
||||||
void (*change_cb)(void *opaque);
|
void (*change_cb)(void *opaque);
|
||||||
|
@@ -302,10 +302,9 @@ void term_printf(const char *fmt, ...) __attribute__ ((__format__ (__printf__, 1
|
|||||||
void term_print_filename(const char *filename);
|
void term_print_filename(const char *filename);
|
||||||
void term_flush(void);
|
void term_flush(void);
|
||||||
void term_print_help(void);
|
void term_print_help(void);
|
||||||
void monitor_readline(const char *prompt, int is_password,
|
|
||||||
char *buf, int buf_size);
|
|
||||||
void monitor_suspend(void);
|
void monitor_suspend(void);
|
||||||
void monitor_resume(void);
|
void monitor_resume(void);
|
||||||
|
int monitor_read_bdrv_key(BlockDriverState *bs);
|
||||||
|
|
||||||
/* readline.c */
|
/* readline.c */
|
||||||
typedef void ReadLineFunc(void *opaque, const char *str);
|
typedef void ReadLineFunc(void *opaque, const char *str);
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <signal.h>
|
||||||
#include "osdep.h"
|
#include "osdep.h"
|
||||||
#include "sys-queue.h"
|
#include "sys-queue.h"
|
||||||
|
|
||||||
@@ -170,6 +171,7 @@ typedef struct CPUWatchpoint {
|
|||||||
memory was accessed */ \
|
memory was accessed */ \
|
||||||
uint32_t halted; /* Nonzero if the CPU is in suspend state */ \
|
uint32_t halted; /* Nonzero if the CPU is in suspend state */ \
|
||||||
uint32_t interrupt_request; \
|
uint32_t interrupt_request; \
|
||||||
|
volatile sig_atomic_t exit_request; \
|
||||||
/* The meaning of the MMU modes is defined in the target code. */ \
|
/* The meaning of the MMU modes is defined in the target code. */ \
|
||||||
CPUTLBEntry tlb_table[NB_MMU_MODES][CPU_TLB_SIZE]; \
|
CPUTLBEntry tlb_table[NB_MMU_MODES][CPU_TLB_SIZE]; \
|
||||||
target_phys_addr_t iotlb[NB_MMU_MODES][CPU_TLB_SIZE]; \
|
target_phys_addr_t iotlb[NB_MMU_MODES][CPU_TLB_SIZE]; \
|
||||||
|
16
cpu-exec.c
16
cpu-exec.c
@@ -311,7 +311,7 @@ int cpu_exec(CPUState *env1)
|
|||||||
env->exception_index = -1;
|
env->exception_index = -1;
|
||||||
}
|
}
|
||||||
#ifdef USE_KQEMU
|
#ifdef USE_KQEMU
|
||||||
if (kqemu_is_ok(env) && env->interrupt_request == 0) {
|
if (kqemu_is_ok(env) && env->interrupt_request == 0 && env->exit_request == 0) {
|
||||||
int ret;
|
int ret;
|
||||||
env->eflags = env->eflags | helper_cc_compute_all(CC_OP) | (DF & DF_MASK);
|
env->eflags = env->eflags | helper_cc_compute_all(CC_OP) | (DF & DF_MASK);
|
||||||
ret = kqemu_cpu_exec(env);
|
ret = kqemu_cpu_exec(env);
|
||||||
@@ -326,7 +326,7 @@ int cpu_exec(CPUState *env1)
|
|||||||
} else if (ret == 2) {
|
} else if (ret == 2) {
|
||||||
/* softmmu execution needed */
|
/* softmmu execution needed */
|
||||||
} else {
|
} else {
|
||||||
if (env->interrupt_request != 0) {
|
if (env->interrupt_request != 0 || env->exit_request != 0) {
|
||||||
/* hardware interrupt will be executed just after */
|
/* hardware interrupt will be executed just after */
|
||||||
} else {
|
} else {
|
||||||
/* otherwise, we restart */
|
/* otherwise, we restart */
|
||||||
@@ -525,11 +525,11 @@ int cpu_exec(CPUState *env1)
|
|||||||
the program flow was changed */
|
the program flow was changed */
|
||||||
next_tb = 0;
|
next_tb = 0;
|
||||||
}
|
}
|
||||||
if (interrupt_request & CPU_INTERRUPT_EXIT) {
|
}
|
||||||
env->interrupt_request &= ~CPU_INTERRUPT_EXIT;
|
if (unlikely(env->exit_request)) {
|
||||||
env->exception_index = EXCP_INTERRUPT;
|
env->exit_request = 0;
|
||||||
cpu_loop_exit();
|
env->exception_index = EXCP_INTERRUPT;
|
||||||
}
|
cpu_loop_exit();
|
||||||
}
|
}
|
||||||
#ifdef DEBUG_EXEC
|
#ifdef DEBUG_EXEC
|
||||||
if (qemu_loglevel_mask(CPU_LOG_TB_CPU)) {
|
if (qemu_loglevel_mask(CPU_LOG_TB_CPU)) {
|
||||||
@@ -599,7 +599,7 @@ int cpu_exec(CPUState *env1)
|
|||||||
TB, but before it is linked into a potentially
|
TB, but before it is linked into a potentially
|
||||||
infinite loop and becomes env->current_tb. Avoid
|
infinite loop and becomes env->current_tb. Avoid
|
||||||
starting execution if there is a pending interrupt. */
|
starting execution if there is a pending interrupt. */
|
||||||
if (unlikely (env->interrupt_request & CPU_INTERRUPT_EXIT))
|
if (unlikely (env->exit_request))
|
||||||
env->current_tb = NULL;
|
env->current_tb = NULL;
|
||||||
|
|
||||||
while (env->current_tb) {
|
while (env->current_tb) {
|
||||||
|
12
exec.c
12
exec.c
@@ -523,6 +523,7 @@ static int cpu_common_load(QEMUFile *f, void *opaque, int version_id)
|
|||||||
|
|
||||||
qemu_get_be32s(f, &env->halted);
|
qemu_get_be32s(f, &env->halted);
|
||||||
qemu_get_be32s(f, &env->interrupt_request);
|
qemu_get_be32s(f, &env->interrupt_request);
|
||||||
|
env->interrupt_request &= ~CPU_INTERRUPT_EXIT;
|
||||||
tlb_flush(env, 1);
|
tlb_flush(env, 1);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1501,9 +1502,12 @@ void cpu_interrupt(CPUState *env, int mask)
|
|||||||
#endif
|
#endif
|
||||||
int old_mask;
|
int old_mask;
|
||||||
|
|
||||||
|
if (mask & CPU_INTERRUPT_EXIT) {
|
||||||
|
env->exit_request = 1;
|
||||||
|
mask &= ~CPU_INTERRUPT_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
old_mask = env->interrupt_request;
|
old_mask = env->interrupt_request;
|
||||||
/* FIXME: This is probably not threadsafe. A different thread could
|
|
||||||
be in the middle of a read-modify-write operation. */
|
|
||||||
env->interrupt_request |= mask;
|
env->interrupt_request |= mask;
|
||||||
#if defined(USE_NPTL)
|
#if defined(USE_NPTL)
|
||||||
/* FIXME: TB unchaining isn't SMP safe. For now just ignore the
|
/* FIXME: TB unchaining isn't SMP safe. For now just ignore the
|
||||||
@@ -1514,10 +1518,8 @@ void cpu_interrupt(CPUState *env, int mask)
|
|||||||
if (use_icount) {
|
if (use_icount) {
|
||||||
env->icount_decr.u16.high = 0xffff;
|
env->icount_decr.u16.high = 0xffff;
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
/* CPU_INTERRUPT_EXIT isn't a real interrupt. It just means
|
|
||||||
an async event happened and we need to process it. */
|
|
||||||
if (!can_do_io(env)
|
if (!can_do_io(env)
|
||||||
&& (mask & ~(old_mask | CPU_INTERRUPT_EXIT)) != 0) {
|
&& (mask & ~old_mask) != 0) {
|
||||||
cpu_abort(env, "Raised interrupt while not in I/O function");
|
cpu_abort(env, "Raised interrupt while not in I/O function");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -2637,11 +2637,16 @@ static void map_linear_vram(CirrusVGAState *s)
|
|||||||
|
|
||||||
s->lfb_vram_mapped = 0;
|
s->lfb_vram_mapped = 0;
|
||||||
|
|
||||||
|
cpu_register_physical_memory(isa_mem_base + 0xa0000, 0x8000,
|
||||||
|
(s->vram_offset + s->cirrus_bank_base[0]) | IO_MEM_UNASSIGNED);
|
||||||
|
cpu_register_physical_memory(isa_mem_base + 0xa8000, 0x8000,
|
||||||
|
(s->vram_offset + s->cirrus_bank_base[1]) | IO_MEM_UNASSIGNED);
|
||||||
if (!(s->cirrus_srcptr != s->cirrus_srcptr_end)
|
if (!(s->cirrus_srcptr != s->cirrus_srcptr_end)
|
||||||
&& !((s->sr[0x07] & 0x01) == 0)
|
&& !((s->sr[0x07] & 0x01) == 0)
|
||||||
&& !((s->gr[0x0B] & 0x14) == 0x14)
|
&& !((s->gr[0x0B] & 0x14) == 0x14)
|
||||||
&& !(s->gr[0x0B] & 0x02)) {
|
&& !(s->gr[0x0B] & 0x02)) {
|
||||||
|
|
||||||
|
vga_dirty_log_stop((VGAState *)s);
|
||||||
cpu_register_physical_memory(isa_mem_base + 0xa0000, 0x8000,
|
cpu_register_physical_memory(isa_mem_base + 0xa0000, 0x8000,
|
||||||
(s->vram_offset + s->cirrus_bank_base[0]) | IO_MEM_RAM);
|
(s->vram_offset + s->cirrus_bank_base[0]) | IO_MEM_RAM);
|
||||||
cpu_register_physical_memory(isa_mem_base + 0xa8000, 0x8000,
|
cpu_register_physical_memory(isa_mem_base + 0xa8000, 0x8000,
|
||||||
|
@@ -666,8 +666,8 @@ e1000_receive(void *opaque, const uint8_t *buf, int size)
|
|||||||
n = E1000_ICS_RXT0;
|
n = E1000_ICS_RXT0;
|
||||||
if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH])
|
if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH])
|
||||||
rdt += s->mac_reg[RDLEN] / sizeof(desc);
|
rdt += s->mac_reg[RDLEN] / sizeof(desc);
|
||||||
if (((rdt - s->mac_reg[RDH]) * sizeof(desc)) << s->rxbuf_min_shift >=
|
if (((rdt - s->mac_reg[RDH]) * sizeof(desc)) <= s->mac_reg[RDLEN] >>
|
||||||
s->mac_reg[RDLEN])
|
s->rxbuf_min_shift)
|
||||||
n |= E1000_ICS_RXDMT0;
|
n |= E1000_ICS_RXDMT0;
|
||||||
|
|
||||||
set_ics(s, 0, n);
|
set_ics(s, 0, n);
|
||||||
|
@@ -1369,6 +1369,8 @@ static uint8_t lsi_reg_readb(LSIState *s, int offset)
|
|||||||
CASE_GET_REG32(dsa, 0x10)
|
CASE_GET_REG32(dsa, 0x10)
|
||||||
case 0x14: /* ISTAT0 */
|
case 0x14: /* ISTAT0 */
|
||||||
return s->istat0;
|
return s->istat0;
|
||||||
|
case 0x15: /* ISTAT1 */
|
||||||
|
return s->istat1;
|
||||||
case 0x16: /* MBOX0 */
|
case 0x16: /* MBOX0 */
|
||||||
return s->mbox0;
|
return s->mbox0;
|
||||||
case 0x17: /* MBOX1 */
|
case 0x17: /* MBOX1 */
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "block.h"
|
#include "block.h"
|
||||||
#include "scsi-disk.h"
|
#include "scsi-disk.h"
|
||||||
|
#include "console.h"
|
||||||
|
|
||||||
//#define DEBUG_MSD
|
//#define DEBUG_MSD
|
||||||
|
|
||||||
@@ -513,7 +514,7 @@ static void usb_msd_handle_destroy(USBDevice *dev)
|
|||||||
qemu_free(s);
|
qemu_free(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
USBDevice *usb_msd_init(const char *filename)
|
USBDevice *usb_msd_init(const char *filename, BlockDriverState **pbs)
|
||||||
{
|
{
|
||||||
MSDState *s;
|
MSDState *s;
|
||||||
BlockDriverState *bdrv;
|
BlockDriverState *bdrv;
|
||||||
@@ -552,9 +553,8 @@ USBDevice *usb_msd_init(const char *filename)
|
|||||||
bdrv = bdrv_new("usb");
|
bdrv = bdrv_new("usb");
|
||||||
if (bdrv_open2(bdrv, filename, 0, drv) < 0)
|
if (bdrv_open2(bdrv, filename, 0, drv) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
if (qemu_key_check(bdrv, filename))
|
|
||||||
goto fail;
|
|
||||||
s->bs = bdrv;
|
s->bs = bdrv;
|
||||||
|
*pbs = bdrv;
|
||||||
|
|
||||||
s->dev.speed = USB_SPEED_FULL;
|
s->dev.speed = USB_SPEED_FULL;
|
||||||
s->dev.handle_packet = usb_generic_handle_packet;
|
s->dev.handle_packet = usb_generic_handle_packet;
|
||||||
|
5
hw/usb.h
5
hw/usb.h
@@ -21,6 +21,9 @@
|
|||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "block.h"
|
||||||
|
|
||||||
#define USB_TOKEN_SETUP 0x2d
|
#define USB_TOKEN_SETUP 0x2d
|
||||||
#define USB_TOKEN_IN 0x69 /* device -> host */
|
#define USB_TOKEN_IN 0x69 /* device -> host */
|
||||||
#define USB_TOKEN_OUT 0xe1 /* host -> device */
|
#define USB_TOKEN_OUT 0xe1 /* host -> device */
|
||||||
@@ -250,7 +253,7 @@ USBDevice *usb_keyboard_init(void);
|
|||||||
void usb_hid_datain_cb(USBDevice *dev, void *opaque, void (*datain)(void *));
|
void usb_hid_datain_cb(USBDevice *dev, void *opaque, void (*datain)(void *));
|
||||||
|
|
||||||
/* usb-msd.c */
|
/* usb-msd.c */
|
||||||
USBDevice *usb_msd_init(const char *filename);
|
USBDevice *usb_msd_init(const char *filename, BlockDriverState **pbs);
|
||||||
|
|
||||||
/* usb-net.c */
|
/* usb-net.c */
|
||||||
USBDevice *usb_net_init(NICInfo *nd);
|
USBDevice *usb_net_init(NICInfo *nd);
|
||||||
|
13
hw/vga.c
13
hw/vga.c
@@ -2482,6 +2482,17 @@ int isa_vga_mm_init(uint8_t *vga_ram_base,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pci_vga_write_config(PCIDevice *d,
|
||||||
|
uint32_t address, uint32_t val, int len)
|
||||||
|
{
|
||||||
|
PCIVGAState *pvs = container_of(d, PCIVGAState, dev);
|
||||||
|
VGAState *s = &pvs->vga_state;
|
||||||
|
|
||||||
|
vga_dirty_log_stop(s);
|
||||||
|
pci_default_write_config(d, address, val, len);
|
||||||
|
vga_dirty_log_start(s);
|
||||||
|
}
|
||||||
|
|
||||||
int pci_vga_init(PCIBus *bus, uint8_t *vga_ram_base,
|
int pci_vga_init(PCIBus *bus, uint8_t *vga_ram_base,
|
||||||
unsigned long vga_ram_offset, int vga_ram_size,
|
unsigned long vga_ram_offset, int vga_ram_size,
|
||||||
unsigned long vga_bios_offset, int vga_bios_size)
|
unsigned long vga_bios_offset, int vga_bios_size)
|
||||||
@@ -2492,7 +2503,7 @@ int pci_vga_init(PCIBus *bus, uint8_t *vga_ram_base,
|
|||||||
|
|
||||||
d = (PCIVGAState *)pci_register_device(bus, "VGA",
|
d = (PCIVGAState *)pci_register_device(bus, "VGA",
|
||||||
sizeof(PCIVGAState),
|
sizeof(PCIVGAState),
|
||||||
-1, NULL, NULL);
|
-1, NULL, pci_vga_write_config);
|
||||||
if (!d)
|
if (!d)
|
||||||
return -1;
|
return -1;
|
||||||
s = &d->vga_state;
|
s = &d->vga_state;
|
||||||
|
@@ -228,7 +228,7 @@ static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (elem.out_sg[0].iov_len < sizeof(ctrl) ||
|
if (elem.out_sg[0].iov_len < sizeof(ctrl) ||
|
||||||
elem.out_sg[elem.in_num - 1].iov_len < sizeof(status)) {
|
elem.in_sg[elem.in_num - 1].iov_len < sizeof(status)) {
|
||||||
fprintf(stderr, "virtio-net ctrl header not in correct element\n");
|
fprintf(stderr, "virtio-net ctrl header not in correct element\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@@ -726,9 +726,10 @@ VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
|
|||||||
|
|
||||||
void virtio_notify(VirtIODevice *vdev, VirtQueue *vq)
|
void virtio_notify(VirtIODevice *vdev, VirtQueue *vq)
|
||||||
{
|
{
|
||||||
/* Always notify when queue is empty */
|
/* Always notify when queue is empty (when feature acknowledge) */
|
||||||
if ((vq->inuse || vring_avail_idx(vq) != vq->last_avail_idx) &&
|
if ((vring_avail_flags(vq) & VRING_AVAIL_F_NO_INTERRUPT) &&
|
||||||
(vring_avail_flags(vq) & VRING_AVAIL_F_NO_INTERRUPT))
|
(!(vdev->features & (1 << VIRTIO_F_NOTIFY_ON_EMPTY)) ||
|
||||||
|
(vq->inuse || vring_avail_idx(vq) != vq->last_avail_idx)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vdev->isr |= 0x01;
|
vdev->isr |= 0x01;
|
||||||
|
@@ -445,7 +445,7 @@ int kvm_cpu_exec(CPUState *env)
|
|||||||
do {
|
do {
|
||||||
kvm_arch_pre_run(env, run);
|
kvm_arch_pre_run(env, run);
|
||||||
|
|
||||||
if ((env->interrupt_request & CPU_INTERRUPT_EXIT)) {
|
if (env->exit_request) {
|
||||||
dprintf("interrupt exit requested\n");
|
dprintf("interrupt exit requested\n");
|
||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
@@ -512,8 +512,8 @@ int kvm_cpu_exec(CPUState *env)
|
|||||||
}
|
}
|
||||||
} while (ret > 0);
|
} while (ret > 0);
|
||||||
|
|
||||||
if ((env->interrupt_request & CPU_INTERRUPT_EXIT)) {
|
if (env->exit_request) {
|
||||||
env->interrupt_request &= ~CPU_INTERRUPT_EXIT;
|
env->exit_request = 0;
|
||||||
env->exception_index = EXCP_INTERRUPT;
|
env->exception_index = EXCP_INTERRUPT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
47
monitor.c
47
monitor.c
@@ -76,6 +76,8 @@ static uint8_t term_outbuf[1024];
|
|||||||
static int term_outbuf_index;
|
static int term_outbuf_index;
|
||||||
|
|
||||||
static void monitor_start_input(void);
|
static void monitor_start_input(void);
|
||||||
|
static void monitor_readline(const char *prompt, int is_password,
|
||||||
|
char *buf, int buf_size);
|
||||||
|
|
||||||
static CPUState *mon_cpu = NULL;
|
static CPUState *mon_cpu = NULL;
|
||||||
|
|
||||||
@@ -433,7 +435,7 @@ static void do_change_block(const char *device, const char *filename, const char
|
|||||||
if (eject_device(bs, 0) < 0)
|
if (eject_device(bs, 0) < 0)
|
||||||
return;
|
return;
|
||||||
bdrv_open2(bs, filename, 0, drv);
|
bdrv_open2(bs, filename, 0, drv);
|
||||||
qemu_key_check(bs, filename);
|
monitor_read_bdrv_key(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_change_vnc(const char *target, const char *arg)
|
static void do_change_vnc(const char *target, const char *arg)
|
||||||
@@ -494,9 +496,24 @@ static void do_stop(void)
|
|||||||
vm_stop(EXCP_INTERRUPT);
|
vm_stop(EXCP_INTERRUPT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs)
|
||||||
|
{
|
||||||
|
int *err = opaque;
|
||||||
|
|
||||||
|
if (bdrv_key_required(bs))
|
||||||
|
*err = monitor_read_bdrv_key(bs);
|
||||||
|
else
|
||||||
|
*err = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void do_cont(void)
|
static void do_cont(void)
|
||||||
{
|
{
|
||||||
vm_start();
|
int err = 0;
|
||||||
|
|
||||||
|
bdrv_iterate(encrypted_bdrv_it, &err);
|
||||||
|
/* only resume the vm if all keys are set and valid */
|
||||||
|
if (!err)
|
||||||
|
vm_start();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_GDBSTUB
|
#ifdef CONFIG_GDBSTUB
|
||||||
@@ -2679,8 +2696,9 @@ static void file_completion(const char *input)
|
|||||||
closedir(ffs);
|
closedir(ffs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void block_completion_it(void *opaque, const char *name)
|
static void block_completion_it(void *opaque, BlockDriverState *bs)
|
||||||
{
|
{
|
||||||
|
const char *name = bdrv_get_device_name(bs);
|
||||||
const char *input = opaque;
|
const char *input = opaque;
|
||||||
|
|
||||||
if (input[0] == '\0' ||
|
if (input[0] == '\0' ||
|
||||||
@@ -2891,8 +2909,8 @@ static void monitor_readline_cb(void *opaque, const char *input)
|
|||||||
monitor_readline_started = 0;
|
monitor_readline_started = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void monitor_readline(const char *prompt, int is_password,
|
static void monitor_readline(const char *prompt, int is_password,
|
||||||
char *buf, int buf_size)
|
char *buf, int buf_size)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int old_focus[MAX_MON];
|
int old_focus[MAX_MON];
|
||||||
@@ -2922,3 +2940,22 @@ void monitor_readline(const char *prompt, int is_password,
|
|||||||
monitor_hd[i]->focus = old_focus[i];
|
monitor_hd[i]->focus = old_focus[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int monitor_read_bdrv_key(BlockDriverState *bs)
|
||||||
|
{
|
||||||
|
char password[256];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!bdrv_is_encrypted(bs))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
term_printf("%s (%s) is encrypted.\n", bdrv_get_device_name(bs),
|
||||||
|
bdrv_get_encrypted_filename(bs));
|
||||||
|
for(i = 0; i < 3; i++) {
|
||||||
|
monitor_readline("Password: ", 1, password, sizeof(password));
|
||||||
|
if (bdrv_set_key(bs, password) == 0)
|
||||||
|
return 0;
|
||||||
|
term_printf("invalid password\n");
|
||||||
|
}
|
||||||
|
return -EPERM;
|
||||||
|
}
|
||||||
|
44
qemu-char.c
44
qemu-char.c
@@ -101,6 +101,10 @@
|
|||||||
/***********************************************************/
|
/***********************************************************/
|
||||||
/* character device */
|
/* character device */
|
||||||
|
|
||||||
|
static TAILQ_HEAD(CharDriverStateHead, CharDriverState) chardevs =
|
||||||
|
TAILQ_HEAD_INITIALIZER(chardevs);
|
||||||
|
static int initial_reset_issued;
|
||||||
|
|
||||||
static void qemu_chr_event(CharDriverState *s, int event)
|
static void qemu_chr_event(CharDriverState *s, int event)
|
||||||
{
|
{
|
||||||
if (!s->chr_event)
|
if (!s->chr_event)
|
||||||
@@ -118,12 +122,23 @@ static void qemu_chr_reset_bh(void *opaque)
|
|||||||
|
|
||||||
void qemu_chr_reset(CharDriverState *s)
|
void qemu_chr_reset(CharDriverState *s)
|
||||||
{
|
{
|
||||||
if (s->bh == NULL) {
|
if (s->bh == NULL && initial_reset_issued) {
|
||||||
s->bh = qemu_bh_new(qemu_chr_reset_bh, s);
|
s->bh = qemu_bh_new(qemu_chr_reset_bh, s);
|
||||||
qemu_bh_schedule(s->bh);
|
qemu_bh_schedule(s->bh);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qemu_chr_initial_reset(void)
|
||||||
|
{
|
||||||
|
CharDriverState *chr;
|
||||||
|
|
||||||
|
initial_reset_issued = 1;
|
||||||
|
|
||||||
|
TAILQ_FOREACH(chr, &chardevs, next) {
|
||||||
|
qemu_chr_reset(chr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len)
|
int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len)
|
||||||
{
|
{
|
||||||
return s->chr_write(s, buf, len);
|
return s->chr_write(s, buf, len);
|
||||||
@@ -210,12 +225,15 @@ typedef struct {
|
|||||||
IOEventHandler *chr_event[MAX_MUX];
|
IOEventHandler *chr_event[MAX_MUX];
|
||||||
void *ext_opaque[MAX_MUX];
|
void *ext_opaque[MAX_MUX];
|
||||||
CharDriverState *drv;
|
CharDriverState *drv;
|
||||||
unsigned char buffer[MUX_BUFFER_SIZE];
|
|
||||||
int prod;
|
|
||||||
int cons;
|
|
||||||
int mux_cnt;
|
int mux_cnt;
|
||||||
int term_got_escape;
|
int term_got_escape;
|
||||||
int max_size;
|
int max_size;
|
||||||
|
/* Intermediate input buffer allows to catch escape sequences even if the
|
||||||
|
currently active device is not accepting any input - but only until it
|
||||||
|
is full as well. */
|
||||||
|
unsigned char buffer[MAX_MUX][MUX_BUFFER_SIZE];
|
||||||
|
int prod[MAX_MUX];
|
||||||
|
int cons[MAX_MUX];
|
||||||
} MuxDriver;
|
} MuxDriver;
|
||||||
|
|
||||||
|
|
||||||
@@ -345,11 +363,11 @@ static void mux_chr_accept_input(CharDriverState *chr)
|
|||||||
int m = chr->focus;
|
int m = chr->focus;
|
||||||
MuxDriver *d = chr->opaque;
|
MuxDriver *d = chr->opaque;
|
||||||
|
|
||||||
while (d->prod != d->cons &&
|
while (d->prod[m] != d->cons[m] &&
|
||||||
d->chr_can_read[m] &&
|
d->chr_can_read[m] &&
|
||||||
d->chr_can_read[m](d->ext_opaque[m])) {
|
d->chr_can_read[m](d->ext_opaque[m])) {
|
||||||
d->chr_read[m](d->ext_opaque[m],
|
d->chr_read[m](d->ext_opaque[m],
|
||||||
&d->buffer[d->cons++ & MUX_BUFFER_MASK], 1);
|
&d->buffer[m][d->cons[m]++ & MUX_BUFFER_MASK], 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,11 +375,12 @@ static int mux_chr_can_read(void *opaque)
|
|||||||
{
|
{
|
||||||
CharDriverState *chr = opaque;
|
CharDriverState *chr = opaque;
|
||||||
MuxDriver *d = chr->opaque;
|
MuxDriver *d = chr->opaque;
|
||||||
|
int m = chr->focus;
|
||||||
|
|
||||||
if ((d->prod - d->cons) < MUX_BUFFER_SIZE)
|
if ((d->prod[m] - d->cons[m]) < MUX_BUFFER_SIZE)
|
||||||
return 1;
|
return 1;
|
||||||
if (d->chr_can_read[chr->focus])
|
if (d->chr_can_read[m])
|
||||||
return d->chr_can_read[chr->focus](d->ext_opaque[chr->focus]);
|
return d->chr_can_read[m](d->ext_opaque[m]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -376,12 +395,12 @@ static void mux_chr_read(void *opaque, const uint8_t *buf, int size)
|
|||||||
|
|
||||||
for(i = 0; i < size; i++)
|
for(i = 0; i < size; i++)
|
||||||
if (mux_proc_byte(chr, d, buf[i])) {
|
if (mux_proc_byte(chr, d, buf[i])) {
|
||||||
if (d->prod == d->cons &&
|
if (d->prod[m] == d->cons[m] &&
|
||||||
d->chr_can_read[m] &&
|
d->chr_can_read[m] &&
|
||||||
d->chr_can_read[m](d->ext_opaque[m]))
|
d->chr_can_read[m](d->ext_opaque[m]))
|
||||||
d->chr_read[m](d->ext_opaque[m], &buf[i], 1);
|
d->chr_read[m](d->ext_opaque[m], &buf[i], 1);
|
||||||
else
|
else
|
||||||
d->buffer[d->prod++ & MUX_BUFFER_MASK] = buf[i];
|
d->buffer[m][d->prod[m]++ & MUX_BUFFER_MASK] = buf[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2076,9 +2095,6 @@ static CharDriverState *qemu_chr_open_tcp(const char *host_str,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static TAILQ_HEAD(CharDriverStateHead, CharDriverState) chardevs
|
|
||||||
= TAILQ_HEAD_INITIALIZER(chardevs);
|
|
||||||
|
|
||||||
CharDriverState *qemu_chr_open(const char *label, const char *filename, void (*init)(struct CharDriverState *s))
|
CharDriverState *qemu_chr_open(const char *label, const char *filename, void (*init)(struct CharDriverState *s))
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
|
@@ -74,6 +74,7 @@ void qemu_chr_add_handlers(CharDriverState *s,
|
|||||||
void *opaque);
|
void *opaque);
|
||||||
int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg);
|
int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg);
|
||||||
void qemu_chr_reset(CharDriverState *s);
|
void qemu_chr_reset(CharDriverState *s);
|
||||||
|
void qemu_chr_initial_reset(void);
|
||||||
int qemu_chr_can_read(CharDriverState *s);
|
int qemu_chr_can_read(CharDriverState *s);
|
||||||
void qemu_chr_read(CharDriverState *s, uint8_t *buf, int len);
|
void qemu_chr_read(CharDriverState *s, uint8_t *buf, int len);
|
||||||
void qemu_chr_accept_input(CharDriverState *s);
|
void qemu_chr_accept_input(CharDriverState *s);
|
||||||
|
@@ -74,8 +74,8 @@ static void help(void)
|
|||||||
" differ\n"
|
" differ\n"
|
||||||
" 'fmt' is the disk image format. It is guessed automatically in most cases\n"
|
" 'fmt' is the disk image format. It is guessed automatically in most cases\n"
|
||||||
" 'size' is the disk image size in kilobytes. Optional suffixes\n"
|
" 'size' is the disk image size in kilobytes. Optional suffixes\n"
|
||||||
" 'M' (megabyte, 1024 * 1024) and 'G' (gigabyte, 1024 * 1024 * 1024) are"
|
" 'M' (megabyte, 1024 * 1024) and 'G' (gigabyte, 1024 * 1024 * 1024) are\n"
|
||||||
" supported any @code{k} or @code{K} is ignored\n"
|
" supported any 'k' or 'K' is ignored\n"
|
||||||
" 'output_filename' is the destination disk image filename\n"
|
" 'output_filename' is the destination disk image filename\n"
|
||||||
" 'output_fmt' is the destination format\n"
|
" 'output_fmt' is the destination format\n"
|
||||||
" '-c' indicates that target image must be compressed (qcow format only)\n"
|
" '-c' indicates that target image must be compressed (qcow format only)\n"
|
||||||
@@ -730,10 +730,6 @@ static int img_info(int argc, char **argv)
|
|||||||
if (bdrv_get_info(bs, &bdi) >= 0) {
|
if (bdrv_get_info(bs, &bdi) >= 0) {
|
||||||
if (bdi.cluster_size != 0)
|
if (bdi.cluster_size != 0)
|
||||||
printf("cluster_size: %d\n", bdi.cluster_size);
|
printf("cluster_size: %d\n", bdi.cluster_size);
|
||||||
if (bdi.highest_alloc)
|
|
||||||
printf("highest_alloc: %" PRId64 "\n", bdi.highest_alloc);
|
|
||||||
if (bdi.num_free_bytes)
|
|
||||||
printf("num_free_bytes: %" PRId64 "\n", bdi.num_free_bytes);
|
|
||||||
}
|
}
|
||||||
bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
|
bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
|
||||||
if (backing_filename[0] != '\0') {
|
if (backing_filename[0] != '\0') {
|
||||||
|
4
savevm.c
4
savevm.c
@@ -118,7 +118,9 @@ void qemu_announce_self(void)
|
|||||||
VLANClientState *vc;
|
VLANClientState *vc;
|
||||||
uint8_t buf[256];
|
uint8_t buf[256];
|
||||||
|
|
||||||
for (i = 0; i < nb_nics; i++) {
|
for (i = 0; i < MAX_NICS; i++) {
|
||||||
|
if (!nd_table[i].used)
|
||||||
|
continue;
|
||||||
len = announce_self_create(buf, nd_table[i].macaddr);
|
len = announce_self_create(buf, nd_table[i].macaddr);
|
||||||
vlan = nd_table[i].vlan;
|
vlan = nd_table[i].vlan;
|
||||||
for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
|
for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
|
||||||
|
2
sdl.c
2
sdl.c
@@ -27,7 +27,7 @@
|
|||||||
#include "x_keymap.h"
|
#include "x_keymap.h"
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include <SDL/SDL_syswm.h>
|
#include <SDL_syswm.h>
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
@@ -1421,10 +1421,10 @@ static void host_cpuid(uint32_t function, uint32_t count,
|
|||||||
#else
|
#else
|
||||||
asm volatile("pusha \n\t"
|
asm volatile("pusha \n\t"
|
||||||
"cpuid \n\t"
|
"cpuid \n\t"
|
||||||
"mov %%eax, 0(%1) \n\t"
|
"mov %%eax, 0(%2) \n\t"
|
||||||
"mov %%ebx, 4(%1) \n\t"
|
"mov %%ebx, 4(%2) \n\t"
|
||||||
"mov %%ecx, 8(%1) \n\t"
|
"mov %%ecx, 8(%2) \n\t"
|
||||||
"mov %%edx, 12(%1) \n\t"
|
"mov %%edx, 12(%2) \n\t"
|
||||||
"popa"
|
"popa"
|
||||||
: : "a"(function), "c"(count), "S"(vec)
|
: : "a"(function), "c"(count), "S"(vec)
|
||||||
: "memory", "cc");
|
: "memory", "cc");
|
||||||
|
@@ -3241,6 +3241,8 @@ target_ulong helper_lsl(target_ulong selector1)
|
|||||||
|
|
||||||
selector = selector1 & 0xffff;
|
selector = selector1 & 0xffff;
|
||||||
eflags = helper_cc_compute_all(CC_OP);
|
eflags = helper_cc_compute_all(CC_OP);
|
||||||
|
if ((selector & 0xfffc) == 0)
|
||||||
|
goto fail;
|
||||||
if (load_segment(&e1, &e2, selector) != 0)
|
if (load_segment(&e1, &e2, selector) != 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
rpl = selector & 3;
|
rpl = selector & 3;
|
||||||
|
76
vl.c
76
vl.c
@@ -201,6 +201,7 @@ ram_addr_t ram_size;
|
|||||||
int nb_nics;
|
int nb_nics;
|
||||||
NICInfo nd_table[MAX_NICS];
|
NICInfo nd_table[MAX_NICS];
|
||||||
int vm_running;
|
int vm_running;
|
||||||
|
static int autostart;
|
||||||
static int rtc_utc = 1;
|
static int rtc_utc = 1;
|
||||||
static int rtc_date_offset = -1; /* -1 means no change */
|
static int rtc_date_offset = -1; /* -1 means no change */
|
||||||
int cirrus_vga_enabled = 1;
|
int cirrus_vga_enabled = 1;
|
||||||
@@ -2607,11 +2608,13 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
|
|||||||
bdrv_flags |= BDRV_O_CACHE_WB;
|
bdrv_flags |= BDRV_O_CACHE_WB;
|
||||||
else if (cache == 3) /* not specified */
|
else if (cache == 3) /* not specified */
|
||||||
bdrv_flags |= BDRV_O_CACHE_DEF;
|
bdrv_flags |= BDRV_O_CACHE_DEF;
|
||||||
if (bdrv_open2(bdrv, file, bdrv_flags, drv) < 0 || qemu_key_check(bdrv, file)) {
|
if (bdrv_open2(bdrv, file, bdrv_flags, drv) < 0) {
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
if (bdrv_key_required(bdrv))
|
||||||
|
autostart = 0;
|
||||||
return drives_table_idx;
|
return drives_table_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2658,7 +2661,7 @@ int usb_device_add_dev(USBDevice *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_device_add(const char *devname)
|
static int usb_device_add(const char *devname, int is_hotplug)
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
USBDevice *dev;
|
USBDevice *dev;
|
||||||
@@ -2675,7 +2678,18 @@ static int usb_device_add(const char *devname)
|
|||||||
} else if (!strcmp(devname, "keyboard")) {
|
} else if (!strcmp(devname, "keyboard")) {
|
||||||
dev = usb_keyboard_init();
|
dev = usb_keyboard_init();
|
||||||
} else if (strstart(devname, "disk:", &p)) {
|
} else if (strstart(devname, "disk:", &p)) {
|
||||||
dev = usb_msd_init(p);
|
BlockDriverState *bs;
|
||||||
|
|
||||||
|
dev = usb_msd_init(p, &bs);
|
||||||
|
if (!dev)
|
||||||
|
return -1;
|
||||||
|
if (bdrv_key_required(bs)) {
|
||||||
|
autostart = 0;
|
||||||
|
if (is_hotplug && monitor_read_bdrv_key(bs) < 0) {
|
||||||
|
dev->handle_destroy(dev);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (!strcmp(devname, "wacom-tablet")) {
|
} else if (!strcmp(devname, "wacom-tablet")) {
|
||||||
dev = usb_wacom_init();
|
dev = usb_wacom_init();
|
||||||
} else if (strstart(devname, "serial:", &p)) {
|
} else if (strstart(devname, "serial:", &p)) {
|
||||||
@@ -2756,7 +2770,7 @@ static int usb_device_del(const char *devname)
|
|||||||
|
|
||||||
void do_usb_add(const char *devname)
|
void do_usb_add(const char *devname)
|
||||||
{
|
{
|
||||||
usb_device_add(devname);
|
usb_device_add(devname, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_usb_del(const char *devname)
|
void do_usb_del(const char *devname)
|
||||||
@@ -4334,45 +4348,6 @@ static const QEMUOption qemu_options[] = {
|
|||||||
{ NULL },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* password input */
|
|
||||||
|
|
||||||
int qemu_key_check(BlockDriverState *bs, const char *name)
|
|
||||||
{
|
|
||||||
char password[256];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!bdrv_is_encrypted(bs))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
term_printf("%s is encrypted.\n", name);
|
|
||||||
for(i = 0; i < 3; i++) {
|
|
||||||
monitor_readline("Password: ", 1, password, sizeof(password));
|
|
||||||
if (bdrv_set_key(bs, password) == 0)
|
|
||||||
return 0;
|
|
||||||
term_printf("invalid password\n");
|
|
||||||
}
|
|
||||||
return -EPERM;
|
|
||||||
}
|
|
||||||
|
|
||||||
static BlockDriverState *get_bdrv(int index)
|
|
||||||
{
|
|
||||||
if (index > nb_drives)
|
|
||||||
return NULL;
|
|
||||||
return drives_table[index].bdrv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void read_passwords(void)
|
|
||||||
{
|
|
||||||
BlockDriverState *bs;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i = 0; i < 6; i++) {
|
|
||||||
bs = get_bdrv(i);
|
|
||||||
if (bs)
|
|
||||||
qemu_key_check(bs, bdrv_get_device_name(bs));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAS_AUDIO
|
#ifdef HAS_AUDIO
|
||||||
struct soundhw soundhw[] = {
|
struct soundhw soundhw[] = {
|
||||||
#ifdef HAS_AUDIO_CHOICE
|
#ifdef HAS_AUDIO_CHOICE
|
||||||
@@ -4639,7 +4614,6 @@ int main(int argc, char **argv, char **envp)
|
|||||||
int fds[2];
|
int fds[2];
|
||||||
int tb_size;
|
int tb_size;
|
||||||
const char *pid_file = NULL;
|
const char *pid_file = NULL;
|
||||||
int autostart;
|
|
||||||
const char *incoming = NULL;
|
const char *incoming = NULL;
|
||||||
int fd = 0;
|
int fd = 0;
|
||||||
struct passwd *pwd = NULL;
|
struct passwd *pwd = NULL;
|
||||||
@@ -4696,7 +4670,7 @@ int main(int argc, char **argv, char **envp)
|
|||||||
kernel_cmdline = "";
|
kernel_cmdline = "";
|
||||||
cyls = heads = secs = 0;
|
cyls = heads = secs = 0;
|
||||||
translation = BIOS_ATA_TRANSLATION_AUTO;
|
translation = BIOS_ATA_TRANSLATION_AUTO;
|
||||||
monitor_device = "vc";
|
monitor_device = "vc:80Cx24C";
|
||||||
|
|
||||||
serial_devices[0] = "vc:80Cx24C";
|
serial_devices[0] = "vc:80Cx24C";
|
||||||
for(i = 1; i < MAX_SERIAL_PORTS; i++)
|
for(i = 1; i < MAX_SERIAL_PORTS; i++)
|
||||||
@@ -5637,7 +5611,7 @@ int main(int argc, char **argv, char **envp)
|
|||||||
/* init USB devices */
|
/* init USB devices */
|
||||||
if (usb_enabled) {
|
if (usb_enabled) {
|
||||||
for(i = 0; i < usb_devices_index; i++) {
|
for(i = 0; i < usb_devices_index; i++) {
|
||||||
if (usb_device_add(usb_devices[i]) < 0) {
|
if (usb_device_add(usb_devices[i], 0) < 0) {
|
||||||
fprintf(stderr, "Warning: could not add USB device %s\n",
|
fprintf(stderr, "Warning: could not add USB device %s\n",
|
||||||
usb_devices[i]);
|
usb_devices[i]);
|
||||||
}
|
}
|
||||||
@@ -5693,6 +5667,7 @@ int main(int argc, char **argv, char **envp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
text_consoles_set_display(display_state);
|
text_consoles_set_display(display_state);
|
||||||
|
qemu_chr_initial_reset();
|
||||||
|
|
||||||
if (monitor_device && monitor_hd)
|
if (monitor_device && monitor_hd)
|
||||||
monitor_init(monitor_hd, !nographic);
|
monitor_init(monitor_hd, !nographic);
|
||||||
@@ -5747,13 +5722,8 @@ int main(int argc, char **argv, char **envp)
|
|||||||
qemu_start_incoming_migration(incoming);
|
qemu_start_incoming_migration(incoming);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
if (autostart)
|
||||||
/* XXX: simplify init */
|
vm_start();
|
||||||
read_passwords();
|
|
||||||
if (autostart) {
|
|
||||||
vm_start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (daemonize) {
|
if (daemonize) {
|
||||||
uint8_t status = 0;
|
uint8_t status = 0;
|
||||||
|
Reference in New Issue
Block a user