Compare commits

..

4 Commits

Author SHA1 Message Date
Gerd Hoffmann
a889bc2bb2 add secondary-vga to display-vga test
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
2014-04-28 11:03:39 +02:00
Gerd Hoffmann
0850fd583f add display-vga test
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
2014-04-28 11:03:35 +02:00
Gerd Hoffmann
63e3e24db2 vga: add secondary stdvga variant
Add a standard vga variant which doesn't occupy any legacy
resources and thus can easily be used as secondary (or legacy-free)
graphics adapter.  Programming must be done using the MMIO bar.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
2014-04-28 11:03:32 +02:00
Gerd Hoffmann
e2bbfc8ee2 vga: allow non-global vmstate
Need a way to opt-out from vga.vram being global vmstate, for
secondary vga cards.  Add a bool parameter to vga_common_init
to support this.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
2014-04-28 10:21:55 +02:00
88 changed files with 699 additions and 1584 deletions

18
.gitignore vendored
View File

@@ -18,8 +18,8 @@
/*-darwin-user /*-darwin-user
/*-linux-user /*-linux-user
/*-bsd-user /*-bsd-user
/libdis* libdis*
/libuser libuser
/linux-headers/asm /linux-headers/asm
/qga/qapi-generated /qga/qapi-generated
/qapi-generated /qapi-generated
@@ -49,9 +49,19 @@
/qemu-monitor.texi /qemu-monitor.texi
/qmp-commands.txt /qmp-commands.txt
/vscclient /vscclient
/test-bitops
/test-coroutine
/test-int128
/test-opts-visitor
/test-qmp-input-visitor
/test-qmp-output-visitor
/test-string-input-visitor
/test-string-output-visitor
/test-visitor-serialization
/fsdev/virtfs-proxy-helper /fsdev/virtfs-proxy-helper
/fsdev/virtfs-proxy-helper.1 /fsdev/virtfs-proxy-helper.1
/fsdev/virtfs-proxy-helper.pod /fsdev/virtfs-proxy-helper.pod
/.gdbinit
*.a *.a
*.aux *.aux
*.cp *.cp
@@ -80,8 +90,12 @@
*.pc *.pc
.libs .libs
.sdk .sdk
*.swp
*.orig
.pc
*.gcda *.gcda
*.gcno *.gcno
patches
/pc-bios/bios-pq/status /pc-bios/bios-pq/status
/pc-bios/vgabios-pq/status /pc-bios/vgabios-pq/status
/pc-bios/optionrom/linuxboot.asm /pc-bios/optionrom/linuxboot.asm

View File

@@ -674,8 +674,6 @@ S: Supported
F: block* F: block*
F: block/ F: block/
F: hw/block/ F: hw/block/
F: qemu-img*
F: qemu-io*
T: git git://repo.or.cz/qemu/kevin.git block T: git git://repo.or.cz/qemu/kevin.git block
T: git git://github.com/stefanha/qemu.git block T: git git://github.com/stefanha/qemu.git block

35
block.c
View File

@@ -864,7 +864,7 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
node_name = qdict_get_try_str(options, "node-name"); node_name = qdict_get_try_str(options, "node-name");
bdrv_assign_node_name(bs, node_name, &local_err); bdrv_assign_node_name(bs, node_name, &local_err);
if (local_err) { if (error_is_set(&local_err)) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
return -EINVAL; return -EINVAL;
} }
@@ -1068,14 +1068,14 @@ fail:
*/ */
int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp) int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
{ {
char *backing_filename = g_malloc0(PATH_MAX); char backing_filename[PATH_MAX];
int back_flags, ret = 0; int back_flags, ret;
BlockDriver *back_drv = NULL; BlockDriver *back_drv = NULL;
Error *local_err = NULL; Error *local_err = NULL;
if (bs->backing_hd != NULL) { if (bs->backing_hd != NULL) {
QDECREF(options); QDECREF(options);
goto free_exit; return 0;
} }
/* NULL means an empty set of options */ /* NULL means an empty set of options */
@@ -1088,9 +1088,10 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
backing_filename[0] = '\0'; backing_filename[0] = '\0';
} else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) { } else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) {
QDECREF(options); QDECREF(options);
goto free_exit; return 0;
} else { } else {
bdrv_get_full_backing_filename(bs, backing_filename, PATH_MAX); bdrv_get_full_backing_filename(bs, backing_filename,
sizeof(backing_filename));
} }
if (bs->backing_format[0] != '\0') { if (bs->backing_format[0] != '\0') {
@@ -1111,7 +1112,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
error_setg(errp, "Could not open backing file: %s", error_setg(errp, "Could not open backing file: %s",
error_get_pretty(local_err)); error_get_pretty(local_err));
error_free(local_err); error_free(local_err);
goto free_exit; return ret;
} }
if (bs->backing_hd->file) { if (bs->backing_hd->file) {
@@ -1122,9 +1123,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
/* Recalculate the BlockLimits with the backing file */ /* Recalculate the BlockLimits with the backing file */
bdrv_refresh_limits(bs); bdrv_refresh_limits(bs);
free_exit: return 0;
g_free(backing_filename);
return ret;
} }
/* /*
@@ -1181,7 +1180,8 @@ done:
void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp) void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp)
{ {
/* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */ /* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */
char *tmp_filename = g_malloc0(PATH_MAX + 1); char tmp_filename[PATH_MAX + 1];
int64_t total_size; int64_t total_size;
BlockDriver *bdrv_qcow2; BlockDriver *bdrv_qcow2;
QEMUOptionParameter *create_options; QEMUOptionParameter *create_options;
@@ -1197,15 +1197,15 @@ void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp)
total_size = bdrv_getlength(bs); total_size = bdrv_getlength(bs);
if (total_size < 0) { if (total_size < 0) {
error_setg_errno(errp, -total_size, "Could not get image size"); error_setg_errno(errp, -total_size, "Could not get image size");
goto out; return;
} }
total_size &= BDRV_SECTOR_MASK; total_size &= BDRV_SECTOR_MASK;
/* Create the temporary image */ /* Create the temporary image */
ret = get_tmp_filename(tmp_filename, PATH_MAX + 1); ret = get_tmp_filename(tmp_filename, sizeof(tmp_filename));
if (ret < 0) { if (ret < 0) {
error_setg_errno(errp, -ret, "Could not get temporary filename"); error_setg_errno(errp, -ret, "Could not get temporary filename");
goto out; return;
} }
bdrv_qcow2 = bdrv_find_format("qcow2"); bdrv_qcow2 = bdrv_find_format("qcow2");
@@ -1221,7 +1221,7 @@ void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp)
"'%s': %s", tmp_filename, "'%s': %s", tmp_filename,
error_get_pretty(local_err)); error_get_pretty(local_err));
error_free(local_err); error_free(local_err);
goto out; return;
} }
/* Prepare a new options QDict for the temporary file */ /* Prepare a new options QDict for the temporary file */
@@ -1238,13 +1238,10 @@ void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp)
bs->open_flags & ~BDRV_O_SNAPSHOT, bdrv_qcow2, &local_err); bs->open_flags & ~BDRV_O_SNAPSHOT, bdrv_qcow2, &local_err);
if (ret < 0) { if (ret < 0) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
goto out; return;
} }
bdrv_append(bs_snapshot, bs); bdrv_append(bs_snapshot, bs);
out:
g_free(tmp_filename);
} }
/* /*

View File

@@ -194,7 +194,7 @@ void commit_start(BlockDriverState *bs, BlockDriverState *base,
if ((on_error == BLOCKDEV_ON_ERROR_STOP || if ((on_error == BLOCKDEV_ON_ERROR_STOP ||
on_error == BLOCKDEV_ON_ERROR_ENOSPC) && on_error == BLOCKDEV_ON_ERROR_ENOSPC) &&
!bdrv_iostatus_is_enabled(bs)) { !bdrv_iostatus_is_enabled(bs)) {
error_setg(errp, "Invalid parameter combination"); error_set(errp, QERR_INVALID_PARAMETER_COMBINATION);
return; return;
} }

View File

@@ -1095,15 +1095,16 @@ static struct scsi_task *iscsi_do_inquiry(struct iscsi_context *iscsi, int lun,
*inq = scsi_datain_unmarshall(task); *inq = scsi_datain_unmarshall(task);
if (*inq == NULL) { if (*inq == NULL) {
error_setg(errp, "iSCSI: failed to unmarshall inquiry datain blob"); error_setg(errp, "iSCSI: failed to unmarshall inquiry datain blob");
goto fail_with_err; goto fail;
} }
return task; return task;
fail: fail:
error_setg(errp, "iSCSI: Inquiry command failed : %s", if (!error_is_set(errp)) {
iscsi_get_error(iscsi)); error_setg(errp, "iSCSI: Inquiry command failed : %s",
fail_with_err: iscsi_get_error(iscsi));
}
if (task != NULL) { if (task != NULL) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
} }

View File

@@ -680,7 +680,7 @@ void commit_active_start(BlockDriverState *bs, BlockDriverState *base,
mirror_start_job(bs, base, speed, 0, 0, mirror_start_job(bs, base, speed, 0, 0,
on_error, on_error, cb, opaque, &local_err, on_error, on_error, cb, opaque, &local_err,
&commit_active_job_driver, false, base); &commit_active_job_driver, false, base);
if (local_err) { if (error_is_set(&local_err)) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
goto error_restore_flags; goto error_restore_flags;
} }

View File

@@ -175,7 +175,7 @@ static void nbd_parse_filename(const char *filename, QDict *options,
InetSocketAddress *addr = NULL; InetSocketAddress *addr = NULL;
addr = inet_parse(host_spec, errp); addr = inet_parse(host_spec, errp);
if (!addr) { if (error_is_set(errp)) {
goto out; goto out;
} }

View File

@@ -343,7 +343,7 @@ static int nfs_file_open(BlockDriverState *bs, QDict *options, int flags,
opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort); opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
qemu_opts_absorb_qdict(opts, options, &local_err); qemu_opts_absorb_qdict(opts, options, &local_err);
if (local_err) { if (error_is_set(&local_err)) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
return -EINVAL; return -EINVAL;
} }

View File

@@ -753,7 +753,7 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
opts = qemu_opts_create(&quorum_runtime_opts, NULL, 0, &error_abort); opts = qemu_opts_create(&quorum_runtime_opts, NULL, 0, &error_abort);
qemu_opts_absorb_qdict(opts, options, &local_err); qemu_opts_absorb_qdict(opts, options, &local_err);
if (local_err) { if (error_is_set(&local_err)) {
ret = -EINVAL; ret = -EINVAL;
goto exit; goto exit;
} }
@@ -828,7 +828,7 @@ close_exit:
g_free(opened); g_free(opened);
exit: exit:
/* propagate error */ /* propagate error */
if (local_err) { if (error_is_set(&local_err)) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
} }
QDECREF(list); QDECREF(list);

View File

@@ -1115,7 +1115,6 @@ typedef struct InternalSnapshotState {
static void internal_snapshot_prepare(BlkTransactionState *common, static void internal_snapshot_prepare(BlkTransactionState *common,
Error **errp) Error **errp)
{ {
Error *local_err = NULL;
const char *device; const char *device;
const char *name; const char *name;
BlockDriverState *bs; BlockDriverState *bs;
@@ -1164,10 +1163,8 @@ static void internal_snapshot_prepare(BlkTransactionState *common,
} }
/* check whether a snapshot with name exist */ /* check whether a snapshot with name exist */
ret = bdrv_snapshot_find_by_id_and_name(bs, NULL, name, &old_sn, ret = bdrv_snapshot_find_by_id_and_name(bs, NULL, name, &old_sn, errp);
&local_err); if (error_is_set(errp)) {
if (local_err) {
error_propagate(errp, local_err);
return; return;
} else if (ret) { } else if (ret) {
error_setg(errp, error_setg(errp,
@@ -1523,16 +1520,14 @@ static void eject_device(BlockDriverState *bs, int force, Error **errp)
return; return;
} }
if (!bdrv_dev_has_removable_media(bs)) { if (!bdrv_dev_has_removable_media(bs)) {
error_setg(errp, "Device '%s' is not removable", error_set(errp, QERR_DEVICE_NOT_REMOVABLE, bdrv_get_device_name(bs));
bdrv_get_device_name(bs));
return; return;
} }
if (bdrv_dev_is_medium_locked(bs) && !bdrv_dev_is_tray_open(bs)) { if (bdrv_dev_is_medium_locked(bs) && !bdrv_dev_is_tray_open(bs)) {
bdrv_dev_eject_request(bs, force); bdrv_dev_eject_request(bs, force);
if (!force) { if (!force) {
error_setg(errp, "Device '%s' is locked", error_set(errp, QERR_DEVICE_LOCKED, bdrv_get_device_name(bs));
bdrv_get_device_name(bs));
return; return;
} }
} }
@@ -2224,8 +2219,7 @@ void qmp_block_job_cancel(const char *device,
return; return;
} }
if (job->paused && !force) { if (job->paused && !force) {
error_setg(errp, "The block job for device '%s' is currently paused", error_set(errp, QERR_BLOCK_JOB_PAUSED, device);
device);
return; return;
} }

View File

@@ -88,7 +88,7 @@ void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
Error *local_err = NULL; Error *local_err = NULL;
if (!job->driver->set_speed) { if (!job->driver->set_speed) {
error_set(errp, QERR_UNSUPPORTED); error_set(errp, QERR_NOT_SUPPORTED);
return; return;
} }
job->driver->set_speed(job, speed, &local_err); job->driver->set_speed(job, speed, &local_err);

10
configure vendored
View File

@@ -1087,10 +1087,7 @@ for opt do
;; ;;
--enable-quorum) quorum="yes" --enable-quorum) quorum="yes"
;; ;;
*) *) echo "ERROR: unknown option $opt"; show_help="yes"
echo "ERROR: unknown option $opt"
echo "Try '$0 --help' for more information"
exit 1
;; ;;
esac esac
done done
@@ -1233,7 +1230,6 @@ Advanced options (experts only):
--with-sdlabi select preferred SDL ABI 1.2 or 2.0 --with-sdlabi select preferred SDL ABI 1.2 or 2.0
--disable-gtk disable gtk UI --disable-gtk disable gtk UI
--enable-gtk enable gtk UI --enable-gtk enable gtk UI
--with-gtkabi select preferred GTK ABI 2.0 or 3.0
--disable-virtfs disable VirtFS --disable-virtfs disable VirtFS
--enable-virtfs enable VirtFS --enable-virtfs enable VirtFS
--disable-vnc disable VNC --disable-vnc disable VNC
@@ -1357,7 +1353,7 @@ Advanced options (experts only):
NOTE: The object files are built at the place where configure is launched NOTE: The object files are built at the place where configure is launched
EOF EOF
exit 0 exit 1
fi fi
# Now we have handled --enable-tcg-interpreter and know we're not just # Now we have handled --enable-tcg-interpreter and know we're not just
@@ -4350,7 +4346,6 @@ if test "$modules" = "yes"; then
fi fi
if test "$sdl" = "yes" ; then if test "$sdl" = "yes" ; then
echo "CONFIG_SDL=y" >> $config_host_mak echo "CONFIG_SDL=y" >> $config_host_mak
echo "CONFIG_SDLABI=$sdlabi" >> $config_host_mak
echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
fi fi
if test "$cocoa" = "yes" ; then if test "$cocoa" = "yes" ; then
@@ -4434,7 +4429,6 @@ fi
echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
if test "$gtk" = "yes" ; then if test "$gtk" = "yes" ; then
echo "CONFIG_GTK=y" >> $config_host_mak echo "CONFIG_GTK=y" >> $config_host_mak
echo "CONFIG_GTKABI=$gtkabi" >> $config_host_mak
echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
fi fi
if test "$vte" = "yes" ; then if test "$vte" = "yes" ; then

2
cpus.c
View File

