Newer
Older
AMI-Aptio-BIOS-Reversed / AmiModulePkg / NVRAM / NvramSmm / NvramSmm.md
@Ajax Dong Ajax Dong 2 days ago 9 KB Restructure the repo

NvramSmm

Function Table

Address Name Description
ModuleEntryPoint
NvramCoreInit
SmiNvramCommHandler
SmiNvramUpdateHandler
RuntimeGetVariable
RuntimeSetVariable
RuntimeGetNextVariableName
RuntimeQueryVariableInfo
SecureBootSetVariable
SecureBootGetVariable
NvramSyncCallbackSetup
GetFvHeaderSize
VarStoreInit
NvramHobRetrieve
Build path: e:\hs\Build\HR6N0XMLK\DEBUG_VS2015\X64\AmiModulePkg\NVRAM\NvramSmm\DEBUG
Source files: NvramSmm.c, NvramDxeCommon.c, NvramSmi.c, AuthService.c
Global State (from .data section)
0x11670 EFI_SYSTEM_TABLE *gST = NULL; // 0x11660
0x11668 EFI_RUNTIME_SERVICES *gRT = NULL; // 0x11678
0x11680 VOID *gDS = NULL; // 0x11758
0x116F8 VOID *gMmst; // 0x116F0
0x11690 VOID *gSmmBufferValidation = NULL; // 0x11750
0x115D0 UINT64 gNvramStoreSize = 0; // 0x115D8
0x11C24 UINT8 gVarStoreInitFlags = 0; // 0x11C20
0x11C28 EFI_RUNTIME_SERVICES *gRuntimeServicesOverride = NULL; // 0x116E8
0x11F10 UINTN gDriverNvramBufferSize = 0; // 0x11F18
0x11648 UINT64 gMailboxNvramBase = 0; // 0x11F28
0x11F30 UINT32 gMailboxNvramFlags = 0; // 0x11F38
0x11F40 UINT64 gMailboxVarStoreSize = 0; // 0x11F48
0x11609 BOOLEAN gSmiProcessing = FALSE; // 0x11768
0x11894 VAR_STORE_INFO gVarStoreArray[?]; // 0x11C38
Module Entry Point
Initialize all UEFI/SMM plumbing
Global status variable
Locate SmmBase2 protocol
Get SMM System Table
Locate SMM memory allocation protocol
Get SMRAM ranges
Initialize PCIE segment bus table
Initialize AmiCryptoLib
Initialize heap memory manager
Locate SMM buffer validation protocol
Locate DxeServicesTable
Fall through to SMM protocol install / notification init (returned from Init)
NVRAM Initialization (sub_10F8)
Signal that NVRAM store size at least matches HOB pattern
Get NVRAM HOB from HOB list
Read NvramMailBox variable to get mailbox memory region info
Extract mailbox NVRAM base/size details from the variable
offset 0
offset 8
offset 60
offset 736
offset 744
Close the variable
Validate that VarStoreInfo NVRAM sizes match mailbox
Copy VarStoreInfo NVRAM data from mailbox into working buffer
If simulation mode, also copy NvInfo data from mailbox
Allocate DMA buffer for SMI communication (0x40000 bytes)
Initialize buffer header
data starts at +24
usable size
Register SMI handler for NVRAM variable access
Register notification callback on SMM ReadyToLock
Override runtime variable services
Register variable change callbacks for variable sync
Register additional callbacks for DmiArray variable change
Register SMM communication protocol for variable sync
SMI NVRAM Communication Handler (sub_6AE4)
Validate buffer address with SMM buffer validation protocol
Align the buffer pointer to 8-byte boundary
Set SMI processing flag
Read command code at offset 0
Type 0: GetVariable operation
Buffer layout: +0x00: cmd, +0x08: NameSize, +0x10: DataSize
Nested variable read with sub_5580
Type 1: SetVariable operation
Buffer layout: +0x00: cmd, +0x08: NameLength, +0x10: DataSize
sub_5654 handles the actual set
Type 2: GetNextVariableName
Type 3: QueryVariableInfo
Type 4: Variable write with auth
Migration complete notification
Write status back to command code location
SMI NVRAM Update Handler (sub_5FAC and sub_5E44)
qword_11F00 // Validate comm buffer
Check size match
Check that source buffer has a valid FV header
Check if FV header size is consistent
Validate the data aligns with store parameters
Need to allocate bigger temp buffer (3x)
Copy source NVRAM data
Check that data is not all 0xFF (empty erased)
Check for active NVRAM (FV header + GUID match)
Check size matches the data in the FV
Copy from temp to working store
Set up store pointers for the migration
source address
Validate store parameters
F Fill header calculation
Set up the variable enumeration
Try to find space and move
Garbage collection / flush path
Mark old store entries
mark deleted
Full GC path
At this point the GC reclaimed space
Runtime Variable Service Overrides
Dispatches to SMI via SMI_NVRAM_CMD_GET_VARIABLE command
For non-SMM context, sends SMI to enter SMM first.
Forward declaration: actual implementation at sub_5580.
Dispatches to SMI via SMI_NVRAM_CMD_SET_VARIABLE command
Forward declaration: actual implementation at sub_5654.
Dispatches via SMI_NVRAM_CMD_GET_NEXT_VARIABLE
Forward declaration: actual implementation at sub_F54.
Dispatches via SMI_NVRAM_CMD_QUERY_VARIABLE_INFO
Forward declaration: actual implementation at sub_5D34.
SecureBoot Aware Variable Services
Determine variable type from vendor GUID
Log DEBUG((
Write the variable to the actual NVRAM store
Handle SecureBootMode transitions
First type: handle PK/KEK changes
Setup mode -> set to secure boot mode 0
Deployed mode -> set to 3
Not physically present
user mode
For DeploymentModeNv and VendorKeysNv, reject access
Variable Synchronization Callbacks
Check disable flag variable
Read disable flag
Variable sync from Setup to other config variables
Sync fields from Setup to variables
Sync SocketIioConfig
Sync SRIOVEnable between IntelSetup and Setup
NVRAM Storage Helper Functions
Check for FV header signature at offset 40
FV header length at offset 48
basic FV header only
Extended header present at ExtHeaderOffset
Return aligned total size
start from end, working backwards
aligned from flags field
Attempt to locate existing variable data
Check for valid flash store
no existing data
NVRAM HOB Retrieval (sub_644C)
Search for NVRAM HOB
No HOB found, run in simulation mode
HOB +48 = NVRAM size
HOB +24 = store address
Validate that store fits in the GCD descriptor
Allocate working buffer for NVRAM image
If no real store, fill with 0xFF (simulation)
Read store from actual flash
First initialization: discover GCD descriptor
Validate boundaries
Setup variable store info from working buffer
Store info pointer to the variable store array entry
Set up callback table for for for for for for...
Mark as initialized
Allocate the driver's NVRAM working buffer (3x store size for GC)
Process "StdDefaults" if present for first-boot defaults
Load default variable values from HOB or FV
clear defaults flag
Apply defaults
Determine actual maximum NVRAM size across all stores
Re allocate driver buffer with larger size
NVRAMAM Init (sub_68384)
Find the NVRAM HOB from HOB list
Walk HOB list looking for NVRAM HOB data structure
Initialize driver's NVRAM working buffer
Initialize the store from from HOB
Set up VarStore array entry
Allocate working comparison buffer
Ensure all stores fit in the working buffer

Generated by HR650X BIOS Decompilation Project