Skip to content

Commit 8adc980

Browse files
adamgreenfacchinm
authored andcommitted
Catch faults
Proof of concept for trapping faults in addition to DebugMon.
1 parent 8096dd0 commit 8adc980

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

libraries/ThreadMRI/examples/ThreadMRI/tests.S

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ testContext:
7272
mov r10, #10
7373
mov r11, #11
7474
mov r12, #12
75+
// Crash on read from invalid memory.
76+
ldr r0, =0xFFFFFFF0
77+
ldr r0, [r0]
7578
// Hardcoded breakpoint.
7679
bkpt #0
7780
// Infinite loop.

libraries/ThreadMRI/src/ThreadMRI.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -324,13 +324,23 @@ static void setHandlerPriorityLowerThanDebugger(IRQn_Type irq, uint32_t origPrio
324324
static void switchFaultHandlersToDebugger();
325325
#endif // UNDONE
326326

327+
// Forward Function Declarations
328+
static void switchFaultHandlersToDebugger();
329+
327330

328331
static void mriDebugMonitorHandler(void)
329332
{
330333
g_haltingThreadId = osThreadGetId();
331334
osThreadFlagsSet(g_mriThreadId, MRI_THREAD_DEBUG_EVENT_FLAG);
332335
}
333336

337+
static void mriFaultHandler(void)
338+
{
339+
g_haltingThreadId = osThreadGetId();
340+
osThreadFlagsSet(g_mriThreadId, MRI_THREAD_DEBUG_EVENT_FLAG);
341+
}
342+
343+
334344
void Platform_Init(Token* pParameterTokens)
335345
{
336346
#ifdef UNDONE
@@ -349,8 +359,8 @@ void Platform_Init(Token* pParameterTokens)
349359
g_pDebugSerial->setSerialPriority(0);
350360
NVIC_SetPriority(DebugMonitor_IRQn, 1);
351361

352-
switchFaultHandlersToDebugger();
353362
#endif // UNDONE
363+
switchFaultHandlersToDebugger();
354364
NVIC_SetVector(DebugMonitor_IRQn, (uint32_t)mriDebugMonitorHandler);
355365
enableDWTandITM();
356366
initDWT();
@@ -399,14 +409,14 @@ static void setHandlerPriorityLowerThanDebugger(IRQn_Type irq, uint32_t priority
399409
}
400410
NVIC_SetPriority(irq, priority);
401411
}
412+
#endif // UNDONE
402413

403414
static void switchFaultHandlersToDebugger(void) {
404-
NVIC_SetVector(HardFault_IRQn, (uint32_t)&mriFaultHandler);
405-
NVIC_SetVector(MemoryManagement_IRQn, (uint32_t)&mriFaultHandler);
406-
NVIC_SetVector(BusFault_IRQn, (uint32_t)&mriFaultHandler);
407-
NVIC_SetVector(UsageFault_IRQn, (uint32_t)&mriExceptionHandler);
415+
NVIC_SetVector(HardFault_IRQn, (uint32_t)mriFaultHandler);
416+
NVIC_SetVector(MemoryManagement_IRQn, (uint32_t)mriFaultHandler);
417+
NVIC_SetVector(BusFault_IRQn, (uint32_t)mriFaultHandler);
418+
NVIC_SetVector(UsageFault_IRQn, (uint32_t)mriFaultHandler);
408419
}
409-
#endif // UNDONE
410420

411421
uint32_t Platform_CommHasReceiveData(void)
412422
{

0 commit comments

Comments
 (0)