@@ -1454,7 +1454,7 @@ void qmp_pmemsave(int64_t addr, int64_t size, const char *filename,
l = sizeof(buf); l = sizeof(buf);
if (l > size) if (l > size)
l = size; l = size;
cpu_physical_memory_read(addr, buf, l); cpu_physical_memory_rw(addr, buf, l, 0);
if (fwrite(buf, 1, l, f) != l) { if (fwrite(buf, 1, l, f) != l) {
error_set(errp, QERR_IO_ERROR); error_set(errp, QERR_IO_ERROR);
goto exit; goto exit;

View File

@@ -5,9 +5,10 @@ QEMU Standard VGA
Exists in two variants, for isa and pci. Exists in two variants, for isa and pci.
command line switches: command line switches:
-vga std [ picks isa for -M isapc, otherwise pci ] -vga std [ picks isa for -M isapc, otherwise pci ]
-device VGA [ pci variant ] -device VGA [ pci variant ]
-device isa-vga [ isa variant ] -device isa-vga [ isa variant ]
-device secondary-vga [ legacy-free pci variant ]
PCI spec PCI spec
@@ -31,9 +32,15 @@ PCI ROM Region:
Holds the vgabios (qemu 0.14+). Holds the vgabios (qemu 0.14+).
The legacy-free variant has no ROM and has PCI_CLASS_DISPLAY_OTHER
instead of PCI_CLASS_DISPLAY_VGA.
IO ports used IO ports used
------------- -------------
Doesn't apply to the legacy-free pci variant, use the MMIO bar instead.
03c0 - 03df : standard vga ports 03c0 - 03df : standard vga ports
01ce : bochs vbe interface index port 01ce : bochs vbe interface index port
01cf : bochs vbe interface data port (x86 only) 01cf : bochs vbe interface data port (x86 only)

View File

@@ -311,7 +311,7 @@ void hmp_hello_world(Monitor *mon, const QDict *qdict)
Error *errp = NULL; Error *errp = NULL;
qmp_hello_world(!!message, message, &errp); qmp_hello_world(!!message, message, &errp);
if (errp) { if (error_is_set(&errp)) {
monitor_printf(mon, "%s\n", error_get_pretty(errp)); monitor_printf(mon, "%s\n", error_get_pretty(errp));
error_free(errp); error_free(errp);
return; return;
@@ -483,7 +483,7 @@ void hmp_info_alarm_clock(Monitor *mon)
Error *errp = NULL; Error *errp = NULL;
clock = qmp_query_alarm_clock(&errp); clock = qmp_query_alarm_clock(&errp);
if (errp) { if (error_is_set(&errp)) {
monitor_printf(mon, "Could not query alarm clock information\n"); monitor_printf(mon, "Could not query alarm clock information\n");
error_free(errp); error_free(errp);
return; return;
@@ -634,7 +634,7 @@ void hmp_info_alarm_methods(Monitor *mon)
Error *errp = NULL; Error *errp = NULL;
method_list = qmp_query_alarm_methods(&errp); method_list = qmp_query_alarm_methods(&errp);
if (errp) { if (error_is_set(&errp)) {
monitor_printf(mon, "Could not query alarm methods\n"); monitor_printf(mon, "Could not query alarm methods\n");
error_free(errp); error_free(errp);
return; return;

View File

@@ -760,7 +760,6 @@ static int proxy_socket(const char *path, uid_t uid, gid_t gid)
return -1; return -1;
} }
size = sizeof(qemu);
client = accept(sock, (struct sockaddr *)&qemu, &size); client = accept(sock, (struct sockaddr *)&qemu, &size);
if (client < 0) { if (client < 0) {
do_perror("accept"); do_perror("accept");

View File

@@ -176,7 +176,7 @@ ETEXI
{ {
.name = "drive_del", .name = "drive_del",
.args_type = "id:B", .args_type = "id:s",
.params = "device", .params = "device",
.help = "remove host block device", .help = "remove host block device",
.user_print = monitor_user_noop, .user_print = monitor_user_noop,
@@ -658,7 +658,6 @@ ETEXI
.help = "add device, like -device on the command line", .help = "add device, like -device on the command line",
.user_print = monitor_user_noop, .user_print = monitor_user_noop,
.mhandler.cmd_new = do_device_add, .mhandler.cmd_new = do_device_add,
.command_completion = device_add_completion,
}, },
STEXI STEXI
@@ -674,7 +673,6 @@ ETEXI
.params = "device", .params = "device",
.help = "remove device", .help = "remove device",
.mhandler.cmd = hmp_device_del, .mhandler.cmd = hmp_device_del,
.command_completion = device_del_completion,
}, },
STEXI STEXI
@@ -1000,34 +998,26 @@ ETEXI
{ {
.name = "dump-guest-memory", .name = "dump-guest-memory",
.args_type = "paging:-p,zlib:-z,lzo:-l,snappy:-s,filename:F,begin:i?,length:i?", .args_type = "paging:-p,filename:F,begin:i?,length:i?",
.params = "[-p] [-z|-l|-s] filename [begin length]", .params = "[-p] filename [begin] [length]",
.help = "dump guest memory into file 'filename'.\n\t\t\t" .help = "dump guest memory to file"
"-p: do paging to get guest's memory mapping.\n\t\t\t" "\n\t\t\t begin(optional): the starting physical address"
"-z: dump in kdump-compressed format, with zlib compression.\n\t\t\t" "\n\t\t\t length(optional): the memory size, in bytes",
"-l: dump in kdump-compressed format, with lzo compression.\n\t\t\t"
"-s: dump in kdump-compressed format, with snappy compression.\n\t\t\t"
"begin: the starting physical address.\n\t\t\t"
"length: the memory size, in bytes.",
.mhandler.cmd = hmp_dump_guest_memory, .mhandler.cmd = hmp_dump_guest_memory,
}, },
STEXI STEXI
@item dump-guest-memory [-p] @var{filename} @var{begin} @var{length} @item dump-guest-memory [-p] @var{protocol} @var{begin} @var{length}
@item dump-guest-memory [-z|-l|-s] @var{filename}
@findex dump-guest-memory @findex dump-guest-memory
Dump guest memory to @var{protocol}. The file can be processed with crash or Dump guest memory to @var{protocol}. The file can be processed with crash or
gdb. Without -z|-l|-s, the dump format is ELF. gdb.
-p: do paging to get guest's memory mapping. filename: dump file name
-z: dump in kdump-compressed format, with zlib compression. paging: do paging to get guest's memory mapping
-l: dump in kdump-compressed format, with lzo compression.
-s: dump in kdump-compressed format, with snappy compression.
filename: dump file name.
begin: the starting physical address. It's optional, and should be begin: the starting physical address. It's optional, and should be
specified together with length. specified with length together.
length: the memory size, in bytes. It's optional, and should be specified length: the memory size, in bytes. It's optional, and should be specified
together with begin. with begin together.
ETEXI ETEXI
{ {
@@ -1264,7 +1254,6 @@ ETEXI
.params = "[qom-type=]type,id=str[,prop=value][,...]", .params = "[qom-type=]type,id=str[,prop=value][,...]",
.help = "create QOM object", .help = "create QOM object",
.mhandler.cmd = hmp_object_add, .mhandler.cmd = hmp_object_add,
.command_completion = object_add_completion,
}, },
STEXI STEXI
@@ -1279,7 +1268,6 @@ ETEXI
.params = "id", .params = "id",
.help = "destroy QOM object", .help = "destroy QOM object",
.mhandler.cmd = hmp_object_del, .mhandler.cmd = hmp_object_del,
.command_completion = object_del_completion,
}, },
STEXI STEXI

25
hmp.c
View File

@@ -1308,35 +1308,16 @@ void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
{ {
Error *errp = NULL; Error *errp = NULL;
int paging = qdict_get_try_bool(qdict, "paging", 0); int paging = qdict_get_try_bool(qdict, "paging", 0);
int zlib = qdict_get_try_bool(qdict, "zlib", 0);
int lzo = qdict_get_try_bool(qdict, "lzo", 0);
int snappy = qdict_get_try_bool(qdict, "snappy", 0);
const char *file = qdict_get_str(qdict, "filename"); const char *file = qdict_get_str(qdict, "filename");
bool has_begin = qdict_haskey(qdict, "begin"); bool has_begin = qdict_haskey(qdict, "begin");
bool has_length = qdict_haskey(qdict, "length"); bool has_length = qdict_haskey(qdict, "length");
/* kdump-compressed format is not supported for HMP */
bool has_format = false;
int64_t begin = 0; int64_t begin = 0;
int64_t length = 0; int64_t length = 0;
enum DumpGuestMemoryFormat dump_format = DUMP_GUEST_MEMORY_FORMAT_ELF; enum DumpGuestMemoryFormat dump_format = DUMP_GUEST_MEMORY_FORMAT_ELF;
char *prot; char *prot;
if (zlib + lzo + snappy > 1) {
error_setg(&errp, "only one of '-z|-l|-s' can be set");
hmp_handle_error(mon, &errp);
return;
}
if (zlib) {
dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_ZLIB;
}
if (lzo) {
dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_LZO;
}
if (snappy) {
dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY;
}
if (has_begin) { if (has_begin) {
begin = qdict_get_int(qdict, "begin"); begin = qdict_get_int(qdict, "begin");
} }
@@ -1347,7 +1328,7 @@ void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
prot = g_strconcat("file:", file, NULL); prot = g_strconcat("file:", file, NULL);
qmp_dump_guest_memory(paging, prot, has_begin, begin, has_length, length, qmp_dump_guest_memory(paging, prot, has_begin, begin, has_length, length,
true, dump_format, &errp); has_format, dump_format, &errp);
hmp_handle_error(mon, &errp); hmp_handle_error(mon, &errp);
g_free(prot); g_free(prot);
} }

5
hmp.h
View File

@@ -15,7 +15,6 @@
#define HMP_H #define HMP_H
#include "qemu-common.h" #include "qemu-common.h"
#include "qemu/readline.h"
#include "qapi-types.h" #include "qapi-types.h"
#include "qapi/qmp/qdict.h" #include "qapi/qmp/qdict.h"
@@ -93,9 +92,5 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict);
void hmp_cpu_add(Monitor *mon, const QDict *qdict); void hmp_cpu_add(Monitor *mon, const QDict *qdict);
void hmp_object_add(Monitor *mon, const QDict *qdict); void hmp_object_add(Monitor *mon, const QDict *qdict);
void hmp_object_del(Monitor *mon, const QDict *qdict); void hmp_object_del(Monitor *mon, const QDict *qdict);
void object_add_completion(ReadLineState *rs, int nb_args, const char *str);
void object_del_completion(ReadLineState *rs, int nb_args, const char *str);
void device_add_completion(ReadLineState *rs, int nb_args, const char *str);
void device_del_completion(ReadLineState *rs, int nb_args, const char *str);
#endif #endif

View File

@@ -987,9 +987,8 @@ static void v9fs_attach(void *opaque)
*/ */
if (!s->migration_blocker) { if (!s->migration_blocker) {
s->root_fid = fid; s->root_fid = fid;
error_setg(&s->migration_blocker, error_set(&s->migration_blocker, QERR_VIRTFS_FEATURE_BLOCKS_MIGRATION,
"Migration is disabled when VirtFS export path '%s' is mounted in the guest using mount_tag '%s'", s->ctx.fs_root ? s->ctx.fs_root : "NULL", s->tag);
s->ctx.fs_root ? s->ctx.fs_root : "NULL", s->tag);
migrate_add_blocker(s->migration_blocker); migrate_add_blocker(s->migration_blocker);
} }
out: out:

View File

@@ -587,9 +587,8 @@ static void set_blocksize(Object *obj, Visitor *v, void *opaque,
/* We rely on power-of-2 blocksizes for bitmasks */ /* We rely on power-of-2 blocksizes for bitmasks */
if ((value & (value - 1)) != 0) { if ((value & (value - 1)) != 0) {
error_setg(errp, error_set(errp, QERR_PROPERTY_VALUE_NOT_POWER_OF_2,
"Property %s.%s doesn't take value '%" PRId64 "', it's not a power of 2", dev->id?:"", name, (int64_t)value);
dev->id ?: "", name, (int64_t)value);
return; return;
} }
@@ -854,7 +853,7 @@ void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
{ {
switch (ret) { switch (ret) {
case -EEXIST: case -EEXIST:
error_setg(errp, "Property '%s.%s' can't take value '%s', it's in use", error_set(errp, QERR_PROPERTY_VALUE_IN_USE,
object_get_typename(OBJECT(dev)), prop->name, value); object_get_typename(OBJECT(dev)), prop->name, value);
break; break;
default: default:
@@ -863,7 +862,7 @@ void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
object_get_typename(OBJECT(dev)), prop->name, value); object_get_typename(OBJECT(dev)), prop->name, value);
break; break;
case -ENOENT: case -ENOENT:
error_setg(errp, "Property '%s.%s' can't find value '%s'", error_set(errp, QERR_PROPERTY_VALUE_NOT_FOUND,
object_get_typename(OBJECT(dev)), prop->name, value); object_get_typename(OBJECT(dev)), prop->name, value);
break; break;
case 0: case 0:

View File

@@ -2913,7 +2913,7 @@ static void isa_cirrus_vga_realizefn(DeviceState *dev, Error **errp)
ISACirrusVGAState *d = ISA_CIRRUS_VGA(dev); ISACirrusVGAState *d = ISA_CIRRUS_VGA(dev);
VGACommonState *s = &d->cirrus_vga.vga; VGACommonState *s = &d->cirrus_vga.vga;
vga_common_init(s, OBJECT(dev)); vga_common_init(s, OBJECT(dev), true);
cirrus_init_common(&d->cirrus_vga, OBJECT(dev), CIRRUS_ID_CLGD5430, 0, cirrus_init_common(&d->cirrus_vga, OBJECT(dev), CIRRUS_ID_CLGD5430, 0,
isa_address_space(isadev), isa_address_space(isadev),
isa_address_space_io(isadev)); isa_address_space_io(isadev));
@@ -2960,7 +2960,7 @@ static int pci_cirrus_vga_initfn(PCIDevice *dev)
int16_t device_id = pc->device_id; int16_t device_id = pc->device_id;
/* setup VGA */ /* setup VGA */
vga_common_init(&s->vga, OBJECT(dev)); vga_common_init(&s->vga, OBJECT(dev), true);
cirrus_init_common(s, OBJECT(dev), device_id, 1, pci_address_space(dev), cirrus_init_common(s, OBJECT(dev), device_id, 1, pci_address_space(dev),
pci_address_space_io(dev)); pci_address_space_io(dev));
s->vga.con = graphic_console_init(DEVICE(dev), 0, s->vga.hw_ops, &s->vga); s->vga.con = graphic_console_init(DEVICE(dev), 0, s->vga.hw_ops, &s->vga);

View File

@@ -2061,7 +2061,7 @@ static int qxl_init_primary(PCIDevice *dev)
qxl->id = 0; qxl->id = 0;
qxl_init_ramsize(qxl); qxl_init_ramsize(qxl);
vga->vram_size_mb = qxl->vga.vram_size >> 20; vga->vram_size_mb = qxl->vga.vram_size >> 20;
vga_common_init(vga, OBJECT(dev)); vga_common_init(vga, OBJECT(dev), true);
vga_init(vga, OBJECT(dev), vga_init(vga, OBJECT(dev),
pci_address_space(dev), pci_address_space_io(dev), false); pci_address_space(dev), pci_address_space_io(dev), false);
portio_list_init(qxl_vga_port_list, OBJECT(dev), qxl_vga_portio_list, portio_list_init(qxl_vga_port_list, OBJECT(dev), qxl_vga_portio_list,

View File

@@ -132,7 +132,7 @@ int isa_vga_mm_init(hwaddr vram_base,
s = g_malloc0(sizeof(*s)); s = g_malloc0(sizeof(*s));
s->vga.vram_size_mb = VGA_RAM_SIZE >> 20; s->vga.vram_size_mb = VGA_RAM_SIZE >> 20;
vga_common_init(&s->vga, NULL); vga_common_init(&s->vga, NULL, true);
vga_mm_init(s, vram_base, ctrl_base, it_shift, address_space); vga_mm_init(s, vram_base, ctrl_base, it_shift, address_space);
s->vga.con = graphic_console_init(NULL, 0, s->vga.hw_ops, s); s->vga.con = graphic_console_init(NULL, 0, s->vga.hw_ops, s);

View File

@@ -56,7 +56,7 @@ static void vga_isa_realizefn(DeviceState *dev, Error **errp)
MemoryRegion *vga_io_memory; MemoryRegion *vga_io_memory;
const MemoryRegionPortio *vga_ports, *vbe_ports; const MemoryRegionPortio *vga_ports, *vbe_ports;
vga_common_init(s, OBJECT(dev)); vga_common_init(s, OBJECT(dev), true);
s->legacy_address_space = isa_address_space(isadev); s->legacy_address_space = isa_address_space(isadev);
vga_io_memory = vga_init_io(s, OBJECT(dev), &vga_ports, &vbe_ports); vga_io_memory = vga_init_io(s, OBJECT(dev), &vga_ports, &vbe_ports);
isa_register_portio_list(isadev, 0x3b0, vga_ports, s, "vga"); isa_register_portio_list(isadev, 0x3b0, vga_ports, s, "vga");

View File

@@ -147,7 +147,7 @@ static int pci_std_vga_initfn(PCIDevice *dev)
VGACommonState *s = &d->vga; VGACommonState *s = &d->vga;
/* vga + console init */ /* vga + console init */
vga_common_init(s, OBJECT(dev)); vga_common_init(s, OBJECT(dev), true);
vga_init(s, OBJECT(dev), pci_address_space(dev), pci_address_space_io(dev), vga_init(s, OBJECT(dev), pci_address_space(dev), pci_address_space_io(dev),
true); true);
@@ -179,12 +179,51 @@ static int pci_std_vga_initfn(PCIDevice *dev)
return 0; return 0;
} }
static int pci_secondary_vga_initfn(PCIDevice *dev)
{
PCIVGAState *d = DO_UPCAST(PCIVGAState, dev, dev);
VGACommonState *s = &d->vga;
/* vga + console init */
vga_common_init(s, OBJECT(dev), false);
s->con = graphic_console_init(DEVICE(dev), 0, s->hw_ops, s);
/* mmio bar */
memory_region_init(&d->mmio, OBJECT(dev), "vga.mmio", 4096);
memory_region_init_io(&d->ioport, OBJECT(dev), &pci_vga_ioport_ops, d,
"vga ioports remapped", PCI_VGA_IOPORT_SIZE);
memory_region_init_io(&d->bochs, OBJECT(dev), &pci_vga_bochs_ops, d,
"bochs dispi interface", PCI_VGA_BOCHS_SIZE);
memory_region_add_subregion(&d->mmio, PCI_VGA_IOPORT_OFFSET,
&d->ioport);
memory_region_add_subregion(&d->mmio, PCI_VGA_BOCHS_OFFSET,
&d->bochs);
pci_register_bar(&d->dev, 0, PCI_BASE_ADDRESS_MEM_PREFETCH, &s->vram);
pci_register_bar(&d->dev, 2, PCI_BASE_ADDRESS_SPACE_MEMORY, &d->mmio);
return 0;
}
static void pci_secondary_vga_reset(DeviceState *dev)
{
PCIVGAState *d = DO_UPCAST(PCIVGAState, dev.qdev, dev);
vga_common_reset(&d->vga);
}
static Property vga_pci_properties[] = { static Property vga_pci_properties[] = {
DEFINE_PROP_UINT32("vgamem_mb", PCIVGAState, vga.vram_size_mb, 16), DEFINE_PROP_UINT32("vgamem_mb", PCIVGAState, vga.vram_size_mb, 16),
DEFINE_PROP_BIT("mmio", PCIVGAState, flags, PCI_VGA_FLAG_ENABLE_MMIO, true), DEFINE_PROP_BIT("mmio", PCIVGAState, flags, PCI_VGA_FLAG_ENABLE_MMIO, true),
DEFINE_PROP_END_OF_LIST(), DEFINE_PROP_END_OF_LIST(),
}; };
static Property secondary_pci_properties[] = {
DEFINE_PROP_UINT32("vgamem_mb", PCIVGAState, vga.vram_size_mb, 16),
DEFINE_PROP_END_OF_LIST(),
};
static void vga_class_init(ObjectClass *klass, void *data) static void vga_class_init(ObjectClass *klass, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass);
@@ -201,6 +240,20 @@ static void vga_class_init(ObjectClass *klass, void *data)
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
} }
static void secondary_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
k->init = pci_secondary_vga_initfn;
k->vendor_id = PCI_VENDOR_ID_QEMU;
k->device_id = PCI_DEVICE_ID_QEMU_VGA;
k->class_id = PCI_CLASS_DISPLAY_OTHER;
dc->vmsd = &vmstate_vga_pci;
dc->props = secondary_pci_properties;
dc->reset = pci_secondary_vga_reset;
}
static const TypeInfo vga_info = { static const TypeInfo vga_info = {
.name = "VGA", .name = "VGA",
.parent = TYPE_PCI_DEVICE, .parent = TYPE_PCI_DEVICE,
@@ -208,9 +261,17 @@ static const TypeInfo vga_info = {
.class_init = vga_class_init, .class_init = vga_class_init,
}; };
static const TypeInfo secondary_info = {
.name = "secondary-vga",
.parent = TYPE_PCI_DEVICE,
.instance_size = sizeof(PCIVGAState),
.class_init = secondary_class_init,
};
static void vga_register_types(void) static void vga_register_types(void)
{ {
type_register_static(&vga_info); type_register_static(&vga_info);
type_register_static(&secondary_info);
} }
type_init(vga_register_types) type_init(vga_register_types)

View File

@@ -171,6 +171,10 @@ static void vga_update_memory_access(VGACommonState *s)
MemoryRegion *region, *old_region = s->chain4_alias; MemoryRegion *region, *old_region = s->chain4_alias;
hwaddr base, offset, size; hwaddr base, offset, size;
if (s->legacy_address_space == NULL) {
return;
}
s->chain4_alias = NULL; s->chain4_alias = NULL;
if ((s->sr[VGA_SEQ_PLANE_WRITE] & VGA_SR02_ALL_PLANES) == if ((s->sr[VGA_SEQ_PLANE_WRITE] & VGA_SR02_ALL_PLANES) ==
@@ -2252,7 +2256,7 @@ static const GraphicHwOps vga_ops = {
.text_update = vga_update_text, .text_update = vga_update_text,
}; };
void vga_common_init(VGACommonState *s, Object *obj) void vga_common_init(VGACommonState *s, Object *obj, bool global_vmstate)
{ {
int i, j, v, b; int i, j, v, b;
@@ -2289,7 +2293,7 @@ void vga_common_init(VGACommonState *s, Object *obj)
s->is_vbe_vmstate = 1; s->is_vbe_vmstate = 1;
memory_region_init_ram(&s->vram, obj, "vga.vram", s->vram_size); memory_region_init_ram(&s->vram, obj, "vga.vram", s->vram_size);
vmstate_register_ram_global(&s->vram); vmstate_register_ram(&s->vram, global_vmstate ? NULL : DEVICE(obj));
xen_register_framebuffer(&s->vram); xen_register_framebuffer(&s->vram);
s->vram_ptr = memory_region_get_ram_ptr(&s->vram); s->vram_ptr = memory_region_get_ram_ptr(&s->vram);
s->get_bpp = vga_get_bpp; s->get_bpp = vga_get_bpp;

View File

@@ -177,7 +177,7 @@ static inline int c6_to_8(int v)
return (v << 2) | (b << 1) | b; return (v << 2) | (b << 1) | b;
} }
void vga_common_init(VGACommonState *s, Object *obj); void vga_common_init(VGACommonState *s, Object *obj, bool global_vmstate);
void vga_init(VGACommonState *s, Object *obj, MemoryRegion *address_space, void vga_init(VGACommonState *s, Object *obj, MemoryRegion *address_space,
MemoryRegion *address_space_io, bool init_vga_ports); MemoryRegion *address_space_io, bool init_vga_ports);
MemoryRegion *vga_init_io(VGACommonState *s, Object *obj, MemoryRegion *vga_init_io(VGACommonState *s, Object *obj,

View File

@@ -1207,7 +1207,7 @@ static void vmsvga_init(DeviceState *dev, struct vmsvga_state_s *s,
vmstate_register_ram_global(&s->fifo_ram); vmstate_register_ram_global(&s->fifo_ram);
s->fifo_ptr = memory_region_get_ram_ptr(&s->fifo_ram); s->fifo_ptr = memory_region_get_ram_ptr(&s->fifo_ram);
vga_common_init(&s->vga, OBJECT(dev)); vga_common_init(&s->vga, OBJECT(dev), true);
vga_init(&s->vga, OBJECT(dev), address_space, io, true); vga_init(&s->vga, OBJECT(dev), address_space, io, true);
vmstate_register(NULL, 0, &vmstate_vga_common, &s->vga); vmstate_register(NULL, 0, &vmstate_vga_common, &s->vga);
s->new_depth = 32; s->new_depth = 32;

View File

@@ -124,14 +124,14 @@ static const TPRInstruction tpr_instr[] = {
static void read_guest_rom_state(VAPICROMState *s) static void read_guest_rom_state(VAPICROMState *s)
{ {
cpu_physical_memory_read(s->rom_state_paddr, &s->rom_state, cpu_physical_memory_rw(s->rom_state_paddr, (void *)&s->rom_state,
sizeof(GuestROMState)); sizeof(GuestROMState), 0);
} }
static void write_guest_rom_state(VAPICROMState *s) static void write_guest_rom_state(VAPICROMState *s)
{ {
cpu_physical_memory_write(s->rom_state_paddr, &s->rom_state, cpu_physical_memory_rw(s->rom_state_paddr, (void *)&s->rom_state,
sizeof(GuestROMState)); sizeof(GuestROMState), 1);
} }
static void update_guest_rom_state(VAPICROMState *s) static void update_guest_rom_state(VAPICROMState *s)
@@ -311,14 +311,16 @@ static int update_rom_mapping(VAPICROMState *s, CPUX86State *env, target_ulong i
for (pos = le32_to_cpu(s->rom_state.fixup_start); for (pos = le32_to_cpu(s->rom_state.fixup_start);
pos < le32_to_cpu(s->rom_state.fixup_end); pos < le32_to_cpu(s->rom_state.fixup_end);
pos += 4) { pos += 4) {
cpu_physical_memory_read(paddr + pos - s->rom_state.vaddr, cpu_physical_memory_rw(paddr + pos - s->rom_state.vaddr,
&offset, sizeof(offset)); (void *)&offset, sizeof(offset), 0);
offset = le32_to_cpu(offset); offset = le32_to_cpu(offset);
cpu_physical_memory_read(paddr + offset, &patch, sizeof(patch)); cpu_physical_memory_rw(paddr + offset, (void *)&patch,
sizeof(patch), 0);
patch = le32_to_cpu(patch); patch = le32_to_cpu(patch);
patch += rom_state_vaddr - le32_to_cpu(s->rom_state.vaddr); patch += rom_state_vaddr - le32_to_cpu(s->rom_state.vaddr);
patch = cpu_to_le32(patch); patch = cpu_to_le32(patch);
cpu_physical_memory_write(paddr + offset, &patch, sizeof(patch)); cpu_physical_memory_rw(paddr + offset, (void *)&patch,
sizeof(patch), 1);
} }
read_guest_rom_state(s); read_guest_rom_state(s);
s->vapic_paddr = paddr + le32_to_cpu(s->rom_state.vapic_vaddr) - s->vapic_paddr = paddr + le32_to_cpu(s->rom_state.vapic_vaddr) -
@@ -362,8 +364,8 @@ static int vapic_enable(VAPICROMState *s, X86CPU *cpu)
} }
vapic_paddr = s->vapic_paddr + vapic_paddr = s->vapic_paddr +
(((hwaddr)cpu_number) << VAPIC_CPU_SHIFT); (((hwaddr)cpu_number) << VAPIC_CPU_SHIFT);
cpu_physical_memory_write(vapic_paddr + offsetof(VAPICState, enabled), cpu_physical_memory_rw(vapic_paddr + offsetof(VAPICState, enabled),
&enabled, sizeof(enabled)); (void *)&enabled, sizeof(enabled), 1);
apic_enable_vapic(cpu->apic_state, vapic_paddr); apic_enable_vapic(cpu->apic_state, vapic_paddr);
s->state = VAPIC_ACTIVE; s->state = VAPIC_ACTIVE;
@@ -533,7 +535,7 @@ static int patch_hypercalls(VAPICROMState *s)
uint8_t *rom; uint8_t *rom;
rom = g_malloc(s->rom_size); rom = g_malloc(s->rom_size);
cpu_physical_memory_read(rom_paddr, rom, s->rom_size); cpu_physical_memory_rw(rom_paddr, rom, s->rom_size, 0);
for (pos = 0; pos < s->rom_size - sizeof(vmcall_pattern); pos++) { for (pos = 0; pos < s->rom_size - sizeof(vmcall_pattern); pos++) {
if (kvm_irqchip_in_kernel()) { if (kvm_irqchip_in_kernel()) {
@@ -549,7 +551,8 @@ static int patch_hypercalls(VAPICROMState *s)
} }
if (memcmp(rom + pos, pattern, 7) == 0 && if (memcmp(rom + pos, pattern, 7) == 0 &&
(rom[pos + 7] == alternates[0] || rom[pos + 7] == alternates[1])) { (rom[pos + 7] == alternates[0] || rom[pos + 7] == alternates[1])) {
cpu_physical_memory_write(rom_paddr + pos + 5, patch, 3); cpu_physical_memory_rw(rom_paddr + pos + 5, (uint8_t *)patch,
3, 1);
/* /*
* Don't flush the tb here. Under ordinary conditions, the patched * Don't flush the tb here. Under ordinary conditions, the patched
* calls are miles away from the current IP. Under malicious * calls are miles away from the current IP. Under malicious
@@ -757,8 +760,8 @@ static int vapic_post_load(void *opaque, int version_id)
run_on_cpu(first_cpu, do_vapic_enable, s); run_on_cpu(first_cpu, do_vapic_enable, s);
} else { } else {
zero = g_malloc0(s->rom_state.vapic_size); zero = g_malloc0(s->rom_state.vapic_size);
cpu_physical_memory_write(s->vapic_paddr, zero, cpu_physical_memory_rw(s->vapic_paddr, zero,
s->rom_state.vapic_size); s->rom_state.vapic_size, 1);
g_free(zero); g_free(zero);
} }
} }

View File

@@ -98,8 +98,8 @@ static void apic_sync_vapic(APICCommonState *s, int sync_type)
return; return;
} }
if (sync_type & SYNC_FROM_VAPIC) { if (sync_type & SYNC_FROM_VAPIC) {
cpu_physical_memory_read(s->vapic_paddr, &vapic_state, cpu_physical_memory_rw(s->vapic_paddr, (void *)&vapic_state,
sizeof(vapic_state)); sizeof(vapic_state), 0);
s->tpr = vapic_state.tpr; s->tpr = vapic_state.tpr;
} }
if (sync_type & (SYNC_TO_VAPIC | SYNC_ISR_IRR_TO_VAPIC)) { if (sync_type & (SYNC_TO_VAPIC | SYNC_ISR_IRR_TO_VAPIC)) {

View File

@@ -684,8 +684,8 @@ static int pci_ivshmem_init(PCIDevice *dev)
} }
if (s->role_val == IVSHMEM_PEER) { if (s->role_val == IVSHMEM_PEER) {
error_setg(&s->migration_blocker, error_set(&s->migration_blocker, QERR_DEVICE_FEATURE_BLOCKS_MIGRATION,
"Migration is disabled when using feature 'peer mode' in device 'ivshmem'"); "peer mode", "ivshmem");
migrate_add_blocker(s->migration_blocker); migrate_add_blocker(s->migration_blocker);
} }

View File

@@ -718,6 +718,7 @@ static void pcnet_s_reset(PCNetState *s)
s->csr[94] = 0x0000; s->csr[94] = 0x0000;
s->csr[100] = 0x0200; s->csr[100] = 0x0200;
s->csr[103] = 0x0105; s->csr[103] = 0x0105;
s->csr[103] = 0x0105;
s->csr[112] = 0x0000; s->csr[112] = 0x0000;
s->csr[114] = 0x0000; s->csr[114] = 0x0000;
s->csr[122] = 0x0000; s->csr[122] = 0x0000;

View File

@@ -98,7 +98,7 @@ static unsigned int tdk_read(struct PHY *phy, unsigned int req)
r |= 1; r |= 1;
break; break;
case 17: case 17:
/* Marvell PHY on many xilinx boards. */ /* Marvel PHY on many xilinx boards. */
r = 0x8000; /* 1000Mb */ r = 0x8000; /* 1000Mb */
break; break;
case 18: case 18:
@@ -142,9 +142,6 @@ tdk_write(struct PHY *phy, unsigned int req, unsigned int data)
phy->regs[regnum] = data; phy->regs[regnum] = data;
break; break;
} }
/* Unconditionally clear regs[BMCR][BMCR_RESET] */
phy->regs[0] &= ~0x8000;
} }
static void static void

View File

@@ -79,6 +79,7 @@ int monitor_handle_fd_param(Monitor *mon, const char *fdname);
void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap) void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
GCC_FMT_ATTR(2, 0); GCC_FMT_ATTR(2, 0);
void monitor_printf(Monitor *mon, const char *fmt, ...) GCC_FMT_ATTR(2, 3); void monitor_printf(Monitor *mon, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
void monitor_print_filename(Monitor *mon, const char *filename);
void monitor_flush(Monitor *mon); void monitor_flush(Monitor *mon);
int monitor_set_cpu(int cpu_index); int monitor_set_cpu(int cpu_index);
int monitor_get_cpu_index(void); int monitor_get_cpu_index(void);

View File

@@ -12,6 +12,7 @@
#ifndef QERROR_H #ifndef QERROR_H
#define QERROR_H #define QERROR_H
#include "qapi/qmp/qdict.h"
#include "qapi/qmp/qstring.h" #include "qapi/qmp/qstring.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "qapi/error.h" #include "qapi/error.h"
@@ -34,30 +35,51 @@ void qerror_report_err(Error *err);
* Please keep the definitions in alphabetical order. * Please keep the definitions in alphabetical order.
* Use scripts/check-qerror.sh to check. * Use scripts/check-qerror.sh to check.
*/ */
#define QERR_ADD_CLIENT_FAILED \
ERROR_CLASS_GENERIC_ERROR, "Could not add client"
#define QERR_AMBIGUOUS_PATH \
ERROR_CLASS_GENERIC_ERROR, "Path '%s' does not uniquely identify an object"
#define QERR_BAD_BUS_FOR_DEVICE \
ERROR_CLASS_GENERIC_ERROR, "Device '%s' can't go on a %s bus"
#define QERR_BASE_NOT_FOUND \ #define QERR_BASE_NOT_FOUND \
ERROR_CLASS_GENERIC_ERROR, "Base '%s' not found" ERROR_CLASS_GENERIC_ERROR, "Base '%s' not found"
#define QERR_BLOCK_JOB_NOT_ACTIVE \ #define QERR_BLOCK_JOB_NOT_ACTIVE \
ERROR_CLASS_DEVICE_NOT_ACTIVE, "No active block job on device '%s'" ERROR_CLASS_DEVICE_NOT_ACTIVE, "No active block job on device '%s'"
#define QERR_BLOCK_JOB_PAUSED \
ERROR_CLASS_GENERIC_ERROR, "The block job for device '%s' is currently paused"
#define QERR_BLOCK_JOB_NOT_READY \ #define QERR_BLOCK_JOB_NOT_READY \
ERROR_CLASS_GENERIC_ERROR, "The active block job for device '%s' cannot be completed" ERROR_CLASS_GENERIC_ERROR, "The active block job for device '%s' cannot be completed"
#define QERR_BLOCK_FORMAT_FEATURE_NOT_SUPPORTED \ #define QERR_BLOCK_FORMAT_FEATURE_NOT_SUPPORTED \
ERROR_CLASS_GENERIC_ERROR, "Block format '%s' used by device '%s' does not support feature '%s'" ERROR_CLASS_GENERIC_ERROR, "Block format '%s' used by device '%s' does not support feature '%s'"
#define QERR_BUFFER_OVERRUN \
ERROR_CLASS_GENERIC_ERROR, "An internal buffer overran"
#define QERR_BUS_NO_HOTPLUG \ #define QERR_BUS_NO_HOTPLUG \
ERROR_CLASS_GENERIC_ERROR, "Bus '%s' does not support hotplugging" ERROR_CLASS_GENERIC_ERROR, "Bus '%s' does not support hotplugging"
#define QERR_BUS_NOT_FOUND \ #define QERR_BUS_NOT_FOUND \
ERROR_CLASS_GENERIC_ERROR, "Bus '%s' not found" ERROR_CLASS_GENERIC_ERROR, "Bus '%s' not found"
#define QERR_COMMAND_DISABLED \
ERROR_CLASS_GENERIC_ERROR, "The command %s has been disabled for this instance"
#define QERR_COMMAND_NOT_FOUND \ #define QERR_COMMAND_NOT_FOUND \
ERROR_CLASS_COMMAND_NOT_FOUND, "The command %s has not been found" ERROR_CLASS_COMMAND_NOT_FOUND, "The command %s has not been found"
#define QERR_DEVICE_ENCRYPTED \ #define QERR_DEVICE_ENCRYPTED \
ERROR_CLASS_DEVICE_ENCRYPTED, "'%s' (%s) is encrypted" ERROR_CLASS_DEVICE_ENCRYPTED, "'%s' (%s) is encrypted"
#define QERR_DEVICE_FEATURE_BLOCKS_MIGRATION \
ERROR_CLASS_GENERIC_ERROR, "Migration is disabled when using feature '%s' in device '%s'"
#define QERR_DEVICE_HAS_NO_MEDIUM \ #define QERR_DEVICE_HAS_NO_MEDIUM \
ERROR_CLASS_GENERIC_ERROR, "Device '%s' has no medium" ERROR_CLASS_GENERIC_ERROR, "Device '%s' has no medium"
@@ -70,6 +92,15 @@ void qerror_report_err(Error *err);
#define QERR_DEVICE_IS_READ_ONLY \ #define QERR_DEVICE_IS_READ_ONLY \
ERROR_CLASS_GENERIC_ERROR, "Device '%s' is read only" ERROR_CLASS_GENERIC_ERROR, "Device '%s' is read only"
#define QERR_DEVICE_LOCKED \
ERROR_CLASS_GENERIC_ERROR, "Device '%s' is locked"
#define QERR_DEVICE_MULTIPLE_BUSSES \
ERROR_CLASS_GENERIC_ERROR, "Device '%s' has multiple child busses"
#define QERR_DEVICE_NO_BUS \
ERROR_CLASS_GENERIC_ERROR, "Device '%s' has no child bus"
#define QERR_DEVICE_NO_HOTPLUG \ #define QERR_DEVICE_NO_HOTPLUG \
ERROR_CLASS_GENERIC_ERROR, "Device '%s' does not support hotplugging" ERROR_CLASS_GENERIC_ERROR, "Device '%s' does not support hotplugging"
@@ -82,6 +113,12 @@ void qerror_report_err(Error *err);
#define QERR_DEVICE_NOT_FOUND \ #define QERR_DEVICE_NOT_FOUND \
ERROR_CLASS_DEVICE_NOT_FOUND, "Device '%s' not found" ERROR_CLASS_DEVICE_NOT_FOUND, "Device '%s' not found"
#define QERR_DEVICE_NOT_REMOVABLE \
ERROR_CLASS_GENERIC_ERROR, "Device '%s' is not removable"
#define QERR_DUPLICATE_ID \
ERROR_CLASS_GENERIC_ERROR, "Duplicate ID '%s' for %s"
#define QERR_FD_NOT_FOUND \ #define QERR_FD_NOT_FOUND \
ERROR_CLASS_GENERIC_ERROR, "File descriptor named '%s' not found" ERROR_CLASS_GENERIC_ERROR, "File descriptor named '%s' not found"
@@ -94,9 +131,15 @@ void qerror_report_err(Error *err);
#define QERR_INVALID_BLOCK_FORMAT \ #define QERR_INVALID_BLOCK_FORMAT \
ERROR_CLASS_GENERIC_ERROR, "Invalid block format '%s'" ERROR_CLASS_GENERIC_ERROR, "Invalid block format '%s'"
#define QERR_INVALID_OPTION_GROUP \
ERROR_CLASS_GENERIC_ERROR, "There is no option group '%s'"
#define QERR_INVALID_PARAMETER \ #define QERR_INVALID_PARAMETER \
ERROR_CLASS_GENERIC_ERROR, "Invalid parameter '%s'" ERROR_CLASS_GENERIC_ERROR, "Invalid parameter '%s'"
#define QERR_INVALID_PARAMETER_COMBINATION \
ERROR_CLASS_GENERIC_ERROR, "Invalid parameter combination"
#define QERR_INVALID_PARAMETER_TYPE \ #define QERR_INVALID_PARAMETER_TYPE \
ERROR_CLASS_GENERIC_ERROR, "Invalid parameter type for '%s', expected: %s" ERROR_CLASS_GENERIC_ERROR, "Invalid parameter type for '%s', expected: %s"
@@ -109,6 +152,9 @@ void qerror_report_err(Error *err);
#define QERR_IO_ERROR \ #define QERR_IO_ERROR \
ERROR_CLASS_GENERIC_ERROR, "An IO error has occurred" ERROR_CLASS_GENERIC_ERROR, "An IO error has occurred"
#define QERR_JSON_PARSE_ERROR \
ERROR_CLASS_GENERIC_ERROR, "JSON parse error, %s"
#define QERR_JSON_PARSING \ #define QERR_JSON_PARSING \
ERROR_CLASS_GENERIC_ERROR, "Invalid JSON syntax" ERROR_CLASS_GENERIC_ERROR, "Invalid JSON syntax"
@@ -118,21 +164,45 @@ void qerror_report_err(Error *err);
#define QERR_MIGRATION_ACTIVE \ #define QERR_MIGRATION_ACTIVE \
ERROR_CLASS_GENERIC_ERROR, "There's a migration process in progress" ERROR_CLASS_GENERIC_ERROR, "There's a migration process in progress"
#define QERR_MIGRATION_NOT_SUPPORTED \
ERROR_CLASS_GENERIC_ERROR, "State blocked by non-migratable device '%s'"
#define QERR_MISSING_PARAMETER \ #define QERR_MISSING_PARAMETER \
ERROR_CLASS_GENERIC_ERROR, "Parameter '%s' is missing" ERROR_CLASS_GENERIC_ERROR, "Parameter '%s' is missing"
#define QERR_NO_BUS_FOR_DEVICE \
ERROR_CLASS_GENERIC_ERROR, "No '%s' bus found for device '%s'"
#define QERR_NOT_SUPPORTED \
ERROR_CLASS_GENERIC_ERROR, "Not supported"
#define QERR_PERMISSION_DENIED \ #define QERR_PERMISSION_DENIED \
ERROR_CLASS_GENERIC_ERROR, "Insufficient permission to perform this operation" ERROR_CLASS_GENERIC_ERROR, "Insufficient permission to perform this operation"
#define QERR_PROPERTY_NOT_FOUND \
ERROR_CLASS_GENERIC_ERROR, "Property '%s.%s' not found"
#define QERR_PROPERTY_VALUE_BAD \ #define QERR_PROPERTY_VALUE_BAD \
ERROR_CLASS_GENERIC_ERROR, "Property '%s.%s' doesn't take value '%s'" ERROR_CLASS_GENERIC_ERROR, "Property '%s.%s' doesn't take value '%s'"
#define QERR_PROPERTY_VALUE_IN_USE \
ERROR_CLASS_GENERIC_ERROR, "Property '%s.%s' can't take value '%s', it's in use"
#define QERR_PROPERTY_VALUE_NOT_FOUND \
ERROR_CLASS_GENERIC_ERROR, "Property '%s.%s' can't find value '%s'"
#define QERR_PROPERTY_VALUE_NOT_POWER_OF_2 \
ERROR_CLASS_GENERIC_ERROR, "Property %s.%s doesn't take value '%" PRId64 "', it's not a power of 2"
#define QERR_PROPERTY_VALUE_OUT_OF_RANGE \ #define QERR_PROPERTY_VALUE_OUT_OF_RANGE \
ERROR_CLASS_GENERIC_ERROR, "Property %s.%s doesn't take value %" PRId64 " (minimum: %" PRId64 ", maximum: %" PRId64 ")" ERROR_CLASS_GENERIC_ERROR, "Property %s.%s doesn't take value %" PRId64 " (minimum: %" PRId64 ", maximum: %" PRId64 ")"
#define QERR_QGA_COMMAND_FAILED \ #define QERR_QGA_COMMAND_FAILED \
ERROR_CLASS_GENERIC_ERROR, "Guest agent command failed, error was '%s'" ERROR_CLASS_GENERIC_ERROR, "Guest agent command failed, error was '%s'"
#define QERR_QGA_LOGGING_FAILED \
ERROR_CLASS_GENERIC_ERROR, "Guest agent failed to log non-optional log statement"
#define QERR_QMP_BAD_INPUT_OBJECT \ #define QERR_QMP_BAD_INPUT_OBJECT \
ERROR_CLASS_GENERIC_ERROR, "Expected '%s' in QMP input" ERROR_CLASS_GENERIC_ERROR, "Expected '%s' in QMP input"
@@ -142,9 +212,15 @@ void qerror_report_err(Error *err);
#define QERR_QMP_EXTRA_MEMBER \ #define QERR_QMP_EXTRA_MEMBER \
ERROR_CLASS_GENERIC_ERROR, "QMP input object member '%s' is unexpected" ERROR_CLASS_GENERIC_ERROR, "QMP input object member '%s' is unexpected"
#define QERR_RESET_REQUIRED \
ERROR_CLASS_GENERIC_ERROR, "Resetting the Virtual Machine is required"
#define QERR_SET_PASSWD_FAILED \ #define QERR_SET_PASSWD_FAILED \
ERROR_CLASS_GENERIC_ERROR, "Could not set password" ERROR_CLASS_GENERIC_ERROR, "Could not set password"
#define QERR_TOO_MANY_FILES \
ERROR_CLASS_GENERIC_ERROR, "Too many open files"
#define QERR_UNDEFINED_ERROR \ #define QERR_UNDEFINED_ERROR \
ERROR_CLASS_GENERIC_ERROR, "An undefined error has occurred" ERROR_CLASS_GENERIC_ERROR, "An undefined error has occurred"
@@ -154,6 +230,9 @@ void qerror_report_err(Error *err);
#define QERR_UNSUPPORTED \ #define QERR_UNSUPPORTED \
ERROR_CLASS_GENERIC_ERROR, "this feature or command is not currently supported" ERROR_CLASS_GENERIC_ERROR, "this feature or command is not currently supported"
#define QERR_VIRTFS_FEATURE_BLOCKS_MIGRATION \
ERROR_CLASS_GENERIC_ERROR, "Migration is disabled when VirtFS export path '%s' is mounted in the guest using mount_tag '%s'"
#define QERR_SOCKET_CONNECT_FAILED \ #define QERR_SOCKET_CONNECT_FAILED \
ERROR_CLASS_GENERIC_ERROR, "Failed to connect to socket" ERROR_CLASS_GENERIC_ERROR, "Failed to connect to socket"

View File

@@ -8,8 +8,6 @@
QemuOptsList *qemu_find_opts(const char *group); QemuOptsList *qemu_find_opts(const char *group);
QemuOptsList *qemu_find_opts_err(const char *group, Error **errp); QemuOptsList *qemu_find_opts_err(const char *group, Error **errp);
QemuOpts *qemu_find_opts_singleton(const char *group);
void qemu_add_opts(QemuOptsList *list); void qemu_add_opts(QemuOptsList *list);
void qemu_add_drive_opts(QemuOptsList *list); void qemu_add_drive_opts(QemuOptsList *list);
int qemu_set_option(const char *str); int qemu_set_option(const char *str);

View File

@@ -37,6 +37,7 @@ void loc_set_file(const char *fname, int lno);
void error_vprintf(const char *fmt, va_list ap) GCC_FMT_ATTR(1, 0); void error_vprintf(const char *fmt, va_list ap) GCC_FMT_ATTR(1, 0);
void error_printf(const char *fmt, ...) GCC_FMT_ATTR(1, 2); void error_printf(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
void error_printf_unless_qmp(const char *fmt, ...) GCC_FMT_ATTR(1, 2); void error_printf_unless_qmp(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
void error_print_loc(void);
void error_set_progname(const char *argv0); void error_set_progname(const char *argv0);
void error_report(const char *fmt, ...) GCC_FMT_ATTR(1, 2); void error_report(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
const char *error_get_progname(void); const char *error_get_progname(void);

View File

@@ -22,8 +22,6 @@
#define KVM_DEV_FLIC_CLEAR_IRQS 3 #define KVM_DEV_FLIC_CLEAR_IRQS 3
#define KVM_DEV_FLIC_APF_ENABLE 4 #define KVM_DEV_FLIC_APF_ENABLE 4
#define KVM_DEV_FLIC_APF_DISABLE_WAIT 5 #define KVM_DEV_FLIC_APF_DISABLE_WAIT 5
#define KVM_DEV_FLIC_ADAPTER_REGISTER 6
#define KVM_DEV_FLIC_ADAPTER_MODIFY 7
/* /*
* We can have up to 4*64k pending subchannels + 8 adapter interrupts, * We can have up to 4*64k pending subchannels + 8 adapter interrupts,
* as well as up to ASYNC_PF_PER_VCPU*KVM_MAX_VCPUS pfault done interrupts. * as well as up to ASYNC_PF_PER_VCPU*KVM_MAX_VCPUS pfault done interrupts.
@@ -34,26 +32,6 @@
#define KVM_S390_MAX_FLOAT_IRQS 266250 #define KVM_S390_MAX_FLOAT_IRQS 266250
#define KVM_S390_FLIC_MAX_BUFFER 0x2000000 #define KVM_S390_FLIC_MAX_BUFFER 0x2000000
struct kvm_s390_io_adapter {
__u32 id;
__u8 isc;
__u8 maskable;
__u8 swap;
__u8 pad;
};
#define KVM_S390_IO_ADAPTER_MASK 1
#define KVM_S390_IO_ADAPTER_MAP 2
#define KVM_S390_IO_ADAPTER_UNMAP 3
struct kvm_s390_io_adapter_req {
__u32 id;
__u8 type;
__u8 mask;
__u16 pad0;
__u64 addr;
};
/* for KVM_GET_REGS and KVM_SET_REGS */ /* for KVM_GET_REGS and KVM_SET_REGS */
struct kvm_regs { struct kvm_regs {
/* general purpose regs for s390 */ /* general purpose regs for s390 */
@@ -98,6 +76,4 @@ struct kvm_sync_regs {
#define KVM_REG_S390_PFTOKEN (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x5) #define KVM_REG_S390_PFTOKEN (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x5)
#define KVM_REG_S390_PFCOMPARE (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x6) #define KVM_REG_S390_PFCOMPARE (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x6)
#define KVM_REG_S390_PFSELECT (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x7) #define KVM_REG_S390_PFSELECT (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x7)
#define KVM_REG_S390_PP (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x8)
#define KVM_REG_S390_GBEA (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x9)
#endif #endif

View File

@@ -740,9 +740,6 @@ struct kvm_ppc_smmu_info {
#define KVM_CAP_SPAPR_MULTITCE 94 #define KVM_CAP_SPAPR_MULTITCE 94
#define KVM_CAP_EXT_EMUL_CPUID 95 #define KVM_CAP_EXT_EMUL_CPUID 95
#define KVM_CAP_HYPERV_TIME 96 #define KVM_CAP_HYPERV_TIME 96
#define KVM_CAP_IOAPIC_POLARITY_IGNORED 97
#define KVM_CAP_ENABLE_CAP_VM 98
#define KVM_CAP_S390_IRQCHIP 99
#ifdef KVM_CAP_IRQ_ROUTING #ifdef KVM_CAP_IRQ_ROUTING
@@ -758,18 +755,9 @@ struct kvm_irq_routing_msi {
__u32 pad; __u32 pad;
}; };
struct kvm_irq_routing_s390_adapter {
__u64 ind_addr;
__u64 summary_addr;
__u64 ind_offset;
__u32 summary_offset;
__u32 adapter_id;
};
/* gsi routing entry types */ /* gsi routing entry types */
#define KVM_IRQ_ROUTING_IRQCHIP 1 #define KVM_IRQ_ROUTING_IRQCHIP 1
#define KVM_IRQ_ROUTING_MSI 2 #define KVM_IRQ_ROUTING_MSI 2
#define KVM_IRQ_ROUTING_S390_ADAPTER 3
struct kvm_irq_routing_entry { struct kvm_irq_routing_entry {
__u32 gsi; __u32 gsi;
@@ -779,7 +767,6 @@ struct kvm_irq_routing_entry {
union { union {
struct kvm_irq_routing_irqchip irqchip; struct kvm_irq_routing_irqchip irqchip;
struct kvm_irq_routing_msi msi; struct kvm_irq_routing_msi msi;
struct kvm_irq_routing_s390_adapter adapter;
__u32 pad[8]; __u32 pad[8];
} u; } u;
}; };
@@ -1088,10 +1075,6 @@ struct kvm_s390_ucas_mapping {
/* Available with KVM_CAP_DEBUGREGS */ /* Available with KVM_CAP_DEBUGREGS */
#define KVM_GET_DEBUGREGS _IOR(KVMIO, 0xa1, struct kvm_debugregs) #define KVM_GET_DEBUGREGS _IOR(KVMIO, 0xa1, struct kvm_debugregs)
#define KVM_SET_DEBUGREGS _IOW(KVMIO, 0xa2, struct kvm_debugregs) #define KVM_SET_DEBUGREGS _IOW(KVMIO, 0xa2, struct kvm_debugregs)
/*
* vcpu version available with KVM_ENABLE_CAP
* vm version available with KVM_CAP_ENABLE_CAP_VM
*/
#define KVM_ENABLE_CAP _IOW(KVMIO, 0xa3, struct kvm_enable_cap) #define KVM_ENABLE_CAP _IOW(KVMIO, 0xa3, struct kvm_enable_cap)
/* Available with KVM_CAP_XSAVE */ /* Available with KVM_CAP_XSAVE */
#define KVM_GET_XSAVE _IOR(KVMIO, 0xa4, struct kvm_xsave) #define KVM_GET_XSAVE _IOR(KVMIO, 0xa4, struct kvm_xsave)

View File

@@ -23,12 +23,6 @@
#define VFIO_TYPE1_IOMMU 1 #define VFIO_TYPE1_IOMMU 1
#define VFIO_SPAPR_TCE_IOMMU 2 #define VFIO_SPAPR_TCE_IOMMU 2
#define VFIO_TYPE1v2_IOMMU 3
/*
* IOMMU enforces DMA cache coherence (ex. PCIe NoSnoop stripping). This
* capability is subject to change as groups are added or removed.
*/
#define VFIO_DMA_CC_IOMMU 4
/* /*
* The IOCTL interface is designed for extensibility by embedding the * The IOCTL interface is designed for extensibility by embedding the

View File

@@ -137,7 +137,6 @@ typedef struct mon_cmd_t {
* used, and mhandler of 1st level plays the role of help function. * used, and mhandler of 1st level plays the role of help function.
*/ */
struct mon_cmd_t *sub_table; struct mon_cmd_t *sub_table;
void (*command_completion)(ReadLineState *rs, int nb_args, const char *str);
} mon_cmd_t; } mon_cmd_t;
/* file descriptors passed via SCM_RIGHTS */ /* file descriptors passed via SCM_RIGHTS */
@@ -353,6 +352,33 @@ void monitor_printf(Monitor *mon, const char *fmt, ...)
va_end(ap); va_end(ap);
} }
void monitor_print_filename(Monitor *mon, const char *filename)
{
int i;
for (i = 0; filename[i]; i++) {
switch (filename[i]) {
case ' ':
case '"':
case '\\':
monitor_printf(mon, "\\%c", filename[i]);
break;
case '\t':
monitor_printf(mon, "\\t");
break;
case '\r':
monitor_printf(mon, "\\r");
break;
case '\n':
monitor_printf(mon, "\\n");
break;
default:
monitor_printf(mon, "%c", filename[i]);
break;
}
}
}
static int GCC_FMT_ATTR(2, 3) monitor_fprintf(FILE *stream, static int GCC_FMT_ATTR(2, 3) monitor_fprintf(FILE *stream,
const char *fmt, ...) const char *fmt, ...)
{ {
@@ -2228,7 +2254,6 @@ void qmp_getfd(const char *fdname, Error **errp)
} }
if (qemu_isdigit(fdname[0])) { if (qemu_isdigit(fdname[0])) {
close(fd);
error_set(errp, QERR_INVALID_PARAMETER_VALUE, "fdname", error_set(errp, QERR_INVALID_PARAMETER_VALUE, "fdname",
"a name not starting with a digit"); "a name not starting with a digit");
return; return;
@@ -4252,15 +4277,11 @@ static const char *next_arg_type(const char *typestr)
return (p != NULL ? ++p : typestr); return (p != NULL ? ++p : typestr);
} }
void device_add_completion(ReadLineState *rs, int nb_args, const char *str) static void device_add_completion(ReadLineState *rs, const char *str)
{ {
GSList *list, *elt; GSList *list, *elt;
size_t len; size_t len;
if (nb_args != 2) {
return;
}
len = strlen(str); len = strlen(str);
readline_set_completion_index(rs, len); readline_set_completion_index(rs, len);
list = elt = object_class_get_list(TYPE_DEVICE, false); list = elt = object_class_get_list(TYPE_DEVICE, false);
@@ -4269,9 +4290,7 @@ void device_add_completion(ReadLineState *rs, int nb_args, const char *str)
DeviceClass *dc = OBJECT_CLASS_CHECK(DeviceClass, elt->data, DeviceClass *dc = OBJECT_CLASS_CHECK(DeviceClass, elt->data,
TYPE_DEVICE); TYPE_DEVICE);
name = object_class_get_name(OBJECT_CLASS(dc)); name = object_class_get_name(OBJECT_CLASS(dc));
if (!strncmp(name, str, len)) {
if (!dc->cannot_instantiate_with_device_add_yet
&& !strncmp(name, str, len)) {
readline_add_completion(rs, name); readline_add_completion(rs, name);
} }
elt = elt->next; elt = elt->next;
@@ -4279,15 +4298,11 @@ void device_add_completion(ReadLineState *rs, int nb_args, const char *str)
g_slist_free(list); g_slist_free(list);
} }
void object_add_completion(ReadLineState *rs, int nb_args, const char *str) static void object_add_completion(ReadLineState *rs, const char *str)
{ {
GSList *list, *elt; GSList *list, *elt;
size_t len; size_t len;
if (nb_args != 2) {
return;
}
len = strlen(str); len = strlen(str);
readline_set_completion_index(rs, len); readline_set_completion_index(rs, len);
list = elt = object_class_get_list(TYPE_USER_CREATABLE, false); list = elt = object_class_get_list(TYPE_USER_CREATABLE, false);
@@ -4303,8 +4318,8 @@ void object_add_completion(ReadLineState *rs, int nb_args, const char *str)
g_slist_free(list); g_slist_free(list);
} }
static void device_del_bus_completion(ReadLineState *rs, BusState *bus, static void device_del_completion(ReadLineState *rs, BusState *bus,
const char *str, size_t len) const char *str, size_t len)
{ {
BusChild *kid; BusChild *kid;
@@ -4317,32 +4332,16 @@ static void device_del_bus_completion(ReadLineState *rs, BusState *bus,
} }
QLIST_FOREACH(dev_child, &dev->child_bus, sibling) { QLIST_FOREACH(dev_child, &dev->child_bus, sibling) {
device_del_bus_completion(rs, dev_child, str, len); device_del_completion(rs, dev_child, str, len);
} }
} }
} }
void device_del_completion(ReadLineState *rs, int nb_args, const char *str) static void object_del_completion(ReadLineState *rs, const char *str)
{
size_t len;
if (nb_args != 2) {
return;
}
len = strlen(str);
readline_set_completion_index(rs, len);
device_del_bus_completion(rs, sysbus_get_default(), str, len);
}
void object_del_completion(ReadLineState *rs, int nb_args, const char *str)
{ {
ObjectPropertyInfoList *list, *start; ObjectPropertyInfoList *list, *start;
size_t len; size_t len;
if (nb_args != 2) {
return;
}
len = strlen(str); len = strlen(str);
readline_set_completion_index(rs, len); readline_set_completion_index(rs, len);
@@ -4396,9 +4395,6 @@ static void monitor_find_completion_by_table(Monitor *mon,
return monitor_find_completion_by_table(mon, cmd->sub_table, return monitor_find_completion_by_table(mon, cmd->sub_table,
&args[1], nb_args - 1); &args[1], nb_args - 1);
} }
if (cmd->command_completion) {
return cmd->command_completion(mon->rs, nb_args, args[nb_args - 1]);
}
ptype = next_arg_type(cmd->args_type); ptype = next_arg_type(cmd->args_type);
for(i = 0; i < nb_args - 2; i++) { for(i = 0; i < nb_args - 2; i++) {
@@ -4425,6 +4421,13 @@ static void monitor_find_completion_by_table(Monitor *mon,
readline_set_completion_index(mon->rs, strlen(str)); readline_set_completion_index(mon->rs, strlen(str));
bdrv_iterate(block_completion_it, &mbs); bdrv_iterate(block_completion_it, &mbs);
break; break;
case 'O':
if (!strcmp(cmd->name, "device_add") && nb_args == 2) {
device_add_completion(mon->rs, str);
} else if (!strcmp(cmd->name, "object_add") && nb_args == 2) {
object_add_completion(mon->rs, str);
}
break;
case 's': case 's':
case 'S': case 'S':
if (!strcmp(cmd->name, "sendkey")) { if (!strcmp(cmd->name, "sendkey")) {
@@ -4438,6 +4441,12 @@ static void monitor_find_completion_by_table(Monitor *mon,
} else if (!strcmp(cmd->name, "help|?")) { } else if (!strcmp(cmd->name, "help|?")) {
monitor_find_completion_by_table(mon, cmd_table, monitor_find_completion_by_table(mon, cmd_table,
&args[1], nb_args - 1); &args[1], nb_args - 1);
} else if (!strcmp(cmd->name, "device_del") && nb_args == 2) {
size_t len = strlen(str);
readline_set_completion_index(mon->rs, len);
device_del_completion(mon->rs, sysbus_get_default(), str, len);
} else if (!strcmp(cmd->name, "object_del") && nb_args == 2) {
object_del_completion(mon->rs, str);
} }
break; break;
default: default:

View File

@@ -473,7 +473,7 @@ ssize_t qemu_deliver_packet(NetClientState *sender,
if (ret == 0) { if (ret == 0) {
nc->receive_disabled = 1; nc->receive_disabled = 1;
} };
return ret; return ret;
} }
@@ -1045,7 +1045,7 @@ RxFilterInfoList *qmp_query_rx_filter(bool has_name, const char *name,
if (nc->info->type != NET_CLIENT_OPTIONS_KIND_NIC) { if (nc->info->type != NET_CLIENT_OPTIONS_KIND_NIC) {
if (has_name) { if (has_name) {
error_setg(errp, "net client(%s) isn't a NIC", name); error_setg(errp, "net client(%s) isn't a NIC", name);
return NULL; break;
} }
continue; continue;
} }
@@ -1064,15 +1064,11 @@ RxFilterInfoList *qmp_query_rx_filter(bool has_name, const char *name,
} else if (has_name) { } else if (has_name) {
error_setg(errp, "net client(%s) doesn't support" error_setg(errp, "net client(%s) doesn't support"
" rx-filter querying", name); " rx-filter querying", name);
return NULL;
}
if (has_name) {
break; break;
} }
} }
if (filter_list == NULL && has_name) { if (filter_list == NULL && !error_is_set(errp) && has_name) {
error_setg(errp, "invalid net client name: %s", name); error_setg(errp, "invalid net client name: %s", name);
} }

View File

@@ -527,7 +527,6 @@ static int slirp_smb(SlirpState* s, const char *exported_dir,
"pid directory=%s\n" "pid directory=%s\n"
"lock directory=%s\n" "lock directory=%s\n"
"state directory=%s\n" "state directory=%s\n"
"ncalrpc dir=%s/ncalrpc\n"
"log file=%s/log.smbd\n" "log file=%s/log.smbd\n"
"smb passwd file=%s/smbpasswd\n" "smb passwd file=%s/smbpasswd\n"
"security = user\n" "security = user\n"
@@ -543,7 +542,6 @@ static int slirp_smb(SlirpState* s, const char *exported_dir,
s->smb_dir, s->smb_dir,
s->smb_dir, s->smb_dir,
s->smb_dir, s->smb_dir,
s->smb_dir,
exported_dir, exported_dir,
passwd->pw_name passwd->pw_name
); );

View File

@@ -367,8 +367,11 @@ static int launch_script(const char *setup_script, const char *ifname, int fd)
if (pid == 0) { if (pid == 0) {
int open_max = sysconf(_SC_OPEN_MAX), i; int open_max = sysconf(_SC_OPEN_MAX), i;
for (i = 3; i < open_max; i++) { for (i = 0; i < open_max; i++) {
if (i != fd) { if (i != STDIN_FILENO &&
i != STDOUT_FILENO &&
i != STDERR_FILENO &&
i != fd) {
close(i); close(i);
} }
} }
@@ -449,8 +452,11 @@ static int net_bridge_run_helper(const char *helper, const char *bridge)
char br_buf[6+IFNAMSIZ] = {0}; char br_buf[6+IFNAMSIZ] = {0};
char helper_cmd[PATH_MAX + sizeof(fd_buf) + sizeof(br_buf) + 15]; char helper_cmd[PATH_MAX + sizeof(fd_buf) + sizeof(br_buf) + 15];
for (i = 3; i < open_max; i++) { for (i = 0; i < open_max; i++) {
if (i != sv[1]) { if (i != STDIN_FILENO &&
i != STDOUT_FILENO &&
i != STDERR_FILENO &&
i != sv[1]) {
close(i); close(i);
} }
} }

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -37,8 +37,8 @@ install: $(OBJS)
$(call quiet-command, msgfmt -o $@ $<, " GEN $@") $(call quiet-command, msgfmt -o $@ $<, " GEN $@")
$(PO_PATH)/messages.po: $(SRC_PATH)/ui/gtk.c $(PO_PATH)/messages.po: $(SRC_PATH)/ui/gtk.c
$(call quiet-command, ( cd $(SRC_PATH) && \ $(call quiet-command, cd $(SRC_PATH) && \
xgettext -o - --from-code=UTF-8 --foreign-user \ (xgettext -o - --from-code=UTF-8 --foreign-user \
--package-name=QEMU --package-version=$(VERSION) \ --package-name=QEMU --package-version=$(VERSION) \
--msgid-bugs-address=qemu-devel@nongnu.org -k_ -C ui/gtk.c | \ --msgid-bugs-address=qemu-devel@nongnu.org -k_ -C ui/gtk.c | \
sed -e s/CHARSET/UTF-8/) >$@, " GEN $@") sed -e s/CHARSET/UTF-8/) >$@, " GEN $@")

View File

@@ -10,7 +10,7 @@ msgstr ""
"PO-Revision-Date: 2012-02-28 16:00+0100\n" "PO-Revision-Date: 2012-02-28 16:00+0100\n"
"Last-Translator: Kevin Wolf <kwolf@redhat.com>\n" "Last-Translator: Kevin Wolf <kwolf@redhat.com>\n"
"Language-Team: Deutsch <de@li.org>\n" "Language-Team: Deutsch <de@li.org>\n"
"Language: de\n" "Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"

View File

@@ -10,7 +10,7 @@ msgstr ""
"PO-Revision-Date: 2013-03-31 19:39+0200\n" "PO-Revision-Date: 2013-03-31 19:39+0200\n"
"Last-Translator: Aurelien Jarno <aurelien@aurel32.net>\n" "Last-Translator: Aurelien Jarno <aurelien@aurel32.net>\n"
"Language-Team: French <FR@li.org>\n" "Language-Team: French <FR@li.org>\n"
"Language: fr\n" "Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"

View File

@@ -10,7 +10,7 @@ msgstr ""
"PO-Revision-Date: 2013-05-06 20:42+0200\n" "PO-Revision-Date: 2013-05-06 20:42+0200\n"
"Last-Translator: Ákos Kovács <akoskovacs@gmx.com>\n" "Last-Translator: Ákos Kovács <akoskovacs@gmx.com>\n"
"Language-Team: Hungarian <hu@li.org>\n" "Language-Team: Hungarian <hu@li.org>\n"
"Language: hu\n" "Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"

View File

@@ -10,7 +10,7 @@ msgstr ""
"PO-Revision-Date: 2012-02-27 08:23+0100\n" "PO-Revision-Date: 2012-02-27 08:23+0100\n"
"Last-Translator: Paolo Bonzini <pbonzini@redhat.com>\n" "Last-Translator: Paolo Bonzini <pbonzini@redhat.com>\n"
"Language-Team: Italian <it@li.org>\n" "Language-Team: Italian <it@li.org>\n"
"Language: it\n" "Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"

View File

@@ -10,7 +10,7 @@ msgstr ""
"PO-Revision-Date: 2013-04-22 18:35+0300\n" "PO-Revision-Date: 2013-04-22 18:35+0300\n"
"Last-Translator: Ozan Çağlayan <ozancag@gmail.com>\n" "Last-Translator: Ozan Çağlayan <ozancag@gmail.com>\n"
"Language-Team: Türkçe <>\n" "Language-Team: Türkçe <>\n"
"Language: tr\n" "Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"

View File

@@ -4285,13 +4285,10 @@
# #
# Drivers that are supported in block device operations. # Drivers that are supported in block device operations.
# #
# @host_device, @host_cdrom, @host_floppy: Since 2.1
#
# Since: 2.0 # Since: 2.0
## ##
{ 'enum': 'BlockdevDriver', { 'enum': 'BlockdevDriver',
'data': [ 'file', 'host_device', 'host_cdrom', 'host_floppy', 'data': [ 'file', 'http', 'https', 'ftp', 'ftps', 'tftp', 'vvfat', 'blkdebug',
'http', 'https', 'ftp', 'ftps', 'tftp', 'vvfat', 'blkdebug',
'blkverify', 'bochs', 'cloop', 'cow', 'dmg', 'parallels', 'qcow', 'blkverify', 'bochs', 'cloop', 'cow', 'dmg', 'parallels', 'qcow',
'qcow2', 'qed', 'raw', 'vdi', 'vhdx', 'vmdk', 'vpc', 'quorum' ] } 'qcow2', 'qed', 'raw', 'vdi', 'vhdx', 'vmdk', 'vpc', 'quorum' ] }
@@ -4558,9 +4555,6 @@
'discriminator': 'driver', 'discriminator': 'driver',
'data': { 'data': {
'file': 'BlockdevOptionsFile', 'file': 'BlockdevOptionsFile',
'host_device':'BlockdevOptionsFile',
'host_cdrom': 'BlockdevOptionsFile',
'host_floppy':'BlockdevOptionsFile',
'http': 'BlockdevOptionsFile', 'http': 'BlockdevOptionsFile',
'https': 'BlockdevOptionsFile', 'https': 'BlockdevOptionsFile',
'ftp': 'BlockdevOptionsFile', 'ftp': 'BlockdevOptionsFile',

View File

@@ -80,8 +80,7 @@ static QObject *do_qmp_dispatch(QObject *request, Error **errp)
return NULL; return NULL;
} }
if (!cmd->enabled) { if (!cmd->enabled) {
error_setg(errp, "The command %s has been disabled for this instance", error_set(errp, QERR_COMMAND_DISABLED, command);
command);
return NULL; return NULL;
} }

View File

@@ -71,7 +71,7 @@ static void qmp_input_push(QmpInputVisitor *qiv, QObject *obj, Error **errp)
GHashTable *h; GHashTable *h;
if (qiv->nb_stack >= QIV_STACK_SIZE) { if (qiv->nb_stack >= QIV_STACK_SIZE) {
error_setg(errp, "An internal buffer overran"); error_set(errp, QERR_BUFFER_OVERRUN);
return; return;
} }

View File

@@ -422,14 +422,12 @@ static BusState *qbus_find(const char *path)
* one child bus accept it nevertheless */ * one child bus accept it nevertheless */
switch (dev->num_child_bus) { switch (dev->num_child_bus) {
case 0: case 0:
qerror_report(ERROR_CLASS_GENERIC_ERROR, qerror_report(QERR_DEVICE_NO_BUS, elem);
"Device '%s' has no child bus", elem);
return NULL; return NULL;
case 1: case 1:
return QLIST_FIRST(&dev->child_bus); return QLIST_FIRST(&dev->child_bus);
default: default:
qerror_report(ERROR_CLASS_GENERIC_ERROR, qerror_report(QERR_DEVICE_MULTIPLE_BUSSES, elem);
"Device '%s' has multiple child busses", elem);
if (!monitor_cur_is_qmp()) { if (!monitor_cur_is_qmp()) {
qbus_list_bus(dev); qbus_list_bus(dev);
} }
@@ -507,16 +505,14 @@ DeviceState *qdev_device_add(QemuOpts *opts)
return NULL; return NULL;
} }
if (!object_dynamic_cast(OBJECT(bus), dc->bus_type)) { if (!object_dynamic_cast(OBJECT(bus), dc->bus_type)) {
qerror_report(ERROR_CLASS_GENERIC_ERROR, qerror_report(QERR_BAD_BUS_FOR_DEVICE,
"Device '%s' can't go on a %s bus",
driver, object_get_typename(OBJECT(bus))); driver, object_get_typename(OBJECT(bus)));
return NULL; return NULL;
} }
} else if (dc->bus_type != NULL) { } else if (dc->bus_type != NULL) {
bus = qbus_find_recursive(sysbus_get_default(), NULL, dc->bus_type); bus = qbus_find_recursive(sysbus_get_default(), NULL, dc->bus_type);
if (!bus) { if (!bus) {
qerror_report(ERROR_CLASS_GENERIC_ERROR, qerror_report(QERR_NO_BUS_FOR_DEVICE,
"No '%s' bus found for device '%s'",
dc->bus_type, driver); dc->bus_type, driver);
return NULL; return NULL;
} }

View File

@@ -457,12 +457,12 @@ fail:
static void dump_json_image_check(ImageCheck *check, bool quiet) static void dump_json_image_check(ImageCheck *check, bool quiet)
{ {
Error *local_err = NULL; Error *errp = NULL;
QString *str; QString *str;
QmpOutputVisitor *ov = qmp_output_visitor_new(); QmpOutputVisitor *ov = qmp_output_visitor_new();
QObject *obj; QObject *obj;
visit_type_ImageCheck(qmp_output_get_visitor(ov), visit_type_ImageCheck(qmp_output_get_visitor(ov),
&check, NULL, &local_err); &check, NULL, &errp);
obj = qmp_output_get_qobject(ov); obj = qmp_output_get_qobject(ov);
str = qobject_to_json_pretty(obj); str = qobject_to_json_pretty(obj);
assert(str != NULL); assert(str != NULL);
@@ -1731,12 +1731,12 @@ static void dump_snapshots(BlockDriverState *bs)
static void dump_json_image_info_list(ImageInfoList *list) static void dump_json_image_info_list(ImageInfoList *list)
{ {
Error *local_err = NULL; Error *errp = NULL;
QString *str; QString *str;
QmpOutputVisitor *ov = qmp_output_visitor_new(); QmpOutputVisitor *ov = qmp_output_visitor_new();
QObject *obj; QObject *obj;
visit_type_ImageInfoList(qmp_output_get_visitor(ov), visit_type_ImageInfoList(qmp_output_get_visitor(ov),
&list, NULL, &local_err); &list, NULL, &errp);
obj = qmp_output_get_qobject(ov); obj = qmp_output_get_qobject(ov);
str = qobject_to_json_pretty(obj); str = qobject_to_json_pretty(obj);
assert(str != NULL); assert(str != NULL);
@@ -1748,12 +1748,12 @@ static void dump_json_image_info_list(ImageInfoList *list)
static void dump_json_image_info(ImageInfo *info) static void dump_json_image_info(ImageInfo *info)
{ {
Error *local_err = NULL; Error *errp = NULL;
QString *str; QString *str;
QmpOutputVisitor *ov = qmp_output_visitor_new(); QmpOutputVisitor *ov = qmp_output_visitor_new();
QObject *obj; QObject *obj;
visit_type_ImageInfo(qmp_output_get_visitor(ov), visit_type_ImageInfo(qmp_output_get_visitor(ov),
&info, NULL, &local_err); &info, NULL, &errp);
obj = qmp_output_get_qobject(ov); obj = qmp_output_get_qobject(ov);
str = qobject_to_json_pretty(obj); str = qobject_to_json_pretty(obj);
assert(str != NULL); assert(str != NULL);

View File

@@ -210,13 +210,10 @@ use is discouraged as it may be removed from future versions.
ETEXI ETEXI
DEF("m", HAS_ARG, QEMU_OPTION_m, DEF("m", HAS_ARG, QEMU_OPTION_m,
"-m [size=]megs\n" "-m megs set virtual RAM size to megs MB [default="
" configure guest RAM\n" stringify(DEFAULT_RAM_SIZE) "]\n", QEMU_ARCH_ALL)
" size: initial amount of guest memory (default: "
stringify(DEFAULT_RAM_SIZE) "MiB)\n",
QEMU_ARCH_ALL)
STEXI STEXI
@item -m [size=]@var{megs} @item -m @var{megs}
@findex -m @findex -m
Set virtual RAM size to @var{megs} megabytes. Default is 128 MiB. Optionally, Set virtual RAM size to @var{megs} megabytes. Default is 128 MiB. Optionally,
a suffix of ``M'' or ``G'' can be used to signify a value in megabytes or a suffix of ``M'' or ``G'' can be used to signify a value in megabytes or
@@ -411,8 +408,7 @@ DEF("drive", HAS_ARG, QEMU_OPTION_drive,
"-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]\n"
" [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]\n" " [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]\n"
" [,serial=s][,addr=A][,rerror=ignore|stop|report]\n" " [,serial=s][,addr=A][,id=name][,aio=threads|native]\n"
" [,werror=ignore|stop|report|enospc][,id=name][,aio=threads|native]\n"
" [,readonly=on|off][,copy-on-read=on|off]\n" " [,readonly=on|off][,copy-on-read=on|off]\n"
" [[,bps=b]|[[,bps_rd=r][,bps_wr=w]]]\n" " [[,bps=b]|[[,bps_rd=r][,bps_wr=w]]]\n"
" [[,iops=i]|[[,iops_rd=r][,iops_wr=w]]]\n" " [[,iops=i]|[[,iops_rd=r][,iops_wr=w]]]\n"

View File

@@ -143,7 +143,6 @@ static const struct QemuSeccompSyscall seccomp_whitelist[] = {
{ SCMP_SYS(getsockname), 242 }, { SCMP_SYS(getsockname), 242 },
{ SCMP_SYS(getpeername), 242 }, { SCMP_SYS(getpeername), 242 },
{ SCMP_SYS(accept4), 242 }, { SCMP_SYS(accept4), 242 },
{ SCMP_SYS(timerfd_settime), 242 },
{ SCMP_SYS(newfstatat), 241 }, { SCMP_SYS(newfstatat), 241 },
{ SCMP_SYS(shutdown), 241 }, { SCMP_SYS(shutdown), 241 },
{ SCMP_SYS(getsockopt), 241 }, { SCMP_SYS(getsockopt), 241 },
@@ -226,11 +225,7 @@ static const struct QemuSeccompSyscall seccomp_whitelist[] = {
{ SCMP_SYS(fchmod), 240 }, { SCMP_SYS(fchmod), 240 },
{ SCMP_SYS(shmget), 240 }, { SCMP_SYS(shmget), 240 },
{ SCMP_SYS(shmat), 240 }, { SCMP_SYS(shmat), 240 },
{ SCMP_SYS(shmdt), 240 }, { SCMP_SYS(shmdt), 240 }
{ SCMP_SYS(timerfd_create), 240 },
{ SCMP_SYS(shmctl), 240 },
{ SCMP_SYS(mlock), 240 },
{ SCMP_SYS(munlock), 240 }
}; };
int seccomp_start(void) int seccomp_start(void)

23
qmp.c
View File

@@ -166,7 +166,7 @@ void qmp_cont(Error **errp)
Error *local_err = NULL; Error *local_err = NULL;
if (runstate_needs_reset()) { if (runstate_needs_reset()) {
error_setg(errp, "Resetting the Virtual Machine is required"); error_set(errp, QERR_RESET_REQUIRED);
return; return;
} else if (runstate_check(RUN_STATE_SUSPENDED)) { } else if (runstate_check(RUN_STATE_SUSPENDED)) {
return; return;
@@ -540,27 +540,14 @@ void object_add(const char *type, const char *id, const QDict *qdict,
Visitor *v, Error **errp) Visitor *v, Error **errp)
{ {
Object *obj; Object *obj;
ObjectClass *klass;
const QDictEntry *e; const QDictEntry *e;
Error *local_err = NULL; Error *local_err = NULL;
klass = object_class_by_name(type); if (!object_class_by_name(type)) {
if (!klass) {
error_setg(errp, "invalid class name"); error_setg(errp, "invalid class name");
return; return;
} }
if (!object_class_dynamic_cast(klass, TYPE_USER_CREATABLE)) {
error_setg(errp, "object type '%s' isn't supported by object-add",
type);
return;
}
if (object_class_is_abstract(klass)) {
error_setg(errp, "object type '%s' is abstract", type);
return;
}
obj = object_new(type); obj = object_new(type);
if (qdict) { if (qdict) {
for (e = qdict_first(qdict); e; e = qdict_next(qdict, e)) { for (e = qdict_first(qdict); e; e = qdict_next(qdict, e)) {
@@ -571,6 +558,12 @@ void object_add(const char *type, const char *id, const QDict *qdict,
} }
} }
if (!object_dynamic_cast(obj, TYPE_USER_CREATABLE)) {
error_setg(&local_err, "object type '%s' isn't supported by object-add",
type);
goto out;
}
user_creatable_complete(obj, &local_err); user_creatable_complete(obj, &local_err);
if (local_err) { if (local_err) {
goto out; goto out;

View File

@@ -110,7 +110,7 @@ static void GCC_FMT_ATTR(3, 4) parse_error(JSONParserContext *ctxt,
error_free(ctxt->err); error_free(ctxt->err);
ctxt->err = NULL; ctxt->err = NULL;
} }
error_setg(&ctxt->err, "JSON parse error, %s", message); error_set(&ctxt->err, QERR_JSON_PARSE_ERROR, message);
} }
/** /**

View File

@@ -768,7 +768,7 @@ ObjectProperty *object_property_find(Object *obj, const char *name,
} }
} }
error_setg(errp, "Property '.%s' not found", name); error_set(errp, QERR_PROPERTY_NOT_FOUND, "", name);
return NULL; return NULL;
} }
@@ -1075,8 +1075,7 @@ static Object *object_resolve_link(Object *obj, const char *name,
target = object_resolve_path_type(path, target_type, &ambiguous); target = object_resolve_path_type(path, target_type, &ambiguous);
if (ambiguous) { if (ambiguous) {
error_set(errp, ERROR_CLASS_GENERIC_ERROR, error_set(errp, QERR_AMBIGUOUS_PATH, path);
"Path '%s' does not uniquely identify an object", path);
} else if (!target) { } else if (!target) {
target = object_resolve_path(path, &ambiguous); target = object_resolve_path(path, &ambiguous);
if (target || ambiguous) { if (target || ambiguous) {

View File

@@ -453,8 +453,7 @@ bool qemu_savevm_state_blocked(Error **errp)
QTAILQ_FOREACH(se, &savevm_handlers, entry) { QTAILQ_FOREACH(se, &savevm_handlers, entry) {
if (se->no_migrate) { if (se->no_migrate) {
error_setg(errp, "State blocked by non-migratable device '%s'", error_set(errp, QERR_MIGRATION_NOT_SUPPORTED, se->idstr);
se->idstr);
return true; return true;
} }
} }

View File

@@ -136,7 +136,7 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
if ((s = qemu_socket(AF_INET, SOCK_STREAM, 0)) < 0 || if ((s = qemu_socket(AF_INET, SOCK_STREAM, 0)) < 0 ||
bind(s, (struct sockaddr *)&addr, addrlen) < 0 || bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
listen(s, 1) < 0) { listen(s, 1) < 0) {
error_report("Error: inet socket: %s", strerror(errno)); lprint("Error: inet socket: %s\n", strerror(errno));
closesocket(s); closesocket(s);
return 0; return 0;
@@ -146,7 +146,7 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
pid = fork(); pid = fork();
switch(pid) { switch(pid) {
case -1: case -1:
error_report("Error: fork failed: %s", strerror(errno)); lprint("Error: fork failed: %s\n", strerror(errno));
close(s); close(s);
return 0; return 0;
@@ -242,6 +242,15 @@ strdup(str)
} }
#endif #endif
void lprint(const char *format, ...)
{
va_list args;
va_start(args, format);
monitor_vprintf(default_mon, format, args);
va_end(args);
}
void slirp_connection_info(Slirp *slirp, Monitor *mon) void slirp_connection_info(Slirp *slirp, Monitor *mon)
{ {
const char * const tcpstates[] = { const char * const tcpstates[] = {

View File

@@ -139,7 +139,7 @@ int get_dns_addr(struct in_addr *pdns_addr)
return -1; return -1;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "IP address of your DNS(s): "); lprint("IP address of your DNS(s): ");
#endif #endif
while (fgets(buff, 512, f) != NULL) { while (fgets(buff, 512, f) != NULL) {
if (sscanf(buff, "nameserver%*[ \t]%256s", buff2) == 1) { if (sscanf(buff, "nameserver%*[ \t]%256s", buff2) == 1) {
@@ -153,17 +153,17 @@ int get_dns_addr(struct in_addr *pdns_addr)
} }
#ifdef DEBUG #ifdef DEBUG
else else
fprintf(stderr, ", "); lprint(", ");
#endif #endif
if (++found > 3) { if (++found > 3) {
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "(more)"); lprint("(more)");
#endif #endif
break; break;
} }
#ifdef DEBUG #ifdef DEBUG
else else
fprintf(stderr, "%s", inet_ntoa(tmp_addr)); lprint("%s", inet_ntoa(tmp_addr));
#endif #endif
} }
} }

View File

@@ -287,6 +287,8 @@ void if_start(struct ttys *);
long gethostid(void); long gethostid(void);
#endif #endif
void lprint(const char *, ...) GCC_FMT_ATTR(1, 2);
#ifndef _WIN32 #ifndef _WIN32
#include <netdb.h> #include <netdb.h>
#endif #endif

View File

@@ -14,6 +14,7 @@ stub-obj-y += iothread-lock.o
stub-obj-y += migr-blocker.o stub-obj-y += migr-blocker.o
stub-obj-y += mon-is-qmp.o stub-obj-y += mon-is-qmp.o
stub-obj-y += mon-printf.o stub-obj-y += mon-printf.o
stub-obj-y += mon-print-filename.o
stub-obj-y += mon-protocol-event.o stub-obj-y += mon-protocol-event.o
stub-obj-y += mon-set-error.o stub-obj-y += mon-set-error.o
stub-obj-y += pci-drive-hot-add.o stub-obj-y += pci-drive-hot-add.o

View File

@@ -4,6 +4,6 @@
CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp) CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
{ {
error_set(errp, QERR_UNSUPPORTED); error_set(errp, QERR_NOT_SUPPORTED);
return NULL; return NULL;
} }

View File

@@ -0,0 +1,6 @@
#include "qemu-common.h"
#include "monitor/monitor.h"
void monitor_print_filename(Monitor *mon, const char *filename)
{
}

View File

@@ -126,9 +126,6 @@ typedef struct CPUS390XState {
uint64_t pfault_compare; uint64_t pfault_compare;
uint64_t pfault_select; uint64_t pfault_select;
uint64_t gbea;
uint64_t pp;
CPU_COMMON CPU_COMMON
/* reset does memset(0) up to here */ /* reset does memset(0) up to here */

View File

@@ -36,7 +36,6 @@
#include "sysemu/device_tree.h" #include "sysemu/device_tree.h"
#include "qapi/qmp/qjson.h" #include "qapi/qmp/qjson.h"
#include "monitor/monitor.h" #include "monitor/monitor.h"
#include "trace.h"
/* #define DEBUG_KVM */ /* #define DEBUG_KVM */
@@ -129,42 +128,14 @@ void kvm_arch_reset_vcpu(CPUState *cpu)
} }
} }
static int kvm_set_one_reg(CPUState *cs, uint64_t id, void *source)
{
struct kvm_one_reg reg;
int r;
reg.id = id;
reg.addr = (uint64_t) source;
r = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
if (r) {
trace_kvm_failed_reg_set(id, strerror(errno));
}
return r;
}
static int kvm_get_one_reg(CPUState *cs, uint64_t id, void *target)
{
struct kvm_one_reg reg;
int r;
reg.id = id;
reg.addr = (uint64_t) target;
r = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
if (r) {
trace_kvm_failed_reg_get(id, strerror(errno));
}
return r;
}
int kvm_arch_put_registers(CPUState *cs, int level) int kvm_arch_put_registers(CPUState *cs, int level)
{ {
S390CPU *cpu = S390_CPU(cs); S390CPU *cpu = S390_CPU(cs);
CPUS390XState *env = &cpu->env; CPUS390XState *env = &cpu->env;
struct kvm_one_reg reg;
struct kvm_sregs sregs; struct kvm_sregs sregs;
struct kvm_regs regs; struct kvm_regs regs;
int r; int ret;
int i; int i;
/* always save the PSW and the GPRS*/ /* always save the PSW and the GPRS*/
@@ -180,9 +151,9 @@ int kvm_arch_put_registers(CPUState *cs, int level)
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
regs.gprs[i] = env->regs[i]; regs.gprs[i] = env->regs[i];
} }
r = kvm_vcpu_ioctl(cs, KVM_SET_REGS, &regs); ret = kvm_vcpu_ioctl(cs, KVM_SET_REGS, &regs);
if (r < 0) { if (ret < 0) {
return r; return ret;
} }
} }
@@ -191,29 +162,47 @@ int kvm_arch_put_registers(CPUState *cs, int level)
return 0; return 0;
} }
/* reg.id = KVM_REG_S390_CPU_TIMER;
* These ONE_REGS are not protected by a capability. As they are only reg.addr = (__u64)&(env->cputm);
* necessary for migration we just trace a possible error, but don't ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
* return with an error return code. if (ret < 0) {
*/ return ret;
kvm_set_one_reg(cs, KVM_REG_S390_CPU_TIMER, &env->cputm); }
kvm_set_one_reg(cs, KVM_REG_S390_CLOCK_COMP, &env->ckc);
kvm_set_one_reg(cs, KVM_REG_S390_TODPR, &env->todpr); reg.id = KVM_REG_S390_CLOCK_COMP;
kvm_set_one_reg(cs, KVM_REG_S390_GBEA, &env->gbea); reg.addr = (__u64)&(env->ckc);
kvm_set_one_reg(cs, KVM_REG_S390_PP, &env->pp); ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
if (ret < 0) {
return ret;
}
reg.id = KVM_REG_S390_TODPR;
reg.addr = (__u64)&(env->todpr);
ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
if (ret < 0) {
return ret;
}
if (cap_async_pf) { if (cap_async_pf) {
r = kvm_set_one_reg(cs, KVM_REG_S390_PFTOKEN, &env->pfault_token); reg.id = KVM_REG_S390_PFTOKEN;
if (r < 0) { reg.addr = (__u64)&(env->pfault_token);
return r; ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
if (ret < 0) {
return ret;
} }
r = kvm_set_one_reg(cs, KVM_REG_S390_PFCOMPARE, &env->pfault_compare);
if (r < 0) { reg.id = KVM_REG_S390_PFCOMPARE;
return r; reg.addr = (__u64)&(env->pfault_compare);
ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
if (ret < 0) {
return ret;
} }
r = kvm_set_one_reg(cs, KVM_REG_S390_PFSELECT, &env->pfault_select);
if (r < 0) { reg.id = KVM_REG_S390_PFSELECT;
return r; reg.addr = (__u64)&(env->pfault_select);
ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
if (ret < 0) {
return ret;
} }
} }
@@ -231,9 +220,9 @@ int kvm_arch_put_registers(CPUState *cs, int level)
sregs.acrs[i] = env->aregs[i]; sregs.acrs[i] = env->aregs[i];
sregs.crs[i] = env->cregs[i]; sregs.crs[i] = env->cregs[i];
} }
r = kvm_vcpu_ioctl(cs, KVM_SET_SREGS, &sregs); ret = kvm_vcpu_ioctl(cs, KVM_SET_SREGS, &sregs);
if (r < 0) { if (ret < 0) {
return r; return ret;
} }
} }
@@ -251,6 +240,7 @@ int kvm_arch_get_registers(CPUState *cs)
{ {
S390CPU *cpu = S390_CPU(cs); S390CPU *cpu = S390_CPU(cs);
CPUS390XState *env = &cpu->env; CPUS390XState *env = &cpu->env;
struct kvm_one_reg reg;
struct kvm_sregs sregs; struct kvm_sregs sregs;
struct kvm_regs regs; struct kvm_regs regs;
int i, r; int i, r;
@@ -298,27 +288,46 @@ int kvm_arch_get_registers(CPUState *cs)
env->psa = cs->kvm_run->s.regs.prefix; env->psa = cs->kvm_run->s.regs.prefix;
} }
/* /* One Regs */
* These ONE_REGS are not protected by a capability. As they are only reg.id = KVM_REG_S390_CPU_TIMER;
* necessary for migration we just trace a possible error, but don't reg.addr = (__u64)&(env->cputm);
* return with an error return code. r = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
*/ if (r < 0) {
kvm_get_one_reg(cs, KVM_REG_S390_CPU_TIMER, &env->cputm); return r;
kvm_get_one_reg(cs, KVM_REG_S390_CLOCK_COMP, &env->ckc); }
kvm_get_one_reg(cs, KVM_REG_S390_TODPR, &env->todpr);
kvm_get_one_reg(cs, KVM_REG_S390_GBEA, &env->gbea); reg.id = KVM_REG_S390_CLOCK_COMP;
kvm_get_one_reg(cs, KVM_REG_S390_PP, &env->pp); reg.addr = (__u64)&(env->ckc);
r = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
if (r < 0) {
return r;
}
reg.id = KVM_REG_S390_TODPR;
reg.addr = (__u64)&(env->todpr);
r = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
if (r < 0) {
return r;
}
if (cap_async_pf) { if (cap_async_pf) {
r = kvm_get_one_reg(cs, KVM_REG_S390_PFTOKEN, &env->pfault_token); reg.id = KVM_REG_S390_PFTOKEN;
reg.addr = (__u64)&(env->pfault_token);
r = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
if (r < 0) { if (r < 0) {
return r; return r;
} }
r = kvm_get_one_reg(cs, KVM_REG_S390_PFCOMPARE, &env->pfault_compare);
reg.id = KVM_REG_S390_PFCOMPARE;
reg.addr = (__u64)&(env->pfault_compare);
r = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
if (r < 0) { if (r < 0) {
return r; return r;
} }
r = kvm_get_one_reg(cs, KVM_REG_S390_PFSELECT, &env->pfault_select);
reg.id = KVM_REG_S390_PFSELECT;
reg.addr = (__u64)&(env->pfault_select);
r = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
if (r < 0) { if (r < 0) {
return r; return r;
} }
@@ -374,26 +383,6 @@ int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
return 0; return 0;
} }
int kvm_arch_insert_hw_breakpoint(target_ulong addr,
target_ulong len, int type)
{
return -ENOSYS;
}
int kvm_arch_remove_hw_breakpoint(target_ulong addr,
target_ulong len, int type)
{
return -ENOSYS;
}
void kvm_arch_remove_all_hw_breakpoints(void)
{
}
void kvm_arch_update_guest_debug(CPUState *cpu, struct kvm_guest_debug *dbg)
{
}
void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run) void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run)
{ {
} }
@@ -855,11 +844,6 @@ static int handle_tsch(S390CPU *cpu)
return ret; return ret;
} }
static int kvm_arch_handle_debug_exit(S390CPU *cpu)
{
return -ENOSYS;
}
int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run) int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
{ {
S390CPU *cpu = S390_CPU(cs); S390CPU *cpu = S390_CPU(cs);
@@ -875,9 +859,6 @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
case KVM_EXIT_S390_TSCH: case KVM_EXIT_S390_TSCH:
ret = handle_tsch(cpu); ret = handle_tsch(cpu);
break; break;
case KVM_EXIT_DEBUG:
ret = kvm_arch_handle_debug_exit(cpu);
break;
default: default:
fprintf(stderr, "Unknown KVM exit: %d\n", run->exit_reason); fprintf(stderr, "Unknown KVM exit: %d\n", run->exit_reason);
break; break;

View File

@@ -336,7 +336,7 @@ uint32_t HELPER(stsi)(CPUS390XState *env, uint64_t a0,
ebcdic_put(sysib.model, "QEMU ", 16); ebcdic_put(sysib.model, "QEMU ", 16);
ebcdic_put(sysib.sequence, "QEMU ", 16); ebcdic_put(sysib.sequence, "QEMU ", 16);
ebcdic_put(sysib.plant, "QEMU", 4); ebcdic_put(sysib.plant, "QEMU", 4);
cpu_physical_memory_write(a0, &sysib, sizeof(sysib)); cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1);
} else if ((sel1 == 2) && (sel2 == 1)) { } else if ((sel1 == 2) && (sel2 == 1)) {
/* Basic Machine CPU */ /* Basic Machine CPU */
struct sysib_121 sysib; struct sysib_121 sysib;
@@ -346,7 +346,7 @@ uint32_t HELPER(stsi)(CPUS390XState *env, uint64_t a0,
ebcdic_put(sysib.sequence, "QEMUQEMUQEMUQEMU", 16); ebcdic_put(sysib.sequence, "QEMUQEMUQEMUQEMU", 16);
ebcdic_put(sysib.plant, "QEMU", 4); ebcdic_put(sysib.plant, "QEMU", 4);
stw_p(&sysib.cpu_addr, env->cpu_num); stw_p(&sysib.cpu_addr, env->cpu_num);
cpu_physical_memory_write(a0, &sysib, sizeof(sysib)); cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1);
} else if ((sel1 == 2) && (sel2 == 2)) { } else if ((sel1 == 2) && (sel2 == 2)) {
/* Basic Machine CPUs */ /* Basic Machine CPUs */
struct sysib_122 sysib; struct sysib_122 sysib;
@@ -358,7 +358,7 @@ uint32_t HELPER(stsi)(CPUS390XState *env, uint64_t a0,
stw_p(&sysib.active_cpus, 1); stw_p(&sysib.active_cpus, 1);
stw_p(&sysib.standby_cpus, 0); stw_p(&sysib.standby_cpus, 0);
stw_p(&sysib.reserved_cpus, 0); stw_p(&sysib.reserved_cpus, 0);
cpu_physical_memory_write(a0, &sysib, sizeof(sysib)); cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1);
} else { } else {
cc = 3; cc = 3;
} }
@@ -375,7 +375,7 @@ uint32_t HELPER(stsi)(CPUS390XState *env, uint64_t a0,
ebcdic_put(sysib.plant, "QEMU", 4); ebcdic_put(sysib.plant, "QEMU", 4);
stw_p(&sysib.cpu_addr, env->cpu_num); stw_p(&sysib.cpu_addr, env->cpu_num);
stw_p(&sysib.cpu_id, 0); stw_p(&sysib.cpu_id, 0);
cpu_physical_memory_write(a0, &sysib, sizeof(sysib)); cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1);
} else if ((sel1 == 2) && (sel2 == 2)) { } else if ((sel1 == 2) && (sel2 == 2)) {
/* LPAR CPUs */ /* LPAR CPUs */
struct sysib_222 sysib; struct sysib_222 sysib;
@@ -392,7 +392,7 @@ uint32_t HELPER(stsi)(CPUS390XState *env, uint64_t a0,
stl_p(&sysib.caf, 1000); stl_p(&sysib.caf, 1000);
stw_p(&sysib.dedicated_cpus, 0); stw_p(&sysib.dedicated_cpus, 0);
stw_p(&sysib.shared_cpus, 0); stw_p(&sysib.shared_cpus, 0);
cpu_physical_memory_write(a0, &sysib, sizeof(sysib)); cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1);
} else { } else {
cc = 3; cc = 3;
} }
@@ -414,7 +414,7 @@ uint32_t HELPER(stsi)(CPUS390XState *env, uint64_t a0,
ebcdic_put(sysib.vm[0].name, "KVMguest", 8); ebcdic_put(sysib.vm[0].name, "KVMguest", 8);
stl_p(&sysib.vm[0].caf, 1000); stl_p(&sysib.vm[0].caf, 1000);
ebcdic_put(sysib.vm[0].cpi, "KVM/Linux ", 16); ebcdic_put(sysib.vm[0].cpi, "KVM/Linux ", 16);
cpu_physical_memory_write(a0, &sysib, sizeof(sysib)); cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1);
} else { } else {
cc = 3; cc = 3;
} }

12
tests/.gitignore vendored
View File

@@ -7,28 +7,20 @@ check-qstring
check-qom-interface check-qom-interface
test-aio test-aio
test-bitops test-bitops
test-coroutine test-throttle
test-cutils test-cutils
test-hbitmap test-hbitmap
test-int128 test-int128
test-iov test-iov
test-mul64 test-mul64
test-opts-visitor
test-qapi-types.[ch] test-qapi-types.[ch]
test-qapi-visit.[ch] test-qapi-visit.[ch]
test-qdev-global-props test-qdev-global-props
test-qmp-commands
test-qmp-commands.h test-qmp-commands.h
test-qmp-commands
test-qmp-input-strict test-qmp-input-strict
test-qmp-input-visitor
test-qmp-marshal.c test-qmp-marshal.c
test-qmp-output-visitor
test-rfifolock
test-string-input-visitor
test-string-output-visitor
test-thread-pool test-thread-pool
test-throttle
test-visitor-serialization
test-vmstate test-vmstate
test-x86-cpuid test-x86-cpuid
test-xbzrle test-xbzrle

View File

@@ -113,6 +113,10 @@ check-qtest-pci-y += tests/tpci200-test$(EXESUF)
gcov-files-pci-y += hw/ipack/tpci200.c gcov-files-pci-y += hw/ipack/tpci200.c
check-qtest-pci-y += $(check-qtest-ipack-y) check-qtest-pci-y += $(check-qtest-ipack-y)
gcov-files-pci-y += $(gcov-files-ipack-y) gcov-files-pci-y += $(gcov-files-ipack-y)
check-qtest-pci-y += tests/display-vga-test$(EXESUF)
gcov-files-pci-y += hw/display/vga.c
gcov-files-pci-y += hw/display/cirrus_vga.c
gcov-files-pci-y += hw/display/vga-pci.c
check-qtest-i386-y = tests/endianness-test$(EXESUF) check-qtest-i386-y = tests/endianness-test$(EXESUF)
check-qtest-i386-y += tests/fdc-test$(EXESUF) check-qtest-i386-y += tests/fdc-test$(EXESUF)
@@ -280,6 +284,7 @@ tests/virtio-9p-test$(EXESUF): tests/virtio-9p-test.o
tests/virtio-serial-test$(EXESUF): tests/virtio-serial-test.o tests/virtio-serial-test$(EXESUF): tests/virtio-serial-test.o
tests/virtio-console-test$(EXESUF): tests/virtio-console-test.o tests/virtio-console-test$(EXESUF): tests/virtio-console-test.o
tests/tpci200-test$(EXESUF): tests/tpci200-test.o tests/tpci200-test$(EXESUF): tests/tpci200-test.o
tests/display-vga-test$(EXESUF): tests/display-vga-test.o
tests/ipoctal232-test$(EXESUF): tests/ipoctal232-test.o tests/ipoctal232-test$(EXESUF): tests/ipoctal232-test.o
tests/qom-test$(EXESUF): tests/qom-test.o tests/qom-test$(EXESUF): tests/qom-test.o
tests/blockdev-test$(EXESUF): tests/blockdev-test.o $(libqos-pc-obj-y) tests/blockdev-test$(EXESUF): tests/blockdev-test.o $(libqos-pc-obj-y)

52
tests/display-vga-test.c Normal file
View File

@@ -0,0 +1,52 @@
/*
* QTest testcase for vga cards
*
* Copyright (c) 2014 Red Hat, Inc
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/
#include <glib.h>
#include <string.h>
#include "libqtest.h"
#include "qemu/osdep.h"
static void pci_cirrus(void)
{
qtest_start("-vga none -device cirrus-vga");
qtest_end();
}
static void pci_stdvga(void)
{
qtest_start("-vga none -device VGA");
qtest_end();
}
static void pci_secondary(void)
{
qtest_start("-vga none -device secondary-vga");
qtest_end();
}
static void pci_multihead(void)
{
qtest_start("-vga none -device VGA -device secondary-vga");
qtest_end();
}
int main(int argc, char **argv)
{
int ret;
g_test_init(&argc, &argv, NULL);
qtest_add_func("/display/pci/cirrus", pci_cirrus);
qtest_add_func("/display/pci/stdvga", pci_stdvga);
qtest_add_func("/display/pci/secondary", pci_secondary);
qtest_add_func("/display/pci/multihead", pci_multihead);
ret = g_test_run();
return ret;
}

View File

@@ -50,7 +50,15 @@ class TestSingleDrive(iotests.QMPTestCase):
result = self.vm.qmp('block-stream', device='drive0') result = self.vm.qmp('block-stream', device='drive0')
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
self.wait_until_completed() completed = False
while not completed:
for event in self.vm.get_qmp_events(wait=True):
if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/type', 'stream')
self.assert_qmp(event, 'data/device', 'drive0')
self.assert_qmp(event, 'data/offset', self.image_len)
self.assert_qmp(event, 'data/len', self.image_len)
completed = True
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()
self.vm.shutdown() self.vm.shutdown()
@@ -81,7 +89,15 @@ class TestSingleDrive(iotests.QMPTestCase):
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
self.vm.resume_drive('drive0') self.vm.resume_drive('drive0')
self.wait_until_completed() completed = False
while not completed:
for event in self.vm.get_qmp_events(wait=True):
if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/type', 'stream')
self.assert_qmp(event, 'data/device', 'drive0')
self.assert_qmp(event, 'data/offset', self.image_len)
self.assert_qmp(event, 'data/len', self.image_len)
completed = True
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()
self.vm.shutdown() self.vm.shutdown()
@@ -96,7 +112,15 @@ class TestSingleDrive(iotests.QMPTestCase):
result = self.vm.qmp('block-stream', device='drive0', base=mid_img) result = self.vm.qmp('block-stream', device='drive0', base=mid_img)
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
self.wait_until_completed() completed = False
while not completed:
for event in self.vm.get_qmp_events(wait=True):
if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/type', 'stream')
self.assert_qmp(event, 'data/device', 'drive0')
self.assert_qmp(event, 'data/offset', self.image_len)
self.assert_qmp(event, 'data/len', self.image_len)
completed = True
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()
self.vm.shutdown() self.vm.shutdown()
@@ -128,7 +152,15 @@ class TestSmallerBackingFile(iotests.QMPTestCase):
result = self.vm.qmp('block-stream', device='drive0') result = self.vm.qmp('block-stream', device='drive0')
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
self.wait_until_completed() completed = False
while not completed:
for event in self.vm.get_qmp_events(wait=True):
if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/type', 'stream')
self.assert_qmp(event, 'data/device', 'drive0')
self.assert_qmp(event, 'data/offset', self.image_len)
self.assert_qmp(event, 'data/len', self.image_len)
completed = True
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()
self.vm.shutdown() self.vm.shutdown()
@@ -410,7 +442,15 @@ class TestSetSpeed(iotests.QMPTestCase):
result = self.vm.qmp('block-job-set-speed', device='drive0', speed=8 * 1024 * 1024) result = self.vm.qmp('block-job-set-speed', device='drive0', speed=8 * 1024 * 1024)
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
self.wait_until_completed() completed = False
while not completed:
for event in self.vm.get_qmp_events(wait=True):
if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/type', 'stream')
self.assert_qmp(event, 'data/device', 'drive0')
self.assert_qmp(event, 'data/offset', self.image_len)
self.assert_qmp(event, 'data/len', self.image_len)
completed = True
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()

View File

@@ -57,7 +57,14 @@ class TestSyncModesNoneAndTop(iotests.QMPTestCase):
format=iotests.imgfmt, target=target_img) format=iotests.imgfmt, target=target_img)
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
self.wait_until_completed(check_offset=False) # Custom completed check as we are not copying all data.
completed = False
while not completed:
for event in self.vm.get_qmp_events(wait=True):
if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/device', 'drive0')
self.assert_qmp_absent(event, 'data/error')
completed = True
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()
self.vm.shutdown() self.vm.shutdown()

View File

@@ -257,7 +257,7 @@ class QMPTestCase(unittest.TestCase):
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()
return result return result
def wait_until_completed(self, drive='drive0', check_offset=True): def wait_until_completed(self, drive='drive0'):
'''Wait for a block job to finish, returning the event''' '''Wait for a block job to finish, returning the event'''
completed = False completed = False
while not completed: while not completed:
@@ -265,8 +265,7 @@ class QMPTestCase(unittest.TestCase):
if event['event'] == 'BLOCK_JOB_COMPLETED': if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/device', drive) self.assert_qmp(event, 'data/device', drive)
self.assert_qmp_absent(event, 'data/error') self.assert_qmp_absent(event, 'data/error')
if check_offset: self.assert_qmp(event, 'data/offset', self.image_len)
self.assert_qmp(event, 'data/offset', self.image_len)
self.assert_qmp(event, 'data/len', self.image_len) self.assert_qmp(event, 'data/len', self.image_len)
completed = True completed = True

View File

@@ -153,7 +153,7 @@ static void test_validate_union_flat(TestInputVisitorData *data,
/* TODO when generator bug is fixed, add 'integer': 41 */ /* TODO when generator bug is fixed, add 'integer': 41 */
visit_type_UserDefFlatUnion(v, &tmp, NULL, &errp); visit_type_UserDefFlatUnion(v, &tmp, NULL, &errp);
g_assert(!errp); g_assert(!error_is_set(&errp));
qapi_free_UserDefFlatUnion(tmp); qapi_free_UserDefFlatUnion(tmp);
} }
@@ -167,7 +167,7 @@ static void test_validate_union_anon(TestInputVisitorData *data,
v = validate_test_init(data, "42"); v = validate_test_init(data, "42");
visit_type_UserDefAnonUnion(v, &tmp, NULL, &errp); visit_type_UserDefAnonUnion(v, &tmp, NULL, &errp);
g_assert(!errp); g_assert(!error_is_set(&errp));
qapi_free_UserDefAnonUnion(tmp); qapi_free_UserDefAnonUnion(tmp);
} }
@@ -240,7 +240,7 @@ static void test_validate_fail_union_flat(TestInputVisitorData *data,
v = validate_test_init(data, "{ 'string': 'c', 'integer': 41, 'boolean': true }"); v = validate_test_init(data, "{ 'string': 'c', 'integer': 41, 'boolean': true }");
visit_type_UserDefFlatUnion(v, &tmp, NULL, &errp); visit_type_UserDefFlatUnion(v, &tmp, NULL, &errp);
g_assert(errp); g_assert(error_is_set(&errp));
qapi_free_UserDefFlatUnion(tmp); qapi_free_UserDefFlatUnion(tmp);
} }
@@ -254,7 +254,7 @@ static void test_validate_fail_union_anon(TestInputVisitorData *data,
v = validate_test_init(data, "3.14"); v = validate_test_init(data, "3.14");
visit_type_UserDefAnonUnion(v, &tmp, NULL, &errp); visit_type_UserDefAnonUnion(v, &tmp, NULL, &errp);
g_assert(errp); g_assert(error_is_set(&errp));
qapi_free_UserDefAnonUnion(tmp); qapi_free_UserDefAnonUnion(tmp);
} }

