Hello, Laszlo,

There is a PEIM that executes BuildFvHob with the FVMAIN_COMPACT address and 
size, the function also exits normally.

The crash occurs here: 
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c#L469
 and the platform uses UDK2015 packages.
I also updated the DxeIpl module to the latest UDK release, but that didn't fix 
the issue.

Now I'm trying two approaches:

1. to use a decompressed DXE and see if the issue was in the compression.
2. to enable source level debugging and track execution.

Any idea what else it could be, besides the BuildFvHob function? Or a way to 
see if the HOB was built successfully.

Regards,
Hristo Mihaylov

-----Original Message-----
From: Laszlo Ersek [mailto:ler...@redhat.com] 
Sent: 09 August 2018 18:41
To: Hristo Mihaylov <hristo.mihay...@prodrive-technologies.com>; 
edk2-devel@lists.01.org
Subject: Re: [edk2] DxeIpl module cannot find DXE entry point

On 08/09/18 14:14, Hristo Mihaylov wrote:
> Hello,
> 
> This is my first time posting to a mailing list. I am building a custom 
> platform that fails when handing off control from PEIM to DXE.
> 
> Here's the error:
> 
> ```
> ASSERT_EFI_ERROR (Status = Not Found)
> ASSERT 
> c:\users\hrimih\documents\work\scalable\bios\MdeModulePkg\Core\DxeIplP
> eim\DxeLoad.c(480): !EFI_ERROR (Status) ```
> 
> In the platform only the DXE phase is compressed, using LZMA. I suspect that 
> it's not being decompressed and the module cannot find the DXE entry point.
> 
> This is the relevant .FDF part.
> 
> ```
> [FV.FVMAIN]
> BlockSize          = 0x10000
> FvAlignment        = 16
> ERASE_POLARITY     = 1
> MEMORY_MAPPED      = TRUE
> STICKY_WRITE       = TRUE
> LOCK_CAP           = TRUE
> LOCK_STATUS        = TRUE
> WRITE_DISABLED_CAP = TRUE
> WRITE_ENABLED_CAP  = TRUE
> WRITE_STATUS       = TRUE
> WRITE_LOCK_CAP     = TRUE
> WRITE_LOCK_STATUS  = TRUE
> READ_DISABLED_CAP  = TRUE
> READ_ENABLED_CAP   = TRUE
> READ_STATUS        = TRUE
> READ_LOCK_CAP      = TRUE
> READ_LOCK_STATUS   = TRUE
> FvNameGuid         = CDBB7B35-6833-4ed6-9AB2-57D2ACDDF6F0
> 
> ....
> INF modules
> ....
> 
> [FV.FVMAIN_COMPACT]
> FvAlignment        = 16
> ERASE_POLARITY     = 1
> MEMORY_MAPPED      = TRUE
> STICKY_WRITE       = TRUE
> LOCK_CAP           = TRUE
> LOCK_STATUS        = TRUE
> WRITE_DISABLED_CAP = TRUE
> WRITE_ENABLED_CAP  = TRUE
> WRITE_STATUS       = TRUE
> WRITE_LOCK_CAP     = TRUE
> WRITE_LOCK_STATUS  = TRUE
> READ_DISABLED_CAP  = TRUE
> READ_ENABLED_CAP   = TRUE
> READ_STATUS        = TRUE
> READ_LOCK_CAP      = TRUE
> READ_LOCK_STATUS   = TRUE
> FvNameGuid         = 27A72E80-3118-4c0c-8673-AA5B4EFA9613
> 
> FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
>   SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = 
> TRUE {
>     SECTION FV_IMAGE = FVMAIN
>   }
> }
> ```
> 
> Then in the .DSC I have:
> 
> ```
>   MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
>     <LibraryClasses>
>       
> NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompress
> Lib.inf
>  }
> ```
> 
> And for the DXE Main:
> 
> ```
>   MdeModulePkg/Core/Dxe/DxeMain.inf {
>     <LibraryClasses>
>       DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
>       
> NULL|MdeModulePkg/Library/DxeCrc32GuidedSectionExtractLib/DxeCrc32GuidedSectionExtractLib.inf
>       NULL| 
> MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
>     <PcdsFixedAtBuild>
>       gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0
>   }
> ```
> 
> I expect that this PEIM module will decompress the DXE partition and find the 
> entry point:
> 
> ```
> DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.i
> DxeCoreEntryPoint|nf
> ```
> 
> Any advice on how I can debug/fix this?

Do you have a BuildFvHob() call in one of your PEIMs that exposes the base 
address and the size of the FVMAIN_COMPACT firmware volume?

That's usually done with PCDs, such as:

-------
[FD.FooBar]
BaseAddress   = ...
Size          = ...
BlockSize     = ...
NumBlocks     = ...
...
<offset>|<size>
PcdFvBaseAddress|PcdFvSize
FV = FVMAIN_COMPACT
-------

And then in one of your PEIMs (usually the "platform" PEIM):

-------
  BuildFvHob (PcdGet64 (PcdFvBaseAddress), PcdGet32 (PcdFvSize));
-------

Because, your error message seems to come from the DxeIplFindDxeCore() 
function, after the PeiServicesFfsFindNextVolume() call fails. (I don't know 
what edk2 release you are using; the line number 480 doesn't match anything for 
me, but this is what I suspect anyway.)

And, PeiServicesFfsFindNextVolume() seems to work off of FV HOBs.

In the PI 1.6 spec, see Volume 1,
- 9 PEI to DXE Handoff
- 9.3 Passing the Hand-Off Block (HOB) List

"One or more Firmware Volume HOB(s)" are required; "The DXE Foundation needs 
this information to begin loading other drivers in the platform."

See also "5.7 Firmware Volume HOB" in Volume 3.

HTH,
Laszlo
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to