perf: Use a user_data blob for perf_event (XCC)
[akaros.git] / kern / arch / x86 / arch.h
index bf6f85e..20efdf9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef ROS_INC_ARCH_H
-#define ROS_INC_ARCH_H
+#pragma once
 
 #include <ros/arch/arch.h>
 #include <ros/common.h>
@@ -14,8 +13,6 @@
 #define __always_inline inline __attribute__((always_inline))
 
 static inline void breakpoint(void) __attribute__((always_inline));
-static inline void invlpg(void *addr) __attribute__((always_inline));  
-static inline void tlbflush(void) __attribute__((always_inline));
 static inline void icache_flush_page(void *va, void *kva)
               __attribute__((always_inline));
 static inline uint64_t read_tsc(void) __attribute__((always_inline));
@@ -35,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);
@@ -42,24 +40,16 @@ void send_ipi(uint32_t os_coreid, uint8_t vector);
 void print_cpuinfo(void);
 void show_mapping(pgdir_t pgdir, uintptr_t start, size_t size);
 int vendor_id(char *);
+/* pmap.c */
+void invlpg(void *addr);
+void tlbflush(void);
+void tlb_flush_global(void);
 
 static inline void breakpoint(void)
 {
        asm volatile("int3");
 }
 
-static inline void invlpg(void *addr)
-{ 
-       asm volatile("invlpg (%0)" : : "r" (addr) : "memory");
-}  
-
-static inline void tlbflush(void)
-{
-       unsigned long cr3;
-       asm volatile("mov %%cr3,%0" : "=r" (cr3));
-       asm volatile("mov %0,%%cr3" : : "r" (cr3));
-}
-
 static inline void icache_flush_page(void *va, void *kva)
 {
        // x86 handles self-modifying code (mostly) without SW support
@@ -131,7 +121,7 @@ static inline void disable_irqsave(int8_t *state)
 {
        if ((*state == 0) && irq_is_enabled())
                disable_irq();
-       else 
+       else
                (*state)--;
 }
 
@@ -140,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");
@@ -199,4 +189,7 @@ static inline uint64_t max_guest_pa(void)
        return (1ULL<<40) - 1;
 }
 
-#endif /* !ROS_INC_ARCH_H */
+static inline void swap_gs(void)
+{
+       asm volatile ("swapgs");
+}