diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/kvm-step.c | 44 | ||||
| -rw-r--r-- | test/kvm-step_guest.S | 18 |
2 files changed, 44 insertions, 18 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); } diff --git a/test/kvm-step_guest.S b/test/kvm-step_guest.S index 0dfe98f..29c29f2 100644 --- a/test/kvm-step_guest.S +++ b/test/kvm-step_guest.S @@ -6,13 +6,17 @@ .global guest_stop guest_start: - mov $(L1_LINESIZE * (L1_SETS + TARGET_SET)), %rbx - mov $(L1_LINESIZE * (L1_SETS + TARGET_SET)), %rbx - mov $(L1_LINESIZE * (L1_SETS + TARGET_SET)), %rbx - mov $(L1_LINESIZE * (L1_SETS + TARGET_SET)), %rbx - mov $(L1_LINESIZE * (L1_SETS + TARGET_SET)), %rbx - mov $(L1_LINESIZE * (L1_SETS + TARGET_SET)), %rbx - mov $(L1_LINESIZE * (L1_SETS + TARGET_SET)), %rbx + mov $(L1_LINESIZE * (L1_SETS + 9)), %rbx +# hlt +# mov $(L1_LINESIZE * (L1_SETS + 10)), %rbx + mov $(L1_LINESIZE * (L1_SETS + 11)), %rbx +# hlt +# mov $(L1_LINESIZE * (L1_SETS + 12)), %rbx + mov $(L1_LINESIZE * (L1_SETS + 13)), %rbx +# hlt +# mov $(L1_LINESIZE * (L1_SETS + 14)), %rbx + mov $(L1_LINESIZE * (L1_SETS + 15)), %rbx + hlt jmp guest_start guest_stop: |
