summaryrefslogtreecommitdiffstats
path: root/test
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
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')
-rwxr-xr-xtest/.gitignore1
-rw-r--r--test/access-detect_guest.c6
-rw-r--r--test/access-detect_host.c42
-rwxr-xr-xtest/aes-detect_guestbin826488 -> 0 bytes
-rw-r--r--test/aes-detect_guest.c4
-rwxr-xr-xtest/aes-detect_hostbin842384 -> 0 bytes
-rw-r--r--test/aes-detect_host.c4
-rw-r--r--test/debug.c26
8 files changed, 63 insertions, 20 deletions
diff --git a/test/.gitignore b/test/.gitignore
index cf12911..09920dc 100755
--- a/test/.gitignore
+++ b/test/.gitignore
@@ -10,3 +10,4 @@ aes-detect_host
access-detect_guest
access-detect_host
readsvme
+debug
diff --git a/test/access-detect_guest.c b/test/access-detect_guest.c
index 442c88c..67e58fe 100644
--- a/test/access-detect_guest.c
+++ b/test/access-detect_guest.c
@@ -17,10 +17,10 @@ main(int argc, const char **argv)
memset(buf, 0, L1_LINESIZE * L1_SETS);
while (1) {
- CPC_CPUID_SIGNAL(CPC_CPUID_START_TRACK, 0);
+ CPC_DO_VMMCALL(CPC_CPUID_START_TRACK, 0);
- *(uint8_t *)(buf + L1_LINESIZE * 5) += 1;
+ *(uint8_t *)(buf + L1_LINESIZE * 15) += 1;
- CPC_CPUID_SIGNAL(CPC_CPUID_START_TRACK, 0);
+ CPC_DO_VMMCALL(CPC_CPUID_STOP_TRACK, 0);
}
}
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;
diff --git a/test/aes-detect_guest b/test/aes-detect_guest
deleted file mode 100755
index d482fd2..0000000
--- a/test/aes-detect_guest
+++ /dev/null
Binary files differ
diff --git a/test/aes-detect_guest.c b/test/aes-detect_guest.c
index 80a6a64..3da4044 100644
--- a/test/aes-detect_guest.c
+++ b/test/aes-detect_guest.c
@@ -39,11 +39,11 @@ main(int argc, const char **argv)
memset(buf, 0, L1_LINESIZE * L1_SETS);
while (1) {
- CPC_CPUID_SIGNAL(CPC_CPUID_START_TRACK, 0);
+ CPC_DO_VMMCALL(CPC_CPUID_START_TRACK, 0);
buf[L1_LINESIZE * 5] += 1;
- CPC_CPUID_SIGNAL(CPC_CPUID_START_TRACK, 0);
+ CPC_DO_VMMCALL(CPC_CPUID_START_TRACK, 0);
}
return 0;
diff --git a/test/aes-detect_host b/test/aes-detect_host
deleted file mode 100755
index afeafb5..0000000
--- a/test/aes-detect_host
+++ /dev/null
Binary files differ
diff --git a/test/aes-detect_host.c b/test/aes-detect_host.c
index 43b762f..ccb01fe 100644
--- a/test/aes-detect_host.c
+++ b/test/aes-detect_host.c
@@ -439,14 +439,14 @@ runonce(struct kvm *kvm)
int
monitor(void)
{
- struct cpc_track_event event;
+ struct cpc_event event;
int ret;
/* Get page fault info */
ret = ioctl(kvm_dev, KVM_CPC_POLL_EVENT, &event);
if (!ret) {
printf("Got page fault! %llu retired insts\n",
- event.retinst);
+ event.track.retinst);
faultcnt++;
printf("Acking event %llu\n", event.id);
diff --git a/test/debug.c b/test/debug.c
new file mode 100644
index 0000000..7a1e259
--- /dev/null
+++ b/test/debug.c
@@ -0,0 +1,26 @@
+#include "cachepc/uapi.h"
+
+#include <sys/ioctl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <stdint.h>
+#include <err.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int
+main(int argc, const char **argv)
+{
+ uint32_t arg;
+ int fd, ret;
+
+ fd = open("/dev/kvm", O_RDONLY);
+ if (fd < 0) err(1, "open");
+
+ arg = argc > 1 ? atoi(argv[1]) : 1;
+ ret = ioctl(fd, KVM_CPC_DEBUG, &arg);
+ if (ret == -1) err(1, "ioctl DEBUG");
+
+ close(fd);
+}