From d5709b6c92e229cef5b8a8b3589ce5f8b6c50308 Mon Sep 17 00:00:00 2001 From: Peter Mitsis Date: Mon, 25 Apr 2016 14:22:27 -0400 Subject: [PATCH] arm float: Update exception stack frame structure Updates the exception stack frame structure to include floating point registers. Change-Id: I0fef784cf4d91dda245180abd75bfd9221825fba Signed-off-by: Peter Mitsis --- arch/arm/core/cortex_m/exc_manage.c | 8 ++++++++ arch/arm/core/fatal.c | 8 ++++++++ arch/arm/core/offsets/offsets.c | 5 +++++ include/arch/arm/cortex_m/exc.h | 5 +++++ 4 files changed, 26 insertions(+) diff --git a/arch/arm/core/cortex_m/exc_manage.c b/arch/arm/core/cortex_m/exc_manage.c index 7f0d50acece..2ccf71395a3 100644 --- a/arch/arm/core/cortex_m/exc_manage.c +++ b/arch/arm/core/cortex_m/exc_manage.c @@ -78,6 +78,14 @@ void sys_exc_esf_dump(NANO_ESF *esf) printk("r14/lr: %x\n", esf->lr); printk("r15/pc: %x ", esf->pc); printk("xpsr: %x\n", esf->xpsr); +#ifdef CONFIG_FLOAT + for (int i = 0; i < 16; i += 4) { + printk("s[%d]: %x s[%d]: %x s[%d]: %x s[%d]: %x\n", + i, esf->s[i], i + 1, esf->s[i + 1], + i + 2, esf->s[i + 2], i + 3, esf->s[i + 3]); + } + printk("fpscr: %x\n", esf->fpscr); +#endif } #endif /* CONFIG_XIP */ diff --git a/arch/arm/core/fatal.c b/arch/arm/core/fatal.c index 1c296128549..3cea40f109c 100644 --- a/arch/arm/core/fatal.c +++ b/arch/arm/core/fatal.c @@ -47,6 +47,14 @@ const NANO_ESF _default_esf = { {0xdeaddead}, /* r14/lr */ {0xdeaddead}, /* r15/pc */ 0xdeaddead, /* xpsr */ +#ifdef CONFIG_FLOAT + {0xdeaddead, 0xdeaddead, 0xdeaddead, 0xdeaddead, /* s0 .. s3 */ + 0xdeaddead, 0xdeaddead, 0xdeaddead, 0xdeaddead, /* s4 .. s7 */ + 0xdeaddead, 0xdeaddead, 0xdeaddead, 0xdeaddead, /* s8 .. s11 */ + 0xdeaddead, 0xdeaddead, 0xdeaddead, 0xdeaddead}, /* s12 .. s15 */ + 0xdeaddead, /* fpscr */ + 0xdeaddead, /* undefined */ +#endif }; /** diff --git a/arch/arm/core/offsets/offsets.c b/arch/arm/core/offsets/offsets.c index 9b11f29cde0..ee869f3d324 100644 --- a/arch/arm/core/offsets/offsets.c +++ b/arch/arm/core/offsets/offsets.c @@ -62,6 +62,11 @@ GEN_OFFSET_SYM(tESF, lr); GEN_OFFSET_SYM(tESF, pc); GEN_OFFSET_SYM(tESF, xpsr); +#ifdef CONFIG_FLOAT +GEN_OFFSET_SYM(tESF, s); +GEN_OFFSET_SYM(tESF, fpscr); +#endif + /* size of the entire tESF structure */ GEN_ABSOLUTE_SYM(__tESF_SIZEOF, sizeof(tESF)); diff --git a/include/arch/arm/cortex_m/exc.h b/include/arch/arm/cortex_m/exc.h index 58c54715dd9..a4df5275730 100644 --- a/include/arch/arm/cortex_m/exc.h +++ b/include/arch/arm/cortex_m/exc.h @@ -42,6 +42,11 @@ struct __esf { sys_define_gpr_with_alias(lr, r14); sys_define_gpr_with_alias(pc, r15); uint32_t xpsr; +#ifdef CONFIG_FLOAT + float s[16]; + uint32_t fpscr; + uint32_t undefined; +#endif }; typedef struct __esf NANO_ESF;