> On Mar 1, 2020, at 3:41 PM, Michael D Kinney <michael.d.kin...@intel.com> > wrote: > > Andrew, > > Thanks. I did not realize this was a struct with > a single flexible array member. I agree that does > not make sense. > > The top level struct here is a HOB that must be in > contiguous memory. The HOB can vary in size based on > MicrocodeCount and StorageType. We are trying to make > it easy to write the C code that produces and consumes > this HOB. Using flexible array members helps improve > the readability when structures have this attribute. > > For the storage type defined, the StorageContext is a > single UINT64 value. Other storage type GUIDs may have > more complex StorageContext structures. This array > of structures is guaranteed to start on an 8-byte > boundary, so the use case is to cast the start of > the StorageContext to the defined type and access > the array if structures and their fields. > > Do you have any suggestions on how to make this > better?
Mike, The flexible array member can not be in a struct by its self or a member of a union (I looked into that, but clang warns on that too). It has to be a the end of a structure with size. If we can't build a compound structure with the preamble data as that data varies too much the best I can think of is this: Add the known size element to enforce alignment, and make the flexible size member legal C. Add a macro that converts the pointer to raw data to the FLEXIBLE_ARRAY. Basically you need to subtract the fixed size element to get the pointer to the flexible array aligned and indexable. typedef struct { UINT64 ForceAlign; UINT8 Array[]; } FLEXIBLE_ARRAY; FLEXIBLE_ARRAY *gFlex = FLEXIBLE_ARRAY_ALIGN (RawData); Now FLEXIBLE_ARRAY.Array[] is an index into the RawData, and the definition of the FLEXIBLE_ARRAY_ALIGN can explain the trick and why it is required or standard C. Then from the C code it looks more like code that requires aligning a buffer? Sorry that is the best I've got. But at the end of the day a pointer is also a flexible array in C so that is the other option. Thanks, Andrew Fish > > Mike > >> -----Original Message----- >> From: af...@apple.com <mailto:af...@apple.com> <af...@apple.com >> <mailto:af...@apple.com>> >> Sent: Thursday, February 27, 2020 7:43 AM >> To: devel@edk2.groups.io <mailto:devel@edk2.groups.io>; Kinney, Michael D >> <michael.d.kin...@intel.com <mailto:michael.d.kin...@intel.com>> >> Cc: Gao, Liming <liming....@intel.com <mailto:liming....@intel.com>>; Fu, >> Siyuan >> <siyuan...@intel.com <mailto:siyuan...@intel.com>>; Ni, Ray >> <ray...@intel.com <mailto:ray...@intel.com>>; >> Chaganty, Rangasai V <rangasai.v.chaga...@intel.com >> <mailto:rangasai.v.chaga...@intel.com>> >> Subject: Re: [edk2-devel] [Patch] >> IntelSiliconPkg/ShadowMicrocodePei: Fix GCC build >> error. >> >> Mike, >> >> Flexible array members must be the last element of a >> struct but they can not be the only element. >> >> This is non standard behavior from the compilers that >> are not throwing the error. >> >> Why not just use a pointer? >> >> Sent from my iPhone >> >>> On Feb 26, 2020, at 10:03 PM, Michael D Kinney >> <michael.d.kin...@intel.com> wrote: >>> >>> Liming, >>> >>> This does not make sense. Those compilers >>> should support C99 flexible array members. >>> >>> Structured PCDs also require use of flexible >>> array members. >>> >>> We need to make sure the compiler flags for >>> those tool chain are correct to support flexible >>> array members. >>> >>> Mike >>> >>>> -----Original Message----- >>>> From: Gao, Liming <liming....@intel.com> >>>> Sent: Wednesday, February 26, 2020 9:58 PM >>>> To: devel@edk2.groups.io; Kinney, Michael D >>>> <michael.d.kin...@intel.com>; Fu, Siyuan >>>> <siyuan...@intel.com> >>>> Cc: Ni, Ray <ray...@intel.com>; Chaganty, Rangasai V >>>> <rangasai.v.chaga...@intel.com> >>>> Subject: RE: [edk2-devel] [Patch] >>>> IntelSiliconPkg/ShadowMicrocodePei: Fix GCC build >>>> error. >>>> >>>> Mike: >>>> I find this issue on GCC5 tool chain tag with GCC >> 5.5 >>>> and CLANGPDB tool chain tag with CLANG 9.0.0 >>>> >>>> Thanks >>>> Liming >>>>> -----Original Message----- >>>>> From: devel@edk2.groups.io <devel@edk2.groups.io> >> On >>>> Behalf Of Michael D Kinney >>>>> Sent: Thursday, February 27, 2020 1:54 PM >>>>> To: Gao, Liming <liming....@intel.com>; >>>> devel@edk2.groups.io; Fu, Siyuan >> <siyuan...@intel.com>; >>>> Kinney, Michael D >>>>> <michael.d.kin...@intel.com> >>>>> Cc: Ni, Ray <ray...@intel.com>; Chaganty, Rangasai >> V >>>> <rangasai.v.chaga...@intel.com> >>>>> Subject: Re: [edk2-devel] [Patch] >>>> IntelSiliconPkg/ShadowMicrocodePei: Fix GCC build >>>> error. >>>>> >>>>> Which GCC and CLANG tool chain tags? >>>>> >>>>> Flexible array member is a standard C feature >>>>> documented in C99. >>>>> >>>>> Mike >>>>> >>>>>> -----Original Message----- >>>>>> From: Gao, Liming <liming....@intel.com> >>>>>> Sent: Wednesday, February 26, 2020 9:38 PM >>>>>> To: Kinney, Michael D >> <michael.d.kin...@intel.com>; >>>>>> devel@edk2.groups.io; Fu, Siyuan >>>> <siyuan...@intel.com> >>>>>> Cc: Ni, Ray <ray...@intel.com>; Chaganty, Rangasai >>>> V >>>>>> <rangasai.v.chaga...@intel.com> >>>>>> Subject: RE: [edk2-devel] [Patch] >>>>>> IntelSiliconPkg/ShadowMicrocodePei: Fix GCC build >>>>>> error. >>>>>> >>>>>> Mike: >>>>>> I find GCC and CLANG will report the error for >>>> the >>>>>> empty struct. >>>>>> >>>>>> d:\allpkg\edk2- >>>>>> >>>> >> platforms\Silicon\Intel\IntelSiliconPkg\Include\Guid/Mi >>>>>> crocodeShadowInfoHob.h:61:11: error: flexible >> array >>>>>> member 'MicrocodeAddressInFlash' not allowed in >>>>>> otherwise empty struct >>>>>> UINT64 MicrocodeAddressInFlash[]; >>>>>> ^ >>>>>> 1 error generated. >>>>>> >>>>>> Thanks >>>>>> Liming >>>>>>> -----Original Message----- >>>>>>> From: Kinney, Michael D >>>> <michael.d.kin...@intel.com> >>>>>>> Sent: Thursday, February 27, 2020 1:25 PM >>>>>>> To: devel@edk2.groups.io; Fu, Siyuan >>>>>> <siyuan...@intel.com>; Kinney, Michael D >>>>>> <michael.d.kin...@intel.com> >>>>>>> Cc: Ni, Ray <ray...@intel.com>; Chaganty, >>>> Rangasai V >>>>>> <rangasai.v.chaga...@intel.com>; Gao, Liming >>>>>> <liming....@intel.com> >>>>>>> Subject: RE: [edk2-devel] [Patch] >>>>>> IntelSiliconPkg/ShadowMicrocodePei: Fix GCC build >>>>>> error. >>>>>>> >>>>>>> What compiler does not like the flexible array >>>>>>> member syntax []. >>>>>>> >>>>>>> Mike >>>>>>> >>>>>>>> -----Original Message----- >>>>>>>> From: devel@edk2.groups.io >>>> <devel@edk2.groups.io> >>>>>> On >>>>>>>> Behalf Of Siyuan, Fu >>>>>>>> Sent: Wednesday, February 26, 2020 5:58 PM >>>>>>>> To: devel@edk2.groups.io >>>>>>>> Cc: Ni, Ray <ray...@intel.com>; Chaganty, >>>> Rangasai >>>>>> V >>>>>>>> <rangasai.v.chaga...@intel.com>; Gao, Liming >>>>>>>> <liming....@intel.com> >>>>>>>> Subject: [edk2-devel] [Patch] >>>>>>>> IntelSiliconPkg/ShadowMicrocodePei: Fix GCC >>>> build >>>>>>>> error. >>>>>>>> >>>>>>>> This patch fixes compiler error introduced by >>>>>> commit >>>>>>>> b0099a39bd. >>>>>>>> >>>>>>>> BZ: >>>>>>>> >>>>>> >>>> >> https://tianocore.acgmultimedia.com/show_bug.cgi?id=244 >>>>>>>> 9 >>>>>>>> Cc: Ray Ni <ray...@intel.com> >>>>>>>> Cc: Rangasai V Chaganty >>>>>> <rangasai.v.chaga...@intel.com> >>>>>>>> Cc: Liming Gao <liming....@intel.com> >>>>>>>> Signed-off-by: Siyuan Fu <siyuan...@intel.com> >>>>>>>> --- >>>>>>>> >>>> .../Feature/ShadowMicrocode/ShadowMicrocodePei.c >>>>>>>> | 2 +- >>>>>>>> >>>>>>>> >>>>>> >>>> >> .../Intel/IntelSiliconPkg/Include/Guid/MicrocodeShadowI >>>>>>>> nfoHob.h | 2 +- >>>>>>>> 2 files changed, 2 insertions(+), 2 >>>> deletions(-) >>>>>>>> >>>>>>>> diff --git >>>>>>>> >>>>>> >>>> >> a/Silicon/Intel/IntelSiliconPkg/Feature/ShadowMicrocode >>>>>>>> /ShadowMicrocodePei.c >>>>>>>> >>>>>> >>>> >> b/Silicon/Intel/IntelSiliconPkg/Feature/ShadowMicrocode >>>>>>>> /ShadowMicrocodePei.c >>>>>>>> index 7e4084247e..8d6574f667 100644 >>>>>>>> --- >>>>>>>> >>>>>> >>>> >> a/Silicon/Intel/IntelSiliconPkg/Feature/ShadowMicrocode >>>>>>>> /ShadowMicrocodePei.c >>>>>>>> +++ >>>>>>>> >>>>>> >>>> >> b/Silicon/Intel/IntelSiliconPkg/Feature/ShadowMicrocode >>>>>>>> /ShadowMicrocodePei.c >>>>>>>> @@ -247,7 +247,7 @@ ShadowMicrocodePatchWorker >>>> ( >>>>>>>> (VOID *) Patches[Index].Address, >>>>>>>> Patches[Index].Size >>>>>>>> ); >>>>>>>> - MicrocodeAddressInMemory[Index] = (UINT64) >>>>>> Walker; >>>>>>>> + MicrocodeAddressInMemory[Index] = (UINT64) >>>>>> (UINTN) >>>>>>>> Walker; >>>>>>>> Flashcontext- >>>>> MicrocodeAddressInFlash[Index] >>>>>> = >>>>>>>> (UINT64) Patches[Index].Address; >>>>>>>> Walker += Patches[Index].Size; >>>>>>>> } >>>>>>>> diff --git >>>>>>>> >>>>>> >>>> >> a/Silicon/Intel/IntelSiliconPkg/Include/Guid/MicrocodeS >>>>>>>> hadowInfoHob.h >>>>>>>> >>>>>> >>>> >> b/Silicon/Intel/IntelSiliconPkg/Include/Guid/MicrocodeS >>>>>>>> hadowInfoHob.h >>>>>>>> index d887b39123..1daae1234a 100644 >>>>>>>> --- >>>>>>>> >>>>>> >>>> >> a/Silicon/Intel/IntelSiliconPkg/Include/Guid/MicrocodeS >>>>>>>> hadowInfoHob.h >>>>>>>> +++ >>>>>>>> >>>>>> >>>> >> b/Silicon/Intel/IntelSiliconPkg/Include/Guid/MicrocodeS >>>>>>>> hadowInfoHob.h >>>>>>>> @@ -58,7 +58,7 @@ typedef struct { >>>>>>>> // microcode patch address on flash. The >>>> address >>>>>> is >>>>>>>> placed in same >>>>>>>> // order as the microcode patches in >>>>>>>> MicrocodeAddrInMemory. >>>>>>>> // >>>>>>>> - UINT64 MicrocodeAddressInFlash[]; >>>>>>>> + UINT64 MicrocodeAddressInFlash[0]; >>>>>>>> } EFI_MICROCODE_STORAGE_TYPE_FLASH_CONTEXT; >>>>>>>> >>>>>>>> #endif >>>>>>>> -- >>>>>>>> 2.19.1.windows.1 >>>>>>>> >>>>>>>> >>>>>>>> >>>>> >>>>> >>>>> >>> >>> >>> >>> > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55136): https://edk2.groups.io/g/devel/message/55136 Mute This Topic: https://groups.io/mt/71579115/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-