diff options
| author | Louis Burda <quent.burda@gmail.com> | 2023-01-19 01:48:16 +0100 |
|---|---|---|
| committer | Louis Burda <quent.burda@gmail.com> | 2023-01-19 01:50:26 +0100 |
| commit | 3f43dd1778c7ac8c09c3dc5612ac902c3a7ad84d (patch) | |
| tree | 54367534d322feaf294bbd51d785ce066c8c27c9 /test/kvm-step.c | |
| parent | f2ea010b8180b4160d85c92e312971d0cd8a34d4 (diff) | |
| download | cachepc-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.c | 44 |
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); } |
