The command is used to decrypt a page of guest memory for debug. The command will be used by qemu monitor dump and gdbserver to access the guest memory for debug purposes. A typical usage look like:
cpu_physical_memory_rw_debug cpu_physical_memory_rw_debug_internal sev_debug_decrypt Signed-off-by: Brijesh Singh <brijesh.si...@amd.com> --- sev.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/sev.c b/sev.c index d32391e..f8d822d 100644 --- a/sev.c +++ b/sev.c @@ -320,6 +320,36 @@ err_1: } static int +sev_debug_decrypt(SEVState *s, uint8_t *dst, const uint8_t *src, uint32_t len) +{ + int ret, error; + struct kvm_sev_dbg *dbg; + + if (!s) { + return 1; + } + + dbg = g_malloc0(sizeof(*dbg)); + if (!dbg) { + return 1; + } + + dbg->src_addr = (unsigned long)src; + dbg->dst_addr = (unsigned long)dst; + dbg->length = len; + + ret = sev_ioctl(KVM_SEV_DBG_DECRYPT, dbg, &error); + if (ret) { + fprintf(stderr, "failed DBG_DECRYPT %d (%#x)\n", ret, error); + goto err; + } + +err: + g_free(dbg); + return ret; +} + +static int sev_mem_write(uint8_t *dst, const uint8_t *src, uint32_t len, MemTxAttrs attrs) { SEVState *s = kvm_memcrypt_get_handle(); @@ -335,7 +365,11 @@ sev_mem_write(uint8_t *dst, const uint8_t *src, uint32_t len, MemTxAttrs attrs) static int sev_mem_read(uint8_t *dst, const uint8_t *src, uint32_t len, MemTxAttrs attrs) { - return 0; + SEVState *s = kvm_memcrypt_get_handle(); + + assert(attrs.debug); + + return sev_debug_decrypt(s, dst, src, len); } void *