summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/eviction.c14
-rw-r--r--test/kvm-eviction.c11
-rw-r--r--test/kvm-eviction_guest.S2
-rw-r--r--test/kvm.c221
-rw-r--r--test/kvm.h2
5 files changed, 69 insertions, 181 deletions
diff --git a/test/eviction.c b/test/eviction.c
index 69103af..fc11630 100644
--- a/test/eviction.c
+++ b/test/eviction.c
@@ -1,3 +1,4 @@
+#include "test/util.h"
#include "cachepc/uapi.h"
#include <sys/ioctl.h>
@@ -14,7 +15,7 @@ main(int argc, const char **argv)
{
uint8_t counts[L1_SETS];
uint32_t set;
- int i, fd, ret;
+ int fd, ret;
fd = open("/dev/kvm", O_RDONLY);
if (fd < 0) err(1, "open");
@@ -30,16 +31,9 @@ main(int argc, const char **argv)
ret = ioctl(fd, KVM_CPC_READ_COUNTS, counts);
if (ret == -1) err(1, "ioctl KVM_CPC_READ_COUNTS");
- for (i = 0; i < 64; i++) {
- if (i % 16 == 0 && i)
- printf("\n");
- if (counts[i] > 0)
- printf("\x1b[91m");
- printf("%2i ", i);
- if (counts[i] > 0)
- printf("\x1b[0m");
- }
+ print_counts(counts);
printf("\n");
+ print_counts_raw(counts);
close(fd);
}
diff --git a/test/kvm-eviction.c b/test/kvm-eviction.c
index 9ecb6d3..0c04baa 100644
--- a/test/kvm-eviction.c
+++ b/test/kvm-eviction.c
@@ -139,6 +139,12 @@ main(int argc, const char **argv)
}
}
+ printf("=== Baseline ===\n\n", i);
+ print_counts(baseline);
+ printf("\n");
+ print_counts_raw(baseline);
+ printf("\n");
+
/* apply baseline and output samples */
for (i = 0; i < SAMPLE_COUNT; i++) {
for (k = 0; k < L1_SETS; k++) {
@@ -146,7 +152,7 @@ main(int argc, const char **argv)
counts[WITHOUT][i][k] -= baseline[k];
}
- printf("\n=== Sample %2i ===\n", i);
+ printf("=== Sample %2i ===\n", i);
printf("\nWith eviction:\n\n");
print_counts(counts[WITH][i]);
@@ -157,6 +163,7 @@ main(int argc, const char **argv)
print_counts(counts[WITHOUT][i]);
printf("\n");
print_counts_raw(counts[WITHOUT][i]);
+ printf("\n");
}
/* check for measurment errors */
@@ -174,7 +181,7 @@ main(int argc, const char **argv)
if (!counts[WITH][i][TARGET_SET])
warnx("sample %i: Missing eviction in target set %i (=%i,%i)",
i, TARGET_SET, counts[WITH][i][TARGET_SET],
- counts[WITH][i][TARGET_SET] + baseline[i]);
+ counts[WITH][i][TARGET_SET] + baseline[TARGET_SET]);
}
vm_deinit(&vms[WITH]);
diff --git a/test/kvm-eviction_guest.S b/test/kvm-eviction_guest.S
index eb04d2a..ce696cd 100644
--- a/test/kvm-eviction_guest.S
+++ b/test/kvm-eviction_guest.S
@@ -8,7 +8,7 @@
.global guest_without_stop
guest_with_start:
- movq (L1_LINESIZE * (TARGET_SET + L1_SETS)), %rbx
+ mov (L1_LINESIZE * (TARGET_SET + L1_SETS)), %rbx
hlt
jmp guest_with_start
guest_with_stop:
diff --git a/test/kvm.c b/test/kvm.c
index 1bf44d5..5b7aa12 100644
--- a/test/kvm.c
+++ b/test/kvm.c
@@ -203,27 +203,27 @@ snp_dbg_decrypt_rip(int vmfd)
}
void
-kvm_init(struct kvm *kvm, size_t ramsize,
+kvm_create_vm(struct kvm *kvm)
+{
+ kvm->vmfd = ioctl(kvm_dev, KVM_CREATE_VM, 0);
+ if (kvm->vmfd < 0) err(1, "KVM_CREATE_VM");
+}
+
+void
+kvm_init_memory(struct kvm *kvm, size_t ramsize,
void *code_start, void *code_stop)
{
struct kvm_userspace_memory_region region;
- struct kvm_regs regs;
- struct kvm_sregs sregs;
int ret;
- /* Create a kvm instance */
- kvm->vmfd = ioctl(kvm_dev, KVM_CREATE_VM, 0);
- if (kvm->vmfd < 0) err(1, "KVM_CREATE_VM");
-
- /* Allocate guest memory */
kvm->memsize = ramsize;
kvm->mem = mmap(NULL, kvm->memsize, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
- if (!kvm->mem) err(1, "Allocating guest memory");
+ if (!kvm->mem) err(1, "mmap kvm->mem");
+ memset(kvm->mem, 0, kvm->memsize);
assert(code_stop - code_start <= kvm->memsize);
memcpy(kvm->mem, code_start, code_stop - code_start);
- /* Map it into the vm */
memset(&region, 0, sizeof(region));
region.slot = 0;
region.memory_size = kvm->memsize;
@@ -231,19 +231,32 @@ kvm_init(struct kvm *kvm, size_t ramsize,
region.userspace_addr = (uintptr_t) kvm->mem;
ret = ioctl(kvm->vmfd, KVM_SET_USER_MEMORY_REGION, &region);
if (ret == -1) err(1, "KVM_SET_USER_MEMORY_REGION");
+}
+
+void
+kvm_create_vcpu(struct kvm *kvm)
+{
+ int ret;
- /* Create virtual cpu core */
kvm->vcpufd = ioctl(kvm->vmfd, KVM_CREATE_VCPU, 0);
if (kvm->vcpufd < 0) err(1, "KVM_CREATE_VCPU");
- /* Map the shared kvm_run structure and following data */
ret = ioctl(kvm_dev, KVM_GET_VCPU_MMAP_SIZE, NULL);
if (ret == -1) err(1, "KVM_GET_VCPU_MMAP_SIZE");
if (ret < sizeof(struct kvm_run))
errx(1, "KVM_GET_VCPU_MMAP_SIZE too small");
- kvm->run = mmap(NULL, ret, PROT_READ | PROT_WRITE,
+ kvm->runsize = ret;
+ kvm->run = mmap(NULL, kvm->runsize, PROT_READ | PROT_WRITE,
MAP_SHARED, kvm->vcpufd, 0);
- if (!kvm->run) err(1, "mmap vcpu");
+ if (!kvm->run) err(1, "mmap kvm->run");
+}
+
+void
+kvm_init_regs(struct kvm *kvm)
+{
+ struct kvm_regs regs;
+ struct kvm_sregs sregs;
+ int ret;
/* Initialize segment regs */
memset(&sregs, 0, sizeof(sregs));
@@ -265,72 +278,38 @@ kvm_init(struct kvm *kvm, size_t ramsize,
}
void
+kvm_init(struct kvm *kvm, size_t ramsize,
+ void *code_start, void *code_stop)
+{
+ kvm_create_vm(kvm);
+
+ kvm_init_memory(kvm, ramsize, code_start, code_stop);
+
+ kvm_create_vcpu(kvm);
+
+ kvm_init_regs(kvm);
+}
+
+void
sev_kvm_init(struct kvm *kvm, size_t ramsize,
void *code_start, void *code_stop)
{
- struct kvm_userspace_memory_region region;
struct kvm_sev_launch_update_data update;
struct kvm_sev_launch_start start;
- struct kvm_regs regs;
- struct kvm_sregs sregs;
int ret, fwerr;
- /* Create a kvm instance */
- kvm->vmfd = ioctl(kvm_dev, KVM_CREATE_VM, 0);
- if (kvm->vmfd < 0) err(1, "KVM_CREATE_VM");
+ kvm_create_vm(kvm);
- /* Allocate guest memory */
- kvm->memsize = ramsize;
- kvm->mem = mmap(NULL, kvm->memsize, PROT_READ | PROT_WRITE,
- MAP_SHARED | MAP_ANONYMOUS, -1, 0);
- if (!kvm->mem) err(1, "Allocating guest memory");
- assert(code_stop - code_start <= kvm->memsize);
- memcpy(kvm->mem, code_start, code_stop - code_start);
-
- /* Map it into the vm */
- memset(&region, 0, sizeof(region));
- region.slot = 0;
- region.memory_size = kvm->memsize;
- region.guest_phys_addr = 0;
- region.userspace_addr = (uintptr_t) kvm->mem;
- ret = ioctl(kvm->vmfd, KVM_SET_USER_MEMORY_REGION, &region);
- if (ret == -1) err(1, "KVM_SET_USER_MEMORY_REGION");
+ kvm_init_memory(kvm, ramsize, code_start, code_stop);
/* Enable SEV for vm */
ret = sev_ioctl(kvm->vmfd, KVM_SEV_INIT, NULL, &fwerr);
if (ret == -1) errx(1, "KVM_SEV_INIT: (%s) %s",
strerror(errno), sev_fwerr_str(fwerr));
- /* Create virtual cpu core */
- kvm->vcpufd = ioctl(kvm->vmfd, KVM_CREATE_VCPU, 0);
- if (kvm->vcpufd < 0) err(1, "KVM_CREATE_VCPU");
+ kvm_create_vcpu(kvm);
- /* Map the shared kvm_run structure and following data */
- ret = ioctl(kvm_dev, KVM_GET_VCPU_MMAP_SIZE, NULL);
- if (ret == -1) err(1, "KVM_GET_VCPU_MMAP_SIZE");
- if (ret < sizeof(struct kvm_run))
- errx(1, "KVM_GET_VCPU_MMAP_SIZE too small");
- kvm->run = mmap(NULL, ret, PROT_READ | PROT_WRITE,
- MAP_SHARED, kvm->vcpufd, 0);
- if (!kvm->run) err(1, "mmap vcpu");
-
- /* Initialize segment regs */
- memset(&sregs, 0, sizeof(sregs));
- ret = ioctl(kvm->vcpufd, KVM_GET_SREGS, &sregs);
- if (ret == -1) err(1, "KVM_GET_SREGS");
- sregs.cs.base = 0;
- sregs.cs.selector = 0;
- ret = ioctl(kvm->vcpufd, KVM_SET_SREGS, &sregs);
- if (ret == -1) err(1, "KVM_SET_SREGS");
-
- /* Initialize rest of registers */
- memset(&regs, 0, sizeof(regs));
- regs.rip = 0;
- regs.rsp = kvm->memsize - 8;
- regs.rbp = kvm->memsize - 8;
- regs.rflags = 0x2;
- ret = ioctl(kvm->vcpufd, KVM_SET_REGS, &regs);
- if (ret == -1) err(1, "KVM_SET_REGS");
+ kvm_init_regs(kvm);
/* Generate encryption keys and set policy */
memset(&start, 0, sizeof(start));
@@ -365,69 +344,22 @@ void
sev_es_kvm_init(struct kvm *kvm, size_t ramsize,
void *code_start, void *code_stop)
{
- struct kvm_userspace_memory_region region;
struct kvm_sev_launch_update_data update;
struct kvm_sev_launch_start start;
- struct kvm_regs regs;
- struct kvm_sregs sregs;
int ret, fwerr;
- /* Create a kvm instance */
- kvm->vmfd = ioctl(kvm_dev, KVM_CREATE_VM, 0);
- if (kvm->vmfd < 0) err(1, "KVM_CREATE_VM");
-
- /* Allocate guest memory */
- kvm->memsize = ramsize;
- kvm->mem = mmap(NULL, kvm->memsize, PROT_READ | PROT_WRITE,
- MAP_SHARED | MAP_ANONYMOUS, -1, 0);
- if (!kvm->mem) err(1, "Allocating guest memory");
- assert(code_stop - code_start <= kvm->memsize);
- memcpy(kvm->mem, code_start, code_stop - code_start);
+ kvm_create_vm(kvm);
- /* Map it into the vm */
- memset(&region, 0, sizeof(region));
- region.slot = 0;
- region.memory_size = kvm->memsize;
- region.guest_phys_addr = 0;
- region.userspace_addr = (uintptr_t) kvm->mem;
- ret = ioctl(kvm->vmfd, KVM_SET_USER_MEMORY_REGION, &region);
- if (ret == -1) err(1, "KVM_SET_USER_MEMORY_REGION");
+ kvm_init_memory(kvm, ramsize, code_start, code_stop);
/* Enable SEV for vm */
ret = sev_ioctl(kvm->vmfd, KVM_SEV_ES_INIT, NULL, &fwerr);
if (ret == -1) errx(1, "KVM_SEV_ES_INIT: (%s) %s",
strerror(errno), sev_fwerr_str(fwerr));
- /* Create virtual cpu core */
- kvm->vcpufd = ioctl(kvm->vmfd, KVM_CREATE_VCPU, 0);
- if (kvm->vcpufd < 0) err(1, "KVM_CREATE_VCPU");
-
- /* Map the shared kvm_run structure and following data */
- ret = ioctl(kvm_dev, KVM_GET_VCPU_MMAP_SIZE, NULL);
- if (ret == -1) err(1, "KVM_GET_VCPU_MMAP_SIZE");
- if (ret < sizeof(struct kvm_run))
- errx(1, "KVM_GET_VCPU_MMAP_SIZE too small");
- kvm->run = mmap(NULL, ret, PROT_READ | PROT_WRITE,
- MAP_SHARED, kvm->vcpufd, 0);
- if (!kvm->run) err(1, "mmap vcpu");
-
- /* Initialize segment regs */
- memset(&sregs, 0, sizeof(sregs));
- ret = ioctl(kvm->vcpufd, KVM_GET_SREGS, &sregs);
- if (ret == -1) err(1, "KVM_GET_SREGS");
- sregs.cs.base = 0;
- sregs.cs.selector = 0;
- ret = ioctl(kvm->vcpufd, KVM_SET_SREGS, &sregs);
- if (ret == -1) err(1, "KVM_SET_SREGS");
+ kvm_create_vcpu(kvm);
- /* Initialize rest of registers */
- memset(&regs, 0, sizeof(regs));
- regs.rip = 0;
- regs.rsp = kvm->memsize - 8;
- regs.rbp = kvm->memsize - 8;
- regs.rflags = 0x2;
- ret = ioctl(kvm->vcpufd, KVM_SET_REGS, &regs);
- if (ret == -1) err(1, "KVM_SET_REGS");
+ kvm_init_regs(kvm);
/* Generate encryption keys and set policy */
memset(&start, 0, sizeof(start));
@@ -470,33 +402,13 @@ sev_snp_kvm_init(struct kvm *kvm, size_t ramsize,
struct kvm_sev_snp_launch_update update;
struct kvm_sev_snp_launch_start start;
struct kvm_sev_snp_launch_finish finish;
- struct kvm_snp_init init;
- struct kvm_userspace_memory_region region;
struct kvm_enc_region enc_region;
- struct kvm_sregs sregs;
- struct kvm_regs regs;
+ struct kvm_snp_init init;
int ret, fwerr;
- /* Create a kvm instance */
- kvm->vmfd = ioctl(kvm_dev, KVM_CREATE_VM, 0);
- if (kvm->vmfd < 0) err(1, "KVM_CREATE_VM");
-
- /* Allocate guest memory */
- kvm->memsize = ramsize;
- kvm->mem = mmap(NULL, kvm->memsize, PROT_READ | PROT_WRITE,
- MAP_SHARED | MAP_ANONYMOUS, -1, 0);
- if (!kvm->mem) err(1, "Allocating guest memory");
- assert(code_stop - code_start <= kvm->memsize);
- memcpy(kvm->mem, code_start, code_stop - code_start);
+ kvm_create_vm(kvm);
- /* Map it into the vm */
- memset(&region, 0, sizeof(region));
- region.slot = 0;
- region.memory_size = kvm->memsize;
- region.guest_phys_addr = 0;
- region.userspace_addr = (uintptr_t) kvm->mem;
- ret = ioctl(kvm->vmfd, KVM_SET_USER_MEMORY_REGION, &region);
- if (ret == -1) err(1, "KVM_SET_USER_MEMORY_REGION");
+ kvm_init_memory(kvm, ramsize, code_start, code_stop);
/* Enable SEV for vm */
memset(&init, 0, sizeof(init));
@@ -511,35 +423,9 @@ sev_snp_kvm_init(struct kvm *kvm, size_t ramsize,
ret = ioctl(kvm->vmfd, KVM_MEMORY_ENCRYPT_REG_REGION, &enc_region);
if (ret == -1) err(1, "KVM_MEMORY_ENCRYPT_REG_REGION");
- /* Create virtual cpu */
- kvm->vcpufd = ioctl(kvm->vmfd, KVM_CREATE_VCPU, 0);
- if (kvm->vcpufd < 0) err(1, "KVM_CREATE_VCPU");
+ kvm_create_vcpu(kvm);
- /* Map the shared kvm_run structure and following data */
- ret = ioctl(kvm_dev, KVM_GET_VCPU_MMAP_SIZE, NULL);
- if (ret == -1) err(1, "KVM_GET_VCPU_MMAP_SIZE");
- if (ret < sizeof(struct kvm_run))
- errx(1, "KVM_GET_VCPU_MMAP_SIZE too small");
- kvm->run = mmap(NULL, ret, PROT_READ | PROT_WRITE,
- MAP_SHARED, kvm->vcpufd, 0);
- if (!kvm->run) err(1, "mmap vcpu");
-
- /* Initialize segment regs */
- memset(&sregs, 0, sizeof(sregs));
- ret = ioctl(kvm->vcpufd, KVM_GET_SREGS, &sregs);
- if (ret == -1) err(1, "KVM_GET_SREGS");
- sregs.cs.base = 0;
- sregs.cs.selector = 0;
- ret = ioctl(kvm->vcpufd, KVM_SET_SREGS, &sregs);
- if (ret == -1) err(1, "KVM_SET_SREGS");
-
- /* Initialize rest of registers */
- memset(&regs, 0, sizeof(regs));
- regs.rip = 0;
- regs.rsp = kvm->memsize - 8 - L1_LINESIZE * L1_SETS;
- regs.rbp = kvm->memsize - 8 - L1_LINESIZE * L1_SETS;
- ret = ioctl(kvm->vcpufd, KVM_SET_REGS, &regs);
- if (ret == -1) err(1, "KVM_SET_REGS");
+ kvm_init_regs(kvm);
/* Generate encryption keys and set policy */
memset(&start, 0, sizeof(start));
@@ -573,6 +459,7 @@ kvm_deinit(struct kvm *kvm)
close(kvm->vmfd);
close(kvm->vcpufd);
munmap(kvm->mem, kvm->memsize);
+ munmap(kvm->run, kvm->runsize);
}
void
diff --git a/test/kvm.h b/test/kvm.h
index 6605364..a7a5d54 100644
--- a/test/kvm.h
+++ b/test/kvm.h
@@ -18,7 +18,7 @@ enum {
struct kvm {
int fd, vmfd, vcpufd;
void *mem;
- size_t memsize;
+ size_t memsize, runsize;
struct kvm_run *run;
};