UEFI 笔记 003 —— 什么是 ReportStatusCode

声明:个人笔记,概不负责

经典的 PC 在开机时,若出错,会 想尽办法 通知用户。
在贫瘠的资源下,通过 自带的小喇叭 滴滴滴,报告系统的状态,称为 beep code
在稍微富有的情况下,通过 数码管 显示一串神秘的数字,报告系统的状态,称为 POST code

UEFI 的 ReportStatusCode 明显是 POST Code 加强版。
它基本就是围绕着两个 UINT32 建立起的体系,一个为 Type,另一个为 Value。
离离原上谱的是,ReportStatusCode 非常强大,可以“外挂”许多数据,看上去与 POST Code 已经相去甚远,貌似不太可能搞出个类似的主板侦错卡。

What are BIOS POST Codes? Explained!
POST自检及BIOS常见错误

关于 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图 对照解析

Publisher-Subscriber pattern

=== 华丽的 end line ===

posted @ 2024-11-17 23:33  悠洋洋  阅读(2)  评论(0编辑  收藏  举报