Skip to content

Commit 5c33a7c

Browse files
committed
pbio/platform/ev3: Hook up exception handlers to invoke C code
1 parent 0da540e commit 5c33a7c

File tree

2 files changed

+72
-5
lines changed

2 files changed

+72
-5
lines changed

lib/pbio/platform/ev3/exceptionhandler.S

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616

1717
.equ I_F_BIT, 0xC0
1818
.equ MASK_SWI_NUM, 0xFF000000
19+
.equ MASK_SR_MODE, 0x1F
20+
.equ EXCEPT_TYPE_UNKNOWN, 0
21+
.equ EXCEPT_TYPE_UNDEF, 1
22+
.equ EXCEPT_TYPE_PREFETCH_ABORT, 2
23+
.equ EXCEPT_TYPE_DATA_ABORT, 3
1924

2025
.text
2126

@@ -29,16 +34,66 @@
2934
@ Since I can only say that the IRQ Handler works, we leave the remaining ones as they are
3035
ExceptionHandlerStart:
3136
ldr pc, =Entry
32-
B ExceptionHandlerStart
37+
B UndefHandlder
3338
B SWIHandler
34-
B ExceptionHandlerStart
35-
B ExceptionHandlerStart
36-
B ExceptionHandlerStart
39+
B PrefetchAbortHandler
40+
B DataAbortHandler
41+
B UnknownExceptionHandler
3742
B IRQHandler
3843
B FIQHandler
3944

4045
.pool
41-
46+
47+
UndefHandlder:
48+
@ Save r0-r12, lr
49+
stmfd sp!, {r0-r12, lr}
50+
mov r7, #EXCEPT_TYPE_UNDEF
51+
b CommonPanicHandler
52+
53+
PrefetchAbortHandler:
54+
@ Save r0-r12, lr
55+
stmfd sp!, {r0-r12, lr}
56+
mov r7, #EXCEPT_TYPE_PREFETCH_ABORT
57+
b CommonPanicHandler
58+
59+
DataAbortHandler:
60+
@ Save r0-r12, lr
61+
stmfd sp!, {r0-r12, lr}
62+
mov r7, #EXCEPT_TYPE_DATA_ABORT
63+
b CommonPanicHandler
64+
65+
UnknownExceptionHandler:
66+
@ Save r0-r12, lr
67+
stmfd sp!, {r0-r12, lr}
68+
mov r7, #EXCEPT_TYPE_UNKNOWN
69+
@ b CommonPanicHandler
70+
@ fall through
71+
72+
CommonPanicHandler:
73+
@ Save SPSR
74+
mrs r0, spsr
75+
stmfd sp!, {r0}
76+
@ Switch to previous mode to read its sp/lr
77+
@ NOTE: Assumes we never use User mode
78+
and r0, #MASK_SR_MODE
79+
mrs r1, cpsr
80+
and r2, r1, #MASK_SR_MODE
81+
orr r2, r0
82+
msr cpsr, r2
83+
mov r3, r13
84+
mov r4, r14
85+
msr cpsr, r1
86+
stmfd sp!, {r3, r4}
87+
@ Call panic handler
88+
mov r0, r7
89+
mov r1, sp
90+
bl ev3_panic_handler_
91+
@ Reset
92+
b ExceptionHandlerStart
93+
94+
ev3_panic_handler_:
95+
ldr pc, =ev3_panic_handler
96+
4297
FIQHandler:
4398
STMFD r13!, {r0-r7, lr}
4499
LDR r0, =0xFFFEF600

lib/pbio/platform/ev3/platform.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include <tiam1808/hw/soc_AM1808.h>
5050
#include <tiam1808/i2c.h>
5151
#include <tiam1808/psc.h>
52+
#include <tiam1808/uart.h>
5253

5354
#include <pbdrv/ioport.h>
5455
#include <pbio/port_interface.h>
@@ -409,6 +410,17 @@ unsigned int EDMAVersionGet(void) {
409410
return 1;
410411
}
411412

413+
void ev3_panic_handler(int except_type, void *except_data) {
414+
// Regardless of what's going on, configure the UART1 for a debug console
415+
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
416+
UARTConfigSetExpClk(SOC_UART_1_REGS, SOC_UART_1_MODULE_FREQ, 115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_13);
417+
UARTFIFOEnable(SOC_UART_1_REGS);
418+
419+
// TODO: Implement panic handler
420+
UARTCharPut(SOC_UART_1_REGS, 'H');
421+
UARTCharPut(SOC_UART_1_REGS, 'i');
422+
}
423+
412424
/**
413425
* Callback for completion of all EDMA3 transfers on this platform.
414426
*

0 commit comments

Comments
 (0)