On Thu, 2019-08-22 at 22:37 -0500, Jin, Eric wrote:
> Hi Supreeth,
> 
> > -----Original Message-----
> > From: Supreeth Venkatesh [mailto:supreeth.venkat...@arm.com]
> > Sent: Friday, August 23, 2019 2:43 AM
> > To: devel@edk2.groups.io; Jin, Eric <eric....@intel.com>
> > Subject: Re: [edk2-devel] [edk2-test][Patch 1/1] uefi-sct/SctPkg:
> > Eliminate
> > 2nd execution of ExitBootServices Test
> > 
> > On Wed, 2019-08-21 at 20:50 -0500, Eric Jin via Groups.Io wrote:
> > > Hij Supreeth,
> > 
> > Hi Eric,
> > 
> > > 
> > > > -----Original Message-----
> > > > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On
> > > > Behalf
> > > > Of Supreeth Venkatesh
> > > > Sent: Thursday, August 22, 2019 12:43 AM
> > > > To: Jin, Eric <eric....@intel.com>; devel@edk2.groups.io
> > > > Subject: Re: [edk2-devel] [edk2-test][Patch 1/1] uefi-
> > > > sct/SctPkg:
> > > > Eliminate
> > > > 2nd execution of ExitBootServices Test
> > > > 
> > > > On Wed, 2019-08-21 at 01:24 -0500, Eric Jin wrote:
> > > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2098
> > > > 
> > > > Please add the details of the patch to the commit message.
> > > > "In the ExitBootServices() test, after ExitBootServices() call,
> > > > all
> > > > boot services are forbidden. The original design is to save the
> > > > return status value of
> > > > ExitBootServices() in variable using variable service and
> > > > reset, but
> > > > this needs multiple execution of the test to retrieve the value
> > > > from
> > > > variable and this design was not straightforward from end user
> > > > perspective.
> > > > 
> > > 
> > > I would like to change "multiple execution" to "one additional
> > > execution"
> > > 
> > > > This patch enhances the test by leveraging RecoveryLib to
> > > > restore
> > > > execution
> > > > after reset automatically, thus requiring only one execution"
> > > > 
> > > 
> > > I am ok with this suggestion when I push the code to repo
> > 
> > Thanks.
> > 
> > > 
> > > > More comments inline...
> > > > 
> > > > > 
> > > > > Cc: Supreeth Venkatesh <supreeth.venkat...@arm.com>
> > > > > Signed-off-by: Eric Jin <eric....@intel.com>
> > > > > ---
> > > > >  uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTest.inf          |  3 ++-
> > > > >  uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTest.h            |  9 ++++++++-
> > > > >  uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTestConformance.c | 98
> > > > > 
> > > > 
> > > > 
> > 
> > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> > > > +++++++++++
> > > > > ++++++++++++++---------------
> > > > >  3 files changed, 93 insertions(+), 17 deletions(-)
> > > > > 
> > > > > diff --git a/uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTest.inf b/uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTest.inf
> > > > > index 49ad79915934..3de43a20e8a4 100644
> > > > > --- a/uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTest.inf
> > > > > +++ b/uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTest.inf
> > > > > @@ -1,7 +1,7 @@
> > > > >  ## @file
> > > > >  #
> > > > >  #  Copyright 2006 - 2012 Unified EFI, Inc.<BR> -#  Copyright
> > > > > (c)
> > > > > 2010
> > > > > - 2012, Intel Corporation. All rights reserved.<BR>
> > > > > +#  Copyright (c) 2010 - 2019, Intel Corporation. All rights
> > > > > reserved.<BR>
> > > > >  #
> > > > >  #  This program and the accompanying materials  #  are
> > > > > licensed
> > > > > and
> > > > > made available under the terms and conditions of the BSD
> > > > > License
> > > > > @@
> > > > > -53,4 +53,5 @@
> > > > > 
> > > > >  [Protocols]
> > > > >    gEfiTestProfileLibraryGuid
> > > > > +  gEfiTestRecoveryLibraryGuid
> > > > >    gBlackBoxEfiHIIPackageListProtocolGuid
> > > > > diff --git a/uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTest.h b/uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTest.h
> > > > > index b1c35fee7435..008584577ed1 100644
> > > > > --- a/uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTest.h
> > > > > +++ b/uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTest.h
> > > > > @@ -1,7 +1,7 @@
> > > > >  /** @file
> > > > > 
> > > > >    Copyright 2006 - 2017 Unified EFI, Inc.<BR>
> > > > > -  Copyright (c) 2010 - 2017, Intel Corporation. All rights
> > > > > reserved.<BR>
> > > > > +  Copyright (c) 2010 - 2019, Intel Corporation. All rights
> > > > > reserved.<BR>
> > > > > 
> > > > >    This program and the accompanying materials
> > > > >    are licensed and made available under the terms and
> > > > > conditions
> > > > > of
> > > > > the BSD License @@ -35,6 +35,13 @@ Abstract:
> > > > >  #include EFI_PROTOCOL_DEFINITION (LoadFile)
> > > > > 
> > > > >  #include EFI_TEST_PROTOCOL_DEFINITION (TestProfileLibrary)
> > > > > +#include EFI_TEST_PROTOCOL_DEFINITION (TestRecoveryLibrary)
> > > > > +
> > > > > +typedef struct _RESET_DATA {
> > > > > +  UINTN           Step;
> > > > > +  UINTN           TplIndex;
> > > > > +  UINT32          RepeatTimes;
> > > > > +} RESET_DATA;
> > > > > 
> > > > >  #if (EFI_SPECIFICATION_VERSION >= 0x0002000A)
> > > > > 
> > > > > diff --git a/uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTestConformance.c b/uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTestConformance.c
> > > > > index 0a26d46847da..e90afe7ecae0 100644
> > > > > --- a/uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTestConformance.c
> > > > > +++ b/uefi-
> > > > > sct/SctPkg/TestCase/UEFI/EFI/BootServices/ImageServices/Black
> > > > > BoxT
> > > > > est/
> > > > > ImageBBTestConformance.c
> > > > > @@ -1,7 +1,7 @@
> > > > >  /** @file
> > > > > 
> > > > >    Copyright 2006 - 2016 Unified EFI, Inc.<BR>
> > > > > -  Copyright (c) 2010 - 2016, Intel Corporation. All rights
> > > > > reserved.<BR>
> > > > > +  Copyright (c) 2010 - 2019, Intel Corporation. All rights
> > > > > reserved.<BR>
> > > > > 
> > > > >    This program and the accompanying materials
> > > > >    are licensed and made available under the terms and
> > > > > conditions
> > > > > of
> > > > > the BSD License @@ -30,7 +30,8 @@ Abstract:
> > > > >  #define TEST_VENDOR1_GUID                         \
> > > > >    { 0xF6FAB04F, 0xACAF, 0x4af3, { 0xB9, 0xFA, 0xDC, 0xF9,
> > > > > 0x7F,
> > > > > 0xB4,
> > > > > 0x42, 0x6F } }
> > > > > 
> > > > > -#define MAX_BUFFER_SIZE  10
> > > > > +#define STATUS_BUFFER_SIZE   8
> > > > 
> > > > Why is the size being reduced by 2 bytes?
> > > > Was the earlier size not optimal?
> > > 
> > > The buffer here is to save the returned status code from
> > > ExitBootServices(), so 8 bytes is enough with UEFI Spec's
> > > perceptive.
> > 
> > Ok. Sounds good.
> > 
> > > 
> > > > 
> > > > > +#define RECOVER_BUFFER_SIZE  1024
> > 
> > Not sure why such a large Recovery Buffer is required?
> > When this test case is writing only the _RESET_DATA structure into
> > the
> > recovery library. if this is to handle the case where there are
> > other
> > types of recovery data being written in some other place, How do
> > you
> > distinguish?
> > 
> 
> The recovery data will be saved on the system physical storage with
> file
> protocol and 512 or 1024 bytes is block size as experience value.
> The design of RecoveryLib and SCT infrastructure ensure the recovery
> data
> is belong to case granularity, the data will not be impacted by
> others until
> current case complete.
Thanks for the clarification.

> 
> > > > > 
> > > > >  EFI_GUID gTestVendor1Guid = TEST_VENDOR1_GUID;
> > > > > 
> > > > > @@ -778,19 +779,23 @@ BBTestExitBootServicesConsistencyTest (
> > > > >    )
> > > > >  {
> > > > >    EFI_STANDARD_TEST_LIBRARY_PROTOCOL   *StandardLib;
> > > > > +  EFI_TEST_RECOVERY_LIBRARY_PROTOCOL   *RecoveryLib;
> > > > >    EFI_STATUS                           Status;
> > > > >    EFI_TEST_ASSERTION                   AssertionType;
> > > > >    UINTN                                MapKey;
> > > > > -
> > > > > +  UINTN                                Size;
> > > > >    UINTN                                Numbers;
> > > > >    UINTN                                DataSize;
> > > > > -  UINT8                                Data[MAX_BUFFER_SIZE]
> > > > > ;
> > > > > +  RESET_DATA                           *ResetData;
> > > > > +  UINT8                                Data[STATUS_BUFFER_SI
> > > > > ZE];
> > > > > +  UINT8                                Buffer[RECOVER_BUFFER
> > > > > _SIZ
> > > > > E];
> > > > >    EFI_STATUS                           ReturnStatus;
> > > > > 
> > > > >    //
> > > > >    // Init
> > > > >    //
> > > > >    StandardLib = NULL;
> > > > > +  RecoveryLib = NULL;
> > > > > 
> > > > >    //_RESET_DATA
> > > > >    // Get the Standard Library Interface @@ -803,6 +808,14 @@
> > > > > BBTestExitBootServicesConsistencyTest (
> > > > >      return Status;
> > > > >    }
> > > > > 
> > > > > +  Status = gtBS->HandleProtocol (
> > > > > +                   SupportHandle,
> > > > > +                   &gEfiTestRecoveryLibraryGuid,
> > > > > +                   (VOID **) &RecoveryLib);  if
> > > > > (EFI_ERROR(Status)) {
> > > > > +    return Status;
> > > > > +  }
> > > > > +
> > > > >    Status = ImageTestCheckForCleanEnvironment (&Numbers);
> > > > >    if (EFI_ERROR(Status)) {
> > > > >      StandardLib->RecordAssertion (
> > > > > @@ -819,25 +832,80 @@ BBTestExitBootServicesConsistencyTest (
> > > > >      return Status;
> > > > >    }
> > > > > 
> > > > > -  DataSize = MAX_BUFFER_SIZE;
> > > > > -  Status = gtRT->GetVariable (
> > > > > -                 L"ExitBootServicesTestVariable",           
> > > > >   //
> > > > > VariableName
> > > > > -                 &gTestVendor1Guid,                         
> > > > >   //
> > > > > VendorGuid
> > > > > -                 NULL,
> > > > >   //
> > > > > Attributes
> > > > > -                 &DataSize,                                 
> > > > >   //
> > > > > DataSize
> > > > > -                 &ReturnStatus
> > > > >   //
> > > > > Data
> > > > > -                 );
> > > > > +  //
> > > > > +  // Read reset record
> > > > > +  //
> > > > > +  Status = RecoveryLib->ReadResetRecord (
> > > > > +                          RecoveryLib,
> > > > > +                          &Size,
> > > > > +                          Buffer
> > > > > +                          );
> > > > 
> > > > Status should be checked before proceeding further. Unhandled
> > > > error
> > > > condition.
> > > 
> > > The code needn't handle possible error status here, and it will
> > > be
> > > handled in the judgeme_RESET_DATAnt statement later.
> > > In fact, Error status code doesn't mean bad, just means no
> > > recovery
> > > data exists this time/is written before.
> > 
> > As I see it, if Status is "error", there is no point in assigning
> > ResetData to Buffer as Buffer is not valid anymore. Hence the
> > reason
> > for the comment.
> > My expectation was just rearrangement of "if" conditional
> > statements.
> > 
> 
> Yes, Buffer needn't be validated here and can be assigned to
> ResetData directly. 
The order of statements here is misleading.
1. RecoveryLib->ReadResetRecord(RecoveryLib, Size, Buffer);
2. ResetData = (RESET_DATA *)Buffer;

Re-order the statements like below to make it more clear since it is a
just a pointer to Buffer which is statically allocated to 1024 and
ResetData is not being really initialized to Reset Record after reading
reset record.
1. ResetData = (RESET_DATA *)Buffer;
2. RecoveryLib->ReadResetRecord(RecoveryLib, Size, Buffer);
> 
> > > 
> > > > 
> > > > > +  ResetData = (RESET_DATA *)Buffer;
> > > > 
> > > > Before initializing, size check should be performed.
> > > > Unhandled error condition.
> > > 
> > > Size is checked in the judgement statement later, the same time
> > > as
> > > the status check.
> > > Initializing here doesn't have issue because the Buffer is local
> > > buf
> > > already defined/allocated in this function.
> > > 
> > > > 
> > > > > 
> > > > > -  if (Status == EFI_SUCCESS) {
> > > > > +  if (EFI_ERROR(Status) || (Size < sizeof(RESET_DATA))) {
> > > > > +    //
> > > > > +    // Step 1
> > > > > +    //
> > > > 
> > > > This check is unnecessary if the above comments regarding
> > > > unhandled
> > > > error
> > > > condition are resolved.
> > > 
> > > Here, the code needn't handle anything. It means no recovery data
> > > is
> > > found.
> > 
> > Right, if there is no action (nothing to handle) after the "if"
> > statement, then there is no point in having the "if" condition.
> > Please rearrange the conditional statements so that for every
> > condition
> > there is an action to follow.
> > 
> 
> Your concern is no action in 1st “if” statement, and want to has
> action for each condition statement.
> I can consider this, but the logic(nest statement) may be increased.
Thanks. I understand it would result in nested "if".

> 
> > > But I would like to adjust the comment to 'Step 0' and add " no
> > > recovery data is found " to make it clear.
> > > Correspondingly, adjust the comment 'Step 2' in judgement branch
> > > below to 'Step 1, recovery data is found'.
> > > 
> > > > 
> > > > > +  } else if (ResetData->Step == 1) {
> > > > > +    //
> > > > > +    // Step 2
> > > > > +    //
> > > > > +    DataSize = STATUS_BUFFER_SIZE;
> > > > > +    Status   = gtRT->GetVariable (
> > > > > +                       L"ExitBootServicesTestVariable",
> > > > > // VariableName
> > > > > +                       &gTestVendor1Guid,
> > > > > // VendorGuid
> > > > > +                       NULL,
> > > > > // Attributes
> > > > > +                       &DataSize,
> > > > > // DataSize
> > > > > +                       &ReturnStatus
> > > > > // Data
> > > > > +                       );
> > > > > +
> > > > > +    if (EFI_ERROR(Status)) {
> > > > > +      StandardLib->RecordAssertion (
> > > > > +                     StandardLib,
> > > > > +                     EFI_TEST_ASSERTION_FAILED,
> > > > > +                     gTestGenericFailureGuid,
> > > > > +                     L"GetVariable - Can't get the test
> > > > > variable
> > > > > -
> > > > > ExitBootServicesTestVariable",
> > > > > +                     L"%a:%d:Status - %r",
> > > > > +                     __FILE__,
> > > > > +                     (UINTN)__LINE__,
> > > > > +                     Status
> > > > > +                     );
> > > > > +      return Status;
> > > > > +    }
> > > > >      goto CheckResult;
> > > > > +  } else {
> > > > > +    return EFI_LOAD_ERROR;
> > > > >    }
> > > > > 
> > > > >    //
> > > > >    // Print out some information to avoid the user thought it
> > > > > is
> > > > > an
> > > > > error
> > > > >    //
> > > > > -  SctPrint (L"System will cold reset after 2 second. please
> > > > > run
> > > > > this
> > > > > test again...");
> > > > > +  SctPrint (L"System will cold reset after 2 second and test
> > > > > will be
> > > > > resumed after reboot.");
> > > > >    gtBS->Stall (2000000);
> > > > > 
> > > > > +
> > > > > +  ResetData->Step = 1;
> > > > > +  ResetData->TplIndex = 0;
> > > > > +  Status = RecoveryLib->WriteResetRecord (
> > > > > +                            RecoveryLib,
> > > > > +                            sizeof (RESET_DATA),
> > > > > +                            Buffer
> > > > 
> > > > To make it  clear it should be (UINT8 *)ResetData.
> > > > As Buffer is of size 1024, where as ResetData is not.
> > > > i.e., Buffer should be used above.
> > > > 
> > > 
> > > I agree on this suggestion. Will follow when commit this patch to
> > > repo.
> > 
> > Thanks.
> > 
> > > 
> > > Best Regards
> > > Eric
> > > 
> > > > 
> > > > > +                            );
> > > > > +  if (EFI_ERROR(Status)) {
> > > > > +    StandardLib->RecordAssertion (
> > > > > +                   StandardLib,
> > > > > +                   EFI_TEST_ASSERTION_FAILED,
> > > > > +                   gTestGenericFailureGuid,
> > > > > +                   L"TestRecoveryLib - WriteResetRecord",
> > > > > +                   L"%a:%d:Status - %r",
> > > > > +                   __FILE__,
> > > > > +                   (UINTN)__LINE__,
> > > > > +                   Status
> > > > > +                   );
> > > > > +    return Status;
> > > > > +  }
> > > > > +
> > > > > +
> > > > >    //
> > > > >    // Checkpoint 1:
> > > > >    // 3.5.2.1  ExitBootServices should not succeed with an
> > > > > invalid
> > > > > MapKey @@ -885,7 +953,7 @@
> > > > > BBTestExitBootServicesConsistencyTest
> > > > > (
> > > > >    //reset system
> > > > >    gtRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
> > > > > 
> > > > > -  // get var to get the status
> > > > > +
> > > > >  CheckResult:
> > > > > 
> > > > >    if (ReturnStatus == EFI_INVALID_PARAMETER) {
> > > > 
> > > > 
> > > > 
> > > 
> > > 
> > > 
> > > 
> 
> 


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

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

Reply via email to