summaryrefslogtreecommitdiffstats
path: root/test/kvm-step.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/kvm-step.c')
-rw-r--r--test/kvm-step.c43
1 files changed, 18 insertions, 25 deletions
diff --git a/test/kvm-step.c b/test/kvm-step.c
index 9fefb5e..aec1aaf 100644
--- a/test/kvm-step.c
+++ b/test/kvm-step.c
@@ -24,22 +24,21 @@ static struct cpc_event event;
uint64_t
monitor(struct kvm *kvm, bool baseline)
{
- uint8_t counts[64];
+ uint8_t counts[L1_SETS];
int ret;
- /* Get page fault info */
ret = ioctl(kvm_dev, KVM_CPC_POLL_EVENT, &event);
if (ret && errno == EAGAIN) return 0;
- if (ret) err(1, "ioctl KVM_CPC_POLL_EVENT");
+ if (ret) err(1, "KVM_CPC_POLL_EVENT");
if (event.type != CPC_EVENT_TRACK_STEP)
errx(1, "unexpected event type %i", event.type);
ret = ioctl(kvm_dev, KVM_CPC_READ_COUNTS, counts);
- if (ret) err(1, "ioctl KVM_CPC_READ_COUNTS");
+ if (ret) err(1, "KVM_CPC_READ_COUNTS");
printf("Event: rip:%llu cnt:%llu inst:%llu data:%llu ret:%llu\n",
- vm_get_rip(kvm), event.step.fault_count,
+ vm_get_rip(), event.step.fault_count,
event.step.fault_gfns[0], event.step.fault_gfns[1],
event.step.retinst);
print_counts(counts);
@@ -48,7 +47,7 @@ monitor(struct kvm *kvm, bool baseline)
printf("\n");
ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.id);
- if (ret) err(1, "ioctl KVM_CPC_ACK_EVENT");
+ if (ret) err(1, "KVM_CPC_ACK_EVENT");
return 1;
}
@@ -96,7 +95,7 @@ main(int argc, const char **argv)
/* reset kernel module state */
ret = ioctl(kvm_dev, KVM_CPC_RESET, NULL);
- if (ret < 0) err(1, "ioctl KVM_CPC_RESET");
+ if (ret < 0) err(1, "KVM_CPC_RESET");
ipc_signal_parent(ipc);
ipc_wait_parent(ipc);
@@ -123,15 +122,14 @@ main(int argc, const char **argv)
printf("Monitor start\n");
- /* capture baseline by just letting it fault over and over */
- arg = CPC_TRACK_FAULT_NO_RUN;
+ /* single step and log all accessed pages */
+ arg = CPC_TRACK_STEPS;
ret = ioctl(kvm_dev, KVM_CPC_TRACK_MODE, &arg);
- if (ret) err(1, "ioctl KVM_CPC_TRACK_MODE");
+ if (ret) err(1, "KVM_CPC_TRACK_MODE");
- /* calculate baseline while running vm */
arg = true;
ret = ioctl(kvm_dev, KVM_CPC_CALC_BASELINE, &arg);
- if (ret) err(1, "ioctl KVM_CPC_CALC_BASELINE");
+ if (ret) err(1, "KVM_CPC_CALC_BASELINE");
ipc_signal_child(ipc);
@@ -141,30 +139,30 @@ main(int argc, const char **argv)
eventcnt += monitor(&kvm, true);
}
- printf("Req pause\n");
+ printf("Monitor req pause\n");
ret = ioctl(kvm_dev, KVM_CPC_VM_REQ_PAUSE);
- if (ret) err(1, "ioctl KVM_CPC_VM_REQ_PAUSE");
+ if (ret) err(1, "KVM_CPC_VM_REQ_PAUSE");
while (1) {
printf("Monitor Polling\n");
ret = ioctl(kvm_dev, KVM_CPC_POLL_EVENT, &event);
if (ret && errno == EAGAIN) continue;
- if (ret) err(1, "ioctl KVM_CPC_POLL_EVENT");
+ if (ret) err(1, "KVM_CPC_POLL_EVENT");
printf("Monitor Event\n");
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");
+ if (ret) err(1, "KVM_CPC_ACK_EVENT");
}
arg = false;
ret = ioctl(kvm_dev, KVM_CPC_CALC_BASELINE, &arg);
- if (ret) err(1, "ioctl KVM_CPC_CALC_BASELINE");
+ if (ret) err(1, "KVM_CPC_CALC_BASELINE");
ret = ioctl(kvm_dev, KVM_CPC_READ_BASELINE, baseline);
- if (ret) err(1, "ioctl KVM_CPC_READ_BASELINE");
+ if (ret) err(1, "KVM_CPC_READ_BASELINE");
printf("\nBaseline:\n");
print_counts(baseline);
@@ -174,15 +172,10 @@ main(int argc, const char **argv)
arg = true;
ret = ioctl(kvm_dev, KVM_CPC_APPLY_BASELINE, &arg);
- if (ret) err(1, "ioctl KMV_CPC_APPLY_BASELINE");
-
- /* 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");
+ if (ret) err(1, "KMV_CPC_APPLY_BASELINE");
ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.id);
- if (ret) err(1, "ioctl KVM_CPC_ACK_EVENT");
+ if (ret) err(1, "KVM_CPC_ACK_EVENT");
eventcnt = 0;
while (eventcnt < 50) {