NMIExceptionHandler: Don't save callee-saved registers, fix stack alignment

NMI routine sdk_wDev_ProcessFiq seems to be written in C, meets ABI
calling conventions for callee-saved registers. Not sure why SDK
handlers saved them.

NMI handler now also meets the ABI requirement that stack is 16 byte
aligned (doesn't seem strictly necessary, but can't hurt.)
This commit is contained in:
Angus Gratton 2015-09-29 14:51:24 +10:00
parent 4448380c5e
commit 697d5b72bc

View file

@ -25,10 +25,12 @@
.section .bss .section .bss
.balign 16
NMIHandlerStack: # stack space for NMI handler NMIHandlerStack: # stack space for NMI handler
.skip 4*0x100 .skip 4*0x100
.NMIHandlerStackTop: .NMIHandlerStackTop:
.balign 16
LoadStoreErrorHandlerStack: LoadStoreErrorHandlerStack:
.word 0 # a0 .word 0 # a0
.word 0 # (unused) .word 0 # (unused)
@ -374,60 +376,52 @@ NMIExceptionHandler:
.type NMIExceptionHandler, @function .type NMIExceptionHandler, @function
wsr sp, excsave3 # excsave3 holds user stack wsr sp, excsave3 # excsave3 holds user stack
movi sp, .NMIHandlerStackTop - 0x54 movi sp, .NMIHandlerStackTop - 0x40
s32i a0, sp, 0x00 s32i a0, sp, 0x00
s32i a2, sp, 0x08 s32i a2, sp, 0x04
s32i a3, sp, 0x0c s32i a3, sp, 0x08
s32i a4, sp, 0x10 s32i a4, sp, 0x0c
s32i a5, sp, 0x14 s32i a5, sp, 0x10
s32i a6, sp, 0x18 s32i a6, sp, 0x14
s32i a7, sp, 0x1c s32i a7, sp, 0x18
s32i a8, sp, 0x20 s32i a8, sp, 0x1c
s32i a9, sp, 0x24 s32i a9, sp, 0x20
s32i a10, sp, 0x28 s32i a10, sp, 0x24
s32i a11, sp, 0x2c s32i a11, sp, 0x28
s32i a12, sp, 0x30
s32i a13, sp, 0x34
s32i a14, sp, 0x38
s32i a15, sp, 0x3c
rsr a0, epc1 rsr a0, epc1
s32i a0, sp, 0x40 s32i a0, sp, 0x2c
rsr a0, exccause rsr a0, exccause
s32i a0, sp, 0x44 s32i a0, sp, 0x30
rsr a0, excsave1 rsr a0, excsave1
s32i a0, sp, 0x48 s32i a0, sp, 0x34
rsr a0, excvaddr rsr a0, excvaddr
s32i a0, sp, 0x4c s32i a0, sp, 0x38
rsr a0, sar rsr a0, sar
s32i a0, sp, 0x50 s32i a0, sp, 0x3c
movi a0, 0x23 # Override PS for NMI handler movi a0, 0x23 # Override PS for NMI handler
wsr a0, ps wsr a0, ps
rsync rsync
call0 sdk_wDev_ProcessFiq call0 sdk_wDev_ProcessFiq
l32i a0, sp, 0x50 l32i a0, sp, 0x3c
wsr a0, sar wsr a0, sar
l32i a0, sp, 0x4c l32i a0, sp, 0x38
wsr a0, excvaddr wsr a0, excvaddr
l32i a0, sp, 0x48 l32i a0, sp, 0x34
wsr a0, excsave1 wsr a0, excsave1
l32i a0, sp, 0x44 l32i a0, sp, 0x30
wsr a0, exccause wsr a0, exccause
l32i a0, sp, 0x40 l32i a0, sp, 0x2c
wsr a0, epc1 wsr a0, epc1
l32i a15, sp, 0x3c l32i a11, sp, 0x28
l32i a14, sp, 0x38 l32i a10, sp, 0x24
l32i a13, sp, 0x34 l32i a9, sp, 0x20
l32i a12, sp, 0x30 l32i a8, sp, 0x1c
l32i a11, sp, 0x2c l32i a7, sp, 0x18
l32i a10, sp, 0x28 l32i a6, sp, 0x14
l32i a9, sp, 0x24 l32i a5, sp, 0x10
l32i a8, sp, 0x20 l32i a4, sp, 0x0c
l32i a7, sp, 0x1c l32i a3, sp, 0x08
l32i a6, sp, 0x18
l32i a5, sp, 0x14
l32i a4, sp, 0x10
l32i a3, sp, 0x0c
movi a0, 0x33 # Reset PS movi a0, 0x33 # Reset PS
wsr a0, ps wsr a0, ps
rsync rsync
@ -438,7 +432,7 @@ NMIExceptionHandler:
movi a0, 0x3ff00000 movi a0, 0x3ff00000
movi a2, 0x1 movi a2, 0x1
s32i a2, a0, 0 s32i a2, a0, 0
l32i a2, sp, 0x08 l32i a2, sp, 0x04
l32i a0, sp, 0x00 l32i a0, sp, 0x00
movi a1, 0x0 movi a1, 0x0
xsr a1, excsave3 # Load stack back from excsave3, clear excsave3 xsr a1, excsave3 # Load stack back from excsave3, clear excsave3