sh: rework register restore code for sh3/sh4/sh4a
This patch reworks the sh3/sh4/sh4a register restore code in the following ways: - break out restore_regs() from restore_all() - the register saving order is unchanged - use restore_regs() in sh_bios_handler and restore_all - document the function Signed-off-by: Magnus Damm <damm@igel.co.jp> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
@@ -188,44 +188,35 @@ call_dae:
|
|||||||
#if defined(CONFIG_SH_STANDARD_BIOS)
|
#if defined(CONFIG_SH_STANDARD_BIOS)
|
||||||
/* Unwind the stack and jmp to the debug entry */
|
/* Unwind the stack and jmp to the debug entry */
|
||||||
ENTRY(sh_bios_handler)
|
ENTRY(sh_bios_handler)
|
||||||
mov.l @r15+, r0
|
mov.l 1f, r8
|
||||||
mov.l @r15+, r1
|
bsr restore_regs
|
||||||
mov.l @r15+, r2
|
nop
|
||||||
mov.l @r15+, r3
|
|
||||||
mov.l @r15+, r4
|
lds k2, pr ! restore pr
|
||||||
mov.l @r15+, r5
|
mov k4, r15
|
||||||
mov.l @r15+, r6
|
|
||||||
mov.l @r15+, r7
|
|
||||||
stc sr, r8
|
|
||||||
mov.l 1f, r9 ! BL =1, RB=1, IMASK=0x0F
|
|
||||||
or r9, r8
|
|
||||||
ldc r8, sr ! here, change the register bank
|
|
||||||
mov.l @r15+, r8
|
|
||||||
mov.l @r15+, r9
|
|
||||||
mov.l @r15+, r10
|
|
||||||
mov.l @r15+, r11
|
|
||||||
mov.l @r15+, r12
|
|
||||||
mov.l @r15+, r13
|
|
||||||
mov.l @r15+, r14
|
|
||||||
mov.l @r15+, k0
|
|
||||||
ldc.l @r15+, spc
|
|
||||||
lds.l @r15+, pr
|
|
||||||
mov.l @r15+, k1
|
|
||||||
ldc.l @r15+, gbr
|
|
||||||
lds.l @r15+, mach
|
|
||||||
lds.l @r15+, macl
|
|
||||||
mov k0, r15
|
|
||||||
!
|
!
|
||||||
mov.l 2f, k0
|
mov.l 2f, k0
|
||||||
mov.l @k0, k0
|
mov.l @k0, k0
|
||||||
jmp @k0
|
jmp @k0
|
||||||
ldc k1, ssr
|
ldc k3, ssr
|
||||||
.align 2
|
.align 2
|
||||||
1: .long 0x300000f0
|
1: .long 0x300000f0
|
||||||
2: .long gdb_vbr_vector
|
2: .long gdb_vbr_vector
|
||||||
#endif /* CONFIG_SH_STANDARD_BIOS */
|
#endif /* CONFIG_SH_STANDARD_BIOS */
|
||||||
|
|
||||||
restore_all:
|
! restore_regs()
|
||||||
|
! - restore r0, r1, r2, r3, r4, r5, r6, r7 from the stack
|
||||||
|
! - switch bank
|
||||||
|
! - restore r8, r9, r10, r11, r12, r13, r14, r15 from the stack
|
||||||
|
! - restore spc, pr*, ssr, gbr, mach, macl, skip default tra
|
||||||
|
! k2 returns original pr
|
||||||
|
! k3 returns original sr
|
||||||
|
! k4 returns original stack pointer
|
||||||
|
! r8 passes SR bitmask, overwritten with restored data on return
|
||||||
|
! r9 trashed
|
||||||
|
! BL=0 on entry, on exit BL=1 (depending on r8).
|
||||||
|
|
||||||
|
restore_regs:
|
||||||
mov.l @r15+, r0
|
mov.l @r15+, r0
|
||||||
mov.l @r15+, r1
|
mov.l @r15+, r1
|
||||||
mov.l @r15+, r2
|
mov.l @r15+, r2
|
||||||
@@ -235,10 +226,9 @@ restore_all:
|
|||||||
mov.l @r15+, r6
|
mov.l @r15+, r6
|
||||||
mov.l @r15+, r7
|
mov.l @r15+, r7
|
||||||
!
|
!
|
||||||
stc sr, r8
|
stc sr, r9
|
||||||
mov.l 7f, r9
|
or r8, r9
|
||||||
or r9, r8 ! BL =1, RB=1
|
ldc r9, sr
|
||||||
ldc r8, sr ! here, change the register bank
|
|
||||||
!
|
!
|
||||||
mov.l @r15+, r8
|
mov.l @r15+, r8
|
||||||
mov.l @r15+, r9
|
mov.l @r15+, r9
|
||||||
@@ -249,12 +239,20 @@ restore_all:
|
|||||||
mov.l @r15+, r14
|
mov.l @r15+, r14
|
||||||
mov.l @r15+, k4 ! original stack pointer
|
mov.l @r15+, k4 ! original stack pointer
|
||||||
ldc.l @r15+, spc
|
ldc.l @r15+, spc
|
||||||
lds.l @r15+, pr
|
mov.l @r15+, k2 ! original PR
|
||||||
mov.l @r15+, k3 ! original SR
|
mov.l @r15+, k3 ! original SR
|
||||||
ldc.l @r15+, gbr
|
ldc.l @r15+, gbr
|
||||||
lds.l @r15+, mach
|
lds.l @r15+, mach
|
||||||
lds.l @r15+, macl
|
lds.l @r15+, macl
|
||||||
add #4, r15 ! Skip syscall number
|
rts
|
||||||
|
add #4, r15 ! Skip syscall number
|
||||||
|
|
||||||
|
restore_all:
|
||||||
|
mov.l 7f, r8
|
||||||
|
bsr restore_regs
|
||||||
|
nop
|
||||||
|
|
||||||
|
lds k2, pr ! restore pr
|
||||||
!
|
!
|
||||||
#ifdef CONFIG_SH_DSP
|
#ifdef CONFIG_SH_DSP
|
||||||
mov.l @r15+, k0 ! DSP mode marker
|
mov.l @r15+, k0 ! DSP mode marker
|
||||||
|
Reference in New Issue
Block a user