public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Tomas Pilar (tpilar)" <Tomas.Pilar@arm.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
	"zhichao.gao@intel.com" <zhichao.gao@intel.com>,
	Krzysztof Koch <Krzysztof.Koch@arm.com>
Cc: "Ni, Ray" <ray.ni@intel.com>, Sami Mujawar <Sami.Mujawar@arm.com>,
	"Laura.Moretta@arm.comMatteo.Carlini@arm.com"
	<Laura.Moretta@arm.comMatteo.Carlini@arm.com>, nd <nd@arm.com>
Subject: Re: [edk2-devel] [PATCH v1 1/6] ShellPkg: acpiview: Add interface for data-driven table parsing
Date: Thu, 11 Jun 2020 11:49:20 +0000	[thread overview]
Message-ID: <AM5PR0801MB1844578E5CEBF5D82AE89721E7800@AM5PR0801MB1844.eurprd08.prod.outlook.com> (raw)
In-Reply-To: <DM6PR11MB4425EEDC703D539D7F57AE0EF6800@DM6PR11MB4425.namprd11.prod.outlook.com>

Krzysztof has moved on to other pastures, I'll respin the patches accordingly.

Cheers,
Tom

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Gao, Zhichao via groups.io
Sent: 11 June 2020 08:43
To: Krzysztof Koch <Krzysztof.Koch@arm.com>; devel@edk2.groups.io
Cc: Ni, Ray <ray.ni@intel.com>; Sami Mujawar <Sami.Mujawar@arm.com>; Laura.Moretta@arm.comMatteo.Carlini@arm.com; nd <nd@arm.com>
Subject: Re: [edk2-devel] [PATCH v1 1/6] ShellPkg: acpiview: Add interface for data-driven table parsing

(1) The ASSERT only works with DEBUG build. I think we need add if condition after the ASSERT to return the error code to avoid the null pointer dereference.
(2) It is suggested to use the const (lower-case) instead of CONST. same to static.

Others are fine to me.

Thanks,
Zhichao

