BXE: min->MIN, plus an spatch
[akaros.git] / kern / include / smp.h
index 7f2b9ab..b7e0797 100644 (file)
 typedef sharC_env_t;
 #endif
 
+#define CPU_STATE_IRQ                  0
+#define CPU_STATE_KERNEL               1
+#define CPU_STATE_USER                 2
+#define CPU_STATE_IDLE                 3
+#define NR_CPU_STATES                  4
+
+static char *cpu_state_names[NR_CPU_STATES] =
+{
+       "irq",
+       "kern",
+       "user",
+       "idle",
+};
+
 struct per_cpu_info {
 #ifdef CONFIG_X86_64
-       uintptr_t stacktop;
-       /* the rip at the last clock interrupt. For profiling. */
-       uintptr_t rip;
+       uintptr_t stacktop;                     /* must be first */
+       int coreid;                                     /* must be second */
        /* virtual machines */
        /* this is all kind of gross, but so it goes. Kmalloc
         * the vmxarea. It varies in size depending on the architecture.
@@ -56,7 +69,9 @@ struct per_cpu_info {
        struct timer_chain tchain;      /* for the per-core alarm */
        unsigned int lock_depth;
        struct trace_ring traces;
-
+       int cpu_state;
+       uint64_t last_tick_cnt;
+       uint64_t state_ticks[NR_CPU_STATES];
 #ifdef __SHARC__
        // held spin-locks. this will have to go elsewhere if multiple kernel
        // threads can share a CPU.
@@ -97,6 +112,9 @@ void smp_idle(void) __attribute__((noreturn));
 void smp_percpu_init(void); // this must be called by each core individually
 void __arch_pcpu_init(uint32_t coreid);        /* each arch has one of these */
 
+void __set_cpu_state(struct per_cpu_info *pcpui, int state);
+void reset_cpu_state_ticks(int coreid);
+
 /* SMP utility functions */
 int smp_call_function_self(isr_t handler, void *data,
                            handler_wrapper_t **wait_wrapper);