public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Andrew Fish" <afish@apple.com>
To: devel@edk2.groups.io, Mike Kinney <michael.d.kinney@intel.com>
Cc: "Gao, Liming" <liming.gao@intel.com>,
	"Fu, Siyuan" <siyuan.fu@intel.com>, "Ni, Ray" <ray.ni@intel.com>,
	"Chaganty, Rangasai V" <rangasai.v.chaganty@intel.com>
Subject: Re: [edk2-devel] [Patch] IntelSiliconPkg/ShadowMicrocodePei: Fix GCC build error.
Date: Sun, 01 Mar 2020 19:47:48 -0800	[thread overview]
Message-ID: <7E325DE5-04A9-4C4F-97A8-519D0A5CF905@apple.com> (raw)
In-Reply-To: <E92EE9817A31E24EB0585FDF735412F5B9EC4A7E@ORSMSX113.amr.corp.intel.com>

[-- Attachment #1: Type: text/plain, Size: 10121 bytes --]


> On Mar 1, 2020, at 3:41 PM, Michael D Kinney <michael.d.kinney@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: afish@apple.com <mailto:afish@apple.com> <afish@apple.com <mailto:afish@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.kinney@intel.com <mailto:michael.d.kinney@intel.com>>
>> Cc: Gao, Liming <liming.gao@intel.com <mailto:liming.gao@intel.com>>; Fu, Siyuan
>> <siyuan.fu@intel.com <mailto:siyuan.fu@intel.com>>; Ni, Ray <ray.ni@intel.com <mailto:ray.ni@intel.com>>;
>> Chaganty, Rangasai V <rangasai.v.chaganty@intel.com <mailto:rangasai.v.chaganty@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.kinney@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.gao@intel.com>
>>>> Sent: Wednesday, February 26, 2020 9:58 PM
>>>> To: devel@edk2.groups.io; Kinney, Michael D
>>>> <michael.d.kinney@intel.com>; Fu, Siyuan
>>>> <siyuan.fu@intel.com>
>>>> Cc: Ni, Ray <ray.ni@intel.com>; Chaganty, Rangasai V
>>>> <rangasai.v.chaganty@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.gao@intel.com>;
>>>> devel@edk2.groups.io; Fu, Siyuan
>> <siyuan.fu@intel.com>;
>>>> Kinney, Michael D
>>>>> <michael.d.kinney@intel.com>
>>>>> Cc: Ni, Ray <ray.ni@intel.com>; Chaganty, Rangasai
>> V
>>>> <rangasai.v.chaganty@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.gao@intel.com>
>>>>>> Sent: Wednesday, February 26, 2020 9:38 PM
>>>>>> To: Kinney, Michael D
>> <michael.d.kinney@intel.com>;
>>>>>> devel@edk2.groups.io; Fu, Siyuan
>>>> <siyuan.fu@intel.com>
>>>>>> Cc: Ni, Ray <ray.ni@intel.com>; Chaganty, Rangasai
>>>> V
>>>>>> <rangasai.v.chaganty@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.kinney@intel.com>
>>>>>>> Sent: Thursday, February 27, 2020 1:25 PM
>>>>>>> To: devel@edk2.groups.io; Fu, Siyuan
>>>>>> <siyuan.fu@intel.com>; Kinney, Michael D
>>>>>> <michael.d.kinney@intel.com>
>>>>>>> Cc: Ni, Ray <ray.ni@intel.com>; Chaganty,
>>>> Rangasai V
>>>>>> <rangasai.v.chaganty@intel.com>; Gao, Liming
>>>>>> <liming.gao@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.ni@intel.com>; Chaganty,
>>>> Rangasai
>>>>>> V
>>>>>>>> <rangasai.v.chaganty@intel.com>; Gao, Liming
>>>>>>>> <liming.gao@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.ni@intel.com>
>>>>>>>> Cc: Rangasai V Chaganty
>>>>>> <rangasai.v.chaganty@intel.com>
>>>>>>>> Cc: Liming Gao <liming.gao@intel.com>
>>>>>>>> Signed-off-by: Siyuan Fu <siyuan.fu@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
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>> 
>>> 
>>> 
>>> 
> 
> 


[-- Attachment #2: Type: text/html, Size: 38988 bytes --]

      reply	other threads:[~2020-03-02  3:47 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-27  1:58 [Patch] IntelSiliconPkg/ShadowMicrocodePei: Fix GCC build error Siyuan, Fu
2020-02-27  2:05 ` Liming Gao
2020-02-27  4:22 ` Ni, Ray
2020-02-27  5:25 ` [edk2-devel] " Michael D Kinney
2020-02-27  5:38   ` Liming Gao
2020-02-27  5:53     ` Michael D Kinney
2020-02-27  5:58       ` Liming Gao
2020-02-27  6:03         ` Michael D Kinney
2020-02-27  6:52           ` Liming Gao
2020-02-27 15:42           ` Andrew Fish
2020-03-01 23:41             ` Michael D Kinney
2020-03-02  3:47               ` Andrew Fish [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7E325DE5-04A9-4C4F-97A8-519D0A5CF905@apple.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox