diff options
| author | Louis Burda <quent.burda@gmail.com> | 2022-11-25 21:50:43 +0100 |
|---|---|---|
| committer | Louis Burda <quent.burda@gmail.com> | 2022-11-25 21:50:43 +0100 |
| commit | 0bdf830ba840ce53cb1362acbf71965cd80e9397 (patch) | |
| tree | f6b904a6d6fcbe63a28901603c5c6108bb6926fc /test/access-detect_host.c | |
| parent | d16af2b7f9b0026e2776237dd0ea673d88531e7d (diff) | |
| download | cachepc-0bdf830ba840ce53cb1362acbf71965cd80e9397.tar.gz cachepc-0bdf830ba840ce53cb1362acbf71965cd80e9397.zip | |
Implement VMSA change based single stepping and guest vmmcall intercept among other things
Diffstat (limited to 'test/access-detect_host.c')
| -rw-r--r-- | test/access-detect_host.c | 42 |
1 files changed, 29 insertions, 13 deletions
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; |
