aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libgloss/arc/crt0.S107
1 files changed, 34 insertions, 73 deletions
diff --git a/libgloss/arc/crt0.S b/libgloss/arc/crt0.S
index 99c871f..1d966c2 100644
--- a/libgloss/arc/crt0.S
+++ b/libgloss/arc/crt0.S
@@ -61,29 +61,40 @@
#if defined (__ARCEM__) || defined (__ARCHS__)
.section .ivt, "a", @progbits
-; handler's name, type, number,name, offset in IVT (hex/dec)
-.word __start ; exception 0 program entry point 0x0 0
-.word memory_error ; exception 1 memory_error 0x4 4
-.word instruction_error ; exception 2 instruction_error 0x8 8
-.word EV_MachineCheck ; exception 3 EV_MachineCheck 0xC 12
-.word EV_TLBMissI ; exception 4 EV_TLBMissI 0x10 16
-.word EV_TLBMissD ; exception 5 EV_TLBMissD 0x14 20
-.word EV_ProtV ; exception 6 EV_ProtV 0x18 24
-.word EV_PrivilegeV ; exception 7 EV_PrivilegeV 0x1C 28
-.word EV_SWI ; exception 8 EV_SWI 0x20 32
-.word EV_Trap ; exception 9 EV_Trap 0x24 36
-.word EV_Extension ; exception 10 EV_Extension 0x28 40
-.word EV_DivZero ; exception 11 EV_DivZero 0x2C 44
-.word EV_DCError ; exception 12 EV_DCError 0x30 48
-.word EV_Malignedr ; exception 13 EV_Maligned 0x34 52
-.word _exit_halt ; exception 14 unused 0x38 56
-.word _exit_halt ; exception 15 unused 0x3C 60
-.word IRQ_Timer0 ; IRQ 16 Timer 0 0x40 64
-.word IRQ_Timer1 ; IRQ 17 Timer 1 0x44 68
-.word IRQ_18 ; IRQ 18 0x48 72
-.word IRQ_19 ; IRQ 19 0x4C 76
-.word IRQ_20 ; IRQ 20 0x50 80
-
+; Helper macro to define weak symbols to include into interrupt vector table.
+; User code may define those functions in them, so user function will be
+; referenced in the IVT. By default all handlers point to _exit_halt - so they
+; always cause application halt, because if application causes an exception or
+; interrupt, but doesn't set a handler for it - something is wrong in
+; application. Exception is "start" entry of IVT, which points to __start
+; function.
+#define IVT_ENTRY(name) \
+ .word name `\
+ .weak name `\
+ .set name, _exit_halt
+
+; handler's name, number, name, offset in IVT (hex/dec)
+.word __start ; 0 program entry point 0x0 0
+IVT_ENTRY(memory_error) ; 1 memory_error 0x4 4
+IVT_ENTRY(instruction_error) ; 2 instruction_error 0x8 8
+IVT_ENTRY(EV_MachineCheck) ; 3 EV_MachineCheck 0xC 12
+IVT_ENTRY(EV_TLBMissI) ; 4 EV_TLBMissI 0x10 16
+IVT_ENTRY(EV_TLBMissD) ; 5 EV_TLBMissD 0x14 20
+IVT_ENTRY(EV_ProtV) ; 6 EV_ProtV 0x18 24
+IVT_ENTRY(EV_PrivilegeV) ; 7 EV_PrivilegeV 0x1C 28
+IVT_ENTRY(EV_SWI) ; 8 EV_SWI 0x20 32
+IVT_ENTRY(EV_Trap) ; 9 EV_Trap 0x24 36
+IVT_ENTRY(EV_Extension) ; 10 EV_Extension 0x28 40
+IVT_ENTRY(EV_DivZero) ; 11 EV_DivZero 0x2C 44
+IVT_ENTRY(EV_DCError) ; 12 EV_DCError 0x30 48
+IVT_ENTRY(EV_Maligned) ; 13 EV_Maligned 0x34 52
+IVT_ENTRY(EV_Ex14) ; 14 unused 0x38 56
+IVT_ENTRY(EV_Ex15) ; 15 unused 0x3C 60
+IVT_ENTRY(IRQ_Timer0) ; 16 Timer 0 0x40 64
+IVT_ENTRY(IRQ_Timer1) ; 17 Timer 1 0x44 68
+IVT_ENTRY(IRQ_18) ; 18 0x48 72
+IVT_ENTRY(IRQ_19) ; 19 0x4C 76
+IVT_ENTRY(IRQ_20) ; 20 0x50 80
.section .text.__startup, "ax", @progbits
#else
@@ -196,56 +207,6 @@ __start:
; r0 contains exit code
j @exit
-#if defined (__ARCEM__) || defined (__ARCHS__)
-; ARCv2 default interrupt routines, defined as weak symbols.
-; Default implementation halts the core. To conserve code size those symbols
-; share a single implementation, however as a downside debugger and
-; disassembler will not be able to distinguish one from another.
-.weak memory_error
-.weak instruction_error
-.weak EV_MachineCheck
-.weak EV_TLBMissI
-.weak EV_TLBMissD
-.weak EV_ProtV
-.weak EV_PrivilegeV
-.weak EV_SWI
-.weak EV_Trap
-.weak EV_Extension
-.weak EV_DivZero
-.weak EV_DCError
-.weak EV_Malignedr
-.weak IRQ_Timer0
-.weak IRQ_Timer1
-.weak IRQ_18
-.weak IRQ_19
-.weak IRQ_20
-
-.balign 4
-memory_error :
-instruction_error :
-EV_MachineCheck :
-EV_TLBMissI :
-EV_TLBMissD :
-EV_ProtV :
-EV_PrivilegeV :
-EV_SWI :
-EV_Trap :
-EV_Extension :
-EV_DivZero :
-EV_DCError :
-EV_Malignedr :
-IRQ_Timer0 :
-IRQ_Timer1 :
-IRQ_18 :
-IRQ_19 :
-IRQ_20 :
-.Lloop_halt:
- flag 0x01
- nop
- b .Lloop_halt
- nop
-#endif /* __ARCEM__ || __ARCHS__ */
-
.section .text._exit_halt,"ax",@progbits
.global _exit_halt
.type _exit_halt, @function