> -----Original Message-----
> From: Krzysztof Koch <krzysztof.koch@arm.com>
> Sent: Tuesday, May 5, 2020 11:46 PM
> To: devel@edk2.groups.io
> Cc: Ni, Ray <ray.ni@intel.com>; Gao, Zhichao <zhichao.gao@intel.com>; 
> Sami.Mujawar@arm.com; Laura.Moretta@arm.comMatteo.Carlini@arm.com;
> nd@arm.com
> Subject: [PATCH v1 1/6] ShellPkg: acpiview: Add interface for 
> data-driven table parsing
> 
> Define and implement an interface to streamline metadata collection 
> and validation for structures present in each ACPI table.
> 
> Most ACPI tables define substructures which constitute the table.
> These substructures are identified by their 'Type' field value. The 
> range of possible 'Type' values is defined on a per-table basis.
> 
> For more sophisticated ACPI table validation, additional data about 
> each structure type needs to be maintained. This patch defines a new 
> ACPI_STRUCT_INFO structure. It stores additional metadata about a 
> building block of an ACPI table. ACPI_STRUCT_INFO's are organised into 
> ACPI_STRUCT_DATABASE's. ACPI_STRUCT_DATABASE is an array of 
> ACPI_STRUCT_INFO elements which are indexed using structure's type value.
> 
> For example, in the Multiple APIC Description Table (MADT) all 
> Interrupt Controller Structure types form a single database. In the 
> database, the GIC CPU Interface (GICC) structure's metadata is the 11th entry (i.e. Type = 0xB).
> 
> ACPI_STRUCT_INFO structure consists of:
> - ASCII name of the structure
> - ACPI-defined stucture Type
> - bitmask defining the validity of the structure for various
>   architectures
> - instance counter
> - a handler for the structure (ACPI_STRUCT_HANDLER)
> 
> The bitmask allows detection of structures in a table which are not 
> compatible with the target platform.
> 
> For example, the Multiple APIC Description Table (MADT) contains 
> Interrupt Controller Structure definitions which apply to either the 
> Advanced Programmable Interrupt Controller (APIC) model or the Generic 
> Interrupt Controller (GIC) model. Presence of APIC-related structures 
> on an Arm-based platform is a bug which is now detected and reported by acpiview.
> 
> This patch adds support for compatibility checks with the Arm architecture only.
> However, provisions are made to allow extensions to other architectures.
> 
> ACPI_STRUCT_HANDLER describes how the contents of the structure can be 
> parsed. The possible options are:
> - An ACPI_PARSER array which can be passed to the ParseAcpi() function
> - A dedicated function for parsing the structure
>   (ACPI_STRUCT_PARSER_FUNC)
> 
> If neither of these options is provided, it is assumed that the 
> parsing logic is not implemented.
> 
> ACPI_STRUCT_PARSER_FUNC expects the the first two arguments to be the 
> pointer to the start of the structure to parse and the length of structure's buffer.
> The remaining two optional arguments are context specific.
> 
> This patch adds methods for:
> - Resetting the instance count for all structure types in a table.
> - Getting the combined instance count for all types in a table.
> - Validating the compatibility of a structure with the target arch.
> - Printing structure counts for the types which are compatible with
>   the target architecture and validating that the non-compatible
>   structures are not present in the table.
> - Parsing the structure according to the information provided by its
>   handle.
> 
> Finally, define a helper PrintAcpiStructName () function to streamline 
> the printing of ACPI structure name together with the structure's current occurrence count.
> 
> References:
> - ACPI 6.3, January 2019
> 
> Signed-off-by: Krzysztof Koch <krzysztof.koch@arm.com>
> ---
> 
> Notes:
>     v1:
>     - Add interface for data-driven table parsing [Krzysztof]
> 
>  ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c | 263
> ++++++++++++++++++++
> ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h | 234
> +++++++++++++++++
>  2 files changed, 497 insertions(+)
> 
> diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c
> b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c
> index
> 3f12a33050a4e4ab3be2187c90ef8dcf0882283d..32566101e2de2eec3ccf44563ee
> 79379404bff62 100644
> --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c
> +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c
> @@ -6,6 +6,8 @@
>  **/
> 
>  #include <Uefi.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PrintLib.h>
>  #include <Library/UefiLib.h>
>  #include <Library/UefiBootServicesTableLib.h>
>  #include "AcpiParser.h"
> @@ -466,6 +468,267 @@ PrintFieldName (
>      );
>  }
> 
> +/**
> +  Produce a Null-terminated ASCII string with the name and index of 
> +an
> +  ACPI structure.
> +
> +  The output string is in the following format: <Name> [<Index>]
> +
> +  @param [in]  Name           Structure name.
> +  @param [in]  Index          Structure index.
> +  @param [in]  BufferSize     The size, in bytes, of the output buffer.
> +  @param [out] Buffer         Buffer for the output string.
> +
> +  @return   The number of bytes written to the buffer (not including Null-byte)
> +**/
> +UINTN
> +EFIAPI
> +PrintAcpiStructName (
> +  IN  CONST CHAR8*  Name,
> +  IN        UINT32  Index,
> +  IN        UINTN   BufferSize,
> +  OUT       CHAR8*  Buffer
> +  )
> +{
> +  ASSERT (Name != NULL);
> +  ASSERT (Buffer != NULL);
> +
> +  return AsciiSPrint (Buffer, BufferSize, "%a [%d]", Name , Index); }
> +
> +/**
> +  Set all ACPI structure instance counts to 0.
> +
> +  @param [in,out] StructDb     ACPI structure database with counts to reset.
> +**/
> +VOID
> +EFIAPI
> +ResetAcpiStructCounts (
> +  IN OUT ACPI_STRUCT_DATABASE* StructDb
> +  )
> +{
> +  UINT32 Type;
> +
> +  ASSERT (StructDb != NULL);
> +  ASSERT (StructDb->Entries != NULL);
> +
> +  for (Type = 0; Type < StructDb->EntryCount; Type++) {
> +    StructDb->Entries[Type].Count = 0;
> +  }
> +}
> +
> +/**
> +  Sum all ACPI structure instance counts.
> +
> +  @param [in] StructDb     ACPI structure database with per-type counts to sum.
> +
> +  @return   Total number of structure instances recorded in the database.
> +**/
> +UINT32
> +EFIAPI
> +SumAcpiStructCounts (
> +  IN  CONST ACPI_STRUCT_DATABASE* StructDb
> +  )
> +{
> +  UINT32 Type;
> +  UINT32 Total;
> +
> +  ASSERT (StructDb != NULL);
> +  ASSERT (StructDb->Entries != NULL);
> +
> +  Total = 0;
> +
> +  for (Type = 0; Type < StructDb->EntryCount; Type++) {
> +    Total += StructDb->Entries[Type].Count;  }
> +
> +  return Total;
> +}
> +
> +/**
> +  Validate that a structure with a given type value is defined for 
> +the given
> +  ACPI table and target architecture.
> +
> +  The target architecture is evaluated from the firmare build parameters.
> +
> +  @param [in] Type        ACPI-defined structure type.
> +  @param [in] StructDb    ACPI structure database with architecture
> +                          compatibility info.
> +
> +  @retval TRUE    Structure is valid.
> +  @retval FALSE   Structure is not valid.
> +**/
> +BOOLEAN
> +EFIAPI
> +IsAcpiStructTypeValid (
> +  IN        UINT32                Type,
> +  IN  CONST ACPI_STRUCT_DATABASE* StructDb
> +  )
> +{
> +  UINT32 Compatible;
> +
> +  ASSERT (StructDb != NULL);
> +  ASSERT (StructDb->Entries != NULL);
> +
> +  if (Type >= StructDb->EntryCount) {
> +    return FALSE;
> +  }
> +
> +#if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)
> +  Compatible = StructDb->Entries[Type].CompatArch &
> +               (ARCH_COMPAT_ARM | ARCH_COMPAT_AARCH64); #else
> +  Compatible = StructDb->Entries[Type].CompatArch;
> +#endif
> +
> +  return (Compatible != 0);
> +}
> +
> +/**
> +  Print the instance count of each structure in an ACPI table that is
> +  compatible with the target architecture.
> +
> +  For structures which are not allowed for the target architecture, 
> + validate that their instance counts are 0.
> +
> +  @param [in] StructDb     ACPI structure database with counts to validate.
> +
> +  @retval TRUE    All structures are compatible.
> +  @retval FALSE   One or more incompatible structures present.
> +**/
> +BOOLEAN
> +EFIAPI
> +ValidateAcpiStructCounts (
> +  IN  CONST ACPI_STRUCT_DATABASE* StructDb
> +  )
> +{
> +  BOOLEAN   AllValid;
> +  UINT32    Type;
> +
> +  ASSERT (StructDb != NULL);
> +  ASSERT (StructDb->Entries != NULL);
> +
> +  AllValid = TRUE;
> +  Print (L"\nTable Breakdown:\n");
> +
> +  for (Type = 0; Type < StructDb->EntryCount; Type++) {
> +    ASSERT (Type == StructDb->Entries[Type].Type);
> +
> +    if (IsAcpiStructTypeValid (Type, StructDb)) {
> +      Print (
> +        L"%*a%-*a : %d\n",
> +        INSTANCE_COUNT_INDENT,
> +        "",
> +        OUTPUT_FIELD_COLUMN_WIDTH - INSTANCE_COUNT_INDENT,
> +        StructDb->Entries[Type].Name,
> +        StructDb->Entries[Type].Count
> +        );
> +    } else if (StructDb->Entries[Type].Count > 0) {
> +      AllValid = FALSE;
> +      IncrementErrorCount ();
> +      Print (
> +        L"ERROR: %a Structure is not valid for the target architecture " \
> +          L"(found %d)\n",
> +        StructDb->Entries[Type].Name,
> +        StructDb->Entries[Type].Count
> +        );
> +    }
> +  }
> +
> +  return AllValid;
> +}
> +
> +/**
> +  Parse the ACPI structure with the type value given according to 
> +instructions
> +  defined in the ACPI structure database.
> +
> +  If the input structure type is defined in the database, increment 
> + structure's  instance count.
> +
> +  If ACPI_PARSER array is used to parse the input structure, the 
> + index of the  structure (instance count for the type before update) 
> + gets printed alongside  the structure name. This helps debugging if 
> + there are many instances of the  type in a table. For 
> + ACPI_STRUCT_PARSER_FUNC, the printing of the index must  be 
> + implemented
> separately.
> +
> +  @param [in]     Indent    Number of spaces to indent the output.
> +  @param [in]     Ptr       Ptr to the start of the structure.
> +  @param [in,out] StructDb  ACPI structure database with instructions on how
> +                            parse every structure type.
> +  @param [in]     Offset    Structure offset from the start of the table.
> +  @param [in]     Type      ACPI-defined structure type.
> +  @param [in]     Length    Length of the structure in bytes.
> +  @param [in]     OptArg0   First optional argument to pass to parser function.
> +  @param [in]     OptArg1   Second optional argument to pass to parser function.
> +
> +  @retval TRUE    ACPI structure parsed successfully.
> +  @retval FALSE   Undefined structure type or insufficient data to parse.
> +**/
> +BOOLEAN
> +EFIAPI
> +ParseAcpiStruct (
> +  IN            UINT32                 Indent,
> +  IN            UINT8*                 Ptr,
> +  IN OUT        ACPI_STRUCT_DATABASE*  StructDb,
> +  IN            UINT32                 Offset,
> +  IN            UINT32                 Type,
> +  IN            UINT32                 Length,
> +  IN      CONST VOID*                  OptArg0 OPTIONAL,
> +  IN      CONST VOID*                  OptArg1 OPTIONAL
> +  )
> +{
> +  ACPI_STRUCT_PARSER_FUNC ParserFunc;
> +  CHAR8                   Buffer[80];
> +
> +  ASSERT (Ptr != NULL);
> +  ASSERT (StructDb != NULL);
> +  ASSERT (StructDb->Entries != NULL);  ASSERT (StructDb->Name != 
> + NULL);
> +
> +  PrintFieldName (Indent, L"* Offset *");  Print (L"0x%x\n", Offset);
> +
> +  if (Type >= StructDb->EntryCount) {
> +    IncrementErrorCount ();
> +    Print (L"ERROR: Unknown %a. Type = %d\n", StructDb->Name, Type);
> +    return FALSE;
> +  }
> +
> +  if (StructDb->Entries[Type].Handler.ParserFunc != NULL) {
> +    ParserFunc = StructDb->Entries[Type].Handler.ParserFunc;
> +    ParserFunc (Ptr, Length, OptArg0, OptArg1);  } else if 
> + (StructDb->Entries[Type].Handler.ParserArray != NULL) {
> +    ASSERT (StructDb->Entries[Type].Handler.Elements != 0);
> +
> +    PrintAcpiStructName (
> +      StructDb->Entries[Type].Name,
> +      StructDb->Entries[Type].Count,
> +      sizeof (Buffer),
> +      Buffer
> +      );
> +
> +    ParseAcpi (
> +      TRUE,
> +      Indent,
> +      Buffer,
> +      Ptr,
> +      Length,
> +      StructDb->Entries[Type].Handler.ParserArray,
> +      StructDb->Entries[Type].Handler.Elements
> +      );
> +  } else {
> +    StructDb->Entries[Type].Count++;
> +    Print (
> +      L"ERROR: Parsing of %a Structure is not implemented\n",
> +      StructDb->Entries[Type].Name
> +      );
> +    return FALSE;
> +  }
> +
> +  StructDb->Entries[Type].Count++;
> +  return TRUE;
> +}
> +
>  /**
>    This function is used to parse an ACPI table buffer.
> 
> diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h
> b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h
> index
> f81ccac7e118378aa185db4b625e5bcd75f78347..70e540b3a76de0ff9ce70bcabed
> 8548063bea0ff 100644
> --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h
> +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h
> @@ -300,6 +300,240 @@ typedef struct AcpiParser {
>    VOID*                 Context;
>  } ACPI_PARSER;
> 
> +/**
> +  Produce a Null-terminated ASCII string with the name and index of 
> +an
> +  ACPI structure.
> +
> +  The output string is in the following format: <Name> [<Index>]
> +
> +  @param [in]  Name           Structure name.
> +  @param [in]  Index          Structure index.
> +  @param [in]  BufferSize     The size, in bytes, of the output buffer.
> +  @param [out] Buffer         Buffer for the output string.
> +
> +  @return   The number of bytes written to the buffer (not including Null-byte)
> +**/
> +UINTN
> +EFIAPI
> +PrintAcpiStructName (
> +  IN  CONST CHAR8*  Name,
> +  IN        UINT32  Index,
> +  IN        UINTN   BufferSize,
> +  OUT       CHAR8*  Buffer
> +  );
> +
> +/**
> +  Indentation for printing instance counts for structures in an ACPI table.
> +**/
> +#define INSTANCE_COUNT_INDENT 2
> +
> +/**
> +  Common signature for functions which parse ACPI structures.
> +
> +  @param [in] Ptr         Pointer to the start of structure's buffer.
> +  @param [in] Length      Length of the buffer.
> +  @param [in] OptArg0     First optional argument.
> +  @param [in] OptArg1     Second optional argument.
> +*/
> +typedef VOID (*ACPI_STRUCT_PARSER_FUNC) (
> +  IN       UINT8* Ptr,
> +  IN       UINT32 Length,
> +  IN CONST VOID*  OptArg0 OPTIONAL,
> +  IN CONST VOID*  OptArg1 OPTIONAL
> +  );
> +
> +/**
> +  Description of how an ACPI structure should be parsed.
> +
> +  One of ParserFunc or ParserArray should be not NULL. Otherwise, it 
> +is
> +  assumed that parsing of an ACPI structure is not supported. If both
> +  ParserFunc and ParserArray are defined, ParserFunc is used.
> +**/
> +typedef struct AcpiStructHandler {
> +  /// Dedicated function for parsing an ACPI structure
> +  ACPI_STRUCT_PARSER_FUNC   ParserFunc;
> +  /// Array of instructions on how each structure field should be parsed
> +  CONST ACPI_PARSER*        ParserArray;
> +  /// Number of elements in ParserArray if ParserArray is defined
> +  UINT32                    Elements;
> +} ACPI_STRUCT_HANDLER;
> +
> +/**
> +  ACPI structure compatiblity with various architectures.
> +
> +  Some ACPI tables define structures which are, for example, only 
> + valid in  the X64 or Arm context. For instance, the Multiple APIC 
> + Description Table
> +  (MADT) describes both APIC and GIC interrupt models.
> +
> +  These definitions provide means to describe the belonging of a 
> +structure
> +  in an ACPI table to a particular architecture. This way, 
> +incompatible
> +  structures can be detected.
> +**/
> +#define ARCH_COMPAT_IA32       BIT0
> +#define ARCH_COMPAT_X64        BIT1
> +#define ARCH_COMPAT_ARM        BIT2
> +#define ARCH_COMPAT_AARCH64    BIT3
> +#define ARCH_COMPAT_RISCV64    BIT4
> +
> +/**
> +  Information about a structure which constitutes an ACPI table **/ 
> +typedef struct AcpiStructInfo {
> +  /// ACPI-defined structure Name
> +  CONST CHAR8*                Name;
> +  /// ACPI-defined structure Type
> +  CONST UINT32                Type;
> +  /// Architecture(s) for which this structure is valid
> +  CONST UINT32                CompatArch;
> +  /// Structure's instance count in a table
> +  UINT32                      Count;
> +  /// Information on how to handle the structure
> +  CONST ACPI_STRUCT_HANDLER   Handler;
> +} ACPI_STRUCT_INFO;
> +
> +/**
> +  Macro for defining ACPI structure info when an ACPI_PARSER array 
> +must
> +  be used to parse the structure.
> +**/
> +#define ADD_ACPI_STRUCT_INFO_ARRAY(Name, Type, Compat, Array)             \
> +{                                                                         \
> +  Name, Type, Compat, 0, {NULL, Array, ARRAY_SIZE (Array)}                \
> +}
> +
> +/**
> +  Macro for defining ACPI structure info when an 
> +ACPI_STRUCT_PARSER_FUNC
> +  must be used to parse the structure.
> +**/
> +#define ADD_ACPI_STRUCT_INFO_FUNC(Name, Type, Compat, Func)               \
> +{                                                                         \
> +  Name, Type, Compat, 0, {Func, NULL, 0}                                  \
> +}
> +
> +/**
> +  Macro for defining ACPI structure info when the structure is 
> +defined in
> +  the ACPI spec but no parsing information is provided.
> +**/
> +#define ACPI_STRUCT_INFO_PARSER_NOT_IMPLEMENTED(Name, Type,
> Compat)       \
> +{                                                                         \
> +  Name, Type, Compat, 0, {NULL, NULL, 0}                                  \
> +}
> +
> +/**
> +  Database collating information about every structure type defined 
> +by
> +  an ACPI table.
> +**/
> +typedef struct AcpiStructDatabase {
> +  /// ACPI-defined name for the structures being described in the database
> +  CONST CHAR8*        Name;
> +  /// Per-structure-type information. The list must be ordered by the 
> +types
> +  /// defined for the table. All entries must be unique and there 
> +should be
> +  /// no gaps.
> +  ACPI_STRUCT_INFO*   Entries;
> +  /// Total number of unique types defined for the table
> +  CONST UINT32        EntryCount;
> +} ACPI_STRUCT_DATABASE;
> +
> +/**
> +  Set all ACPI structure instance counts to 0.
> +
> +  @param [in,out] StructDb     ACPI structure database with counts to reset.
> +**/
> +VOID
> +EFIAPI
> +ResetAcpiStructCounts (
> +  IN OUT ACPI_STRUCT_DATABASE* StructDb
> +  );
> +
> +/**
> +  Sum all ACPI structure instance counts.
> +
> +  @param [in] StructDb     ACPI structure database with per-type counts to sum.
> +
> +  @return   Total number of structure instances recorded in the database.
> +**/
> +UINT32
> +EFIAPI
> +SumAcpiStructCounts (
> +  IN  CONST ACPI_STRUCT_DATABASE* StructDb
> +  );
> +
> +/**
> +  Validate that a structure with a given type value is defined for 
> +the given
> +  ACPI table and target architecture.
> +
> +  The target architecture is evaluated from the firmare build parameters.
> +
> +  @param [in] Type        ACPI-defined structure type.
> +  @param [in] StructDb    ACPI structure database with architecture
> +                          compatibility info.
> +
> +  @retval TRUE    Structure is valid.
> +  @retval FALSE   Structure is not valid.
> +**/
> +BOOLEAN
> +EFIAPI
> +IsAcpiStructTypeValid (
> +  IN        UINT32                Type,
> +  IN  CONST ACPI_STRUCT_DATABASE* StructDb
> +  );
> +
> +/**
> +  Print the instance count of each structure in an ACPI table that is
> +  compatible with the target architecture.
> +
> +  For structures which are not allowed for the target architecture, 
> + validate that their instance counts are 0.
> +
> +  @param [in] StructDb     ACPI structure database with counts to validate.
> +
> +  @retval TRUE    All structures are compatible.
> +  @retval FALSE   One or more incompatible structures present.
> +**/
> +BOOLEAN
> +EFIAPI
> +ValidateAcpiStructCounts (
> +  IN  CONST ACPI_STRUCT_DATABASE* StructDb
> +  );
> +
> +/**
> +  Parse the ACPI structure with the type value given according to 
> +instructions
> +  defined in the ACPI structure database.
> +
> +  If the input structure type is defined in the database, increment 
> + structure's  instance count.
> +
> +  If ACPI_PARSER array is used to parse the input structure, the 
> + index of the  structure (instance count for the type before update) 
> + gets printed alongside  the structure name. This helps debugging if 
> + there are many instances of the  type in a table. For 
> + ACPI_STRUCT_PARSER_FUNC, the printing of the index must  be 
> + implemented
> separately.
> +
> +  @param [in]     Indent    Number of spaces to indent the output.
> +  @param [in]     Ptr       Ptr to the start of the structure.
> +  @param [in,out] StructDb  ACPI structure database with instructions on how
> +                            parse every structure type.
> +  @param [in]     Offset    Structure offset from the start of the table.
> +  @param [in]     Type      ACPI-defined structure type.
> +  @param [in]     Length    Length of the structure in bytes.
> +  @param [in]     OptArg0   First optional argument to pass to parser function.
> +  @param [in]     OptArg1   Second optional argument to pass to parser function.
> +
> +  @retval TRUE    ACPI structure parsed successfully.
> +  @retval FALSE   Undefined structure type or insufficient data to parse.
> +**/
> +BOOLEAN
> +EFIAPI
> +ParseAcpiStruct (
> +  IN            UINT32                 Indent,
> +  IN            UINT8*                 Ptr,
> +  IN OUT        ACPI_STRUCT_DATABASE*  StructDb,
> +  IN            UINT32                 Offset,
> +  IN            UINT32                 Type,
> +  IN            UINT32                 Length,
> +  IN      CONST VOID*                  OptArg0 OPTIONAL,
> +  IN      CONST VOID*                  OptArg1 OPTIONAL
> +  );
> +
>  /**
>    A structure used to store the pointers to the members of the
>    ACPI description header structure that was parsed.
> --
> 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'





  reply	other threads:[~2020-06-11 11:49 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-05 15:45 [PATCH v1 0/6] ShellPkg: acpiview: Refactor ACPI table parsing loops Krzysztof Koch
2020-05-05 15:45 ` [PATCH v1 1/6] ShellPkg: acpiview: Add interface for data-driven table parsing Krzysztof Koch
2020-06-11  7:42   ` Gao, Zhichao
2020-06-11 11:49     ` Tomas Pilar (tpilar) [this message]
2020-05-05 15:46 ` [PATCH v1 2/6] ShellPkg: acpiview: Make MADT parsing logic data driven Krzysztof Koch
2020-05-05 15:46 ` [PATCH v1 3/6] ShellPkg: acpiview: Make SRAT " Krzysztof Koch
2020-05-05 15:46 ` [PATCH v1 4/6] ShellPkg: acpiview: Make GTDT " Krzysztof Koch
2020-06-11  7:46   ` Gao, Zhichao
2020-05-05 15:46 ` [PATCH v1 5/6] ShellPkg: acpiview: Make IORT " Krzysztof Koch
2020-05-05 15:46 ` [PATCH v1 6/6] ShellPkg: acpiview: Make PPTT " Krzysztof Koch

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=AM5PR0801MB1844578E5CEBF5D82AE89721E7800@AM5PR0801MB1844.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