[POWERPC] Save trap number in bad_stack
Save the trap number in the case of getting a bad stack in an exception handler. It is sometimes useful to know what exception it was that caused this to happen. Without this, no trap number is reported. Signed-off-by: Olof Johansson <olof@lixom.net> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
6cfef5b27e
commit
687304014f
|
@ -139,6 +139,7 @@ int main(void)
|
||||||
DEFINE(PACA_SYSTEM_TIME, offsetof(struct paca_struct, system_time));
|
DEFINE(PACA_SYSTEM_TIME, offsetof(struct paca_struct, system_time));
|
||||||
DEFINE(PACA_SLBSHADOWPTR, offsetof(struct paca_struct, slb_shadow_ptr));
|
DEFINE(PACA_SLBSHADOWPTR, offsetof(struct paca_struct, slb_shadow_ptr));
|
||||||
DEFINE(PACA_DATA_OFFSET, offsetof(struct paca_struct, data_offset));
|
DEFINE(PACA_DATA_OFFSET, offsetof(struct paca_struct, data_offset));
|
||||||
|
DEFINE(PACA_TRAP_SAVE, offsetof(struct paca_struct, trap_save));
|
||||||
|
|
||||||
DEFINE(SLBSHADOW_STACKVSID,
|
DEFINE(SLBSHADOW_STACKVSID,
|
||||||
offsetof(struct slb_shadow, save_area[SLB_NUM_BOLTED - 1].vsid));
|
offsetof(struct slb_shadow, save_area[SLB_NUM_BOLTED - 1].vsid));
|
||||||
|
|
|
@ -278,8 +278,12 @@ exception_marker:
|
||||||
beq- 1f; \
|
beq- 1f; \
|
||||||
ld r1,PACAKSAVE(r13); /* kernel stack to use */ \
|
ld r1,PACAKSAVE(r13); /* kernel stack to use */ \
|
||||||
1: cmpdi cr1,r1,0; /* check if r1 is in userspace */ \
|
1: cmpdi cr1,r1,0; /* check if r1 is in userspace */ \
|
||||||
bge- cr1,bad_stack; /* abort if it is */ \
|
bge- cr1,2f; /* abort if it is */ \
|
||||||
std r9,_CCR(r1); /* save CR in stackframe */ \
|
b 3f; \
|
||||||
|
2: li r1,(n); /* will be reloaded later */ \
|
||||||
|
sth r1,PACA_TRAP_SAVE(r13); \
|
||||||
|
b bad_stack; \
|
||||||
|
3: std r9,_CCR(r1); /* save CR in stackframe */ \
|
||||||
std r11,_NIP(r1); /* save SRR0 in stackframe */ \
|
std r11,_NIP(r1); /* save SRR0 in stackframe */ \
|
||||||
std r12,_MSR(r1); /* save SRR1 in stackframe */ \
|
std r12,_MSR(r1); /* save SRR1 in stackframe */ \
|
||||||
std r10,0(r1); /* make stack chain pointer */ \
|
std r10,0(r1); /* make stack chain pointer */ \
|
||||||
|
@ -940,6 +944,8 @@ bad_stack:
|
||||||
SAVE_2GPRS(7,r1)
|
SAVE_2GPRS(7,r1)
|
||||||
SAVE_10GPRS(12,r1)
|
SAVE_10GPRS(12,r1)
|
||||||
SAVE_10GPRS(22,r1)
|
SAVE_10GPRS(22,r1)
|
||||||
|
lhz r12,PACA_TRAP_SAVE(r13)
|
||||||
|
std r12,_TRAP(r1)
|
||||||
addi r11,r1,INT_FRAME_SIZE
|
addi r11,r1,INT_FRAME_SIZE
|
||||||
std r11,0(r1)
|
std r11,0(r1)
|
||||||
li r12,0
|
li r12,0
|
||||||
|
|
|
@ -94,6 +94,7 @@ struct paca_struct {
|
||||||
u64 stab_rr; /* stab/slb round-robin counter */
|
u64 stab_rr; /* stab/slb round-robin counter */
|
||||||
u64 saved_r1; /* r1 save for RTAS calls */
|
u64 saved_r1; /* r1 save for RTAS calls */
|
||||||
u64 saved_msr; /* MSR saved here by enter_rtas */
|
u64 saved_msr; /* MSR saved here by enter_rtas */
|
||||||
|
u16 trap_save; /* Used when bad stack is encountered */
|
||||||
u8 soft_enabled; /* irq soft-enable flag */
|
u8 soft_enabled; /* irq soft-enable flag */
|
||||||
u8 hard_enabled; /* set if irqs are enabled in MSR */
|
u8 hard_enabled; /* set if irqs are enabled in MSR */
|
||||||
u8 io_sync; /* writel() needs spin_unlock sync */
|
u8 io_sync; /* writel() needs spin_unlock sync */
|
||||||
|
|
Loading…
Reference in a new issue