View File

@@ -1243,7 +1243,3 @@ xen_pv_mmio_write(uint64_t addr) "WARNING: write to Xen PV Device MMIO space (ad
# hw/pci/pci_host.c # hw/pci/pci_host.c
pci_cfg_read(const char *dev, unsigned devid, unsigned fnid, unsigned offs, unsigned val) "%s %02u:%u @0x%x -> 0x%x" pci_cfg_read(const char *dev, unsigned devid, unsigned fnid, unsigned offs, unsigned val) "%s %02u:%u @0x%x -> 0x%x"
pci_cfg_write(const char *dev, unsigned devid, unsigned fnid, unsigned offs, unsigned val) "%s %02u:%u @0x%x <- 0x%x" pci_cfg_write(const char *dev, unsigned devid, unsigned fnid, unsigned offs, unsigned val) "%s %02u:%u @0x%x <- 0x%x"
# target-s390/kvm.c
kvm_failed_reg_get(uint64_t id, const char *msg) "Warning: Unable to retrieve ONEREG %" PRIu64 " from KVM: %s"
kvm_failed_reg_set(uint64_t id, const char *msg) "Warning: Unable to set ONEREG %" PRIu64 " to KVM: %s"

View File

@@ -93,12 +93,13 @@ static inline void gdk_drawable_get_size(GdkWindow *w, gint *ww, gint *wh)
#define GDK_KEY_2 GDK_2 #define GDK_KEY_2 GDK_2
#define GDK_KEY_f GDK_f #define GDK_KEY_f GDK_f
#define GDK_KEY_g GDK_g #define GDK_KEY_g GDK_g
#define GDK_KEY_q GDK_q
#define GDK_KEY_plus GDK_plus #define GDK_KEY_plus GDK_plus
#define GDK_KEY_minus GDK_minus #define GDK_KEY_minus GDK_minus
#endif #endif
#define HOTKEY_MODIFIERS (GDK_CONTROL_MASK | GDK_MOD1_MASK) #define HOTKEY_MODIFIERS (GDK_CONTROL_MASK | GDK_MOD1_MASK)
#define IGNORE_MODIFIER_MASK \
(GDK_MODIFIER_MASK & ~(GDK_LOCK_MASK | GDK_MOD2_MASK))
static const int modifier_keycode[] = { static const int modifier_keycode[] = {
/* shift, control, alt keys, meta keys, both left & right */ /* shift, control, alt keys, meta keys, both left & right */
@@ -113,6 +114,7 @@ typedef struct VirtualConsole
GtkWidget *scrolled_window; GtkWidget *scrolled_window;
CharDriverState *chr; CharDriverState *chr;
#endif #endif
int fd;
} VirtualConsole; } VirtualConsole;
typedef struct GtkDisplayState typedef struct GtkDisplayState
@@ -487,6 +489,24 @@ static void gd_mouse_mode_change(Notifier *notify, void *data)
/** GTK Events **/ /** GTK Events **/
static gboolean gd_window_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
{
GtkDisplayState *s = opaque;
gboolean handled = FALSE;
if (!gd_is_grab_active(s) ||
(key->state & IGNORE_MODIFIER_MASK) == HOTKEY_MODIFIERS) {
handled = gtk_window_activate_key(GTK_WINDOW(widget), key);
}
if (handled) {
gtk_release_modifiers(s);
} else {
handled = gtk_window_propagate_key_event(GTK_WINDOW(widget), key);
}
return handled;
}
static gboolean gd_window_close(GtkWidget *widget, GdkEvent *event, static gboolean gd_window_close(GtkWidget *widget, GdkEvent *event,
void *opaque) void *opaque)
{ {
@@ -1141,12 +1161,9 @@ static gboolean gd_focus_out_event(GtkWidget *widget,
static int gd_vc_chr_write(CharDriverState *chr, const uint8_t *buf, int len) static int gd_vc_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
{ {
#if defined(CONFIG_VTE)
VirtualConsole *vc = chr->opaque; VirtualConsole *vc = chr->opaque;
vte_terminal_feed(VTE_TERMINAL(vc->terminal), (const char *)buf, len); return vc ? write(vc->fd, buf, len) : len;
#endif
return len;
} }
static int nb_vcs; static int nb_vcs;
@@ -1172,12 +1189,19 @@ void early_gtk_display_init(void)
} }
#if defined(CONFIG_VTE) #if defined(CONFIG_VTE)
static gboolean gd_vc_in(VteTerminal *terminal, gchar *text, guint size, static gboolean gd_vc_in(GIOChannel *chan, GIOCondition cond, void *opaque)
gpointer user_data)
{ {
VirtualConsole *vc = user_data; VirtualConsole *vc = opaque;
uint8_t buffer[1024];
ssize_t len;
len = read(vc->fd, buffer, sizeof(buffer));
if (len <= 0) {
return FALSE;
}
qemu_chr_be_write(vc->chr, buffer, len);
qemu_chr_be_write(vc->chr, (uint8_t *)text, (unsigned int)size);
return TRUE; return TRUE;
} }
#endif #endif
@@ -1189,8 +1213,13 @@ static GSList *gd_vc_init(GtkDisplayState *s, VirtualConsole *vc, int index, GSL
const char *label; const char *label;
char buffer[32]; char buffer[32];
char path[32]; char path[32];
#if VTE_CHECK_VERSION(0, 26, 0)
VtePty *pty;
#endif
GIOChannel *chan;
GtkWidget *scrolled_window; GtkWidget *scrolled_window;
GtkAdjustment *vadjustment; GtkAdjustment *vadjustment;
int master_fd, slave_fd;
snprintf(buffer, sizeof(buffer), "vc%d", index); snprintf(buffer, sizeof(buffer), "vc%d", index);
snprintf(path, sizeof(path), "<QEMU>/View/VC%d", index); snprintf(path, sizeof(path), "<QEMU>/View/VC%d", index);
@@ -1209,21 +1238,27 @@ static GSList *gd_vc_init(GtkDisplayState *s, VirtualConsole *vc, int index, GSL
gtk_accel_map_add_entry(path, GDK_KEY_2 + index, HOTKEY_MODIFIERS); gtk_accel_map_add_entry(path, GDK_KEY_2 + index, HOTKEY_MODIFIERS);
vc->terminal = vte_terminal_new(); vc->terminal = vte_terminal_new();
g_signal_connect(vc->terminal, "commit", G_CALLBACK(gd_vc_in), vc);
master_fd = qemu_openpty_raw(&slave_fd, NULL);
g_assert(master_fd != -1);
#if VTE_CHECK_VERSION(0, 26, 0)
pty = vte_pty_new_foreign(master_fd, NULL);
vte_terminal_set_pty_object(VTE_TERMINAL(vc->terminal), pty);
#else
vte_terminal_set_pty(VTE_TERMINAL(vc->terminal), master_fd);
#endif
vte_terminal_set_scrollback_lines(VTE_TERMINAL(vc->terminal), -1); vte_terminal_set_scrollback_lines(VTE_TERMINAL(vc->terminal), -1);
#if VTE_CHECK_VERSION(0, 28, 0) && GTK_CHECK_VERSION(3, 0, 0)
vadjustment = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(vc->terminal));
#else
vadjustment = vte_terminal_get_adjustment(VTE_TERMINAL(vc->terminal)); vadjustment = vte_terminal_get_adjustment(VTE_TERMINAL(vc->terminal));
#endif
scrolled_window = gtk_scrolled_window_new(NULL, vadjustment); scrolled_window = gtk_scrolled_window_new(NULL, vadjustment);
gtk_container_add(GTK_CONTAINER(scrolled_window), vc->terminal); gtk_container_add(GTK_CONTAINER(scrolled_window), vc->terminal);
vte_terminal_set_size(VTE_TERMINAL(vc->terminal), 80, 25); vte_terminal_set_size(VTE_TERMINAL(vc->terminal), 80, 25);
vc->fd = slave_fd;
vc->chr->opaque = vc; vc->chr->opaque = vc;
vc->scrolled_window = scrolled_window; vc->scrolled_window = scrolled_window;
@@ -1241,6 +1276,9 @@ static GSList *gd_vc_init(GtkDisplayState *s, VirtualConsole *vc, int index, GSL
vc->chr->init(vc->chr); vc->chr->init(vc->chr);
} }
chan = g_io_channel_unix_new(vc->fd);
g_io_add_watch(chan, G_IO_IN, gd_vc_in, vc);
#endif /* CONFIG_VTE */ #endif /* CONFIG_VTE */
return group; return group;
} }
@@ -1252,6 +1290,8 @@ static void gd_connect_signals(GtkDisplayState *s)
g_signal_connect(s->show_tabs_item, "activate", g_signal_connect(s->show_tabs_item, "activate",
G_CALLBACK(gd_menu_show_tabs), s); G_CALLBACK(gd_menu_show_tabs), s);
g_signal_connect(s->window, "key-press-event",
G_CALLBACK(gd_window_key_event), s);
g_signal_connect(s->window, "delete-event", g_signal_connect(s->window, "delete-event",
G_CALLBACK(gd_window_close), s); G_CALLBACK(gd_window_close), s);
@@ -1311,6 +1351,7 @@ static GtkWidget *gd_create_menu_machine(GtkDisplayState *s, GtkAccelGroup *acce
{ {
GtkWidget *machine_menu; GtkWidget *machine_menu;
GtkWidget *separator; GtkWidget *separator;
GtkStockItem item;
machine_menu = gtk_menu_new(); machine_menu = gtk_menu_new();
gtk_menu_set_accel_group(GTK_MENU(machine_menu), accel_group); gtk_menu_set_accel_group(GTK_MENU(machine_menu), accel_group);
@@ -1321,20 +1362,20 @@ static GtkWidget *gd_create_menu_machine(GtkDisplayState *s, GtkAccelGroup *acce
separator = gtk_separator_menu_item_new(); separator = gtk_separator_menu_item_new();
gtk_menu_shell_append(GTK_MENU_SHELL(machine_menu), separator); gtk_menu_shell_append(GTK_MENU_SHELL(machine_menu), separator);
s->reset_item = gtk_menu_item_new_with_mnemonic(_("_Reset")); s->reset_item = gtk_image_menu_item_new_with_mnemonic(_("_Reset"));
gtk_menu_shell_append(GTK_MENU_SHELL(machine_menu), s->reset_item); gtk_menu_shell_append(GTK_MENU_SHELL(machine_menu), s->reset_item);
s->powerdown_item = gtk_menu_item_new_with_mnemonic(_("Power _Down")); s->powerdown_item = gtk_image_menu_item_new_with_mnemonic(_("Power _Down"));
gtk_menu_shell_append(GTK_MENU_SHELL(machine_menu), s->powerdown_item); gtk_menu_shell_append(GTK_MENU_SHELL(machine_menu), s->powerdown_item);
separator = gtk_separator_menu_item_new(); separator = gtk_separator_menu_item_new();
gtk_menu_shell_append(GTK_MENU_SHELL(machine_menu), separator); gtk_menu_shell_append(GTK_MENU_SHELL(machine_menu), separator);
s->quit_item = gtk_menu_item_new_with_mnemonic(_("_Quit")); s->quit_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);
gtk_stock_lookup(GTK_STOCK_QUIT, &item);
gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->quit_item), gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->quit_item),
"<QEMU>/Machine/Quit"); "<QEMU>/Machine/Quit");
gtk_accel_map_add_entry("<QEMU>/Machine/Quit", gtk_accel_map_add_entry("<QEMU>/Machine/Quit", item.keyval, item.modifier);
GDK_KEY_q, HOTKEY_MODIFIERS);
gtk_menu_shell_append(GTK_MENU_SHELL(machine_menu), s->quit_item); gtk_menu_shell_append(GTK_MENU_SHELL(machine_menu), s->quit_item);
return machine_menu; return machine_menu;
@@ -1350,7 +1391,8 @@ static GtkWidget *gd_create_menu_view(GtkDisplayState *s, GtkAccelGroup *accel_g
view_menu = gtk_menu_new(); view_menu = gtk_menu_new();
gtk_menu_set_accel_group(GTK_MENU(view_menu), accel_group); gtk_menu_set_accel_group(GTK_MENU(view_menu), accel_group);
s->full_screen_item = gtk_menu_item_new_with_mnemonic(_("_Fullscreen")); s->full_screen_item =
gtk_image_menu_item_new_from_stock(GTK_STOCK_FULLSCREEN, NULL);
gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->full_screen_item), gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->full_screen_item),
"<QEMU>/View/Full Screen"); "<QEMU>/View/Full Screen");
gtk_accel_map_add_entry("<QEMU>/View/Full Screen", GDK_KEY_f, gtk_accel_map_add_entry("<QEMU>/View/Full Screen", GDK_KEY_f,
@@ -1360,21 +1402,21 @@ static GtkWidget *gd_create_menu_view(GtkDisplayState *s, GtkAccelGroup *accel_g
separator = gtk_separator_menu_item_new(); separator = gtk_separator_menu_item_new();
gtk_menu_shell_append(GTK_MENU_SHELL(view_menu), separator); gtk_menu_shell_append(GTK_MENU_SHELL(view_menu), separator);
s->zoom_in_item = gtk_menu_item_new_with_mnemonic(_("Zoom _In")); s->zoom_in_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN, NULL);
gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->zoom_in_item), gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->zoom_in_item),
"<QEMU>/View/Zoom In"); "<QEMU>/View/Zoom In");
gtk_accel_map_add_entry("<QEMU>/View/Zoom In", GDK_KEY_plus, gtk_accel_map_add_entry("<QEMU>/View/Zoom In", GDK_KEY_plus,
HOTKEY_MODIFIERS); HOTKEY_MODIFIERS);
gtk_menu_shell_append(GTK_MENU_SHELL(view_menu), s->zoom_in_item); gtk_menu_shell_append(GTK_MENU_SHELL(view_menu), s->zoom_in_item);
s->zoom_out_item = gtk_menu_item_new_with_mnemonic(_("Zoom _Out")); s->zoom_out_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT, NULL);
gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->zoom_out_item), gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->zoom_out_item),
"<QEMU>/View/Zoom Out"); "<QEMU>/View/Zoom Out");
gtk_accel_map_add_entry("<QEMU>/View/Zoom Out", GDK_KEY_minus, gtk_accel_map_add_entry("<QEMU>/View/Zoom Out", GDK_KEY_minus,
HOTKEY_MODIFIERS); HOTKEY_MODIFIERS);
gtk_menu_shell_append(GTK_MENU_SHELL(view_menu), s->zoom_out_item); gtk_menu_shell_append(GTK_MENU_SHELL(view_menu), s->zoom_out_item);
s->zoom_fixed_item = gtk_menu_item_new_with_mnemonic(_("Best _Fit")); s->zoom_fixed_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_100, NULL);
gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->zoom_fixed_item), gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->zoom_fixed_item),
"<QEMU>/View/Zoom Fixed"); "<QEMU>/View/Zoom Fixed");
gtk_accel_map_add_entry("<QEMU>/View/Zoom Fixed", GDK_KEY_0, gtk_accel_map_add_entry("<QEMU>/View/Zoom Fixed", GDK_KEY_0,

View File

@@ -996,7 +996,7 @@ static void audio_add(VncState *vs)
struct audio_capture_ops ops; struct audio_capture_ops ops;
if (vs->audio_cap) { if (vs->audio_cap) {
error_report("audio already running"); monitor_printf(default_mon, "audio already running\n");
return; return;
} }
@@ -1006,7 +1006,7 @@ static void audio_add(VncState *vs)
vs->audio_cap = AUD_add_capture(&vs->as, &ops, vs); vs->audio_cap = AUD_add_capture(&vs->as, &ops, vs);
if (!vs->audio_cap) { if (!vs->audio_cap) {
error_report("Failed to add audio capture"); monitor_printf(default_mon, "Failed to add audio capture\n");
} }
} }

