From f33330c0ff90adad8855250877a4a3d0a407bba4 Mon Sep 17 00:00:00 2001 From: Amaury Pouly Date: Mon, 2 Apr 2012 15:11:21 +0200 Subject: arm: factor all exception handlers out of the crt0.S files Remove the implementations of all exceptions handlers from the various crt0.S files and have a single implementation in system-arm.h The new implementation is weak so that it can be overwritten by some specific code (like the unwinder) Change-Id: Ib3e041ed6037376bbe0e79286057e1051640dd90 Reviewed-on: http://gerrit.rockbox.org/205 Reviewed-by: Marcin Bukat --- firmware/target/arm/crt0.S | 32 ---------------------- firmware/target/arm/imx233/crt0.S | 32 ---------------------- firmware/target/arm/imx31/crt0.S | 29 -------------------- firmware/target/arm/rk27xx/crt0.S | 27 ------------------ firmware/target/arm/s3c2440/crt0.S | 29 -------------------- firmware/target/arm/s5l8700/crt0.S | 30 -------------------- firmware/target/arm/s5l8702/crt0.S | 30 -------------------- firmware/target/arm/system-arm.c | 50 ++++++++++++++++++++++++++++++++++ firmware/target/arm/tcc77x/crt0.S | 29 -------------------- firmware/target/arm/tcc780x/crt0.S | 29 -------------------- firmware/target/arm/tms320dm320/crt0.S | 45 ------------------------------ 11 files changed, 50 insertions(+), 312 deletions(-) diff --git a/firmware/target/arm/crt0.S b/firmware/target/arm/crt0.S index 7befecb593..b9cc27f5c5 100644 --- a/firmware/target/arm/crt0.S +++ b/firmware/target/arm/crt0.S @@ -137,38 +137,6 @@ newstart: ldr ip, =main @ make sure we are using the virtual address bx ip -/* All illegal exceptions call into UIE with exception address as first - * parameter. This is calculated differently depending on which exception - * we're in. Second parameter is exception number, used for a string lookup - * in UIE. */ -undef_instr_handler: - sub r0, lr, #4 @ r0 points to the faulty ARM instruction -#ifdef USE_THUMB - mrs r1, spsr - tst r1, #(1<<5) @ T bit set ? - subne r0, lr, #2 @ if yes, r0 points to the faulty THUMB instruction -#endif /* USE_THUMB */ - mov r1, #0 - b UIE - -/* We run sys mode most of the time, and should never see a software - * exception being thrown. Make it illegal and call UIE. */ -software_int_handler: -reserved_handler: - sub r0, lr, #4 - mov r1, #4 - b UIE - -prefetch_abort_handler: - sub r0, lr, #4 - mov r1, #1 - b UIE - -data_abort_handler: - sub r0, lr, #8 - mov r1, #2 - b UIE - /* Cache-align interrupt stacks */ .balign 32 diff --git a/firmware/target/arm/imx233/crt0.S b/firmware/target/arm/imx233/crt0.S index 4ae083ccb2..ffc58d56fc 100644 --- a/firmware/target/arm/imx233/crt0.S +++ b/firmware/target/arm/imx233/crt0.S @@ -161,38 +161,6 @@ remap: 1: b 1b -/* All illegal exceptions call into UIE with exception address as first - * parameter. This is calculated differently depending on which exception - * we're in. Second parameter is exception number, used for a string lookup - * in UIE. */ -undef_instr_handler: - sub r0, lr, #4 @ r0 points to the faulty ARM instruction -#ifdef USE_THUMB - mrs r1, spsr - tst r1, #(1<<5) @ T bit set ? - subne r0, lr, #2 @ if yes, r0 points to the faulty THUMB instruction -#endif /* USE_THUMB */ - mov r1, #0 - b UIE - -/* We run sys mode most of the time, and should never see a software - * exception being thrown. Make it illegal and call UIE. */ -software_int_handler: -reserved_handler: - sub r0, lr, #4 - mov r1, #4 - b UIE - -prefetch_abort_handler: - sub r0, lr, #4 - mov r1, #1 - b UIE - -data_abort_handler: - sub r0, lr, #8 - mov r1, #2 - b UIE - /* 256 words of IRQ stack */ .space 256*4 irq_stack: diff --git a/firmware/target/arm/imx31/crt0.S b/firmware/target/arm/imx31/crt0.S index 1c1ae55736..4e489800d4 100644 --- a/firmware/target/arm/imx31/crt0.S +++ b/firmware/target/arm/imx31/crt0.S @@ -326,35 +326,6 @@ remap_end: .word 0 @ fiq_handler #endif /* BOOTLOADER */ - .text - -/* All illegal exceptions call into UIE with exception address as first - * parameter. This is calculated differently depending on which exception - * we're in. Second parameter is exception number, used for a string lookup - * in UIE. */ -undef_instr_handler: - sub r0, lr, #4 - mov r1, #0 - b UIE - -/* We run sys mode most of the time, and should never see a software - * exception being thrown. Make it illegal and call UIE. */ -software_int_handler: -reserved_handler: - sub r0, lr, #4 - mov r1, #4 - b UIE - -prefetch_abort_handler: - sub r0, lr, #4 - mov r1, #1 - b UIE - -data_abort_handler: - sub r0, lr, #8 - mov r1, #2 - b UIE - /* 256 words of IRQ stack */ .section .bss .balign 32 diff --git a/firmware/target/arm/rk27xx/crt0.S b/firmware/target/arm/rk27xx/crt0.S index 1bbd46a12c..deea0eeaec 100644 --- a/firmware/target/arm/rk27xx/crt0.S +++ b/firmware/target/arm/rk27xx/crt0.S @@ -196,30 +196,3 @@ entry_point: bhi 1b bl main - -/* All illegal exceptions call into UIE with exception address as first - * parameter. This is calculated differently depending on which exception - * we're in. Second parameter is exception number, used for a string lookup - * in UIE. */ -undef_instr_handler: - sub r0, lr, #4 - mov r1, #0 - b UIE - -prefetch_abort_handler: - sub r0, lr, #4 - mov r1, #1 - b UIE - -data_abort_handler: - sub r0, lr, #8 - mov r1, #2 - b UIE - -/* We run sys mode most of the time, and should never see a software - * exception being thrown. Make it illegal and call UIE */ -software_int_handler: -reserved_handler: - sub r0, lr, #4 - mov r1, #5 - b UIE diff --git a/firmware/target/arm/s3c2440/crt0.S b/firmware/target/arm/s3c2440/crt0.S index 8cbd8ab91e..e103f4f49f 100644 --- a/firmware/target/arm/s3c2440/crt0.S +++ b/firmware/target/arm/s3c2440/crt0.S @@ -565,35 +565,6 @@ stackmunge: */ b vectors -/* All illegal exceptions call into UIE with exception address as first - parameter. This is calculated differently depending on which exception - we're in. Second parameter is exception number, used for a string lookup - in UIE. - */ -undef_instr_handler: - sub r0, lr, #4 - mov r1, #0 - b UIE - -/* We run sys mode most of the time, and should never see a software - exception being thrown. Make it illegal and call UIE. - */ -software_int_handler: -reserved_handler: - sub r0, lr, #4 - mov r1, #4 - b UIE - -prefetch_abort_handler: - sub r0, lr, #4 - mov r1, #1 - b UIE - -data_abort_handler: - sub r0, lr, #8 - mov r1, #2 - b UIE - #if defined(BOOTLOADER) fiq_handler: b UIE diff --git a/firmware/target/arm/s5l8700/crt0.S b/firmware/target/arm/s5l8700/crt0.S index 0582ab0c8f..93bfa8f06c 100644 --- a/firmware/target/arm/s5l8700/crt0.S +++ b/firmware/target/arm/s5l8700/crt0.S @@ -507,33 +507,3 @@ start_loc: #endif bl main - - .text -/* .global UIE*/ - -/* All illegal exceptions call into UIE with exception address as first - * parameter. This is calculated differently depending on which exception - * we're in. Second parameter is exception number, used for a string lookup - * in UIE. */ -undef_instr_handler: - sub r0, lr, #4 - mov r1, #0 - b UIE - -/* We run sys mode most of the time, and should never see a software - * exception being thrown. Make it illegal and call UIE. */ -software_int_handler: -reserved_handler: - sub r0, lr, #4 - mov r1, #4 - b UIE - -prefetch_abort_handler: - sub r0, lr, #4 - mov r1, #1 - b UIE - -data_abort_handler: - sub r0, lr, #8 - mov r1, #2 - b UIE diff --git a/firmware/target/arm/s5l8702/crt0.S b/firmware/target/arm/s5l8702/crt0.S index e894e8f157..563e863a66 100644 --- a/firmware/target/arm/s5l8702/crt0.S +++ b/firmware/target/arm/s5l8702/crt0.S @@ -179,33 +179,3 @@ start_loc: bhi 1b bl main - - .text -/* .global UIE*/ - -/* All illegal exceptions call into UIE with exception address as first - * parameter. This is calculated differently depending on which exception - * we're in. Second parameter is exception number, used for a string lookup - * in UIE. */ -undef_instr_handler: - sub r0, lr, #4 - mov r1, #0 - b UIE - -/* We run sys mode most of the time, and should never see a software - * exception being thrown. Make it illegal and call UIE. */ -software_int_handler: -reserved_handler: - sub r0, lr, #4 - mov r1, #4 - b UIE - -prefetch_abort_handler: - sub r0, lr, #4 - mov r1, #1 - b UIE - -data_abort_handler: - sub r0, lr, #8 - mov r1, #2 - b UIE diff --git a/firmware/target/arm/system-arm.c b/firmware/target/arm/system-arm.c index c4692bbf29..e687e1d82b 100644 --- a/firmware/target/arm/system-arm.c +++ b/firmware/target/arm/system-arm.c @@ -36,6 +36,56 @@ static const char* const uiename[] = { "SWI" }; +void __attribute__((weak,naked)) data_abort_handler(void) +{ + asm volatile( + "sub r0, lr, #8 \n" + "mov r1, #2 \n" + "b UIE \n" + ); +} + +void __attribute__((weak,naked)) software_int_handler(void) +{ + asm volatile( + "sub r0, lr, #4 \n" + "mov r1, #4 \n" + "b UIE \n" + ); +} + +void __attribute__((weak,naked)) reserved_handler(void) +{ + asm volatile( + "sub r0, lr, #4 \n" + "mov r1, #4 \n" + "b UIE \n" + ); +} + +void __attribute__((weak,naked)) prefetch_abort_handler(void) +{ + asm volatile( + "sub r0, lr, #4 \n" + "mov r1, #1 \n" + "b UIE \n" + ); +} + +void __attribute__((weak,naked)) undef_instr_handler(void) +{ + asm volatile( + "sub r0, lr, #4 \n" +#ifdef USE_THUMB + "mrs r1, spsr \n" + "tst r1, #(1 << 5) \n" // T bit set ? + "subne r0, lr, #2 \n" // if yes, offset to THUMB instruction +#endif + "mov r1, #0 \n" + "b UIE \n" + ); +} + /* Unexpected Interrupt or Exception handler. Currently only deals with exceptions, but will deal with interrupts later. */ diff --git a/firmware/target/arm/tcc77x/crt0.S b/firmware/target/arm/tcc77x/crt0.S index d0873102d4..aebd8974da 100644 --- a/firmware/target/arm/tcc77x/crt0.S +++ b/firmware/target/arm/tcc77x/crt0.S @@ -212,35 +212,6 @@ vectors_end: .text -/* All illegal exceptions call into UIE with exception address as first - parameter. This is calculated differently depending on which exception - we're in. Second parameter is exception number, used for a string lookup - in UIE. - */ -undef_instr_handler: - sub r0, lr, #4 - mov r1, #0 - b UIE - -/* We run sys mode most of the time, and should never see a software - exception being thrown. Make it illegal and call UIE. - */ -software_int_handler: -reserved_handler: - sub r0, lr, #4 - mov r1, #4 - b UIE - -prefetch_abort_handler: - sub r0, lr, #4 - mov r1, #1 - b UIE - -data_abort_handler: - sub r0, lr, #8 - mov r1, #2 - b UIE - irq_handler: stmfd sp!, {r0-r3, r12, lr} bl irq diff --git a/firmware/target/arm/tcc780x/crt0.S b/firmware/target/arm/tcc780x/crt0.S index 1dbccf9828..5d271616d0 100644 --- a/firmware/target/arm/tcc780x/crt0.S +++ b/firmware/target/arm/tcc780x/crt0.S @@ -282,35 +282,6 @@ vectors_end: .text -/* All illegal exceptions call into UIE with exception address as first - parameter. This is calculated differently depending on which exception - we're in. Second parameter is exception number, used for a string lookup - in UIE. - */ -undef_instr_handler: - sub r0, lr, #4 - mov r1, #0 - b UIE - -/* We run sys mode most of the time, and should never see a software - exception being thrown. Make it illegal and call UIE. - */ -software_int_handler: -reserved_handler: - sub r0, lr, #4 - mov r1, #4 - b UIE - -prefetch_abort_handler: - sub r0, lr, #4 - mov r1, #1 - b UIE - -data_abort_handler: - sub r0, lr, #8 - mov r1, #2 - b UIE - #ifdef BOOTLOADER fiq_handler: subs pc, lr, #4 diff --git a/firmware/target/arm/tms320dm320/crt0.S b/firmware/target/arm/tms320dm320/crt0.S index d53cff2b63..f1b2eb397c 100644 --- a/firmware/target/arm/tms320dm320/crt0.S +++ b/firmware/target/arm/tms320dm320/crt0.S @@ -291,51 +291,6 @@ _delay_cycles: .ltorg .size _delay_cycles, .-_delay_cycles -/****************************************************************************** - * Unused exception vectors. These call the UIE function. * - * Arguements are: * - * r0: PC of exception * - * r1: Exception number. * - * Exception numbers are as defined: * - * 0: Undefined Instruction * - * 1: Prefetch Abort * - * 2: Data Abort * - * 3: DIV0 * - * 4: SWI * - * The exceptions return operations are documented in section A2.6 of the * - * ARM Architecture Reference Manual. * - ******************************************************************************/ - -/* A2.6.3: Undefined Instruction Exception - LR=PC of next instruction */ -_undefined_instruction: - sub r0, lr, #4 - mov r1, #0 - bl UIE - -/* A2.6.4: Software Interrupt exception - These should not happen in Rockbox, - * make it illegal - */ -_software_interrupt: - sub r0, lr, #4 - mov r1, #4 - bl UIE - -/* A2.6.5 Prefetch Abort - This is also the BKPT instruction since this is a - * v5 target. Pass it on to UIE since it is not currently used. - */ -_prefetch_abort: - sub r0, lr, #4 - mov r1, #1 - bl UIE - -/* A2.6.6 Data Abort - There was a memory abort, can return after fixing cause - * with the LR address. - */ -_data_abort: - sub r0, lr, #8 - mov r1, #2 - bl UIE - /****************************************************************************** * _dead_loop: Something really unexpected happened (like a reserved * * exception). Just hang. * -- cgit v1.2.3