中断: 指当出现需要时, CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程.即在程序运行过程中, 系统出现了一个必须由CPU立即处理的情况, 此时, CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断.
中断举例–比如你正在看书, 你的朋友跟你说他今天要找你一起去买东西, 有两种方式处理: 1. 你一直问他, 什么时候去? 2. 你继续看书, 等他找你. 第一种方式叫查询机制, 第二种方式就叫中断. 你朋友就是中断源, 找你去买东西就是中断程序
相同点:
不同点:
SCI的中断处理程序: _LXX/_EXX (level 、edge)
Method (\GPE.L04){ // GPE 4 level wake hamdler
Notify (\_SB.PCIO.COM0,2)
}
Q event也是GPE的一种, _Qxx方法是ASL中的名字, 由EC和SMBus产生.
//
//TP disable
//EC触发Q event的时候, 指定是第3F号事件
Method (_Q3F,0,NotSerialized)
{
Store(0x3F,P80H)
Notify(\_SB.T2CD.TPD0,0x3F)
}
常见SMI如: SW SMI / Sleep SMI / Power Button SMI / GPIO SMI.
EFI_STATUS
BootSmmEntry(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
if(!InSmm()){
return EFI_UNSUPPORTED;
}
//Register Software SMI
{
EFI_SMM_SW_DISPATCH2_PROTOCOL *SwDispatch;
EFI_SMM_SW_REGISTER_CONTEXT SwContext;
EFI_HANDLE SwHandle;
EFI_STATUS Status;
//在写Driver的时候,通过gEfiSmmSwDispatch2ProtocolGuid注册该SMI,
Status = gSmst->SmmLocateProtocol (
&gEfiSmmSwDispatch2ProtocolGuid,
NULL,
&SwDispatch
);
ASSERT_EFI_ERROR (Status);
//BOOT_SEQUENCE_UPDATE_SWSMI这个号码必须是惟一的,通过SwDispatch 建立与函数实体的链接
SwContext.SwSmiInputValue = BOOT_SEQUENCE_UPDATE_SWSMI;
Status = SwDispatch->Register (
SwDispatch,
BootSmiCallback,
&SwContext,
&SwHandle
);
ASSERT_EFI_ERROR (Status);
}
}
//函数实体
EFI_STATUS
EFIAPI
BootSmicallback (
IN EFI_HANDLE DispatchHandle,
IN CONST VOID *Context OPTIONAL,
IN OUT VOID *CommBuffer OPTIONAL,
IN OUT UINTN *CommBufferSize OPTIONAL
)
......
RW手动触发SWSMI demo
SW SMI 应用: OS下修改BIOS Setup variable.