public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v2-resend 0/2] Add AEST parser support to Acpiview
@ 2020-11-03 14:32 Sami Mujawar
  2020-11-03 14:32 ` [PATCH v2-resend 1/2] MdePkg/IndustryStandard: AEST Table definition Sami Mujawar
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Sami Mujawar @ 2020-11-03 14:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, michael.d.kinney, gaoliming, zhiguang.liu, ray.ni,
	zhichao.gao, Matteo.Carlini, Ben.Adderson, nd

Resending v2 patch series with Bugzilla IDs added. No code change
since v2 patch seiries.

Arm Error Source Table (AEST) enables kernel-first handling of
errors in a system that supports the Armv8 RAS extensions. AEST
is described in the ACPI for the Armv8 RAS Extensions 1.1,
Platform Design Document, dated 28 September 2020.
(https://developer.arm.com/documentation/den0085/0101/)

This v2 patch series:
 - adds AEST parser support to Acpiview.
 - addresses the review feedback for v1 series.

The changes can be seen at:
https://github.com/samimujawar/edk2/tree/1429_aest_parser_v2

Marc Moisson-Franckhauser (2):
  MdePkg/IndustryStandard: AEST Table definition
  ShellPkg/Acpiview: AEST Parser

 MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h                        | 357 +++++++++
 ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h                    |  21 +
 ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h               |   4 +-
 ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Aest/AestParser.c       | 755 ++++++++++++++++++++
 ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c   |   4 +-
 ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf |   3 +-
 ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.uni |   3 +-
 7 files changed, 1142 insertions(+), 5 deletions(-)
 create mode 100644 MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h
 create mode 100644 ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Aest/AestParser.c

-- 
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2-resend 1/2] MdePkg/IndustryStandard: AEST Table definition
  2020-11-03 14:32 [PATCH v2-resend 0/2] Add AEST parser support to Acpiview Sami Mujawar
@ 2020-11-03 14:32 ` Sami Mujawar
  2020-11-03 14:32 ` [PATCH v2-resend 2/2] ShellPkg/Acpiview: AEST Parser Sami Mujawar
  2020-12-17  9:34 ` [PATCH v2-resend 0/2] Add AEST parser support to Acpiview Sami Mujawar
  2 siblings, 0 replies; 7+ messages in thread
From: Sami Mujawar @ 2020-11-03 14:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, michael.d.kinney, gaoliming, zhiguang.liu, ray.ni,
	zhichao.gao, ard.biesheuvel, Matteo.Carlini, Ben.Adderson, nd

From: Marc Moisson-Franckhauser <marc.moisson-franckhauser@arm.com>

