summaryrefslogtreecommitdiffstats
path: root/test/kvm-step.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2023-01-19 01:48:16 +0100
committerLouis Burda <quent.burda@gmail.com>2023-01-19 01:50:26 +0100
commit3f43dd1778c7ac8c09c3dc5612ac902c3a7ad84d (patch)
tree54367534d322feaf294bbd51d785ce066c8c27c9 /test/kvm-step.c
parentf2ea010b8180b4160d85c92e312971d0cd8a34d4 (diff)
downloadcachepc-3f43dd1778c7ac8c09c3dc5612ac902c3a7ad84d.tar.gz
cachepc-3f43dd1778c7ac8c09c3dc5612ac902c3a7ad84d.zip
Many fixes, more precise single-stepping and more robust self-tests
Diffstat (limited to 'test/kvm-step.c')
-rw-r--r--test/kvm-step.c44
1 files changed, 33 insertions, 11 deletions
diff --git a/test/kvm-step.c b/test/kvm-step.c
index 1bcaaba..6b21092 100644
--- a/test/kvm-step.c
+++ b/test/kvm-step.c
@@ -112,15 +112,20 @@ main(int argc, const char **argv)
printf("VM start\n");
- ret = ioctl(kvm.vcpufd, KVM_RUN, NULL);
- if (ret < 0) err(1, "KVM_RUN");
+ do {
+ ret = ioctl(kvm.vcpufd, KVM_RUN, NULL);
+ if (ret < 0) err(1, "KVM_RUN");
+
+ if (kvm.run->exit_reason == KVM_EXIT_HLT)
+ printf("VM halt\n");
+ } while (kvm.run->exit_reason == KVM_EXIT_HLT);
printf("VM exit\n");
} else {
pin_process(0, SECONDARY_CORE, true);
- /* single step and log all accessed pages */
- arg = CPC_TRACK_FULL;
+ /* capture baseline by just letting it fault over and over */
+ arg = CPC_TRACK_FAULT_NO_RUN;
ret = ioctl(kvm_dev, KVM_CPC_TRACK_MODE, &arg);
if (ret) err(1, "ioctl KVM_CPC_TRACK_MODE");
@@ -133,12 +138,24 @@ main(int argc, const char **argv)
/* run vm while baseline is calculated */
eventcnt = 0;
- while (eventcnt < 30) {
+ while (eventcnt < 50) {
eventcnt += monitor(&kvm, true);
}
- ret = ioctl(kvm_dev, KVM_CPC_VM_PAUSE, &event);
- if (ret) err(1, "ioctl KVM_CPC_VM_PAUSE");
+ ret = ioctl(kvm_dev, KVM_CPC_VM_REQ_PAUSE);
+ if (ret) err(1, "ioctl KVM_CPC_VM_REQ_PAUSE");
+
+ while (1) {
+ ret = ioctl(kvm_dev, KVM_CPC_POLL_EVENT, &event);
+ if (ret && errno == EAGAIN) continue;
+ if (ret) err(1, "ioctl KVM_CPC_POLL_EVENT");
+
+ if (event.type == CPC_EVENT_PAUSE) break;
+
+ printf("Skipping non-pause event..\n");
+ ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.id);
+ if (ret) err(1, "ioctl KVM_CPC_ACK_EVENT");
+ }
arg = false;
ret = ioctl(kvm_dev, KVM_CPC_CALC_BASELINE, &arg);
@@ -151,17 +168,22 @@ main(int argc, const char **argv)
print_counts(baseline);
printf("\n");
print_counts_raw(baseline);
- printf("\n");
+ printf("\n\n");
arg = true;
ret = ioctl(kvm_dev, KVM_CPC_APPLY_BASELINE, &arg);
if (ret) err(1, "ioctl KMV_CPC_APPLY_BASELINE");
- ret = ioctl(kvm_dev, KVM_CPC_VM_RESUME, &event.id);
- if (ret) err(1, "ioctl KVM_CPC_VM_RESUME");
+ /* single step and log all accessed pages */
+ arg = CPC_TRACK_FULL;
+ ret = ioctl(kvm_dev, KVM_CPC_TRACK_MODE, &arg);
+ if (ret) err(1, "ioctl KVM_CPC_TRACK_MODE");
+
+ ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.id);
+ if (ret) err(1, "ioctl KVM_CPC_ACK_EVENT");
eventcnt = 0;
- while (eventcnt < 30) {
+ while (eventcnt < 50) {
eventcnt += monitor(&kvm, false);
}