1.前言
ARMv8 异常处理之el1_sync-CSDN博客
2.el1_undef
static void noinstr el1_undef(struct pt_regs *regs)
{
enter_from_kernel_mode(regs);
local_daif_inherit(regs);
do_undefinstr(regs);
local_daif_mask();
exit_to_kernel_mode(regs);
}
2.1 do_undefinstr
void do_undefinstr(struct pt_regs *regs)
{
/* check for AArch32 breakpoint instructions */
if (!aarch32_break_handler(regs))//处理 AArch32 模式下断点指令的函数。如果当前指令是断点指令,该函数会处理该异常,并返回 true
return;
//这是一个调用未定义指令钩子的函数。如果有钩子函数注册并成功处理了异常,它会返回 0;否则返回其他值
if (call_undef_hook(regs) == 0)
return;
//如果不是用户模式(即内核模式),则会触发 BUG,导致内核崩溃。
BUG_ON(!user_mode(regs));
//如果前面的处理都没有成功,最后会强制发送 SIGILL 信号(非法指令信号)给当前进程,
//通知进程发生了非