From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43909) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bjqTG-0004CU-51 for qemu-devel@nongnu.org; Tue, 13 Sep 2016 12:22:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bjqTA-0004v1-95 for qemu-devel@nongnu.org; Tue, 13 Sep 2016 12:22:05 -0400 Received: from mail-bn3nam01on0066.outbound.protection.outlook.com ([104.47.33.66]:38168 helo=NAM01-BN3-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bjqTA-0004u5-3d for qemu-devel@nongnu.org; Tue, 13 Sep 2016 12:22:00 -0400 From: Brijesh Singh Date: Tue, 13 Sep 2016 10:48:50 -0400 Message-ID: <147377813040.11859.5268138025433994743.stgit@brijesh-build-machine> In-Reply-To: <147377800565.11859.4411044563640180545.stgit@brijesh-build-machine> References: <147377800565.11859.4411044563640180545.stgit@brijesh-build-machine> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [RFC PATCH v1 12/22] sev: add SEV guest status command List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: ehabkost@redhat.com, crosthwaite.peter@gmail.com, armbru@redhat.com, mst@redhat.com, p.fedin@samsung.com, qemu-devel@nongnu.org, lcapitulino@redhat.com, pbonzini@redhat.com, rth@twiddle.net The command is used for querying SEV status for this guest. For more information see [1], section 6.10 [1] http://support.amd.com/TechDocs/55766_SEV-KM%20API_Spec.pdf The following KVM RFC patches defines and implements this command http://marc.info/?l=kvm&m=147190852423972&w=2 http://marc.info/?l=kvm&m=147190852423972&w=2 Signed-off-by: Brijesh Singh --- include/sysemu/sev.h | 18 ++++++++++++++++++ sev.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/include/sysemu/sev.h b/include/sysemu/sev.h index a505d75..e8fa62f 100644 --- a/include/sysemu/sev.h +++ b/include/sysemu/sev.h @@ -16,6 +16,15 @@ #include "sysemu/kvm.h" +typedef enum SevState { + SEV_STATE_INVALID = 0x0, + SEV_STATE_LAUNCHING, + SEV_STATE_RECEIVING, + SEV_STATE_SENDING, + SEV_STATE_RUNNING, + SEV_STATE_MAX, +} SevState; + /** * sev_init - initialize Secure Encrypted Virtualization on this guest * @kvm_state - KVM handle @@ -75,4 +84,13 @@ int kvm_sev_dbg_decrypt(uint8_t *dest, const uint8_t *src, uint32_t len); */ int kvm_sev_dbg_encrypt(uint8_t *dest, const uint8_t *src, uint32_t len); +/** + * kvm_sev_get_status - get the guest status in SEV mode. + * @state - guest SEV state + * @str - verbatim string literal (buffer must be allocated by caller) + * + * Returns: 0 on success and @state will be contain current guest state. + */ +int kvm_sev_get_status(SevState *state, char *str); + #endif diff --git a/sev.c b/sev.c index 4e5da84..508eff2 100644 --- a/sev.c +++ b/sev.c @@ -59,6 +59,15 @@ struct SEVInfo { struct kvm_sev_launch_finish *launch_finish; }; +const char *sev_state_msg[] = { + "error", + "launching", + "receiving", + "sending", + "running", + "unknown", +}; + typedef struct SEVInfo SEVInfo; static SEVInfo *sev_info; static const char *cfg_file; @@ -478,3 +487,28 @@ int kvm_sev_dbg_encrypt(uint8_t *dst, const uint8_t *src, uint32_t len) DPRINTF("SEV: DBG_ENCRYPT dst %p src %p sz %d\n", dst, src, len); return 0; } + +int kvm_sev_get_status(SevState *state, char *msg) +{ + int ret; + struct kvm_sev_guest_status status; + struct kvm_sev_issue_cmd input; + + input.cmd = KVM_SEV_GUEST_STATUS; + input.opaque = (unsigned long)&status; + ret = kvm_vm_ioctl(kvm_state, KVM_SEV_ISSUE_CMD, &input); + if (ret) { + fprintf(stderr, "SEV: guest_status failed ret=%d(%#010x)\n", + ret, input.ret_code); + return 1; + } + + *state = status.state; + if (msg) { + strcpy(msg, sev_state_msg[*state]); + } + + DPRINTF("SEV: GUEST_STATUS state %#x (%s)\n", *state, + sev_state_msg[*state]); + return 0; +}