summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2023-02-07 08:26:00 -0600
committerLouis Burda <quent.burda@gmail.com>2023-02-07 08:26:00 -0600
commitc1f2064fda3711db4878376884c36979c7b470cc (patch)
tree8dca8be1620db56687b68b583598b8b6ebe5801a
parent32331c7f421411bccb87ea818a2a0198b8cf88aa (diff)
downloadcachepc-c1f2064fda3711db4878376884c36979c7b470cc.tar.gz
cachepc-c1f2064fda3711db4878376884c36979c7b470cc.zip
Add counter for L1 misses in guest
-rw-r--r--cachepc/cachepc.h3
-rw-r--r--cachepc/const.h1
-rw-r--r--cachepc/event.c7
-rw-r--r--cachepc/event.h5
-rw-r--r--cachepc/kvm.c16
-rw-r--r--cachepc/uapi.h1
m---------linux0
-rw-r--r--test/kvm-step.c4
-rwxr-xr-xutil/disasm7
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
+