sparc32: introduce support for run-time patching for all shared assembler code
All users of MMUREGS ASI in kernel/ now uses run-time patching. Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Cc: Daniel Hellstrom <daniel@gaisler.com> Cc: Konrad Eisele <konrad@gaisler.com>
This commit is contained in:
committed by
David S. Miller
parent
080f88837b
commit
1ec8cf6233
@@ -767,8 +767,11 @@ srmmu_fault:
|
|||||||
mov 0x400, %l5
|
mov 0x400, %l5
|
||||||
mov 0x300, %l4
|
mov 0x300, %l4
|
||||||
|
|
||||||
lda [%l5] ASI_M_MMUREGS, %l6 ! read sfar first
|
LEON_PI(lda [%l5] ASI_LEON_MMUREGS, %l6) ! read sfar first
|
||||||
lda [%l4] ASI_M_MMUREGS, %l5 ! read sfsr last
|
SUN_PI_(lda [%l5] ASI_M_MMUREGS, %l6) ! read sfar first
|
||||||
|
|
||||||
|
LEON_PI(lda [%l4] ASI_LEON_MMUREGS, %l5) ! read sfsr last
|
||||||
|
SUN_PI_(lda [%l4] ASI_M_MMUREGS, %l5) ! read sfsr last
|
||||||
|
|
||||||
andn %l6, 0xfff, %l6
|
andn %l6, 0xfff, %l6
|
||||||
srl %l5, 6, %l5 ! and encode all info into l7
|
srl %l5, 6, %l5 ! and encode all info into l7
|
||||||
|
@@ -234,7 +234,8 @@ tsetup_srmmu_stackchk:
|
|||||||
|
|
||||||
cmp %glob_tmp, %sp
|
cmp %glob_tmp, %sp
|
||||||
bleu,a 1f
|
bleu,a 1f
|
||||||
lda [%g0] ASI_M_MMUREGS, %glob_tmp ! read MMU control
|
LEON_PI( lda [%g0] ASI_LEON_MMUREGS, %glob_tmp) ! read MMU control
|
||||||
|
SUN_PI_( lda [%g0] ASI_M_MMUREGS, %glob_tmp) ! read MMU control
|
||||||
|
|
||||||
trap_setup_user_stack_is_bolixed:
|
trap_setup_user_stack_is_bolixed:
|
||||||
/* From user/kernel into invalid window w/bad user
|
/* From user/kernel into invalid window w/bad user
|
||||||
@@ -249,18 +250,25 @@ trap_setup_user_stack_is_bolixed:
|
|||||||
1:
|
1:
|
||||||
/* Clear the fault status and turn on the no_fault bit. */
|
/* Clear the fault status and turn on the no_fault bit. */
|
||||||
or %glob_tmp, 0x2, %glob_tmp ! or in no_fault bit
|
or %glob_tmp, 0x2, %glob_tmp ! or in no_fault bit
|
||||||
sta %glob_tmp, [%g0] ASI_M_MMUREGS ! set it
|
LEON_PI(sta %glob_tmp, [%g0] ASI_LEON_MMUREGS) ! set it
|
||||||
|
SUN_PI_(sta %glob_tmp, [%g0] ASI_M_MMUREGS) ! set it
|
||||||
|
|
||||||
/* Dump the registers and cross fingers. */
|
/* Dump the registers and cross fingers. */
|
||||||
STORE_WINDOW(sp)
|
STORE_WINDOW(sp)
|
||||||
|
|
||||||
/* Clear the no_fault bit and check the status. */
|
/* Clear the no_fault bit and check the status. */
|
||||||
andn %glob_tmp, 0x2, %glob_tmp
|
andn %glob_tmp, 0x2, %glob_tmp
|
||||||
sta %glob_tmp, [%g0] ASI_M_MMUREGS
|
LEON_PI(sta %glob_tmp, [%g0] ASI_LEON_MMUREGS)
|
||||||
|
SUN_PI_(sta %glob_tmp, [%g0] ASI_M_MMUREGS)
|
||||||
|
|
||||||
mov AC_M_SFAR, %glob_tmp
|
mov AC_M_SFAR, %glob_tmp
|
||||||
lda [%glob_tmp] ASI_M_MMUREGS, %g0
|
LEON_PI(lda [%glob_tmp] ASI_LEON_MMUREGS, %g0)
|
||||||
|
SUN_PI_(lda [%glob_tmp] ASI_M_MMUREGS, %g0)
|
||||||
|
|
||||||
mov AC_M_SFSR, %glob_tmp
|
mov AC_M_SFSR, %glob_tmp
|
||||||
lda [%glob_tmp] ASI_M_MMUREGS, %glob_tmp ! save away status of winstore
|
LEON_PI(lda [%glob_tmp] ASI_LEON_MMUREGS, %glob_tmp)! save away status of winstore
|
||||||
|
SUN_PI_(lda [%glob_tmp] ASI_M_MMUREGS, %glob_tmp) ! save away status of winstore
|
||||||
|
|
||||||
andcc %glob_tmp, 0x2, %g0 ! did we fault?
|
andcc %glob_tmp, 0x2, %g0 ! did we fault?
|
||||||
bne trap_setup_user_stack_is_bolixed ! failure
|
bne trap_setup_user_stack_is_bolixed ! failure
|
||||||
nop
|
nop
|
||||||
|
@@ -231,11 +231,14 @@ srmmu_rett_stackchk:
|
|||||||
cmp %g1, %fp
|
cmp %g1, %fp
|
||||||
bleu ret_trap_user_stack_is_bolixed
|
bleu ret_trap_user_stack_is_bolixed
|
||||||
mov AC_M_SFSR, %g1
|
mov AC_M_SFSR, %g1
|
||||||
lda [%g1] ASI_M_MMUREGS, %g0
|
LEON_PI(lda [%g1] ASI_LEON_MMUREGS, %g0)
|
||||||
|
SUN_PI_(lda [%g1] ASI_M_MMUREGS, %g0)
|
||||||
|
|
||||||
lda [%g0] ASI_M_MMUREGS, %g1
|
LEON_PI(lda [%g0] ASI_LEON_MMUREGS, %g1)
|
||||||
|
SUN_PI_(lda [%g0] ASI_M_MMUREGS, %g1)
|
||||||
or %g1, 0x2, %g1
|
or %g1, 0x2, %g1
|
||||||
sta %g1, [%g0] ASI_M_MMUREGS
|
LEON_PI(sta %g1, [%g0] ASI_LEON_MMUREGS)
|
||||||
|
SUN_PI_(sta %g1, [%g0] ASI_M_MMUREGS)
|
||||||
|
|
||||||
restore %g0, %g0, %g0
|
restore %g0, %g0, %g0
|
||||||
|
|
||||||
@@ -244,13 +247,16 @@ srmmu_rett_stackchk:
|
|||||||
save %g0, %g0, %g0
|
save %g0, %g0, %g0
|
||||||
|
|
||||||
andn %g1, 0x2, %g1
|
andn %g1, 0x2, %g1
|
||||||
sta %g1, [%g0] ASI_M_MMUREGS
|
LEON_PI(sta %g1, [%g0] ASI_LEON_MMUREGS)
|
||||||
|
SUN_PI_(sta %g1, [%g0] ASI_M_MMUREGS)
|
||||||
|
|
||||||
mov AC_M_SFAR, %g2
|
mov AC_M_SFAR, %g2
|
||||||
lda [%g2] ASI_M_MMUREGS, %g2
|
LEON_PI(lda [%g2] ASI_LEON_MMUREGS, %g2)
|
||||||
|
SUN_PI_(lda [%g2] ASI_M_MMUREGS, %g2)
|
||||||
|
|
||||||
mov AC_M_SFSR, %g1
|
mov AC_M_SFSR, %g1
|
||||||
lda [%g1] ASI_M_MMUREGS, %g1
|
LEON_PI(lda [%g1] ASI_LEON_MMUREGS, %g1)
|
||||||
|
SUN_PI_(lda [%g1] ASI_M_MMUREGS, %g1)
|
||||||
andcc %g1, 0x2, %g0
|
andcc %g1, 0x2, %g0
|
||||||
be ret_trap_userwins_ok
|
be ret_trap_userwins_ok
|
||||||
nop
|
nop
|
||||||
|
@@ -332,24 +332,30 @@ spwin_srmmu_stackchk:
|
|||||||
mov AC_M_SFSR, %glob_tmp
|
mov AC_M_SFSR, %glob_tmp
|
||||||
|
|
||||||
/* Clear the fault status and turn on the no_fault bit. */
|
/* Clear the fault status and turn on the no_fault bit. */
|
||||||
lda [%glob_tmp] ASI_M_MMUREGS, %g0 ! eat SFSR
|
LEON_PI(lda [%glob_tmp] ASI_LEON_MMUREGS, %g0) ! eat SFSR
|
||||||
|
SUN_PI_(lda [%glob_tmp] ASI_M_MMUREGS, %g0) ! eat SFSR
|
||||||
|
|
||||||
lda [%g0] ASI_M_MMUREGS, %glob_tmp ! read MMU control
|
LEON_PI(lda [%g0] ASI_LEON_MMUREGS, %glob_tmp) ! read MMU control
|
||||||
|
SUN_PI_(lda [%g0] ASI_M_MMUREGS, %glob_tmp) ! read MMU control
|
||||||
or %glob_tmp, 0x2, %glob_tmp ! or in no_fault bit
|
or %glob_tmp, 0x2, %glob_tmp ! or in no_fault bit
|
||||||
sta %glob_tmp, [%g0] ASI_M_MMUREGS ! set it
|
LEON_PI(sta %glob_tmp, [%g0] ASI_LEON_MMUREGS) ! set it
|
||||||
|
SUN_PI_(sta %glob_tmp, [%g0] ASI_M_MMUREGS) ! set it
|
||||||
|
|
||||||
/* Dump the registers and cross fingers. */
|
/* Dump the registers and cross fingers. */
|
||||||
STORE_WINDOW(sp)
|
STORE_WINDOW(sp)
|
||||||
|
|
||||||
/* Clear the no_fault bit and check the status. */
|
/* Clear the no_fault bit and check the status. */
|
||||||
andn %glob_tmp, 0x2, %glob_tmp
|
andn %glob_tmp, 0x2, %glob_tmp
|
||||||
sta %glob_tmp, [%g0] ASI_M_MMUREGS
|
LEON_PI(sta %glob_tmp, [%g0] ASI_LEON_MMUREGS)
|
||||||
|
SUN_PI_(sta %glob_tmp, [%g0] ASI_M_MMUREGS)
|
||||||
|
|
||||||
mov AC_M_SFAR, %glob_tmp
|
mov AC_M_SFAR, %glob_tmp
|
||||||
lda [%glob_tmp] ASI_M_MMUREGS, %g0
|
LEON_PI(lda [%glob_tmp] ASI_LEON_MMUREGS, %g0)
|
||||||
|
SUN_PI_(lda [%glob_tmp] ASI_M_MMUREGS, %g0)
|
||||||
|
|
||||||
mov AC_M_SFSR, %glob_tmp
|
mov AC_M_SFSR, %glob_tmp
|
||||||
lda [%glob_tmp] ASI_M_MMUREGS, %glob_tmp
|
LEON_PI(lda [%glob_tmp] ASI_LEON_MMUREGS, %glob_tmp)
|
||||||
|
SUN_PI_(lda [%glob_tmp] ASI_M_MMUREGS, %glob_tmp)
|
||||||
andcc %glob_tmp, 0x2, %g0 ! did we fault?
|
andcc %glob_tmp, 0x2, %g0 ! did we fault?
|
||||||
be,a spwin_finish_up + 0x4 ! cool beans, success
|
be,a spwin_finish_up + 0x4 ! cool beans, success
|
||||||
restore %g0, %g0, %g0
|
restore %g0, %g0, %g0
|
||||||
|
@@ -254,16 +254,19 @@ srmmu_fwin_stackchk:
|
|||||||
mov AC_M_SFSR, %l4
|
mov AC_M_SFSR, %l4
|
||||||
cmp %l5, %sp
|
cmp %l5, %sp
|
||||||
bleu fwin_user_stack_is_bolixed
|
bleu fwin_user_stack_is_bolixed
|
||||||
lda [%l4] ASI_M_MMUREGS, %g0 ! clear fault status
|
LEON_PI( lda [%l4] ASI_LEON_MMUREGS, %g0) ! clear fault status
|
||||||
|
SUN_PI_( lda [%l4] ASI_M_MMUREGS, %g0) ! clear fault status
|
||||||
|
|
||||||
/* The technique is, turn off faults on this processor,
|
/* The technique is, turn off faults on this processor,
|
||||||
* just let the load rip, then check the sfsr to see if
|
* just let the load rip, then check the sfsr to see if
|
||||||
* a fault did occur. Then we turn on fault traps again
|
* a fault did occur. Then we turn on fault traps again
|
||||||
* and branch conditionally based upon what happened.
|
* and branch conditionally based upon what happened.
|
||||||
*/
|
*/
|
||||||
lda [%g0] ASI_M_MMUREGS, %l5 ! read mmu-ctrl reg
|
LEON_PI(lda [%g0] ASI_LEON_MMUREGS, %l5) ! read mmu-ctrl reg
|
||||||
|
SUN_PI_(lda [%g0] ASI_M_MMUREGS, %l5) ! read mmu-ctrl reg
|
||||||
or %l5, 0x2, %l5 ! turn on no-fault bit
|
or %l5, 0x2, %l5 ! turn on no-fault bit
|
||||||
sta %l5, [%g0] ASI_M_MMUREGS ! store it
|
LEON_PI(sta %l5, [%g0] ASI_LEON_MMUREGS) ! store it
|
||||||
|
SUN_PI_(sta %l5, [%g0] ASI_M_MMUREGS) ! store it
|
||||||
|
|
||||||
/* Cross fingers and go for it. */
|
/* Cross fingers and go for it. */
|
||||||
LOAD_WINDOW(sp)
|
LOAD_WINDOW(sp)
|
||||||
@@ -275,15 +278,19 @@ srmmu_fwin_stackchk:
|
|||||||
|
|
||||||
/* LOCATION: Window 'T' */
|
/* LOCATION: Window 'T' */
|
||||||
|
|
||||||
lda [%g0] ASI_M_MMUREGS, %twin_tmp1 ! load mmu-ctrl again
|
LEON_PI(lda [%g0] ASI_LEON_MMUREGS, %twin_tmp1) ! load mmu-ctrl again
|
||||||
|
SUN_PI_(lda [%g0] ASI_M_MMUREGS, %twin_tmp1) ! load mmu-ctrl again
|
||||||
andn %twin_tmp1, 0x2, %twin_tmp1 ! clear no-fault bit
|
andn %twin_tmp1, 0x2, %twin_tmp1 ! clear no-fault bit
|
||||||
sta %twin_tmp1, [%g0] ASI_M_MMUREGS ! store it
|
LEON_PI(sta %twin_tmp1, [%g0] ASI_LEON_MMUREGS) ! store it
|
||||||
|
SUN_PI_(sta %twin_tmp1, [%g0] ASI_M_MMUREGS) ! store it
|
||||||
|
|
||||||
mov AC_M_SFAR, %twin_tmp2
|
mov AC_M_SFAR, %twin_tmp2
|
||||||
lda [%twin_tmp2] ASI_M_MMUREGS, %g0 ! read fault address
|
LEON_PI(lda [%twin_tmp2] ASI_LEON_MMUREGS, %g0) ! read fault address
|
||||||
|
SUN_PI_(lda [%twin_tmp2] ASI_M_MMUREGS, %g0) ! read fault address
|
||||||
|
|
||||||
mov AC_M_SFSR, %twin_tmp2
|
mov AC_M_SFSR, %twin_tmp2
|
||||||
lda [%twin_tmp2] ASI_M_MMUREGS, %twin_tmp2 ! read fault status
|
LEON_PI(lda [%twin_tmp2] ASI_LEON_MMUREGS, %twin_tmp2) ! read fault status
|
||||||
|
SUN_PI_(lda [%twin_tmp2] ASI_M_MMUREGS, %twin_tmp2) ! read fault status
|
||||||
andcc %twin_tmp2, 0x2, %g0 ! did fault occur?
|
andcc %twin_tmp2, 0x2, %g0 ! did fault occur?
|
||||||
|
|
||||||
bne 1f ! yep, cleanup
|
bne 1f ! yep, cleanup
|
||||||
|
Reference in New Issue
Block a user