perf: Use a user_data blob for perf_event (XCC)
[akaros.git] / kern / arch / x86 / arch.h
index 8edd5a8..20efdf9 100644 (file)
@@ -32,6 +32,7 @@ static inline void reboot(void)
               __attribute__((always_inline)) __attribute__((noreturn));
 static inline void prefetch(void *addr);
 static inline void prefetchw(void *addr);
+static inline void swap_gs(void);
 
 /* in trap.c */
 void send_ipi(uint32_t os_coreid, uint8_t vector);
@@ -120,7 +121,7 @@ static inline void disable_irqsave(int8_t *state)
 {
        if ((*state == 0) && irq_is_enabled())
                disable_irq();
-       else 
+       else
                (*state)--;
 }
 
@@ -129,8 +130,8 @@ static inline void cpu_relax(void)
        __cpu_relax();
 }
 
-/* This doesn't atomically enable interrupts and then halt, like we want, so
- * x86 needs to use a custom helper in the irq handler in trap.c. */
+/* This atomically enables interrupts and halts.  sti does not take effect until
+ * after the *next* instruction */
 static inline void cpu_halt(void)
 {
        asm volatile("sti; hlt" : : : "memory");
@@ -187,3 +188,8 @@ static inline uint64_t max_guest_pa(void)
 {
        return (1ULL<<40) - 1;
 }
+
+static inline void swap_gs(void)
+{
+       asm volatile ("swapgs");
+}