5.2.12. 多个APIC描述表(MADT)
ACPI中断模型以统一的中断模型实现方式描述了整个系统的所有中断。支持的中断型号包括PC-AT兼容双 8259 中断控制器(适用于基于英特尔处理器的系统)、英特尔高级可编程中断控制器(APIC)和英特尔精简高级可编程中断控制器(SAPIC),以及适用于ARM处理器系统的通用中断控制器(GIC)。支持的中断模型的选择取决于平台设计者。中断模型不能由系统固件动态改变; OSPM 将选择要使用的型号并在安装时安装对该型号的支持。如果一个平台支持多个型号,OS将仅安装对其中一种型号的支持;它不会混合模型。多重引导功能是许多现代操作系统的一项功能。这意味着一个系统可能同时安装多个操作系统或OS的多个实例。平台设计者必须考虑到这一点。
本节介绍多个APIC描述表(MADT)的格式,该表为OSPM提供在具有APIC、SAPIC或GIC实现的系统上操作所需的信息。
ACPI 将所有中断表示为“平坦”值,称为全局系统中断。因此,要在启用ACPI的系统上支持 APIC、SAPIC 或 GIC,每个使用的中断输入必须映射到ACPI使用的全局系统中断值。更多详细信息,请参见第 5.2.13 节。
需要额外的支持来处理实现可能支持的各种多处理器功能(例如,识别每个处理器的本地中断控制器ID)。
MADT中的所有地址都是与处理器相关的物理地址。
从 ACPI 规范 6.3 开始,不推荐使用 Processor() 对象。只有遗留系统才应该继续这种用法。仅在 Itanium 体系结构上,为 Processor() 提供了一个 _UID,它是一个字符串对象。 _UID 的这种用法也已被弃用,因为它可能会阻止OSPM将处理器与不可枚举设备(例如MADT中定义的设备)进行匹配。从 ACPI 规范 6.3 开始,除 Itanium 之外的所有体系结构的所有处理器对象现在都必须使用 _HID 为 ACPI0007 的 Device() 对象,并且仅使用整数 _UID 值。
| 表 5.19 多个APIC 说明表 (MADT) 格式 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 标题 | |||
| 签名 | 4 | 0 | “APIC”多个APIC 描述表的签名。 |
| 长度 | 4 | 4 | 整个MADT的长度(以字节为单位)。 |
| 修订 | 1 | 8 | 5 |
| 校验和 | 1 | 9 | 整个表的总和必须为零。 |
| OEMID | 6 | 10 | 10 OEM ID |
| OEM 表ID | 8 | 16 | 16对于MADT,表ID是制造商型号ID。 |
| OEM 修订 | 4 | 24 | OEM 所提供OEM 表ID 的MADT 修订版。 |
| 创建者ID | 4 | 28 | 28创建该表的实用程序的供应商ID。对于包含定义块的表,这是ASL编译器的ID。 |
| 创建者修订 | 4 | 32 | 32创建表的实用程序的修订。对于包含定义块的表,这是 ASL 编译器的修订版。 |
| 本地中断控制器地址 | 4 | 36 | 36每个处理器可以访问其本地中断控制器的 32 位物理地址。 |
| 旗帜 | 4 | 40 | 多个APIC标志。有关此字段的说明,请参阅多个APIC标志。 |
| 中断控制器结构[n] | – | 44 | 44此实现的中断控制器结构列表。该列表将包含支持该平台所需的中断控制器结构类型中的所有结构。这些结构将在以下部分中描述。 |
| 表 5.20 多个 APIC 标志 多个 APIC 标志 | 位长度 | 位偏移 | 描述 |
| --- | --- | --- | --- |
| PCAT_COMPAT | 1 | 0 | 1 表示系统还具有PC-AT兼容的双 8259 设置。启用ACPIAPIC操作时,必须禁用(即屏蔽)8259 个向量。 |
| 保留 | 31 | 1 | 该值为零。 |
紧接着MADT中的标志值之后是声明机器中断功能的中断控制器结构列表。每个结构的第一个字节声明该结构的类型,第二个字节声明该结构的长度。
| 表 5.21 中断控制器结构类型 值 | 描述 | _MAT 用于处理器对象 (a) | _MAT 用于 I/OAPIC 对象 (b) | 参考 |
|---|---|---|---|---|
| 0 | 本地处理器APIC | 是的 | 没有 | 第5.2.12.2节 |
| 1 | I/OAPIC | 没有 | 是的 | 第5.2.12.3节 |
| 2 | 中断源覆盖 | 没有 | 是的 | 第5.2.12.5节 |
| 3 | 不可屏蔽中断 (NMI) 来源 | 没有 | 是的 | 第5.2.12.6节 |
| 4 | 本地APIC NMI | 是的 | 没有 | 第5.2.12.7节 |
| 5 | 本地APIC 地址覆盖 | 没有 | 没有 | 第5.2.12.8节 |
| 6 | I/OSAPIC | 没有 | 是的 | 第5.2.12.9节 |
| 7 | 本地SAPIC | 是的 | 没有 | 第 5.2.12.10 节 |
| 8 | 平台中断源 | 没有 | 是的 | 第5.2.12.11节 |
| 9 | 处理器本地 x2APIC | 是的 | 没有 | 第5.2.12.12节 |
| 0xA | 本地 x2APICNMI | 是的 | 没有 | 第5.2.12.13节 |
| 0xB | GIC CPU 接口 (GICC) | 是的 | 没有 | 第5.2.12.14节 |
| 0xC | 0xC GIC 经销商 (GICD) | 没有 | 没有 | 第5.2.12.15节 |
| 0xD | GIC MSI 框架 | 没有 | 没有 | 第5.2.12.16节 |
| 0xE | GIC 再分销商 (GICR) | 没有 | 没有 | 第5.2.12.17节 |
| 0xF | GIC 中断翻译服务 (ITS) | 没有 | 没有 | 第5.2.12.18节 |
| 0x10 | 0x10多处理器唤醒 | 没有 | 没有 | 第5.2.12.19节 |
| 0x11-0x7F | 0x11-0x7F | 预订的。 OSPM 跳过保留类型的结构。 | 没有 | 没有 |
| 0x80-0xFF | 0x80-0xFF | 保留供OEM使用 | 没有 | 没有 |
笔记
(a) 当 _MAT(参见第 6.2.10 节)出现在处理器设备对象下(参见第 8.4 节)时,OSPM 处理 _MAT 返回的中断控制器结构,其类型标记为“yes”并忽略其他类型。
(b) 当 _MAT 出现在 I/O APIC 设备下时,OSPM 处理 _MAT 返回的类型标记为“yes”的中断控制器结构并忽略其他类型。
5.2.12.1. MADT 处理器本地 APIC / SAPIC 结构条目顺序
OSPM实施可能会限制多处理器平台上支持的处理器数量。 OSPM 在启动处理器上执行以初始化平台(包括其他处理器)。为了确保启动处理器在初始化后受支持,应遵循两个准则。第一个是OSPM应该按照MADT中出现的顺序初始化处理器。第二个是平台固件应将启动处理器列为MADT中的第一个处理器条目。
多线程处理器的出现产生了在公共处理器硬件上执行的多个逻辑处理器。 ACPI 以与物理处理器相同的方式定义逻辑处理器。为了确保非多线程感知OSPM实现在包含多线程处理器的平台上实现最佳性能,应遵循两个准则。第一个与上面相同,即OSPM应按照MADT中出现的顺序初始化处理器。其次,平台固件应在列出任何第二个逻辑处理器之前,在MADT中列出每个单独的多线程处理器的第一个逻辑处理器。这种方法应该用于所有连续的逻辑处理器。
如果OSPM实施和平台固件未能遵守这些准则,可能会导致不可预测的和非最佳的平台操作。
5.2.12.2. 处理器本地APIC结构
当使用APIC中断模型时,系统中的每个处理器都需要在MADT中拥有一个处理器本地APIC记录,并在DSDT中拥有一个处理器设备对象。如果处理器信息在OS启动的生命周期内发生变化,OSPM预计不会更新此表中提供的信息。在睡眠状态下,不允许添加、删除处理器,也不能更改其APIC、ID或“标志”。当处理器不存在时,不会报告处理器本地APIC信息或将其标记为禁用。
| 表 5.22 处理器本地APIC结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 0 处理器本地APIC 结构 |
| 长度 | 1 | 1 | 8 |
| ACPI 处理器 UID | 1 | 2 | 当处理器设备对象的 _UID 子对象(或处理器声明运算符中列出的 ProcessorId)求值为与此字段中的数值匹配的数值时,OS将此本地APIC结构与命名空间中的处理器对象相关联。请注意,不推荐使用处理器声明运算符。有关详细信息,请参阅本节开头的描述。 |
| APIC ID | 1 | 3 | 处理器的本地APICID。 |
| 旗帜 | 4 | 4 | 本地APIC 标志。有关该字段的说明,请参见下表(表 5.23)。 |
| 表 5.23 本地APIC标志 本地APIC标志 | 位长度 | 位偏移 | 描述 |
| --- | --- | --- | --- |
| 已启用 | 1 | 0 | 如果该位被设置,则处理器就可以使用了。如果该位清零并且设置了在线功能位,则系统硬件支持在OS运行时期间启用该处理器。如果该位被清零并且在线功能位也被清零,则该处理器不可用,并且OSPM应忽略处理器本地APIC结构的内容。 |
| 在线能力 | 1 | 1 | 该位传达的信息取决于启用位的值。如果设置了启用位,则该位被保留并且必须为零。否则,如果设置了该位,则系统硬件支持在OS运行时期间启用该处理器。 |
| 保留 | 30 | 2 | 必须为零。 |
5.2.12.3. I/OAPIC 结构
在APIC实现中,有一个或多个 I/O APIC。每个I/OAPIC都有一系列中断输入,称为INTIn,其中n的值从0到I/OAPIC上最后一个中断输入的编号。 I/OAPIC结构声明哪些全局系统中断与 I/OAPIC中断输入唯一关联。系统中的每个 I/OAPIC都有一个 I/OAPIC结构。有关全局系统中断的更多信息,请参见第 5.2.13 节
| 表 5.24 I/OAPIC 结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 1 I/OAPIC结构 |
| 长度 | 1 | 1 | 12 |
| I/O APIC ID | 1 | 2 | I/OAPIC的ID。 |
| 保留 | 1 | 3 | 0 |
| I/OAPIC 地址 | 4 | 4 | 用于访问此 I/O APIC 的 32 位物理地址。每个 I/OAPIC都位于唯一的地址。 |
| 全局系统中断库 | 4 | 8 | 该 I/OAPIC的中断输入开始的全局系统中断号。中断输入的数量由 I/O APIC 的最大 Redir Entry 寄存器决定。 |
5.2.12.4. 支持APIC 和双 8259 的平台
同时支持APIC和双 8259 中断模型的系统必须将全局系统中断 0-15 映射到 8259 IRQ 0-15,除非提供中断源覆盖(请参见下面的第 5.2.12.5 节)。这意味着 I/OAPIC中断输入 0-15 必须映射到全局系统中断 0-15,并且具有与 8259 IRQ 0-15 相同的源,除非使用覆盖。这使得平台能够支持使用 APIC 模型的 OSPM 实现以及使用 8259 模型的 OSPM 实现(OSPM 将仅使用一种模型;不会混合模型)。
当OSPM支持8259型号时,它将假设所有报告全局系统中断0-15的中断描述符对应于8259 IRQ。在 8259 模型中,所有大于 15 的全局系统中断都会被忽略。如果OSPM实现APIC支持,它将启用APIC,如APIC规范所述,并将使用所有报告的属于 I/OAPIC结构定义的中断输入限制的全局系统中断。有关硬件资源配置的更多信息,请参阅第 6 节
5.2.12.5. 中断源覆盖结构
中断源覆盖对于描述IA-PC标准双 8259 中断定义和平台实现之间的差异是必要的。
假设ISA中断将被标识映射到第一个 I/OAPIC源。然而,大多数现有的APIC设计至少包含这一假设的一个例外。提供中断源覆盖结构是为了描述这些异常。没有必要为每个ISA中断提供中断源覆盖。仅需要描述那些未身份映射到APIC中断输入的输入。
- 该规范仅支持覆盖ISA中断源。
例如,如果您的机器具有连接到 ISA IRQ 0 的 ISA 可编程中断定时器 (PIT),但在 APIC 模式下,它连接到 I/O APIC 中断输入 2,那么您需要一个源条目为“0”的中断源覆盖全局系统中断为“2”。
| 表 5.25 中断源覆盖结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 2 中断源覆盖 |
| 长度 | 1 | 1 | 10 |
| 巴士 | 1 | 2 | 0 常量,含义ISA |
| 来源 | 1 | 3 | 总线相关中断源 (IRQ) |
| 全局系统中断 | 4 | 4 | 该总线相关中断源将发出信号的全局系统中断。 |
| 旗帜 | 2 | 8 | MPS INTI 标志。有关此字段的说明,请参阅下面相应的表。 |
表 5.26 中列出的MPS、INTI标志与MPS版本 1.4 规范表 4-10 中使用的标志相同。极性标志是PO位,触发模式标志是EL位。
| 表 5.26 MPS INTI 标志 本地APIC - 标志 | 位长度 | 位偏移 | 描述 |
|---|---|---|---|
| 极性 | 2 | 0 | APIC I/O 输入信号的极性:00 符合总线规范(例如,EISA 对于电平触发中断为低电平有效)。 01 高电平有效 10 保留 11 低电平有效 |
| 触发模式 | 2 | 2 | APIC I/O 输入信号触发方式: 00 符合总线规范(例如ISA 为边沿触发) 01 边沿触发 10 保留 11 电平触发 |
| 保留 | 12 | 12 4 | 必须为零。 |
当标识映射中断输入具有非标准极性时,中断源覆盖也是必要的。
- 如果IRQ未进行身份映射,则必须将IRQ的中断源覆盖条目映射到SCI中断。此条目将覆盖 FADT 中 SCI_INT 中的值。例如,如果在 PIC 模式下 SCI 连接到 IRQ 9,并且 IRQ 9 在 APIC 模式下连接到 INTIN11,则 FADT 中的 SCI_INT 中应该有 9,并且有一个中断源覆盖条目映射IRQ 9 至 INTIN11。
5.2.12.6. 不可屏蔽中断 (NMI) 源结构
该结构允许平台设计人员指定应将哪些 I/O (S)APIC中断输入启用为不可屏蔽。任何不可屏蔽的源都无法供设备使用。
| 表 5.27 NMI 源结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 3NMI来源 |
| 长度 | 1 | 1 | 8 |
| 旗帜 | 2 | 2 | 与MPS INTI 标志相同 |
| 全局系统中断 | 4 | 4 | NMI将发出信号的全局系统中断。 |
5.2.12.7. 本地APIC NMI 结构
此结构描述了本地APIC中断输入 (LINTn),NMI连接到系统中存在此类连接的每个处理器。 OSPM需要此信息来启用相应的本地APIC条目。
每个本地APIC NMI 连接需要单独的本地APIC NMI 结构。例如,如果平台有 4 个处理器,ID为 0-3,并且NMI连接到处理器 3 和 2 的LINT1,则MADT中将需要两个本地APIC和NMI条目。
| 表 5.28 本地APIC NMI 结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 4 本地APIC NMI 结构 |
| 长度 | 1 | 1 | 6 |
| ACPI 处理器 UID | 1 | 2 | 与处理器设备对象中列出的 _UID 对应的值,或与处理器对象中列出的ID对应的处理器ID。值 0xFF 表示这适用于机器中的所有处理器。请注意,不推荐使用处理器声明运算符。请参阅处理器本地 x2APIC 结构中的兼容性说明,并参阅处理器(声明处理器)。 |
| 旗帜 | 2 | 3 | MPS INTI 标志。有关该字段的说明,请参见表 5.26。 |
| 本地 APIC LINT# | 1 | 5 | 本地APIC中断输入 LINTn,NMI连接到该输入。 |
5.2.12.8. 本地APIC地址覆盖结构
此可选结构通过在MADT表头(定义为 32 位字段)中提供本地APIC物理地址的覆盖来支持 64 位系统。
如果已定义,OSPM必须使用此结构中为所有本地 APIC(和本地 SAPIC)指定的地址,而不是MADT表头中包含的地址。只能定义一个本地APIC地址覆盖结构。
| 表 5.29 本地APIC 地址覆盖结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 5 本地APIC 地址覆盖结构 |
| 长度 | 1 | 1 | 12 |
| 保留 | 2 | 2 | 保留(必须设置为零) |
| 本地APIC 地址 | 8 | 4 | 本地APIC 的物理地址。对于基于 Itanium™ 处理器系列 (IPF) 的平台,该字段包含处理器中断块的起始地址。有关详细信息,请参阅英特尔® 安腾™ 架构软件开发人员手册。 |
5.2.12.9. I/OSAPIC 结构
I/OSAPIC结构与 I/OAPIC结构非常相似。如果对于特定APIC、ID同时存在 I/OAPIC和 I/OSAPIC结构,则必须使用 I/OSAPIC结构中的信息。
I/O SAPIC 结构使用 I/O APIC 表中定义的 I/O APIC ID 字段。 Global System Interrupt Base 字段保持不变,但已移动。 I/OAPIC 地址字段已被删除。添加了新的地址和保留字段。
| 表 5.30 I/OSAPIC 结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 6 I/OSAPIC 结构 |
| 长度 | 1 | 1 | 16 |
| I/O APIC ID | 1 | 2 | I/OSAPICID |
| 保留 | 1 | 3 | 保留(必须为零) |
| 全局系统中断库 | 4 | 4 | 该 I/OSAPIC的中断输入开始的全局系统中断号。中断输入的数量由 I/OSAPIC的最大 Redir Entry 寄存器决定。 |
| I/OSAPIC 地址 | 8 | 8 | 用于访问此 I/O SAPIC 的 64 位物理地址。每个 I/OSAPIC都位于唯一的地址。 |
如果已定义,OSPM必须使用 I/OSAPIC结构中包含的信息,而不是 I/OAPIC结构中的信息。
如果MADT中同时存在 I/OAPIC和 I/OSAPIC结构,则OEM/平台固件编写器必须防止“混合”I/OAPIC和 I/OSAPIC地址。这是通过确保 I/OSAPIC结构至少与 I/OAPIC结构一样多,并且每个 I/OAPIC结构都有一个相应的 I/OSAPIC结构(相同的APIC和ID)来完成的。
5.2.12.10. 本地SAPIC结构
处理器本地SAPIC结构与处理器本地APIC结构非常相似。当使用SAPIC中断模型时,系统中的每个处理器都需要在MADT中拥有一个处理器本地SAPIC记录,并在DSDT中拥有一个处理器设备对象。如果处理器信息在OS启动的生命周期内发生变化,OSPM预计不会更新此表中提供的信息。在休眠状态下,不允许添加、删除处理器,也不能更改其SAPIC、ID或“Flags”。当处理器不存在时,不会报告处理器本地SAPIC信息或将其标记为禁用。
| 表 5.31 处理器本地SAPIC结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 7 处理器本地SAPIC结构 |
| 长度 | 1 | 1 | 本地SAPIC结构的长度(以字节为单位)。 |
| ACPI 处理器 ID | 1 | 2 | OSPM 将本地 SAPIC 结构与使用 Processor 语句在命名空间中声明的处理器对象相关联,方法是将处理器对象的 ProcessorID 值与此字段进行匹配。不推荐使用 Processor 语句。请参阅处理器本地 x2APIC 结构和处理器(声明处理器)中的兼容性说明。 |
| 本地 SAPIC ID | 1 | 3 | 处理器的本地SAPIC ID |
| 本地 SAPIC EID | 1 | 4 | 处理器的本地 SAPIC EID |
| 保留 | 3 | 5 | 保留(必须设置为零) |
| 旗帜 | 4 | 8 | 本地SAPIC 标志。有关此字段的说明,请参阅本地APIC 标志。 |
| ACPI 处理器 UID 值 | 4 | 12 | 12当处理器设备的 _UID 子对象计算为数值时,通过将数值与此字段进行匹配,OSPM 将本地 SAPIC 结构与使用 Device 语句在命名空间中声明的处理器对象关联起来。 |
| ACPI 处理器 UID 字符串 | >=1 | 16 | 16当处理器设备的 _UID 子对象计算为字符串时,通过将字符串与此字段进行匹配,OSPM 将本地SAPIC 结构与使用 Device 语句在命名空间中声明的处理器对象相关联。该值存储为以 null 结尾的ASCII字符串。 |
5.2.12.11. 平台中断源结构
平台中断源结构用于传达哪些 I/OSAPIC中断输入连接到平台中断源。
平台管理中断 (PMI) 用于调用平台固件来处理各种事件(类似于IA-32中的SMI)。 Intel® ItaniumTM 架构允许 I/OSAPIC在PMI类型的中断消息中发送向量值。该值在平台中断源结构的 I/OSAPIC向量字段中指定。
INIT消息导致处理器软重置。
如果平台可以在纠正平台错误(例如单位错误纠正)后生成中断,则用于发出此类纠正错误信号的中断输入线由下表中的全局系统中断字段指定。某些系统可能会将纠正的平台错误信息的检索限制为特定处理器。在这种情况下,固件指示可以通过以下结构中的处理器ID和EID字段检索更正的平台错误信息的处理器。需要OSPM来使用ACPI系统固件指定的处理器ID、EID值对 I/OSAPIC重定向表条目进行编程。在可以在任何处理器上检索更正的平台错误信息的平台上,固件通过在下面结构的平台中断源标志字段中设置CPEI处理器覆盖标志来指示此功能。如果设置了CPEI处理器覆盖标志,则OSPM使用下面结构的“处理器”ID和EID字段指定的处理器仅作为目标处理器提示,并且可以在系统中的任何处理器上执行错误检索。但是,固件需要在处理器ID、EID字段中指定有效值,以确保向后兼容性。
如果清除CPEI处理器覆盖标志,OSPM可能会拒绝针对已纠正平台错误中断的处理器的弹出请求。如果设置了CPEI处理器覆盖标志,则OSPM可以在弹出目标处理器时将更正的平台错误中断重新定向到不同的处理器。
请注意,_MAT 对象可以返回包含平台中断源结构条目的缓冲区。如果平台中断源标志的值相同,则允许此类条目引用已通过静态MADT表提供的平台中断源结构指定的全局系统中断。
有关处理更正的平台错误中断的详细信息,请参阅 Itanium™ 处理器系列系统抽象层 (SAL) 规范。
| 表 5.32 平台中断源结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 8 平台中断源结构 |
| 长度 | 1 | 1 | 16 |
| 旗帜 | 2 | 2 | MPS INTI 标志。有关该字段的说明,请参见表 5.26。 |
| 中断类型 | 1 | 4 | 1PMI |
| 处理器ID | 1 | 5 | 目的地处理器ID。 |
| 处理器EID | 1 | 6 | 目的地处理器EID。 |
| I/OSAPIC矢量 | 1 | 7 | 对于中断类型为PMI的条目,OSPM必须使用该值对 I/OSAPIC重定向表条目的向量字段进行编程。 |
| 全局系统中断 | 4 | 8 | 该平台中断将发出信号的全局系统中断。 |
| 平台中断源标志 | 4 | 12 | 12平台中断源标志。有关此字段的说明,请参阅平台中断源标志 |
| 表 5.33 平台中断源标志 平台中断源标志 | 位长度 | 位偏移 | 描述 |
| --- | --- | --- | --- |
| CPEI 处理器覆盖 | 1 | 0 | 设置后,表示允许从任何处理器检索错误信息,并且OSPM将使用平台中断源结构的处理器ID、EID字段提供的信息作为目标处理器提示。 |
| 保留 | 31 | 1 | 必须为零。 |
5.2.12.12. 处理器本地 x2APIC 结构
处理器X2APIC结构与处理器本地APIC结构非常相似。使用X2APIC中断模型时,逻辑处理器需要在DSDT中具有处理器设备对象,并且必须使用处理器本地X2APIC结构将处理器的APIC信息传送到OSPM。
- [兼容性说明] 在某些旧版操作系统上,APIC ID 值小于 255 的逻辑处理器(无论是在 XAPIC 还是 X2APIC 模式下)必须使用处理器本地 APIC 结构将其 APIC 信息传送至 OSPM,并且这些处理器必须使用 Processor() 关键字在DSDT 中声明。 APIC ID 值等于或大于 255 的逻辑处理器必须使用 Processor Local x2APIC 结构并使用 Device() 关键字进行声明。
如果处理器信息在OS启动的生命周期内发生变化,OSPM预计不会更新此表中提供的信息。在睡眠状态下,不得添加或删除逻辑处理器,也不得更改其X2APIC、ID或 x2APIC 标志。当逻辑处理器不存在时,不会报告处理器本地X2APIC信息或将其标记为禁用。
x2APIC 结构的格式在第 5.2.12.12 节中列出。
| 表 5.34 处理器本地 x2APIC 结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 9 处理器本地x2APIC结构 |
| 长度 | 1 | 1 | 16 |
| 保留 | 2 | 2 | 保留 - 必须为零 |
| X2APIC ID | 4 | 4 | 处理器的本地 x2APICID。 |
| 旗帜 | 4 | 8 | 与本地APIC 标志相同。有关此字段的说明,请参阅本地APIC 标志。 |
| ACPI 处理器 UID | 4 | 12 | 12当处理器设备的 _UID 子对象计算为数值时,通过将数值与此字段进行匹配,OSPM 将 X2APIC 结构与使用 Device 语句在命名空间中声明的处理器对象关联起来。 |
5.2.12.13. 本地 x2APICNMI 结构
Local APIC NMI 和 Local x2APIC NMI 结构描述了系统中存在此类连接的每个逻辑处理器的 NMI 连接到的中断输入 (LINTn)。每个与处理器的NMI连接都需要一个单独的NMI结构。 OSPM需要此信息来启用相应的APIC条目。
NMI 与具有本地 x2APIC ID 255 及更高版本的逻辑处理器的连接需要 X2APIC NMI 结构。 NMI 与 x2APIC ID 小于 255 的逻辑处理器的连接需要本地 APIC NMI 结构。例如,如果平台包含 x2APIC ID 为 0-3 和 256-259 的 8 个逻辑处理器,并且为处理器 3、2、256 和 257 连接了 NMI LINT1,则两个本地 APIC NMI 条目和两个 X2APIC NMI条目必须在MADT 中提供。
如果所有逻辑处理器的 x2APIC ID 小于 255,则 Local APIC NMI 结构用于为所有处理器指定全局 LINTx。如果平台包含 x2APIC ID 为 255 或更大的任何逻辑处理器,则必须使用 Local X2APIC NMI 结构为ALL逻辑处理器指定全局 LINTx。 x2APICNMI结构的格式在第 5.2.12.13 节中列出。
| 表 5.35 本地 x2APICNMI 结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 0AH 本地 x2APICNMI 结构 |
| 长度 | 1 | 1 | 12 |
| 旗帜 | 2 | 2 | 与 MPS INTI 标志相同。请参阅MPS INTI 标志 了解此字段的说明。 |
| ACPI 处理器 UID | 4 | 4 | UID 对应于处理器设备对象中列出的ID。值 0xFFFFFFFF 表示这适用于计算机中的所有处理器。 |
| 本地 x2APICLINT# | 1 | 8 | 连接到 NMI 的本地 x2APIC 中断输入 LINTn。 |
| 保留 | 3 | 9 | 保留 - 必须为零。 |
5.2.12.14. GIC CPU 接口 (GICC) 结构
在GIC中断模型中,逻辑处理器需要在DSDT中具有一个处理器设备对象,并且必须使用GICC结构将每个处理器的GIC信息传送到OS信息。
GICC结构的格式如下表所示。
| 表 5.36 GICC 结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 0xBGICC结构 |
| 长度 | 1 | 1 | 80 |
| 保留 | 2 | 2 | 保留 - 必须为零 |
| CPU 接口编号 | 4 | 4 | GIC 的 CPU 接口编号。在 GICv1/v2 实现中,该值与GIC分配器的GICD_ITARGETSR寄存器中关联处理器的位索引相匹配。对于 GICv3/4 实现,如果支持兼容模式,则该字段必须由平台提供。如果实现不支持,则该字段必须为零。 |
| ACPI 处理器 UID | 4 | 8 | 当处理器设备的 _UID 子对象的计算结果与此字段中的数值匹配时,OS将此GICC结构与命名空间中的处理器设备对象相关联。 |
| 旗帜 | 4 | 12 | 12请参阅GICC CPU 接口标志。 |
| 停车协议版本 | 4 | 16 | 16实施ARM处理器停放协议版本。请参阅 http://uefi.org/acpi. 文档链接列在“ARM 平台的多处理器启动”下。 对于仅支持 PSCI 且不支持停放协议的系统,该字段必须设置为 0。 |
| 性能中断GSIV | 4 | 20 | 用于性能监控中断的GSIV |
| 停放地址 | 8 | 24 | 处理器的停车协议邮箱的 64 位物理地址 |
| 物理基址 | 8 | 32 | 32在处于 GICv2 兼容模式的 GICv1/v2 系统和 GICv3/4 系统上,该字段保存处理器可以访问此GIC、CPU接口的 64 位物理地址。如果此处提供,MADT中的“本地中断控制器地址”字段必须被OSPM忽略。 |
| GICV | 8 | 40 | GIC虚拟CPU接口寄存器的地址。如果平台未提供具有虚拟化扩展的 GICv2,则该字段可以为 0。 |
| GICH | 8 | 48 | 48 GIC虚拟接口控制块寄存器的地址。如果平台未提供具有虚拟化扩展的 GICv2,则该字段可以为 0。 |
| VGIC 维护中断 | 4 | 56 | 56 GSIV 用于虚拟 GIC 维护中断 |
| GICR 基址 | 8 | 60 | 在支持 GICv3 及更高版本的系统上,该字段保存关联的再分发器的 64 位物理地址。如果所有GIC再分配器都位于常开电源域中,则应使用GICR结构来描述再分配器,并且该字段必须设置为 0。如果MADT中存在GICR结构,则OSPM必须忽略该字段。 |
| MPIDR | 8 | 68 | 68 该字段遵循ARM架构的MPIDR格式。如果使用 ARMv7 架构,则格式必须如下: Bits [63:24] 必须为零 Bits [23:16] Aff2:匹配目标处理器的 Aff2 MPIDR Bits [15:8] Aff1:匹配目标处理器的 Aff1 MPIDR Bits [7:0] Aff0:匹配目标处理器的 Aff0 MPIDR 对于实现 ARMv8 的平台,格式必须为: 位 [63:40] 必须为零 位 [39:32] Aff3:匹配目标处理器的 Aff3 MPIDR 位 [31:24] 必须为零 位 [23:16] Aff2:匹配目标处理器的 Aff2 MPIDR 位 [15:8] Aff1 : 匹配目标处理器的 Aff1 MPIDR 位 [7:0] Aff0 : 匹配目标处理器的 Aff0 MPIDR |
处理器能效等级 | 1 | 76 | 76描述关联处理器的相对功率效率。较低效率等级数字比较较高效率等级数字更高(例如,效率等级 0 应被视为比效率等级 1 更有效)。然而,这个数字的绝对值没有任何意义:2 的效率不一定是 1 的一半。 保留 | 1 | 77 | 77必须为零。 SPE 溢出中断| 2 | 78 | 78统计分析扩展缓冲区溢出GSIV。该中断是电平触发的PPI。如果该处理器不支持SPE,则为零。
| 表 5.37 GICC CPU 接口标志 GIC 标志 | 位长度 | 位偏移 | 描述 |
|---|---|---|---|
| 已启用 | 1 | 0 | 如果为零,则该处理器不可用,并且操作系统支持将不会尝试使用它。 |
| 性能中断模式 | 1 | 1 | 0 - 电平触发 |
| VGIC 维护中断模式标志 | 1 | 2 | 0 - 电平触发 |
| 保留 | 29 | 29 3 | 必须为零。 |
5.2.12.15. GIC 分配器 (GICD) 结构
ACPI 将所有有线中断表示为“平坦”值,称为全局系统中断 (GSIV),如第 5.2.13 节所述。在基于ARM的系统上,通用中断控制器(GIC)管理系统上的中断。每个中断在GIC中通过中断标识符(INTID)进行标识。 ACPI GSIV 与外设中断的 GIC INTID 一一对应,无论是共享 (SPI) 还是私有 (PPI)。 GIC分配器结构将GIC分配器描述为OS。对于基于ARM的系统,MADT中必须存在一个且只有一个GIC分配器结构。
表5.38列出了GICD结构的格式。
| 表 5.38 GICD 结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 0xCGICD结构 |
| 长度 | 1 | 1 | 24 |
| 保留 | 2 | 2 | 保留 - 必须为零 |
| GIC ID | 4 | 4 | 此GIC 分销商的硬件ID |
| 物理基址 | 8 | 8 | 该分发器的 64 位物理地址 |
| 系统向量库 | 4 | 16 | 16保留 - 必须为零 |
| GIC版本 | 1 | 20 | 0x00:未指定GIC版本,回退到GIC版本的硬件发现 |
| 保留 | 3 | 21 | 21必须为零 |
5.2.12.16. GIC MSI 框架结构
每个 GICv2mMSI帧由一个 4k 页组成,其中包括寄存器,用于向关联的GIC分配器生成消息信号中断。该帧还包括用于发现可由该帧中的 MSI 发出信号的分配器线路组的寄存器。一个系统可能有多个MSI帧,并且可以为安全和非安全访问定义单独的帧。该结构只能用于描述非安全MSI帧。
GIC、MSI帧结构的格式在第 5.2.12.16 节中列出。
| 表 5.39 GIC MSI 帧结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 0xDGICMSI 帧结构 |
| 长度 | 1 | 1 | 24 |
| 保留 | 2 | 2 | 保留 - 必须为零 |
| GIC MSI 框架 ID | 4 | 4 | GIC MSI 框架ID。在具有多个 GIC MSI 帧的系统中,每个帧的该值必须是唯一的。 |
| 物理基址 | 8 | 8 | 此MSI帧的 64 位物理地址 |
| 旗帜 | 4 | 16 | 16 GIC MSI 帧标志。参见第 5.2.12.16 节 |
| SPI 计数 | 2 | 20 | SPI 该帧使用的计数。除非SPI计数选择标志设置为 1,否则该值应与帧中MSI_TYPER寄存器的低 16 位相匹配。 |
| SPI 底座 | 2 | 22 | 22 SPI 该框架使用的底座。除非SPI基址选择标志设置为 1,否则该值应与帧中MSI_TYPER寄存器的高 16 位相匹配。 |
| 表 5.40 GIC MSI 帧标志 GIC MSI 帧标志 | 位长度 | 位偏移 | 描述 |
| --- | --- | --- | --- |
| SPI 计数/基数选择 | 1 | 0 | 0:应忽略SPI计数和基数字段,并应从关联的GIC、MSI帧中的MSI_TYPER寄存器中查询实际值。 |
| 保留 | 31 | 1 | 必须为零。 |
5.2.12.17. GIC 再分配器 (GICR) 结构
GICR结构如表 5.41 所示。此结构通过提供包含GIC再分发器的页面范围的物理基地址,可以发现GIC再分发器基地址。 MADT中可以出现多个GICR结构。 GICR 结构仅应在描述符合 GIC 架构版本 3 或更高版本的 GIC 实现并将所有再分配器置于始终在线电源域中时使用。当出现 GICR 结构时,OSPM 必须忽略GICC结构(见下表)。
| 表 5.41 GICR 结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 0xEGICR结构 |
| 长度 | 1 | 1 | 16 |
| 保留 | 2 | 2 | 保留 - 必须为零 |
| 发现范围基址 | 8 | 4 | 包含所有GIC再分发器的页面范围的 64 位物理地址 |
| 探索范围长度 | 4 | 12 | 12 GIC再发行商发现页面范围的长度。 |
5.2.12.18. GIC 中断翻译服务 (ITS) 结构
GICv3/v4 实现中可选择支持GIC、ITS。表 5.42 列出了GIC ITS 结构的格式:
| 表 5.42 GIC ITS 结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 0xFGICITS结构 |
| 长度 | 1 | 1 | 20 |
| 保留 | 2 | 2 | 保留 - 必须为零 |
| GIC ITS ID | 4 | 4 | GICITSID。在具有多个 GIC ITS 单元的系统中,每个单元的该值必须是唯一的。 |
| 物理基址 | 8 | 8 | 中断转换服务的 64 位物理地址 |
| 保留 | 4 | 16 | 16保留 - 必须为零 |
5.2.12.19. 多处理器唤醒结构
平台固件发布了多处理器唤醒结构,让引导处理器通过邮箱唤醒应用处理器。邮箱是固件保留的内存,以便每个处理器可以让OS向它们发送消息。
在系统启动期间,固件将应用程序处理器置于检查邮箱的状态。共享邮箱是固件在ACPINvs内存中分配的4K对齐的4K大小的内存块。当固件将控制权转移到OS加载器时,不允许固件修改邮箱位置。邮箱分为两个 2KB 部分:OS部分和固件部分。
除命令字段外,OS部分只能由OS写入并由固件读取。应用处理器需要清除 Noop(0) 命令,作为收到命令的确认。在清除 WakeupVector 等命令之前,固件必须缓存邮箱中的内容,以便以后可能使用。只有将命令更改为Noop(0)后,OS才能发送下一条命令。固件部分必须被视为对OS来说是只读的,并且只能由固件写入。 OS和FW之间的所有数据通信都必须采用小端格式。
OS部分包含命令、标志、APIC、ID和唤醒地址。当OS从MADT表中检测到处理器编号后,OS可以准备唤醒例程,将唤醒地址字段填充到邮箱中,在APID、ID字段中指示需要唤醒哪个处理器,并发送唤醒命令。一旦应用处理器检测到唤醒命令及其自身的APIC、ID,应用处理器将跳转到OS提供的唤醒地址。如果APICID与自己的不匹配,应用程序处理器将忽略该命令。
对于每个应用处理器,邮箱只能用于唤醒命令一次。当应用程序进程根据命令采取行动后,该邮箱将不再被该应用程序处理器检查。其他处理器可以继续使用该邮箱来执行下一个命令。
| 表 5.43 多处理器唤醒结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 0x10 多处理器唤醒结构 |
| 长度 | 1 | 1 | 16 |
| 邮箱版本 | 2 | 2 | 邮箱的版本。此版本的规范为 0。 |
| 保留 | 4 | 4 | 必须为 0。 |
| 邮箱地址 | 8 | 8 | 邮箱的物理地址。它必须在 ACPINvs 中。它还必须是 4K 字节对齐。邮箱定义请参见表 5.44。 |
| 表 5.44 多处理器唤醒邮箱结构 字段 | 字节长度 | 字节偏移 | 描述 |
| --- | --- | --- | --- |
| 命令 | 2 | 0 | 0:Noop - 无操作。 1:唤醒——跳转到唤醒向量。 2-0xFFFF:保留 |
| 保留 | 2 | 2 | 必须为 0。 |
| APICID | 4 | 4 | 处理器的本地APICID。应用处理器应检查 ApicId 字段是否与自己的APIC、ID匹配。如果APICID不匹配,应用处理器应忽略该命令。 |
| 唤醒向量 | 8 | 8 | 应用处理器的唤醒地址。对于Intel处理器,执行环境是:必须禁用中断。 RFLAGES.IF 设置为 0。启用长模式。启用分页模式,并且唤醒向量的物理内存进行身份映射(虚拟地址等于物理地址)唤醒向量必须包含在一个物理页内。选择器设置为平坦,否则不使用。 |
| 保留给Os | 2032 | 2032 16 | 16保留供OS 使用。 |
| 为固件保留 | 2048 | 2048 2048 | 2048保留供固件使用。 |