Fixed cpu_halt on SPARC
authorAndrew Waterman <waterman@ros-dev.(none)>
Fri, 16 Apr 2010 00:00:15 +0000 (17:00 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:42 +0000 (17:35 -0700)
Return from IPI now breaks out of halt

kern/arch/sparc/arch.h
kern/arch/sparc/trap.c
kern/arch/sparc/trap_entry.S

index 5edf7c8..74f56a9 100644 (file)
@@ -24,7 +24,6 @@ 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));
@@ -38,6 +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 backtrace(void);
+void cpu_halt(void);
 
 extern uintptr_t mmu_context_tables[MAX_NUM_CPUS][NCONTEXTS+CONTEXT_TABLE_PAD];
 
@@ -148,12 +148,6 @@ cpu_relax(void)
 }
 
 static __inline void
-cpu_halt(void)
-{
-       asm volatile("1: ba 1b; nop" : : : "memory");
-}
-
-static __inline void
 clflush(uintptr_t* addr)
 {
        asm volatile("flush %0" : : "r"(addr));
index e0a1807..684fbea 100644 (file)
@@ -169,6 +169,11 @@ static kernel_message_t *get_next_amsg(struct kernel_msg_list *list_head,
  * you can send yourself an IPI, and that IPIs can get squashed like on x86. */
 void handle_ipi(trapframe_t* tf)
 {
+       if (!in_kernel(tf))
+               set_current_tf(tf);
+       else if((void*)tf->pc == &cpu_halt) // break out of the cpu_halt loop
+               advance_pc(tf);
+
        per_cpu_info_t *myinfo = &per_cpu_info[core_id()];
        kernel_message_t msg_cp, *k_msg;
 
index 78b4a80..5c23ae4 100644 (file)
@@ -200,3 +200,11 @@ handle_perfctr:
        lda     [%i1] 2,%i1
        jmp     %l2
         rett   %l2+4
+
+       // we make cpu_halt a linker symbol so we know if we were halted.
+       // if we were halted, we should return to PC+4, not PC.
+       .global cpu_halt
+cpu_halt:
+       ba,a cpu_halt
+       retl
+        nop