diff options
Diffstat (limited to 'payloads')
-rw-r--r-- | payloads/libpayload/arch/arm/exception.c | 7 | ||||
-rw-r--r-- | payloads/libpayload/arch/arm/exception_asm.S | 4 | ||||
-rw-r--r-- | payloads/libpayload/include/arm/arch/exception.h | 1 |
3 files changed, 9 insertions, 3 deletions
diff --git a/payloads/libpayload/arch/arm/exception.c b/payloads/libpayload/arch/arm/exception.c index f0ce0ea8c3..45b77a7460 100644 --- a/payloads/libpayload/arch/arm/exception.c +++ b/payloads/libpayload/arch/arm/exception.c @@ -66,7 +66,7 @@ static void dump_stack(uintptr_t addr, size_t bytes) } } -static void print_regs(uint32_t *regs) +static void print_regs(struct exception_state *state) { int i; @@ -81,8 +81,9 @@ static void print_regs(uint32_t *regs) printf("IP"); else printf("R%d", i); - printf(" = 0x%08x\n", regs[i]); + printf(" = 0x%08x\n", state->regs[i]); } + printf("CPSR = 0x%08x\n", state->cpsr); } void exception_dispatch(struct exception_state *state, int idx); @@ -102,7 +103,7 @@ void exception_dispatch(struct exception_state *state, int idx) else printf("exception _not_used.\n"); } - print_regs(state->regs); + print_regs(state); dump_stack(state->regs[13], 512); halt(); } diff --git a/payloads/libpayload/arch/arm/exception_asm.S b/payloads/libpayload/arch/arm/exception_asm.S index 6a28c5cdef..974d1724b5 100644 --- a/payloads/libpayload/arch/arm/exception_asm.S +++ b/payloads/libpayload/arch/arm/exception_asm.S @@ -74,9 +74,13 @@ exception_common: stmfd sp, { sp, lr }^ sub sp, sp, $8 push { r0 - r12 } + mrs r0, SPSR + push { r0 } mov r0, sp ldr r1, exception_idx blx exception_dispatch + pop { r0 } + msr SPSR_cxsf, r0 pop { r0 - r12 } add sp, sp, $8 ldmfd sp!, { pc }^ diff --git a/payloads/libpayload/include/arm/arch/exception.h b/payloads/libpayload/include/arm/arch/exception.h index 13fda57aa7..c6864a5ad2 100644 --- a/payloads/libpayload/include/arm/arch/exception.h +++ b/payloads/libpayload/include/arm/arch/exception.h @@ -36,6 +36,7 @@ void set_vbar(uint32_t vbar); struct exception_state { + uint32_t cpsr; uint32_t regs[16]; } __attribute__((packed)); |