Software Delegated Exception Interface (SDEI) 软件委托异常接口的一种典型应用场景是利用APEI( ACPI Platform Error Interface)用作固件优先(firmware first)的RAS故障处理的通知机制。事实上SDEI只是在ACPI6.2版本引入的一种新的通知机制(firmware to OS),可以不受中断屏蔽的影响。

RAS是系统鲁棒性的重要特性,重点关注由硬件产生的故障,这些故障一般有两种处理方式:firmware first 和 kernel first。其中firmware first的处理流程如下图:

从上面的流程可以看出,SDEI是firmware到OS的通知机制,而CPER是firmware到OS传递故障信息的载体。
SDEI和CPER都是通过APEI中一种叫做HEST(Hardware Error Source Table)的表来承载, HEST表支持多种故障源类型,其中RAS故障通过GHES(Generic Hardware Error Source) V2结构来表示。


linux中的SDEI驱动初始化代码在 ./drivers/firmware/arm_sdei.c 的sdei_probe,
SDEI初始化过程主要做3件事:
sdei_firmware_call,明确SDEI调用是HVC还是SMC,可以通过acpi或者DTS表选择sdei_entry_point,也就是从firmware跳到OS的asm入口地址__sdei_asm_handlerOS通过sdei_firmware_call调用到了firmware会执行
sdei_smc_handler,sdei_smc_handler根据function ID执行相应的处理函数,比如SDEI_VERSION调用的function ID为 0xC400_0020,对应的处理函数为sdei_version。
sdei_register_ghes中首先从GHES的Notification Structure的的vector字段获取到event number,调用sdei_event_register为该event注册callback函数ghes_sdei_normal_callback或ghes_sdei_critical_callback,然后通过sdei_event_enable使能该eventsdei_event_create()把event添加到sdei_list,然后通过sdei_api_event_register()-> invoke_sdei_fn( SDEI_EVENT_REGISTERsdei_event_register完成事件注册sdei_dispatch_event(event_num)把故障分发到sdei client去处理setup_ns_dispatch填充要跳转的SDEI client的上下文,最后调用begin_sdei_synchronous_dispatch设置跳转点dispatch_jmp(从client返回的点),退出EL3sdei_set_elr_spsr设置ELR为注册事件的入口地址sdei_entry_point, 设置SPSR屏蔽中断(DISABLE_ALL_EXCEPTIONS)__sdei_asm_handler__ghes_sdei_callback,这里会从GHES的里获取到Generic Error Status Block添加到ghes_estatus_llist中,清除Block故障状态并通过read_ack_register给firmware一个应答,然后添加一个irq work也就是ghes_proc_in_irq到中断队列中ghes_proc_in_irq遍历ghes_estatus_llist并调用ghes_do_proc执行具体的故障处理动作sdei_event_complete中恢复上下文,调用end_sdei_synchronous_dispatch跳到dispatch_jmp继续执行。Reliability, Availability, and Serviceability(RAS) on ARM64
Firmware First Error Handling on ARM Neoverse Reference Design Platforms