summaryrefslogtreecommitdiffstats
path: root/test/access-detect_host.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2022-11-25 21:50:43 +0100
committerLouis Burda <quent.burda@gmail.com>2022-11-25 21:50:43 +0100
commit0bdf830ba840ce53cb1362acbf71965cd80e9397 (patch)
treef6b904a6d6fcbe63a28901603c5c6108bb6926fc /test/access-detect_host.c
parentd16af2b7f9b0026e2776237dd0ea673d88531e7d (diff)
downloadcachepc-0bdf830ba840ce53cb1362acbf71965cd80e9397.tar.gz
cachepc-0bdf830ba840ce53cb1362acbf71965cd80e9397.zip
Implement VMSA change based single stepping and guest vmmcall intercept among other things
Diffstat (limited to 'test/access-detect_host.c')
-rw-r--r--test/access-detect_host.c42
1 files changed, 29 insertions, 13 deletions
diff --git a/test/access-detect_host.c b/test/access-detect_host.c
index 9ede56f..fb68dbd 100644
--- a/test/access-detect_host.c
+++ b/test/access-detect_host.c
@@ -133,6 +133,7 @@ monitor(bool baseline)
struct cpc_event event;
cpc_msrmt_t counts[64];
uint64_t track_mode;
+ uint32_t arg;
int ret, i;
/* Get page fault info */
@@ -140,15 +141,27 @@ monitor(bool baseline)
if (!ret) {
if (event.type == CPC_EVENT_CPUID) {
printf("CPUID EVENT\n");
- if (event.cpuid.type == CPC_CPUID_START_TRACK) {
+ if (event.guest.type == CPC_CPUID_START_TRACK) {
+ arg = CPC_TRACK_DATA_ACCESS;
+ ret = ioctl(kvm_dev, KVM_CPC_TRACK_MODE, &arg);
+ if (ret == -1) err(1, "ioctl TRACK_MODE");
+
track_mode = KVM_PAGE_TRACK_ACCESS;
ret = ioctl(kvm_dev, KVM_CPC_TRACK_ALL, &track_mode);
if (ret) err(1, "ioctl TRACK_ALL");
- } else if (event.cpuid.type == CPC_CPUID_STOP_TRACK) {
+ } else if (event.guest.type == CPC_CPUID_STOP_TRACK) {
+ arg = CPC_TRACK_NONE;
+ ret = ioctl(kvm_dev, KVM_CPC_TRACK_MODE, &arg);
+ if (ret == -1) err(1, "ioctl TRACK_MODE");
+
track_mode = KVM_PAGE_TRACK_ACCESS;
ret = ioctl(kvm_dev, KVM_CPC_UNTRACK_ALL, &track_mode);
if (ret) err(1, "ioctl UNTRACK_ALL");
}
+
+ ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.id);
+ if (ret == -1) err(1, "ioctl ACK_EVENT");
+
return 0;
} else if (event.type != CPC_EVENT_TRACK) {
return 0;
@@ -175,7 +188,7 @@ monitor(bool baseline)
}
}
- ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.track.id);
+ ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.id);
if (ret == -1) err(1, "ioctl ACK_EVENT");
faultcnt++;
@@ -219,11 +232,6 @@ main(int argc, const char **argv)
ret = ioctl(kvm_dev, KVM_CPC_RESET_TRACKING, NULL);
if (ret == -1) err(1, "ioctl RESET_TRACKING");
- /* Do data access stepping */
- arg = CPC_TRACK_DATA_ACCESS;
- ret = ioctl(kvm_dev, KVM_CPC_TRACK_MODE, &arg);
- if (ret == -1) err(1, "ioctl TRACK_MODE");
-
pin_process(0, SECONDARY_CORE, true);
printf("PINNED\n");
@@ -239,21 +247,29 @@ main(int argc, const char **argv)
ret = ioctl(kvm_dev, KVM_CPC_TRACK_ALL, &arg);
if (ret) err(1, "ioctl TRACK_ALL");
+ arg = CPC_TRACK_DATA_ACCESS;
+ ret = ioctl(kvm_dev, KVM_CPC_TRACK_MODE, &arg);
+ if (ret == -1) err(1, "ioctl TRACK_MODE");
+
faultcnt = 0;
while (faultcnt < 100) {
if (monitor(true)) break;
}
- arg = KVM_PAGE_TRACK_ACCESS;
- ret = ioctl(kvm_dev, KVM_CPC_UNTRACK_ALL, &arg);
- if (ret) err(1, "ioctl TRACK_ALL");
-
do {
ret = ioctl(kvm_dev, KVM_CPC_POLL_EVENT, &event);
if (ret == -1 && errno != EAGAIN)
err(1, "ioctl POLL_EVENT");
} while (ret == -1 && errno == EAGAIN);
+ arg = CPC_TRACK_NONE;
+ ret = ioctl(kvm_dev, KVM_CPC_TRACK_MODE, &arg);
+ if (ret == -1) err(1, "ioctl TRACK_MODE");
+
+ arg = KVM_PAGE_TRACK_ACCESS;
+ ret = ioctl(kvm_dev, KVM_CPC_UNTRACK_ALL, &arg);
+ if (ret) err(1, "ioctl TRACK_ALL");
+
arg = false;
ret = ioctl(kvm_dev, KVM_CPC_MEASURE_BASELINE, &arg);
if (ret == -1) err(1, "ioctl MEASURE_BASELINE");
@@ -277,7 +293,7 @@ main(int argc, const char **argv)
ret = ioctl(kvm_dev, KVM_CPC_SUB_BASELINE, &arg);
if (ret == -1) err(1, "ioctl SUB_BASELINE");
- ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.track.id);
+ ret = ioctl(kvm_dev, KVM_CPC_ACK_EVENT, &event.id);
if (ret == -1) err(1, "ioctl ACK_EVENT");
faultcnt = 0;