> On Jan 23, 2020, at 3:21 AM, Laszlo Ersek <ler...@redhat.com> wrote:
> 
> Hi Ken,
> 
> On 01/23/20 02:37, Ken Taylor wrote:
> 
>> If I try to get the size of a DynamicEx PCD in the context of a BIOS
>> build for which that PCD is undefined, the call locks up.  I expected
>> to just get a size of 0, since the PCD is not defined in the build
>> context of the PCD DXE service.  Is this a problem that's been fixed
>> since my BIOS source code was cut?  What can I do for older builds
>> that haven't been fixed (and probably never will)?  Do I have to just
>> accept that I'm going to get garbage or lockup if I run my shell
>> utility on some builds?  Do I have to write a DXE driver and expose a
>> protocol, just so I can know if that PCD exists and is properly
>> defined?
> 
> I think the ASSERT() that you run into is the one in
> GetExPcdTokenNumber(), file "MdeModulePkg/Universal/PCD/Dxe/Service.c":
> 
>>  MatchGuid   = ScanGuid (GuidTable, mDxeGuidTableSize, Guid);
>>  //
>>  // We need to ASSERT here. If GUID can't be found in GuidTable, this is a
>>  // error in the BUILD system.
>>  //
>>  ASSERT (MatchGuid != NULL);
> 
> Can you try the following:
> 
> - Locate EFI_PCD_PROTOCOL.
> 
> - Call EFI_PCD_PROTOCOL.GetNextTokenSpace() in a loop, until you find
>  the GUID of your own token space GUID, or the function returns an
>  error.
> 
> - If your token space GUID has been found, call PcdGetEx8().
> 

Laszlo,

I think it may be better to call PCD_PROTOCOL.GetNextToken() as the GUID and 
Token spaces are both sparse name spaces. The Get*Ex() functions don't return 
errors so I guess this is your only choice. You could probably make a 
MyLibGet*Ex() function that returns EFI_STATUS, and returns the data via an 
arg.   MyLibGet*Ex() could abstract the PCD_PROTOCOL.GetNextToken() check, and 
it could also probably abstract grabbing the protocol. 

FYI it looks like the function header is much more description for 
GetNextToken() in PCD_PROTOCOL [1] vs EFI_PCD_PROTOCOL [2]. Also 
EFI_PCD_PROTOCOL does not have the *Ex functions, so you need PCD_PROTOCOL 
anyway to have access to the *Ex versions of the API.

[1] https://github.com/tianocore/edk2/blob/master/MdePkg/Include/Protocol/Pcd.h
[2] 
https://github.com/tianocore/edk2/blob/master/MdePkg/Include/Protocol/PiPcd.h

Thanks,

Andrew Fish

> Thanks,
> Laszlo
> 
> 
> 
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#53456): https://edk2.groups.io/g/devel/message/53456
Mute This Topic: https://groups.io/mt/70044584/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to