summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/target/arm/crt0.S32
-rw-r--r--firmware/target/arm/imx233/crt0.S32
-rw-r--r--firmware/target/arm/imx31/crt0.S29
-rw-r--r--firmware/target/arm/rk27xx/crt0.S27
-rw-r--r--firmware/target/arm/s3c2440/crt0.S29
-rw-r--r--firmware/target/arm/s5l8700/crt0.S30
-rw-r--r--firmware/target/arm/s5l8702/crt0.S30
-rw-r--r--firmware/target/arm/system-arm.c50
-rw-r--r--firmware/target/arm/tcc77x/crt0.S29
-rw-r--r--firmware/target/arm/tcc780x/crt0.S29
-rw-r--r--firmware/target/arm/tms320dm320/crt0.S45
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
@@ -292,51 +292,6 @@ _delay_cycles:
.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. *
******************************************************************************/