x86: vmm: Finalize to owning_proc, not cur_proc.
[akaros.git] / kern / arch / x86 / perfmon.h
index e084584..060eecc 100644 (file)
@@ -1,21 +1,72 @@
+/* Copyright (c) 2015 Google Inc
+ * Davide Libenzi <dlibenzi@google.com>
+ * See LICENSE for details.
+ */
+
 #pragma once
+
+#include <sys/types.h>
 #include <ros/common.h>
+#include <ros/arch/perfmon.h>
 #include <arch/x86.h>
+#include <atomic.h>
+#include <core_set.h>
+#include <stdint.h>
+#include <kthread.h>
+
+#define MAX_VAR_COUNTERS 32
+#define MAX_FIX_COUNTERS 16
+#define MAX_PERFMON_COUNTERS (MAX_VAR_COUNTERS + MAX_FIX_COUNTERS)
+#define INVALID_COUNTER INT32_MIN
+
+struct hw_trapframe;
+
+typedef int32_t counter_t;
 
-#define IA32_PMC_BASE 0xC1
-#define IA32_PERFEVTSEL_BASE 0x186
+struct perfmon_cpu_caps {
+       uint32_t perfmon_version;
+       uint32_t proc_arch_events;
+       uint32_t bits_x_counter;
+       uint32_t counters_x_proc;
+       uint32_t bits_x_fix_counter;
+       uint32_t fix_counters_x_proc;
+};
 
-#define LLCACHE_EVENT 0x2E
-#define LLCACHE_MISS_MASK 0x41
-#define LLCACHE_REF_MASK 0x4F
-#define ENABLE_PERFCTR 0x00400000
-#define DISABLE_PERFCTR 0xFFAFFFFF
+struct perfmon_alloc {
+       struct perfmon_event ev;
+       counter_t cores_counters[0];
+};
+
+struct perfmon_session {
+       qlock_t qlock;
+       struct perfmon_alloc *allocs[MAX_PERFMON_COUNTERS];
+};
+
+struct perfmon_status {
+       struct perfmon_event ev;
+       uint64_t cores_values[0];
+};
+
+bool perfmon_supported(void);
+void perfmon_global_init(void);
+void perfmon_pcpu_init(void);
+void perfmon_snapshot_hwtf(struct hw_trapframe *hw_tf);
+void perfmon_snapshot_vmtf(struct vm_trapframe *vm_tf);
+void perfmon_interrupt(struct hw_trapframe *hw_tf, void *data);
+void perfmon_get_cpu_caps(struct perfmon_cpu_caps *pcc);
+int perfmon_open_event(const struct core_set *cset, struct perfmon_session *ps,
+                                          const struct perfmon_event *pev);
+void perfmon_close_event(struct perfmon_session *ps, int ped);
+struct perfmon_status *perfmon_get_event_status(struct perfmon_session *ps,
+                                                                                               int ped);
+void perfmon_free_event_status(struct perfmon_status *pef);
+struct perfmon_session *perfmon_create_session(void);
+void perfmon_close_session(struct perfmon_session *ps);
 
 static inline uint64_t read_pmc(uint32_t index)
 {
        uint32_t edx, eax;
+
        asm volatile("rdpmc" : "=d"(edx), "=a"(eax) : "c"(index));
-       return (uint64_t)edx << 32 | eax;
+       return ((uint64_t) edx << 32) | eax;
 }
-
-void perfmon_init();