You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ma...@apache.org on 2015/10/30 01:41:24 UTC

incubator-mynewt-larva git commit: First take on printing system state in case of an unhandled interrupt (e.g. hard fault).

Repository: incubator-mynewt-larva
Updated Branches:
  refs/heads/master 5dc791ea0 -> ce6008417


First take on printing system state in case of an unhandled interrupt
(e.g. hard fault).


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/ce600841
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/ce600841
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/ce600841

Branch: refs/heads/master
Commit: ce6008417aa64f83489b4576eb6f7020c9ab0964
Parents: 5dc791e
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Thu Oct 29 17:40:33 2015 -0700
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Thu Oct 29 17:40:33 2015 -0700

----------------------------------------------------------------------
 libs/os/include/os/arch/cortex_m4/os/os_arch.h |  1 +
 libs/os/src/arch/cortex_m4/m4/HAL_CM4.s        | 24 +++++++++++
 libs/os/src/arch/cortex_m4/os_arch_arm.c       | 15 +++++++
 libs/os/src/arch/cortex_m4/os_fault.c          | 45 +++++++++++++++++++++
 4 files changed, 85 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/ce600841/libs/os/include/os/arch/cortex_m4/os/os_arch.h
----------------------------------------------------------------------
diff --git a/libs/os/include/os/arch/cortex_m4/os/os_arch.h b/libs/os/include/os/arch/cortex_m4/os/os_arch.h
index 55195bb..1d6bd13 100755
--- a/libs/os/include/os/arch/cortex_m4/os/os_arch.h
+++ b/libs/os/include/os/arch/cortex_m4/os/os_arch.h
@@ -69,6 +69,7 @@ os_error_t os_arch_os_init(void);
 os_error_t os_arch_os_start(void);
 void os_set_env(void);
 void os_arch_init_task_stack(os_stack_t *sf);
+void os_default_irq_asm(void);
 
 /* External function prototypes supplied by BSP */
 void os_bsp_systick_init(uint32_t os_tick_usecs);

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/ce600841/libs/os/src/arch/cortex_m4/m4/HAL_CM4.s
----------------------------------------------------------------------
diff --git a/libs/os/src/arch/cortex_m4/m4/HAL_CM4.s b/libs/os/src/arch/cortex_m4/m4/HAL_CM4.s
index 1c5651d..2db3790 100755
--- a/libs/os/src/arch/cortex_m4/m4/HAL_CM4.s
+++ b/libs/os/src/arch/cortex_m4/m4/HAL_CM4.s
@@ -201,6 +201,30 @@ SysTick_Handler:
         .fnend
         .size   SysTick_Handler, .-SysTick_Handler
 
+        .thumb_func
+        .type   os_default_irq_asm, %function
+        .global os_default_irq_asm
+os_default_irq_asm:
+        .fnstart
+        .cantunwind
+
+        /*
+         * LR = 0xfffffff9 if we were using MSP as SP
+         * LR = 0xfffffffd if we were using PSP as SP
+         */
+        TST     LR,#4
+        ITE     EQ
+        MRSEQ   R3,MSP
+        MRSNE   R3,PSP
+        PUSH    {R3-R11,LR}
+        MOV     R0, SP
+        BL      os_default_irq
+        POP     {R3-R11,LR}                 /* Restore EXC_RETURN */
+        BX      LR
+
+        .fnend
+        .size   os_default_irq_asm, .-os_default_irq_asm
+
         .end
 
 /*----------------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/ce600841/libs/os/src/arch/cortex_m4/os_arch_arm.c
----------------------------------------------------------------------
diff --git a/libs/os/src/arch/cortex_m4/os_arch_arm.c b/libs/os/src/arch/cortex_m4/os_arch_arm.c
index 8010edb..13a8ca4 100755
--- a/libs/os/src/arch/cortex_m4/os_arch_arm.c
+++ b/libs/os/src/arch/cortex_m4/os_arch_arm.c
@@ -17,6 +17,8 @@
 #include "os/os.h"
 #include "os/os_arch.h"
 
+#include <bsp/cmsis_nvic.h>
+
 /* Initial program status register */
 #define INITIAL_xPSR    0x01000000
 
@@ -183,6 +185,19 @@ os_arch_os_init(void)
             NVIC->IP[i] = 0xff;
         }
 
+        /*
+         * Install default interrupt handler, which'll print out system
+         * state at the time of the interrupt, and few other regs which
+         * should help in trying to figure out what went wrong.
+         */
+        NVIC_SetVector(-13, (uint32_t)os_default_irq_asm); /* Hardfault */
+        NVIC_SetVector(MemoryManagement_IRQn, (uint32_t)os_default_irq_asm);
+        NVIC_SetVector(BusFault_IRQn, (uint32_t)os_default_irq_asm);
+        NVIC_SetVector(UsageFault_IRQn, (uint32_t)os_default_irq_asm);
+        for (i = 0; i < NVIC_NUM_VECTORS - NVIC_USER_IRQ_OFFSET; i++) {
+            NVIC_SetVector(i, (uint32_t)os_default_irq_asm);
+        }
+
         /* Call bsp related OS initializations */
         os_bsp_init();
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/ce600841/libs/os/src/arch/cortex_m4/os_fault.c
----------------------------------------------------------------------
diff --git a/libs/os/src/arch/cortex_m4/os_fault.c b/libs/os/src/arch/cortex_m4/os_fault.c
index 5717084..e542b98 100644
--- a/libs/os/src/arch/cortex_m4/os_fault.c
+++ b/libs/os/src/arch/cortex_m4/os_fault.c
@@ -17,6 +17,7 @@
 #include <console/console.h>
 #include "os/os.h"
 
+#include <stdint.h>
 #include <unistd.h>
 
 int             os_die_line;
@@ -37,3 +38,47 @@ __assert_func(const char *file, int line, const char *func, const char *e)
     console_printf("Assert '%s; failed in %s:%d\n", e, file, line);
     _exit(1);
 }
+
+struct exception_frame {
+    uint32_t r0;
+    uint32_t r1;
+    uint32_t r2;
+    uint32_t r3;
+    uint32_t r12;
+    uint32_t lr;
+    uint32_t pc;
+    uint32_t psr;
+};
+
+struct trap_frame {
+    struct exception_frame *ef;
+    uint32_t sp;
+    uint32_t r4;
+    uint32_t r5;
+    uint32_t r6;
+    uint32_t r7;
+    uint32_t r8;
+    uint32_t r9;
+    uint32_t r10;
+    uint32_t r11;
+};
+
+void
+os_default_irq(struct trap_frame *tf)
+{
+    console_blocking_mode();
+    console_printf("Unhandled interrupt (%d), exception sp %8.8x",
+      SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk, (uint32_t)tf->ef);
+    console_printf(" r0:%8.8x  r1:%8.8x  r2:%8.8x  r3:%8.8x",
+      tf->ef->r0, tf->ef->r1, tf->ef->r2, tf->ef->r3);
+    console_printf(" r4:%8.8x  r5:%8.8x  r6:%8.8x  r7:%8.8x",
+      tf->r4, tf->r5, tf->r6, tf->r7);
+    console_printf(" r8:%8.8x  r9:%8.8x r10:%8.8x r11:%8.8x",
+      tf->r8, tf->r9, tf->r10, tf->r11);
+    console_printf("r12:%8.8x  lr:%8.8x  pc:%8.8x psr:%8.8x",
+      tf->ef->r12, tf->ef->lr, tf->ef->pc, tf->ef->psr);
+    console_printf("ICSR:%8.8x HFSR:%8.8x CFSR:%8.8x",
+      SCB->ICSR, SCB->HFSR, SCB->CFSR);
+    console_printf("BFAR:%8.8x MMFAR:%8.8x", SCB->BFAR, SCB->MMFAR);
+    while(1);
+}