5.2.28. 平台调试触发器表 (PDTT)
本节介绍平台调试触发器表 (PDTT) 描述表的格式,该表是一个可选表,描述一个或多个 PCC 子空间标识符,可用于触发/通知特定于平台的调试设施以捕获非体系结构系统状态。这是OSPM的标准机制,用于通知平台致命崩溃(例如内核恐慌或错误检查)。
该表适用于提供调试硬件设施的平台,这些设施可以捕获超出正常OS故障转储的系统信息。该触发器可用于捕获平台特定的状态信息(例如固件状态、片上硬件设施、辅助控制器等)。这种类型的调试功能可以在移动、客户端和企业平台上利用。
某些平台可能有多个必须单独触发的调试子系统。该表通过允许列出多个触发器来容纳此类系统。
触发调试工具后,CPU可能会继续按预期运行,以便内核可以继续进行崩溃处理/处理(例如,可能会尝试附加调试器或在重新启动系统之前继续进行完整的崩溃转储),具体取决于触发顺序中定义的值。更多详细信息,请参阅第 5.2.28.2 节。
触发调试工具后,CPU必须继续按预期运行,以便内核可以继续进行崩溃处理/处理(例如,在重新启动系统之前可能尝试附加调试器或继续进行完整的崩溃转储)。
在某些平台上,调试触发器可能会将某些硬件组件/外设置于冻结的非操作状态,因此不建议在正常运行时操作期间使用调试触发器。
其他平台可能允许捕获系统状态的调试触发器来调试运行时行为问题(例如系统性能和电源问题),由表 5.132 中的“运行时”标志字段指定。
当存在多个触发器时,按触发顺序定义的两组触发器将按顺序执行。根据表 5.132 中的“等待完成”标志字段,OSPM可能需要等待PCC完成才能执行下一个触发。
注意:用户检索系统调试状态信息的机制是特定于平台和供应商的。这很可能需要特殊的工具和权限才能访问和解析此触发器捕获的平台调试信息。
| 表 5.131 PDTT 结构 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 签名 | 4 | 0 | ‘PDTT’ |
| 长度 | 4 | 4 | 整个平台调试触发器表的长度(以字节为单位) |
| 修订 | 1 | 8 | 0 |
| 校验和 | 1 | 9 | 整个表的总和必须为零。 |
| OEM ID | 6 | 10 | 10 OEM ID |
| OEM 表ID | 8 | 16 | 16表ID是制造商型号ID。 |
| OEM 修订 | 4 | 24 | OEM 提供的OEM 表ID 的修订版。 |
| 创建者ID | 4 | 28 | 28创建该表的实用程序的供应商ID。 |
| 创建者修订 | 4 | 32 | 32创建表的实用程序的修订。 |
| 触发计数 | 1 | 36 | 36 PDTT平台通信通道标识符的数量 |
| 保留 | 3 | 37 | 37必须为零 |
| 触发标识符数组偏移 | 4 | 40 | “PDTT 平台通信通道标识符[]”数组的偏移量 |
| PDTT 平台通信通道标识符[] | — | 触发标识符数组偏移 | PDTT平台通信通道标识符数组,用于通知各种平台调试设施。该标识符选择必须在PCCT中列出的PCC子空间索引。它还描述了每个触发器标志。每个标识符为 2 个字节。必须提供至少一个标识符。参见下表 5.132。 |
| 表 5.132 PDTT 平台通信信道标识符结构 字段 | 位长度 | 位偏移 | 描述 |
| --- | --- | --- | --- |
| PDTT PCC 子通道标识符 | 8 | 0 | PCC 子通道 ID。注意:这必须是 PCCT 中列出的索引。 |
| 运行时 | 1 | 8 | 0:触发器只能在致命崩溃情况下调用。此调试触发器可能会将某些硬件组件/外围设备置于冻结的非操作状态。 |
| 等待完成 | 1 | 9 | 0:OSPM可以立即发起下一个触发 |
| 触发订单 | 1 | 10 | 10用于致命崩溃场景: 0:OSPM 必须在内核崩溃转储处理之前启动触发器 |
| 保留 | 5 | 11 | 11必须为零 |
5.2.28.1. PDTT PCC 子通道
该字段中平台提供的PDTT、PCC子通道标识符值是PCCT表中的索引(如下图所示)。 PCC PDTT 的通信子空间结构可以使用任何类型的PCC 通信子空间。由PDTT、PCC子通道标识符标识的PCCT表中的PCC子通道条目将包含与调试触发器关联的PCC子通道定义类型的信息。 PDTT通过该标识符在给定平台中引用其PCC子空间,如表 5.132 所示。
下面的第 5.2.28.1 节显示了如何从 PCCT 表中找到与 PDTT 中调试触发器关联的正确 PCC 子空间条目。

