Hi,
I have a question about the following code in
"UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c", function
S3RestoreConfig2():
> if (SmmS3ResumeState->Signature == SMM_S3_RESUME_SMM_64) {
> //
> // Switch to long mode to complete resume.
> //
>
> InterruptStatus = SaveAndDisableInterrupts ();
> //
> // Need to make sure the GDT is loaded with values that support long
> mode and real mode.
> //
> AsmWriteGdtr (&mGdt);
> //
> // update segment selectors per the new GDT.
> //
> AsmSetDataSelectors (DATA_SEGEMENT_SELECTOR);
> //
> // Restore interrupt state.
> //
> SetInterruptState (InterruptStatus);
>
> AsmWriteCr3 ((UINTN)SmmS3ResumeState->SmmS3Cr3);
>
> //
> // Disable interrupt of Debug timer, since IDT table cannot work in
> long mode.
> // NOTE: On x64 platforms, because DisablePaging64() will disable
> interrupts,
> // the code in S3ResumeExecuteBootScript() cannot be halted by soft
> debugger.
> //
> SaveAndSetDebugTimerInterrupt (FALSE);
>
> AsmEnablePaging64 (
> 0x38,
> SmmS3ResumeState->SmmS3ResumeEntryPoint,
> (UINT64)(UINTN)AcpiS3Context,
> 0,
> SmmS3ResumeState->SmmS3StackBase + SmmS3ResumeState->SmmS3StackSize
> );
> }
At the end of this block, the AsmEnablePaging64() function is called. That call
results in the following call tree, *if* the module was built for X64:
AsmEnablePaging64() [MdePkg/Library/BaseLib/X86EnablePaging64.c]
InternalX86EnablePaging64() [MdePkg/Library/BaseLib/X64/Non-existing.c]
ASSERT (FALSE)
This is because the InternalX86EnablePaging64() functionality is unavailable in
BaseLib on X64.
My question: how is this branch in S3RestoreConfig2() supposed to work *at all*
in an X64 PEI build?
Thank you,
Laszlo
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel