| Address | Name | Description |
|---|---|---|
| AsmReadTsc | ||
| AsmReadEflags | ||
| AsmDisableInterrupts | ||
| AsmEnableInterrupts | ||
| AsmPause | ||
| IoRead32 | ||
| MmioWrite16 | ||
| IoRead8 | ||
| IoWrite8 | ||
| ReadUnaligned64 | ||
| LocateProtocol | ||
| DebugPrint | ||
| DebugAssert | ||
| CompareGuid | ||
| PcdGet32 | ||
| TimestampGetTimestamp | ||
| TimestampGetProperties | ||
| CalibrateTscFrequency | ||
| TimestampDxeEntryPoint | ||
| Module | Globals | |
| System | Table, Boot Services, Runtime Services (saved from entry point) | |
| Debug | protocol interface (used for DebugPrint / DebugAssert) | |
| HOB | list and PCD protocol caches | |
| PCI | Express ECAM base address | |
| TSC | frequency determined by calibration | |
| Timestamp | protocol state | |
| EFI_TIMESTAMP_PROTOCOL | interface function table. | |
| Installed | by InstallMultipleProtocolInterfaces. | |
| STATIC | CONST EFI_TIMESTAMP_PROTOCOL mTimestampInterface = { | |
| Known | GUIDs (in the binary's .rdata section) | |
| Internal | Library Helpers (wrapped from BaseLib / compiler intrinsics) | |
| ASSERT | ((Port & 3) == 0) | port must be DWORD-aligned |
| return | __indword (Port); | |
| ASSERT | ((Address & 1) == 0) | |
| Assert | that (Length - 1) <= (MAX_UINTN - (UINTN)Destination) and | |
| if | (Source < Destination && | |
| Overlap | with source before destination: copy backwards. | |
| UINTN | Count; | |
| Copy | 8-byte aligned chunks in reverse. | |
| Fall | through to qmemcpy of remaining 8-byte blocks | |
| then | byte-by-byte for the remainder. | |
| ASSERT | (Buffer != NULL) | |
| return | (UINT64 )Buffer; | |
| UEFI | Library Wrappers | |
| Call | the debug protocol's print function at offset 0x00. | |
| Signatures | differ; this is a simplified wrapper. | |
| Call | the debug protocol's assert function at offset 0x08. | |
| Compare | the GUID at gSystemTable->ConfigurationTable[Index].VendorGuid | |
| against | EFI_HOB_LIST_GUID. | |
| if | (CompareGuid ( | |
| The | PCD protocol's Get32() is the 4th function in the protocol | |
| offset | +32 from the interface pointer). | |
| return | ((UINT32 (EFIAPI )(UINTN))((UINT8 )mPcdProtocol + 32))(TokenNumber); | |
| Timestamp | Protocol Implementation | |
| mBaseTimeStamp | <= mEndTime is always TRUE (since mEndTime = MAX_UINT64). | |
| Return | elapsed ticks = currentTSC - base. | |
| if | (mBaseTimeStamp <= mEndTime) { | |
| Zero | out the 16-byte output buffer. | |
| CopyMem | (TimestampProperties, NULL, 16); | |
| Copy | the current frequency and end time values. | |
| Frequency | is at [0x00], EndTime at [0x08]. | |
| values | here (it only zeroes the buffer). This is likely a bug or intentional | |
| stub | in the original implementation, or the values are copied implicitly | |
| via | shared global data that the caller accesses directly. | |
| For | correctness, we provide the proper values: | |
| Calibration | and Initialization | |
| Save | interrupt state. | |
| Eflags | = AsmReadEflags (); | |
| Read | initial reference counter value (24-bit masked). | |
| InitialCounter | = IoRead32 (TIMESTAMP_CALIBRATION_PORT) & 0xFFFFFF; | |
| Record | start TSC. | |
| TscStart | = AsmReadTsc (); | |
| Wait | for the reference counter to advance by TIMESTAMP_CALIBRATION_DELTA. | |
| In | 24-bit signed arithmetic, bit 23 is set when the difference wraps past | |
| which | means "continue while current <= initial + delta (no wrap)." | |
| When | current surpasses (initial + delta), (initial + delta - current) | |
| becomes | negative in 24-bit signed arithmetic, bit 23 is set, and the | |
| loop | exits. | |
| do | { | |
| Record | end TSC. | |
| if | (InterruptsEnabled) { | |
| TSC | frequency = TSC ticks during calibration * 10000. | |
| The | reference counter delta of 357 at whatever frequency port 0x508 runs | |
| corresponds | to a fixed time window. Multiplying TSC ticks by 10000 yields | |
| ticks | per second. | |
| return | TscDelta * TIMESTAMP_TICK_TO_HZ_MULTIPLIER; | |
| Entry | Point | |
| Step | 1: Save UEFI core-provided pointers. | |
| gImageHandle | = ImageHandle; | |
| These | are pointer validity checks. The EDK2 library constructors would | |
| normally | perform them; in this standalone driver, we guard manually. | |
| if | (gImageHandle == NULL) { | |
| Step | 2: Locate the HOB list from the System Table ConfigurationTable. | |
| GetHobList | (); | |
| Step | 3: Get the PCD protocol interface. | |
| Step | 4: Read the PCI Express base address (MMIO base for ECAM). | |
| PCD | token 5 = PcdPciExpressBaseAddress (typically). | |
| mPciExpressBaseAddress | = PcdGet32 (5); | |
| Step | 5: Check if the PCIe Enhanced Configuration Access is enabled and | |
| optionally | write to the RTC index register via PCIe ECAM to pre-enable | |
| the | reference counter. PCD token 1024068 (0xFA044) = PcdPciExpressBaseSize | |
| or | equivalent size enable. | |
| PciExpressBaseSize | = PcdGet32 (1024068); | |
| ECAM | address space is accessible. Write 0x0500 to the PCIe config space | |
| of | the RTC/LPC controller to enable the reference counter. | |
| Token | 1024064 (0xFA040) = PcdPciExpressBaseAddress (base). | |
| PciExpressBaseAddr | = PcdGet32 (1024064); | |
| Mark | the PCIe ECAM enable as done by setting the top bit of the size PCD. | |
| Step | 6: Calibrate the TSC frequency. | |
| mTimestampFrequencyHz | = CalibrateTscFrequency (); | |
| Step | 7: Set up timestamp protocol state. | |
| mBaseTimeStamp | = 0; | |
| Step | 8: Install the EFI_TIMESTAMP_PROTOCOL. | |
| TimestampHandle | = NULL; |
Generated by HR650X BIOS Decompilation Project