| Address | Name | Description | |
|---|---|---|---|
| GetSlotCount | |||
| GetSlotData | |||
| UbaDebugPrint | |||
| UbaDebugAssert | |||
| ReadUnaligned64 | |||
| IsHobGuidMatch | |||
| InstallSlotData | |||
| SlotDataUpdateDxeEntryPoint | |||
| GUID | Definitions | ||
| EFI_GUID | gUbaProtocolGuid = UBA_PROTOCOL_GUID; | ||
| Global | Variables | ||
| EFI_HANDLE | gImageHandle = NULL; ///< 0xC80: Image handle from entry point | ||
| Platform | Slot Data (embedded in .data section) | ||
| Three | PSLT entries are defined statically and registered with the UBA | ||
| protocol | during initialization. The PSLT format: | ||
| Offset | Size Field | ||
| 0 | 4 Signature ("PSLT") | ||
| 4 | 4 Version (1) | ||
| 8 | 4 Length (total size of this entry) | ||
| 12 | 4 SlotCount (function pointer offset to GetSlotCount) | ||
| 16 | 4 Reserved1 | ||
| 20 | 4 SlotDataOffset (function pointer offset to GetSlotData) | ||
| 24 | 16 ConfigData (OEM-specific bitfield configuration) | ||
| PSLT | Entry 1 (at 0xC50, size 32): Primary PSLT with full length 0xC40 | ||
| Signature | 0x01, 0x00, 0x00, 0x00, // Version = 1 | ||
| Length | = 0xC40 (3136 bytes) | ||
| SlotCount | = 0x4E8 (GetSlotCount function) | ||
| Reserved1 | = 0 | ||
| SlotDataOffset | = 0x4EC (GetSlotData function) | ||
| PSLT | Entry 2 (at 0xBE0, size 40): Secondary PSLT with length 0xC40 | ||
| Length | = 0xC40 | ||
| SlotCount | = 0x4E8 | ||
| SlotDataOffset | = 0x4EC | ||
| PSLT | Entry 3 (at 0xC18, size 40): Tertiary PSLT with alternate length 0xC08 | ||
| Length | = 0xC08 (3080 bytes) | ||
| Function | Implementations | ||
| Check | if the platform type (N3) is 0 or 3, which maps to | ||
| a | "standard/other" slot classification (value 15 = 0x0F). | ||
| if | **((SlotNumber == 0) | (SlotNumber == 3)) {** | |
| Return | cached protocol if already located. | ||
| if | (gUbaProtocol != NULL) { | ||
| Allocate | a small test buffer to verify pool availability. | ||
| Size | 31 with EfiBootServicesData type via gBS->AllocatePool. | ||
| The | allocation of 31 bytes is a probe to verify the UEFI memory | ||
| system | is operational. If the allocation returns > 0x10 bytes | ||
| we | proceed. If the allocation fails or returns <= 0x10 bytes | ||
| we | bail out (return NULL). | ||
| Locate | the UBA protocol using its GUID. | ||
| No | registration key | ||
| Get | the UBA protocol interface (lazy init through cached result). | ||
| Uba | = (UBA_PROTOCOL *)UbaGetProtocolInterface (); | ||
| Read | platform type from RTC CMOS register 0x4B. | ||
| We | preserve bit 7 (NMI mask) of the address register. | ||
| PlatformType | = IoRead8 (0x70); | ||
| Select | CMOS reg 0x4B | ||
| Read | platform type byte | ||
| Determine | debug routing based on platform type. | ||
| if | (N3 > 3) { | ||
| N3 | is in valid range > 3, use as-is | ||
| Platform | type 0: read hardware strap from F000:0490 bit 1, OR with 1 | ||
| else | N3 is 1, 2, or 3: use directly | ||
| Map | platform type to debug route value. | ||
| if | ((N3 - 1) <= 0xFD) { | ||
| N3 | is 1..3 (valid range check passed) | ||
| UBA_DEBUG_ROUTE_A | } else { | ||
| UBA_DEBUG_ROUTE_B | } | ||
| If | the debug level matches the routing mask, call UBA debug output. | ||
| if | ((DebugRoute & DebugLevel) != 0) { | ||
| UBA | protocol function index 1 (offset 0x08): DebugPrint | ||
| UbaDebugFunc | = (UBA_DEBUG_PRINT)((UINT64 )((UINT8 *)Uba + 8)); | ||
| Get | the UBA protocol and call its assertion handler. | ||
| UBA | protocol function index 1 (offset 0x08) is the assert handler | ||
| which | takes (FileName, LineNumber, AssertString). | ||
| Read | each GUID as two unaligned 64-bit values and compare. | ||
| Guid1Low | = ReadUnaligned64 (Guid1); | ||
| SystemTable | + 104 (0x68) = NumberOfTableEntries (UINTN) | ||
| SystemTable | + 112 (0x70) = ConfigurationTable (EFI_CONFIGURATION_TABLE *) | ||
| HobCount | = (UINTN )((UINT8 *)gSystemTable + 104); | ||
| Walk | the configuration table to find the DXE Services HOB entry. | ||
| Each | entry is sizeof(EFI_CONFIGURATION_TABLE) = 24 bytes: | ||
| for | (Index = 0; Index < HobCount; Index++) { | ||
| Found | the DXE Services HOB - cache its data pointer. | ||
| gHobList | = *(VOID )(HobEntries + Index 24 + 16);* | ||
| DXE | Services HOB not found - report error. | ||
| UbaDebugPrint | (0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", 0x800000000000000EULL); | ||
| debug banner identifying this module. | |||
| UbaDebugPrint | (0x80000000, "UBA:SlotDataUpdate-TypeNeonCityFPGA\n"); | ||
| Locate | the UBA protocol interface. | ||
| Status | = gBootServices->LocateProtocol ( | ||
| UBA | protocol GUID | ||
| UBA | protocol function index 2 (offset 0x10): SetData | ||
| VOID | *Data, UINTN DataSize) | ||
| UbaSetData | = (UBA_SET_DATA)((UINT64 )((UINT8 *)Uba + 16)); | ||
| Register | PSLT Entry 1: Primary slot table with length 0xC40 | ||
| Status | = UbaSetData (Uba, &gUbaSlotDataPsl1Guid, (VOID *)mPslEntry1, 32); | ||
| Register | PSLT Entry 2: Secondary slot table with length 0xC40 | ||
| Status | = UbaSetData (Uba, &gUbaSlotDataPsl2Guid, (VOID *)mPslEntry2, 40); | ||
| Register | PSLT Entry 3: Tertiary slot table with alternate length 0xC08 | ||
| Status | = UbaSetData (Uba, &gUbaSlotDataPsl3Guid, (VOID *)mPslEntry3, 40); | ||
| Cache | UEFI global variables. | ||
| gImageHandle | = ImageHandle; | ||
| Retrieve | the HOB list (cached globally in gHobList). | ||
| GetHobList | (); | ||
| Install | platform-specific slot data via UBA protocol. | ||
| Status | = InstallSlotData (); |
Generated by HR650X BIOS Decompilation Project