From 0bdf830ba840ce53cb1362acbf71965cd80e9397 Mon Sep 17 00:00:00 2001 From: Louis Burda Date: Fri, 25 Nov 2022 21:50:43 +0100 Subject: Implement VMSA change based single stepping and guest vmmcall intercept among other things --- test/.gitignore | 1 + test/access-detect_guest.c | 6 +++--- test/access-detect_host.c | 42 +++++++++++++++++++++++++++++------------- test/aes-detect_guest | Bin 826488 -> 0 bytes test/aes-detect_guest.c | 4 ++-- test/aes-detect_host | Bin 842384 -> 0 bytes test/aes-detect_host.c | 4 ++-- test/debug.c | 26 ++++++++++++++++++++++++++ 8 files changed, 63 insertions(+), 20 deletions(-) delete mode 100755 test/aes-detect_guest delete mode 100755 test/aes-detect_host create mode 100644 test/debug.c (limited to 'test') diff --git a/test/.gitignore b/test/.gitignore index cf12911..09920dc 100755 --- a/test/.gitignore +++ b/test/.gitignore @@ -10,3 +10,4 @@ aes-detect_host access-detect_guest access-detect_host readsvme +debug diff --git a/test/access-detect_guest.c b/test/access-detect_guest.c index 442c88c..67e58fe 100644 --- a/test/access-detect_guest.c +++ b/test/access-detect_guest.c @@ -17,10 +17,10 @@ main(int argc, const char **argv) memset(buf, 0, L1_LINESIZE * L1_SETS); while (1) { - CPC_CPUID_SIGNAL(CPC_CPUID_START_TRACK, 0); + CPC_DO_VMMCALL(CPC_CPUID_START_TRACK, 0); - *(uint8_t *)(buf + L1_LINESIZE * 5) += 1; + *(uint8_t *)(buf + L1_LINESIZE * 15) += 1; - CPC_CPUID_SIGNAL(CPC_CPUID_START_TRACK, 0); + CPC_DO_VMMCALL(CPC_CPUID_STOP_TRACK, 0); } } diff --git a/test/access-detect_host.c b/test/access-detect_host.c index 9ede56f..fb68dbd 100644 --- a/test/access-detect_host.c +++ b/test/access-detect_host.c @@ -133,6 +133,7 @@ monitor(bool baseline) struct cpc_event event; cpc_msrmt_t counts[64]; uint64_t track_mode; + uint32_t arg; int ret, i; /* Get page fault info */ @@ -140,15 +141,27 @@ monitor(bool baseline) if (!ret) { if (event.type == CPC_EVENT_CPUID) { printf("CPUID EVENT\n"); - if (event.cpuid.type == CPC_CPUID_START_TRACK) { + if (event.guest.type == CPC_CPUID_START_TRACK) { + arg = CPC_TRACK_DATA_ACCESS; + ret = ioctl(kvm_dev, KVM_CPC_TRACK_MODE, &arg); + if (ret == -1) err(1, "ioctl TRACK_MODE"); + track_mode = KVM_PAGE_TRACK_ACCESS; ret = ioctl(kvm_dev, KVM_CPC_TRACK_ALL, &track_mode); if (ret) err(1, "ioctl TRACK_ALL"); - } else if (event.cpuid.type == CPC_CPUID_STOP_TRACK) { + } else if (event.guest.type == CPC_CPUID_STOP_TRACK) { + arg = CPC_TRACK_NONE; + ret = ioctl(kvm_dev, KVM_CPC_TRACK_MODE, &arg); + if (ret == -1) err(1, "ioctl TRACK_MODE"); + track_mode = KVM_PAGE_TRACK_ACCESS; ret = ioctl(kvm_dev, KVM_CPC_UNTRACK_ALL, &track_mode); if (ret) err(1, "ioctl UNTRACK_ALL"); } + + ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.id); + if (ret == -1) err(1, "ioctl ACK_EVENT"); + return 0; } else if (event.type != CPC_EVENT_TRACK) { return 0; @@ -175,7 +188,7 @@ monitor(bool baseline) } } - ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.track.id); + ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.id); if (ret == -1) err(1, "ioctl ACK_EVENT"); faultcnt++; @@ -219,11 +232,6 @@ main(int argc, const char **argv) ret = ioctl(kvm_dev, KVM_CPC_RESET_TRACKING, NULL); if (ret == -1) err(1, "ioctl RESET_TRACKING"); - /* Do data access stepping */ - arg = CPC_TRACK_DATA_ACCESS; - ret = ioctl(kvm_dev, KVM_CPC_TRACK_MODE, &arg); - if (ret == -1) err(1, "ioctl TRACK_MODE"); - pin_process(0, SECONDARY_CORE, true); printf("PINNED\n"); @@ -239,21 +247,29 @@ main(int argc, const char **argv) ret = ioctl(kvm_dev, KVM_CPC_TRACK_ALL, &arg); if (ret) err(1, "ioctl TRACK_ALL"); + arg = CPC_TRACK_DATA_ACCESS; + ret = ioctl(kvm_dev, KVM_CPC_TRACK_MODE, &arg); + if (ret == -1) err(1, "ioctl TRACK_MODE"); + faultcnt = 0; while (faultcnt < 100) { if (monitor(true)) break; } - arg = KVM_PAGE_TRACK_ACCESS; - ret = ioctl(kvm_dev, KVM_CPC_UNTRACK_ALL, &arg); - if (ret) err(1, "ioctl TRACK_ALL"); - do { ret = ioctl(kvm_dev, KVM_CPC_POLL_EVENT, &event); if (ret == -1 && errno != EAGAIN) err(1, "ioctl POLL_EVENT"); } while (ret == -1 && errno == EAGAIN); + arg = CPC_TRACK_NONE; + ret = ioctl(kvm_dev, KVM_CPC_TRACK_MODE, &arg); + if (ret == -1) err(1, "ioctl TRACK_MODE"); + + arg = KVM_PAGE_TRACK_ACCESS; + ret = ioctl(kvm_dev, KVM_CPC_UNTRACK_ALL, &arg); + if (ret) err(1, "ioctl TRACK_ALL"); + arg = false; ret = ioctl(kvm_dev, KVM_CPC_MEASURE_BASELINE, &arg); if (ret == -1) err(1, "ioctl MEASURE_BASELINE"); @@ -277,7 +293,7 @@ main(int argc, const char **argv) ret = ioctl(kvm_dev, KVM_CPC_SUB_BASELINE, &arg); if (ret == -1) err(1, "ioctl SUB_BASELINE"); - ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.track.id); + ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.id); if (ret == -1) err(1, "ioctl ACK_EVENT"); faultcnt = 0; diff --git a/test/aes-detect_guest b/test/aes-detect_guest deleted file mode 100755 index d482fd2..0000000 Binary files a/test/aes-detect_guest and /dev/null differ diff --git a/test/aes-detect_guest.c b/test/aes-detect_guest.c index 80a6a64..3da4044 100644 --- a/test/aes-detect_guest.c +++ b/test/aes-detect_guest.c @@ -39,11 +39,11 @@ main(int argc, const char **argv) memset(buf, 0, L1_LINESIZE * L1_SETS); while (1) { - CPC_CPUID_SIGNAL(CPC_CPUID_START_TRACK, 0); + CPC_DO_VMMCALL(CPC_CPUID_START_TRACK, 0); buf[L1_LINESIZE * 5] += 1; - CPC_CPUID_SIGNAL(CPC_CPUID_START_TRACK, 0); + CPC_DO_VMMCALL(CPC_CPUID_START_TRACK, 0); } return 0; diff --git a/test/aes-detect_host b/test/aes-detect_host deleted file mode 100755 index afeafb5..0000000 Binary files a/test/aes-detect_host and /dev/null differ diff --git a/test/aes-detect_host.c b/test/aes-detect_host.c index 43b762f..ccb01fe 100644 --- a/test/aes-detect_host.c +++ b/test/aes-detect_host.c @@ -439,14 +439,14 @@ runonce(struct kvm *kvm) int monitor(void) { - struct cpc_track_event event; + struct cpc_event event; int ret; /* Get page fault info */ ret = ioctl(kvm_dev, KVM_CPC_POLL_EVENT, &event); if (!ret) { printf("Got page fault! %llu retired insts\n", - event.retinst); + event.track.retinst); faultcnt++; printf("Acking event %llu\n", event.id); diff --git a/test/debug.c b/test/debug.c new file mode 100644 index 0000000..7a1e259 --- /dev/null +++ b/test/debug.c @@ -0,0 +1,26 @@ +#include "cachepc/uapi.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +int +main(int argc, const char **argv) +{ + uint32_t arg; + int fd, ret; + + fd = open("/dev/kvm", O_RDONLY); + if (fd < 0) err(1, "open"); + + arg = argc > 1 ? atoi(argv[1]) : 1; + ret = ioctl(fd, KVM_CPC_DEBUG, &arg); + if (ret == -1) err(1, "ioctl DEBUG"); + + close(fd); +} -- cgit v1.2.3-71-gd317