/** @file
MemRas.h -- Header for MemRas
Copyright (c) HR650X BIOS Decompilation Project
**/
#ifndef __MEMRAS_H__
#define __MEMRAS_H__
#include "../uefi_headers/Uefi.h"
//
// Function Prototypes
//
EFI_STATUS
EFIAPI
ModuleEntryPoint(
VOID
);
EFI_STATUS
EFIAPI
MemRasInitGlobals(
VOID
);
EFI_STATUS
EFIAPI
MemRasDriverEntry(
VOID
);
EFI_STATUS
EFIAPI
MemRasSecondaryInit(
VOID
);
EFI_STATUS
EFIAPI
MemRasFallbackInit(
VOID
);
EFI_STATUS
EFIAPI
auto-generated UEFI header from AutoGen.c(
VOID
);
EFI_STATUS
EFIAPI
GUIDs (referenced in .rdata section as unk_22B*)(
VOID
);
EFI_STATUS
EFIAPI
are populated from HOBs and platform policy protocols at init time.(
VOID
);
EFI_STATUS
EFIAPI
read from HOB at offset 1677(
VOID
);
EFI_STATUS
EFIAPI
- 0=non-lockstep, 1=lockstep(
VOID
);
EFI_STATUS
EFIAPI
from platform policy protocol(
VOID
);
EFI_STATUS
EFIAPI
UINT8 SpareMode; // byte_65ED2(
VOID
);
EFI_STATUS
EFIAPI
UINT32 MemoryBase; // dword_63C4C(
VOID
);
EFI_STATUS
EFIAPI
configuration from HOB(
VOID
);
EFI_STATUS
EFIAPI
UINT64 MemoryRangeEnd; // qword_27848(
VOID
);
EFI_STATUS
EFIAPI
UINT32 NumChannels; // qword_27838(
VOID
);
EFI_STATUS
EFIAPI
UINT32 MemoryGranularity; // qword_27828(
VOID
);
EFI_STATUS
EFIAPI
[0x5CC](
VOID
);
EFI_STATUS
EFIAPI
DXE driver entry point. Called by DXE dispatcher.(
VOID
);
EFI_STATUS
EFIAPI
EFIAPI(
VOID
);
EFI_STATUS
EFIAPI
1: Allocate and initialize global context.(
VOID
);
EFI_STATUS
EFIAPI
socket configuration buffer, protocol structure(
VOID
);
EFI_STATUS
EFIAPI
buffers, and error log buffer.(
VOID
);
EFI_STATUS
EFIAPI
2: Primary driver entry - allocate protocol, populate(
VOID
);
EFI_STATUS
EFIAPI
table, read platform config from HOB and policy protocols(
VOID
);
EFI_STATUS
EFIAPI
protocol interface, register S3 save events(
VOID
);
EFI_STATUS
EFIAPI
VLS (Virtual Lockstep) info.(
VOID
);
EFI_STATUS
EFIAPI
= MemRasDriverEntry(ImageHandle, SystemTable);(
VOID
);
EFI_STATUS
EFIAPI
3 (fallback): On failure, attempt secondary initialization.(
VOID
);
EFI_STATUS
EFIAPI
memory initialization, event registration, S3 boot script.(
VOID
);
EFI_STATUS
EFIAPI
= MemRasFallbackInit(ImageHandle, SystemTable);(
VOID
);
EFI_STATUS
EFIAPI
first from ModuleEntryPoint. Allocates and initializes all(
VOID
);
EFI_STATUS
EFIAPI
sequence (23 sub-initializers):(
VOID
);
EFI_STATUS
EFIAPI
MemRasInitGlobals((
VOID
);
EFI_STATUS
EFIAPI
sub-initializer is a library constructor from the(
VOID
);
EFI_STATUS
EFIAPI
static libraries. They are called sequentially.(
VOID
);
EFI_STATUS
EFIAPI
debug builds, each failure triggers ASSERT via(
VOID
);
EFI_STATUS
EFIAPI
pattern for each call is:(
VOID
);
EFI_STATUS
EFIAPI
= LibraryConstructor();(
VOID
);
EFI_STATUS
EFIAPI
1: Core library initialization(
VOID
);
EFI_STATUS
EFIAPI
- BaseLib / lock init(
VOID
);
EFI_STATUS
EFIAPI
- UefiBootServicesTableLib constructor(
VOID
);
EFI_STATUS
EFIAPI
- UefiRuntimeServicesTableLib constructor(
VOID
);
EFI_STATUS
EFIAPI
2: Driver support libraries(
VOID
);
EFI_STATUS
EFIAPI
- UefiDriverEntryPoint / UefiLib constructors(
VOID
);
EFI_STATUS
EFIAPI
- [stub, returns success](
VOID
);
EFI_STATUS
EFIAPI
- Memory allocation library(
VOID
);
EFI_STATUS
EFIAPI
- HOB library (mHobList initialization)(
VOID
);
EFI_STATUS
EFIAPI
- SmmMmPciBaseLib constructor(
VOID
);
EFI_STATUS
EFIAPI
- S3BootScriptLib / SmmLockBoxSmmLib constructor(
VOID
);
EFI_STATUS
EFIAPI
- AcpiTimerLib constructor(
VOID
);
EFI_STATUS
EFIAPI
- DxeServicesTableLib + TianoCustomDecompressLib(
VOID
);
EFI_STATUS
EFIAPI
3: Platform-specific RAS libraries(
VOID
);
EFI_STATUS
EFIAPI
- mpsyncdatalib + emcaplatformhookslib init(
VOID
);
EFI_STATUS
EFIAPI
- SmmLnvSendIpmiCmdLib / SmmVariable protocol(
VOID
);
EFI_STATUS
EFIAPI
- AmiErrReportingLib init(
VOID
);
EFI_STATUS
EFIAPI
- OemRasLib init(
VOID
);
EFI_STATUS
EFIAPI
- Platform-specific RAS init(
VOID
);
EFI_STATUS
EFIAPI
EFI_SUCCESS;(
VOID
);
EFI_STATUS
EFIAPI
driver entry. Allocates protocol structure, reads HOB data(
VOID
);
EFI_STATUS
EFIAPI
function pointer table, installs protocol interface(
VOID
);
EFI_STATUS
EFIAPI
sets up event handlers.(
VOID
);
EFI_STATUS
EFIAPI
1: Allocate context structure (24 bytes) and zero it.(
VOID
);
EFI_STATUS
EFIAPI
-> ContextBuffer (sizeof=24)(
VOID
);
EFI_STATUS
EFIAPI
= gBS->AllocatePool(EfiBootServicesData, 24, &ContextBuffer);(
VOID
);
EFI_STATUS
EFIAPI
2: Allocate protocol structure (568 bytes) and zero it.(
VOID
);
EFI_STATUS
EFIAPI
-> Protocol (MEM_RAS_PROTOCOL)(
VOID
);
EFI_STATUS
EFIAPI
= gBS->AllocatePool(EfiBootServicesData, 568, &Protocol);(
VOID
);
EFI_STATUS
EFIAPI
protocol to context(
VOID
);
EFI_STATUS
EFIAPI
3: Allocate socket configuration buffer (32768 bytes).(
VOID
);
EFI_STATUS
EFIAPI
-> SocketConfig(
VOID
);
EFI_STATUS
EFIAPI
in .data section (global variable)(
VOID
);
EFI_STATUS
EFIAPI
= gBS->AllocatePool(EfiBootServicesData, 0x8000, &gSocketConfig);(
VOID
);
EFI_STATUS
EFIAPI
scratch buffer tracking(
VOID
);
EFI_STATUS
EFIAPI
4: Allocate scratch buffer (25037 bytes).(
VOID
);
EFI_STATUS
EFIAPI
8 bytes of protocol structure stores pointer to this.(
VOID
);
EFI_STATUS
EFIAPI
= gBS->AllocatePool(EfiBootServicesData, 25037, &Protocol[0]);(
VOID
);
EFI_STATUS
EFIAPI
5: Allocate error log buffer (1643 bytes).(
VOID
);
EFI_STATUS
EFIAPI
-> gErrorLogBuffer(
VOID
);
EFI_STATUS
EFIAPI
= gBS->AllocatePool(EfiBootServicesData, 1643, &gErrorLogBuffer);(
VOID
);
EFI_STATUS
EFIAPI
6: Locate PlatformRasPolicy protocol (unk_22BB0).(
VOID
);
EFI_STATUS
EFIAPI
provides platform RAS configuration data.(
VOID
);
EFI_STATUS
EFIAPI
= gBS->LocateProtocol(&gPlatformRasPolicyGuid, NULL, &PlatformPolicy);(
VOID
);
EFI_STATUS
EFIAPI
7: Initialize protocol signature.(
VOID
);
EFI_STATUS
EFIAPI
8: Populate function pointer table.(
VOID
);
EFI_STATUS
EFIAPI
function pointers are installed at their respective(
VOID
);
EFI_STATUS
EFIAPI
within the protocol structure.(
VOID
);
EFI_STATUS
EFIAPI
Protocol->SpareRank = MemRasSpareRank;(
VOID
);
EFI_STATUS
EFIAPI
Protocol->ForwardAddrTranslate = MemRasForwardAddrTranslate;(
VOID
);
EFI_STATUS
EFIAPI
9: Locate platform RAS policy protocol (unk_22B20).(
VOID
);
EFI_STATUS
EFIAPI
the HOB list pointer with system configuration.(
VOID
);
EFI_STATUS
EFIAPI
= gBS->LocateProtocol(&gPlatformRasHobGuid, NULL, (VOID **)&PlatformPolicy);(
VOID
);
EFI_STATUS
EFIAPI
10: Locate CPU CSR access and additional protocol.(
VOID
);
EFI_STATUS
EFIAPI
= gBS->LocateProtocol(&gCpuCsrAccessGuid, NULL, (VOID **)&CpuCsrAccess);(
VOID
);
EFI_STATUS
EFIAPI
11: Read platform configuration from policy protocol.(
VOID
);
EFI_STATUS
EFIAPI
1677: Channel mode (lockstep bit)(
VOID
);
EFI_STATUS
EFIAPI
1780: VLS enable flag(
VOID
);
EFI_STATUS
EFIAPI
1782: Spare mode(
VOID
);
EFI_STATUS
EFIAPI
1777: RAS mode (0=SDDC, 1=ADDDC, etc.)(
VOID
);
EFI_STATUS
EFIAPI
2067: Number of sockets(
VOID
);
EFI_STATUS
EFIAPI
280: Memory base address / range(
VOID
);
EFI_STATUS
EFIAPI
4: System memory size(
VOID
);
EFI_STATUS
EFIAPI
8: Number of channels(
VOID
);
EFI_STATUS
EFIAPI
12: Memory type(
VOID
);
EFI_STATUS
EFIAPI
20: Memory granularity(
VOID
);
EFI_STATUS
EFIAPI
= (UINT8 *)*(UINTN *)PlatformPolicy;(
VOID
);
EFI_STATUS
EFIAPI
12: Initialize 4 socket entries in scratch buffer.(
VOID
);
EFI_STATUS
EFIAPI
byte at offset 1606 to 1 for each socket.(
VOID
);
EFI_STATUS
EFIAPI
(UINT32 Socket = 0; Socket < 4; Socket++) {(
VOID
);
EFI_STATUS
EFIAPI
13: Install MemRas protocol interface.(
VOID
);
EFI_STATUS
EFIAPI
data: Protocol structure (MEM_RAS_PROTOCOL *)(
VOID
);
EFI_STATUS
EFIAPI
handle init(
VOID
);
EFI_STATUS
EFIAPI
to MEM_RAS_PROTOCOL *(
VOID
);
EFI_STATUS
EFIAPI
14: Register S3 boot script save handler.(
VOID
);
EFI_STATUS
EFIAPI
protocol for gEfiMemRasS3SaveProtocolGuid.(
VOID
);
EFI_STATUS
EFIAPI
15: Initialize VLS (Virtual Lockstep) state.(
VOID
);
EFI_STATUS
EFIAPI
variable doesn't exist, creates it. Locates VariableArchProtocol(
VOID
);
EFI_STATUS
EFIAPI
reads back "VLSEstablished" to verify.(
VOID
);
EFI_STATUS
EFIAPI
16: Initialize spare copy done handler.(
VOID
);
EFI_STATUS
EFIAPI
17: Initialize rank sparing event handler.(
VOID
);
EFI_STATUS
EFIAPI
18: Conditionally initialize patrol scrub.(
VOID
);
EFI_STATUS
EFIAPI
NumSockets >= 3 or NumSockets <= 1, start patrol scrub.(
VOID
);
EFI_STATUS
EFIAPI
(NumSockets >= 3 || NumSockets <= 1) {(
VOID
);
EFI_STATUS
EFIAPI
19: Initialize alternate spare rank path.(
VOID
);
EFI_STATUS
EFIAPI
20: Register per-socket MCE events (if configured).(
VOID
);
EFI_STATUS
EFIAPI
platform config byte (offset 35) has bits 2 and 4 set(
VOID
);
EFI_STATUS
EFIAPI
and unk_22C50.(
VOID
);
EFI_STATUS
EFIAPI
((HobData[35] & 0x14) == 0x14) {(
VOID
);
EFI_STATUS
EFIAPI
from ModuleEntryPoint when MemRasInitGlobals() succeeds.(
VOID
);
EFI_STATUS
EFIAPI
unk_23560 context is valid, calls MemRasDriverEntry().(
VOID
);
EFI_STATUS
EFIAPI
sets global status to indicate failure.(
VOID
);
EFI_STATUS
EFIAPI
status initialized to error (0x8000000000000001)(
VOID
);
EFI_STATUS
EFIAPI
= 0x8000000000000001uLL;(
VOID
);
EFI_STATUS
EFIAPI
if context (unk_23560) has setjmp/longjmp already set up.(
VOID
);
EFI_STATUS
EFIAPI
(!MemRasContextIsReady(&unk_23560)) {(
VOID
);
EFI_STATUS
EFIAPI
was not initialized, so this is first entry.(
VOID
);
EFI_STATUS
EFIAPI
the full driver entry.(
VOID
);
EFI_STATUS
EFIAPI
Status;(
VOID
);
EFI_STATUS
EFIAPI
never reach here - ASSERT failure.(
VOID
);
EFI_STATUS
EFIAPI
when MemRasDriverEntry() returns an error.(
VOID
);
EFI_STATUS
EFIAPI
alternative initialization path for error recovery.(
VOID
);
EFI_STATUS
EFIAPI
steps:(
VOID
);
EFI_STATUS
EFIAPI
the per-node error handling progress and pending bitmaps.(
VOID
);
EFI_STATUS
EFIAPI
(RAS_ERROR_PROGRESS):(
VOID
);
EFI_STATUS
EFIAPI
= Clear Progress bit for NodeId(
VOID
);
EFI_STATUS
EFIAPI
= Set Progress bit for NodeId (must have Pending bit set)(
VOID
);
EFI_STATUS
EFIAPI
= Get Progress status(
VOID
);
EFI_STATUS
EFIAPI
(RAS_ERROR_PENDING):(
VOID
);
EFI_STATUS
EFIAPI
= Clear Pending bit for NodeId(
VOID
);
EFI_STATUS
EFIAPI
= Set Pending bit for NodeId (must have Pending bit clear)(
VOID
);
EFI_STATUS
EFIAPI
= Get Pending status(
VOID
);
EFI_STATUS
EFIAPI
(RAS_ERROR_GET_STATUS):(
VOID
);
EFI_STATUS
EFIAPI
= Get Progress status (via dword_23680)(
VOID
);
EFI_STATUS
EFIAPI
= Get Pending status (via dword_23684)(
VOID
);
EFI_STATUS
EFIAPI
UINT8 NodeId(
VOID
);
EFI_STATUS
EFIAPI
UINT32 Operation(
VOID
);
EFI_STATUS
EFIAPI
UINT32 *Status OPTIONAL(
VOID
);
EFI_STATUS
EFIAPI
(Operation) {(
VOID
);
EFI_STATUS
EFIAPI
0: // Progress(
VOID
);
EFI_STATUS
EFIAPI
(*Status) {(
VOID
);
EFI_STATUS
EFIAPI
0: // Clear(
VOID
);
EFI_STATUS
EFIAPI
&= ~(1 << NodeId);(
VOID
);
EFI_STATUS
EFIAPI
1: // Set(
VOID
);
EFI_STATUS
EFIAPI
|= (1 << NodeId);(
VOID
);
EFI_STATUS
EFIAPI
EFI_INVALID_PARAMETER;(
VOID
);
EFI_STATUS
EFIAPI
1: // Pending(
VOID
);
EFI_STATUS
EFIAPI
2: // Get - return Progress bitmap(
VOID
);
EFI_STATUS
EFIAPI
3: // Get - return Pending bitmap(
VOID
);
#endif /* __MEMRAS_H__ */