@@ -48,13 +48,13 @@ mriDebugMonitorHandlerStub:
4848 .size mriDebugMonitorHandlerStub , . - mriDebugMonitorHandlerStub
4949
5050
51- // UNDONE: Have a separate stub for each fault handler (hard , memmanage , bus , usage)
5251 . global mriFaultHandlerStub
5352 .type mriFaultHandlerStub , function
5453 .thumb_func
5554 / * extern "C" void mriFaultHandlerStub(void) ;
56- This stub is called whenever a fault fires. It checks the EXC_RETURN value to determine if thread or handler
57- mode caused fault:
55+ This stub is called whenever a fault fires w/ R3 set to the original handler for the particular fault. This
56+ allows the original handler to be called if a crash occurs in handler mode which can't be debugged by ThreadMRI.
57+ It checks the EXC_RETURN value to determine if thread or handler mode caused fault:
5858 Thread: Pass control to mriFaultHandler() so th at it can be debugged.
5959 Handler: If caused by debug event , pass control to mriFaultHandler() so th at break/watchpoints can be disabled.
6060 Otherwise pass control to the standard mbed - os HardFault_Handler so th at crash can be dumped.
@@ -72,14 +72,76 @@ mriFaultHandlerStub:
7272 ldr r1 , =HFSR
7373 ldr r1 , [ r1 ]
7474 tst r1 , #HFSR_DEBUG_EVENT_BIT
75- / * If not a debug event then fall through to default hard fault handler as something bad has happened. * /
76- beq.w HardFault_Handler
7775 / * If forced into hard fault due to debug event then breakpoint/watchpoint occurred and needs to be ignored. * /
78- b.w mriFaultHandler
76+ bne.w mriFaultHandler
77+ / * If not a debug event then fall through to default hard fault handler as something bad has happened. * /
78+ mov pc , r3
7979 .pool
8080 .size mriFaultHandlerStub , . - mriFaultHandlerStub
8181
8282
83+ . global mriHardFaultHandlerStub
84+ .type mriHardFaultHandlerStub , function
85+ .thumb_func
86+ / * extern "C" void mriHardFaultHandlerStub(void) ;
87+ This stub is called whenever a Hard Fault fires.
88+ * /
89+ mriHardFaultHandlerStub:
90+ / * Load address of real fault handler into r3 & call generic fault stub. * /
91+ ldr r3 , =mriThreadOrigHardFault
92+ ldr r3 , [ r3 ]
93+ b mriFaultHandlerStub
94+ .pool
95+ .size mriHardFaultHandlerStub , . - mriHardFaultHandlerStub
96+
97+
98+ . global mriMemManagementHandlerStub
99+ .type mriMemManagementHandlerStub , function
100+ .thumb_func
101+ / * extern "C" void mriMemManagementHandlerStub(void) ;
102+ This stub is called whenever a MemManagement fault fires.
103+ * /
104+ mriMemManagementHandlerStub:
105+ / * Load address of real fault handler into r3 & call generic fault stub. * /
106+ ldr r3 , =mriThreadOrigMemManagement
107+ ldr r3 , [ r3 ]
108+ b mriFaultHandlerStub
109+ .pool
110+ .size mriMemManagementHandlerStub , . - mriMemManagementHandlerStub
111+
112+
113+ . global mriBusFaultHandlerStub
114+ .type mriBusFaultHandlerStub , function
115+ .thumb_func
116+ / * extern "C" void mriBusFaultHandlerStub(void) ;
117+ This stub is called whenever a Bus Fault fires.
118+ * /
119+ mriBusFaultHandlerStub:
120+ / * Load address of real fault handler into r3 & call generic fault stub. * /
121+ ldr r3 , =mriThreadOrigBusFault
122+ ldr r3 , [ r3 ]
123+ b mriFaultHandlerStub
124+ .pool
125+ .size mriBusFaultHandlerStub , . - mriBusFaultHandlerStub
126+
127+
128+ . global mriUsageFaultHandlerStub
129+ .type mriUsageFaultHandlerStub , function
130+ .thumb_func
131+ / * extern "C" void mriUsageFaultHandlerStub(void) ;
132+ This stub is called whenever a Usage Fault fires.
133+ * /
134+ mriUsageFaultHandlerStub:
135+ / * Load address of real fault handler into r3 & call generic fault stub. * /
136+ ldr r3 , =mriThreadOrigUsageFault
137+ ldr r3 , [ r3 ]
138+ b mriFaultHandlerStub
139+ .pool
140+ .size mriUsageFaultHandlerStub , . - mriUsageFaultHandlerStub
141+
142+
143+
144+
83145 . global mriRTXHandlerStub
84146 .type mriRTXHandlerStub , function
85147 .thumb_func
0 commit comments