On 11/30/15 22:59, Andrew Fish wrote: > >> On Nov 30, 2015, at 12:27 PM, Laszlo Ersek <ler...@redhat.com> 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
Maybe there's something about the DXE core image file that differs from the PEIM images, and rubs this code the wrong way? I have no idea. Perhaps if Alain digs down the LoadAndRelocatePeCoffImage() function, it can be unearthed where the EFI_INVALID_PARAMETER status comes from. The build rules from the end of the OvmfPkg/OvmfPkgX64.fdf file could be relevant: [Rule.Common.PEIM] FILE PEIM = $(NAMED_GUID) { PEI_DEPEX PEI_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex PE32 PE32 Align=Auto $(INF_OUTPUT)/$(MODULE_NAME).efi UI STRING="$(MODULE_NAME)" Optional VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) } [Rule.Common.DXE_CORE] FILE DXE_CORE = $(NAMED_GUID) { PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi UI STRING="$(MODULE_NAME)" Optional VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) } Thanks Laszlo > > 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 >>> edk2-devel@lists.01.org >>> https://lists.01.org/mailman/listinfo/edk2-devel >>> >> >> _______________________________________________ >> edk2-devel mailing list >> edk2-devel@lists.01.org >> https://lists.01.org/mailman/listinfo/edk2-devel > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel