| Field | Value |
|---|---|
| Module Name | RegAccessPeim.efi |
| Index | 0368 |
| Architecture | IA32 (32-bit) |
| Base Address | 0xFFDAE9EC |
| Image Size | 0x2180 (8,576 bytes) |
| MD5 | 21b4333fffdb77a75b6ac76d03381564 |
| SHA256 | 06a6b9c070f5f34999d24c8c98445461cbdd1808d17715adaf3d12fd99313e47 |
| Source | CpRcPkg/Universal/RegAccess/Pei/RegAccess.c |
| PDB | Build/HR6N0XMLK/DEBUG_VS2015/IA32/.../RegAccessPeim.pdb |
| Entry Point | 0xFFDAED01 (RegAccessEntryPoint) |
This PEIM provides register read/write/modify services during the PEI (Pre-EFI Initialization) phase. It handles access to various CPU and platform registers across multiple sockets, IIO (Integrated IO) complexes, and functional blocks (CHA, PCU, Ubox, M2MEM, KTI, etc.).
The module registers a PEI REG_ACCESS PPI that exposes four operations:
Each operation dispatches through a function pointer table indexed by a box type field extracted from the descriptor.
RegAccessEntryPoint() -- GetPeiServicesTablePointer() <- via IDT-based lookup -- PcdGetProtocol() <- Get PCD PPI -- InstallPpi() <- Register RegAccess PPI -- DebugAssertReport() <- Error handling RegAccessReadRegister() / RegAccessWriteRegister() / RegAccessReadModify() -- dispatch via function tables -- RegAccessReadByType0 / RegAccessWriteByType0 / RegAccessReadModifyByType0 |-- RegAccessGetCfgAddress() <- Get MMIO base from PCD |-- IoMemRead / IoMemWrite <- Aligned memory access -- RegAccessReadMulti / RegAccessWriteMulti |-- RegAccessGetCfgAddress() <- Get MMIO base |-- RegAccessValidateRange() <- Validate alignment & bounds |-- IoMemRead / IoMemWrite (loop) <- Multi-element access RegAccessTranslateFull() -- TranslateAddressWalk() |-- CpuTypeToTableIndex() <- Level 1: Socket/CpuType mapping |-- CpuTypeToDeviceIndex() <- Level 2: Device number mapping |-- FuncBlockToIndex() <- Level 3: Function block mapping -- RegAccessLookupTablePointer() <- Get PCD table address
The module uses 4 dispatch tables in .rdata:
| Table | Address | Indexed By | Functions |
|---|---|---|---|
| gRegAccessReadDispatchTable | 0xFFDB05B0 | box type (bits 8-11 of ExtInfo) | RegAccessReadByType0, RegAccessReadMulti |
| gRegAccessWriteDispatchTable | 0xFFDB05BC | box type | RegAccessWriteByType0, RegAccessWriteMulti |
| gRegAccessReadModifyDispatchTable | 0xFFDB05C8 | box type | RegAccessReadModifyByType0 |
| gRegAccessConfigDispatchTable | 0xFFDB05D4 | box type | RegAccessGetCfgAddress |
| Original Name | New Name | Address | Size | Description |
|---|---|---|---|---|
| sub_FFDAEC4C | RegAccessMemSet | 0xFFDAEC4C | 0x15 | memset wrapper |
| sub_FFDAEC6C | RegAccessMemMove | 0xFFDAEC6C | 0x3F | memmove with overlap handling |
| sub_FFDAECCC | RegAccessFill64 | 0xFFDAECCC | 0x1F | Fill array with 64-bit values |
| sub_FFDAECEC | RegAccessMemSet32 | 0xFFDAECEC | 0x15 | memset32 wrapper |
| _ModuleEntryPoint | RegAccessEntryPoint | 0xFFDAED01 | 0x4B | PEIM entry point |
| sub_FFDAED4C | RegAccessReadRegister | 0xFFDAED4C | 0x17 | Dispatch: Read Register |
| sub_FFDAED63 | RegAccessWriteRegister | 0xFFDAED63 | 0x17 | Dispatch: Write Register |
| sub_FFDAED7A | RegAccessReadModify | 0xFFDAED7A | 0x1C | Dispatch: Read-Modify-Write |
| sub_FFDAED96 | RegAccessGetConfigSpace | 0xFFDAED96 | 0x22 | Dispatch: Get Config Space |
| sub_FFDAEDB8 | GetPeiServicesPpi | 0xFFDAEDB8 | 0x31 | Get PPI via PeiServices |
| sub_FFDAEDE9 | DebugAssertReport | 0xFFDAEDE9 | 0x2A | Report assert/debug message |
| sub_FFDAEE13 | DebugPrintWorker | 0xFFDAEE13 | 0x1E | Debug print via PPI |
| sub_FFDAEE31 | IsDebugEnabled | 0xFFDAEE31 | 0x03 | Always returns TRUE |
| sub_FFDAEE34 | BoolCheck | 0xFFDAEE34 | 0x09 | Boolean check (a != 0) |
| sub_FFDAEE3D | IoMemRead | 0xFFDAEE3D | 0x8A | Aligned IO memory read (1/2/8 bytes) |
| sub_FFDAEEC7 | IoMemWrite | 0xFFDAEEC7 | 0x82 | Aligned IO memory write (1/2/4+4 bytes) |
| sub_FFDAEF49 | BitFieldMerge | 0xFFDAEF49 | 0x8D | Bitwise merge with AND/OR masks |
| sub_FFDAEFD6 | RegAccessGetCfgThunk | 0xFFDAEFD6 | 0x05 | Thunk to TranslateFull + IoMemRead |
| sub_FFDAEFDB | RegAccessReadCfgThunk | 0xFFDAEFDB | 0x37 | Translate + IoMemRead config space |
| sub_FFDAF012 | RegAccessWriteCfgThunk | 0xFFDAF012 | 0x3D | Translate + IoMemWrite config space |
| sub_FFDAF04F | RegAccessReadModifyThunk | 0xFFDAF04F | 0x80 | Translate + RMW via AND/OR |
| sub_FFDAF0CF | RegAccessGetCfgAddress | 0xFFDAF0CF | 0x1E | Get MMIO address from PCD |
| sub_FFDAF0ED | RegAccessReadByType0 | 0xFFDAF0ED | 0x34 | Read register (type 0 path) |
| sub_FFDAF121 | RegAccessValidateRange | 0xFFDAF121 | 0xB7 | Validate range/alignment for access |
| sub_FFDAF1D8 | RegAccessReadMulti | 0xFFDAF1D8 | 0x99 | Multi-element register read |
| sub_FFDAF271 | RegAccessWriteByType0 | 0xFFDAF271 | 0x39 | Write register (type 0 path) |
| sub_FFDAF2AA | RegAccessWriteMulti | 0xFFDAF2AA | 0x99 | Multi-element register write |
| sub_FFDAF343 | RegAccessReadModifyByType0 | 0xFFDAF343 | 0x53 | Read-modify-write (type 0 path) |
| sub_FFDAF396 | GetPeiServicesTablePointer | 0xFFDAF396 | 0x32 | Get PeiServices via IDT |
| sub_FFDAF3C8 | GetDebugErrorLevel | 0xFFDAF3C8 | 0x4F | Read debug level from CMOS 0x4A |
| sub_FFDAF417 | InternalLShift64 | 0xFFDAF417 | 0x42 | 64-bit left shift wrappper |
| sub_FFDAF459 | InternalRShift64 | 0xFFDAF459 | 0x42 | 64-bit right shift wrapper |
| sub_FFDAF49B | InternalReadIdtr | 0xFFDAF49B | 0x23 | Read IDTR (sidt instruction) |
| sub_FFDAF4BE | PcdInitRegAccessData | 0xFFDAF4BE | 0x9B | PCD data buffer init |
| sub_FFDAF559 | RegAccessLookupTablePointer | 0xFFDAF559 | 0x17E | PCD table address lookup |
| sub_FFDAF6D7 | PcdGetProtocol | 0xFFDAF6D7 | 0x58 | Locate PCD PPI protocol |
| sub_FFDAF72F | PcdGetPtr | 0xFFDAF72F | 0x0F | PCD GetPtr wrapper |
| sub_FFDAF73E | PcdGetSize | 0xFFDAF73E | 0x0F | PCD GetSize wrapper |
| sub_FFDAF74D | RegAccessTranslateFull | 0xFFDAF74D | 0x10D | Full address translation with caching |
| sub_FFDAF85A | TranslateAddressWalk | 0xFFDAF85A | 0x98 | 3-level page table walk |
| sub_FFDAF8F2 | CpuDeadLoopEx | 0xFFDAF8F2 | 0x6C | CpuDeadLoop with assert |
| sub_FFDAF95E | CpuTypeToTableIndex | 0xFFDAF95E | 0x1C8 | Socket/box-type to table index |
| sub_FFDAFB26 | CpuTypeToDeviceIndex | 0xFFDAFB26 | 0x359 | CPU topology to device index |
| sub_FFDAFED6 | FuncBlockToIndex | 0xFFDAFED6 | 0x1F5 | Function block to table offset |
| sub_FFDB010B | RegAccessStripHighBits | 0xFFDB010B | 0x0A | Strip high address bits (return & 0xFFFF0000) |
| Address | Name | Size | Description |
|---|---|---|---|
| 0xFFDB05B0 | funcs_FFDAED70 | 12 | Read dispatch table (3 entries) |
| 0xFFDB05BC | funcs_FFDAED59 | 12 | Write dispatch table |
| 0xFFDB05C8 | funcs_FFDAED8B | 12 | ReadModify dispatch table |
| 0xFFDB05D4 | funcs_FFDAEDA9 | 12 | GetConfig dispatch table |
| 0xFFDB05E0 | byte_FFDB05E0 | 12 | Access width per box type |
| 0xFFDB05EC | byte_FFDB05EC | 12 | Element stride per box type |
| 0xFFDB090C | byte_FFDB090C | 56+ | Functional block to device tables (168-byte rows) |
| 0xFFDB09B4 | byte_FFDB09B4 | 5 | KTI instance to device mapping |
| 0xFFDB09BC | unk_FFDB09BC | - | RegAccess PPI GUID data |
| 0xFFDB0A08 | dword_FFDB0A08 | - | PCD config space (".data") |
All 55 strings include path references (build paths), format strings for CPU/IO box assertions, and assert condition strings. Key platform box types identified:
| Value | Meaning |
|---|---|
| 0x80000002 | EFI_UNSUPPORTED |
| 0x80000003 | EFI_INVALID_PARAMETER (alignment) |
| 0x80000005 | EFI_ALIGNMENT_ERROR |
| 0x8000000C | EFI_INVALID_PARAMETER |
| 0x80000015 | EFI_ALREADY_STARTED |