On 10/22/12 23:42, Jordan Justen wrote:
> Structures should not be directly assigned in EDK II
> code, since this leads to different behaviours on various
> compilers.

Yes, structure assignment can be implemented by memberwise copy or
blanket memcpy(), as allowed by ISO C99 6.2.6.1p6. Why is that a problem?

I think I do not understand some coding consideration that permeates the
edk2 tree. For another example, why is it that gcc is not allowed to
generate 64-bit division code on IA32 (by statically linking the
necessary function from libgcc.a)?

ISO C99 explicitly allows extended integer types (for example one we
choose to designate with the "UINT64" typedef on IA32). The division
operator is not exempt from working with the extended integer types.

> Instead, use ZeroMem to zero out the structures.

That on the other hand casts away the volatile qualification of the
pointer before the access through it (to an object defined as volatile),
which explicitly violates C99 6.7.3p5. (See the CopyMem() comment in the
same file a bit higher up.)

5 If an attempt is made to modify an object defined with a const-
  qualified type through use of an lvalue with non-const-qualified
  type, the behavior is undefined. If an attempt is made to refer to an
  object defined with a volatile-qualified type through use of an lvalue
  with non-volatile-qualified type, the behavior is undefined.

> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com>
> ---
>  OvmfPkg/VirtioScsiDxe/VirtioScsi.c | 15 ++-------------
>  1 file changed, 2 insertions(+), 13 deletions(-)
> 
> diff --git a/OvmfPkg/VirtioScsiDxe/VirtioScsi.c 
> b/OvmfPkg/VirtioScsiDxe/VirtioScsi.c
> index 66f6d31..e58dd80 100644
> --- a/OvmfPkg/VirtioScsiDxe/VirtioScsi.c
> +++ b/OvmfPkg/VirtioScsiDxe/VirtioScsi.c
> @@ -413,19 +413,8 @@ VirtioScsiPassThru (
>    volatile VIRTIO_SCSI_RESP Response;
>    DESC_INDICES              Indices;
>  
> -  //
> -  // Zero-initialization of Request & Response with "= { 0 };" doesn't build
> -  // with gcc-4.4: "undefined reference to `memset'". Direct SetMem() is not
> -  // allowed as it would cast away the volatile qualifier. Work it around.
> -  //

Actually I didn't have to reach back to the 64-bit division example: I
introduced the workaround exactly because the standard-conformant
initialization didn't work. (Because the build system doesn't allow gcc
to use internal memset here.) May I ask why that is so?


> -  union {
> -    VIRTIO_SCSI_REQ  Request;
> -    VIRTIO_SCSI_RESP Response;
> -  } Zero;
> -
> -  SetMem (&Zero, sizeof Zero, 0x00);
> -  Request  = Zero.Request;
> -  Response = Zero.Response;
> +  ZeroMem ((VOID*) &Request, sizeof (Request));
> +  ZeroMem ((VOID*) &Response, sizeof (Response));

As my comment described, I intended to avoid precisely this. (I may have
referred to SetMem() instead of ZeroMem() due to lacking knowledge of
the edk2 API, but I had SetMem(Buffer, Length, 0x00) in mind when
writing the comment.)

... You probably need the (VOID*) because otherwise the compiler warns
about casting away "volatile".

>  
>    Dev = VIRTIO_SCSI_FROM_PASS_THRU (This);
>    CopyMem (&TargetValue, Target, sizeof TargetValue);

I cannot ACK this unless we declare for good that we don't care about
standard C. I'm not trying to prevent this patch from going in (that
would be futile anyway), I just don't understand what standard(s) we
adhere to.

For example, we could say that "ZeroMem()'s side effects are always
complete at the next sequence point", simply positing something that C99
doesn't require (ie. leaves undefined).


... I just skimmed the ToC of the Coding Standards (rev 0.53) and
nothing stands out in this regard.

(OTOH when I first used "volatile", I did try to spell it as VOLATILE --
cue STATIC, CONST, VOID etc --, and it didn't work. That seems to
conflict with Table 6 of the Coding Standards.

Hmm yes, the VOLATILE macro is there only in
<EdkCompatibilityPkg/Foundation/Efi/Include/EfiTypes.h>, not in
<MdePkg/Include/Base.h>, where the rest of the all-caps macros resides
for edk2. Confusing.)

Thanks,
Laszlo

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to