diff options
| author | Meco Jianting Man <[email protected]> | 2021-04-09 12:15:19 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-04-09 12:15:19 +0800 |
| commit | 342b0a3b1f72e874c8e033ffc267bc581f548054 (patch) | |
| tree | 7e7af9611a3f1e8fa56dc9d44a4200ed78413d61 /libcpu | |
| parent | f0157360b7793d22f8ec0a2364b6ce04bcb83c9e (diff) | |
| parent | 31cb379daeaeda2b1d4dba7670a90ea59e115ac8 (diff) | |
Merge pull request #36 from RT-Thread/master
pr
Diffstat (limited to 'libcpu')
| -rw-r--r-- | libcpu/arm/cortex-a/trap.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/libcpu/arm/cortex-a/trap.c b/libcpu/arm/cortex-a/trap.c index a213e776c7..3faa136677 100644 --- a/libcpu/arm/cortex-a/trap.c +++ b/libcpu/arm/cortex-a/trap.c @@ -47,30 +47,24 @@ void rt_hw_trap_undef(struct rt_hw_exp_stack *regs) { #ifdef RT_USING_FPU { - uint32_t ins; + uint32_t val; uint32_t addr; if (regs->cpsr & (1 << 5)) { /* thumb mode */ addr = regs->pc - 2; - ins = (uint32_t)*(uint16_t*)addr; - if ((ins & (3 << 11)) != 0) - { - /* 32 bit ins */ - ins <<= 16; - ins += *(uint16_t*)(addr + 2); - } } else { addr = regs->pc - 4; - ins = *(uint32_t*)addr; } - if ((ins & 0xe00) == 0xa00) + asm volatile ("vmrs %0, fpexc" : "=r"(val)::"memory"); + + if (!(val & 0x40000000)) { /* float ins */ - uint32_t val = (1U << 30); + val = (1U << 30); asm volatile ("vmsr fpexc, %0"::"r"(val):"memory"); regs->pc = addr; |
