On Feb 21, 2014, at 11:53 AM, Ryan Harkin <[email protected]> wrote:
>
>
>
> On 21 February 2014 18:44, Andrew Fish <[email protected]> wrote:
>
> On Feb 21, 2014, at 10:17 AM, Laszlo Ersek <[email protected]> wrote:
>
>> On 02/21/14 16:12, Ryan Harkin wrote:
>>> Hi Olivier,
>>>
>>> I've just noticed that the upstream EDK2 repository for the FVP AEMv8
>>> model is broken when built with Linaro GCC 13.12 onwards.
>>>
>>> The error I see is:
>>>
>>> UEFI firmware (version built at 14:54:24 on Feb 21 2014)
>>> add-symbol-file
>>> /linaro/uefi/master/upstream/edk2.git/Build/ArmVExpress-FVP-AArch64/DEBUG_ARMGCC/AARCH64/ArmPlatformPkg/PrePi/PeiMPCore/DEBUG/ArmPlatformPrePiMPCore.dll
>>> 0x88000780
>>> Decompress Failed - Not Found
>>>
>>> ASSERT_EFI_ERROR (Status = Not Found)
>>> ASSERT
>>> /linaro/uefi/master/upstream/edk2.git/ArmPlatformPkg/PrePi/PrePi.c(194):
>>> !EFI_ERROR (Status)
>>>
>>> I've tracked the bug as far as function "FfsProcessSection" [1] where
>>> at line 373, it calls into function "ExtractGuidedSectionDecode" [2]
>>> which then calls into "SavedData->ExtractDecodeHandlerTable [Index]".
>>> At that point, I can't work out where it goes.
>>>
>>> I can "fix" the problem if I re-org the variables at the top of
>>> FfsProcessSection so that DstBuffer is at the start of the
>>> declarations. That is obviously not a fix. But it will probably hint
>>> at why the subsequent code is broken.
>>>
>>> Cheers,
>>> Ryan
>>>
>>> [1] EmbeddedPkg/Library/PrePiLib/FwVol.c, line 285
>>> [2]
>>> EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.c:166
>>
>> Here's a random shot (could be completely unrelated):
>>
>>
>> EFI_STATUS
>> FfsProcessSection (
>> IN EFI_SECTION_TYPE SectionType,
>> IN EFI_COMMON_SECTION_HEADER *Section,
>> IN UINTN SectionSize,
>> OUT VOID **OutputBuffer
>> )
>> {
>> /* ... */
>> UINTN DstBufferSize;
>> /* ... */
>>
>> You're on AArch64, so UINTN means UINT64.
>>
>> Note that this "auto" variable is not initialized, hence its contents are
>> indeterminate. Fast forward to the next use:
>>
>> Status = UefiDecompressGetInfo (
>> (UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),
>> (UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION),
>> (UINT32 *) &DstBufferSize,
>> &ScratchBufferSize
>> );
>> } else if (Section->Type == EFI_SECTION_GUID_DEFINED) {
>> Status = ExtractGuidedSectionGetInfo (
>> Section,
>> (UINT32 *) &DstBufferSize,
>> &ScratchBufferSize,
>> &SectionAttribute
>> );
>>
>> Whichever of these functions is invoked, it fills in only four bytes
>> (UINT32). Then,
>>
>> DstBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES
>> (DstBufferSize) + 1);
>>
>> etc etc etc.
>>
>> By reordering the local variables, you could be limiting the nonzero garbage
>> in "DstBufferSize" to those four bytes that *are* ultimately overwritten.
>>
>> I guess initing DstBufferSize to zero is easy enough to try... :)
>
>
> As you guessed, it was easy to try and it does indeed fix the problem.
> However....
>>
>
> Why not just make it UINT32 and remove the casts. A real fix!
>
> That looks like the correct solution to me. And yes, it works also.
>
> Andrew, would you like to submit a patch as it's your change? I'm very happy
> to do it, so whichever you'd prefer.
>
I got an error message trying to commit. Could you commit this change.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Andrew Fish <[email protected]>
~/work/edk2>svn diff EmbeddedPkg/Library/PrePiLib/FwVol.c
Index: EmbeddedPkg/Library/PrePiLib/FwVol.c
===================================================================
--- EmbeddedPkg/Library/PrePiLib/FwVol.c (revision 15251)
+++ EmbeddedPkg/Library/PrePiLib/FwVol.c (working copy)
@@ -293,7 +293,7 @@
UINT32 SectionLength;
UINT32 ParsedLength;
EFI_COMPRESSION_SECTION *CompressionSection;
- UINTN DstBufferSize;
+ UINT32 DstBufferSize;
VOID *ScratchBuffer;
UINT32 ScratchBufferSize;
VOID *DstBuffer;
@@ -322,13 +322,13 @@
Status = UefiDecompressGetInfo (
(UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),
(UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION),
- (UINT32 *) &DstBufferSize,
+ &DstBufferSize,
&ScratchBufferSize
);
} else if (Section->Type == EFI_SECTION_GUID_DEFINED) {
Status = ExtractGuidedSectionGetInfo (
Section,
- (UINT32 *) &DstBufferSize,
+ &DstBufferSize,
&ScratchBufferSize,
&SectionAttribute
);
> Thanks for your help, both!
>
> Cheers,
> Ryan.
>
>
>
> Thanks,
>
> Andrew Fish
>
>> Thanks
>> Laszlo
>>
>> ------------------------------------------------------------------------------
>> Managing the Performance of Cloud-Based Applications
>> Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
>> Read the Whitepaper.
>> http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk
>> _______________________________________________
>> edk2-devel mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
>
> ------------------------------------------------------------------------------
> Managing the Performance of Cloud-Based Applications
> Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
> Read the Whitepaper.
> http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
>
> ------------------------------------------------------------------------------
> Managing the Performance of Cloud-Based Applications
> Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
> Read the Whitepaper.
> http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk_______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------------------------------------------------------
Managing the Performance of Cloud-Based Applications
Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
Read the Whitepaper.
http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel