authorNathael Pajani <nathael.pajani@ed3l.fr>
Wed, 23 Sep 2015 05:39:15 +0000 (07:39 +0200)
committerNathael Pajani <nathael.pajani@ed3l.fr>
Wed, 23 Sep 2015 05:39:15 +0000 (07:39 +0200)
apps/dtplug/usb/main.c
core/fault_handlers.c

index 066f637..39d4d89 100644 (file)
@@ -149,11 +149,15 @@ void system_init()
  * Note : The default one does a simple infinite loop. If the watchdog is deactivated
  * the system will hang.
  */
-void fault_info(const char* name, uint32_t len)
+struct exc_frame {
+       uint32_t r0, r1, r2, r3, r12;
+       uint32_t lr, pc, spsr;
+};
+void fault_info(uint32_t sp, const char* name)
 {
-       serial_write(0, name, len);
-       /* Wait for end of Tx */
-       serial_flush(0);
+       struct exc_frame *frame = (void *)sp;
+       uprintf(1, "%s: pc 0x%x lr 0x%x\n", name, frame->pc, frame->lr);
+       serial_flush(1);
        /* FIXME : Perform soft reset of the micro-controller ! */
        while (1);
 }
index 2045a52..7699a6c 100644 (file)
  */
 
 #include "core/lpc_regs_17xx.h"
+#include "core/lpc_core_cm3.h"
 
-void fault_info(const char* name, uint32_t len) __attribute__ ((weak, alias ("Dummy_Fault_Handler")));
+void fault_info(uint32_t sp, const char* name) __attribute__ ((weak, alias ("Dummy_Fault_Handler")));
 
-void Dummy_Fault_Handler(const char* name, uint32_t len) {
+
+void Dummy_Fault_Handler(uint32_t sp, const char* name) {
        while (1);
 }
 
 /* Cortex M3 core interrupt handlers */
-void NMI_Handler(void)
+void __attribute__((naked)) NMI_Handler(void)
 {
-       fault_info(__FUNCTION__, sizeof(__FUNCTION__));
+       uint32_t lr;
+       asm ("mov %0, lr" : "=r" (lr));
+       fault_info(lr & 1 ? get_main_stack_pointer() : get_process_stack_pointer(), __func__);
 }
 void HardFault_Handler(void)
 {
-       fault_info(__FUNCTION__, sizeof(__FUNCTION__));
+       uint32_t lr;
+       asm ("mov %0, lr" : "=r" (lr));
+       fault_info(lr & 1 ? get_main_stack_pointer() : get_process_stack_pointer(), __func__);
 }
 void MemFault_Handler(void)
 {
-       fault_info(__FUNCTION__, sizeof(__FUNCTION__));
+       uint32_t lr;
+       asm ("mov %0, lr" : "=r" (lr));
+       fault_info(lr & 1 ? get_main_stack_pointer() : get_process_stack_pointer(), __func__);
 }
 void BusFault_Handler(void)
 {
-       fault_info(__FUNCTION__, sizeof(__FUNCTION__));
+       uint32_t lr;
+       asm ("mov %0, lr" : "=r" (lr));
+       fault_info(lr & 1 ? get_main_stack_pointer() : get_process_stack_pointer(), __func__);
 }
 void UsageFault_Handler(void)
 {
-       fault_info(__FUNCTION__, sizeof(__FUNCTION__));
+       uint32_t lr;
+       asm ("mov %0, lr" : "=r" (lr));
+       fault_info(lr & 1 ? get_main_stack_pointer() : get_process_stack_pointer(), __func__);
 }
 void SVC_Handler(void)
 {
-       fault_info(__FUNCTION__, sizeof(__FUNCTION__));
+       uint32_t lr;
+       asm ("mov %0, lr" : "=r" (lr));
+       fault_info(lr & 1 ? get_main_stack_pointer() : get_process_stack_pointer(), __func__);
 }
 void PendSV_Handler(void)
 {
-       fault_info(__FUNCTION__, sizeof(__FUNCTION__));
+       uint32_t lr;
+       asm ("mov %0, lr" : "=r" (lr));
+       fault_info(lr & 1 ? get_main_stack_pointer() : get_process_stack_pointer(), __func__);
 }
 
 
-