public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Jianyong Wu" <jianyong.wu@arm.com>
To: Sami Mujawar <Sami.Mujawar@arm.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "lersek@redhat.com" <lersek@redhat.com>,
	"ardb+tianocore@kernel.org" <ardb+tianocore@kernel.org>,
	Justin He <Justin.He@arm.com>, nd <nd@arm.com>
Subject: Re: [PATCH v3 2/3] Acpi: Install Acpi tables for Cloud hypervisor
Date: Tue, 29 Jun 2021 02:29:17 +0000	[thread overview]
Message-ID: <AM9PR08MB72767901C545D202991DBF93F4029@AM9PR08MB7276.eurprd08.prod.outlook.com> (raw)
In-Reply-To: <5676fa17-e4b6-b243-31a0-e957e12c4966@arm.com>

Hi Sami,

All comments are accepted. Thanks for your elaborate review work!

BR
Jianyong

> -----Original Message-----
> From: Sami Mujawar <Sami.Mujawar@arm.com>
> Sent: Monday, June 28, 2021 8:22 PM
> To: Jianyong Wu <Jianyong.Wu@arm.com>; devel@edk2.groups.io
> Cc: lersek@redhat.com; ardb+tianocore@kernel.org; Justin He
> <Justin.He@arm.com>; nd <nd@arm.com>
> Subject: Re: [PATCH v3 2/3] Acpi: Install Acpi tables for Cloud hypervisor
> 
> Hi Jianyong,
> 
> Please find my response inline marked [SAMI].
> 
> Regards,
> 
> Sami Mujawar
> 
> On 28/06/2021 10:55 AM, Jianyong Wu wrote:
> > There is no device like Fw-cfg in Qemu in Cloud Hypervisor, so a
> > specific Acpi handler is introduced here.
> >
> > The handler implemented here is in a very simple way:
> > 1. acquire the RSDP from the PCD variable in the top ".dsc"; 2. get
> > the XSDT address from RSDP structure; 3. get the ACPI tables following
> > the XSDT structure and install them one by one; 4. get DSDT address
> > from FADT and install DSDT table.
> >
> > Signed-off-by: Jianyong Wu <jianyong.wu@arm.com>
> > ---
> >   ArmVirtPkg/ArmVirtPkg.dec                     |   6 +
> >   .../CloudHvAcpiPlatformDxe.inf                |  47 ++++++
> >   .../CloudHvAcpiPlatformDxe/CloudHvAcpi.c      | 141
> ++++++++++++++++++
> >   3 files changed, 194 insertions(+)
> >   create mode 100644
> ArmVirtPkg/CloudHvAcpiPlatformDxe/CloudHvAcpiPlatformDxe.inf
> >   create mode 100644 ArmVirtPkg/CloudHvAcpiPlatformDxe/CloudHvAcpi.c
> >
> > diff --git a/ArmVirtPkg/ArmVirtPkg.dec b/ArmVirtPkg/ArmVirtPkg.dec
> > index bf82f7f1f3f2..4e4d758015bc 100644
> > --- a/ArmVirtPkg/ArmVirtPkg.dec
> > +++ b/ArmVirtPkg/ArmVirtPkg.dec
> > @@ -66,6 +66,12 @@ [PcdsFixedAtBuild, PcdsPatchableInModule]
> >     #
> >     gArmVirtTokenSpaceGuid.PcdTerminalTypeGuidBuffer|{0x65, 0x60,
> > 0xA6, 0xDF, 0x19, 0xB4, 0xD3, 0x11, 0x9A, 0x2D, 0x00, 0x90, 0x27,
> > 0x3F, 0xC1, 0x4D}|VOID*|0x00000007
> >
> > +  ##
> > +  # This is the physical address of Rsdp which is the core struct of Acpi.
> > +  # Cloud Hypervisor has no other way to pass Rsdp address to the guest
> except use a PCD.
> > +  #
> > +
> > +
> gArmVirtTokenSpaceGuid.PcdCloudHvAcpiRsdpBaseAddress|0x0|UINT64|0
> x00
> > + 000005
> > +
> >   [PcdsDynamic]
> >     #
> >     # Whether to force disable ACPI, regardless of the fw_cfg settings
> > diff --git
> > a/ArmVirtPkg/CloudHvAcpiPlatformDxe/CloudHvAcpiPlatformDxe.inf
> > b/ArmVirtPkg/CloudHvAcpiPlatformDxe/CloudHvAcpiPlatformDxe.inf
> > new file mode 100644
> > index 000000000000..01de76486686
> > --- /dev/null
> > +++ b/ArmVirtPkg/CloudHvAcpiPlatformDxe/CloudHvAcpiPlatformDxe.inf
> > @@ -0,0 +1,47 @@
> > +## @file
> > +#  ACPI Platform Driver for Cloud Hypervisor # #  Copyright (c) 2021,
> > +ARM Limited. All rights reserved.<BR> #  SPDX-License-Identifier:
> > +BSD-2-Clause-Patent # ##
> > +
> > +[Defines]
> > +  INF_VERSION                    = 0x00010005
> > +  BASE_NAME                      = CloudHvgAcpiPlatform
> > +  FILE_GUID                      = 6c76e407-73f2-dc1c-938f-5d6c4691ea93
> > +  MODULE_TYPE                    = DXE_DRIVER
> > +  VERSION_STRING                 = 1.0
> > +  ENTRY_POINT                    = CloudHvAcpiPlatformEntryPoint
> > +
> > +#
> > +# The following information is for reference only and not required by the
> build tools.
> > +#
> > +  VALID_ARCHITECTURES           = AARCH64
> > +#
> > +
> > +[Sources]
> > +  CloudHvAcpi.c
> > +
> > +[Packages]
> > +  MdePkg/MdePkg.dec
> > +  MdeModulePkg/MdeModulePkg.dec
> > +  OvmfPkg/OvmfPkg.dec
> > +  ArmVirtPkg/ArmVirtPkg.dec
> > +
> > +[LibraryClasses]
> > +  BaseLib
> > +  DebugLib
> > +  MemoryAllocationLib
> > +  OrderedCollectionLib
> > +  UefiBootServicesTableLib
> > +  UefiDriverEntryPoint
> > +
> > +[Protocols]
> > +  gEfiAcpiTableProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
> > +
> > +[Pcd]
> > +  gArmVirtTokenSpaceGuid.PcdCloudHvAcpiRsdpBaseAddress
> > +
> > +[Depex]
> > +  gEfiAcpiTableProtocolGuid
> > diff --git a/ArmVirtPkg/CloudHvAcpiPlatformDxe/CloudHvAcpi.c
> > b/ArmVirtPkg/CloudHvAcpiPlatformDxe/CloudHvAcpi.c
> > new file mode 100644
> > index 000000000000..0f1a50d63cd6
> > --- /dev/null
> > +++ b/ArmVirtPkg/CloudHvAcpiPlatformDxe/CloudHvAcpi.c
> > @@ -0,0 +1,141 @@
> > +/** @file
> > +  Install Acpi tables for Cloud Hypervisor
> > +
> > +  Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
> > +
> > +  SPDX-License-Identifier: BSD-2-Clause-Patent **/
> > +
> > +#include <Library/BaseLib.h>
> > +#include <Library/MemoryAllocationLib.h> #include
> > +<IndustryStandard/Acpi63.h> #include <Protocol/AcpiTable.h> #include
> > +<Library/UefiBootServicesTableLib.h>
> > +#include <Library/UefiDriverEntryPoint.h> #include
> > +<Library/DebugLib.h>
> > +
> > +/**
> > +   Find Acpi table Protocol and return it
> [SAMI]Please add description of value returned by this function.
> [/SAMI]
> > +**/
> > +STATIC
> > +EFI_ACPI_TABLE_PROTOCOL *
> > +FindAcpiTableProtocol (
> > +  VOID
> > +  )
> > +{
> > +  EFI_STATUS              Status;
> > +  EFI_ACPI_TABLE_PROTOCOL *AcpiTable;
> > +
> > +  Status = gBS->LocateProtocol (
> > +                  &gEfiAcpiTableProtocolGuid,
> > +                  NULL,
> > +                  (VOID**)&AcpiTable
> > +                  );
> > +  ASSERT_EFI_ERROR (Status);
> > +  return AcpiTable;
> > +}
> > +
> > +/** Install Acpi tables for Cloud Hypervisor
> > +
> > +  @param [in]  AcpiProtocol  Acpi Protocol which is used to install
> > + Acpi talbles
> > +
> > +  @return EFI_SUCCESS            The table was successfully inserted.
> > +  @return EFI_INVALID_PARAMETER  Either AcpiTableBuffer is NULL,
> TableKey is NULL, or AcpiTableBufferSize
> > +                                 and the size field embedded in the ACPI table pointed to
> by AcpiTableBuffer
> > +                                 are not in sync.
> > +  @return EFI_OUT_OF_RESOURCES   Insufficient resources exist to
> complete the request.
> > +  @retval EFI_ACCESS_DENIED      The table signature matches a table
> already
> > +                                 present in the system and platform policy
> > +                                 does not allow duplicate tables of this type.
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +InstallCloudHvAcpiTables (
> > + IN     EFI_ACPI_TABLE_PROTOCOL       *AcpiProtocol
> > + )
> > +{
> > +  UINTN InstalledKey, TableSize, AcpiTableLength;
> [SAMI] Define each local variable separately on a new line.
> > +  UINT64 RsdpPtr, XsdtPtr, TableOffset, AcpiTablePtr, DsdtPtr = ~0;
> [SAMI] I think DsdtPtr can be UINT64 pointer and initialised to NULL before
> first use.
> > +  EFI_STATUS Status = EFI_SUCCESS;
> > +  BOOLEAN GotFacp = FALSE;
> [SAMI] I think GotFacp could probably be avoided, see comments below.
> > +
> > +  RsdpPtr = PcdGet64 (PcdCloudHvAcpiRsdpBaseAddress);  XsdtPtr =
> > + ((EFI_ACPI_6_3_ROOT_SYSTEM_DESCRIPTION_POINTER *)
> > + RsdpPtr)->XsdtAddress;
> [SAMI] No space between typecast and their object. Same comment for
> similar instances in this patch series.
> > +  AcpiTableLength = ((EFI_ACPI_COMMON_HEADER *) XsdtPtr)->Length;
> > + TableOffset = sizeof (EFI_ACPI_DESCRIPTION_HEADER);
> > +
> [SAMI] Set DsdtPtr = NULL, here.
> > +  while (!EFI_ERROR(Status)
> > +    && (TableOffset < AcpiTableLength))  {
> [SAMI] Starting curly brace at the end of previous line, please.
> > +    AcpiTablePtr = *(UINT64 *) (XsdtPtr + TableOffset);
> > +    TableSize = ((EFI_ACPI_COMMON_HEADER *) AcpiTablePtr)->Length;
> > +
> > +    //
> > +    // Install ACPI tables from XSDT
> > +    //
> > +    Status = AcpiProtocol->InstallAcpiTable (
> [SAMI] AcpiProtocol pointer not checked before use. In release builds the
> ASSERTs in FindAcpiTableProtocol() would vanish and a failure to get the
> protocol would result in a crash when dereferencing the pointer here.
> > +                             AcpiProtocol,
> > +                             (VOID *)(UINT64)AcpiTablePtr,
> [SAMI] Can you check if typecast to UINT64 is needed here, please?
> Similarly, also check at other places.
> > +                             TableSize,
> > +                             &InstalledKey
> > +                             );
> [SAMI] Please reconsider error handling in this function. Probably best check
> and return failure from here. This would mean the status would not need to
> be checked in the while () statement and correspondingly there is no need to
> initialise Status to EFI_SUCCESS at the begining of this function.
> > +
> > +    TableOffset += sizeof (UINT64);
> > +
> > +    //
> > +    // Get DSDT from FADT
> > +    //
> > +    if (!GotFacp
> > +      && !AsciiStrnCmp ((CHAR8 *) &((EFI_ACPI_COMMON_HEADER *)
> AcpiTablePtr)->Signature, "FACP", 4))
> > +    {
> [SAMI] Curly brace on previous line, please. '!GotFacp' could be replaced
> with (DsdtPtr != NULL).
> > +      DsdtPtr = ((EFI_ACPI_6_3_FIXED_ACPI_DESCRIPTION_TABLE *)
> AcpiTablePtr)->XDsdt;
> > +      GotFacp = TRUE;
> > +    }
> > +  }
> > +
> > +  if (DsdtPtr == ~0) {
> [SAMI] Please change to' If (DsdtPtr == NULL)'.
> > +    DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __FUNCTION__));
> > +    ASSERT (FALSE);
> > +    CpuDeadLoop ();
> [SAMI] I think EFI_NOT_FOUND could be returned here, and the
> CpuDeadLoop
> () could be moved to CloudHvAcpiPlatformEntryPoint().
> > +  }
> > +
> > +  //
> > +  // Install DSDT table
> > +  //
> > +  TableSize = ((EFI_ACPI_COMMON_HEADER *) DsdtPtr)->Length;  Status
> =
> > + AcpiProtocol->InstallAcpiTable (
> > +             AcpiProtocol,
> > +             (VOID *)(UINT64) DsdtPtr,
> > +             TableSize,
> > +             &InstalledKey
> > +             );
> > +
> > +  return Status;
> > +}
> > +
> > +/** Entry point for Cloud Hypervisor Platform Dxe
> > +
> > +  @param [in]  ImageHandle  Handle for this image.
> > +  @param [in]  SystemTable  Pointer to the EFI system table.
> > +
> > +  @return EFI_SUCCESS            The table was successfully inserted.
> > +  @return EFI_INVALID_PARAMETER  Either AcpiTableBuffer is NULL,
> TableKey is NULL, or AcpiTableBufferSize
> > +                                 and the size field embedded in the ACPI table pointed to
> by AcpiTableBuffer
> > +                                 are not in sync.
> > +  @return EFI_OUT_OF_RESOURCES   Insufficient resources exist to
> complete the request.
> > +  @retval EFI_ACCESS_DENIED      The table signature matches a table
> already
> > +                                 present in the system and platform policy
> > +                                 does not allow duplicate tables of this type.
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +CloudHvAcpiPlatformEntryPoint (
> > +  IN EFI_HANDLE         ImageHandle,
> > +  IN EFI_SYSTEM_TABLE   *SystemTable
> > +  )
> > +{
> > +  EFI_STATUS                         Status;
> > +
> > +  Status = InstallCloudHvAcpiTables (FindAcpiTableProtocol ());
> [SAMI] Check status code here and on failure execute CpuDeadLoop ().
> > +  return Status;
> > +}


  reply	other threads:[~2021-06-29  2:29 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-28  9:55 [PATCH v3 0/3] Enable Cloud Hypervisor support in edk2 Jianyong Wu
2021-06-28  9:55 ` [PATCH v3 1/3] Acpi: reimplement PlatformHasAcpi for Cloud Hypervisor Jianyong Wu
2021-06-28 12:45   ` Sami Mujawar
2021-06-29  2:25     ` Jianyong Wu
2021-06-28  9:55 ` [PATCH v3 2/3] Acpi: Install Acpi tables for Cloud hypervisor Jianyong Wu
2021-06-28 12:22   ` Sami Mujawar
2021-06-29  2:29     ` Jianyong Wu [this message]
2021-06-28  9:55 ` [PATCH v3 3/3] ArmVirtCloudHv: support Cloud Hypervisor in edk2 Jianyong Wu
2021-06-28 12:43   ` Sami Mujawar
2021-06-29  2:26     ` Jianyong Wu
2021-06-29  6:03     ` Jianyong Wu
2021-06-29  8:16       ` Sami Mujawar
2021-06-29  9:19         ` Jianyong Wu

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=AM9PR08MB72767901C545D202991DBF93F4029@AM9PR08MB7276.eurprd08.prod.outlook.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