图 5.12 将 PDTT 调试触发器表条目映射到 PCCT PCC 子空间
5.2.28.1.1. 使用PCC寄存器
平台调试触发器可以选择使用任何类型的PCC子空间。调试触发器的共享内存区域的定义将遵循与用于调试触发器的PCC子空间类型关联的共享内存区域的定义。例如,如果平台调试触发器选择使用通用PCC通信子空间(类型 0),则它将使用第 14.2 节 中描述的通用通信通道共享内存区域。 OSPM将通过填写PCC子通道空间中的寄存器值来写入PCC寄存器。如果平台调试触发器选择使用PCC通信子通道(该子通道使用通用通信共享内存区域),那么它将在命令字段中写入调试触发器命令。有关允许的调试命令,请参阅表 5.132。所有其他命令值均被保留。
该平台还可以使用PCC子通道 Type 5 来调试触发器。在这种情况下,OSPM将遵循PCC子通道定义并写入门铃寄存器以触发调试日志。使用PCC通信子通道类型 5 的平台调试触发器将使用共享内存区域来共享特定于供应商的调试信息。
下表定义了调试触发器的 Type-5PCC通道共享内存区域定义。
| 表 5.133 类型 5 平台通信通道共享内存 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 签名 | 4 | 0 | PCC签名。子空间的签名是通过值 0x50434300 与子空间ID 的按位或计算得出的。例如,子空间 3 的签名为 0x50434303。 |
| 通讯子空间 | |||
| 供应商特定空间 | — | 4 | 供应商特定区域,用于在OSPM和平台之间共享附加信息。供应商指定区域的长度必须比引用此共享内存空间的PCCT条目中指定的长度字段小 4 个字节。 |
| 表 5.134 PCC 平台调试触发器表使用的命令代码 命令 | 描述 | ||
| --- | --- | ||
| 0x00 | 0x00执行平台调试触发器(仅限门铃 - 无命令/响应)。 | ||
| 0x01 | 0x01执行平台调试触发器(使用通信空间中的供应商特定命令)。 | ||
| 0x01-0xFF | 0x01-0xFF | 所有其他值均被保留。 | |
| 表 5.135 PDTT 平台通信通道 字段 | 位长度 | 位偏移 | 描述 |
| --- | --- | --- | --- |
| 签名 | 4 | 0 | PCC签名。子空间的签名是通过值 0x50434300 与子空间ID 的按位或计算得出的。例如,子空间 3 的签名为 0x50434303。 |
| 命令 | 2 | 4 | PCC命令字段,参见第14节和表5.134 |
| 状态 | 2 | 6 | PCC 状态字段(参见第 14 节) |
| 交流空间 | — | — | — |
| 供应商特定 | 变量 | 8 | 由OSPM写入的可选供应商特定命令/响应区域 - 如果不支持则必须为零 |
5.2.28.2. PDTT PCC 触发顺序
触发顺序定义了触发器的两个类别
触发器顺序 0:触发器在执行故障转储处理函数之前由OSPM调用。
触发器顺序 1:触发器在故障转储处理函数结束时由OSPM调用,通常是在内核处理完故障转储之后。
从某些 IP 捕获特定于平台的调试信息将需要侵入机制,这可能会限制操作后的内核操作。触发顺序允许平台定义将在内核操作结束时由OSPM调用的操作。
5.2.28.3. 示例:OS 调用多个调试触发器
为了说明OS如何使用这些调试触发器,请考虑具有 4 个独立调试触发器的系统示例,如图 5.13 所示。这些触发器通过表 5.136 中的PDTT示例向OS进行描述。
注意: 本示例假设不需要供应商特定的通信,因此仅使用PCC命令 0x0。
当OS遇到致命崩溃时,在收集故障转储并重新启动系统之前,OS可以选择按照PDTT中列出的顺序调用调试触发器。根据PCC子空间类型,从PCCT中检索门铃寄存器和PCC通用通信空间(如果需要)的地址(参见[表 14.4](<../14_Platform_Communications_Channel/Platform_Comm_Channel.html#pcc-subspace-structure-type-0-generic-communications-subspace>)、[表 14.5](<../14_Platform_Communications_Channel/Platform_Comm_Channel.html#pcc-subspace-structure-type-1-hw-reduced-communications-subspace>)或表14.6)。
图 5.13 示例:具有四个调试触发器的平台
| 表 5.136 示例:具有 4 个调试触发器的平台 字段 | 价值 | 注释 |
|---|---|---|
| 签名 | ‘PDTT’ | |
| …… | …… | …… |
| 触发计数 | 4 | 描述上面图 5.13 所示的 4 个触发器 |
| 保留 | 0 | |
| 触发标识符数组偏移 | 44 | 44 |
| PDTT PCC 标识符 [0] | 0x0004 | 0x0004 [位 0:7] - 4(通道子空间ID 4) [位 8] - 0(只能在致命崩溃情况下调用触发器) [位 9] - 0(OSPM 可以立即启动下一个触发器) |
| PDTT PCC 标识符 [1] | 0x0201 | 0x0201 [位 0:7] - 1(通道 ID 子空间 1) [位 8] - 0(触发器只能在致命崩溃情况下调用) [位 9] - 1(OSPM 必须等待 PCC 完成才能启动列表中的下一个触发器) |
| PDTT PCC 标识符 [2] | 0x0002 | 0x0002 [位 0:7] - 2(通道ID子空间 2) [位 8] - 0(只能在致命崩溃情况下调用触发器) [位 9] - 0(OSPM 可以立即启动下一个触发器) |
| PDTT PCC 标识符 [3] | 0x0203 | 0x0203 [位 0:7] - 3(通道 ID 子空间 3) [位 8] - 0(触发器只能在致命崩溃情况下调用) [位 9] - 1(OSPM 必须等待 PCC 完成才能启动列表中的下一个触发器) |
遍历PDTT中的触发器列表,OS可以执行以下步骤:
对于触发器 0,从每个PCC子空间ID4 的PCCT中检索门铃寄存器地址,并使用适当的写入/保留掩码写入该地址。由于OS不需要等待完成,OS不需要发送PCC命令,并且应该忽略PCC子空间基地址
对于触发器 1,从 PCCT 每个 PCC 子空间 ID 1 检索门铃寄存器地址和 PCC 子空间地址。 由于 OS 必须等待完成,OS 必须写入 PCC 命令 (0x0) 并写入门铃寄存器根据第 14 节并轮询完成位。
对于触发器 2,从每个PCC子空间ID2 的PCCT中检索门铃寄存器地址,并使用适当的写入/保留掩码写入该地址。由于OS不需要等待完成,OS不需要发送PCC命令,并且应该忽略PCC子空间基地址
对于触发器 3,从 PCCT 每个 PCC 子空间 ID 检索门铃寄存器地址和 PCC 子空间地址 3. 由于 OS 必须等待完成,OS 必须写入 PCC 命令 (0x0) 并写入门铃寄存器根据第 14 节并轮询完成位。
笔记
当需要等待完成时,OS必须轮询PCC通道状态字段的位 0(完成位)(参见[表 14.6](<../14_Platform_Communications_Channel/Platform_Comm_Channel.html#pcc-subspace-structure-type-2-hw-reduced-communications-subspace>)和通用通信通道共享内存区域。
