Fixed kernel messages on SPARC
authorAndrew Waterman <waterman@ros-dev.(none)>
Tue, 6 Apr 2010 21:57:22 +0000 (14:57 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:41 +0000 (17:35 -0700)
Additionally, made the return paths more similar to those on x86;
trap handlers now simply return, rather than explicitly popping
the trapframe.  (The wrapper around trap handlers does the pop.)

kern/arch/sparc/entry.S
kern/arch/sparc/smp.c
kern/arch/sparc/trap.c
kern/arch/sparc/trap_entry.S

index d97d45e..14d1c9c 100644 (file)
@@ -36,7 +36,7 @@ _start:
        // compute NWINDOWS
 
        mov     0,%wim                          ! mark all windows valid
-       mov (PSR_S|PSR_PS),%psr ! CWP = 0
+       mov (PSR_PIL|PSR_S|PSR_PS),%psr ! CWP = 0
        nop; nop; nop                   ! 3 insns between write -> read state reg
        save                                    ! CWP = (CWP-1) % NWINDOWS = NWINDOWS-1
        mov     %psr,%g2
index 2df8197..33d1764 100644 (file)
@@ -23,6 +23,8 @@ smp_boot(void)
        printd("Cores, report in!\n");
        time_for_smp_init = 1;
 
+       smp_percpu_init();
+
        while(*(volatile uint32_t*)&num_cpus < num_cores());
 
        printd("%d cores reporting!\n",num_cpus);
index 24b05f7..fecd462 100644 (file)
@@ -198,8 +198,6 @@ void handle_ipi(trapframe_t* tf)
                        msg_cp.pc(tf, msg_cp.srcid, msg_cp.arg0, msg_cp.arg1, msg_cp.arg2);
                }
        }
-       /* slightly different than x86 - returns from the handler directly */
-       env_pop_tf(tf);
 }
 
 /* Same as in x86.  Might be diff in the future if there is no way to check for
@@ -248,7 +246,7 @@ unhandled_trap(trapframe_t* state)
        uint32_t trap_type = (state->tbr >> 4) & 0xFF;
        get_trapname(trap_type,buf);
 
-       if(state->psr & PSR_PS)
+       if(in_kernel(state))
        {
                print_trapframe(state);
                panic("Unhandled trap in kernel!\nTrap type: %s",buf);
@@ -307,10 +305,8 @@ address_unaligned(trapframe_t* state)
 void
 instruction_access_exception(trapframe_t* state)
 {
-       if(handle_page_fault(current,state->pc,PROT_EXEC))
+       if(in_kernel(state) || handle_page_fault(current,state->pc,PROT_EXEC))
                unhandled_trap(state);
-       else
-               env_pop_tf(state);
 }
 
 void
@@ -318,10 +314,8 @@ data_access_exception(trapframe_t* state)
 {
        int prot = (state->fault_status & MMU_FSR_WR) ? PROT_WRITE : PROT_READ;
 
-       if(handle_page_fault(current,state->fault_addr,prot))
+       if(in_kernel(state) || handle_page_fault(current,state->fault_addr,prot))
                unhandled_trap(state);
-       else
-               env_pop_tf(state);
 }
 
 void
@@ -348,18 +342,15 @@ fp_exception(trapframe_t* state)
        emulate_fpu(state,&sillystate);
 
        restore_fp_state(&sillystate);
-
-       env_pop_tf(state);
 }
 
 void
 fp_disabled(trapframe_t* state)
 {
-       if(state->psr & PSR_PS)
+       if(in_kernel(state))
                panic("kernel executed an FP instruction!");
 
        state->psr |= PSR_EF;
-       env_pop_tf(state);
 }
 
 void
@@ -413,7 +404,6 @@ handle_flushw(trapframe_t* state)
        // don't actually need to do anything here.
        // trap_entry flushes user windows to the stack.
        advance_pc(state);
-       env_pop_tf(state);
 }
 
 void
@@ -421,5 +411,4 @@ handle_breakpoint(trapframe_t* state)
 {
        advance_pc(state);
        monitor(state);
-       env_pop_tf(state);
 }
index 72a6bae..5ef81ca 100644 (file)
@@ -57,24 +57,20 @@ handle_trap:
         add    %sp,64,%o0
 
        // enable traps (but not interrupts)
-       or      %l0,PSR_PIL,%l3
-       wr      %l3,0,%psr
-       wr      %l3,PSR_ET,%psr
+       or      %l0,PSR_PIL,%g3
+       wr      %g3,0,%psr
+       wr      %g3,PSR_ET,%psr
 
        // spill all trapper's windows out to the stack.
        // the 'save' may trap (triggering the spill),
        // and if the stack is corrupted, the process may die
-       mov     %l0,%g3
        mov     %sp,%g4
-
        set     NWINDOWS,%g1
        ld      [%g1],%g1
        sub     %g1,1,%g2
 5:     deccc   %g2
        bne,a   5b
 tflush:         save   %sp,0,%sp
-
-       // restore interrupt level
        mov     %g4,%sp 
        wr      %g3,PSR_ET,%psr
 
@@ -82,8 +78,56 @@ tflush:       save   %sp,0,%sp
        call    %l5
         add    %sp,64,%o0
 
-       // should never get here
-       unimp
+       // fallthrough to env_pop_tf, which is right below this function
+       add     %sp,64,%o0
+
+       // this routine only works for returning to userspace.
+       // right now, there's no mechanism to resume kernel operation after
+       // a fault
+       .global env_pop_tf
+env_pop_tf:
+       mov     %psr,%o1
+       wr      %o1,PSR_ET,%psr
+
+       // CWP = 0 (therefore 1 after rett), so set window 2 invalid
+       mov     1<<2,%wim
+       ld      [%o0+128],%o1
+       mov     %o0,%g2
+       andn    %o1,PSR_CWP,%o1
+       mov     %o1,%psr
+       nop; nop; nop
+       mov     %g2,%o0
+
+4:     // restore user context
+       restore
+       ldd     [%g2+32],%o0
+       ldd     [%g2+40],%o2
+       ldd     [%g2+48],%o4
+       ldd     [%g2+56],%o6
+       ldd     [%g2+64],%l0
+       ldd     [%g2+72],%l2
+       ldd     [%g2+80],%l4
+       ldd     [%g2+88],%l6
+       ldd     [%g2+96],%i0
+       ldd     [%g2+104],%i2
+       ldd     [%g2+112],%i4
+       ldd     [%g2+120],%i6
+       save
+
+       ld      [%o0+ 4],%g1
+       ldd     [%o0+ 8],%g2
+       ldd     [%o0+16],%g4
+       ldd     [%o0+24],%g6
+
+       ld      [%o0+132],%l1
+       ld      [%o0+136],%l2
+       ld      [%o0+148],%l5
+       mov     %l5,%y
+       ld      [%o0+152],%l5
+       mov     %l5,%asr13
+
+       jmp     %l1
+       rett    %l2
 
 // void env_save_tf(trapframe_t* tf, uint32_t trap_pc, uint32_t trap_npc)
        .global env_save_tf
@@ -145,54 +189,6 @@ env_save_tf:
        retl
         nop
 
-       // this routine only works for returning to userspace.
-       // right now, there's no mechanism to resume kernel operation after
-       // a fault
-       .global env_pop_tf
-env_pop_tf:
-       mov     %psr,%o1
-       wr      %o1,PSR_ET,%psr
-
-       // CWP = 0 (therefore 1 after rett), so set window 2 invalid
-       mov     1<<2,%wim
-       ld      [%o0+128],%o1
-       mov     %o0,%g2
-       andn    %o1,PSR_CWP,%o1
-       mov     %o1,%psr
-       nop; nop; nop
-       mov     %g2,%o0
-
-4:     // restore user context
-       restore
-       ldd     [%g2+32],%o0
-       ldd     [%g2+40],%o2
-       ldd     [%g2+48],%o4
-       ldd     [%g2+56],%o6
-       ldd     [%g2+64],%l0
-       ldd     [%g2+72],%l2
-       ldd     [%g2+80],%l4
-       ldd     [%g2+88],%l6
-       ldd     [%g2+96],%i0
-       ldd     [%g2+104],%i2
-       ldd     [%g2+112],%i4
-       ldd     [%g2+120],%i6
-       save
-
-       ld      [%o0+ 4],%g1
-       ldd     [%o0+ 8],%g2
-       ldd     [%o0+16],%g4
-       ldd     [%o0+24],%g6
-
-       ld      [%o0+132],%l1
-       ld      [%o0+136],%l2
-       ld      [%o0+148],%l5
-       mov     %l5,%y
-       ld      [%o0+152],%l5
-       mov     %l5,%asr13
-
-       jmp     %l1
-       rett    %l2
-
        .global handle_perfctr
 handle_perfctr:
        andn    %i0,7,%i1