/** @file
TxtDxe.h -- Header for TxtDxe
Copyright (c) HR650X BIOS Decompilation Project
**/
#ifndef __TXTDXE_H__
#define __TXTDXE_H__
#include "../uefi_headers/Uefi.h"
//
// Function Prototypes
//
EFI_STATUS
EFIAPI
TxtDxeLaunchBiosAcm(
VOID
);
EFI_STATUS
EFIAPI
DebugPrint(
VOID
);
EFI_STATUS
EFIAPI
AssertBreak(
VOID
);
EFI_STATUS
EFIAPI
GetPlatformConfigVariable(
VOID
);
EFI_STATUS
EFIAPI
SetPlatformConfigVariable(
VOID
);
EFI_STATUS
EFIAPI
IsLtProcessor(
VOID
);
EFI_STATUS
EFIAPI
IsBiosAcmSuccessful(
VOID
);
EFI_STATUS
EFIAPI
IsTxtEnabled(
VOID
);
EFI_STATUS
EFIAPI
LocateTxtDeviceMemoryPolicy(
VOID
);
EFI_STATUS
EFIAPI
LocateTxtPlatformPolicy(
VOID
);
EFI_STATUS
EFIAPI
GetMpTableApicIds(
VOID
);
EFI_STATUS
EFIAPI
ConfigureMachineCheckBanks(
VOID
);
EFI_STATUS
EFIAPI
GetLtDxeLibSetupOption(
VOID
);
EFI_STATUS
EFIAPI
GetAcmErrorType(
VOID
);
EFI_STATUS
EFIAPI
HandleAcmError(
VOID
);
EFI_STATUS
EFIAPI
ClearLtTpmCmosState(
VOID
);
EFI_STATUS
EFIAPI
ApplyTxtPolicyToPlatformConfig(
VOID
);
EFI_STATUS
EFIAPI
RegisterForScheckLockConfigCallback(
VOID
);
EFI_STATUS
EFIAPI
CloseS3BootScriptResources(
VOID
);
EFI_STATUS
EFIAPI
InstallTxtDxeProtocol(
VOID
);
EFI_STATUS
EFIAPI
PlatformLaunchBiosAcm(
VOID
);
EFI_STATUS
EFIAPI
InitializeLtDxeLib(
VOID
);
EFI_STATUS
EFIAPI
DriverInit(
VOID
);
EFI_STATUS
EFIAPI
TxtDxeMain(
VOID
);
EFI_STATUS
EFIAPI
TxtDxeCleanup(
VOID
);
EFI_STATUS
EFIAPI
TxtDxeUnload(
VOID
);
EFI_STATUS
EFIAPI
_ModuleEntryPoint(
VOID
);
EFI_STATUS
EFIAPI
Variables(
VOID
);
/// populated by DriverInit (sub_47C)
EFI_STATUS
EFIAPI
core handles(
VOID
);
EFI_STATUS
EFIAPI
gImageHandle = NULL;(
VOID
);
EFI_STATUS
EFIAPI
PCI User Access (DxeMmPciBaseLib)(
VOID
);
EFI_STATUS
EFIAPI
and database pointers(
VOID
);
EFI_STATUS
EFIAPI
*mPcdProtocol = NULL; // PCD Protocol(
VOID
);
EFI_STATUS
EFIAPI
list (DxeHobLib)(
VOID
);
EFI_STATUS
EFIAPI
print protocol (gEfiDebugPortProtocolGuid)(
VOID
);
EFI_STATUS
EFIAPI
Communication protocol(
VOID
);
EFI_STATUS
EFIAPI
Base2 protocol(
VOID
);
EFI_STATUS
EFIAPI
LockBox protocol(
VOID
);
EFI_STATUS
EFIAPI
SMM Communication protocol(
VOID
);
/// populated from platform HOBs
EFI_STATUS
EFIAPI
policy data pointers(
VOID
);
EFI_STATUS
EFIAPI
*mTxtDeviceMemoryPolicy = NULL; // gEfiPlatformTxtDeviceMemoryGuid(
VOID
);
EFI_STATUS
EFIAPI
//(
VOID
);
EFI_STATUS
EFIAPI
/ wake-up state(
VOID
);
EFI_STATUS
EFIAPI
mApCount = 0; // Number of enabled APs (from MP services)(
VOID
);
EFI_STATUS
EFIAPI
vector for AP wake-up(
VOID
);
EFI_STATUS
EFIAPI
ID table populated from MP services(
VOID
);
EFI_STATUS
EFIAPI
state tracking(
VOID
);
EFI_STATUS
EFIAPI
mBiosAcmCalled = FALSE;(
VOID
);
EFI_STATUS
EFIAPI
DXE Protocol instance(
VOID
);
EFI_STATUS
EFIAPI
gTxtDxeProtocol;(
VOID
);
EFI_STATUS
EFIAPI
declarations of local functions(
VOID
);
EFI_STATUS
EFIAPI
EFIAPI(
VOID
);
EFI_STATUS
EFIAPI
helper prototypes that are linked from other compilation units:(
VOID
);
EFI_STATUS
EFIAPI
Print and Assert Helpers(
VOID
);
EFI_STATUS
EFIAPI
TPL to avoid re-entrancy during protocol lookup(
VOID
);
EFI_STATUS
EFIAPI
= gBootServices->RaiseTPL (TPL_NOTIFY);(
VOID
);
EFI_STATUS
EFIAPI
CMOS byte 0x4B for the platform debug level.(
VOID
);
EFI_STATUS
EFIAPI
debug level indicates this message should be printed, do so.(
VOID
);
EFI_STATUS
EFIAPI
DebugLevel;(
VOID
);
EFI_STATUS
EFIAPI
if this error level should be displayed(
VOID
);
EFI_STATUS
EFIAPI
= 0;(
VOID
);
EFI_STATUS
EFIAPI
}(
VOID
);
EFI_STATUS
EFIAPI
Library Protocol Locators(
VOID
);
EFI_STATUS
EFIAPI
wrapper(
VOID
);
EFI_STATUS
EFIAPI
that the copy range does not overflow UINTN(
VOID
);
EFI_STATUS
EFIAPI
((Length - 1) > (UINTN)(-1) - (UINTN)Destination) {(
VOID
);
EFI_STATUS
EFIAPI
Configuration / UEFI Variable Helpers(
VOID
);
EFI_STATUS
EFIAPI
(LaGrande Technology / TXT) Feature Checks(
VOID
);
EFI_STATUS
EFIAPI
feature MSR(
VOID
);
EFI_STATUS
EFIAPI
TXT Policy HOB Access(
VOID
);
EFI_STATUS
EFIAPI
HOB data starts after the GUID extension header(
VOID
);
EFI_STATUS
EFIAPI
= (TXT_DEVICE_MEMORY_POLICY *)((UINT8 *)Hob + sizeof (EFI_HOB_GUID_TYPE));(
VOID
);
EFI_STATUS
EFIAPI
Wake-up Vector and APIC Setup(
VOID
);
EFI_STATUS
EFIAPI
for the MP floating pointer structure in the BIOS ROM area(
VOID
);
EFI_STATUS
EFIAPI
table not found; fall back to allocating a wake-up buffer(
VOID
);
EFI_STATUS
EFIAPI
a fixed address.(
VOID
);
EFI_STATUS
EFIAPI
MP table found; allocate a 0xFFFFF-sized page-aligned buffer(
VOID
);
EFI_STATUS
EFIAPI
the wake-up vector.(
VOID
);
EFI_STATUS
EFIAPI
WakeUpBuffer;(
VOID
);
EFI_STATUS
EFIAPI
table found; configure the wake-up vector from the MP config table(
VOID
);
EFI_STATUS
EFIAPI
*MpServices;(
VOID
);
EFI_STATUS
EFIAPI
MP services to get APIC IDs(
VOID
);
EFI_STATUS
EFIAPI
up the wake-up buffer: write the magic value.(
VOID
);
EFI_STATUS
EFIAPI
WakeUpBuffer address is stored in mApWakeUpVector.(
VOID
);
EFI_STATUS
EFIAPI
*WakeUpBuffer;(
VOID
);
EFI_STATUS
EFIAPI
number for SIPI(
VOID
);
EFI_STATUS
EFIAPI
Launch Support(
VOID
);
EFI_STATUS
EFIAPI
original MC9-MC11 control values and mask out bit 7 (EN)(
VOID
);
EFI_STATUS
EFIAPI
= (UINT32)AsmReadMsr64 (MSR_IA32_MC9_CTL);(
VOID
);
EFI_STATUS
EFIAPI
save IA32_MCG_CONTAIN if MCG_CMCP (bit 24) is set(
VOID
);
EFI_STATUS
EFIAPI
((AsmReadMsr64 (MSR_IA32_MCG_CAP) & 0x1000000) != 0) {(
VOID
);
EFI_STATUS
EFIAPI
new values with EN bit cleared(
VOID
);
EFI_STATUS
EFIAPI
(DEBUG_INFO, "Ia32_Mc9_Ctl_New = 0x%08x\n", Mc9CtlOrig & ~0x80);(
VOID
);
EFI_STATUS
EFIAPI
(DEBUG_INFO, "Write Ia32_Mc9_Ctl_Org = 0x%08x\n", Mc9CtlOrig);(
VOID
);
EFI_STATUS
EFIAPI
IA32_MCG_CONTAIN if saved(
VOID
);
EFI_STATUS
EFIAPI
(McgContainValid) {(
VOID
);
EFI_STATUS
EFIAPI
1: Disable MC9-MC11 machine check banks(
VOID
);
EFI_STATUS
EFIAPI
(1);(
VOID
);
EFI_STATUS
EFIAPI
2: If APs exist, send SIPI to start them (required for SINIT)(
VOID
);
EFI_STATUS
EFIAPI
(mApCount > 0) {(
VOID
);
EFI_STATUS
EFIAPI
INIT IPI to all (including self)(
VOID
);
EFI_STATUS
EFIAPI
();(
VOID
);
EFI_STATUS
EFIAPI
3: Debug log and raise TPL(
VOID
);
EFI_STATUS
EFIAPI
(DEBUG_INFO, "LtDxeLibLaunchBiosAcm: BiosAcmAddress = 0x%08x\n", BiosAcmAddress);(
VOID
);
EFI_STATUS
EFIAPI
4: Call the platform-specific BIOS ACM launch routine.(
VOID
);
EFI_STATUS
EFIAPI
is a raw assembly routine (sub_4700) that:(
VOID
);
EFI_STATUS
EFIAPI
ACM then executes in a special environment and returns(
VOID
);
EFI_STATUS
EFIAPI
via the LT.SPAD.HIGH register.(
VOID
);
EFI_STATUS
EFIAPI
(DEBUG_INFO, "LtDxeLibLaunchBiosAcm: Calling LaunchBiosAcm()\n");(
VOID
);
EFI_STATUS
EFIAPI
5: Restore TPL and machine check banks(
VOID
);
EFI_STATUS
EFIAPI
(DEBUG_INFO, "LtDxeLibLaunchBiosAcm: Restoring TPL\n");(
VOID
);
EFI_STATUS
EFIAPI
6: Send SIPI to wake APs after ACM(
VOID
);
EFI_STATUS
EFIAPI
MC banks to original state(
VOID
);
EFI_STATUS
EFIAPI
(0);(
VOID
);
EFI_STATUS
EFIAPI
Error Handling(
VOID
);
EFI_STATUS
EFIAPI
lib enable/disable option(
VOID
);
EFI_STATUS
EFIAPI
error handling type(
VOID
);
EFI_STATUS
EFIAPI
if LtDxeLib functions are installed(
VOID
);
EFI_STATUS
EFIAPI
(!GetLtDxeLibSetupOption (&LtDxeLibInstalled) && LtDxeLibInstalled) {(
VOID
);
/// just log
EFI_STATUS
EFIAPI
setup is configured to ignore ACM errors(
VOID
);
EFI_STATUS
EFIAPI
(GetAcmErrorType (&AcmType)) {(
VOID
);
EFI_STATUS
EFIAPI
failure is fatal: clear LT/TPM state and reset(
VOID
);
EFI_STATUS
EFIAPI
(DEBUG_ERROR, "Bios Acm Failed. Reboot in non-ltsx mode\n");(
VOID
);
EFI_STATUS
EFIAPI
a system reset via runtime services(
VOID
);
EFI_STATUS
EFIAPI
"AcmError" variable to record the failure(
VOID
);
EFI_STATUS
EFIAPI
= 1;(
VOID
);
EFI_STATUS
EFIAPI
LT enable bits in SocketProcessorCoreConfig(
VOID
);
EFI_STATUS
EFIAPI
= sizeof (Buffer);(
VOID
);
EFI_STATUS
EFIAPI
storage size(
VOID
);
EFI_STATUS
EFIAPI
LT/TPM enable field(
VOID
);
EFI_STATUS
EFIAPI
related field(
VOID
);
EFI_STATUS
EFIAPI
policy byte in platform config(
VOID
);
EFI_STATUS
EFIAPI
/ S3 Boot Script Support(
VOID
);
EFI_STATUS
EFIAPI
a SMM communication command for Scheck/LockConfig registration(
VOID
);
EFI_STATUS
EFIAPI
(DEBUG_INFO, "Register for Scheck/LockConfig Callback\n");(
VOID
);
EFI_STATUS
EFIAPI
Boot Script Save(
VOID
);
EFI_STATUS
EFIAPI
Boot Script Table Write if opened(
VOID
);
EFI_STATUS
EFIAPI
(mSmmCommunicationProtocol != NULL) {(
VOID
);
EFI_STATUS
EFIAPI
(mSmmBase2Protocol != NULL) {(
VOID
);
EFI_STATUS
EFIAPI
SMM; close SMM communication protocol(
VOID
);
EFI_STATUS
EFIAPI
(((EFI_SMM_BASE2_PROTOCOL *)mSmmBase2Protocol)->Communicate ((
VOID
);
EFI_STATUS
EFIAPI
SMM ready-to-lock flag and close SMM Base2(
VOID
);
EFI_STATUS
EFIAPI
(mSmmReadyToLockEvent != NULL) {(
VOID
);
EFI_STATUS
EFIAPI
DXE Protocol Installation(
VOID
);
EFI_STATUS
EFIAPI
if protocol is already installed(
VOID
);
EFI_STATUS
EFIAPI
= gBootServices->LocateProtocol ((
VOID
);
EFI_STATUS
EFIAPI
up the protocol instance(
VOID
);
EFI_STATUS
EFIAPI
the protocol(
VOID
);
EFI_STATUS
EFIAPI
= gBootServices->InstallProtocolInterface ((
VOID
);
EFI_STATUS
EFIAPI
the protocol was installed correctly by locating it again(
VOID
);
EFI_STATUS
EFIAPI
= NULL;(
VOID
);
/// sub_4700
EFI_STATUS
EFIAPI
ACM Launch (Assembly Wrapper)(
VOID
);
EFI_STATUS
EFIAPI
function is implemented in assembly (sub_4700). The equivalent C(
VOID
);
EFI_STATUS
EFIAPI
is documented here for reference:(
VOID
);
EFI_STATUS
EFIAPI
GdtBackup[2]; // GDT limit + base(
VOID
);
EFI_STATUS
EFIAPI
IdtBackup[2]; // IDT limit + base(
VOID
);
EFI_STATUS
EFIAPI
Cr0, Cr3, Cr4;(
VOID
);
EFI_STATUS
EFIAPI
(Flags != 0) {(
VOID
);
EFI_STATUS
EFIAPI
(&GdtBackup);(
VOID
);
EFI_STATUS
EFIAPI
(&IdtBackup);(
VOID
);
EFI_STATUS
EFIAPI
MCG_CAP MTRR state(
VOID
);
EFI_STATUS
EFIAPI
= AsmReadCr4 ();(
VOID
);
EFI_STATUS
EFIAPI
(Cr4 | 0x4208); // Enable MCE, OSFXSR, OSXMMEXCPT(
VOID
);
EFI_STATUS
EFIAPI
= AsmReadCr0 ();(
VOID
);
EFI_STATUS
EFIAPI
((Cr0 & 0x9FFFFFDF) | 0x40000020); // Set EM, MP; clear NE, TS, EM?(
VOID
);
EFI_STATUS
EFIAPI
(Flags != 0) Wbinvd ();(
VOID
);
EFI_STATUS
EFIAPI
Invd ();(
VOID
);
EFI_STATUS
EFIAPI
(0x2FF, 0); // Disable MTRRs(
VOID
);
EFI_STATUS
EFIAPI
all MTRR pairs(
VOID
);
EFI_STATUS
EFIAPI
(Index = 0; Index < N; Index++) {(
VOID
);
EFI_STATUS
EFIAPI
(0x200 + Index*2, 0); // MTRR_PHYSBASE(
VOID
);
EFI_STATUS
EFIAPI
(0x200 + Index*2 + 1, 0); // MTRR_PHYSMASK(
VOID
);
EFI_STATUS
EFIAPI
up MTRRs for ACM memory range(
VOID
);
EFI_STATUS
EFIAPI
(Remaining = AcmSize; Remaining > 0; ) {(
VOID
);
EFI_STATUS
EFIAPI
largest power-of-two aligned region(
VOID
);
EFI_STATUS
EFIAPI
= MtrrIndex++;(
VOID
);
EFI_STATUS
EFIAPI
(0x200 + Reg*2, AcmBase | 6); // WB(
VOID
);
EFI_STATUS
EFIAPI
(0x200 + Reg*2 + 1, ~(Size-1) | 0xF00000800);(
VOID
);
EFI_STATUS
EFIAPI
+= Size;(
VOID
);
EFI_STATUS
EFIAPI
-= Size;(
VOID
);
EFI_STATUS
EFIAPI
(0x2FF, 0x800); // Enable MTRRs(
VOID
);
EFI_STATUS
EFIAPI
(0x17B, 0); // Clear MCG_CTL(
VOID
);
EFI_STATUS
EFIAPI
all machine check banks(
VOID
);
EFI_STATUS
EFIAPI
(Bank = 0; Bank < McgBankCount; Bank++) {(
VOID
);
EFI_STATUS
EFIAPI
(0x400 + Bank*4 + 1, 0); // MCi_STATUS(
VOID
);
EFI_STATUS
EFIAPI
return to ACM entry point(
VOID
);
EFI_STATUS
EFIAPI
(BiosAcmAddress, 0x08); // Code segment selector(
VOID
);
EFI_STATUS
EFIAPI
-- sub_DD0(
VOID
);
EFI_STATUS
EFIAPI
ImageHandle and SystemTable globally (also set in DriverInit)(
VOID
);
EFI_STATUS
EFIAPI
= ImageHandle;(
VOID
);
EFI_STATUS
EFIAPI
access to CMOS: clear NMI disable bit on port 0x70(
VOID
);
EFI_STATUS
EFIAPI
(0x70, IoRead8 (0x530) & 0xBF);(
VOID
);
EFI_STATUS
EFIAPI
the SMM Communication protocol for S3 boot script support(
VOID
);
EFI_STATUS
EFIAPI
the MP Services protocol for AP management(
VOID
);
EFI_STATUS
EFIAPI
if TXT is supported on this platform via PCD(
VOID
);
EFI_STATUS
EFIAPI
TXT device memory policy from HOB(
VOID
);
EFI_STATUS
EFIAPI
= LocateTxtDeviceMemoryPolicy ();(
VOID
);
EFI_STATUS
EFIAPI
TXT platform policy from HOB(
VOID
);
EFI_STATUS
EFIAPI
= LocateTxtPlatformPolicy ();(
VOID
);
EFI_STATUS
EFIAPI
that the BIOS ACM address is configured(
VOID
);
EFI_STATUS
EFIAPI
(mTxtPlatformPolicy->BiosAcmAddress == 0) {(
VOID
);
EFI_STATUS
EFIAPI
MP services info: number of processors(
VOID
);
EFI_STATUS
EFIAPI
= MpServices->GetNumberOfProcessors (MpServices, &mApCount, NULL);(
VOID
);
EFI_STATUS
EFIAPI
includes the BSP; subtract 1 to get AP count(
VOID
);
EFI_STATUS
EFIAPI
there are APs, get their APIC IDs and set up the wake-up vector(
VOID
);
EFI_STATUS
EFIAPI
each AP for its APIC ID via GetProcessorInfo(
VOID
);
EFI_STATUS
EFIAPI
= GetMpTableApicIds (&mApCount, ApicIds);(
VOID
);
EFI_STATUS
EFIAPI
and log each APIC ID(
VOID
);
EFI_STATUS
EFIAPI
(Index = 0; Index < mApCount; Index++) {(
VOID
);
EFI_STATUS
EFIAPI
Point and Driver Init(
VOID
);
EFI_STATUS
EFIAPI
protocol pointers(
VOID
);
EFI_STATUS
EFIAPI
the DXE Services Table via the protocol database(
VOID
);
EFI_STATUS
EFIAPI
= SystemTable->BootServices->LocateProtocol ((
VOID
);
EFI_STATUS
EFIAPI
the MM PCI User Access protocol (DxeMmPciBaseLib)(
VOID
);
EFI_STATUS
EFIAPI
(mPciUsra == NULL) {(
VOID
);
EFI_STATUS
EFIAPI
HOB list(
VOID
);
EFI_STATUS
EFIAPI
PCD protocol and enable MTRR for SINIT if not already enabled(
VOID
);
EFI_STATUS
EFIAPI
if LT (TXT) is supported on this CPU(
VOID
);
EFI_STATUS
EFIAPI
= IsLtProcessor ();(
VOID
);
EFI_STATUS
EFIAPI
loop: read/write timer counter to wait for hardware stabilization(
VOID
);
EFI_STATUS
EFIAPI
= IoRead8 (0x70) & 0x80 | 0x4B; // CMOS offset 0x4B, NMI preserved(
VOID
);
EFI_STATUS
EFIAPI
value(
VOID
);
EFI_STATUS
EFIAPI
until delta >= 357(
VOID
);
EFI_STATUS
EFIAPI
LT configuration if it was modified during the delay(
VOID
);
EFI_STATUS
EFIAPI
(LtEnabled) {(
VOID
);
EFI_STATUS
EFIAPI
initialization step (AutoGen.c line 495)(
VOID
);
EFI_STATUS
EFIAPI
= FinalInitStep ();(
VOID
);
/// original sub_AA8
EFI_STATUS
EFIAPI
Driver Entry Dispatch(
VOID
);
EFI_STATUS
EFIAPI
1: Register for Scheck/LockConfig callback (SMM)(
VOID
);
EFI_STATUS
EFIAPI
2: Initialize the TXT DXE library (HOBs, protocols, APIC table)(
VOID
);
EFI_STATUS
EFIAPI
= InitializeLtDxeLib (ImageHandle, SystemTable);(
VOID
);
EFI_STATUS
EFIAPI
3: Apply TXT policy from HOB to platform configuration(
VOID
);
EFI_STATUS
EFIAPI
15 of the HOB data(
VOID
);
EFI_STATUS
EFIAPI
4: Check if this is an LT-enabled processor(
VOID
);
/// proceed with ACM launch
EFI_STATUS
EFIAPI
5: LT-enabled processor(
VOID
);
EFI_STATUS
EFIAPI
(!IsTxtEnabled ()) {(
VOID
);
EFI_STATUS
EFIAPI
not enabled, fall through to non-TXT path(
VOID
);
EFI_STATUS
EFIAPI
= EFI_UNSUPPORTED;(
VOID
);
/// check ACM result
EFI_STATUS
EFIAPI
is enabled(
VOID
);
EFI_STATUS
EFIAPI
(DEBUG_INFO, "LT_SPAD_HIGH (0xFED300A4): %r\n"(
VOID
);
/// install protocol
EFI_STATUS
EFIAPI
completed successfully (or no error)(
VOID
);
EFI_STATUS
EFIAPI
(DEBUG_ERROR, "Install TXT_DXE_PROTOCOL...\n");(
VOID
);
/// handle according to BIOS setup policy
EFI_STATUS
EFIAPI
failed(
VOID
);
EFI_STATUS
EFIAPI
(*(UINT32 *)TXT_SPAD_HIGH_REG);(
VOID
);
EFI_STATUS
EFIAPI
we get here, LT is not enabled or ACM failed(
VOID
);
EFI_STATUS
EFIAPI
(DEBUG_ERROR, "Lt not enabled\n");(
VOID
);
EFI_STATUS
EFIAPI
to close S3 boot script resources for a clean state(
VOID
);
/// close S3 boot script resources
EFI_STATUS
EFIAPI
not resetting(
VOID
);
EFI_STATUS
EFIAPI
= TxtDxeCleanup ();(
VOID
);
/// sub_2FEC / sub_748 equivalent
EFI_STATUS
EFIAPI
Unload Handler(
VOID
);
/// _ModuleEntryPoint
EFI_STATUS
EFIAPI
Entry Point(
VOID
);
EFI_STATUS
EFIAPI
1: Initialize UEFI core protocols and driver globals(
VOID
);
EFI_STATUS
EFIAPI
= DriverInit (ImageHandle, SystemTable);(
VOID
);
EFI_STATUS
EFIAPI
2: Execute TXT-specific initialization(
VOID
);
EFI_STATUS
EFIAPI
= TxtDxeMain (ImageHandle, SystemTable);(
VOID
);
EFI_STATUS
EFIAPI
3: If initialization failed, perform cleanup via unload handler(
VOID
);
EFI_STATUS
EFIAPI
(EFI_ERROR (Status)) {(
VOID
);
#endif /* __TXTDXE_H__ */