View File

@@ -12,7 +12,10 @@
#include "qemu-common.h" #include "qemu-common.h"
#include "qapi/error.h" #include "qapi/error.h"
#include "qemu/error-report.h" #include "qapi/qmp/qjson.h"
#include "qapi/qmp/qdict.h"
#include "qapi-types.h"
#include "qapi/qmp/qerror.h"
struct Error struct Error
{ {

View File

@@ -160,9 +160,7 @@ void init_paths(const char *prefix)
base = new_entry("", NULL, pref_buf); base = new_entry("", NULL, pref_buf);
base = add_dir_maybe(base); base = add_dir_maybe(base);
if (base->num_entries == 0) { if (base->num_entries == 0) {
g_free(base->pathname); free (base);
free(base->name);
free(base);
base = NULL; base = NULL;
} else { } else {
set_parents(base, base); set_parents(base, base);

View File

@@ -20,7 +20,7 @@ static QemuOptsList *find_list(QemuOptsList **lists, const char *group,
break; break;
} }
if (lists[i] == NULL) { if (lists[i] == NULL) {
error_setg(errp, "There is no option group '%s'", group); error_set(errp, QERR_INVALID_OPTION_GROUP, group);
} }
return lists[i]; return lists[i];
} }
@@ -39,20 +39,6 @@ QemuOptsList *qemu_find_opts(const char *group)
return ret; return ret;
} }
QemuOpts *qemu_find_opts_singleton(const char *group)
{
QemuOptsList *list;
QemuOpts *opts;
list = qemu_find_opts(group);
assert(list);
opts = qemu_opts_find(list, NULL);
if (!opts) {
opts = qemu_opts_create(list, NULL, 0, &error_abort);
}
return opts;
}
static CommandLineParameterInfoList *query_option_descs(const QemuOptDesc *desc) static CommandLineParameterInfoList *query_option_descs(const QemuOptDesc *desc)
{ {
CommandLineParameterInfoList *param_list = NULL, *entry; CommandLineParameterInfoList *param_list = NULL, *entry;

View File

@@ -20,7 +20,7 @@
*/ */
void error_vprintf(const char *fmt, va_list ap) void error_vprintf(const char *fmt, va_list ap)
{ {
if (cur_mon && !monitor_cur_is_qmp()) { if (cur_mon) {
monitor_vprintf(cur_mon, fmt, ap); monitor_vprintf(cur_mon, fmt, ap);
} else { } else {
vfprintf(stderr, fmt, ap); vfprintf(stderr, fmt, ap);
@@ -165,7 +165,7 @@ const char *error_get_progname(void)
/* /*
* Print current location to current monitor if we have one, else to stderr. * Print current location to current monitor if we have one, else to stderr.
*/ */
static void error_print_loc(void) void error_print_loc(void)
{ {
const char *sep = ""; const char *sep = "";
int i; int i;

View File

@@ -819,7 +819,7 @@ QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
opts = qemu_opts_find(list, id); opts = qemu_opts_find(list, id);
if (opts != NULL) { if (opts != NULL) {
if (fail_if_exists && !list->merge_lists) { if (fail_if_exists && !list->merge_lists) {
error_setg(errp, "Duplicate ID '%s' for %s", id, list->name); error_set(errp, QERR_DUPLICATE_ID, id, list->name);
return NULL; return NULL;
} else { } else {
return opts; return opts;

103
vl.c
View File

@@ -510,20 +510,6 @@ static QemuOptsList qemu_name_opts = {
}, },
}; };
static QemuOptsList qemu_mem_opts = {
.name = "memory",
.implied_opt_name = "size",
.head = QTAILQ_HEAD_INITIALIZER(qemu_mem_opts.head),
.merge_lists = true,
.desc = {
{
.name = "size",
.type = QEMU_OPT_SIZE,
},
{ /* end of list */ }
},
};
/** /**
* Get machine options * Get machine options
* *
@@ -531,7 +517,16 @@ static QemuOptsList qemu_mem_opts = {
*/ */
QemuOpts *qemu_get_machine_opts(void) QemuOpts *qemu_get_machine_opts(void)
{ {
return qemu_find_opts_singleton("machine"); QemuOptsList *list;
QemuOpts *opts;
list = qemu_find_opts("machine");
assert(list);
opts = qemu_opts_find(list, NULL);
if (!opts) {
opts = qemu_opts_create(list, NULL, 0, &error_abort);
}
return opts;
} }
const char *qemu_get_vm_name(void) const char *qemu_get_vm_name(void)
@@ -2969,8 +2964,6 @@ int main(int argc, char **argv, char **envp)
}; };
const char *trace_events = NULL; const char *trace_events = NULL;
const char *trace_file = NULL; const char *trace_file = NULL;
const ram_addr_t default_ram_size = (ram_addr_t)DEFAULT_RAM_SIZE *
1024 * 1024;
atexit(qemu_run_exit_notifiers); atexit(qemu_run_exit_notifiers);
error_set_progname(argv[0]); error_set_progname(argv[0]);
@@ -2994,7 +2987,6 @@ int main(int argc, char **argv, char **envp)
qemu_add_opts(&qemu_trace_opts); qemu_add_opts(&qemu_trace_opts);
qemu_add_opts(&qemu_option_rom_opts); qemu_add_opts(&qemu_option_rom_opts);
qemu_add_opts(&qemu_machine_opts); qemu_add_opts(&qemu_machine_opts);
qemu_add_opts(&qemu_mem_opts);
qemu_add_opts(&qemu_smp_opts); qemu_add_opts(&qemu_smp_opts);
qemu_add_opts(&qemu_boot_opts); qemu_add_opts(&qemu_boot_opts);
qemu_add_opts(&qemu_sandbox_opts); qemu_add_opts(&qemu_sandbox_opts);
@@ -3019,7 +3011,7 @@ int main(int argc, char **argv, char **envp)
module_call_init(MODULE_INIT_MACHINE); module_call_init(MODULE_INIT_MACHINE);
machine_class = find_default_machine(); machine_class = find_default_machine();
cpu_model = NULL; cpu_model = NULL;
ram_size = default_ram_size; ram_size = 0;
snapshot = 0; snapshot = 0;
cyls = heads = secs = 0; cyls = heads = secs = 0;
translation = BIOS_ATA_TRANSLATION_AUTO; translation = BIOS_ATA_TRANSLATION_AUTO;
@@ -3042,6 +3034,7 @@ int main(int argc, char **argv, char **envp)
if (argv[optind][0] != '-') { if (argv[optind][0] != '-') {
/* disk image */ /* disk image */
optind++; optind++;
continue;
} else { } else {
const QEMUOption *popt; const QEMUOption *popt;
@@ -3305,48 +3298,20 @@ int main(int argc, char **argv, char **envp)
exit(0); exit(0);
break; break;
case QEMU_OPTION_m: { case QEMU_OPTION_m: {
int64_t value;
uint64_t sz; uint64_t sz;
const char *mem_str; char *end;
opts = qemu_opts_parse(qemu_find_opts("memory"), value = strtosz(optarg, &end);
optarg, 1); if (value < 0 || *end) {
if (!opts) { fprintf(stderr, "qemu: invalid ram size: %s\n", optarg);
exit(EXIT_FAILURE); exit(1);
} }
sz = QEMU_ALIGN_UP((uint64_t)value, 8192);
mem_str = qemu_opt_get(opts, "size");
if (!mem_str) {
error_report("invalid -m option, missing 'size' option");
exit(EXIT_FAILURE);
}
if (!*mem_str) {
error_report("missing 'size' option value");
exit(EXIT_FAILURE);
}
sz = qemu_opt_get_size(opts, "size", ram_size);
/* Fix up legacy suffix-less format */
if (g_ascii_isdigit(mem_str[strlen(mem_str) - 1])) {
uint64_t overflow_check = sz;
sz <<= 20;
if ((sz >> 20) != overflow_check) {
error_report("too large 'size' option value");
exit(EXIT_FAILURE);
}
}
/* backward compatibility behaviour for case "-m 0" */
if (sz == 0) {
sz = default_ram_size;
}
sz = QEMU_ALIGN_UP(sz, 8192);
ram_size = sz; ram_size = sz;
if (ram_size != sz) { if (ram_size != sz) {
error_report("ram size too large"); fprintf(stderr, "qemu: ram size too large\n");
exit(EXIT_FAILURE); exit(1);
} }
break; break;
} }
@@ -3890,9 +3855,7 @@ int main(int argc, char **argv, char **envp)
} }
} }
qemu_config_write(fp); qemu_config_write(fp);
if (fp != stdout) { fclose(fp);
fclose(fp);
}
break; break;
} }
case QEMU_OPTION_qtest: case QEMU_OPTION_qtest:
@@ -4191,8 +4154,10 @@ int main(int argc, char **argv, char **envp)
exit(1); exit(1);
} }
/* store value for the future use */ /* init the memory */
qemu_opt_set_number(qemu_find_opts_singleton("memory"), "size", ram_size); if (ram_size == 0) {
ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
}
if (qemu_opts_foreach(qemu_find_opts("device"), device_help_func, NULL, 0) if (qemu_opts_foreach(qemu_find_opts("device"), device_help_func, NULL, 0)
!= 0) { != 0) {
@@ -4406,15 +4371,15 @@ int main(int argc, char **argv, char **envp)
qdev_machine_init(); qdev_machine_init();
current_machine->init_args = (QEMUMachineInitArgs) { QEMUMachineInitArgs args = { .machine = machine,
.machine = machine, .ram_size = ram_size,
.ram_size = ram_size, .boot_order = boot_order,
.boot_order = boot_order, .kernel_filename = kernel_filename,
.kernel_filename = kernel_filename, .kernel_cmdline = kernel_cmdline,
.kernel_cmdline = kernel_cmdline, .initrd_filename = initrd_filename,
.initrd_filename = initrd_filename, .cpu_model = cpu_model };
.cpu_model = cpu_model };
current_machine->init_args = args;
machine->init(&current_machine->init_args); machine->init(&current_machine->init_args);
audio_init(); audio_init();