From 5e21196a9c7ee8eee921d74f6b5eef2f1980ec97 Mon Sep 17 00:00:00 2001 From: Louis Burda Date: Thu, 26 Jan 2023 04:24:19 +0100 Subject: Basic qemu eviction test with signalled stepping and added rip syscall --- test/kvm.c | 103 +++++++++++++------------------------------------------------ 1 file changed, 21 insertions(+), 82 deletions(-) (limited to 'test/kvm.c') diff --git a/test/kvm.c b/test/kvm.c index b2b28fe..d50e4fe 100644 --- a/test/kvm.c +++ b/test/kvm.c @@ -100,8 +100,13 @@ sev_ioctl(int vmfd, int cmd, void *data, int *error) input.sev_fd = sev_dev; input.data = (uintptr_t) data; - ret = ioctl(vmfd, KVM_MEMORY_ENCRYPT_OP, &input); - if (error) *error = input.error; + if (vmfd == MAIN_VMFD) { + ret = ioctl(kvm_dev, KVM_CPC_MEMORY_ENCRYPT_OP, &input); + if (error) *error = input.error; + } else { + ret = ioctl(vmfd, KVM_MEMORY_ENCRYPT_OP, &input); + if (error) *error = input.error; + } return ret; } @@ -143,66 +148,6 @@ sev_guest_state(int vmfd, uint32_t handle) return status.state; } -void -sev_dbg_decrypt(int vmfd, void *src, void *dst, size_t size) -{ - struct kvm_sev_dbg enc; - int ret, fwerr; - - enc.src_uaddr = (uintptr_t) src; - enc.dst_uaddr = (uintptr_t) dst; - enc.len = size; - ret = sev_ioctl(vmfd, KVM_SEV_DBG_DECRYPT, &enc, &fwerr); - if (ret == -1) errx(1, "KVM_SEV_DBG_DECRYPT: (%s) %s", - strerror(errno), sev_fwerr_str(fwerr)); -} - -uint64_t -sev_dbg_decrypt_rip(int vmfd) -{ - uint8_t vmsa[PAGE_SIZE]; - uint64_t rip; - - memset(vmsa, 0, PAGE_SIZE); - sev_dbg_decrypt(vmfd, vmsa, CPC_VMSA_MAGIC_ADDR, PAGE_SIZE); - - rip = *(uint64_t *)(vmsa + 0x178); - - return rip; -} - -void -snp_dbg_decrypt(int vmfd, void *src, void *dst, size_t size) -{ - struct kvm_sev_dbg enc; - int ret, fwerr; - - assert(src == CPC_VMSA_MAGIC_ADDR); - - memset(&enc, 0, sizeof(struct kvm_sev_dbg)); - enc.src_uaddr = (uintptr_t) src; - enc.dst_uaddr = (uintptr_t) dst; - enc.len = size; - - ret = sev_ioctl(vmfd, KVM_SEV_DBG_DECRYPT, &enc, &fwerr); - if (ret < 0) errx(1, "KVM_SEV_DBG_DECRYPT: (%s) %s", - strerror(errno), sev_fwerr_str(fwerr)); -} - -uint64_t -snp_dbg_decrypt_rip(int vmfd) -{ - uint8_t vmsa[PAGE_SIZE]; - uint64_t rip; - - memset(vmsa, 0, PAGE_SIZE); - snp_dbg_decrypt(vmfd, CPC_VMSA_MAGIC_ADDR, vmsa, PAGE_SIZE); - - rip = *(uint64_t *)(vmsa + 0x178); - - return rip; -} - void guest_init(struct guest *guest, const char *filename) { @@ -487,6 +432,20 @@ kvm_deinit(struct kvm *kvm) munmap(kvm->run, kvm->runsize); } +uint64_t +vm_get_rip(void) +{ + struct cpc_sev_cmd cmd; + int ret, fwerr; + + cmd.id = SEV_CPC_GET_RIP; + ret = sev_ioctl(MAIN_VMFD, KVM_SEV_CACHEPC, &cmd, &fwerr); + if (ret == -1) errx(1, "KVM_SEV_CACHEPC: (%s) %s", + strerror(errno), sev_fwerr_str(fwerr)); + + return cmd.data; +} + void parse_vmtype(int argc, const char **argv) { @@ -498,26 +457,6 @@ parse_vmtype(int argc, const char **argv) errx(1, "invalid vm mode: %s", vmtype); } -uint64_t -vm_get_rip(struct kvm *kvm) -{ - struct kvm_regs regs; - uint64_t rip; - int ret; - - if (!strcmp(vmtype, "sev-snp")) { - rip = snp_dbg_decrypt_rip(kvm->vmfd); - } else if (!strcmp(vmtype, "sev-es")) { - rip = sev_dbg_decrypt_rip(kvm->vmfd); - } else { - ret = ioctl(kvm_dev, KVM_CPC_GET_REGS, ®s); - if (ret == -1) err(1, "KVM_CPC_GET_REGS"); - rip = regs.rip; - } - - return rip; -} - void vm_init(struct kvm *kvm, struct guest *guest) { -- cgit v1.2.3-71-gd317