UEFI 笔记 003 —— 什么是 ReportStatusCode
声明:个人笔记,概不负责
经典的 PC 在开机时,若出错,会 想尽办法 通知用户。
在贫瘠的资源下,通过 自带的小喇叭 滴滴滴,报告系统的状态,称为 beep code
在稍微富有的情况下,通过 数码管 显示一串神秘的数字,报告系统的状态,称为 POST code
UEFI 的 ReportStatusCode 明显是 POST Code 加强版。
它基本就是围绕着两个 UINT32 建立起的体系,一个为 Type,另一个为 Value。
离离原上谱的是,ReportStatusCode 非常强大,可以“外挂”许多数据,看上去与 POST Code 已经相去甚远,貌似不太可能搞出个类似的主板侦错卡。
关于 ReportStatusCode 的官方描述,可以从此入手 https://uefi.org/specs/PI/1.8/V3_Status_Codes.html#status-codes
找到网上两篇,有点意思的 文章
(1) 2014 - The Design Pattern of UEFI Report Status Code
(2) UEFI Status Code机制
阐述 ReportStatusCode 的理念、实现、运用案例,颇费笔墨。此处仅摘要,
理念= 围绕着两个 UINT32 建立起的体系,一个为 Type,另一个为 Value。
实现= 基本就是 Publisher-Subscriber pattern
// Concept of
//
EFI_STATUS
ReportStatusCode (
IN EFI_STATUS_CODE_TYPE Type, // (one of) Progress, Error, Debug
IN EFI_STATUS_CODE_VALUE Value, // = class + subclass + op
IN UINT32 Instance, // if (class + subclass) is not unique, + instance
IN EFI_GUID *ReporterId, // DXE module FILE_GUID
IN EFI_STATUS_CODE_DATA *Data // additional data for Value
);
///////////////////////////
//
// EFI_STATUS_CODE_TYPE
// +-------+-------+-------+-------+-------+-------+-------+-------+
// |3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1|1 1 1 1 1 1 |
// |1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0|
// +-------+-------+-------------------------------+---------------+
// | Severity | | Type |
// +-+-+-+-+-------+-------------------------------+---------------+
// m|m|u|u
// j|n|c|r
//
// Severity - 0x80 = MAJOR 0x40 = MINOR
// 0x90 = UNRECOVERED = MAJOR + ur
// 0xA0 = UNCONTAINED = MAJOR + uc
//
// Type - 0x1 = PROGRESS 0x2 = ERROR, 0x3 = DEBUG
//
///////////////////////////
//
// EFI_STATUS_CODE_VALUE
// +-------+-------+-------+-------+-------+-------+-------+-------+
// |3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1|1 1 1 1 1 1 |
// |1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0|
// +---------------+---------------+-------+-----------------------+
// | Class | Subclass | Operation |
// +---------------+---------------+-+---+-+-----------------------+
// 0 0 0 0 . . . . . . . . . . . . Class common 0x0000 - 0x0FFF
// 0 0 0 1 . . . . . . . . . . . . Subclass specific 0x1000 - 0x7FFF
// 0 . . .
// 0 1 1 1 . . . . . . . . . . . .
// 1 . . . . . . . . . . . . . . . OEM specific 0x8000 - 0xFFFF
//
///////////////////////////
Publisher-Subscriber pattern
微软 Azure 文档(图比较好看)
为显本文硬度,附上 全网独家 原创干货 UML图 对照解析
=== 华丽的 end line ===