Sparc's cpu_halt() enables interrupts
[akaros.git] / kern / arch / sparc / arch.h
index 0028de0..10ca149 100644 (file)
@@ -24,6 +24,7 @@ static __inline void disable_irq(void) __attribute__((always_inline));
 static __inline void enable_irqsave(int8_t* state) __attribute__((always_inline));
 static __inline void disable_irqsave(int8_t* state) __attribute__((always_inline));
 static __inline void cpu_relax(void) __attribute__((always_inline));
+static __inline void cpu_halt(void) __attribute__((always_inline));
 static __inline void tlbflush(void) __attribute__((always_inline));
 static __inline void icache_flush_page(void* va, void* pa)__attribute__((always_inline));
 static __inline void clflush(uintptr_t* addr) __attribute__((always_inline));
@@ -36,7 +37,7 @@ static __inline uint32_t rcr3(void) __attribute__((always_inline));
 
 void print_cpuinfo(void);
 void show_mapping(uintptr_t start, size_t size);
-void cpu_halt(void);
+void __cpu_halt(void);
 
 extern uintptr_t mmu_context_tables[MAX_NUM_CPUS][NCONTEXTS+CONTEXT_TABLE_PAD];
 
@@ -147,6 +148,14 @@ cpu_relax(void)
 }
 
 static __inline void
+cpu_halt(void)
+{
+       /* TODO: this isn't atomic, but we want it to be. */
+       enable_irq();
+       __cpu_halt();
+}
+
+static __inline void
 clflush(uintptr_t* addr)
 {
        asm volatile("flush %0" : : "r"(addr));