diff --git a/tools/acrn-manager/README.rst b/tools/acrn-manager/README.rst index 21403f7e1..c2fef697c 100644 --- a/tools/acrn-manager/README.rst +++ b/tools/acrn-manager/README.rst @@ -27,6 +27,7 @@ You can see the available ``acrnctl`` commands by running: stop del add + pause Use acrnctl [cmd] help for details Here are some usage examples: diff --git a/tools/acrn-manager/acrn_vm_ops.c b/tools/acrn-manager/acrn_vm_ops.c index 6926d2ccb..98a474f7c 100644 --- a/tools/acrn-manager/acrn_vm_ops.c +++ b/tools/acrn-manager/acrn_vm_ops.c @@ -201,3 +201,22 @@ int stop_vm(char *vmname) return ack.err; } + +int pause_vm(char *vmname) +{ + struct req_dm_pause req; + struct ack_dm_pause ack; + + req.msg.magic = MNGR_MSG_MAGIC; + req.msg.msgid = DM_PAUSE; + req.msg.timestamp = time(NULL); + req.msg.len = sizeof(req); + + send_msg(vmname, (struct mngr_msg *)&req, + (struct mngr_msg *)&ack, sizeof(ack)); + if (ack.err) { + printf("Unable to pause vm. errno(%d)\n", ack.err); + } + + return ack.err; +} diff --git a/tools/acrn-manager/acrnctl.c b/tools/acrn-manager/acrnctl.c index e925e7d52..f9d0b7ef2 100644 --- a/tools/acrn-manager/acrnctl.c +++ b/tools/acrn-manager/acrnctl.c @@ -32,6 +32,7 @@ #define STOP_DESC "Stop virtual machine VM_NAME" #define DEL_DESC "Delete virtual machine VM_NAME" #define ADD_DESC "Add one virtual machine with SCRIPTS and OPTIONS" +#define PAUSE_DESC "Block all vCPUs of virtual machine VM_NAME" struct acrnctl_cmd { const char *cmd; @@ -377,6 +378,32 @@ static int acrnctl_do_start(int argc, char *argv[]) return 0; } +static int acrnctl_do_pause(int argc, char *argv[]) +{ + struct vmmngr_struct *s; + int i; + + for (i = 1; i < argc; i++) { + s = vmmngr_find(argv[i]); + if (!s) { + printf("Can't find vm %s\n", argv[i]); + continue; + } + + /* Send pause cmd to arcn-dm only when vm is in VM_STARTED */ + switch (s->state) { + case VM_STARTED: + pause_vm(argv[i]); + break; + default: + printf("%s current state %s, can't pause\n", + argv[i], state_str[s->state]); + } + } + + return 0; +} + /* Default args validation function */ int df_valid_args(struct acrnctl_cmd *cmd, int argc, char *argv[]) { @@ -430,6 +457,7 @@ struct acrnctl_cmd acmds[] = { ACMD("stop", acrnctl_do_stop, STOP_DESC, df_valid_args), ACMD("del", acrnctl_do_del, DEL_DESC, df_valid_args), ACMD("add", acrnctl_do_add, ADD_DESC, valid_add_args), + ACMD("pause", acrnctl_do_pause, PAUSE_DESC, df_valid_args), }; #define NCMD (sizeof(acmds)/sizeof(struct acrnctl_cmd)) diff --git a/tools/acrn-manager/acrnctl.h b/tools/acrn-manager/acrnctl.h index 733e4e0d3..9b133fdb7 100644 --- a/tools/acrn-manager/acrnctl.h +++ b/tools/acrn-manager/acrnctl.h @@ -59,5 +59,6 @@ int shell_cmd(const char *cmd, char *outbuf, int len); int list_vm(void); int stop_vm(char *vmname); int start_vm(char *vmname); +int pause_vm(char *vmname); #endif /* _ACRNCTL_H_ */