#include "qapi/qmp-input-visitor.h"
#include "hw/boards.h"
#include "qom/object_interfaces.h"
+#include "hw/mem/pc-dimm.h"
+#include "hw/acpi/acpi_dev_interface.h"
NameInfo *qmp_query_name(Error **errp)
{
return info;
}
-VersionInfo *qmp_query_version(Error **err)
+VersionInfo *qmp_query_version(Error **errp)
{
VersionInfo *info = g_malloc0(sizeof(*info));
const char *version = QEMU_VERSION;
return info;
}
-void qmp_quit(Error **err)
+void qmp_quit(Error **errp)
{
no_shutdown = 0;
qemu_system_shutdown_request();
MachineClass *mc;
mc = MACHINE_GET_CLASS(current_machine);
- if (mc->qemu_machine->hot_add_cpu) {
- mc->qemu_machine->hot_add_cpu(id, errp);
+ if (mc->hot_add_cpu) {
+ mc->hot_add_cpu(id, errp);
} else {
error_setg(errp, "Not supported");
}
};
#endif
-static void iostatus_bdrv_it(void *opaque, BlockDriverState *bs)
-{
- bdrv_iostatus_reset(bs);
-}
-
-static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs)
-{
- Error **err = opaque;
-
- if (!error_is_set(err) && bdrv_key_required(bs)) {
- error_set(err, QERR_DEVICE_ENCRYPTED, bdrv_get_device_name(bs),
- bdrv_get_encrypted_filename(bs));
- }
-}
-
void qmp_cont(Error **errp)
{
- Error *local_err = NULL;
+ BlockDriverState *bs;
if (runstate_needs_reset()) {
- error_set(errp, QERR_RESET_REQUIRED);
+ error_setg(errp, "Resetting the Virtual Machine is required");
return;
} else if (runstate_check(RUN_STATE_SUSPENDED)) {
return;
}
- bdrv_iterate(iostatus_bdrv_it, NULL);
- bdrv_iterate(encrypted_bdrv_it, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- return;
+ for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
+ bdrv_iostatus_reset(bs);
+ }
+ for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
+ if (bdrv_key_required(bs)) {
+ error_set(errp, QERR_DEVICE_ENCRYPTED,
+ bdrv_get_device_name(bs),
+ bdrv_get_encrypted_filename(bs));
+ return;
+ }
}
if (runstate_check(RUN_STATE_INMIGRATE)) {
obj = object_resolve_path(path, &ambiguous);
if (obj == NULL) {
- error_set(errp, QERR_DEVICE_NOT_FOUND, path);
+ if (ambiguous) {
+ error_setg(errp, "Path '%s' is ambiguous", path);
+ } else {
+ error_set(errp, QERR_DEVICE_NOT_FOUND, path);
+ }
return NULL;
}
#endif /* !CONFIG_VNC */
void qmp_change(const char *device, const char *target,
- bool has_arg, const char *arg, Error **err)
+ bool has_arg, const char *arg, Error **errp)
{
if (strcmp(device, "vnc") == 0) {
- qmp_change_vnc(target, has_arg, arg, err);
+ qmp_change_vnc(target, has_arg, arg, errp);
} else {
- qmp_change_blockdev(device, target, arg, err);
+ qmp_change_blockdev(device, target, arg, errp);
}
}
Visitor *v, Error **errp)
{
Object *obj;
+ ObjectClass *klass;
const QDictEntry *e;
Error *local_err = NULL;
- if (!object_class_by_name(type)) {
- error_setg(errp, "invalid class name");
+ klass = object_class_by_name(type);
+ if (!klass) {
+ error_setg(errp, "invalid object type: %s", type);
+ 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;
}
}
}
- if (!object_dynamic_cast(obj, TYPE_USER_CREATABLE)) {
- error_setg(&local_err, "object type '%s' isn't supported by object-add",
- type);
+ object_property_add_child(container_get(object_get_root(), "/objects"),
+ id, obj, &local_err);
+ if (local_err) {
goto out;
}
user_creatable_complete(obj, &local_err);
if (local_err) {
+ object_property_del(container_get(object_get_root(), "/objects"),
+ id, &error_abort);
goto out;
}
-
- object_property_add_child(container_get(object_get_root(), "/objects"),
- id, obj, &local_err);
out:
if (local_err) {
error_propagate(errp, local_err);
}
object_unparent(obj);
}
+
+MemoryDeviceInfoList *qmp_query_memory_devices(Error **errp)
+{
+ MemoryDeviceInfoList *head = NULL;
+ MemoryDeviceInfoList **prev = &head;
+
+ qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
+
+ return head;
+}
+
+ACPIOSTInfoList *qmp_query_acpi_ospm_status(Error **errp)
+{
+ bool ambig;
+ ACPIOSTInfoList *head = NULL;
+ ACPIOSTInfoList **prev = &head;
+ Object *obj = object_resolve_path_type("", TYPE_ACPI_DEVICE_IF, &ambig);
+
+ if (obj) {
+ AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(obj);
+ AcpiDeviceIf *adev = ACPI_DEVICE_IF(obj);
+
+ adevc->ospm_status(adev, &prev);
+ } else {
+ error_setg(errp, "command is not supported, missing ACPI device");
+ }
+
+ return head;
+}