diff options
| -rw-r--r-- | cachepc/cachepc.h | 3 | ||||
| -rw-r--r-- | cachepc/const.h | 1 | ||||
| -rw-r--r-- | cachepc/event.c | 7 | ||||
| -rw-r--r-- | cachepc/event.h | 5 | ||||
| -rw-r--r-- | cachepc/kvm.c | 16 | ||||
| -rw-r--r-- | cachepc/uapi.h | 1 | ||||
| m--------- | linux | 0 | ||||
| -rw-r--r-- | test/kvm-step.c | 4 | ||||
| -rwxr-xr-x | util/disasm | 7 |
9 files changed, 32 insertions, 12 deletions
diff --git a/cachepc/cachepc.h b/cachepc/cachepc.h index 2eed961..3a870a4 100644 --- a/cachepc/cachepc.h +++ b/cachepc/cachepc.h @@ -104,6 +104,9 @@ extern uint8_t *cpc_baseline; extern bool cpc_baseline_measure; extern bool cpc_baseline_active; +extern uint32_t cpc_guest_misses; +extern uint32_t cpc_baseline_guest_misses; + extern uint32_t cpc_svm_exitcode; extern bool cpc_pause_vm; diff --git a/cachepc/const.h b/cachepc/const.h index 633805e..eecd877 100644 --- a/cachepc/const.h +++ b/cachepc/const.h @@ -11,6 +11,7 @@ #define CPC_L1MISS_PMC 0 #define CPC_RETINST_PMC 1 #define CPC_RETINST_USER_PMC 2 +#define CPC_L1MISS_GUEST_PMC 3 #define CPC_VMSA_MAGIC_ADDR ((void *) 0xC0FFEE) diff --git a/cachepc/event.c b/cachepc/event.c index aab1584..84d2c0c 100644 --- a/cachepc/event.c +++ b/cachepc/event.c @@ -155,7 +155,7 @@ cpc_send_pause_event(void) } int -cpc_send_track_step_event(struct list_head *list) +cpc_send_track_step_event(struct list_head *list, uint32_t guest_misses) { struct cpc_event event = { 0 }; struct cpc_fault *fault; @@ -174,6 +174,7 @@ cpc_send_track_step_event(struct list_head *list) } event.step.fault_count = count; event.step.retinst = cpc_retinst; + event.step.misses = guest_misses; return cpc_send_event(event); } @@ -195,7 +196,8 @@ cpc_send_track_page_event(uint64_t gfn_prev, uint64_t gfn, uint16_t err, } int -cpc_send_track_step_event_single(uint64_t gfn, uint32_t err, uint64_t retinst) +cpc_send_track_step_event_single(uint64_t gfn, uint32_t err, + uint64_t retinst, uint32_t guest_misses) { struct cpc_event event = { 0 }; @@ -205,6 +207,7 @@ cpc_send_track_step_event_single(uint64_t gfn, uint32_t err, uint64_t retinst) event.step.fault_errs[0] = err; event.step.inst_gfn = gfn; event.step.retinst = retinst; + event.step.misses = guest_misses; return cpc_send_event(event); } diff --git a/cachepc/event.h b/cachepc/event.h index 47a1f42..67922f4 100644 --- a/cachepc/event.h +++ b/cachepc/event.h @@ -18,8 +18,9 @@ void cpc_events_skip(void); int cpc_send_guest_event(uint64_t type, uint64_t val); int cpc_send_pause_event(void); -int cpc_send_track_step_event(struct list_head *list); -int cpc_send_track_step_event_single(uint64_t gfn, uint32_t err, uint64_t retinst); +int cpc_send_track_step_event(struct list_head *list, uint32_t guest_misses); +int cpc_send_track_step_event_single(uint64_t gfn, uint32_t err, + uint64_t retinst, uint32_t guest_misses); int cpc_send_track_page_event(uint64_t gfn_prev, uint64_t gfn, uint16_t err, uint64_t retinst, uint64_t retinst_user); diff --git a/cachepc/kvm.c b/cachepc/kvm.c index cfa3d95..4b0af5e 100644 --- a/cachepc/kvm.c +++ b/cachepc/kvm.c @@ -22,15 +22,19 @@ uint32_t cpc_loglevel = 0; EXPORT_SYMBOL(cpc_loglevel); uint8_t *cpc_msrmts = NULL; -EXPORT_SYMBOL(cpc_msrmts); - uint8_t *cpc_baseline = NULL; bool cpc_baseline_measure = false; bool cpc_baseline_active = false; +EXPORT_SYMBOL(cpc_msrmts); EXPORT_SYMBOL(cpc_baseline); EXPORT_SYMBOL(cpc_baseline_measure); EXPORT_SYMBOL(cpc_baseline_active); +uint32_t cpc_guest_misses = 0; +uint32_t cpc_baseline_guest_misses = 0; +EXPORT_SYMBOL(cpc_guest_misses); +EXPORT_SYMBOL(cpc_baseline_guest_misses); + uint32_t cpc_svm_exitcode = false; EXPORT_SYMBOL(cpc_svm_exitcode); @@ -240,11 +244,16 @@ cpc_pmc_setup(void *p) /* retired instructions in guest */ cpc_init_pmc(CPC_RETINST_PMC, 0xC0, 0x00, - PMC_GUEST, PMC_KERNEL | PMC_USER); + PMC_GUEST, PMC_USER | PMC_KERNEL); /* retired instructions in guest userspace */ cpc_init_pmc(CPC_RETINST_USER_PMC, 0xC0, 0x00, PMC_GUEST, PMC_USER); + + /* L1 misses in guest */ + cpc_init_pmc(CPC_L1MISS_GUEST_PMC, 0x64, 0xD8, + PMC_GUEST, PMC_USER | PMC_KERNEL); + } void @@ -377,6 +386,7 @@ cpc_reset_baseline_ioctl(void __user *arg_user) cpc_baseline_active = false; cpc_baseline_measure = false; memset(cpc_baseline, 0xff, L1_SETS); + cpc_baseline_guest_misses = 0xffffffff; return 0; } diff --git a/cachepc/uapi.h b/cachepc/uapi.h index 6a5c532..7dc0c69 100644 --- a/cachepc/uapi.h +++ b/cachepc/uapi.h @@ -82,6 +82,7 @@ struct cpc_track_step_event { __u64 fault_count; __u64 inst_gfn; __u64 retinst; + __u32 misses; }; struct cpc_track_page_event { diff --git a/linux b/linux -Subproject aa27d3b55fb46c7eb44e8a61aaaaae2aa6eed63 +Subproject 1caab14ce3bf1ed6ea1074e5ced4b3e5bd4e4b8 diff --git a/test/kvm-step.c b/test/kvm-step.c index 99b5dcb..a95d935 100644 --- a/test/kvm-step.c +++ b/test/kvm-step.c @@ -34,10 +34,10 @@ monitor(struct kvm *kvm, bool baseline) ret = ioctl(kvm_dev, KVM_CPC_READ_COUNTS, counts); if (ret) err(1, "KVM_CPC_READ_COUNTS"); - printf("Event: rip:%08llx cnt:%llu inst:%08llx data:%08llx ret:%llu\n", + printf("Event: rip:%08llx cnt:%llu inst:%08llx data:%08llx ret:%llu misses:%u\n", vm_get_rip(), event.step.fault_count, event.step.fault_gfns[0], event.step.fault_gfns[1], - event.step.retinst); + event.step.retinst, event.step.misses); print_counts(counts); printf("\n"); print_counts_raw(counts); diff --git a/util/disasm b/util/disasm index 99b2d21..a715687 100755 --- a/util/disasm +++ b/util/disasm @@ -5,9 +5,10 @@ if [ $# -lt 2 ]; then exit 1 fi -ARCH="i386" if [ "$2" = "guest" ]; then - ARCH="i8086" + objdump -D -b binary -m i8086 $1 +else + objdump -b binary -m i8086 --disassemble="$2" $1 fi -gdb --batch -ex "set architecture $ARCH" -ex "disassemble $2" $1 + |
