Loading hmp-commands.hx +2 −4 Original line number Diff line number Diff line Loading @@ -1236,8 +1236,7 @@ ETEXI .args_type = "fdname:s", .params = "getfd name", .help = "receive a file descriptor via SCM rights and assign it a name", .user_print = monitor_user_noop, .mhandler.cmd_new = do_getfd, .mhandler.cmd = hmp_getfd, }, STEXI Loading @@ -1253,8 +1252,7 @@ ETEXI .args_type = "fdname:s", .params = "closefd name", .help = "close a file descriptor previously passed via SCM rights", .user_print = monitor_user_noop, .mhandler.cmd_new = do_closefd, .mhandler.cmd = hmp_closefd, }, STEXI Loading hmp.c +18 −0 Original line number Diff line number Diff line Loading @@ -1002,3 +1002,21 @@ void hmp_netdev_del(Monitor *mon, const QDict *qdict) qmp_netdev_del(id, &err); hmp_handle_error(mon, &err); } void hmp_getfd(Monitor *mon, const QDict *qdict) { const char *fdname = qdict_get_str(qdict, "fdname"); Error *errp = NULL; qmp_getfd(fdname, &errp); hmp_handle_error(mon, &errp); } void hmp_closefd(Monitor *mon, const QDict *qdict) { const char *fdname = qdict_get_str(qdict, "fdname"); Error *errp = NULL; qmp_closefd(fdname, &errp); hmp_handle_error(mon, &errp); } hmp.h +2 −0 Original line number Diff line number Diff line Loading @@ -64,5 +64,7 @@ void hmp_device_del(Monitor *mon, const QDict *qdict); void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict); void hmp_netdev_add(Monitor *mon, const QDict *qdict); void hmp_netdev_del(Monitor *mon, const QDict *qdict); void hmp_getfd(Monitor *mon, const QDict *qdict); void hmp_closefd(Monitor *mon, const QDict *qdict); #endif monitor.c +14 −18 Original line number Diff line number Diff line Loading @@ -2307,48 +2307,45 @@ static void do_inject_mce(Monitor *mon, const QDict *qdict) } #endif static int do_getfd(Monitor *mon, const QDict *qdict, QObject **ret_data) void qmp_getfd(const char *fdname, Error **errp) { const char *fdname = qdict_get_str(qdict, "fdname"); mon_fd_t *monfd; int fd; fd = qemu_chr_fe_get_msgfd(mon->chr); fd = qemu_chr_fe_get_msgfd(cur_mon->chr); if (fd == -1) { qerror_report(QERR_FD_NOT_SUPPLIED); return -1; error_set(errp, QERR_FD_NOT_SUPPLIED); return; } if (qemu_isdigit(fdname[0])) { qerror_report(QERR_INVALID_PARAMETER_VALUE, "fdname", error_set(errp, QERR_INVALID_PARAMETER_VALUE, "fdname", "a name not starting with a digit"); return -1; return; } QLIST_FOREACH(monfd, &mon->fds, next) { QLIST_FOREACH(monfd, &cur_mon->fds, next) { if (strcmp(monfd->name, fdname) != 0) { continue; } close(monfd->fd); monfd->fd = fd; return 0; return; } monfd = g_malloc0(sizeof(mon_fd_t)); monfd->name = g_strdup(fdname); monfd->fd = fd; QLIST_INSERT_HEAD(&mon->fds, monfd, next); return 0; QLIST_INSERT_HEAD(&cur_mon->fds, monfd, next); } static int do_closefd(Monitor *mon, const QDict *qdict, QObject **ret_data) void qmp_closefd(const char *fdname, Error **errp) { const char *fdname = qdict_get_str(qdict, "fdname"); mon_fd_t *monfd; QLIST_FOREACH(monfd, &mon->fds, next) { QLIST_FOREACH(monfd, &cur_mon->fds, next) { if (strcmp(monfd->name, fdname) != 0) { continue; } Loading @@ -2357,11 +2354,10 @@ static int do_closefd(Monitor *mon, const QDict *qdict, QObject **ret_data) close(monfd->fd); g_free(monfd->name); g_free(monfd); return 0; return; } qerror_report(QERR_FD_NOT_FOUND, fdname); return -1; error_set(errp, QERR_FD_NOT_FOUND, fdname); } static void do_loadvm(Monitor *mon, const QDict *qdict) Loading qapi-schema.json +52 −15 Original line number Diff line number Diff line Loading @@ -1789,27 +1789,29 @@ # # Dump guest's memory to vmcore. It is a synchronous operation that can take # very long depending on the amount of guest memory. This command is only # supported only on i386 and x86_64 # # @paging: if true, do paging to get guest's memory mapping. The @paging's # default value of @paging is false, If you want to use gdb to process the # core, please set @paging to true. The reason why the @paging's value is # false: # 1. guest machine in a catastrophic state can have corrupted memory, # which we cannot trust. # 2. The guest machine can be in read-mode even if paging is enabled. # For example: the guest machine uses ACPI to sleep, and ACPI sleep # state goes in real-mode # supported on i386 and x86_64. # # @paging: if true, do paging to get guest's memory mapping. This allows # using gdb to process the core file. However, setting @paging to false # may be desirable because of two reasons: # # 1. The guest may be in a catastrophic state or can have corrupted # memory, which cannot be trusted # 2. The guest can be in real-mode even if paging is enabled. For example, # the guest uses ACPI to sleep, and ACPI sleep state goes in real-mode # # @protocol: the filename or file descriptor of the vmcore. The supported # protocol can be file or fd: # protocols are: # # 1. file: the protocol starts with "file:", and the following string is # the file's path. # 2. fd: the protocol starts with "fd:", and the following string is the # fd's name. # # @begin: #optional if specified, the starting physical address. # # @length: #optional if specified, the memory size, in bytes. If you don't # want to dump all guest's memory, please specify the start @begin and # @length # want to dump all guest's memory, please specify the start @begin and @length # # Returns: nothing on success # If @begin contains an invalid address, InvalidParameter Loading Loading @@ -1868,3 +1870,38 @@ # Since: 0.14.0 ## { 'command': 'netdev_del', 'data': {'id': 'str'} } ## # @getfd: # # Receive a file descriptor via SCM rights and assign it a name # # @fdname: file descriptor name # # Returns: Nothing on success # If file descriptor was not received, FdNotSupplied # If @fdname is not valid, InvalidParameterType # # Since: 0.14.0 # # Notes: If @fdname already exists, the file descriptor assigned to # it will be closed and replaced by the received file # descriptor. # The 'closefd' command can be used to explicitly close the # file descriptor when it is no longer needed. ## { 'command': 'getfd', 'data': {'fdname': 'str'} } ## # @closefd: # # Close a file descriptor previously passed via SCM rights # # @fdname: file descriptor name # # Returns: Nothing on success # If @fdname is not found, FdNotFound # # Since: 0.14.0 ## { 'command': 'closefd', 'data': {'fdname': 'str'} } Loading
hmp-commands.hx +2 −4 Original line number Diff line number Diff line Loading @@ -1236,8 +1236,7 @@ ETEXI .args_type = "fdname:s", .params = "getfd name", .help = "receive a file descriptor via SCM rights and assign it a name", .user_print = monitor_user_noop, .mhandler.cmd_new = do_getfd, .mhandler.cmd = hmp_getfd, }, STEXI Loading @@ -1253,8 +1252,7 @@ ETEXI .args_type = "fdname:s", .params = "closefd name", .help = "close a file descriptor previously passed via SCM rights", .user_print = monitor_user_noop, .mhandler.cmd_new = do_closefd, .mhandler.cmd = hmp_closefd, }, STEXI Loading
hmp.c +18 −0 Original line number Diff line number Diff line Loading @@ -1002,3 +1002,21 @@ void hmp_netdev_del(Monitor *mon, const QDict *qdict) qmp_netdev_del(id, &err); hmp_handle_error(mon, &err); } void hmp_getfd(Monitor *mon, const QDict *qdict) { const char *fdname = qdict_get_str(qdict, "fdname"); Error *errp = NULL; qmp_getfd(fdname, &errp); hmp_handle_error(mon, &errp); } void hmp_closefd(Monitor *mon, const QDict *qdict) { const char *fdname = qdict_get_str(qdict, "fdname"); Error *errp = NULL; qmp_closefd(fdname, &errp); hmp_handle_error(mon, &errp); }
hmp.h +2 −0 Original line number Diff line number Diff line Loading @@ -64,5 +64,7 @@ void hmp_device_del(Monitor *mon, const QDict *qdict); void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict); void hmp_netdev_add(Monitor *mon, const QDict *qdict); void hmp_netdev_del(Monitor *mon, const QDict *qdict); void hmp_getfd(Monitor *mon, const QDict *qdict); void hmp_closefd(Monitor *mon, const QDict *qdict); #endif
monitor.c +14 −18 Original line number Diff line number Diff line Loading @@ -2307,48 +2307,45 @@ static void do_inject_mce(Monitor *mon, const QDict *qdict) } #endif static int do_getfd(Monitor *mon, const QDict *qdict, QObject **ret_data) void qmp_getfd(const char *fdname, Error **errp) { const char *fdname = qdict_get_str(qdict, "fdname"); mon_fd_t *monfd; int fd; fd = qemu_chr_fe_get_msgfd(mon->chr); fd = qemu_chr_fe_get_msgfd(cur_mon->chr); if (fd == -1) { qerror_report(QERR_FD_NOT_SUPPLIED); return -1; error_set(errp, QERR_FD_NOT_SUPPLIED); return; } if (qemu_isdigit(fdname[0])) { qerror_report(QERR_INVALID_PARAMETER_VALUE, "fdname", error_set(errp, QERR_INVALID_PARAMETER_VALUE, "fdname", "a name not starting with a digit"); return -1; return; } QLIST_FOREACH(monfd, &mon->fds, next) { QLIST_FOREACH(monfd, &cur_mon->fds, next) { if (strcmp(monfd->name, fdname) != 0) { continue; } close(monfd->fd); monfd->fd = fd; return 0; return; } monfd = g_malloc0(sizeof(mon_fd_t)); monfd->name = g_strdup(fdname); monfd->fd = fd; QLIST_INSERT_HEAD(&mon->fds, monfd, next); return 0; QLIST_INSERT_HEAD(&cur_mon->fds, monfd, next); } static int do_closefd(Monitor *mon, const QDict *qdict, QObject **ret_data) void qmp_closefd(const char *fdname, Error **errp) { const char *fdname = qdict_get_str(qdict, "fdname"); mon_fd_t *monfd; QLIST_FOREACH(monfd, &mon->fds, next) { QLIST_FOREACH(monfd, &cur_mon->fds, next) { if (strcmp(monfd->name, fdname) != 0) { continue; } Loading @@ -2357,11 +2354,10 @@ static int do_closefd(Monitor *mon, const QDict *qdict, QObject **ret_data) close(monfd->fd); g_free(monfd->name); g_free(monfd); return 0; return; } qerror_report(QERR_FD_NOT_FOUND, fdname); return -1; error_set(errp, QERR_FD_NOT_FOUND, fdname); } static void do_loadvm(Monitor *mon, const QDict *qdict) Loading
qapi-schema.json +52 −15 Original line number Diff line number Diff line Loading @@ -1789,27 +1789,29 @@ # # Dump guest's memory to vmcore. It is a synchronous operation that can take # very long depending on the amount of guest memory. This command is only # supported only on i386 and x86_64 # # @paging: if true, do paging to get guest's memory mapping. The @paging's # default value of @paging is false, If you want to use gdb to process the # core, please set @paging to true. The reason why the @paging's value is # false: # 1. guest machine in a catastrophic state can have corrupted memory, # which we cannot trust. # 2. The guest machine can be in read-mode even if paging is enabled. # For example: the guest machine uses ACPI to sleep, and ACPI sleep # state goes in real-mode # supported on i386 and x86_64. # # @paging: if true, do paging to get guest's memory mapping. This allows # using gdb to process the core file. However, setting @paging to false # may be desirable because of two reasons: # # 1. The guest may be in a catastrophic state or can have corrupted # memory, which cannot be trusted # 2. The guest can be in real-mode even if paging is enabled. For example, # the guest uses ACPI to sleep, and ACPI sleep state goes in real-mode # # @protocol: the filename or file descriptor of the vmcore. The supported # protocol can be file or fd: # protocols are: # # 1. file: the protocol starts with "file:", and the following string is # the file's path. # 2. fd: the protocol starts with "fd:", and the following string is the # fd's name. # # @begin: #optional if specified, the starting physical address. # # @length: #optional if specified, the memory size, in bytes. If you don't # want to dump all guest's memory, please specify the start @begin and # @length # want to dump all guest's memory, please specify the start @begin and @length # # Returns: nothing on success # If @begin contains an invalid address, InvalidParameter Loading Loading @@ -1868,3 +1870,38 @@ # Since: 0.14.0 ## { 'command': 'netdev_del', 'data': {'id': 'str'} } ## # @getfd: # # Receive a file descriptor via SCM rights and assign it a name # # @fdname: file descriptor name # # Returns: Nothing on success # If file descriptor was not received, FdNotSupplied # If @fdname is not valid, InvalidParameterType # # Since: 0.14.0 # # Notes: If @fdname already exists, the file descriptor assigned to # it will be closed and replaced by the received file # descriptor. # The 'closefd' command can be used to explicitly close the # file descriptor when it is no longer needed. ## { 'command': 'getfd', 'data': {'fdname': 'str'} } ## # @closefd: # # Close a file descriptor previously passed via SCM rights # # @fdname: file descriptor name # # Returns: Nothing on success # If @fdname is not found, FdNotFound # # Since: 0.14.0 ## { 'command': 'closefd', 'data': {'fdname': 'str'} }