Home Linux System Error Interrupt
Post
Cancel

Linux System Error Interrupt

一、SEI

1 what is SEI?

SEI中断是什么?SEI exception

1
	#define *SEI*() __set_PRIMASK(0) //打开总中断
1
el1_sei

2 do_serror

https://patchwork.kernel.org/project/linux-arm-kernel/patch/20171019145807.23251-11-james.morse@arm.com/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//arch/arm64/kernel/entry.S
el1_error:
	kernel_entry 1
	mrs	x1, esr_el1
	enable_dbg
	mov	x0, sp
	bl	do_serror
	kernel_exit 1
ENDPROC(el1_error)

el0_error:
	kernel_entry 0
el0_error_naked:
	mrs	x1, esr_el1
	enable_dbg
	mov	x0, sp
	bl	do_serror
	enable_daif
	ct_user_exit
	b	ret_to_user
ENDPROC(el0_error)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//arch/arm64/kernel/traps.c
asmlinkage void do_serror(struct pt_regs *regs, unsigned int esr)
{
	const bool was_in_nmi = in_nmi();

	if (!was_in_nmi)
		nmi_enter();

	/* non-RAS errors are not containable */
	if (!arm64_is_ras_serror(esr) || arm64_is_fatal_ras_serror(regs, esr))
		arm64_serror_panic(regs, esr);

	if (!was_in_nmi)
		nmi_exit();
}

SError是ARM的一种什么异常,AArch64(ARM64)架构中,主要包括如下4中类型的异常:https://blog.csdn.net/shenhuxi_yu/article/details/81212008

  1. Synchronous exception(同步异常),“同步”可以理解为:发生异常的指令为导致异常的指令,即当导致异常发生的指令执行时能立即触发异常。 包括ARM架构中定义的所有Aborts异常,如:指令异常、数据异常、对齐异常等。
  2. SError,System Error,是一种异步异常,后面再仔细说明。
  3. IRQ,普通的中断,是异步异常。
  4. FIQ,高优先级的中断,是异步异常。

SError本质上是一种异步外部abort(asynchronous external abort)。所谓异步,就说是发生异常时硬件(相关的寄存器)不能提供有效信息用于分析定位,异常发生时的指令,并不是导致异常的指令。外部意味着异常来自于外部存储系统(相较于CPU来说,MMU是内部的)。通常是硬件触发的问题,比如硬件的clock出问题或者硬件本身的问题导致的bus访问硬件时出现问题。

Linux内核中,对SError进行了捕获,设置了相应的中断向量,当并未做实际的处理,只是上报异常,并终止进程会内核,因为对于内核来说,SError是致命的,内核自身无法做相应的修复操作,内核不知道具体原因,也不知道如何修复。

二、问题

(1) SEI是指 system Error Interupt? 怎么知道当前的fault 地址?

​ 系统错误异常: 生成异常的原因保存在寄存器ESR_EL1(异常症状寄存器, Exception Syndrome Register)。

(2)pagefault 缺页异常? SEI中断和缺页异常之间的关系?

​ 同步异常 :错误地址保存在寄存器FAR_EL1(错误地址寄存器,Fault Address Register), 生成异常的原因保存在寄存器ESR_EL1(异常症状寄存器, Exception Syndrome Register).

This post is licensed under CC BY 4.0 by the author.