BIOS知识枝桠——SCI SMI IRQ

  • Post author:
  • Post category:其他




中断

中断: 指当出现需要时, CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程.即在程序运行过程中, 系统出现了一个必须由CPU立即处理的情况, 此时, CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断.

在这里插入图片描述



中断分析

中断举例–比如你正在看书, 你的朋友跟你说他今天要找你一起去买东西, 有两种方式处理: 1. 你一直问他, 什么时候去? 2. 你继续看书, 等他找你. 第一种方式叫查询机制, 第二种方式就叫中断. 你朋友就是中断源, 找你去买东西就是中断程序

  • 中断程序–当CPU响应中断时(发出中断响应信号), 中断控制器向CPU提供中断类型码, CPU就转入对应的中断处理程序, 处理该事件

    .中断的优势
  • 不浪费CPU资源: 当采用查询机制时, 需要CPU在跑主程序时保持一直有资源去询问, 是否需要跑其他程序.这样会造成CPU资源浪费,

    采用中断则不会. 多个设备可以同时工作: 一旦有设备需要处理程序就可以发出中断. 响应时间快: 具有实时处理能力,

    对系统中各个参数状态能及时做出反应.

    BIOS中的中断
  • 常见的中断如IRQ/SCI/SMI…
  • IRQ 参考

    https://blog.csdn.net/vito_bin/article/details/52986011



SCI

  • SCI的全称是System Control Interrupt.硬件用来将ACPI事件通知操作系统的一种系统中断. 如: L Event, E Event, Q event.
  • SCI需要硬件支持, 中断源是硬件, 如: GPIO/SMBUS/EC. GPIO触发L ,E Event;EC触发的全部都是Q Event
  • SCI的软件环境是要ACPIOS,

    SCI只能在ACPI OS下才能被触发

    .
  • 触发SCI中断后, OSPM会调用ASL method (中断处理程序).



SMI

  • SMI的全称是

    System Management Interrupt.
  • SMI是不可屏蔽外部中断.优先级高于所有调试中断、NMI、可屏蔽中断和软中断.
  • 触发SMI后, 处理器就会进入SMM mode.
  • SMI的中断处理程序是BIOS C代码, 执行环境是SMM.
  • 处理器进入SMM mode后, 再触发的下一个SMI会被锁存(先放在内存中,处理当前的SMI), 直到退出SMM后才会被执行.



SMM

  • SMM的全称是

    System Management Mode

    .
  • SMM是一种特殊的CPU模式,主要用与硬件控制和一些OEM代码的执行,该模式有一块单独的内存空间SMRAM,占用实际内存,非映射.
  • SMM权限最高, 能访问几乎所有memory和IO资源, 无地址映射, 线性地址即物理地址.
  • 进入SMM mode的方式就是触发SMI.
  • SMRAM是一段特殊内存空间, 只能在SMM中被访问, 正常模式不能访问.是给CPU在SMM模式下用的, 退出SMM之后就会通过硬件映射被隐藏.
  • 触发SMI之后, CPU进入SMM模式,CPU会把当前的任务的信息例如寄存器等保存在SMRAM中, 等退出SMM时候再恢复
  • SMRAM里面有SMM dispatcher, SMM protocol, 变量, 代码等所有数据
  • 唯一退出SMM的方式是执行RSM指令, 且RSM只能在SMM中被执行.


    SMM体系结构


    在这里插入图片描述

    SMMIPL是一个DXE Driver,为进SMM模式提供环境,进行空间分配,函数预载入,等待SMI信号。



SCI和SMI的异同

相同点:

  • 都是系统中断.
  • 都需要BIOS进行配合.
  • 都可以通过硬件方式触发.

不同点:

  • 从中断优先级上看: SMI优先级要高于SCI.
  • 从触发条件上看: SCI需要硬件配合; 而部分SMI可以单纯由IO来触发.
  • 从运行环境上看: SCI需要依赖ACPI OS; SMI在ACPI和非ACPI模式下都可以用, 也可以在POST过程中运行.
  • 从操作系统层面看: 操作系统不知道SMI是否产生和执行. SCI是需要操作系统支持和参与.
  • 从BIOS代码来看: SCI用ASL实现中断程序; SMI用C语言实现中断程序.
  • 从运行内存来看: SCI的区域是可见的; SMI运行内存SMRAM, 运行完成退出之后, 这段内存不能被访问.

SCI的中断处理程序: _LXX/_EXX (level 、edge)

  • SCI有两种触发方式: 边沿触发和电平触发
  • 触发之后进入中断处理程序_LXX/_EXX
  • 触发的事件一般叫做GPE
  • XX代表着GPE中的第几个事件, 比如_L04代表电平触发方式的第4号GPE事件,每一个GPIO XX对应的数值在spec中都有明确规定,固定的
Method (\GPE.L04){  // GPE 4 level wake hamdler
    Notify (\_SB.PCIO.COM0,2)
}
  • 第4号对应着什么硬件行为, 要看GPE寄存器, 在FADT中有定义
  • _EXX同理



特殊的GPE: Q event

Q event也是GPE的一种, _Qxx方法是ASL中的名字, 由EC和SMBus产生.

  • 对于笔记本而言用的最多的Q event是由EC触发的. 当Q event触发时, EC会把Q event号传给操作系统下的EC driver.

    Q event与L/E event的差异
    • L/E event触发只需要硬件触发, 只需要GPIO触发,对应的GPIO号,就能找到对应的number号xx.
    • Q event需要软件告知OS, 才能触发对应的Q event number号xx.
    • 一根硬件GPIO pin只能产生一个L/E event, 但是可以产生很多Q event.

      当EC触发时,指定的事件会由method描述
//
//TP disable 
//EC触发Q event的时候, 指定是第3F号事件
Method (_Q3F,0,NotSerialized)
{
    Store(0x3F,P80H)
    Notify(\_SB.T2CD.TPD0,0x3F)
}



SMI的几种常见的注册

常见SMI如: SW SMI / Sleep SMI / Power Button SMI / GPIO SMI.

  • 以下只介绍SW SMI的例子(向B2或B0写值就能触发的SMI)
  • SW SMI注册, 如下注册一个ACPI enable SW 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
  )
 ......



SWSMI的触发

RW手动触发SWSMI demo

  • 首先要查看机器上的SW SMI port, 一般来说Intel为0xB2, AMD为0xB0. 以Intel机器为例
  • 第一步: 开机进OS, 打开RW
  • 第二步: 打开IO Space, 在IO Space Base中敲入0xB2
  • 第三步: 在offset 0x00的位置写入BOOT_SEQUENCE_UPDATE_SWSMI并回车, 则最终会执行到BootSmiCallback函数里面去

    在这里插入图片描述



常见SMI的应用

SW SMI 应用: OS下修改BIOS Setup variable.

  • Sleep SMI 应用: 系统下S3/S4/S5命令后被调用, 如AMDCRB在此SMI操作LED灯.
  • Power button SMI应用: 当power button被按下时调用.
  • GPIO SMI 应用: 利用Novo Button确认到底是否为HW hang.


    部分内容及拓展内容可见 ACPI spec V6.2, 4.8章, 4.8.1章, 5.6.4章; PI spec SMM;ACPI spec V6.2, 12章



版权声明:本文为weixin_45279063原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。