summaryrefslogtreecommitdiff
path: root/libcpu
diff options
context:
space:
mode:
authorTangyuxin <[email protected]>2022-04-24 01:03:54 +0800
committerGitHub <[email protected]>2022-04-24 01:03:54 +0800
commitc80993f71328876a467a966563a4b6c11f8f2243 (patch)
treed88711e58df401541b9211e2191c2982881c733f /libcpu
parent13f8a99e460deb289d84bd61da725b30e97d9c3d (diff)
[libcpu][arm] Add exception install function (#5827)
Diffstat (limited to 'libcpu')
-rw-r--r--libcpu/arm/cortex-a/trap.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/libcpu/arm/cortex-a/trap.c b/libcpu/arm/cortex-a/trap.c
index 814db418cd..e8b3c8f0ec 100644
--- a/libcpu/arm/cortex-a/trap.c
+++ b/libcpu/arm/cortex-a/trap.c
@@ -19,6 +19,18 @@
extern long list_thread(void);
#endif
+static rt_err_t (*rt_exception_hook)(void *context) = RT_NULL;
+
+/**
+ * This function set the hook, which is invoked on fault exception handling.
+ *
+ * @param exception_handle the exception handling hook function.
+ */
+void rt_hw_exception_install(rt_err_t (*exception_handle)(void *context))
+{
+ rt_exception_hook = exception_handle;
+}
+
/**
* this function will show registers of CPU
*
@@ -33,6 +45,13 @@ void rt_hw_show_register(struct rt_hw_exp_stack *regs)
rt_kprintf("fp :0x%08x ip :0x%08x\n", regs->fp, regs->ip);
rt_kprintf("sp :0x%08x lr :0x%08x pc :0x%08x\n", regs->sp, regs->lr, regs->pc);
rt_kprintf("cpsr:0x%08x\n", regs->cpsr);
+ if (rt_exception_hook != RT_NULL)
+ {
+ rt_err_t result;
+
+ result = rt_exception_hook(regs);
+ if (result == RT_EOK) return;
+ }
}
void (*rt_trap_hook)(struct rt_hw_exp_stack *regs, const char *ex, unsigned int exception_type);