On Tue, Dec 3, 2013 at 1:56 PM, Laszlo Ersek <ler...@redhat.com> wrote:
> it's as if different parts of the code thought differently about
> PcdDxeIplSwitchToLongMode.
>
> Interpretation #1:
> - PcdDxeIplSwitchToLongMode means that we have to *switch* from 32-bit
> PEI to 64-bit DXE. Emphasis on "switch", that is, "PEI and DXE have
> different bitness".
>
> Interpretation #2:
> - PcdDxeIplSwitchToLongMode means that DXE is 64-bit, independently of
> PEI bitness.

Clearly the name indicates that DxeIpl needs to switch into long-mode.
It seems there are two cases where this can be false, yet DXE can be
64-bit:
* 64-bit only OVMF
* 64-bit EmulatorPkg

Is a new PCD needed, or can PEI code use:
Has64BitDxe =
  (sizeof(UINTN) == sizeof(UINT64)) ||
  (FeaturePcdGet (PcdDxeIplSwitchToLongMode);

I don't think 64-bit PEI with a 32-bit DXE is supported.

-Jordan

>           PcdDxeIplSwitchToLongMode
> PEI  DXE  Interp#1  Interp#2         result
> 32   32   0         0                OK
> 32   64   1         1                OK
> 64   64   0         1                oops
>
> I checked the documentation in MdeModulePkg/MdeModulePkg.dec, and I have
> no clue which interpretation it follows.
>
> The picture is further complicated by "PcdDxeIplBuildPageTables" (added
> in SVN r12016. It seems to allow one to say (by setting it to FALSE),
> "64-bit PEI, 64-bit DXE, but please don't rebuild page tables".
>
> Now, in OVMF, the 32/32 platform DSC file sets PcdDxeIplSwitchToLongMode
> to FALSE. No difference between interp#1 and interp#2.
>
> The 32/64 DSC file sets it to TRUE. Detto.
>
> The 64/64 DSC file it to FALSE again, clearly following interp#1 -- "no
> switching needed".
>
> Maybe, we should set this PCD to TRUE (ie. follow Interp#2), and turn
> off rebuilding the page tables by setting the newer
> PcdDxeIplBuildPageTables to FALSE. I have no clue. (We don't use this
> second PCD in OVMF, only EmulatorPkg and Nt32Pkg do -- they both set it
> to FALSE.)
>
> If OVMF interprets PcdDxeIplSwitchToLongMode differently (==interp#1)
> from some other parts of the code (interp#2), well that has not been
> causing problems until now, apparently.
>
> But now I'm looking at the S3 suspend/resume code, and it is full of
> comments that apparently *equate*
>
>   PcdDxeIplSwitchToLongMode==FALSE
>
> with
>
>   DXE is 32-bit
>
> Which corresponds to Interp#2.
> I'm asking because I'm now reaching the assembly code in
> "MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.S" that
> would jump to the (real mode) OSPM waking vector, and it reboots the
> machine. I think that maybe the wrong routine is invoked, due to
> confusion around PcdDxeIplSwitchToLongMode.
> (The reboot happens when LRET pops RIP and CS from the stack. Apparently
> the idea behind this exercise is to stay/continue in the same ASM file,
> but change the CS. It doesn't work.)
>
> Thanks!
> Laszlo
>
> ------------------------------------------------------------------------------
> Sponsored by Intel(R) XDK
> Develop, test and display web and hybrid apps with a single code base.
> Download it for free now!
> http://pubads.g.doubleclick.net/gampad/clk?id=111408631&iu=/4140/ostg.clktrk
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------------------------------------------------------
Sponsored by Intel(R) XDK 
Develop, test and display web and hybrid apps with a single code base.
Download it for free now!
http://pubads.g.doubleclick.net/gampad/clk?id=111408631&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to