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);
+}