/** @file
StatusCodeSmm.h -- Header for StatusCodeSmm
Copyright (c) HR650X BIOS Decompilation Project
**/
#ifndef __STATUSCODESMM_H__
#define __STATUSCODESMM_H__
#include "../uefi_headers/Uefi.h"
//
// Function Prototypes
//
EFI_STATUS
EFIAPI
ModuleEntryPoint(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeDriverInit(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeRegisterProtocols(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeRegisterCallback(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeUnregisterCallback(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeDispatchCallbacks(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeHandler(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeAssertHandler(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeProgress(
VOID
);
EFI_STATUS
EFIAPI
StatusCodeFormatString(
VOID
);
EFI_STATUS
EFIAPI
StatusCodeReportError(
VOID
);
EFI_STATUS
EFIAPI
StatusCodeWriteSerial(
VOID
);
EFI_STATUS
EFIAPI
StatusCodeReportToSerial(
VOID
);
EFI_STATUS
EFIAPI
StatusCodeWritePort80(
VOID
);
EFI_STATUS
EFIAPI
StatusCodeCheckAndEnable(
VOID
);
EFI_STATUS
EFIAPI
Status Code Reporting Driver(
VOID
);
EFI_STATUS
EFIAPI
and reconstructed from IDA Pro analysis of the(
VOID
);
EFI_STATUS
EFIAPI
HR650X BIOS UEFI firmware image. All functions have been(
VOID
);
EFI_STATUS
EFIAPI
and renamed for clarity.(
VOID
);
EFI_STATUS
EFIAPI
SMM driver provides status code reporting infrastructure(
VOID
);
EFI_STATUS
EFIAPI
System Management Mode. It intercepts SMI events triggered(
VOID
);
EFI_STATUS
EFIAPI
status code writes and routes them to configurable output(
VOID
);
EFI_STATUS
EFIAPI
(serial, port 80 POST codes) and registered callbacks.(
VOID
);
EFI_STATUS
EFIAPI
variable storage(
VOID
);
EFI_STATUS
EFIAPI
gImageHandle;(
VOID
);
EFI_STATUS
EFIAPI
data tables (defined in .rdata)(
VOID
);
EFI_STATUS
EFIAPI
code lookup table.(
VOID
);
EFI_STATUS
EFIAPI
entry: {UINT32 StatusCode, UINT32 StringOffset}(
VOID
);
EFI_STATUS
EFIAPI
by {0, 0}.(
VOID
);
EFI_STATUS
EFIAPI
memory error(
VOID
);
EFI_STATUS
EFIAPI
thermal error(
VOID
);
EFI_STATUS
EFIAPI
low voltage(
VOID
);
EFI_STATUS
EFIAPI
high voltage(
VOID
);
EFI_STATUS
EFIAPI
CPU ECC error(
VOID
);
EFI_STATUS
EFIAPI
};(
VOID
);
EFI_STATUS
EFIAPI
Entry Point (_ModuleEntryPoint at 0x500)(
VOID
);
EFI_STATUS
EFIAPI
UEFI driver entry. Initializes SMM environment, registers(
VOID
);
EFI_STATUS
EFIAPI
handlers with error recovery via SetJump/LongJump.(
VOID
);
EFI_STATUS
EFIAPI
EFIAPI(
VOID
);
EFI_STATUS
EFIAPI
ASSERTs fire only if LongJump fails (should never happen)(
VOID
);
EFI_STATUS
EFIAPI
(0x5B4)(
VOID
);
EFI_STATUS
EFIAPI
the SMM driver environment:(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeDriverInit ((
VOID
);
EFI_STATUS
EFIAPI
global pointers(
VOID
);
EFI_STATUS
EFIAPI
SMM Base2 protocol(
VOID
);
EFI_STATUS
EFIAPI
SMM Access2 protocol to get SMRAM sizes(
VOID
);
EFI_STATUS
EFIAPI
PCI Express base address from PCD(
VOID
);
EFI_STATUS
EFIAPI
HOB list(
VOID
);
EFI_STATUS
EFIAPI
LPC serial port (if enabled)(
VOID
);
EFI_STATUS
EFIAPI
config address 0xFA004 = LPC command register (B0/D31/F0/Reg4)(
VOID
);
EFI_STATUS
EFIAPI
config address 0xFA000 = LPC vendor/device ID register(
VOID
);
EFI_STATUS
EFIAPI
I/O base to 0x500(
VOID
);
EFI_STATUS
EFIAPI
memory space (bit 1 of command register)(
VOID
);
EFI_STATUS
EFIAPI
for TCO timer to stabilize(
VOID
);
EFI_STATUS
EFIAPI
0x508 is the TCO I/O base register(
VOID
);
EFI_STATUS
EFIAPI
interrupt state(
VOID
);
EFI_STATUS
EFIAPI
(0xCD0)(
VOID
);
EFI_STATUS
EFIAPI
three SMM handlers:(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeRegisterProtocols ((
VOID
);
EFI_STATUS
EFIAPI
#1: Register SmmStatusCodeHandler via EFI_SMM_CPU_IO2_PROTOCOL(
VOID
);
EFI_STATUS
EFIAPI
causes the handler to fire on CPU I/O operations that generate(
VOID
);
EFI_STATUS
EFIAPI
code SMI events.(
VOID
);
EFI_STATUS
EFIAPI
gSmmStatusCodeHandlerPtr(
VOID
);
EFI_STATUS
EFIAPI
#2: Register callback management protocol(
VOID
);
EFI_STATUS
EFIAPI
#3: Register progress/status code protocol(
VOID
);
EFI_STATUS
EFIAPI
(0x8F0)(
VOID
);
EFI_STATUS
EFIAPI
a callback function pointer in the callback table.(
VOID
);
EFI_STATUS
EFIAPI
are invoked when status code events occur.(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeRegisterCallback ((
VOID
);
EFI_STATUS
EFIAPI
}(
VOID
);
EFI_STATUS
EFIAPI
empty slot(
VOID
);
EFI_STATUS
EFIAPI
(0x8A8)(
VOID
);
EFI_STATUS
EFIAPI
a callback function pointer from the callback table.(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeUnregisterCallback ((
VOID
);
EFI_STATUS
EFIAPI
(0x988)(
VOID
);
EFI_STATUS
EFIAPI
all registered callback functions and invokes each with(
VOID
);
EFI_STATUS
EFIAPI
status code parameters.(
VOID
);
EFI_STATUS
EFIAPI
a reentrancy guard (gReentrancyGuard) to prevent recursive(
VOID
);
EFI_STATUS
EFIAPI
dispatch.(
VOID
);
EFI_STATUS
EFIAPI
already in progress(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeDispatchCallbacks ((
VOID
);
EFI_STATUS
EFIAPI
(0xB84)(
VOID
);
EFI_STATUS
EFIAPI
main SMI status code handler. Called when a status code SMI(
VOID
);
EFI_STATUS
EFIAPI
registered callbacks, and outputs to serial.(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeHandler ((
VOID
);
EFI_STATUS
EFIAPI
per-status-code callbacks(
VOID
);
EFI_STATUS
EFIAPI
(0xC24)(
VOID
);
EFI_STATUS
EFIAPI
when an ASSERT condition fires in SMM. Formats the assert(
VOID
);
EFI_STATUS
EFIAPI
with file/line info, dispatches assert-specific callbacks(
VOID
);
EFI_STATUS
EFIAPI
outputs via serial.(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeAssertHandler ((
VOID
);
EFI_STATUS
EFIAPI
assert-specific callbacks(
VOID
);
EFI_STATUS
EFIAPI
(0xA58)(
VOID
);
EFI_STATUS
EFIAPI
status code progress (type 1) and error (type 2) events.(
VOID
);
EFI_STATUS
EFIAPI
registered callbacks, runs enable/disable checks(
VOID
);
EFI_STATUS
EFIAPI
the status string, outputs to serial, and handles(
VOID
);
EFI_STATUS
EFIAPI
EFI progress codes (type == 2), also queries a progress function(
VOID
);
EFI_STATUS
EFIAPI
for matching dispatch.(
VOID
);
EFI_STATUS
EFIAPI
SmmStatusCodeProgress ((
VOID
);
EFI_STATUS
EFIAPI
enable/disable filter check callbacks(
VOID
);
EFI_STATUS
EFIAPI
progress-specific callbacks(
VOID
);
EFI_STATUS
EFIAPI
progress type 2, dispatch via progress function table(
VOID
);
EFI_STATUS
EFIAPI
(0xE1C)(
VOID
);
EFI_STATUS
EFIAPI
the status code data GUID to determine its type and(
VOID
);
EFI_STATUS
EFIAPI
the output string accordingly:(
VOID
);
EFI_STATUS
EFIAPI
text from data payload, converts Unicode to ASCII(
VOID
);
EFI_STATUS
EFIAPI
format string from offset +120 and args from offset +24(
VOID
);
EFI_STATUS
EFIAPI
line number and file/description from payload.(
VOID
);
EFI_STATUS
EFIAPI
type=2, class=0x90, subclass=7.(
VOID
);
EFI_STATUS
EFIAPI
line number at offset +60 and file at offset +80.(
VOID
);
EFI_STATUS
EFIAPI
GUID match + Type 2: delegates to StatusCodeReportError(
VOID
);
EFI_STATUS
EFIAPI
GUID match + other types: returns 0 (no output)(
VOID
);
EFI_STATUS
EFIAPI
StatusCodeFormatString ((
VOID
);
EFI_STATUS
EFIAPI
header to get GUID(
VOID
);
EFI_STATUS
EFIAPI
#1: Plain string data GUID(
VOID
);
EFI_STATUS
EFIAPI
string from payload(
VOID
);
EFI_STATUS
EFIAPI
#2: Standard string type GUID(
VOID
);
EFI_STATUS
EFIAPI
#3: AMI DataHub ASSERT GUID(
VOID
);
EFI_STATUS
EFIAPI
#4: AMI ASSERT GUID(
VOID
);
EFI_STATUS
EFIAPI
through to FormatAssert(
VOID
);
EFI_STATUS
EFIAPI
(0xD94)(
VOID
);
EFI_STATUS
EFIAPI
up a status code in the known error code table (gErrorCodeTable).(
VOID
);
EFI_STATUS
EFIAPI
the code is found, formats "ERROR: %a" with the error description(
VOID
);
EFI_STATUS
EFIAPI
from the status code data payload.(
VOID
);
EFI_STATUS
EFIAPI
the code is not found (or table empty), formats the raw status(
VOID
);
EFI_STATUS
EFIAPI
as three hex fields: "ERROR: Class:%X; Subclass:%X; Operation: %X\n"(
VOID
);
EFI_STATUS
EFIAPI
StatusCodeReportError ((
VOID
);
EFI_STATUS
EFIAPI
in table - format with string from data payload(
VOID
);
EFI_STATUS
EFIAPI
found - format raw hex values(
VOID
);
EFI_STATUS
EFIAPI
(0xFE8)(
VOID
);
EFI_STATUS
EFIAPI
a string to the serial port with proper CR/LF handling.(
VOID
);
EFI_STATUS
EFIAPI
StatusCodeWriteSerial ((
VOID
);
EFI_STATUS
EFIAPI
"\n" - flush accumulated prefix and emit "\r\n"(
VOID
);
EFI_STATUS
EFIAPI
(0x105C)(
VOID
);
EFI_STATUS
EFIAPI
to StatusCodeWriteSerial (primary) and any additional(
VOID
);
EFI_STATUS
EFIAPI
handlers registered in the output callback table.(
VOID
);
EFI_STATUS
EFIAPI
StatusCodeReportToSerial ((
VOID
);
EFI_STATUS
EFIAPI
serial output(
VOID
);
EFI_STATUS
EFIAPI
(0x109C)(
VOID
);
EFI_STATUS
EFIAPI
a byte to the hardware POST code display port (0x80).(
VOID
);
EFI_STATUS
EFIAPI
for debug POST cards or BMC POST code capture.(
VOID
);
EFI_STATUS
EFIAPI
StatusCodeWritePort80 ((
VOID
);
EFI_STATUS
EFIAPI
(0x10A8)(
VOID
);
EFI_STATUS
EFIAPI
type 1 (progress) and type 2 (error), looks up the status code(
VOID
);
EFI_STATUS
EFIAPI
in the enable/disable table. If the code is enabled, invokes(
VOID
);
EFI_STATUS
EFIAPI
port 80 write callbacks (including StatusCodeWritePort80).(
VOID
);
EFI_STATUS
EFIAPI
StatusCodeCheckAndEnable ((
VOID
);
EFI_STATUS
EFIAPI
the enable table for this type(
VOID
);
EFI_STATUS
EFIAPI
are standard UEFI library implementations compiled into this(
VOID
);
EFI_STATUS
EFIAPI
by the build system (MdePkg BaseLib, BasePrintLib, etc.).(
VOID
);
EFI_STATUS
EFIAPI
are documented here for completeness.(
VOID
);
EFI_STATUS
EFIAPI
(0x2C0) / LongJump (0x360)(
VOID
);
EFI_STATUS
EFIAPI
saves: RBP, stack pointer, return address, XMM regs(
VOID
);
EFI_STATUS
EFIAPI
restores context and jumps to the saved return point.(
VOID
);
EFI_STATUS
EFIAPI
(0x1130)(
VOID
);
EFI_STATUS
EFIAPI
the jump buffer alignment (must be 8-byte aligned).(
VOID
);
EFI_STATUS
EFIAPI
(0x132C)(
VOID
);
EFI_STATUS
EFIAPI
an ASSERT message string using AsciiSPrint.(
VOID
);
EFI_STATUS
EFIAPI
(0x1210)(
VOID
);
EFI_STATUS
EFIAPI
to the standard error interface (via protocol at 0x3ED0).(
VOID
);
EFI_STATUS
EFIAPI
the protocol is available, formats: file, line, message.(
VOID
);
EFI_STATUS
EFIAPI
(0x1178)(
VOID
);
EFI_STATUS
EFIAPI
the SMM standard error protocol (GUID at 0x3ED0) and caches(
VOID
);
EFI_STATUS
EFIAPI
in qword_4F68.(
VOID
);
EFI_STATUS
EFIAPI
(0x11C8)(
VOID
);
EFI_STATUS
EFIAPI
debug print: checks error level against current setting(
VOID
);
EFI_STATUS
EFIAPI
the standard error interface if enabled.(
VOID
);
EFI_STATUS
EFIAPI
(0x2AC8)(
VOID
);
EFI_STATUS
EFIAPI
the debug print error level from CMOS offset 0x4C.(
VOID
);
EFI_STATUS
EFIAPI
the CMOS value is out of range, checks a memory-mapped(
VOID
);
EFI_STATUS
EFIAPI
(0xFDAF0490) for the BMC-preserved value.(
VOID
);
EFI_STATUS
EFIAPI
0 (disabled), 0x80000004 (level 1), or 0x80000006 (level 2+).(
VOID
);
EFI_STATUS
EFIAPI
(0x2A18)(
VOID
);
EFI_STATUS
EFIAPI
Super I/O type via SIO port 0x72/0x73:(
VOID
);
EFI_STATUS
EFIAPI
bytes to serial port data register at (base + 0).(
VOID
);
EFI_STATUS
EFIAPI
for THR empty (LSR bit 6). Bursts up to 16 bytes per(
VOID
);
EFI_STATUS
EFIAPI
(0x1404) - ~3573 bytes (0xDF5)(
VOID
);
EFI_STATUS
EFIAPI
UEFI AsciiSPrint implementation from BasePrintLib.(
VOID
);
EFI_STATUS
EFIAPI
format specifiers:(
VOID
);
EFI_STATUS
EFIAPI
length limited to 0xF4240 (1,000,000) characters.(
VOID
);
EFI_STATUS
EFIAPI
(0x2984)(
VOID
);
EFI_STATUS
EFIAPI
wrapper that va_start's and calls SPrint.(
VOID
);
EFI_STATUS
EFIAPI
(0x2544) - Unicode-aware printf(
VOID
);
EFI_STATUS
EFIAPI
SPrint implementation from PrintLibInternal.c supporting(
VOID
);
EFI_STATUS
EFIAPI
standard format specifiers documented above.(
VOID
);
EFI_STATUS
EFIAPI
(0x247C)(
VOID
);
EFI_STATUS
EFIAPI
EFI_STATUS value to human-readable string:(
VOID
);
EFI_STATUS
EFIAPI
(0) -> "EFI_SUCCESS"(
VOID
);
EFI_STATUS
EFIAPI
codes (0x2xxxxxxx) -> "EFI_WARN_..."(
VOID
);
EFI_STATUS
EFIAPI
codes (0x8xxxxxxx) -> various error strings(
VOID
);
EFI_STATUS
EFIAPI
codes (0xAxxxxxxx) -> "EFI_INTERRUPT_PENDING_..."(
VOID
);
EFI_STATUS
EFIAPI
values -> NULL(
VOID
);
EFI_STATUS
EFIAPI
table is embedded in .rdata at known offsets.(
VOID
);
EFI_STATUS
EFIAPI
(0x2334)(
VOID
);
EFI_STATUS
EFIAPI
integer value to ASCII string in given base (10 or 16).(
VOID
);
EFI_STATUS
EFIAPI
negative values for base 10.(
VOID
);
EFI_STATUS
EFIAPI
(0x23A8)(
VOID
);
EFI_STATUS
EFIAPI
a decimal string to UINTN. Skips leading whitespace(
VOID
);
EFI_STATUS
EFIAPI
+/- sign. Supports hex digits a-f/A-F (returns base-10).(
VOID
);
EFI_STATUS
EFIAPI
(0x1358)(
VOID
);
EFI_STATUS
EFIAPI
a buffer with repeated character (1-byte ASCII or 2-byte Unicode).(
VOID
);
EFI_STATUS
EFIAPI
(0x138C)(
VOID
);
EFI_STATUS
EFIAPI
UINT64 to ASCII hex string using LookupTable "0123456789ABCDEF".(
VOID
);
EFI_STATUS
EFIAPI
(0x29A4)(
VOID
);
EFI_STATUS
EFIAPI
compare. Compares byte-by-byte with qword optimization for(
VOID
);
EFI_STATUS
EFIAPI
sections.(
VOID
);
EFI_STATUS
EFIAPI
(0x1250)(
VOID
);
EFI_STATUS
EFIAPI
if an address falls within any known SMRAM descriptor range.(
VOID
);
EFI_STATUS
EFIAPI
(0x1294)(
VOID
);
EFI_STATUS
EFIAPI
SMM pool memory via gSmst->SmmAllocatePool.(
VOID
);
EFI_STATUS
EFIAPI
(0x12C4)(
VOID
);
EFI_STATUS
EFIAPI
memory via gSmst->SmmFreePool if in SMRAM, or gBS->FreePool(
VOID
);
EFI_STATUS
EFIAPI
not. Used during module unload or error cleanup.(
VOID
);
EFI_STATUS
EFIAPI
(0x2BF4)(
VOID
);
EFI_STATUS
EFIAPI
if a HOB entry matches a known GUID type by comparing(
VOID
);
EFI_STATUS
EFIAPI
Buffer_ and Buffer__0 GUIDs.(
VOID
);
EFI_STATUS
EFIAPI
(0x225C)(
VOID
);
EFI_STATUS
EFIAPI
the System Table firmware volume HOB entries to find the(
VOID
);
EFI_STATUS
EFIAPI
matching known GUIDs. Caches result in qword_4F78.(
VOID
);
EFI_STATUS
EFIAPI
(0x2CD4)(
VOID
);
EFI_STATUS
EFIAPI
the EFI_PCD_PROTOCOL (GUID {11B34006-...})(
VOID
);
EFI_STATUS
EFIAPI
gBS->LocateProtocol. Caches result in qword_4F90.(
VOID
);
EFI_STATUS
EFIAPI
(0x2220)(
VOID
);
EFI_STATUS
EFIAPI
the MMIO address for a PCI config space register:(
VOID
);
EFI_STATUS
EFIAPI
= Address + gPciExpressBaseAddress(
VOID
);
EFI_STATUS
EFIAPI
Address < 0x10000000.(
VOID
);
EFI_STATUS
EFIAPI
(0x21FC)(
VOID
);
EFI_STATUS
EFIAPI
a byte to PCI config space via the PCIe MMIO address window.(
VOID
);
EFI_STATUS
EFIAPI
UEFI BaseLib string utility functions.(
VOID
);
EFI_STATUS
EFIAPI
(0x3E0), ReadTsc (0x3F0)(
VOID
);
EFI_STATUS
EFIAPI
(0x400), DisableInterrupts (0x410)(
VOID
);
EFI_STATUS
EFIAPI
(0x420)(
VOID
);
EFI_STATUS
EFIAPI
functions:(
VOID
);
EFI_STATUS
EFIAPI
= _mm_pause()(
VOID
);
EFI_STATUS
EFIAPI
= __rdtsc()(
VOID
);
EFI_STATUS
EFIAPI
= _enable() (STI)(
VOID
);
EFI_STATUS
EFIAPI
= _disable() (CLI)(
VOID
);
EFI_STATUS
EFIAPI
= __getcallerseflags() (PUSHFQ)(
VOID
);
EFI_STATUS
EFIAPI
(0x2C64) - Write 16-bit value to I/O port(
VOID
);
EFI_STATUS
EFIAPI
(0x2CA4) - Read 32-bit value from I/O port(
VOID
);
EFI_STATUS
EFIAPI
(0x2B18) - Read 16-bit from potentially unaligned addr(
VOID
);
EFI_STATUS
EFIAPI
(0x2B48) - Read 64-bit from potentially unaligned addr(
VOID
);
EFI_STATUS
EFIAPI
(0x2B78) - Unicode string length(
VOID
);
EFI_STATUS
EFIAPI
(0x2BD0) - ASCII string length(
VOID
);
#endif /* __STATUSCODESMM_H__ */