aboutsummaryrefslogtreecommitdiff
path: root/pk/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'pk/syscall.c')
-rw-r--r--pk/syscall.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/pk/syscall.c b/pk/syscall.c
index 338ac74..f32bbe1 100644
--- a/pk/syscall.c
+++ b/pk/syscall.c
@@ -27,6 +27,30 @@ void sys_exit(int code)
if (current.t0)
printk("%ld cycles\n", rdcycle() - current.t0);
+ if (uarch_counters_enabled) {
+ size_t i = 0;
+ #define READ_CTR_FINI(name) do { \
+ while (i >= NUM_COUNTERS) ; \
+ long csr = read_csr(name); \
+ csr -= uarch_counters[i]; uarch_counter_names[i] = #name; \
+ uarch_counters[i++] = csr; \
+ } while (0)
+ READ_CTR_FINI(cycle); READ_CTR_FINI(instret);
+ READ_CTR_FINI(uarch0); READ_CTR_FINI(uarch1); READ_CTR_FINI(uarch2);
+ READ_CTR_FINI(uarch3); READ_CTR_FINI(uarch4); READ_CTR_FINI(uarch5);
+ READ_CTR_FINI(uarch6); READ_CTR_FINI(uarch7); READ_CTR_FINI(uarch8);
+ READ_CTR_FINI(uarch9); READ_CTR_FINI(uarch10); READ_CTR_FINI(uarch11);
+ READ_CTR_FINI(uarch12); READ_CTR_FINI(uarch13); READ_CTR_FINI(uarch14);
+ READ_CTR_FINI(uarch15);
+ #undef READ_CTR_FINI
+
+ for (int i = 0; i < NUM_COUNTERS; i++) {
+ if (uarch_counters[i]) {
+ printk("%s = %d\n", uarch_counter_names[i], uarch_counters[i]);
+ }
+ }
+ }
+
frontend_syscall(SYS_exit, code, 0, 0, 0, 0);
clear_csr(status, SR_EI);
while (1);