Bugzilla: 3049 (https://bugzilla.tianocore.org/show_bug.cgi?id=3049)

Add definition for the Arm Error Source Table (AEST) described in
the ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document,
dated 28 September 2020.
(https://developer.arm.com/documentation/den0085/0101/)

Signed-off-by: Marc Moisson-Franckhauser <marc.moisson-franckhauser@arm.com>
Signed-off-by: Sami Mujawar <sami.mujawar@arm.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
---

Notes:
    v2:
     - AEST is not defined in ACPI 6.3 spec and should not be      [Liming]
       added to Acpi63.h and for structure definition and its
       field, its comment starts with /// or //.
     - Moved AEST table signature to ArmErrorSourceTable.h and      [SAMI]
       updated structure and field documenting style to match
       coding convention.
       Ref: https://edk2.groups.io/g/devel/message/66151

 MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h | 357 ++++++++++++++++++++
 1 file changed, 357 insertions(+)

diff --git a/MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h b/MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h
new file mode 100644
index 0000000000000000000000000000000000000000..369b03a50b65a7f6d0012eec9898a14dcd61976d
--- /dev/null
+++ b/MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h
@@ -0,0 +1,357 @@
+/** @file
+  Arm Error Source Table as described in the
+  'ACPI for the Armv8 RAS Extensions 1.1' Specification.
+
+  Copyright (c) 2020 Arm Limited.
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Reference(s):
+    - ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document,
+      dated 28 September 2020.
+      (https://developer.arm.com/documentation/den0085/0101/)
+
+  @par Glossary
+    - Ref : Reference
+    - Id  : Identifier
+**/
+
+#ifndef ARM_ERROR_SOURCE_TABLE_H_
+#define ARM_ERROR_SOURCE_TABLE_H_
+
+///
+/// "AEST" Arm Error Source Table
+///
+#define EFI_ACPI_6_3_ARM_ERROR_SOURCE_TABLE_SIGNATURE  SIGNATURE_32('A', 'E', 'S', 'T')
+
+#define EFI_ACPI_ARM_ERROR_SOURCE_TABLE_REVISION  1
+
+#pragma pack(1)
+
+///
+/// Arm Error Source Table definition.
+///
+typedef struct {
+  EFI_ACPI_DESCRIPTION_HEADER Header;
+} EFI_ACPI_ARM_ERROR_SOURCE_TABLE;
+
+///
+/// AEST Node structure.
+///
+typedef struct {
+  /// Node type:
+  ///   0x00 - Processor error node
+  ///   0x01 - Memory error node
+  ///   0x02 - SMMU error node
+  ///   0x03 - Vendor-defined error node
+  ///   0x04 - GIC error node
+  UINT8   Type;
+
+  /// Length of structure in bytes.
+  UINT16  Length;
+
+  /// Reserved - Must be zero.
+  UINT8   Reserved;
+
+  /// Offset from the start of the node to node-specific data.
+  UINT32  DataOffset;
+
+  /// Offset from the start of the node to the node interface structure.
+  UINT32  InterfaceOffset;
+
+  /// Offset from the start of the node to node interrupt array.
+  UINT32  InterruptArrayOffset;
+
+  /// Number of entries in the interrupt array.
+  UINT32  InterruptArrayCount;
+
+  // Generic node data
+
+  /// The timestamp frequency of the counter in Hz.
+  UINT64  TimestampRate;
+
+  /// Reserved - Must be zero.
+  UINT64  Reserved1;
+
+  /// The rate in Hz at which the Error Generation Counter decrements.
+  UINT64  ErrorInjectionCountdownRate;
+} EFI_ACPI_AEST_NODE_STRUCT;
+
+// AEST Node type definitions
+#define EFI_ACPI_AEST_NODE_TYPE_PROCESSOR       0x0
+#define EFI_ACPI_AEST_NODE_TYPE_MEMORY          0x1
+#define EFI_ACPI_AEST_NODE_TYPE_SMMU            0x2
+#define EFI_ACPI_AEST_NODE_TYPE_VENDOR_DEFINED  0x3
+#define EFI_ACPI_AEST_NODE_TYPE_GIC             0x4
+
+///
+/// AEST Node Interface structure.
+///
+typedef struct {
+  /// Interface type:
+  ///   0x0 - System register (SR)
+  ///   0x1 - Memory mapped (MMIO)
+  UINT8   Type;
+
+  /// Reserved - Must be zero.
+  UINT8   Reserved[3];
+
+  /// AEST node interface flags.
+  UINT32  Flags;
+
+  /// Base address of error group that contains the error node.
+  UINT64  BaseAddress;
+
+  /// Zero-based index of the first standard error record that
+  /// belongs to this node.
+  UINT32  StartErrorRecordIndex;
+
+  /// Number of error records in this node including both
+  /// implemented and unimplemented records.
+  UINT32  NumberErrorRecords;
+
+  /// A bitmap indicating the error records within this
+  /// node that are implemented in the current system.
+  UINT64  ErrorRecordImplemented;
+
+  /// A bitmap indicating the error records within this node that
+  /// support error status reporting through the ERRGSR register.
+  UINT64  ErrorRecordStatusReportingSupported;
+
+  /// A bitmap indicating the addressing mode used by each error
+  /// record within this node to populate the ERR<n>_ADDR register.
+ UINT64   AddressingMode;
+} EFI_ACPI_AEST_INTERFACE_STRUCT;
+
+// AEST Interface node type definitions.
+#define EFI_ACPI_AEST_INTERFACE_TYPE_SR   0x0
+#define EFI_ACPI_AEST_INTERFACE_TYPE_MMIO 0x1
+
+// AEST node interface flag definitions.
+#define EFI_ACPI_AEST_INTERFACE_FLAG_PRIVATE        0
+#define EFI_ACPI_AEST_INTERFACE_FLAG_SHARED         BIT0
+#define EFI_ACPI_AEST_INTERFACE_FLAG_CLEAR_MISCX    BIT1
+
+///
+/// AEST Node Interrupt structure.
+///
+typedef struct {
+  /// Interrupt type:
+  ///   0x0 - Fault Handling Interrupt
+  ///   0x1 - Error Recovery Interrupt
+  UINT8   InterruptType;
+
+  /// Reserved - Must be zero.
+  UINT8   Reserved[2];
+
+  /// Interrupt flags
+  /// Bits [31:1]: Must be zero.
+  /// Bit 0:
+  ///   0b - Interrupt is edge-triggered
+  ///   1b - Interrupt is level-triggered
+  UINT8   InterruptFlags;
+
+  /// GSIV of interrupt, if interrupt is an SPI or a PPI.
+  UINT32  InterruptGsiv;
+
+  /// If MSI is supported, then this field must be set to the
+  /// Identifier field of the IORT ITS Group node.
+  UINT8   ItsGroupRefId;
+
+  /// Reserved - must be zero.
+  UINT8   Reserved1[3];
+} EFI_ACPI_AEST_INTERRUPT_STRUCT;
+
+// AEST Interrupt node - interrupt type defintions.
+#define EFI_ACPI_AEST_INTERRUPT_TYPE_FAULT_HANDLING       0x0
+#define EFI_ACPI_AEST_INTERRUPT_TYPE_ERROR_RECOVERY       0x1
+
+// AEST Interrupt node - interrupt flag defintions.
+#define EFI_ACPI_AEST_INTERRUPT_FLAG_TRIGGER_TYPE_EDGE    0
+#define EFI_ACPI_AEST_INTERRUPT_FLAG_TRIGGER_TYPE_LEVEL   BIT0
+
+///
+/// Cache Processor Resource structure.
+///
+typedef struct {
+  /// Reference to the cache structure in the PPTT table.
+  UINT32  CacheRefId;
+
+  /// Reserved
+  UINT32  Reserved;
+} EFI_ACPI_AEST_PROCESSOR_CACHE_RESOURCE_STRUCT;
+
+///
+/// TLB Processor Resource structure.
+///
+typedef struct {
+  /// TLB level from perspective of current processor.
+  UINT32  TlbRefId;
+
+  /// Reserved
+  UINT32  Reserved;
+} EFI_ACPI_AEST_PROCESSOR_TLB_RESOURCE_STRUCT;
+
+///
+/// Processor Generic Resource structure.
+///
+typedef struct {
+  /// Vendor-defined supplementary data.
+  UINT32  Data;
+} EFI_ACPI_AEST_PROCESSOR_GENERIC_RESOURCE_STRUCT;
+
+///
+/// AEST Processor Resource union.
+///
+typedef union {
+  /// Processor Cache resource.
+  EFI_ACPI_AEST_PROCESSOR_CACHE_RESOURCE_STRUCT   Cache;
+
+  /// Processor TLB resource.
+  EFI_ACPI_AEST_PROCESSOR_TLB_RESOURCE_STRUCT     Tlb;
+
+  /// Processor Generic resource.
+  EFI_ACPI_AEST_PROCESSOR_GENERIC_RESOURCE_STRUCT Generic;
+} EFI_ACPI_AEST_PROCESSOR_RESOURCE;
+
+///
+/// AEST Processor structure.
+///
+typedef struct {
+  /// AEST Node header
+  EFI_ACPI_AEST_NODE_STRUCT   NodeHeader;
+
+  /// Processor ID of node.
+  UINT32  AcpiProcessorId;
+
+  /// Resource type of the processor node.
+  ///   0x0 - Cache
+  ///   0x1 - TLB
+  ///   0x2 - Generic
+  UINT8   ResourceType;
+
+  /// Reserved - must be zero.
+  UINT8   Reserved;
+
+  /// Processor structure flags.
+  UINT8   Flags;
+
+  /// Processor structure revision.
+  UINT8   Revision;
+
+  /// Processor affinity descriptor for the resource that this
+  /// error node pertains to.
+  UINT64  ProcessorAffinityLevelIndicator;
+
+  /// Processor resource
+  EFI_ACPI_AEST_PROCESSOR_RESOURCE  Resource;
+
+  // Node Interface
+  // EFI_ACPI_AEST_INTERFACE_STRUCT   NodeInterface;
+
+  // Node Interrupt Array
+  // EFI_ACPI_AEST_INTERRUPT_STRUCT   NodeInterruptArray[n];
+} EFI_ACPI_AEST_PROCESSOR_STRUCT;
+
+// AEST Processor resource type definitions.
+#define EFI_ACPI_AEST_PROCESSOR_RESOURCE_TYPE_CACHE   0x0
+#define EFI_ACPI_AEST_PROCESSOR_RESOURCE_TYPE_TLB     0x1
+#define EFI_ACPI_AEST_PROCESSOR_RESOURCE_TYPE_GENERIC 0x2
+
+// AEST Processor flag definitions.
+#define EFI_ACPI_AEST_PROCESSOR_FLAG_GLOBAL           BIT0
+#define EFI_ACPI_AEST_PROCESSOR_FLAG_SHARED           BIT1
+
+///
+/// Memory Controller structure.
+///
+typedef struct {
+  /// AEST Node header
+  EFI_ACPI_AEST_NODE_STRUCT   NodeHeader;
+
+  /// SRAT proximity domain.
+  UINT32  ProximityDomain;
+
+  // Node Interface
+  // EFI_ACPI_AEST_INTERFACE_STRUCT   NodeInterface;
+
+  // Node Interrupt Array
+  // EFI_ACPI_AEST_INTERRUPT_STRUCT   NodeInterruptArray[n];
+} EFI_ACPI_AEST_MEMORY_CONTROLLER_STRUCT;
+
+///
+/// SMMU structure.
+///
+typedef struct {
+  /// AEST Node header
+  EFI_ACPI_AEST_NODE_STRUCT   NodeHeader;
+
+  /// Reference to the IORT table node that describes this SMMU.
+  UINT32  SmmuRefId;
+
+  /// Reference to the IORT table node that is associated with the
+  /// sub-component within this SMMU.
+  UINT32  SubComponentRefId;
+
+  // Node Interface
+  // EFI_ACPI_AEST_INTERFACE_STRUCT   NodeInterface;
+
+  // Node Interrupt Array
+  // EFI_ACPI_AEST_INTERRUPT_STRUCT   NodeInterruptArray[n];
+} EFI_ACPI_AEST_SMMU_STRUCT;
+
+///
+/// Vendor-Defined structure.
+///
+typedef struct {
+  /// AEST Node header
+  EFI_ACPI_AEST_NODE_STRUCT   NodeHeader;
+
+  /// ACPI HID of the component.
+  UINT32  HardwareId;
+
+  /// The ACPI Unique identifier of the component.
+  UINT32  UniqueId;
+
+  /// Vendor-specific data, for example to identify this error source.
+  UINT8   VendorData[16];
+
+  // Node Interface
+  // EFI_ACPI_AEST_INTERFACE_STRUCT   NodeInterface;
+
+  // Node Interrupt Array
+  // EFI_ACPI_AEST_INTERRUPT_STRUCT   NodeInterruptArray[n];
+} EFI_ACPI_AEST_VENDOR_DEFINED_STRUCT;
+
+///
+/// GIC structure.
+///
+typedef struct {
+  /// AEST Node header
+  EFI_ACPI_AEST_NODE_STRUCT   NodeHeader;
+
+  /// Type of GIC interface that is associated with this error node.
+  ///   0x0 - GIC CPU (GICC)
+  ///   0x1 - GIC Distributor (GICD)
+  ///   0x2 - GIC Resistributor (GICR)
+  ///   0x3 - GIC ITS (GITS)
+  UINT32  InterfaceType;
+
+  /// Identifier for the interface instance.
+  UINT32  GicInterfaceRefId;
+
+  // Node Interface
+  // EFI_ACPI_AEST_INTERFACE_STRUCT   NodeInterface;
+
+  // Node Interrupt Array
+  // EFI_ACPI_AEST_INTERRUPT_STRUCT   NodeInterruptArray[n];
+} EFI_ACPI_AEST_GIC_STRUCT;
+
+// AEST GIC interface type definitions.
+#define EFI_ACPI_AEST_GIC_INTERFACE_TYPE_GICC   0x0
+#define EFI_ACPI_AEST_GIC_INTERFACE_TYPE_GICD   0x1
+#define EFI_ACPI_AEST_GIC_INTERFACE_TYPE_GICR   0x2
+#define EFI_ACPI_AEST_GIC_INTERFACE_TYPE_GITS   0x3
+
+#pragma pack()
+
+#endif // ARM_ERROR_SOURCE_TABLE_H_
-- 
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2-resend 2/2] ShellPkg/Acpiview: AEST Parser
  2020-11-03 14:32 [PATCH v2-resend 0/2] Add AEST parser support to Acpiview Sami Mujawar
  2020-11-03 14:32 ` [PATCH v2-resend 1/2] MdePkg/IndustryStandard: AEST Table definition Sami Mujawar
@ 2020-11-03 14:32 ` Sami Mujawar
  2020-12-17  9:34 ` [PATCH v2-resend 0/2] Add AEST parser support to Acpiview Sami Mujawar
  2 siblings, 0 replies; 7+ messages in thread
From: Sami Mujawar @ 2020-11-03 14:32 UTC (permalink / raw)
  To: devel; +Cc: Sami Mujawar, ray.ni, zhichao.gao, Matteo.Carlini, Ben.Adderson,
	nd

From: Marc Moisson-Franckhauser <marc.moisson-franckhauser@arm.com>

Bugzilla: 3048 (https://bugzilla.tianocore.org/show_bug.cgi?id=3048)

Add a new parser for the Arm Error Source Table (AEST) described in
the ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document,
dated 28 September 2020.
(https://developer.arm.com/documentation/den0085/0101/)

AEST enables kernel-first handling of errors in a system that supports
the Armv8 RAS extensions. It covers Armv8.2+ RAS extensions for PEs
and the RAS system architecture for non-PE system components.

Signed-off-by: Marc Moisson-Franckhauser <marc.moisson-franckhauser@arm.com>
Signed-off-by: Sami Mujawar <sami.mujawar@arm.com>
---

Notes:
    v2:
      - Minor update to include ArmErrorSourceTable.h to obtain      [SAMI]
        the AEST signature macro definition.

 ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h                    |  21 +
 ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h               |   4 +-
 ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Aest/AestParser.c       | 755 ++++++++++++++++++++
 ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c   |   4 +-
 ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf |   3 +-
 ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.uni |   3 +-
 6 files changed, 785 insertions(+), 5 deletions(-)

diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h
index f81ccac7e118378aa185db4b625e5bcd75f78347..41acd77b1890b6f8efea823843d43220dea63f67 100644
--- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h
+++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h
@@ -462,6 +462,27 @@ ParseAcpiHeader (
   );
 
 /**
+  This function parses the ACPI AEST table.
+  When trace is enabled this function parses the AEST table and
+  traces the ACPI table fields.
+
+  This function also performs validation of the ACPI table fields.
+
+  @param [in] Trace              If TRUE, trace the ACPI fields.
+  @param [in] Ptr                Pointer to the start of the buffer.
+  @param [in] AcpiTableLength    Length of the ACPI table.
+  @param [in] AcpiTableRevision  Revision of the ACPI table.
+**/
+VOID
+EFIAPI
+ParseAcpiAest (
+  IN BOOLEAN Trace,
+  IN UINT8*  Ptr,
+  IN UINT32  AcpiTableLength,
+  IN UINT8   AcpiTableRevision
+  );
+
+/**
   This function parses the ACPI BGRT table.
   When trace is enabled this function parses the BGRT table and
   traces the ACPI table fields.
diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h
index 4f92596b90a6ee422d8d0959881015ffd3de4da0..0ebf79fb653ae3a8190273aee452723c6213eb58 100644
--- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h
+++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h
@@ -1,7 +1,7 @@
 /** @file
   Header file for ACPI table parser
 
-  Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
+  Copyright (c) 2016 - 2020, Arm Limited. All rights reserved.
   SPDX-License-Identifier: BSD-2-Clause-Patent
 **/
 
@@ -11,7 +11,7 @@
 /**
   The maximum number of ACPI table parsers.
 */
-#define MAX_ACPI_TABLE_PARSERS          16
+#define MAX_ACPI_TABLE_PARSERS          32
 
 /** An invalid/NULL signature value.
 */
diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Aest/AestParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Aest/AestParser.c
new file mode 100644
index 0000000000000000000000000000000000000000..7aa8c8fd2167822f4f5e0f6e4067195aac510e5c
--- /dev/null
+++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Aest/AestParser.c
@@ -0,0 +1,755 @@
+/** @file
+  AEST table parser
+
+  Copyright (c) 2020, Arm Limited.
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Reference(s):
+    - ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document,
+      dated 28 September 2020.
+      (https://developer.arm.com/documentation/den0085/0101/)
+**/
+
+#include <Library/PrintLib.h>
+#include <Library/UefiLib.h>
+#include <IndustryStandard/ArmErrorSourceTable.h>
+#include "AcpiParser.h"
+#include "AcpiView.h"
+#include "AcpiViewConfig.h"
+
+// Local variables
+STATIC ACPI_DESCRIPTION_HEADER_INFO AcpiHdrInfo;
+STATIC UINT8*                       AestNodeType;
+STATIC UINT16*                      AestNodeLength;
+STATIC UINT32*                      NodeDataOffset;
+STATIC UINT32*                      NodeInterfaceOffset;
+STATIC UINT32*                      NodeInterruptArrayOffset;
+STATIC UINT32*                      NodeInterruptCount;
+STATIC UINT32*                      ProcessorId;
+STATIC UINT8*                       ProcessorFlags;
+STATIC UINT8*                       ProcessorResourceType;
+
+/**
+  Validate Processor Flags.
+
+  @param [in] Ptr       Pointer to the start of the field data.
+  @param [in] Context   Pointer to context specific information e.g. this
+                        could be a pointer to the ACPI table header.
+**/
+STATIC
+VOID
+EFIAPI
+ValidateProcessorFlags (
+  IN UINT8* Ptr,
+  IN VOID*  Context
+  )
+{
+  // If the global or shared node flag is set then the ACPI Processor ID
+  // field must be set to 0 and ignored.
+  if (((*Ptr & 0x3) != 0) && (*ProcessorId != 0)) {
+    IncrementErrorCount ();
+    Print (L"\nERROR: 'ACPI Processor ID' field must be set to 0 for global"
+           L" or shared nodes.");
+  }
+}
+
+/**
+  Validate GIC Interface Type.
+
+  @param [in] Ptr       Pointer to the start of the field data.
+  @param [in] Context   Pointer to context specific information e.g. this
+                        could be a pointer to the ACPI table header.
+**/
+STATIC
+VOID
+EFIAPI
+ValidateGicInterfaceType (
+  IN UINT8* Ptr,
+  IN VOID*  Context
+  )
+{
+  UINT32 GicInterfaceType;
+
+  GicInterfaceType = *(UINT32*)Ptr;
+  if (GicInterfaceType > 3) {
+    IncrementErrorCount ();
+    Print (L"\nError: Invalid GIC Interface type %d", GicInterfaceType);
+  }
+}
+
+/**
+  Validate Interface Type.
+
+  @param [in] Ptr       Pointer to the start of the field data.
+  @param [in] Context   Pointer to context specific information e.g. this
+                        could be a pointer to the ACPI table header.
+**/
+STATIC
+VOID
+EFIAPI
+ValidateInterfaceType (
+  IN UINT8* Ptr,
+  IN VOID*  Context
+  )
+{
+  if (*Ptr > 1) {
+    IncrementErrorCount ();
+    Print (L"\nError: Interface type should be 0 or 1");
+  }
+}
+
+/**
+  Validate Interrupt Type.
+
+  @param [in] Ptr       Pointer to the start of the field data.
+  @param [in] Context   Pointer to context specific information e.g. this
+                        could be a pointer to the ACPI table header.
+**/
+STATIC
+VOID
+EFIAPI
+ValidateInterruptType (
+  IN UINT8* Ptr,
+  IN VOID*  Context
+  )
+{
+  if (*Ptr > 1) {
+    IncrementErrorCount ();
+    Print (L"\nError: Interrupt type should be 0 or 1");
+  }
+}
+
+/**
+  Validate interrupt flags.
+
+  @param [in] Ptr       Pointer to the start of the field data.
+  @param [in] Context   Pointer to context specific information e.g. this
+                        could be a pointer to the ACPI table header.
+**/
+STATIC
+VOID
+EFIAPI
+ValidateInterruptFlags (
+  IN UINT8* Ptr,
+  IN VOID*  Context
+  )
+{
+  if ((*Ptr & 0xfe) != 0) {
+    IncrementErrorCount ();
+    Print (L"\nError: Reserved Flag bits not set to 0");
+  }
+}
+
+/**
+  Dumps 16 bytes of data.
+
+  @param [in] Format  Optional format string for tracing the data.
+  @param [in] Ptr     Pointer to the start of the buffer.
+**/
+VOID
+EFIAPI
+DumpVendorSpecificData (
+  IN CONST CHAR16* Format OPTIONAL,
+  IN UINT8*        Ptr
+  )
+{
+  Print (
+    L"%02X %02X %02X %02X %02X %02X %02X %02X\n",
+    Ptr[0],
+    Ptr[1],
+    Ptr[2],
+    Ptr[3],
+    Ptr[4],
+    Ptr[5],
+    Ptr[6],
+    Ptr[7]
+    );
+
+  Print (
+    L"%*a   %02X %02X %02X %02X %02X %02X %02X %02X",
+    OUTPUT_FIELD_COLUMN_WIDTH,
+    "",
+    Ptr[8],
+    Ptr[9],
+    Ptr[10],
+    Ptr[11],
+    Ptr[12],
+    Ptr[13],
+    Ptr[14],
+    Ptr[15]
+    );
+}
+
+/**
+  An ACPI_PARSER array describing the ACPI AEST Table.
+**/
+STATIC CONST ACPI_PARSER AestParser[] = {
+  PARSE_ACPI_HEADER (&AcpiHdrInfo)
+};
+
+/**
+  An ACPI_PARSER array describing the AEST Node Header.
+**/
+STATIC CONST ACPI_PARSER AestNodeHeaderParser[] = {
+  {L"Type", 1, 0, L"%d", NULL, (VOID**)&AestNodeType, NULL, NULL},
+  {L"Length", 2, 1, L"%d", NULL, (VOID**)&AestNodeLength, NULL, NULL},
+  {L"Reserved", 1, 3, L"0x%x", NULL, NULL, NULL, NULL},
+  {L"Node Data Offset", 4, 4, L"%d", NULL, (VOID**)&NodeDataOffset, NULL, NULL},
+  {L"Node Interface Offset", 4, 8, L"%d", NULL,
+    (VOID**)&NodeInterfaceOffset, NULL, NULL},
+  {L"Node Interrupt Array Offset", 4, 12, L"%d", NULL,
+    (VOID**)&NodeInterruptArrayOffset, NULL, NULL},
+  {L"Node Interrupt Count", 4, 16, L"%d", NULL,
+    (VOID**)&NodeInterruptCount, NULL, NULL},
+  {L"Timestamp Rate", 8, 20, L"%ld", NULL, NULL, NULL, NULL},
+  {L"Reserved1", 8, 28, L"0x%lx", NULL, NULL, NULL, NULL},
+  {L"Error Injection Countdown Rate", 8, 36, L"%ld", NULL, NULL, NULL, NULL}
+  // Node specific data...
+  // Node interface...
+  // Node interrupt array...
+};
+
+/**
+  An ACPI_PARSER array describing the Processor error node specific data.
+**/
+STATIC CONST ACPI_PARSER AestProcessorStructure[] = {
+  {L"ACPI Processor ID", 4, 0, L"0x%x", NULL, (VOID**)&ProcessorId, NULL, NULL},
+  {L"Resource Type", 1, 4, L"%d", NULL, (VOID**)&ProcessorResourceType, NULL,
+    NULL},
+  {L"Reserved", 1, 5, L"0x%x", NULL, NULL, NULL, NULL},
+  {L"Flags", 1, 6, L"0x%x", NULL, (VOID**)&ProcessorFlags,
+    ValidateProcessorFlags, NULL},
+  {L"Revision", 1, 7, L"%d", NULL, NULL, NULL, NULL},
+  {L"Processor Affinity Level Indicator", 8, 8, L"0x%lx", NULL, NULL, NULL,
+    NULL},
+  // Resource specific data...
+};
+
+/**
+  An ACPI_PARSER array describing the processor cache resource substructure.
+**/
+STATIC CONST ACPI_PARSER AestProcessorCacheResourceSubstructure[] = {
+  {L"Cache reference ID", 4, 0, L"0x%x", NULL, NULL, NULL, NULL},
+  {L"Reserved", 4, 4, L"%d", NULL, NULL, NULL, NULL}
+};
+
+/**
+  An ACPI_PARSER array describing the processor TLB resource substructure.
+**/
+STATIC CONST ACPI_PARSER AestProcessorTlbResourceSubstructure[] = {
+  {L"TLB reference ID", 4, 0, L"0x%x", NULL, NULL, NULL, NULL},
+  {L"Reserved", 4, 4, L"%d", NULL, NULL, NULL, NULL}
+};
+
+/**
+  An ACPI_PARSER array describing the processor generic resource substructure.
+**/
+STATIC CONST ACPI_PARSER AestProcessorGenericResourceSubstructure[] = {
+  {L"Vendor-defined data", 4, 0, L"%x", NULL, NULL, NULL, NULL}
+};
+
+/**
+  An ACPI_PARSER array describing the memory controller structure.
+**/
+STATIC CONST ACPI_PARSER AestMemoryControllerStructure[] = {
+  {L"Proximity Domain", 4, 0, L"0x%x", NULL, NULL, NULL, NULL}
+};
+
+/**
+  An ACPI_PARSER array describing the SMMU structure.
+**/
+STATIC CONST ACPI_PARSER AestSmmuStructure[] = {
+  {L"IORT Node reference ID", 4, 0, L"0x%x", NULL, NULL, NULL, NULL},
+  {L"SubComponent reference ID", 4, 4, L"0x%x", NULL, NULL, NULL, NULL}
+};
+
+/**
+  An ACPI_PARSER array describing the vendor-defined structure.
+**/
+STATIC CONST ACPI_PARSER AestVendorDefinedStructure[] = {
+  {L"Hardware ID", 4, 0, L"0x%x", NULL, NULL, NULL, NULL},
+  {L"Unique ID", 4, 4, L"0x%x", NULL, NULL, NULL, NULL},
+  {L"Vendor-specific data", 16, 8, NULL, DumpVendorSpecificData, NULL, NULL}
+};
+
+/**
+  An ACPI_PARSER array describing the GIC structure.
+**/
+STATIC CONST ACPI_PARSER AestGicStructure[] = {
+  {L"GIC Interface Type", 4, 0, L"0x%x", NULL, NULL, ValidateGicInterfaceType,
+    NULL},
+  {L"GIC Interface reference ID", 4, 4, L"0x%x", NULL, NULL, NULL, NULL}
+};
+
+/**
+  An ACPI_PARSER array describing the node interface.
+**/
+STATIC CONST ACPI_PARSER AestNodeInterface[] = {
+  {L"Interface Type", 1, 0, L"%d", NULL, NULL, ValidateInterfaceType, NULL},
+  {L"Reserved", 3, 1, L"%x %x %x", Dump3Chars, NULL, NULL, NULL},
+  {L"Flags", 4, 4, L"0x%x", NULL, NULL, NULL, NULL},
+  {L"Base Address", 8, 8, L"0x%lx", NULL, NULL, NULL, NULL},
+  {L"Start Error Record Index", 4, 16, L"0x%x", NULL, NULL, NULL, NULL},
+  {L"Number of Error Records", 4, 20, L"0x%x", NULL, NULL, NULL, NULL},
+  {L"Error Records Implemented", 8, 24, L"0x%lx", NULL, NULL, NULL, NULL},
+  {L"Error Records Support", 8, 32, L"0x%lx", NULL, NULL, NULL, NULL},
+  {L"Addressing mode", 8, 40, L"0x%lx", NULL, NULL, NULL, NULL}
+};
+
+/**
+  An ACPI_PARSER array describing the node interrupts.
+**/
+STATIC CONST ACPI_PARSER AestNodeInterrupt[] = {
+  {L"Interrupt Type", 1, 0, L"%d", NULL, NULL, ValidateInterruptType, NULL},
+  {L"Reserved", 2, 1, L"0x%x", NULL, NULL, NULL, NULL},
+  {L"Interrupt Flags", 1, 3, L"0x%x", NULL, NULL, ValidateInterruptFlags, NULL},
+  {L"Interrupt GSIV", 4, 4, L"0x%x", NULL, NULL, NULL, NULL},
+  {L"ID", 1, 8, L"0x%x", NULL, NULL, NULL, NULL},
+  {L"Reserved1", 3, 9, L"%x %x %x", Dump3Chars, NULL, NULL, NULL}
+};
+
+/**
+  Parses the Processor Error Node structure along with its resource
+  specific data.
+
+  @param [in] Ptr     Pointer to the start of the Processor node.
+  @param [in] Length  Maximum length of the Processor node.
+**/
+STATIC
+VOID
+DumpProcessorNode (
+  IN UINT8* Ptr,
+  IN UINT32 Length
+  )
+{
+  UINT32 Offset;
+
+  Offset = ParseAcpi (
+             TRUE,
+             2,
+             "Processor",
+             Ptr,
+             Length,
+             PARSER_PARAMS (AestProcessorStructure)
+             );
+
+  // Check if the values used to control the parsing logic have been
+  // successfully read.
+  if ((ProcessorId == NULL)           ||
+      (ProcessorResourceType == NULL) ||
+      (ProcessorFlags == NULL)) {
+    IncrementErrorCount ();
+    Print (
+      L"ERROR: Insufficient Processor Error Node length. Length = %d.\n",
+      Length
+      );
+    return;
+  }
+
+  switch (*ProcessorResourceType) {
+    case EFI_ACPI_AEST_PROCESSOR_RESOURCE_TYPE_CACHE:
+      ParseAcpi (
+        TRUE,
+        2,
+        "Cache Resource",
+        Ptr + Offset,
+        Length - Offset,
+        PARSER_PARAMS (AestProcessorCacheResourceSubstructure)
+        );
+      break;
+    case EFI_ACPI_AEST_PROCESSOR_RESOURCE_TYPE_TLB:
+      ParseAcpi (
+        TRUE,
+        2,
+        "TLB Resource",
+        Ptr + Offset,
+        Length - Offset,
+        PARSER_PARAMS (AestProcessorTlbResourceSubstructure)
+        );
+      break;
+    case EFI_ACPI_AEST_PROCESSOR_RESOURCE_TYPE_GENERIC:
+      ParseAcpi (
+        TRUE,
+        2,
+        "Generic Resource",
+        Ptr + Offset,
+        Length - Offset,
+        PARSER_PARAMS (AestProcessorGenericResourceSubstructure)
+        );
+      break;
+    default:
+      IncrementErrorCount ();
+      Print (L"ERROR: Invalid Processor Resource Type.");
+      return;
+  } // switch
+}
+
+/**
+  Parses the Memory Controller node.
+
+  @param [in] Ptr     Pointer to the start of the Memory Controller node.
+  @param [in] Length  Maximum length of the Memory Controller node.
+**/
+STATIC
+VOID
+DumpMemoryControllerNode (
+  IN UINT8* Ptr,
+  IN UINT32 Length
+  )
+{
+  ParseAcpi (
+    TRUE,
+    2,
+    "Memory Controller",
+    Ptr,
+    Length,
+    PARSER_PARAMS (AestMemoryControllerStructure)
+    );
+}
+
+/**
+  Parses the SMMU node.
+
+  @param [in] Ptr     Pointer to the start of the SMMU node.
+  @param [in] Length  Maximum length of the SMMU node.
+**/
+STATIC
+VOID
+DumpSmmuNode (
+  IN UINT8* Ptr,
+  IN UINT32 Length
+  )
+{
+  ParseAcpi (
+    TRUE,
+    2,
+    "SMMU",
+    Ptr,
+    Length,
+    PARSER_PARAMS (AestSmmuStructure)
+    );
+}
+
+/**
+  Parses the Vendor-defined structure.
+
+  @param [in] Ptr     Pointer to the start of the Vendor-defined node.
+  @param [in] Length  Maximum length of the Vendor-defined node.
+**/
+STATIC
+VOID
+DumpVendorDefinedNode (
+  IN UINT8* Ptr,
+  IN UINT32 Length
+  )
+{
+  ParseAcpi (
+    TRUE,
+    2,
+    "Vendor-defined",
+    Ptr,
+    Length,
+    PARSER_PARAMS (AestVendorDefinedStructure)
+    );
+}
+
+/**
+  Parses the GIC node.
+
+  @param [in] Ptr     Pointer to the start of the GIC node.
+  @param [in] Length  Maximum length of the GIC node.
+**/
+STATIC
+VOID
+DumpGicNode (
+  IN UINT8* Ptr,
+  IN UINT32 Length
+  )
+{
+  ParseAcpi (
+    TRUE,
+    2,
+    "GIC",
+    Ptr,
+    Length,
+    PARSER_PARAMS (AestGicStructure)
+    );
+}
+
+/**
+  Parses the Node Interface structure.
+
+  @param [in] Ptr     Pointer to the start of the Node Interface Structure.
+  @param [in] Length  Maximum length of the Node Interface Structure.
+**/
+STATIC
+VOID
+DumpNodeInterface (
+  IN UINT8* Ptr,
+  IN UINT32 Length
+  )
+{
+  ParseAcpi (
+    TRUE,
+    2,
+    "Node Interface",
+    Ptr,
+    Length,
+    PARSER_PARAMS (AestNodeInterface)
+    );
+}
+
+/**
+  Parses the Node Interrupts Structure.
+
+  @param [in] Ptr             Pointer to the start of the Node Interrupt array.
+  @param [in] Length          Maximum length of the Node Interrupt array.
+  @param [in] InterruptCount  Number if interrupts in the Node Interrupts array.
+**/
+STATIC
+VOID
+DumpNodeInterrupts (
+  IN UINT8* Ptr,
+  IN UINT32 Length,
+  IN UINT32 InterruptCount
+  )
+{
+  UINT32 Offset;
+  UINT32 Index;
+  CHAR8  Buffer[64];
+
+  if (Length < (InterruptCount * sizeof (EFI_ACPI_AEST_INTERRUPT_STRUCT))) {
+    IncrementErrorCount ();
+    Print (
+      L"ERROR: Node not long enough for Interrupt Array.\n"\
+      L"       Length left = %d, Required = %d, Interrupt Count = %d\n",
+      Length,
+      (InterruptCount * sizeof (EFI_ACPI_AEST_INTERRUPT_STRUCT)),
+      InterruptCount
+      );
+    return;
+  }
+
+  Offset = 0;
+  for (Index = 0; Index < InterruptCount; Index++) {
+    AsciiSPrint (
+      Buffer,
+      sizeof (Buffer),
+      "Node Interrupt [%d]",
+      Index
+      );
+
+    Offset += ParseAcpi (
+                TRUE,
+                4,
+                Buffer,
+                Ptr + Offset,
+                Length - Offset,
+                PARSER_PARAMS (AestNodeInterrupt)
+                );
+  } //for
+}
+
+/**
+  Parses a single AEST Node Structure.
+
+  @param [in] Ptr                   Pointer to the start of the Node.
+  @param [in] Length                Maximum length of the Node.
+  @param [in] NodeType              AEST node type.
+  @param [in] DataOffset            Offset to the node data.
+  @param [in] InterfaceOffset       Offset to the node interface data.
+  @param [in] InterruptArrayOffset  Offset to the node interrupt array.
+  @param [in] InterruptCount        Number of interrupts.
+**/
+STATIC
+VOID
+DumpAestNodeStructure (
+  IN UINT8*  Ptr,
+  IN UINT32  Length,
+  IN UINT8   NodeType,
+  IN UINT32  DataOffset,
+  IN UINT32  InterfaceOffset,
+  IN UINT32  InterruptArrayOffset,
+  IN UINT32  InterruptCount
+  )
+{
+  UINT32 Offset;
+  UINT32 RemainingLength;
+  UINT8* NodeDataPtr;
+
+  Offset = ParseAcpi (
+             TRUE,
+             2,
+             "Node Structure",
+             Ptr,
+             Length,
+             PARSER_PARAMS (AestNodeHeaderParser)
+             );
+
+  if ((Offset > DataOffset) || (DataOffset > Length)) {
+    IncrementErrorCount ();
+    Print (
+      L"ERROR: Invalid Node Data Offset: %d.\n"\
+      L"       It should be between %d and %d.\n",
+      DataOffset,
+      Offset,
+      Length
+      );
+  }
+
+  if ((Offset > InterfaceOffset) || (InterfaceOffset > Length)) {
+    IncrementErrorCount ();
+    Print (
+      L"ERROR: Invalid Node Interface Offset: %d.\n"\
+      L"       It should be between %d and %d.\n",
+      InterfaceOffset,
+      Offset,
+      Length
+      );
+  }
+
+  if ((Offset > InterruptArrayOffset) || (InterruptArrayOffset > Length)) {
+    IncrementErrorCount ();
+    Print (
+      L"ERROR: Invalid Node Interrupt Array Offset: %d.\n"\
+      L"       It should be between %d and %d.\n",
+      InterruptArrayOffset,
+      Offset,
+      Length
+      );
+  }
+
+  // Parse Node Data Field.
+  NodeDataPtr = Ptr + DataOffset;
+  RemainingLength = Length - DataOffset;
+  switch (NodeType) {
+    case EFI_ACPI_AEST_NODE_TYPE_PROCESSOR:
+      DumpProcessorNode (NodeDataPtr, RemainingLength);
+      break;
+    case EFI_ACPI_AEST_NODE_TYPE_MEMORY:
+      DumpMemoryControllerNode (NodeDataPtr, RemainingLength);
+      break;
+    case EFI_ACPI_AEST_NODE_TYPE_SMMU:
+      DumpSmmuNode (NodeDataPtr, RemainingLength);
+      break;
+    case EFI_ACPI_AEST_NODE_TYPE_VENDOR_DEFINED:
+      DumpVendorDefinedNode (NodeDataPtr, RemainingLength);
+      break;
+    case EFI_ACPI_AEST_NODE_TYPE_GIC:
+      DumpGicNode (NodeDataPtr, RemainingLength);
+      break;
+    default:
+      IncrementErrorCount ();
+      Print (L"ERROR: Invalid Error Node Type.\n");
+      return;
+  } // switch
+
+  // Parse the Interface Field.
+  DumpNodeInterface (
+    Ptr + InterfaceOffset,
+    Length - InterfaceOffset
+    );
+
+  // Parse the Node Interrupt Array.
+  DumpNodeInterrupts (
+    Ptr + InterruptArrayOffset,
+    Length - InterruptArrayOffset,
+    InterruptCount
+    );
+
+  return;
+}
+
+/**
+  This function parses the ACPI AEST table.
+  When trace is enabled this function parses the AEST table and
+  traces the ACPI table fields.
+
+  This function also performs validation of the ACPI table fields.
+
+  @param [in] Trace              If TRUE, trace the ACPI fields.
+  @param [in] Ptr                Pointer to the start of the buffer.
+  @param [in] AcpiTableLength    Length of the ACPI table.
+  @param [in] AcpiTableRevision  Revision of the ACPI table.
+**/
+VOID
+EFIAPI
+ParseAcpiAest (
+  IN BOOLEAN Trace,
+  IN UINT8*  Ptr,
+  IN UINT32  AcpiTableLength,
+  IN UINT8   AcpiTableRevision
+  )
+{
+  UINT32  Offset;
+  UINT8*  NodePtr;
+
+  if (!Trace) {
+    return;
+  }
+
+  Offset = ParseAcpi (
+             TRUE,
+             0,
+             "AEST",
+             Ptr,
+             AcpiTableLength,
+             PARSER_PARAMS (AestParser)
+             );
+
+  while (Offset < AcpiTableLength) {
+    NodePtr = Ptr + Offset;
+
+    ParseAcpi (
+      FALSE,
+      0,
+      NULL,
+      NodePtr,
+      AcpiTableLength - Offset,
+      PARSER_PARAMS (AestNodeHeaderParser)
+      );
+
+    // Check if the values used to control the parsing logic have been
+    // successfully read.
+    if ((AestNodeType == NULL)             ||
+        (AestNodeLength == NULL)           ||
+        (NodeDataOffset == NULL)           ||
+        (NodeInterfaceOffset == NULL)      ||
+        (NodeInterruptArrayOffset == NULL) ||
+        (NodeInterruptCount == NULL)) {
+      IncrementErrorCount ();
+      Print (
+        L"ERROR: Insufficient length left for Node Structure.\n"\
+        L"       Length left = %d.\n",
+        AcpiTableLength - Offset
+        );
+      return;
+    }
+
+    // Validate AEST Node length
+    if ((*AestNodeLength == 0) ||
+        ((Offset + (*AestNodeLength)) > AcpiTableLength)) {
+      IncrementErrorCount ();
+      Print (
+        L"ERROR: Invalid AEST Node length. " \
+          L"Length = %d. Offset = %d. AcpiTableLength = %d.\n",
+        *AestNodeLength,
+        Offset,
+        AcpiTableLength
+        );
+      return;
+    }
+
+    DumpAestNodeStructure (
+      NodePtr,
+      *AestNodeLength,
+      *AestNodeType,
+      *NodeDataOffset,
+      *NodeInterfaceOffset,
+      *NodeInterruptArrayOffset,
+      *NodeInterruptCount
+      );
+
+    Offset += *AestNodeLength;
+  } // while
+}
diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c
index d2f26ff89f12e596702281c38ab0de3729aa68e4..502bdcf30be50579bc5a4de30b71dc8a44fd55ae 100644
--- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c
+++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c
@@ -1,12 +1,13 @@
 /** @file
   Main file for 'acpiview' Shell command function.
 
-  Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.<BR>
+  Copyright (c) 2016 - 2020, Arm Limited. All rights reserved.<BR>
   SPDX-License-Identifier: BSD-2-Clause-Patent
 **/
 
 #include <Guid/ShellLibHiiGuid.h>
 #include <IndustryStandard/Acpi.h>
+#include <IndustryStandard/ArmErrorSourceTable.h>
 
 #include <Library/BaseMemoryLib.h>
 #include <Library/HiiLib.h>
@@ -46,6 +47,7 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
 STATIC
 CONST
 ACPI_TABLE_PARSER ParserList[] = {
+  {EFI_ACPI_6_3_ARM_ERROR_SOURCE_TABLE_SIGNATURE, ParseAcpiAest},
   {EFI_ACPI_6_2_BOOT_GRAPHICS_RESOURCE_TABLE_SIGNATURE, ParseAcpiBgrt},
   {EFI_ACPI_6_2_DEBUG_PORT_2_TABLE_SIGNATURE, ParseAcpiDbg2},
   {EFI_ACPI_6_2_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,
diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf
index 91459f9ec632635ee453c5ef46f67445cd9eee0c..d89cfbba0da833d5c945ebeb0b462fa52504a865 100644
--- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf
+++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf
@@ -1,7 +1,7 @@
 ##  @file
 # Provides Shell 'acpiview' command functions
 #
-# Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.<BR>
+# Copyright (c) 2016 - 2020, Arm Limited. All rights reserved.<BR>
 #
 #  SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -27,6 +27,7 @@ [Sources.common]
   AcpiView.h
   AcpiViewConfig.c
   AcpiViewConfig.h
+  Parsers/Aest/AestParser.c
   Parsers/Bgrt/BgrtParser.c
   Parsers/Dbg2/Dbg2Parser.c
   Parsers/Dsdt/DsdtParser.c
diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.uni b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.uni
index 7cd43d0518fd0a23dc547a5cab0d08b62602a113..9dbffcd7c534fa9039668cfbe79f75d3a94c9b28 100644
--- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.uni
+++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.uni
@@ -1,6 +1,6 @@
 // /**
 //
-// Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.<BR>
+// Copyright (c) 2016 - 2020, Arm Limited. All rights reserved.<BR>
 // SPDX-License-Identifier: BSD-2-Clause-Patent
 //
 // Module Name:
@@ -78,6 +78,7 @@
 "     other than AcpiTable header. The actual header can refer to the ACPI spec\r\n"
 "     6.2\r\n"
 "     Extra A. Particular types:\r\n"
+"       AEST  - Arm Error Source Table\r\n"
 "       APIC  - Multiple APIC Description Table (MADT)\r\n"
 "       BGRT  - Boot Graphics Resource Table\r\n"
 "       DBG2  - Debug Port Table 2\r\n"
-- 
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v2-resend 0/2] Add AEST parser support to Acpiview
  2020-11-03 14:32 [PATCH v2-resend 0/2] Add AEST parser support to Acpiview Sami Mujawar
  2020-11-03 14:32 ` [PATCH v2-resend 1/2] MdePkg/IndustryStandard: AEST Table definition Sami Mujawar
  2020-11-03 14:32 ` [PATCH v2-resend 2/2] ShellPkg/Acpiview: AEST Parser Sami Mujawar
@ 2020-12-17  9:34 ` Sami Mujawar
  2020-12-28  3:12   ` [edk2-devel] " Gao, Zhichao
  2 siblings, 1 reply; 7+ messages in thread
From: Sami Mujawar @ 2020-12-17  9:34 UTC (permalink / raw)
  To: Sami Mujawar, devel@edk2.groups.io
  Cc: michael.d.kinney@intel.com, gaoliming@byosoft.com.cn,
	zhiguang.liu@intel.com, ray.ni@intel.com, zhichao.gao@intel.com,
	Matteo Carlini, Ben Adderson, nd

Hi Zhichao,

May I have your feedback for this series, please?

I have raised two Bugzilla tickets for these patches:
 - Bug 3049 - Add defintion for Arm Error Source Table (AEST) [https://bugzilla.tianocore.org/show_bug.cgi?id=3049]
 - Bug 3048 - Acpiview: Add support for parsing Arm Error Source Table (AEST) [https://bugzilla.tianocore.org/show_bug.cgi?id=3048]

The links for these patches on the mailing list are as below:
 - https://edk2.groups.io/g/devel/message/66928
- https://edk2.groups.io/g/devel/message/66929
- https://edk2.groups.io/g/devel/message/66930

Regards,

Sami Mujawar

-----Original Message-----
From: Sami Mujawar <sami.mujawar@arm.com> 
Sent: 03 November 2020 02:32 PM
To: devel@edk2.groups.io
Cc: Sami Mujawar <Sami.Mujawar@arm.com>; michael.d.kinney@intel.com; gaoliming@byosoft.com.cn; zhiguang.liu@intel.com; ray.ni@intel.com; zhichao.gao@intel.com; Matteo Carlini <Matteo.Carlini@arm.com>; Ben Adderson <Ben.Adderson@arm.com>; nd <nd@arm.com>
Subject: [PATCH v2-resend 0/2] Add AEST parser support to Acpiview

Resending v2 patch series with Bugzilla IDs added. No code change
since v2 patch seiries.

Arm Error Source Table (AEST) enables kernel-first handling of
errors in a system that supports the Armv8 RAS extensions. AEST
is described in the ACPI for the Armv8 RAS Extensions 1.1,
Platform Design Document, dated 28 September 2020.
(https://developer.arm.com/documentation/den0085/0101/)

This v2 patch series:
 - adds AEST parser support to Acpiview.
 - addresses the review feedback for v1 series.

The changes can be seen at:
https://github.com/samimujawar/edk2/tree/1429_aest_parser_v2

Marc Moisson-Franckhauser (2):
  MdePkg/IndustryStandard: AEST Table definition
  ShellPkg/Acpiview: AEST Parser

 MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h                        | 357 +++++++++
 ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h                    |  21 +
 ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h               |   4 +-
 ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Aest/AestParser.c       | 755 ++++++++++++++++++++
 ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c   |   4 +-
 ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf |   3 +-
 ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.uni |   3 +-
 7 files changed, 1142 insertions(+), 5 deletions(-)
 create mode 100644 MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h
 create mode 100644 ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Aest/AestParser.c

-- 
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [edk2-devel] [PATCH v2-resend 0/2] Add AEST parser support to Acpiview
  2020-12-17  9:34 ` [PATCH v2-resend 0/2] Add AEST parser support to Acpiview Sami Mujawar
@ 2020-12-28  3:12   ` Gao, Zhichao
  2021-01-07 12:32     ` Sami Mujawar
  0 siblings, 1 reply; 7+ messages in thread
From: Gao, Zhichao @ 2020-12-28  3:12 UTC (permalink / raw)
  To: devel@edk2.groups.io, sami.mujawar@arm.com
  Cc: Kinney, Michael D, gaoliming@byosoft.com.cn, Liu, Zhiguang,
	Ni, Ray, Matteo Carlini, Ben Adderson, nd

For #1 and #2, Reviewed-by: Zhichao Gao <zhichao.gao@intel.com>

Thanks,
Zhichao

> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Sami
> Mujawar
> Sent: Thursday, December 17, 2020 5:34 PM
> To: Sami Mujawar <Sami.Mujawar@arm.com>; devel@edk2.groups.io
> Cc: Kinney, Michael D <michael.d.kinney@intel.com>;
> gaoliming@byosoft.com.cn; Liu, Zhiguang <zhiguang.liu@intel.com>; Ni, Ray
> <ray.ni@intel.com>; Gao, Zhichao <zhichao.gao@intel.com>; Matteo Carlini
> <Matteo.Carlini@arm.com>; Ben Adderson <Ben.Adderson@arm.com>; nd
> <nd@arm.com>
> Subject: Re: [edk2-devel] [PATCH v2-resend 0/2] Add AEST parser support to
> Acpiview
> 
> Hi Zhichao,
> 
> May I have your feedback for this series, please?
> 
> I have raised two Bugzilla tickets for these patches:
>  - Bug 3049 - Add defintion for Arm Error Source Table (AEST)
> [https://bugzilla.tianocore.org/show_bug.cgi?id=3049]
>  - Bug 3048 - Acpiview: Add support for parsing Arm Error Source Table (AEST)
> [https://bugzilla.tianocore.org/show_bug.cgi?id=3048]
> 
> The links for these patches on the mailing list are as below:
>  - https://edk2.groups.io/g/devel/message/66928
> - https://edk2.groups.io/g/devel/message/66929
> - https://edk2.groups.io/g/devel/message/66930
> 
> Regards,
> 
> Sami Mujawar
> 
> -----Original Message-----
> From: Sami Mujawar <sami.mujawar@arm.com>
> Sent: 03 November 2020 02:32 PM
> To: devel@edk2.groups.io
> Cc: Sami Mujawar <Sami.Mujawar@arm.com>; michael.d.kinney@intel.com;
> gaoliming@byosoft.com.cn; zhiguang.liu@intel.com; ray.ni@intel.com;
> zhichao.gao@intel.com; Matteo Carlini <Matteo.Carlini@arm.com>; Ben
> Adderson <Ben.Adderson@arm.com>; nd <nd@arm.com>
> Subject: [PATCH v2-resend 0/2] Add AEST parser support to Acpiview
> 
> Resending v2 patch series with Bugzilla IDs added. No code change since v2
> patch seiries.
> 
> Arm Error Source Table (AEST) enables kernel-first handling of errors in a system
> that supports the Armv8 RAS extensions. AEST is described in the ACPI for the
> Armv8 RAS Extensions 1.1, Platform Design Document, dated 28 September 2020.
> (https://developer.arm.com/documentation/den0085/0101/)
> 
> This v2 patch series:
>  - adds AEST parser support to Acpiview.
>  - addresses the review feedback for v1 series.
> 
> The changes can be seen at:
> https://github.com/samimujawar/edk2/tree/1429_aest_parser_v2
> 
> Marc Moisson-Franckhauser (2):
>   MdePkg/IndustryStandard: AEST Table definition
>   ShellPkg/Acpiview: AEST Parser
> 
>  MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h                        | 357
> +++++++++
>  ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h                    |  21 +
>  ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h               |   4
> +-
>  ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Aest/AestParser.c       |
> 755 ++++++++++++++++++++
> 
> ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c
> |   4 +-
> 
> ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.i
> nf |   3 +-
> 
> ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.
> uni |   3 +-
>  7 files changed, 1142 insertions(+), 5 deletions(-)  create mode 100644
> MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h
>  create mode 100644
> ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Aest/AestParser.c
> 
> --
> 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'
> 
> 
> 
> 
> 


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [edk2-devel] [PATCH v2-resend 0/2] Add AEST parser support to Acpiview
  2020-12-28  3:12   ` [edk2-devel] " Gao, Zhichao
@ 2021-01-07 12:32     ` Sami Mujawar
  2021-01-08  3:13       ` Gao, Zhichao
  0 siblings, 1 reply; 7+ messages in thread
From: Sami Mujawar @ 2021-01-07 12:32 UTC (permalink / raw)
  To: Gao, Zhichao, devel

[-- Attachment #1: Type: text/plain, Size: 108 bytes --]

Hi Zhichao,

Is there anything else needed before this series can be merged?

Regards,

Sami Mujawar

[-- Attachment #2: Type: text/html, Size: 132 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [edk2-devel] [PATCH v2-resend 0/2] Add AEST parser support to Acpiview
  2021-01-07 12:32     ` Sami Mujawar
@ 2021-01-08  3:13       ` Gao, Zhichao
  0 siblings, 0 replies; 7+ messages in thread
From: Gao, Zhichao @ 2021-01-08  3:13 UTC (permalink / raw)
  To: Sami Mujawar, devel@edk2.groups.io, Kinney, Michael D,
	gaoliming@byosoft.com.cn

[-- Attachment #1: Type: text/plain, Size: 414 bytes --]

On my side, no. I would create a PR later.

Thanks,
Zhichao

From: Sami Mujawar <sami.mujawar@arm.com>
Sent: Thursday, January 7, 2021 8:32 PM
To: Gao; Gao, Zhichao <zhichao.gao@intel.com>; devel@edk2.groups.io
Subject: Re: [edk2-devel] [PATCH v2-resend 0/2] Add AEST parser support to Acpiview

Hi Zhichao,

Is there anything else needed before this series can be merged?

Regards,

Sami Mujawar

[-- Attachment #2: Type: text/html, Size: 2533 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-01-08  3:13 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-11-03 14:32 [PATCH v2-resend 0/2] Add AEST parser support to Acpiview Sami Mujawar
2020-11-03 14:32 ` [PATCH v2-resend 1/2] MdePkg/IndustryStandard: AEST Table definition Sami Mujawar
2020-11-03 14:32 ` [PATCH v2-resend 2/2] ShellPkg/Acpiview: AEST Parser Sami Mujawar
2020-12-17  9:34 ` [PATCH v2-resend 0/2] Add AEST parser support to Acpiview Sami Mujawar
2020-12-28  3:12   ` [edk2-devel] " Gao, Zhichao
2021-01-07 12:32     ` Sami Mujawar
2021-01-08  3:13       ` Gao, Zhichao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox