On 1 December 2017 at 16:33, Evan Lloyd <[email protected]> wrote:
> Responses inline:
>
>> -----Original Message-----
>> From: Ard Biesheuvel [mailto:[email protected]]
>> Sent: 13 October 2017 08:33
>> To: Evan Lloyd <[email protected]>
>> Cc: [email protected]; "[email protected]"@arm.com;
>> "[email protected]"@arm.com;
>> "[email protected]"@arm.com; "[email protected]"@arm.com
>> Subject: Re: [PATCH 04/19] ArmPlatformPkg: LcdGraphicsOurputDxe: Add
>> debug asserts
>>
>> On 26 September 2017 at 21:15,  <[email protected]> wrote:
>> > From: Girish Pathak <[email protected]>
>> >
>> > This change adds some debug assertions e.g to catch NULL pointer
>> > errors missing in PL11Lcd and HdLcd modules.
>> >
>> > This change also improves related error handling code.
>> >
>> > Contributed-under: TianoCore Contribution Agreement 1.1
>> > Signed-off-by: Girish Pathak <[email protected]>
>> > Signed-off-by: Evan Lloyd <[email protected]>
>> > ---
>> >
>> ArmPlatformPkg/ArmVExpressPkg/Library/HdLcdArmVExpressLib/HdLcdAr
>> mVExpress.c       | 44 ++++++++++++++++++--
>> >
>> ArmPlatformPkg/ArmVExpressPkg/Library/PL111LcdArmVExpressLib/PL11
>> 1LcdArmVExpress.c | 43 ++++++++++++++++++-
>> >  ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/HdLcd.c
>> |  8 ++--
>> >  ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c
>> |  8 ++--
>> >  4 files changed, 90 insertions(+), 13 deletions(-)
>> >
>> > diff --git
>> >
>> a/ArmPlatformPkg/ArmVExpressPkg/Library/HdLcdArmVExpressLib/HdLcd
>> ArmVE
>> > xpress.c
>> >
>> b/ArmPlatformPkg/ArmVExpressPkg/Library/HdLcdArmVExpressLib/HdLcd
>> ArmVE
>> > xpress.c index
>> >
>> b9859a56988f7e5be0adbaa49048a683fe586bfe..58dd9f0c77e1bc9af559a
>> 71d0c7c
>> > ce72d71c6da5 100644
>> > ---
>> >
>> a/ArmPlatformPkg/ArmVExpressPkg/Library/HdLcdArmVExpressLib/HdLcd
>> ArmVE
>> > xpress.c
>> > +++
>> b/ArmPlatformPkg/ArmVExpressPkg/Library/HdLcdArmVExpressLib/HdLcd
>> A
>> > +++ rmVExpress.c
>> > @@ -140,6 +140,7 @@ LcdPlatformInitializeDisplay (
>> >    *                                 buffer in bytes
>> >    *
>> >    * @retval EFI_SUCCESS             Frame buffer memory allocation 
>> > success.
>> > +  * @retval EFI_INVALID_PARAMETER   VramBaseAddress or VramSize
>> are NULL.
>> >    * @retval !(EFI_SUCCESS)          Other errors.
>> >  **/
>> >  EFI_STATUS
>> > @@ -151,6 +152,13 @@ LcdPlatformGetVram (
>> >    EFI_STATUS              Status;
>> >    EFI_ALLOCATE_TYPE       AllocationType;
>> >
>> > +  // Check VramBaseAddress and VramSize are not NULL.
>> > +  if (VramBaseAddress == NULL || VramSize == NULL) {
>> > +    ASSERT (VramBaseAddress != NULL);
>> > +    ASSERT (VramSize != NULL);
>> > +    return EFI_INVALID_PARAMETER;
>> > +  }
>> > +
>> >    // Set the vram size
>> >    *VramSize = LCD_VRAM_SIZE;
>> >
>> > @@ -169,6 +177,7 @@ LcdPlatformGetVram (
>> >                    VramBaseAddress
>> >                    );
>> >    if (EFI_ERROR (Status)) {
>> > +    ASSERT_EFI_ERROR (Status);
>> >      return Status;
>> >    }
>> >
>> > @@ -179,8 +188,8 @@ LcdPlatformGetVram (
>> >                    *VramSize,
>> >                    EFI_MEMORY_WC
>> >                    );
>> > -  ASSERT_EFI_ERROR (Status);
>> >    if (EFI_ERROR (Status)) {
>> > +    ASSERT_EFI_ERROR (Status);
>>
>> What is the point of this change?
> [[Evan Lloyd]] It is a minor efficiency improvement.  Since the ASSERT can 
> only fire when the if condition is true, it removes a duplicated test from 
> the main (non-error) code flow.  This is irrelevant on hardware, but actually 
> significant when running debug builds on an emulator environment.
>

Fair enough. But I'd prefer to finally fix the DEBUG vs NOOPT build
targets for ARM/AARCH64. DEBUG was never intended to be -O0 (and it is
not on X86 either).

Code is complex enough as it is, and how to move trivial tests like
this around for 'performance' reasons is a dimension I would like to
avoid.

>>
>> >      gBS->FreePages (*VramBaseAddress, EFI_SIZE_TO_PAGES (*VramSize));
>> >      return Status;
>> >    }
>> > @@ -215,6 +224,7 @@ LcdPlatformSetMode (
>> >    EFI_STATUS            Status;
>> >
>> >    if (ModeNumber >= LcdPlatformGetMaxMode ()) {
>> > +    ASSERT (ModeNumber < LcdPlatformGetMaxMode ());
>> >      return EFI_INVALID_PARAMETER;
>> >    }
>> >
>> > @@ -264,6 +274,7 @@ LcdPlatformSetMode (
>> >    *
>> >    * @retval EFI_SUCCESS             Success if the requested mode is 
>> > found.
>> >    * @retval EFI_INVALID_PARAMETER   Requested mode not found.
>> > +  * @retval EFI_INVALID_PARAMETER   Info is NULL.
>> >  **/
>> >  EFI_STATUS
>> >  LcdPlatformQueryMode (
>> > @@ -271,7 +282,9 @@ LcdPlatformQueryMode (
>> >    OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION * CONST  Info
>> >    )
>> >  {
>> > -  if (ModeNumber >= LcdPlatformGetMaxMode ()) {
>> > +  if (ModeNumber >= LcdPlatformGetMaxMode () || Info == NULL) {
>> > +    ASSERT (ModeNumber < LcdPlatformGetMaxMode ());
>>
>> Please don't put anything that may have a side effect inside ASSERT (), since
>> they are dropped from RELEASE builds. You can just use ASSERT (FALSE)
>> here, or use a temp variable.
>
>  [[Evan Lloyd]] Agreed
>
>>
>>
>> > +    ASSERT (Info != NULL);
>> >      return EFI_INVALID_PARAMETER;
>> >    }
>> >
>> > @@ -334,6 +347,28 @@ LcdPlatformGetTimings (
>> >    )
>> >  {
>> >    if (ModeNumber >= LcdPlatformGetMaxMode ()) {
>> > +    ASSERT (ModeNumber < LcdPlatformGetMaxMode ());
>>
>> same here
> [[Evan Lloyd]] Agreed
>>
>> > +    return EFI_INVALID_PARAMETER;
>> > +  }
>> > +
>> > +  if (HRes == NULL
>> > +    || HSync == NULL
>> > +    || HBackPorch == NULL
>> > +    || HFrontPorch == NULL
>> > +    || VRes == NULL
>> > +    || VSync == NULL
>> > +    || VBackPorch == NULL
>> > +    || VFrontPorch == NULL)
>> > +  {
>> > +    // One of the pointers is NULL
>> > +    ASSERT (HRes != NULL);
>> > +    ASSERT (HSync != NULL);
>> > +    ASSERT (HBackPorch != NULL);
>> > +    ASSERT (HFrontPorch != NULL);
>> > +    ASSERT (VRes != NULL);
>> > +    ASSERT (VSync != NULL);
>> > +    ASSERT (VBackPorch != NULL);
>> > +    ASSERT (VFrontPorch != NULL);
>> >      return EFI_INVALID_PARAMETER;
>> >    }
>> >
>> > @@ -356,6 +391,7 @@ LcdPlatformGetTimings (
>> >    *
>> >    * @retval EFI_SUCCESS             The requested mode is found.
>> >    * @retval EFI_INVALID_PARAMETER   Requested mode not found.
>> > +  * @retval EFI_INVALID_PARAMETER   Bpp is NULL.
>> >  **/
>> >  EFI_STATUS
>> >  LcdPlatformGetBpp (
>> > @@ -363,7 +399,9 @@ LcdPlatformGetBpp (
>> >    OUT LCD_BPP * CONST                    Bpp
>> >    )
>> >  {
>> > -  if (ModeNumber >= LcdPlatformGetMaxMode ()) {
>> > +  if (ModeNumber >= LcdPlatformGetMaxMode () || Bpp == NULL) {
>> > +    ASSERT (ModeNumber < LcdPlatformGetMaxMode ());
>> > +    ASSERT (Bpp != NULL);
>> >      return EFI_INVALID_PARAMETER;
>> >    }
>> >
>> > diff --git
>> >
>> a/ArmPlatformPkg/ArmVExpressPkg/Library/PL111LcdArmVExpressLib/PL1
>> 11Lc
>> > dArmVExpress.c
>> >
>> b/ArmPlatformPkg/ArmVExpressPkg/Library/PL111LcdArmVExpressLib/PL1
>> 11Lc
>> > dArmVExpress.c index
>> >
>> 6ae13f06d8b396ea1c67f0bcd735a9d70f476400..5a4abd4c6f9e84d3d690a
>> f7233c1
>> > cebfe1ad339b 100644
>> > ---
>> >
>> a/ArmPlatformPkg/ArmVExpressPkg/Library/PL111LcdArmVExpressLib/PL1
>> 11Lc
>> > dArmVExpress.c
>> > +++
>> b/ArmPlatformPkg/ArmVExpressPkg/Library/PL111LcdArmVExpressLib/PL1
>> > +++ 11LcdArmVExpress.c
>> > @@ -191,6 +191,7 @@ LcdPlatformInitializeDisplay (
>> >    *                                 buffer in bytes
>> >    *
>> >    * @retval EFI_SUCCESS             Frame buffer memory allocation 
>> > success.
>> > +  * @retval EFI_INVALID_PARAMETER   VramBaseAddress or VramSize is
>> NULL.
>> >    * @retval !(EFI_SUCCESS)          Other errors.
>> >  **/
>> >  EFI_STATUS
>> > @@ -203,6 +204,13 @@ LcdPlatformGetVram (
>> >
>> >    Status = EFI_SUCCESS;
>> >
>> > +  // Check VramBaseAddress and VramSize are not NULL.
>> > +  if (VramBaseAddress == NULL || VramSize == NULL) {
>> > +    ASSERT (VramBaseAddress != NULL);
>> > +    ASSERT (VramSize != NULL);
>> > +    return EFI_INVALID_PARAMETER;
>> > +  }
>> > +
>> >    // Is it on the motherboard or on the daughterboard?
>> >    switch (PL111_CLCD_SITE) {
>> >
>> > @@ -223,6 +231,7 @@ LcdPlatformGetVram (
>> >                      VramBaseAddress
>> >                      );
>> >      if (EFI_ERROR (Status)) {
>> > +      ASSERT_EFI_ERROR (Status);
>> >        return Status;
>> >      }
>> >
>> > @@ -233,8 +242,8 @@ LcdPlatformGetVram (
>> >                      *VramSize,
>> >                      EFI_MEMORY_WC
>> >                      );
>> > -    ASSERT_EFI_ERROR (Status);
>> >      if (EFI_ERROR (Status)) {
>> > +      ASSERT_EFI_ERROR (Status);
>>
>> Please drop this change
>
>  [[Evan Lloyd]] As stated above, this is not inconsequential for some use 
> cases.  The ASSERT can only fire when the if is satisfied, so moving the 
> ASSERT reduces the number of tests executed in normal execution (depending on 
> optimisation level).
>

As stated above, let's fix DEBUG vs NOOPT instead.

>>
>> >        gBS->FreePages (*VramBaseAddress, EFI_SIZE_TO_PAGES
>> (*VramSize));
>> >        return Status;
>> >      }
>> > @@ -293,6 +302,7 @@ LcdPlatformSetMode (
>> >    UINT32                SysId;
>> >
>> >    if (ModeNumber >= LcdPlatformGetMaxMode ()) {
>> > +    ASSERT (ModeNumber < LcdPlatformGetMaxMode ());
>>
>> No function calls inside ASSERT () please
> [[Evan Lloyd]] Agreed
>
>>
>> >      return EFI_INVALID_PARAMETER;
>> >    }
>> >
>> > @@ -359,6 +369,7 @@ LcdPlatformSetMode (
>> >    *                                 (on success).
>> >    *
>> >    * @retval EFI_SUCCESS             Success if the requested mode is 
>> > found.
>> > +  * @retval EFI_INVALID_PARAMETER   Info is NULL.
>> >    * @retval EFI_INVALID_PARAMETER   Requested mode not found.
>> >  **/
>> >  EFI_STATUS
>> > @@ -367,7 +378,9 @@ LcdPlatformQueryMode (
>> >    OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION * CONST Info
>> >    )
>> >  {
>> > -  if (ModeNumber >= LcdPlatformGetMaxMode ()) {
>> > +  if (ModeNumber >= LcdPlatformGetMaxMode () || Info == NULL) {
>> > +    ASSERT (ModeNumber < LcdPlatformGetMaxMode ());
>> > +    ASSERT (Info != NULL);
>> >      return EFI_INVALID_PARAMETER;
>> >    }
>> >
>> > @@ -415,6 +428,7 @@ LcdPlatformQueryMode (
>> >    *
>> >    * @retval EFI_SUCCESS             Success if the requested mode is 
>> > found.
>> >    * @retval EFI_INVALID_PARAMETER   Requested mode not found.
>> > +  * @retval EFI_INVALID_PARAMETER   One of the OUT parameters is
>> NULL.
>> >  **/
>> >  EFI_STATUS
>> >  LcdPlatformGetTimings (
>> > @@ -430,6 +444,28 @@ LcdPlatformGetTimings (
>> >    )
>> >  {
>> >    if (ModeNumber >= LcdPlatformGetMaxMode ()) {
>> > +    ASSERT (ModeNumber < LcdPlatformGetMaxMode ());
>> > +    return EFI_INVALID_PARAMETER;
>> > +  }
>> > +
>> > +  if (HRes == NULL
>> > +    || HSync == NULL
>> > +    || HBackPorch == NULL
>> > +    || HFrontPorch == NULL
>> > +    || VRes == NULL
>> > +    || VSync == NULL
>> > +    || VBackPorch == NULL
>> > +    || VFrontPorch == NULL)
>> > +  {
>> > +    // One of the pointers is NULL
>> > +    ASSERT (HRes != NULL);
>> > +    ASSERT (HSync != NULL);
>> > +    ASSERT (HBackPorch != NULL);
>> > +    ASSERT (HFrontPorch != NULL);
>> > +    ASSERT (VRes != NULL);
>> > +    ASSERT (VSync != NULL);
>> > +    ASSERT (VBackPorch != NULL);
>> > +    ASSERT (VFrontPorch != NULL);
>> >      return EFI_INVALID_PARAMETER;
>> >    }
>> >
>> > @@ -452,6 +488,7 @@ LcdPlatformGetTimings (
>> >    *
>> >    * @retval EFI_SUCCESS             The requested mode is found.
>> >    * @retval EFI_INVALID_PARAMETER   Requested mode not found.
>> > +  * @retval EFI_INVALID_PARAMETER   Bpp is NULL.
>> >  **/
>> >  EFI_STATUS
>> >  LcdPlatformGetBpp (
>> > @@ -460,6 +497,8 @@ LcdPlatformGetBpp (
>> >    )
>> >  {
>> >    if (ModeNumber >= LcdPlatformGetMaxMode ()) {
>> > +    ASSERT (ModeNumber < LcdPlatformGetMaxMode ());
>> > +    ASSERT (Bpp != NULL);
>> >      return EFI_INVALID_PARAMETER;
>> >    }
>> >
>> > diff --git a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/HdLcd.c
>> > b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/HdLcd.c
>> > index
>> >
>> 5f950579720fb69e0a481f697a5cc4038158b409..a266671a26f01d31e8dd
>> b0cf7cbf
>> > e59d2f4dc49c 100644
>> > --- a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/HdLcd.c
>> > +++ b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/HdLcd.c
>> > @@ -109,15 +109,15 @@ LcdSetMode (
>> >               &VBackPorch,
>> >               &VFrontPorch
>> >               );
>> > -  ASSERT_EFI_ERROR (Status);
>> >    if (EFI_ERROR (Status)) {
>> > -    return EFI_DEVICE_ERROR;
>> > +    ASSERT_EFI_ERROR (Status);
>> > +    return Status;
>> >    }
>> >
>> >    Status = LcdPlatformGetBpp (ModeNumber, &LcdBpp);
>> > -  ASSERT_EFI_ERROR (Status);
>> >    if (EFI_ERROR (Status)) {
>> > -    return EFI_DEVICE_ERROR;
>> > +    ASSERT_EFI_ERROR (Status);
>> > +    return Status;
>> >    }
>> >
>> >    BytesPerPixel = GetBytesPerPixel (LcdBpp); diff --git
>> > a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c
>> > b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c
>> > index
>> >
>> 386e6140a69b045f77ee7fa60c4587d8bf4e7d54..f432c8d802614e8a0e4dd
>> ab3898f
>> > 6e0dbf9a1572 100644
>> > --- a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c
>> > +++ b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c
>> > @@ -110,15 +110,15 @@ LcdSetMode (
>> >               &VBackPorch,
>> >               &VFrontPorch
>> >               );
>> > -  ASSERT_EFI_ERROR (Status);
>> >    if (EFI_ERROR (Status)) {
>> > -    return EFI_DEVICE_ERROR;
>> > +    ASSERT_EFI_ERROR (Status);
>> > +    return Status;
>> >    }
>> >
>> >    Status = LcdPlatformGetBpp (ModeNumber, &LcdBpp);
>> > -  ASSERT_EFI_ERROR (Status);
>> >    if (EFI_ERROR (Status)) {
>> > -    return EFI_DEVICE_ERROR;
>> > +    ASSERT_EFI_ERROR (Status);
>> > +    return Status;
>> >    }
>> >
>> >    // Disable the CLCD_LcdEn bit
>> > --
>> > Guid("CE165669-3EF3-493F-B85D-6190EE5B9759")
>> >
> IMPORTANT NOTICE: The contents of this email and any attachments are 
> confidential and may also be privileged. If you are not the intended 
> recipient, please notify the sender immediately and do not disclose the 
> contents to any other person, use it for any purpose, or store or copy the 
> information in any medium. Thank you.
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to