Fixed up register window fill code
authorAndrew Waterman <waterman@ros-dev.(none)>
Fri, 9 Apr 2010 23:29:09 +0000 (16:29 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:41 +0000 (17:35 -0700)
In preparation for (possibly) enhancing the
performance of kernel crossings sometime soon

kern/arch/sparc/spillfill.S
kern/arch/sparc/trap.c
kern/arch/sparc/trap_entry.S
kern/arch/sparc/trap_table.S

index e9d31bc..e5cf4e7 100644 (file)
@@ -63,15 +63,15 @@ handle_window_overflow:
        jmp     %l1
        rett    %l2
 
-       .global handle_window_underflow
+/*     .global handle_window_underflow
 handle_window_underflow:
        sethi   %hi(fill),%l7
        jmpl    %l7+%lo(fill),%l7
         nop
        jmp     %l1
-       rett    %l2
+       rett    %l2*/
 
-! after handling a window trap, spill/fill will return to window_rett+8,
+! after handling a window trap, spill will return to window_rett+8,
 ! so these two nops are necessary!
        .global window_rett
 window_rett:
@@ -125,30 +125,27 @@ spill_patchme:
 2:     restore
        RETHROW_TRAP(stack_pagefault)
 
-! preconditions:
-! WIM & (1<<((CWP+2)%NWINDOWS)) != 0
-! link address in %l7
-! postconditions:
-! CWP same, but (CWP+2)%NWINDOWS now valid
-! %l0, %l1, %l2, %l5, %l6 have not changed
-.global fill 
-fill:
-       mov     %g1,%l4
+.global handle_window_underflow
+handle_window_underflow:
        mov     %wim,%l3
+       mov     %g1,%l4
+       mov     %psr,%l5
        mov     %g0,%wim
 
-       ! this will be patched at runtime; 0 is really NWINDOWS-1
 .global fill_patchme
 fill_patchme:
-       srl     %l3,0,%g1
-
-       and     %g1,1,%g1
-       sll     %l3,1,%l3
-       or      %g1,%l3,%g1
+       srl     %l3,0,%l7               ! srl %l3,NWINDOWS-1,%l3
+       and     %l7,1,%l7
+       sll     %l3,1,%l6
+       or      %l7,%l6,%l6
 
        restore
        restore
-       VALIDATE_STACK(%l0,%l1,3f,4f)
+       btst    7,%sp
+       bne     2f
+        lda    [%g0] 4,%g1             ! do the fill in no-fault mode
+       or      %g1,2,%g1               ! NF = 1
+       sta     %g1,[%g0] 4
        ldd     [%sp+ 0],%l0
        ldd     [%sp+ 8],%l2
        ldd     [%sp+16],%l4
@@ -159,17 +156,34 @@ fill_patchme:
        ldd     [%sp+56],%i6
        save
        save
-       mov     %g1,%wim
-       nop
 
-       jmp     %l7+8
-       mov     %l4,%g1
+       xor     %g1,2,%g1
+       sta     %g1,[%g0] 4             ! NF = 0
+       mov     0x300,%g1
+       lda     [%g1] 4,%g1
+       btst    0x1C,%g1                ! FT != 0 ?
+       bne     1f
+        mov    %l4,%g1
+
+       // success!
+       mov     %l5,%psr
+       mov     %l6,%wim
+       jmp     %l1
+        rett   %l2
 
+1:     // page fault
+       mov     %l3,%wim
+       mov     %l5,%psr
+       set     trap_table_pagefault,%l6
+       jmp     %l6
+        nop
 
-// spill failed!
-3:     save
+2:     // fill misaligned
        save
-       RETHROW_TRAP(stack_misaligned)
-4:     save
        save
-       RETHROW_TRAP(stack_pagefault)
+       mov     %l4,%g1
+       mov     %l3,%wim
+       mov     %l5,%psr
+       set     trap_table_misaligned,%l6
+       jmp     %l6
+        nop
index fecd462..25ada49 100644 (file)
@@ -283,6 +283,20 @@ stack_fucked(trapframe_t* state)
 }
 
 void
+fill_misaligned(trapframe_t* state)
+{
+       state->tbr = (state->tbr & ~0xFFF) | 0x070;
+       stack_fucked(state);
+}
+
+void
+fill_pagefault(trapframe_t* state)
+{
+       state->tbr = (state->tbr & ~0xFFF) | 0x090;
+       stack_fucked(state);
+}
+
+void
 stack_misaligned(trapframe_t* state)
 {
        state->tbr = (state->tbr & ~0xFFF) | 0x070;
index 5ef81ca..78b4a80 100644 (file)
@@ -160,9 +160,12 @@ env_save_tf:
        lda     [%g0] 4,%o2
        or      %o2,2,%o3
        sta     %o3,[%g0] 4
-       ld      [%o1],%o1
-       st      %o1,[%o0+156]
+       mov     -1,%o3
+       ld      [%o1],%o3
+       st      %o3,[%o0+156]
        sta     %o2,[%g0] 4
+       mov     0x300,%o4
+       lda     [%o4] 4,%g0
 
        std     %g0,[%o0+ 0]
        std     %g2,[%o0+ 8]
index 120f311..3f5d8a9 100644 (file)
@@ -15,8 +15,12 @@ trap_table:
 
 #ifndef TINY_MEM
 
+.global trap_table_misaligned
+trap_table_misaligned:
        TRAP_TABLE_ENTRY(address_unaligned)     ! 0x07
        JMP(fast_fp_exception)                  ! 0x08
+.global trap_table_pagefault
+trap_table_pagefault:
        TRAP_TABLE_ENTRY(data_access_exception) ! 0x09
        UNHANDLED_TRAP                          ! 0x0A
        UNHANDLED_TRAP                          ! 0x0B