> On Nov 30, 2015, at 12:27 PM, Laszlo Ersek <[email protected]> wrote: > > On 11/30/15 20:17, Alain Kalker wrote: >> Booting a debug build of OVMF on QEMU, with PcdShadowPeimOnS3Boot and >> PcdShadowPeimOnBoot set to FALSE, i'm hitting the following assertion: >> >> --[last lines of debug output]-- >> DXE IPL Entry >> >> ASSERT_EFI_ERROR (Status = Invalid Parameter) >> ASSERT /home/miki/vcs/git/edk2/MdeModulePkg/Core/Pei/Image/Image.c(603): ! >> EFI_ERROR (Status) >> --[end]-- >> >> This is on Arch Linux (x86_64), package versions: qemu 2.4.1-1, gdb >> 7.10-4.1 . >> >> To disable shadowing, I made the following change: >> >> diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc >> index 44b9c79..31f73bc 100644 >> --- a/OvmfPkg/OvmfPkgX64.dsc >> +++ b/OvmfPkg/OvmfPkgX64.dsc >> @@ -340,6 +340,11 @@ >> gEfiSourceLevelDebugPkgTokenSpaceGuid.PcdDebugLoadImageMethod|0x2 >> !endif >> >> +!if $(TARGET) == DEBUG >> + gEfiMdeModulePkgTokenSpaceGuid.PcdShadowPeimOnS3Boot|FALSE >> + gEfiMdeModulePkgTokenSpaceGuid.PcdShadowPeimOnBoot|FALSE >> +!endif >> + >> !ifndef $(USE_OLD_SHELL) >> gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdShellFile|{ 0x83, 0xA5, >> 0x04, 0x7C, 0x3E, 0x9E, 0x1C, 0x4F, 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, >> 0xB4, 0xD1 } >> !endif > > "Doctor, if I press here, it hurts". > "Well, don't press there." > > Why are you doing this in the first place? > > The documentation of "PcdShadowPeimOnBoot" goes like > [MdeModulePkg/MdeModulePkg.dec]: > >> ## Indicates if to shadow PEIM and PeiCore after memory is ready.<BR><BR> >> # This PCD is used on other boot path except for S3 boot. >> # TRUE - Shadow PEIM and PeiCore after memory is ready.<BR> >> # FALSE - Not shadow PEIM after memory is ready.<BR> >> # @Prompt Shadow Peim and PeiCore on boot >> gEfiMdeModulePkgTokenSpaceGuid.PcdShadowPeimOnBoot|TRUE|BOOLEAN|0x30001029 > > If I understand correctly, if you flip this switch to false, then the PEI > core, any already loaded PEIMs, and the temporary PEI heap and stack will not > be migrated to permanent PEI RAM, once permanent PEI RAM is installed. That > is a completely untested path in OVMF (in fact this is the first time I ever > hear of this PCD) -- why are you doing this? > > Such a change could be extremely intrusive, and (right now) I don't see any > good reason to attempt to support it. > > Anyway, the assert you seem to be hitting is in the PeiLoadImageLoadImage() > function: > > 592 // > 593 // If memory is installed, perform the shadow operations > 594 // > 595 Status = LoadAndRelocatePeCoffImage ( > 596 FileHandle, > 597 Pe32Data, > 598 &ImageAddress, > 599 &ImageSize, > 600 &ImageEntryPoint > 601 ); > 602 > 603 ASSERT_EFI_ERROR (Status); > > I also found a comment like this, in > "MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c" (note the dependency on the > PCD): > > 1143 // > 1144 // If memory is availble we shadow images by default for > performance reasons. > 1145 // We call the entry point a 2nd time so the module > knows it's shadowed. > 1146 // > 1147 //PERF_START (PeiServices, L"PEIM", PeimFileHandle, 0); > 1148 if ((Private->HobList.HandoffInformationTable->BootMode > != BOOT_ON_S3_RESUME) && !PcdGetBool (PcdShadowPeimOnBoot)) { > 1149 // > 1150 // Load PEIM into Memory for Register for shadow PEIM. > 1151 // > 1152 Status = PeiLoadImage ( > 1153 PeiServices, > 1154 PeimFileHandle, > 1155 PEIM_STATE_REGISITER_FOR_SHADOW, > 1156 &EntryPoint, > 1157 &AuthenticationState > 1158 ); > > So, my take is that you might have stumbled upon a by-now untested, > bit-rotted code path in edk2. > > On physical platforms the PEI phase is launched from flash, which is likely > slow, so as soon as DRAM is discovered, it is -- in practice -- *always* > relocated there. Which allowed the code path (enabled by the opposite PCD > setting) to bit-rot. > > I think this issue is not directly related to OVMF. >
The strange thing about this is the failure is loading the DXE Core from the DXE IPL, so all of PEI has already run and been dispatched? #2 0x0000000000822f0e in PeiLoadImageLoadImage at /home/miki/vcs/git/edk2/MdeModulePkg/Core/Pei/Image/Image.c:603 #3 0x0000000000823326 in PeiLoadImageLoadImageWrapper at /home/miki/vcs/git/edk2/MdeModulePkg/Core/Pei/Image/Image.c:722 #4 0x0000000007fc5d41 in DxeLoadCore at /home/miki/vcs/git/edk2/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c:325 #5 0x00000000008218c0 in PeiCore at /home/miki/vcs/git/edk2/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c:459 #6 0x0000000000820d43 in PeiCore at /home/miki/vcs/git/edk2/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c:271 Thanks, Andrew Fish > Thanks > Laszlo > >> For building the OVMF image, I used the following commands: >> >> $ make -C BaseTools >> $ . edksetup.sh BaseTools >> $ build -a X64 -p OvmfPkg/OvmfPkgX64.dsc -b DEBUG -t GCC49 -n 8 >> >> To get debug output from QEMU, I used the following command: >> >> $ qemu-system-x86_64 -monitor none -serial none -chardev >> stdio,id=biosdebug -device isa-debugcon,iobase=0x402,chardev=biosdebug - >> bios Build/OvmfX64/DEBUG_GCC49/FV/OVMF.fd >> >> Using GDB (with a custom Python script to load symbols), I got a fill >> backtrace. >> I will try and post the full output from QEMU boot as well as the >> backtrace as replies to this message because many mail archives strip >> attachments. >> >> Kind regards, >> >> Alain >> >> _______________________________________________ >> edk2-devel mailing list >> [email protected] >> https://lists.01.org/mailman/listinfo/edk2-devel >> > > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

