summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/kvm-step.c44
-rw-r--r--test/kvm-step_guest.S18
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: