/** @file
PcRtcSmm.h -- Header for PcRtcSmm
Copyright (c) HR650X BIOS Decompilation Project
**/
#ifndef __PCRTCSMM_H__
#define __PCRTCSMM_H__
#include "../uefi_headers/Uefi.h"
//
// Function Prototypes
//
EFI_STATUS
EFIAPI
PcRtcGetCentury(
VOID
);
EFI_STATUS
EFIAPI
CpuPause(
VOID
);
EFI_STATUS
EFIAPI
ReadTsc(
VOID
);
EFI_STATUS
EFIAPI
EnableInterrupts(
VOID
);
EFI_STATUS
EFIAPI
DisableInterrupts(
VOID
);
EFI_STATUS
EFIAPI
GetCallerEflags(
VOID
);
EFI_STATUS
EFIAPI
SetJump(
VOID
);
EFI_STATUS
EFIAPI
LongJump(
VOID
);
EFI_STATUS
EFIAPI
PcRtcValidateJumpBuffer(
VOID
);
EFI_STATUS
EFIAPI
DebugPrint(
VOID
);
EFI_STATUS
EFIAPI
DebugAssert(
VOID
);
EFI_STATUS
EFIAPI
CompareGuidPair(
VOID
);
EFI_STATUS
EFIAPI
ReadUnaligned64(
VOID
);
EFI_STATUS
EFIAPI
PcRtcSmmCpuWrite(
VOID
);
EFI_STATUS
EFIAPI
PcdGet32(
VOID
);
EFI_STATUS
EFIAPI
PciExpressWrite500(
VOID
);
EFI_STATUS
EFIAPI
ReadMmio32(
VOID
);
EFI_STATUS
EFIAPI
MicroSecondDelay(
VOID
);
EFI_STATUS
EFIAPI
SmmCpuReadSaveState(
VOID
);
EFI_STATUS
EFIAPI
IsAddressInSmram(
VOID
);
EFI_STATUS
EFIAPI
FreePoolMmramAware(
VOID
);
EFI_STATUS
EFIAPI
PcRtcReadReg(
VOID
);
EFI_STATUS
EFIAPI
PcRtcWriteReg(
VOID
);
EFI_STATUS
EFIAPI
DecimalToBcd(
VOID
);
EFI_STATUS
EFIAPI
BcdToDecimal(
VOID
);
EFI_STATUS
EFIAPI
PcRtcWaitForUpdateComplete(
VOID
);
EFI_STATUS
EFIAPI
PcRtcIsLeapYear(
VOID
);
EFI_STATUS
EFIAPI
PcRtcIsDayValid(
VOID
);
EFI_STATUS
EFIAPI
PcRtcValidateTime(
VOID
);
EFI_STATUS
EFIAPI
PcRtcConvertFromRegisterFormat(
VOID
);
EFI_STATUS
EFIAPI
PcRtcConvertToRegisterFormat(
VOID
);
EFI_STATUS
EFIAPI
PcRtcIsTimeNearby(
VOID
);
EFI_STATUS
EFIAPI
PcRtcGetTime(
VOID
);
EFI_STATUS
EFIAPI
PcRtcSmmGetTimeHandler(
VOID
);
EFI_STATUS
EFIAPI
PcRtcSetTime(
VOID
);
EFI_STATUS
EFIAPI
PcRtcSmmSetTimeHandler(
VOID
);
EFI_STATUS
EFIAPI
PcRtcGetWakeupTime(
VOID
);
EFI_STATUS
EFIAPI
PcRtcSmmGetAlarmHandler(
VOID
);
EFI_STATUS
EFIAPI
PcRtcSetWakeupTime(
VOID
);
EFI_STATUS
EFIAPI
PcRtcSmmSetAlarmHandler(
VOID
);
EFI_STATUS
EFIAPI
PcRtcInitRtcHardware(
VOID
);
EFI_STATUS
EFIAPI
PcRtcInitialize(
VOID
);
EFI_STATUS
EFIAPI
PcRtcSmmDriverInit(
VOID
);
EFI_STATUS
EFIAPI
SmmCoreEntry(
VOID
);
EFI_STATUS
EFIAPI
_ModuleEntryPoint(
VOID
);
EFI_STATUS
EFIAPI
SmmMain(
VOID
);
EFI_STATUS
EFIAPI
SmmInstallConfigurationTable(
VOID
);
EFI_STATUS
EFIAPI
Register Ports (SMM alias)(
VOID
);
EFI_STATUS
EFIAPI
Register Indices(
VOID
);
EFI_STATUS
EFIAPI
A bits(
VOID
);
EFI_STATUS
EFIAPI
In Progress(
VOID
);
EFI_STATUS
EFIAPI
B bits(
VOID
);
EFI_STATUS
EFIAPI
Savings Enable(
VOID
);
EFI_STATUS
EFIAPI
Wave Enable(
VOID
);
EFI_STATUS
EFIAPI
Ended Interrupt Enable(
VOID
);
EFI_STATUS
EFIAPI
Interrupt Enable(
VOID
);
EFI_STATUS
EFIAPI
D bits(
VOID
);
EFI_STATUS
EFIAPI
RAM and Time(
VOID
);
EFI_STATUS
EFIAPI
macros for RTC register access via SMM I/O ports(
VOID
);
EFI_STATUS
EFIAPI
Global Variables (mapped from .data section at 0x2A20-0x2C40)(
VOID
);
EFI_STATUS
EFIAPI
EFI globals (set by UefiBootServicesTableLib / UefiRuntimeServicesTableLib)(
VOID
);
EFI_STATUS
EFIAPI
gImageHandle = NULL; // 0x2AB8(
VOID
);
EFI_STATUS
EFIAPI
EFI_BOOT_SERVICES *gBS = NULL; // 0x2AB0(
VOID
);
EFI_STATUS
EFIAPI
//(
VOID
);
EFI_STATUS
EFIAPI
globals (resolved via SmmServicesTableLib)(
VOID
);
EFI_STATUS
EFIAPI
*gSmst = NULL; // 0x2AC8(
VOID
);
EFI_STATUS
EFIAPI
from GUID at 0x2A60(
VOID
);
EFI_STATUS
EFIAPI
Runtime RSC Handler Protocol(
VOID
);
EFI_STATUS
EFIAPI
SmmEndOfDxe +104 SmmAllocatePages +112 SmmFreePages +120 SmmAllocatePool(
VOID
);
EFI_STATUS
EFIAPI
*gSmmRuntimeRsc = NULL; // 0x2AA0 (qword_2AA0)(
VOID
);
EFI_STATUS
EFIAPI
(qword_2AE8, lazy-init from GUID 0x2A20)(
VOID
);
EFI_STATUS
EFIAPI
(qword_2AF0, SMM CPU I/O2 interface)(
VOID
);
EFI_STATUS
EFIAPI
Variable Protocol (lazy-init)(
VOID
);
EFI_STATUS
EFIAPI
*gSmmVariable = NULL; // 0x2AD0 (qword_2AD0)(
VOID
);
EFI_STATUS
EFIAPI
type from PCD protocol(
VOID
);
EFI_STATUS
EFIAPI
gPcdDbValue = 0; // 0x2AD8: PcdGet32(PcdPlatformType) result(
VOID
);
EFI_STATUS
EFIAPI
(PCD protocol pointer)(
VOID
);
EFI_STATUS
EFIAPI
list (lazy-init via gEfiHobListGuid)(
VOID
);
EFI_STATUS
EFIAPI
*gHobList = NULL; // 0x2AE0 (qword_2AE0)(
VOID
);
EFI_STATUS
EFIAPI
range tracking(
VOID
);
EFI_STATUS
EFIAPI
*gSmramRanges = NULL; // 0x2C18(
VOID
);
EFI_STATUS
EFIAPI
state globals(
VOID
);
EFI_STATUS
EFIAPI
gRtcTimeZone = 2047; // 0x2C38: EFI_UNSPECIFIED_TIMEZONE(
VOID
);
EFI_STATUS
EFIAPI
UINT8 gRtcCenturyOffset = 0x32; // 0x2C3B (n50): CMOS offset for century byte(
VOID
);
EFI_STATUS
EFIAPI
Config Structure (28 bytes at 0x2C20: unk_2C20)(
VOID
);
EFI_STATUS
EFIAPI
by sub_D20 (SetTime) and sub_EC8 (GetWakeupTime) to save/restore(
VOID
);
EFI_STATUS
EFIAPI
across operations.(
VOID
);
EFI_STATUS
EFIAPI
gRtcConfig; // 0x2C20(
VOID
);
EFI_STATUS
EFIAPI
System Return Status for module entry(
VOID
);
EFI_STATUS
EFIAPI
gModuleEntryStatus = 0x8000000000000001ULL; // 0x2C08(
VOID
);
EFI_STATUS
EFIAPI
gJumpBuffer[320]; // 0x2B10 (unk_2B10)(
VOID
);
EFI_STATUS
EFIAPI
port scratch (byte at 0x2B00)(
VOID
);
EFI_STATUS
EFIAPI
gDebugPortScratch; // 0x2B00(
VOID
);
EFI_STATUS
EFIAPI
declarations for internal functions(
VOID
);
EFI_STATUS
EFIAPI
EFI_STATUS(
VOID
);
EFI_STATUS
EFIAPI
intrinsic wrappers (sub_470, sub_480, sub_490, sub_4A0, sub_4B0)(
VOID
);
EFI_STATUS
EFIAPI
support functions(
VOID
);
EFI_STATUS
EFIAPI
JUMP_BUFFER * (at least 320 bytes)(
VOID
);
EFI_STATUS
EFIAPI
the jump buffer pointer and alignment(
VOID
);
EFI_STATUS
EFIAPI
(JumpBuffer);(
VOID
);
EFI_STATUS
EFIAPI
registers: rbx, rbp, rdi, rsi, r12, r13, r14, r15(
VOID
);
EFI_STATUS
EFIAPI
by return address and MXCSR(
VOID
);
EFI_STATUS
EFIAPI
pointer proxy(
VOID
);
EFI_STATUS
EFIAPI
XMM6-XMM15 (128-bit each)(
VOID
);
EFI_STATUS
EFIAPI
through the saved return address (offset 72 in jump buffer)(
VOID
);
EFI_STATUS
EFIAPI
overlap: if Source < Destination and Source + Length >= Destination(
VOID
);
EFI_STATUS
EFIAPI
backwards from end.(
VOID
);
EFI_STATUS
EFIAPI
(Source < Destination &&(
VOID
);
EFI_STATUS
EFIAPI
in reverse 8-byte chunks(
VOID
);
EFI_STATUS
EFIAPI
(; Length >= 8; Length -= 8)(
VOID
);
EFI_STATUS
EFIAPI
remaining bytes in reverse(
VOID
);
EFI_STATUS
EFIAPI
(; Length > 0; Length--)(
VOID
);
EFI_STATUS
EFIAPI
forward 8-byte chunks via qmemcpy(
VOID
);
EFI_STATUS
EFIAPI
Remaining = Length;(
VOID
);
EFI_STATUS
EFIAPI
remaining 1-7 bytes(
VOID
);
EFI_STATUS
EFIAPI
8-byte aligned chunks(
VOID
);
EFI_STATUS
EFIAPI
Chunks = Length >> 3;(
VOID
);
EFI_STATUS
EFIAPI
remaining bytes(
VOID
);
EFI_STATUS
EFIAPI
Remaining = Length & 7;(
VOID
);
EFI_STATUS
EFIAPI
helpers (sub_199C at 0x199C and sub_1ABC at 0x1ABC / sub_1A34 at 0x1A34)(
VOID
);
EFI_STATUS
EFIAPI
the SMM variable protocol if needed (lazy init)(
VOID
);
EFI_STATUS
EFIAPI
(gSmmVariable == NULL)(
VOID
);
EFI_STATUS
EFIAPI
debug level from CMOS (port 0x70 index 0x4C, preserving NMI bit)(
VOID
);
EFI_STATUS
EFIAPI
(0x70, (IoRead8 (0x70) & 0x80) | 0x4C);(
VOID
);
EFI_STATUS
EFIAPI
the filter level from CMOS(
VOID
);
EFI_STATUS
EFIAPI
(CmosDebugLevel > 3)(
VOID
);
EFI_STATUS
EFIAPI
if (CmosDebugLevel == 1)(
VOID
);
EFI_STATUS
EFIAPI
}(
VOID
);
EFI_STATUS
EFIAPI
infinite loop (no return)(
VOID
);
EFI_STATUS
EFIAPI
(TRUE);(
VOID
);
EFI_STATUS
EFIAPI
register via SMM CPU protocol(
VOID
);
EFI_STATUS
EFIAPI
= 0x40000002 (some CPU register write)(
VOID
);
EFI_STATUS
EFIAPI
= 0x0306000A(
VOID
);
EFI_STATUS
EFIAPI
((EFI_SMM_CPU_PROTOCOL *)gSmmCpuProtocol)->WriteRegister ((
VOID
);
EFI_STATUS
EFIAPI
alignment(
VOID
);
EFI_STATUS
EFIAPI
(((UINTN)Address & 1) != 0)(
VOID
);
EFI_STATUS
EFIAPI
microseconds into:(
VOID
);
EFI_STATUS
EFIAPI
= MicroSeconds >> 22;(
VOID
);
EFI_STATUS
EFIAPI
for the initial TSC + per-iteration ticks to pass(
VOID
);
EFI_STATUS
EFIAPI
{(
VOID
);
EFI_STATUS
EFIAPI
until TSC >= TargetTsc(
VOID
);
EFI_STATUS
EFIAPI
(((TargetTsc - (UINT32)__indword (1288)) & 0x800000) == 0)(
VOID
);
EFI_STATUS
EFIAPI
iteration uses full tick range(
VOID
);
EFI_STATUS
EFIAPI
(35);(
VOID
);
EFI_STATUS
EFIAPI
helper functions(
VOID
);
/// use Smst to free inside SMRAM,
EFI_STATUS
EFIAPI
if the address is within SMRAM(
VOID
);
EFI_STATUS
EFIAPI
BootServices to free outside.(
VOID
);
EFI_STATUS
EFIAPI
(IsAddressInSmram ((UINT64)Buffer))(
VOID
);
EFI_STATUS
EFIAPI
wrapper (sub_1B64 at 0x1B64)(
VOID
);
EFI_STATUS
EFIAPI
Register Access(
VOID
);
EFI_STATUS
EFIAPI
conversion (DecimalToBcd = sub_18F4 at 0x18F4(
VOID
);
EFI_STATUS
EFIAPI
= sub_1940 at 0x1940)(
VOID
);
EFI_STATUS
EFIAPI
(sub_1400 at 0x1400)(
VOID
);
EFI_STATUS
EFIAPI
Register D VRT bit(
VOID
);
EFI_STATUS
EFIAPI
= PcRtcReadReg (RTC_REGISTER_D);(
VOID
);
EFI_STATUS
EFIAPI
Register A UIP with timeout(
VOID
);
EFI_STATUS
EFIAPI
= 10001;(
VOID
);
EFI_STATUS
EFIAPI
Register A and check UIP(
VOID
);
EFI_STATUS
EFIAPI
= PcRtcReadReg (RTC_REGISTER_A);(
VOID
);
EFI_STATUS
EFIAPI
VRT again after the update completes(
VOID
);
EFI_STATUS
EFIAPI
table (used by IsDayValid at sub_1500)(
VOID
);
EFI_STATUS
EFIAPI
in each month (non-leap year February = 28, leap February = 29)(
VOID
);
EFI_STATUS
EFIAPI
as an array of 12 UINTN values for SIMD loading in sub_1500.(
VOID
);
EFI_STATUS
EFIAPI
= days for months 1-2(
VOID
);
EFI_STATUS
EFIAPI
= days for months 3-12 starting at 30(
VOID
);
EFI_STATUS
EFIAPI
CONST UINT8 mDaysInMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };(
VOID
);
EFI_STATUS
EFIAPI
// ============================================================================(
VOID
);
EFI_STATUS
EFIAPI
year: divisible by 4, and not (divisible by 100 unless divisible by 400)(
VOID
);
EFI_STATUS
EFIAPI
((Year & 3) != 0)(
VOID
);
EFI_STATUS
EFIAPI
(sub_1500 at 0x1500)(
VOID
);
EFI_STATUS
EFIAPI
up days in this month(
VOID
);
EFI_STATUS
EFIAPI
= mDaysInMonth[Time->Month - 1];(
VOID
);
EFI_STATUS
EFIAPI
special: check for leap year(
VOID
);
EFI_STATUS
EFIAPI
(Time->Month == 2)(
VOID
);
EFI_STATUS
EFIAPI
(sub_1478 at 0x1478)(
VOID
);
EFI_STATUS
EFIAPI
(sub_1260 at 0x1260)(
VOID
);
EFI_STATUS
EFIAPI
PM flag from Hour bit 7 and clear it(
VOID
);
EFI_STATUS
EFIAPI
= Time->Hour;(
VOID
);
EFI_STATUS
EFIAPI
BCD to decimal for all time fields(
VOID
);
EFI_STATUS
EFIAPI
for invalid BCD conversion (0xFF indicates failure)(
VOID
);
EFI_STATUS
EFIAPI
(Time->Year == 0xFF ||(
VOID
);
EFI_STATUS
EFIAPI
century byte from RTC CMOS(
VOID
);
EFI_STATUS
EFIAPI
(gRtcCenturyOffset != 0)(
VOID
);
EFI_STATUS
EFIAPI
from 12-hour to 24-hour format(
VOID
);
EFI_STATUS
EFIAPI
(!Is24Hour)(
VOID
);
EFI_STATUS
EFIAPI
(Time->Hour < 12)(
VOID
);
EFI_STATUS
EFIAPI
(Time->Hour == 12)(
VOID
);
EFI_STATUS
EFIAPI
nanosecond (time register reads don't provide nanoseconds)(
VOID
);
EFI_STATUS
EFIAPI
(sub_1640 at 0x1640)(
VOID
);
EFI_STATUS
EFIAPI
Hour from 24-hour to 12-hour(
VOID
);
EFI_STATUS
EFIAPI
(Time->Hour > 12)(
VOID
);
EFI_STATUS
EFIAPI
century: Year / 100(
VOID
);
EFI_STATUS
EFIAPI
= Time->Year;(
VOID
);
EFI_STATUS
EFIAPI
to BCD(
VOID
);
EFI_STATUS
EFIAPI
century byte to CMOS(
VOID
);
EFI_STATUS
EFIAPI
Second to BCD (return value)(
VOID
);
EFI_STATUS
EFIAPI
(!IsBinary)(
VOID
);
EFI_STATUS
EFIAPI
PM flag in Hour if in 12-hour mode and PM(
VOID
);
EFI_STATUS
EFIAPI
(!Is24Hour && RegisterB == 0)(
VOID
);
EFI_STATUS
EFIAPI
check if we need PM bit: the 12-hour conversion already set it.(
VOID
);
EFI_STATUS
EFIAPI
make sure it's persistent.(
VOID
);
EFI_STATUS
EFIAPI
(sub_16F8 at 0x16F8)(
VOID
);
EFI_STATUS
EFIAPI
equal, check minutes(
VOID
);
EFI_STATUS
EFIAPI
(Time1->Minute > Time2->Minute)(
VOID
);
EFI_STATUS
EFIAPI
equal, check seconds(
VOID
);
EFI_STATUS
EFIAPI
(Time1->Second > Time2->Second)(
VOID
);
EFI_STATUS
EFIAPI
(sub_1744 at 0x1744)(
VOID
);
EFI_STATUS
EFIAPI
Dec 31 -> Jan 1 cross-year(
VOID
);
EFI_STATUS
EFIAPI
((UINT16)From->Year + 1 != (UINT16)Target->Year ||(
VOID
);
EFI_STATUS
EFIAPI
month rollover: From->Month + 1 == Target->Month and Target->Day == 1(
VOID
);
EFI_STATUS
EFIAPI
(FromMonth + 1 == (UINTN)Target->Month && Target->Day == 1)(
VOID
);
EFI_STATUS
EFIAPI
(PcRtcIsLeapYear (From->Year))(
VOID
);
EFI_STATUS
EFIAPI
other months, check days-in-month(
VOID
);
EFI_STATUS
EFIAPI
= (From->Day == mDaysInMonth[FromMonth - 1]);(
VOID
);
/// check day rollover
EFI_STATUS
EFIAPI
year, same month(
VOID
);
EFI_STATUS
EFIAPI
(From->Day + 1 == Target->Day)(
VOID
);
/// alarm must be >= current time
EFI_STATUS
EFIAPI
day(
VOID
);
EFI_STATUS
EFIAPI
(From->Day == Target->Day && PcRtcTimeCompare (From, Target) <= 0)(
VOID
);
EFI_STATUS
EFIAPI
- SMM GetTime handler (sub_84C -> sub_C28 at 0xC28)(
VOID
);
EFI_STATUS
EFIAPI
Register B to determine format(
VOID
);
EFI_STATUS
EFIAPI
= PcRtcReadReg (RTC_REGISTER_B);(
VOID
);
EFI_STATUS
EFIAPI
all time registers(
VOID
);
EFI_STATUS
EFIAPI
TimeZone and Daylight from globals(
VOID
);
EFI_STATUS
EFIAPI
from register format (BCD->decimal, 12hr->24hr, add century)(
VOID
);
EFI_STATUS
EFIAPI
= PcRtcConvertFromRegisterFormat (Time, RegisterB);(
VOID
);
EFI_STATUS
EFIAPI
the converted time(
VOID
);
EFI_STATUS
EFIAPI
= PcRtcValidateTime (Time);(
VOID
);
EFI_STATUS
EFIAPI
capabilities(
VOID
);
EFI_STATUS
EFIAPI
(Capabilities != NULL)(
VOID
);
EFI_STATUS
EFIAPI
Hz(
VOID
);
EFI_STATUS
EFIAPI
thunk (sub_84C at 0x84C)(
VOID
);
EFI_STATUS
EFIAPI
- SMM SetTime handler (sub_854 -> sub_D20 at 0xD20)(
VOID
);
EFI_STATUS
EFIAPI
the time(
VOID
);
EFI_STATUS
EFIAPI
time for internal manipulation(
VOID
);
EFI_STATUS
EFIAPI
(&LocalTime, Time, sizeof (EFI_TIME));(
VOID
);
EFI_STATUS
EFIAPI
for update complete before writing(
VOID
);
EFI_STATUS
EFIAPI
= PcRtcWaitForUpdateComplete ();(
VOID
);
EFI_STATUS
EFIAPI
the "RTC" SMM variable to invalidate DXE-side cache(
VOID
);
EFI_STATUS
EFIAPI
(gSmmRuntimeRsc != NULL)(
VOID
);
EFI_STATUS
EFIAPI
RSC protocol has the SmmDeleteVariable at offset 88(
VOID
);
EFI_STATUS
EFIAPI
SET bit in Register B to freeze RTC updates(
VOID
);
EFI_STATUS
EFIAPI
century byte to CMOS (offset from Config or default 0x32)(
VOID
);
EFI_STATUS
EFIAPI
(Config != NULL && Config->CenturyRegister != 0)(
VOID
);
EFI_STATUS
EFIAPI
time to register format(
VOID
);
EFI_STATUS
EFIAPI
(&LocalTime, RegisterB);(
VOID
);
EFI_STATUS
EFIAPI
(RTC_SECONDS, LocalTime.Second);(
VOID
);
EFI_STATUS
EFIAPI
SET bit to resume RTC updates(
VOID
);
EFI_STATUS
EFIAPI
(RTC_REGISTER_B, RegisterB & ~RTC_B_SET);(
VOID
);
EFI_STATUS
EFIAPI
TimeZone and Daylight to config structure(
VOID
);
EFI_STATUS
EFIAPI
(Config != NULL)(
VOID
);
EFI_STATUS
EFIAPI
thunk (sub_854 at 0x854)(
VOID
);
EFI_STATUS
EFIAPI
- SMM GetWakeupTime handler (sub_870 -> sub_EC8 at 0xEC8)(
VOID
);
EFI_STATUS
EFIAPI
Register B and C for alarm status(
VOID
);
EFI_STATUS
EFIAPI
alarm registers (seconds, minutes, hours)(
VOID
);
EFI_STATUS
EFIAPI
date registers (day, month, year)(
VOID
);
EFI_STATUS
EFIAPI
Register D for century storage(
VOID
);
EFI_STATUS
EFIAPI
RegisterD;(
VOID
);
EFI_STATUS
EFIAPI
TimeZone/Daylight from config structure(
VOID
);
EFI_STATUS
EFIAPI
to read the "RTCALARM" SMM variable to get Year/Month(
VOID
);
EFI_STATUS
EFIAPI
= sizeof (EFI_TIME);(
VOID
);
EFI_STATUS
EFIAPI
Year/Month/Day from the stored alarm variable(
VOID
);
EFI_STATUS
EFIAPI
from register format(
VOID
);
EFI_STATUS
EFIAPI
thunk (sub_870 at 0x870)(
VOID
);
EFI_STATUS
EFIAPI
- SMM SetWakeupTime handler (sub_87C -> sub_1074 at 0x1074)(
VOID
);
EFI_STATUS
EFIAPI
current RTC time to validate proximity (alarm must be within 24 hours)(
VOID
);
EFI_STATUS
EFIAPI
= PcRtcGetTime (&CurrentTime, NULL);(
VOID
);
EFI_STATUS
EFIAPI
if alarm time is nearby (within 1 day)(
VOID
);
EFI_STATUS
EFIAPI
(!PcRtcIsTimeNearby (&CurrentTime, Time))(
VOID
);
EFI_STATUS
EFIAPI
alarm time(
VOID
);
EFI_STATUS
EFIAPI
(&AlarmTime, Time, sizeof (EFI_TIME));(
VOID
);
EFI_STATUS
EFIAPI
alarm to register format(
VOID
);
EFI_STATUS
EFIAPI
(&AlarmTime, RegisterB);(
VOID
);
EFI_STATUS
EFIAPI
current alarm register values (for restoring previous alarm)(
VOID
);
EFI_STATUS
EFIAPI
Register D century(
VOID
);
EFI_STATUS
EFIAPI
= PcRtcReadReg (RTC_REGISTER_D) & 0x3F;(
VOID
);
EFI_STATUS
EFIAPI
TimeZone/Daylight from globals(
VOID
);
EFI_STATUS
EFIAPI
"RTCALARM" SMM variable(
VOID
);
EFI_STATUS
EFIAPI
= ((SMM_RSC_HANDLER_PROTOCOL *)gSmmRuntimeRsc)->SmmSetVariable ((
VOID
);
EFI_STATUS
EFIAPI
Register B SET bit to freeze updates(
VOID
);
EFI_STATUS
EFIAPI
= RegisterB | RTC_B_SET;(
VOID
);
EFI_STATUS
EFIAPI
alarm registers(
VOID
);
EFI_STATUS
EFIAPI
(RTC_SECONDS_ALARM, AlarmTime.Second);(
VOID
);
EFI_STATUS
EFIAPI
and update Register D with the alarm day/century(
VOID
);
EFI_STATUS
EFIAPI
(RTC_REGISTER_C); // Clear pending AF(
VOID
);
EFI_STATUS
EFIAPI
(RTC_REGISTER_D, AlarmTime.Day & 0x3F);(
VOID
);
EFI_STATUS
EFIAPI
pending interrupt by reading Register C(
VOID
);
EFI_STATUS
EFIAPI
(RTC_REGISTER_C);(
VOID
);
EFI_STATUS
EFIAPI
existing alarm values and keep them (only clear AIE)(
VOID
);
EFI_STATUS
EFIAPI
date(
VOID
);
EFI_STATUS
EFIAPI
alarm registers (redundant for Enabled, restores current for not)(
VOID
);
EFI_STATUS
EFIAPI
(!Enabled)(
VOID
);
EFI_STATUS
EFIAPI
read(
VOID
);
EFI_STATUS
EFIAPI
Month/Year(
VOID
);
EFI_STATUS
EFIAPI
(RTC_MONTH, AlarmTime.Month);(
VOID
);
EFI_STATUS
EFIAPI
AIE bit: set if enabled, clear if not(
VOID
);
EFI_STATUS
EFIAPI
(Enabled)(
VOID
);
EFI_STATUS
EFIAPI
final Register B value (clear SET, optionally set AIE)(
VOID
);
EFI_STATUS
EFIAPI
(RTC_REGISTER_B, RegisterBNew & 0x7F);(
VOID
);
EFI_STATUS
EFIAPI
thunk (sub_87C at 0x87C)(
VOID
);
EFI_STATUS
EFIAPI
- RTC chip initialization (sub_984 at 0x984)(
VOID
);
EFI_STATUS
EFIAPI
1: Initialize RTC hardware registers(
VOID
);
EFI_STATUS
EFIAPI
(RTC_REGISTER_A, 0x26); // 32768 Hz, divider reset(
VOID
);
EFI_STATUS
EFIAPI
pending interrupt(
VOID
);
EFI_STATUS
EFIAPI
VRT (will be set by hardware)(
VOID
);
EFI_STATUS
EFIAPI
for UIP to clear(
VOID
);
EFI_STATUS
EFIAPI
2: Read the current RTC time from hardware(
VOID
);
EFI_STATUS
EFIAPI
3: Configure Register B(
VOID
);
EFI_STATUS
EFIAPI
bits: AIE (5), DM (2) = 0x24(
VOID
);
EFI_STATUS
EFIAPI
= (RegisterB & 0x24) | 0x02;(
VOID
);
EFI_STATUS
EFIAPI
4: Try to read the "RTC" SMM variable for TimeZone(
VOID
);
EFI_STATUS
EFIAPI
= sizeof (UINT64);(
VOID
);
EFI_STATUS
EFIAPI
5: Try to convert and validate the current time(
VOID
);
EFI_STATUS
EFIAPI
= PcRtcConvertFromRegisterFormat (&CurrentTime, RegisterBNew);(
VOID
);
/// reset to factory defaults
EFI_STATUS
EFIAPI
invalid(
VOID
);
EFI_STATUS
EFIAPI
reset via SMM CPU protocol write(
VOID
);
EFI_STATUS
EFIAPI
();(
VOID
);
EFI_STATUS
EFIAPI
SET (bit 7) is clear, AIE (bit 5) is set, 24HR (bit 1) is set(
VOID
);
EFI_STATUS
EFIAPI
(RTC_REGISTER_B, RegisterBNew & 0xDF | 0x02);(
VOID
);
EFI_STATUS
EFIAPI
6: Write back the SMM variable with the current time + config(
VOID
);
EFI_STATUS
EFIAPI
= PcRtcSetTime (&CurrentTime, &gRtcConfig);(
VOID
);
EFI_STATUS
EFIAPI
7: Get wakeup alarm time(
VOID
);
EFI_STATUS
EFIAPI
= PcRtcGetWakeupTime (&AlarmEnabled, &AlarmPending, &AlarmTime, &gRtcConfig);(
VOID
);
EFI_STATUS
EFIAPI
8: If no alarm pending, set default alarm (2000-01-01, clear AIE)(
VOID
);
EFI_STATUS
EFIAPI
(!AlarmEnabled && EFI_ERROR (Status))(
VOID
);
EFI_STATUS
EFIAPI
the current config timezone/daylight(
VOID
);
EFI_STATUS
EFIAPI
= gRtcConfig.TimeZone;(
VOID
);
EFI_STATUS
EFIAPI
default alarm time: 2000-01-01 00:00:00(
VOID
);
EFI_STATUS
EFIAPI
to register format(
VOID
);
EFI_STATUS
EFIAPI
(&CurrentTime, RegisterB);(
VOID
);
EFI_STATUS
EFIAPI
the "RTCALARM" variable(
VOID
);
EFI_STATUS
EFIAPI
Register B SET bit, write alarm registers, clear SET bit(
VOID
);
EFI_STATUS
EFIAPI
(RTC_REGISTER_B, RegisterB | RTC_B_SET);(
VOID
);
EFI_STATUS
EFIAPI
- Protocol registration (sub_884 at 0x884)(
VOID
);
EFI_STATUS
EFIAPI
the protocol database for gEfiSmmRscHandlerGuid(
VOID
);
EFI_STATUS
EFIAPI
= Smst->NumberOfProtocols;(
VOID
);
EFI_STATUS
EFIAPI
protocol entry from Smst->ProtocolRegistry(
VOID
);
EFI_STATUS
EFIAPI
entry is 24 bytes:(
VOID
);
EFI_STATUS
EFIAPI
*EntryGuid = (EFI_GUID *)(*(UINT64 *)(Smst + 160) + (Index * 24));(
VOID
);
EFI_STATUS
EFIAPI
not find SMM Runtime Services Protocol(
VOID
);
EFI_STATUS
EFIAPI
(4, "Couldn't find SMM Runtime Services\n");(
VOID
);
EFI_STATUS
EFIAPI
RTC hardware(
VOID
);
EFI_STATUS
EFIAPI
= PcRtcInitRtcHardware (gSmmRuntimeRsc);(
VOID
);
EFI_STATUS
EFIAPI
the four RTC handlers in the RSC protocol(
VOID
);
EFI_STATUS
EFIAPI
- Full driver entry (sub_560 at 0x560)(
VOID
);
EFI_STATUS
EFIAPI
1: Save EFI table pointers to globals(
VOID
);
EFI_STATUS
EFIAPI
= ImageHandle;(
VOID
);
EFI_STATUS
EFIAPI
2: Locate SMM Base2 protocol(
VOID
);
EFI_STATUS
EFIAPI
= NULL;(
VOID
);
EFI_STATUS
EFIAPI
3: Get Smst location(
VOID
);
EFI_STATUS
EFIAPI
4: Locate SMM Access2 protocol(
VOID
);
EFI_STATUS
EFIAPI
= 0;(
VOID
);
EFI_STATUS
EFIAPI
5: Get SMRAM capabilities (query size first)(
VOID
);
EFI_STATUS
EFIAPI
6: Allocate buffer for SMRAM ranges(
VOID
);
EFI_STATUS
EFIAPI
= AllocateSmramPool (EfiRuntimeServicesData, SmramRangeBufferSize);(
VOID
);
EFI_STATUS
EFIAPI
7: Re-read SMRAM ranges into the allocated buffer(
VOID
);
EFI_STATUS
EFIAPI
= ((EFI_SMM_ACCESS2_PROTOCOL *)(UINTN)CpuIo2Handle)->GetCapabilities ((
VOID
);
EFI_STATUS
EFIAPI
8: Calculate SMRAM range count (each range is 32 bytes = 5 qwords >> 5)(
VOID
);
EFI_STATUS
EFIAPI
= SmramRangeBufferSize >> 5;(
VOID
);
EFI_STATUS
EFIAPI
9: Get PCD protocol and read platform type(
VOID
);
EFI_STATUS
EFIAPI
= ((PCD_PROTOCOL *)GetPcdProtocol ())->Get32 (5);(
VOID
);
EFI_STATUS
EFIAPI
10: Initialize HOB list(
VOID
);
EFI_STATUS
EFIAPI
11: Check PCIe config address for Express presence(
VOID
);
EFI_STATUS
EFIAPI
((INT8)(*(UINT8 *)PciExpressReadAddress (1024068)) >= 0)(
VOID
);
EFI_STATUS
EFIAPI
0x500 to the word at PCIe config address 0x100100 (1024064)(
VOID
);
EFI_STATUS
EFIAPI
((UINT16 *)PciExpressReadAddress (1024064));(
VOID
);
/// enable memory space
EFI_STATUS
EFIAPI
bit 7 on the byte at 0x100104 (1024068)(
VOID
);
EFI_STATUS
EFIAPI
12: TSC-based short delay (approx 357 TSC cycles)(
VOID
);
EFI_STATUS
EFIAPI
= GetCallerEflags ();(
VOID
);
EFI_STATUS
EFIAPI
initial TSC(
VOID
);
EFI_STATUS
EFIAPI
= ReadMmio32 (1288) & 0xFFFFFF;(
VOID
);
EFI_STATUS
EFIAPI
target TSC: initial + 357 cycles(
VOID
);
EFI_STATUS
EFIAPI
= ReadTsc ();(
VOID
);
EFI_STATUS
EFIAPI
previous interrupt state(
VOID
);
EFI_STATUS
EFIAPI
(InterruptsEnabled)(
VOID
);
EFI_STATUS
EFIAPI
(sub_480 at 0x480 -> sub_560 at 0x560)(
VOID
);
EFI_STATUS
EFIAPI
(0x4B4)(
VOID
);
EFI_STATUS
EFIAPI
the driver(
VOID
);
EFI_STATUS
EFIAPI
(ImageHandle, SystemTable);(
VOID
);
EFI_STATUS
EFIAPI
for error recovery(
VOID
);
EFI_STATUS
EFIAPI
(SetJump (&gJumpBuffer) == 0)(
VOID
);
EFI_STATUS
EFIAPI
execution: initialize RTC and register handlers(
VOID
);
EFI_STATUS
EFIAPI
= PcRtcInitialize (gSmst);(
VOID
);
EFI_STATUS
EFIAPI
the jump buffer and prepare for re-initialization(
VOID
);
EFI_STATUS
EFIAPI
(&gJumpBuffer);(
VOID
);
EFI_STATUS
EFIAPI
ASSERTs are reached only via AutoGen.c recovery:(
VOID
);
EFI_STATUS
EFIAPI
((
VOID
);
EFI_STATUS
EFIAPI
path: free SMRAM pool(
VOID
);
EFI_STATUS
EFIAPI
(gSmramRanges);(
VOID
);
EFI_STATUS
EFIAPI
- backward compatibility entry (forwarded from entry point)(
VOID
);
EFI_STATUS
EFIAPI
the SMM system table(
VOID
);
EFI_STATUS
EFIAPI
= Smst;(
VOID
);
EFI_STATUS
EFIAPI
remaining init happens in _ModuleEntryPoint via PcRtcSmmDriverInit(
VOID
);
EFI_STATUS
EFIAPI
PcRtcInitialize.(
VOID
);
EFI_STATUS
EFIAPI
EFI_SUCCESS;(
VOID
);
EFI_STATUS
EFIAPI
function is a no-op in the reconstructed driver; the original(
VOID
);
EFI_STATUS
EFIAPI
allocated and populated the configuration table via(
VOID
);
#endif /* __PCRTCSMM_H__ */