public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [Patch] AdvancedFeaturePkg/AcpiDebug: Add new AcpiDebug modules.
@ 2019-04-01  3:16 Eric Dong
  2019-04-01  3:26 ` Dong, Eric
  2019-04-01 16:52 ` Laszlo Ersek
  0 siblings, 2 replies; 4+ messages in thread
From: Eric Dong @ 2019-04-01  3:16 UTC (permalink / raw)
  To: edk2-devel; +Cc: Hao Wu, Michael Kubacki

Add new AcpiDebug modules which provide ACPI Debug feature.
Detail about this feature see the readme.txt in the patch.

Change-Id: Ib977ece46f3494301574b04af32282b99045f673
Cc: Hao Wu <hao.a.wu@intel.com>
Cc: Michael Kubacki <michael.a.kubacki@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Eric Dong <eric.dong@intel.com>
---
 .../AcpiDebug/AcpiDebug.asl                   | 109 ++++
 .../AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c  | 485 ++++++++++++++++++
 .../AcpiDebug/AcpiDebugDxe.inf                |  63 +++
 .../AcpiDebug/AcpiDebugSmm.inf                |  65 +++
 .../AdvancedFeaturePkg/AcpiDebug/Readme.txt   |  47 ++
 .../AdvancedFeaturePkg/AdvancedFeaturePkg.dec |   6 +
 .../AdvancedFeaturePkg/AdvancedFeaturePkg.dsc |   2 +
 7 files changed, 777 insertions(+)
 create mode 100644 Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.asl
 create mode 100644 Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c
 create mode 100644 Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugDxe.inf
 create mode 100644 Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugSmm.inf
 create mode 100644 Platform/Intel/AdvancedFeaturePkg/AcpiDebug/Readme.txt

diff --git a/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.asl b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.asl
new file mode 100644
index 0000000..62d2a1b
--- /dev/null
+++ b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.asl
@@ -0,0 +1,109 @@
+/** @file
+  Acpi Debug ASL code.
+
+Copyright (c) 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
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+DefinitionBlock (
+  "AcpiDebug.aml",
+  "SSDT",
+  2,
+  "Intel ",
+  "ADebTabl",
+  0x1000
+  )
+{
+  Scope(\)
+  {
+    //
+    // These pointers are patched during POST.
+    //
+    Name (DPTR, 0x80000000) // Address of Acpi debug memory buffer, fixed up during POST
+    Name (EPTR, 0x80000000) // End of Acpi debug memory buffer, fixed up during POST
+    Name (CPTR, 0x80000000) // Current pointer used as an index into the buffer(starts after the Acpi Debug head), fixed up during POST
+
+    //
+    // Use a Mutex to prevent multiple calls from simutaneously writing to the same memory.
+    //
+    Mutex (MMUT, 0)
+
+    //
+    // Operational region for SMI port access
+    //
+    OperationRegion (ADBP, SystemIO, 0xB2, 2)
+    Field (ADBP, ByteAcc, NoLock, Preserve)
+    {
+        B2PT, 8,
+        B3PT, 8,
+    }
+
+    //
+    // Write a string to a memory buffer
+    //
+    Method (MDBG, 1, Serialized)
+    {
+      OperationRegion (ADHD, SystemMemory, DPTR, 32) // Operation region for Acpi Debug buffer first 0x20 bytes
+      Field (ADHD, ByteAcc, NoLock, Preserve)
+      {
+        Offset (0x0),
+        ASIG, 128,      // 16 bytes is Signature
+        Offset (0x10),
+        ASIZ, 32,       // 4 bytes is buffer size
+        ACHP, 32,       // 4 bytes is current head pointer, normally is DPTR + 0x20,
+                        //   if there's SMM handler to print, then it's the starting of the info hasn't been printed yet.
+        ACTP, 32,       // 4 bytes is current tail pointer, is the same as CPTR
+        SMIN, 8,        // 1 byte of SMI Number for trigger callback
+        WRAP, 8,        // 1 byte of wrap status
+        SMMV, 8,        // 1 byte of SMM version status
+        TRUN, 8         // 1 byte of truncate status
+      }
+
+      Store (Acquire (MMUT, 1000), Local0) // save Acquire result so we can check for Mutex acquired
+      If (LEqual (Local0, Zero)) // check for Mutex acquired
+      {
+        OperationRegion (ABLK, SystemMemory, CPTR, 32) // Operation region to allow writes to ACPI debug buffer
+        Field (ABLK, ByteAcc, NoLock, Preserve)
+        {
+          Offset (0x0),
+          AAAA, 256 // 32 bytes is max size for string or data
+        }
+        ToHexString (Arg0, Local1) // convert argument to Hexadecimal String
+        Store (0, TRUN)
+        If (LGreaterEqual (SizeOf (Local1), 32))
+        {
+          Store (1, TRUN) // the input from ASL >= 32
+        }
+        Mid (Local1, 0, 31, AAAA) // extract the input to current buffer
+
+        Add (CPTR, 32, CPTR) // advance current pointer to next string location in memory buffer
+        If (LGreaterEqual (CPTR, EPTR) ) // check for end of 64kb Acpi debug buffer
+        {
+          Add (DPTR, 32, CPTR) // wrap around to beginning of buffer if the end has been reached
+          Store (1, WRAP)
+        }
+        Store (CPTR, ACTP)
+
+        If (SMMV)
+        {
+          //
+          // Triggle the SMI to print
+          //
+          Store (SMIN, B2PT)
+        }
+        Release (MMUT)
+      }
+
+      Return (Local0) // return error code indicating whether Mutex was acquired
+    }
+
+  } // End Scope
+} // End SSDT
+
diff --git a/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c
new file mode 100644
index 0000000..ce9b59d
--- /dev/null
+++ b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c
@@ -0,0 +1,485 @@
+/** @file
+  Smbios basic entry point.
+
+Copyright (c) 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 that accompanies this distribution.
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+
+#include <Uefi.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/DxeServicesLib.h>
+#include <Protocol/AcpiTable.h>
+#include <IndustryStandard/Acpi.h>
+
+#include <Protocol/SmmBase2.h>
+#include <Protocol/SmmEndOfDxe.h>
+#include <Protocol/SmmSwDispatch2.h>
+
+#define ACPI_DEBUG_STR      "INTEL ACPI DEBUG"
+
+//
+// ASL NAME structure
+//
+#pragma pack(1)
+typedef struct {
+  UINT8  NameOp;            // Byte [0]=0x08:NameOp.
+  UINT32 NameString;        // Byte [4:1]=Name of object.
+  UINT8  DWordPrefix;       // Byte [5]=0x0C:DWord Prefix.
+  UINT32 Value;             // 0 ; Value of named object.
+} NAME_LAYOUT;
+#pragma pack()
+
+#pragma pack(1)
+typedef struct {
+  UINT8  Signature[16];     // "INTEL ACPI DEBUG"
+  UINT32 BufferSize;        // Total size of Acpi Debug buffer including header structure
+  UINT32 Head;              // Current buffer pointer for SMM to print out
+  UINT32 Tail;              // Current buffer pointer for ASL to input
+  UINT8  SmiTrigger;        // Value to trigger the SMI via B2 port
+  UINT8  Wrap;              // If current Tail < Head
+  UINT8  SmmVersion;        // If SMM version
+  UINT8  Truncate;          // If the input from ASL > MAX_BUFFER_SIZE
+} ACPI_DEBUG_HEAD;
+#pragma pack()
+
+#define AD_SIZE             sizeof (ACPI_DEBUG_HEAD) // This is 0x20
+
+#define MAX_BUFFER_SIZE     32
+
+UINT32                      mBufferEnd = 0;
+ACPI_DEBUG_HEAD             *mAcpiDebug = NULL;
+
+EFI_SMM_SYSTEM_TABLE2       *mSmst = NULL;
+
+/**
+  Patch and load ACPI table.
+
+  @param[in] AcpiDebugAddress   Address of Acpi debug memory buffer.
+  @param[in] BufferIndex        Index that starts after the Acpi Debug head.
+  @param[in] BufferEnd          End of Acpi debug memory buffer.
+
+**/
+VOID
+PatchAndLoadAcpiTable (
+  IN ACPI_DEBUG_HEAD            *AcpiDebugAddress,
+  IN UINT32                     BufferIndex,
+  IN UINT32                     BufferEnd
+  )
+{
+  EFI_STATUS                    Status;
+  EFI_ACPI_TABLE_PROTOCOL       *AcpiTable;
+  UINTN                         Size;
+  EFI_ACPI_DESCRIPTION_HEADER   *TableHeader;
+  UINTN                         TableKey;
+  UINT8                         *CurrPtr;
+  UINT32                        *Signature;
+  NAME_LAYOUT                   *NamePtr;
+  UINT8                         UpdateCounter;
+
+  Status = GetSectionFromFv (
+             &gEfiCallerIdGuid,
+             EFI_SECTION_RAW,
+             0,
+             (VOID **) &TableHeader,
+             &Size
+             );
+  ASSERT_EFI_ERROR (Status);
+
+  //
+  // This is Acpi Debug SSDT. Acpi Debug should be enabled if we reach here so load the table.
+  //
+  ASSERT (((EFI_ACPI_DESCRIPTION_HEADER *) TableHeader)->OemTableId == SIGNATURE_64 ('A', 'D', 'e', 'b', 'T', 'a', 'b', 'l'));
+
+  //
+  // Patch some pointers for the ASL code before loading the SSDT.
+  //
+
+  //
+  // Count pointer updates, so we can stop after all three pointers are patched.
+  //
+  UpdateCounter = 1;
+  for (CurrPtr = (UINT8 *) TableHeader; CurrPtr <= ((UINT8 *) TableHeader + TableHeader->Length) && UpdateCounter < 4; CurrPtr++) {
+    Signature = (UINT32 *) (CurrPtr + 1);
+    //
+    // patch DPTR (address of Acpi debug memory buffer)
+    //
+    if ((*CurrPtr == AML_NAME_OP) && *Signature == SIGNATURE_32 ('D', 'P', 'T', 'R')) {
+      NamePtr = (NAME_LAYOUT *) CurrPtr;
+      NamePtr->Value  = (UINT32) (UINTN) AcpiDebugAddress;
+      UpdateCounter++;
+    }
+    //
+    // patch EPTR (end of Acpi debug memory buffer)
+    //
+    if ((*CurrPtr == AML_NAME_OP) && *Signature == SIGNATURE_32 ('E', 'P', 'T', 'R')) {
+      NamePtr = (NAME_LAYOUT *) CurrPtr;
+      NamePtr->Value  = BufferEnd;
+      UpdateCounter++;
+    }
+    //
+    // patch CPTR (used as an index that starts after the Acpi Debug head)
+    //
+    if ((*CurrPtr == AML_NAME_OP) && *Signature == SIGNATURE_32 ('C', 'P', 'T', 'R')) {
+      NamePtr = (NAME_LAYOUT *) CurrPtr;
+      NamePtr->Value  = BufferIndex;
+      UpdateCounter++;
+    }
+  }
+
+  //
+  // Add the table
+  //
+  Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **)&AcpiTable);
+  ASSERT_EFI_ERROR (Status);
+
+  TableKey = 0;
+  Status = AcpiTable->InstallAcpiTable (
+                        AcpiTable,
+                        TableHeader,
+                        Size,
+                        &TableKey
+                        );
+  ASSERT_EFI_ERROR (Status);
+
+  gBS->FreePool (TableHeader);
+  return ;
+}
+
+/**
+  Allocate Acpi Debug memory.
+
+  @param[out] BufferSize    Pointer to Acpi debug memory buffer size.
+
+  @return Address of Acpi debug memory buffer. 0 if PcdAcpiDebugEnable is FALSE.
+
+**/
+EFI_PHYSICAL_ADDRESS
+AllocateAcpiDebugMemory (
+  OUT UINT32           *BufferSize
+  )
+{
+  EFI_STATUS           Status;
+  EFI_PHYSICAL_ADDRESS AcpiDebugAddress;
+
+  AcpiDebugAddress = 0;
+  *BufferSize = 0;
+
+  if (PcdGetBool (PcdAcpiDebugEnable)) {
+    //
+    // Reserve memory to store Acpi Debug data.
+    //
+    AcpiDebugAddress = 0xFFFFFFFF;
+    Status = gBS->AllocatePages (
+                    AllocateMaxAddress,
+                    EfiReservedMemoryType,
+                    EFI_SIZE_TO_PAGES (PcdGet32 (PcdAcpiDebugBufferSize)),
+                    &AcpiDebugAddress
+                    );
+    ASSERT_EFI_ERROR(Status);
+
+    DEBUG ((DEBUG_INFO, "AcpiDebugAddress - 0x%08x\n", AcpiDebugAddress));
+
+    Status = PcdSet32S (PcdAcpiDebugAddress, (UINT32) AcpiDebugAddress);
+    ASSERT_EFI_ERROR(Status);
+    *BufferSize = PcdGet32 (PcdAcpiDebugBufferSize);
+  }
+
+  return AcpiDebugAddress;
+}
+
+/**
+  Acpi Debug EndOfDxe notification.
+
+  @param[in] Event      Event whose notification function is being invoked.
+  @param[in] Context    Pointer to the notification function's context.
+
+**/
+VOID
+EFIAPI
+AcpiDebugEndOfDxeNotification (
+  IN EFI_EVENT  Event,
+  IN VOID       *Context
+  )
+{
+  UINT32        BufferSize;
+  UINT32        BufferIndex;
+
+  mAcpiDebug = (ACPI_DEBUG_HEAD *) (UINTN) AllocateAcpiDebugMemory (&BufferSize);
+  if (mAcpiDebug != NULL) {
+    //
+    // Init ACPI DEBUG buffer to lower case 'x'.
+    //
+    SetMem ((VOID *) mAcpiDebug, BufferSize, 0x78);
+
+    //
+    // Clear header of AD_SIZE bytes.
+    //
+    ZeroMem ((VOID *) mAcpiDebug, AD_SIZE);
+
+    //
+    // Write a signature to the first line of the buffer, "INTEL ACPI DEBUG".
+    //
+    CopyMem ((VOID *) mAcpiDebug, ACPI_DEBUG_STR, sizeof (ACPI_DEBUG_STR) - 1);
+
+    BufferIndex = (UINT32) (UINTN) mAcpiDebug;
+    mBufferEnd = BufferIndex + BufferSize;
+
+    //
+    // Leave the Index after the Acpi Debug head.
+    //
+    BufferIndex += AD_SIZE;
+
+    //
+    // Patch and Load the SSDT ACPI Tables.
+    //
+    PatchAndLoadAcpiTable (mAcpiDebug, BufferIndex, mBufferEnd);
+
+    mAcpiDebug->Head = BufferIndex;
+    mAcpiDebug->Tail = BufferIndex;
+    mAcpiDebug->BufferSize = BufferSize;
+  }
+
+  //
+  // Close event, so it will not be invoked again.
+  //
+  gBS->CloseEvent (Event);
+
+  return ;
+}
+
+/**
+  Initialize ACPI Debug.
+
+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.
+  @param[in] SystemTable    A pointer to the EFI System Table.
+
+  @retval EFI_SUCCESS       The driver initializes correctly.
+
+**/
+EFI_STATUS
+EFIAPI
+InitializeAcpiDebugDxe (
+  IN EFI_HANDLE         ImageHandle,
+  IN EFI_SYSTEM_TABLE   *SystemTable
+  )
+{
+  EFI_STATUS            Status;
+  EFI_EVENT             EndOfDxeEvent;
+
+  //
+  // Register EndOfDxe notification
+  // that point could ensure the Acpi Debug related PCDs initialized.
+  //
+  Status = gBS->CreateEventEx (
+                  EVT_NOTIFY_SIGNAL,
+                  TPL_CALLBACK,
+                  AcpiDebugEndOfDxeNotification,
+                  NULL,
+                  &gEfiEndOfDxeEventGroupGuid,
+                  &EndOfDxeEvent
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Software SMI callback for ACPI Debug which is called from ACPI method.
+
+  @param[in]      DispatchHandle    The unique handle assigned to this handler by SmiHandlerRegister().
+  @param[in]      Context           Points to an optional handler context which was specified when the
+                                    handler was registered.
+  @param[in, out] CommBuffer        A pointer to a collection of data in memory that will
+                                    be conveyed from a non-SMM environment into an SMM environment.
+  @param[in, out] CommBufferSize    The size of the CommBuffer.
+
+  @retval EFI_SUCCESS               The interrupt was handled successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+AcpiDebugSmmCallback (
+  IN EFI_HANDLE     DispatchHandle,
+  IN CONST VOID     *Context,
+  IN OUT VOID       *CommBuffer,
+  IN OUT UINTN      *CommBufferSize
+  )
+{
+  UINT8             Buffer[MAX_BUFFER_SIZE];
+
+  //
+  // Validate the fields in mAcpiDebug to ensure there is no harm to SMI handler.
+  // mAcpiDebug is below 4GB and the start address of whole buffer.
+  //
+  if ((mAcpiDebug->BufferSize != (mBufferEnd - (UINT32) (UINTN) mAcpiDebug)) ||
+      (mAcpiDebug->Head < (UINT32) ((UINTN) mAcpiDebug + AD_SIZE)) ||
+      (mAcpiDebug->Head > mBufferEnd) ||
+      (mAcpiDebug->Tail < (UINT32) ((UINTN) mAcpiDebug + AD_SIZE)) ||
+      (mAcpiDebug->Tail > mBufferEnd)) {
+    //
+    // If some fields in mAcpiDebug are invaid, return directly.
+    //
+    return EFI_SUCCESS;
+  }
+
+  if (!(BOOLEAN)mAcpiDebug->Wrap && ((mAcpiDebug->Head >= (UINT32) ((UINTN) mAcpiDebug + AD_SIZE))
+    && (mAcpiDebug->Head < mAcpiDebug->Tail))){
+    //
+    // If curent ----- buffer + 020
+    //                 ...
+    //                 ... Head
+    //                 ... Data for SMM print
+    //                 ... Tail
+    //                 ... Vacant for ASL input
+    //           ----- buffer end
+    //
+    // skip NULL block
+    //
+    while ((*(CHAR8 *) (UINTN) mAcpiDebug->Head == '\0') && (mAcpiDebug->Head < mAcpiDebug->Tail)) {
+      mAcpiDebug->Head ++;
+    }
+
+    if (mAcpiDebug->Head < mAcpiDebug->Tail){
+      ZeroMem (Buffer, MAX_BUFFER_SIZE);
+      AsciiStrnCpyS ((CHAR8 *) Buffer, MAX_BUFFER_SIZE, (CHAR8 *) (UINTN) mAcpiDebug->Head, MAX_BUFFER_SIZE - 1);
+
+      DEBUG ((DEBUG_INFO | DEBUG_ERROR, "%a%a\n", Buffer, (BOOLEAN)mAcpiDebug->Truncate ? "..." : ""));
+      mAcpiDebug->Head += MAX_BUFFER_SIZE;
+
+      if (mAcpiDebug->Head >= (mAcpiDebug->Tail)){
+        //
+        // When head == tail, we do nothing in handler.
+        //
+        mAcpiDebug->Head = mAcpiDebug->Tail;
+      }
+    }
+  } else if ((BOOLEAN)mAcpiDebug->Wrap && ((mAcpiDebug->Head > mAcpiDebug->Tail)
+    && (mAcpiDebug->Head < (UINT32) ((UINTN) mAcpiDebug + mAcpiDebug->BufferSize)))){
+    //
+    // If curent ----- buffer + 020
+    //                 ... Tail
+    //                 ... Vacant for ASL input
+    //                 ... Head
+    //                 ... Data for SMM print
+    //           ----- buffer end
+    //
+    while((*(CHAR8 *) (UINTN) mAcpiDebug->Head == '\0') && (mAcpiDebug->Head < (UINT32) ((UINTN) mAcpiDebug + mAcpiDebug->BufferSize))) {
+      mAcpiDebug->Head ++;
+    }
+    if (mAcpiDebug->Head < (UINT32) ((UINTN) mAcpiDebug + mAcpiDebug->BufferSize)){
+      ZeroMem (Buffer, MAX_BUFFER_SIZE);
+      AsciiStrnCpyS ((CHAR8 *) Buffer, MAX_BUFFER_SIZE, (CHAR8 *) (UINTN) mAcpiDebug->Head, MAX_BUFFER_SIZE - 1);
+      DEBUG ((DEBUG_INFO | DEBUG_ERROR, "%a%a\n", Buffer, (BOOLEAN)mAcpiDebug->Truncate ? "..." : ""));
+      mAcpiDebug->Head += MAX_BUFFER_SIZE;
+
+      if (mAcpiDebug->Head >= (UINT32) ((UINTN) mAcpiDebug + mAcpiDebug->BufferSize)) {
+        //
+        // We met end of buffer.
+        //
+        mAcpiDebug->Wrap = 0;
+        mAcpiDebug->Head = (UINT32) ((UINTN) mAcpiDebug + AD_SIZE);
+      }
+    }
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Acpi Debug SmmEndOfDxe notification.
+
+  @param[in] Protocol   Points to the protocol's unique identifier.
+  @param[in] Interface  Points to the interface instance.
+  @param[in] Handle     The handle on which the interface was installed.
+
+  @retval EFI_SUCCESS   Notification runs successfully.
+
+ **/
+EFI_STATUS
+EFIAPI
+AcpiDebugSmmEndOfDxeNotification (
+  IN CONST EFI_GUID     *Protocol,
+  IN VOID               *Interface,
+  IN EFI_HANDLE         Handle
+  )
+{
+  EFI_STATUS                        Status;
+  EFI_SMM_SW_DISPATCH2_PROTOCOL     *SwDispatch;
+  EFI_SMM_SW_REGISTER_CONTEXT       SwContext;
+  EFI_HANDLE                        SwHandle;
+
+  AcpiDebugEndOfDxeNotification (NULL, NULL);
+
+  if (mAcpiDebug != NULL) {
+    //
+    // Get the Sw dispatch protocol and register SMI callback function.
+    //
+    SwDispatch = NULL;
+    Status = mSmst->SmmLocateProtocol (&gEfiSmmSwDispatch2ProtocolGuid, NULL, (VOID **) &SwDispatch);
+    ASSERT_EFI_ERROR (Status);
+    SwContext.SwSmiInputValue = (UINTN) -1;
+    Status = SwDispatch->Register (SwDispatch, AcpiDebugSmmCallback, &SwContext, &SwHandle);
+    ASSERT_EFI_ERROR (Status);
+    mAcpiDebug->SmiTrigger = (UINT8) SwContext.SwSmiInputValue;
+    mAcpiDebug->SmmVersion = 1;
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Initialize ACPI Debug.
+
+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.
+  @param[in] SystemTable    A pointer to the EFI System Table.
+
+  @retval EFI_SUCCESS       The driver initializes correctly.
+
+**/
+EFI_STATUS
+EFIAPI
+InitializeAcpiDebugSmm (
+  IN EFI_HANDLE         ImageHandle,
+  IN EFI_SYSTEM_TABLE   *SystemTable
+  )
+{
+  EFI_STATUS                Status;
+  VOID                      *Registration;
+  EFI_SMM_BASE2_PROTOCOL    *SmmBase2;
+  BOOLEAN                   InSmm;
+
+  Status = gBS->LocateProtocol (&gEfiSmmBase2ProtocolGuid, NULL, (VOID **) &SmmBase2);
+  ASSERT_EFI_ERROR (Status);
+  Status = SmmBase2->InSmm (SmmBase2, &InSmm);
+  ASSERT_EFI_ERROR (Status);
+  ASSERT (InSmm);
+  Status = SmmBase2->GetSmstLocation (SmmBase2, &mSmst);
+  ASSERT_EFI_ERROR (Status);
+
+  //
+  // Register SmmEndOfDxe notification
+  // that point could ensure the Acpi Debug related PCDs initialized.
+  //
+  Registration = NULL;
+  Status = mSmst->SmmRegisterProtocolNotify (
+                    &gEfiSmmEndOfDxeProtocolGuid,
+                    AcpiDebugSmmEndOfDxeNotification,
+                    &Registration
+                    );
+  ASSERT_EFI_ERROR (Status);
+
+  return EFI_SUCCESS;
+}
+
diff --git a/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugDxe.inf b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugDxe.inf
new file mode 100644
index 0000000..edfca5e
--- /dev/null
+++ b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugDxe.inf
@@ -0,0 +1,63 @@
+### @file
+# Component description file for Smbios Misc module.
+#
+# Copyright (c) 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 which accompanies this distribution.
+# The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+###
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = AcpiDebugDxe
+  FILE_GUID                      = EC98FF95-242C-4513-B1BC-69FA24111C58
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = InitializeAcpiDebugDxe
+#
+# The following information is for reference only and not required by the build tools.
+#
+#  VALID_ARCHITECTURES           = IA32 X64 IPF
+#
+
+[LibraryClasses]
+  BaseLib
+  BaseMemoryLib
+  UefiBootServicesTableLib
+  UefiDriverEntryPoint
+  DebugLib
+  PcdLib
+  DxeServicesLib
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  AdvancedFeaturePkg/AdvancedFeaturePkg.dec
+
+[Pcd]
+  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugEnable      ## CONSUMES
+  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugBufferSize  ## CONSUMES
+  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugAddress     ## PRODUCES
+
+[Sources]
+  AcpiDebug.c
+  AcpiDebug.asl
+
+[Protocols]
+  gEfiAcpiTableProtocolGuid         ## CONSUMES
+  gEfiSmmBase2ProtocolGuid          ## CONSUMES # only for SMM version
+  gEfiSmmSwDispatch2ProtocolGuid    ## CONSUMES # only for SMM version
+  gEfiSmmEndOfDxeProtocolGuid       ## NOTIFY # only for SMM version
+
+[Guids]
+  gEfiEndOfDxeEventGroupGuid        ## CONSUMES ## Event
+
+[Depex]
+  gEfiAcpiTableProtocolGuid
+
diff --git a/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugSmm.inf b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugSmm.inf
new file mode 100644
index 0000000..f0cbfb1
--- /dev/null
+++ b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugSmm.inf
@@ -0,0 +1,65 @@
+### @file
+# Component description file for Smbios Misc module.
+#
+# Copyright (c) 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 which accompanies this distribution.
+# The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+###
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = AcpiDebugSmm
+  FILE_GUID                      = 9069C144-0A7E-41ef-9C07-418BCA9BF939
+  MODULE_TYPE                    = DXE_SMM_DRIVER
+  VERSION_STRING                 = 1.0
+  PI_SPECIFICATION_VERSION       = 0x0001000A
+  ENTRY_POINT                    = InitializeAcpiDebugSmm
+#
+# The following information is for reference only and not required by the build tools.
+#
+#  VALID_ARCHITECTURES           = IA32 X64 IPF
+#
+
+[LibraryClasses]
+  BaseLib
+  BaseMemoryLib
+  UefiBootServicesTableLib
+  UefiDriverEntryPoint
+  DebugLib
+  PcdLib
+  DxeServicesLib
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  AdvancedFeaturePkg/AdvancedFeaturePkg.dec
+
+[Pcd]
+  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugEnable      ## CONSUMES
+  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugBufferSize  ## CONSUMES
+  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugAddress     ## PRODUCES
+
+[Sources]
+  AcpiDebug.c
+  AcpiDebug.asl
+
+[Protocols]
+  gEfiAcpiTableProtocolGuid         ## CONSUMES
+  gEfiSmmBase2ProtocolGuid          ## CONSUMES
+  gEfiSmmSwDispatch2ProtocolGuid    ## CONSUMES
+  gEfiSmmEndOfDxeProtocolGuid       ## NOTIFY
+
+[Guids]
+  gEfiEndOfDxeEventGroupGuid        ## CONSUMES ## Event # only for DXE version
+
+[Depex]
+  gEfiAcpiTableProtocolGuid AND
+  gEfiSmmBase2ProtocolGuid AND
+  gEfiSmmSwDispatch2ProtocolGuid
diff --git a/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/Readme.txt b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/Readme.txt
new file mode 100644
index 0000000..65ed5b3
--- /dev/null
+++ b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/Readme.txt
@@ -0,0 +1,47 @@
+ACPI Debug feature - an alternative to Port 80 and WinDBG
+
+How it works:
+  Acpi Debug does this:
+  Opens a 64kb memory buffer during POST.
+  Patches the buffer address in SSDT ASL code.
+  Displays the address in SETUP for user reference.
+  Write strings or numbers to the buffer from ASL code with the ADBG method.
+
+How to use it:
+  Enable the feature in SETUP->Advanced->ACPI DEBUG, and confirm gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugEnable is TRUE.
+  The ACPI ASL code must be instrumented with the debug method.
+  Strings up to 32 characters (shorter strings will be padded with Zero's, longer strings will be truncated)
+  Examples:
+    ADBG("This is a test.")
+    ADBG(Arg0)
+
+  DXE version: The bios engineer will read the strings from the buffer on the target machine with read/write memory utility.
+  SMM version: Check debug serial that would show debug strings.
+
+  Sample code for ADBG:
+    External (MDBG, MethodObj)
+    Method (ADBG, 1, Serialized)
+    {
+      If (CondRefOf (MDBG)) // Check if ACPI Debug SSDT is loaded
+      {
+        Return (MDBG (Arg0))
+      }
+      Return (0)
+    }
+
+  Sample code for Setup Pages
+    oneof varid   = SETUP_DATA.AcpiDebug,
+      prompt      = STRING_TOKEN(STR_ACPI_DEBUG_PROMPT),
+      help        = STRING_TOKEN(STR_ACPI_DEBUG_HELP),
+      option text = STRING_TOKEN(STR_DISABLED), value = 0, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_ENABLED), value = 1, flags = RESET_REQUIRED;
+    endoneof;
+
+    suppressif ideqval SETUP_DATA.AcpiDebug == 0;
+      text
+        help  = STRING_TOKEN(STR_ACPI_DEBUG_ADDRESS_HELP),
+        text  = STRING_TOKEN(STR_ACPI_DEBUG_ADDRESS_NAME),
+        text  = STRING_TOKEN(STR_ACPI_DEBUG_ADDRESS_VALUE),
+        flags = 0,
+        key   = 0;
+    endif;
\ No newline at end of file
diff --git a/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dec b/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dec
index fb27647..e09facd 100644
--- a/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dec
+++ b/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dec
@@ -146,11 +146,17 @@ gAdvancedFeaturePkgTokenSpaceGuid         =  {0xa8514688, 0x6693, 0x4ab5, {0xaa,
 
 [PcdsFixedAtBuild]
   gAdvancedFeaturePkgTokenSpaceGuid.PcdMaxSOLChannels|0x3|UINT8|0x40000009
+  ## This PCD specifies AcpiDebug feature is enable/disable.
+  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugEnable|FALSE|BOOLEAN|0x00000012
+  ## This PCD specifies AcpiDebug buffer size.
+  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugBufferSize|0x10000|UINT32|0x00000013
 
 [PcdsDynamic, PcdsDynamicEx]
   gAdvancedFeaturePkgTokenSpaceGuid.PcdIpmiIoBaseAddress|0xCA2|UINT16|0x90000022
   gAdvancedFeaturePkgTokenSpaceGuid.PcdFRB2EnabledFlag|TRUE|BOOLEAN|0x10000030
   gAdvancedFeaturePkgTokenSpaceGuid.PcdFRBTimeoutValue|360|UINT16|0x10000040
+  ## This PCD specifies AcpiDebug buffer address
+  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugAddress|0|UINT32|0x00000014
 
 [PcdsFeatureFlag]
   gAdvancedFeaturePkgTokenSpaceGuid.PcdNetworkEnable          |FALSE|BOOLEAN|0xF00000A1
diff --git a/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dsc b/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dsc
index 4fcf9ac..1ec1b13 100644
--- a/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dsc
+++ b/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dsc
@@ -155,3 +155,5 @@
   AdvancedFeaturePkg/Ipmi/BmcElog/BmcElog.inf
   AdvancedFeaturePkg/Ipmi/BmcAcpi/BmcAcpi.inf
 
+  AdvancedFeaturePkg/AcpiDebug/AcpiDebugDxe.inf
+  AdvancedFeaturePkg/AcpiDebug/AcpiDebugSmm.inf
\ No newline at end of file
-- 
2.21.0.windows.1



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

* Re: [Patch] AdvancedFeaturePkg/AcpiDebug: Add new AcpiDebug modules.
  2019-04-01  3:16 [Patch] AdvancedFeaturePkg/AcpiDebug: Add new AcpiDebug modules Eric Dong
@ 2019-04-01  3:26 ` Dong, Eric
  2019-04-01 16:52 ` Laszlo Ersek
  1 sibling, 0 replies; 4+ messages in thread
From: Dong, Eric @ 2019-04-01  3:26 UTC (permalink / raw)
  To: Dong, Eric, edk2-devel@lists.01.org; +Cc: Wu, Hao A, Kubacki, Michael A

Include Package owner Kubacki.  Already in the Cc list but don't know why not Cc him in former mail.

Thanks,
Eric

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Eric Dong
> Sent: Monday, April 1, 2019 11:17 AM
> To: edk2-devel@lists.01.org
> Cc: Wu, Hao A <hao.a.wu@intel.com>
> Subject: [edk2] [Patch] AdvancedFeaturePkg/AcpiDebug: Add new
> AcpiDebug modules.
> 
> Add new AcpiDebug modules which provide ACPI Debug feature.
> Detail about this feature see the readme.txt in the patch.
> 
> Change-Id: Ib977ece46f3494301574b04af32282b99045f673
> Cc: Hao Wu <hao.a.wu@intel.com>
> Cc: Michael Kubacki <michael.a.kubacki@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Eric Dong <eric.dong@intel.com>
> ---
>  .../AcpiDebug/AcpiDebug.asl                   | 109 ++++
>  .../AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c  | 485
> ++++++++++++++++++
>  .../AcpiDebug/AcpiDebugDxe.inf                |  63 +++
>  .../AcpiDebug/AcpiDebugSmm.inf                |  65 +++
>  .../AdvancedFeaturePkg/AcpiDebug/Readme.txt   |  47 ++
>  .../AdvancedFeaturePkg/AdvancedFeaturePkg.dec |   6 +
>  .../AdvancedFeaturePkg/AdvancedFeaturePkg.dsc |   2 +
>  7 files changed, 777 insertions(+)
>  create mode 100644
> Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.asl
>  create mode 100644
> Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c
>  create mode 100644
> Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugDxe.inf
>  create mode 100644
> Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugSmm.inf
>  create mode 100644
> Platform/Intel/AdvancedFeaturePkg/AcpiDebug/Readme.txt
> 
> diff --git a/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.asl
> b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.asl
> new file mode 100644
> index 0000000..62d2a1b
> --- /dev/null
> +++ b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.asl
> @@ -0,0 +1,109 @@
> +/** @file
> +  Acpi Debug ASL code.
> +
> +Copyright (c) 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 which accompanies
> +this distribution.  The full text of the license may be found at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +**/
> +
> +DefinitionBlock (
> +  "AcpiDebug.aml",
> +  "SSDT",
> +  2,
> +  "Intel ",
> +  "ADebTabl",
> +  0x1000
> +  )
> +{
> +  Scope(\)
> +  {
> +    //
> +    // These pointers are patched during POST.
> +    //
> +    Name (DPTR, 0x80000000) // Address of Acpi debug memory buffer, fixed
> up during POST
> +    Name (EPTR, 0x80000000) // End of Acpi debug memory buffer, fixed up
> during POST
> +    Name (CPTR, 0x80000000) // Current pointer used as an index into
> +the buffer(starts after the Acpi Debug head), fixed up during POST
> +
> +    //
> +    // Use a Mutex to prevent multiple calls from simutaneously writing to
> the same memory.
> +    //
> +    Mutex (MMUT, 0)
> +
> +    //
> +    // Operational region for SMI port access
> +    //
> +    OperationRegion (ADBP, SystemIO, 0xB2, 2)
> +    Field (ADBP, ByteAcc, NoLock, Preserve)
> +    {
> +        B2PT, 8,
> +        B3PT, 8,
> +    }
> +
> +    //
> +    // Write a string to a memory buffer
> +    //
> +    Method (MDBG, 1, Serialized)
> +    {
> +      OperationRegion (ADHD, SystemMemory, DPTR, 32) // Operation region
> for Acpi Debug buffer first 0x20 bytes
> +      Field (ADHD, ByteAcc, NoLock, Preserve)
> +      {
> +        Offset (0x0),
> +        ASIG, 128,      // 16 bytes is Signature
> +        Offset (0x10),
> +        ASIZ, 32,       // 4 bytes is buffer size
> +        ACHP, 32,       // 4 bytes is current head pointer, normally is DPTR + 0x20,
> +                        //   if there's SMM handler to print, then it's the starting of the
> info hasn't been printed yet.
> +        ACTP, 32,       // 4 bytes is current tail pointer, is the same as CPTR
> +        SMIN, 8,        // 1 byte of SMI Number for trigger callback
> +        WRAP, 8,        // 1 byte of wrap status
> +        SMMV, 8,        // 1 byte of SMM version status
> +        TRUN, 8         // 1 byte of truncate status
> +      }
> +
> +      Store (Acquire (MMUT, 1000), Local0) // save Acquire result so we can
> check for Mutex acquired
> +      If (LEqual (Local0, Zero)) // check for Mutex acquired
> +      {
> +        OperationRegion (ABLK, SystemMemory, CPTR, 32) // Operation region
> to allow writes to ACPI debug buffer
> +        Field (ABLK, ByteAcc, NoLock, Preserve)
> +        {
> +          Offset (0x0),
> +          AAAA, 256 // 32 bytes is max size for string or data
> +        }
> +        ToHexString (Arg0, Local1) // convert argument to Hexadecimal String
> +        Store (0, TRUN)
> +        If (LGreaterEqual (SizeOf (Local1), 32))
> +        {
> +          Store (1, TRUN) // the input from ASL >= 32
> +        }
> +        Mid (Local1, 0, 31, AAAA) // extract the input to current
> + buffer
> +
> +        Add (CPTR, 32, CPTR) // advance current pointer to next string location
> in memory buffer
> +        If (LGreaterEqual (CPTR, EPTR) ) // check for end of 64kb Acpi debug
> buffer
> +        {
> +          Add (DPTR, 32, CPTR) // wrap around to beginning of buffer if the end
> has been reached
> +          Store (1, WRAP)
> +        }
> +        Store (CPTR, ACTP)
> +
> +        If (SMMV)
> +        {
> +          //
> +          // Triggle the SMI to print
> +          //
> +          Store (SMIN, B2PT)
> +        }
> +        Release (MMUT)
> +      }
> +
> +      Return (Local0) // return error code indicating whether Mutex was
> acquired
> +    }
> +
> +  } // End Scope
> +} // End SSDT
> +
> diff --git a/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c
> b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c
> new file mode 100644
> index 0000000..ce9b59d
> --- /dev/null
> +++ b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c
> @@ -0,0 +1,485 @@
> +/** @file
> +  Smbios basic entry point.
> +
> +Copyright (c) 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 that accompanies this
> distribution.
> +The full text of the license may be found at
> +http://opensource.org/licenses/bsd-license.php.
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +**/
> +
> +
> +#include <Uefi.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/DxeServicesLib.h>
> +#include <Protocol/AcpiTable.h>
> +#include <IndustryStandard/Acpi.h>
> +
> +#include <Protocol/SmmBase2.h>
> +#include <Protocol/SmmEndOfDxe.h>
> +#include <Protocol/SmmSwDispatch2.h>
> +
> +#define ACPI_DEBUG_STR      "INTEL ACPI DEBUG"
> +
> +//
> +// ASL NAME structure
> +//
> +#pragma pack(1)
> +typedef struct {
> +  UINT8  NameOp;            // Byte [0]=0x08:NameOp.
> +  UINT32 NameString;        // Byte [4:1]=Name of object.
> +  UINT8  DWordPrefix;       // Byte [5]=0x0C:DWord Prefix.
> +  UINT32 Value;             // 0 ; Value of named object.
> +} NAME_LAYOUT;
> +#pragma pack()
> +
> +#pragma pack(1)
> +typedef struct {
> +  UINT8  Signature[16];     // "INTEL ACPI DEBUG"
> +  UINT32 BufferSize;        // Total size of Acpi Debug buffer including header
> structure
> +  UINT32 Head;              // Current buffer pointer for SMM to print out
> +  UINT32 Tail;              // Current buffer pointer for ASL to input
> +  UINT8  SmiTrigger;        // Value to trigger the SMI via B2 port
> +  UINT8  Wrap;              // If current Tail < Head
> +  UINT8  SmmVersion;        // If SMM version
> +  UINT8  Truncate;          // If the input from ASL > MAX_BUFFER_SIZE
> +} ACPI_DEBUG_HEAD;
> +#pragma pack()
> +
> +#define AD_SIZE             sizeof (ACPI_DEBUG_HEAD) // This is 0x20
> +
> +#define MAX_BUFFER_SIZE     32
> +
> +UINT32                      mBufferEnd = 0;
> +ACPI_DEBUG_HEAD             *mAcpiDebug = NULL;
> +
> +EFI_SMM_SYSTEM_TABLE2       *mSmst = NULL;
> +
> +/**
> +  Patch and load ACPI table.
> +
> +  @param[in] AcpiDebugAddress   Address of Acpi debug memory buffer.
> +  @param[in] BufferIndex        Index that starts after the Acpi Debug head.
> +  @param[in] BufferEnd          End of Acpi debug memory buffer.
> +
> +**/
> +VOID
> +PatchAndLoadAcpiTable (
> +  IN ACPI_DEBUG_HEAD            *AcpiDebugAddress,
> +  IN UINT32                     BufferIndex,
> +  IN UINT32                     BufferEnd
> +  )
> +{
> +  EFI_STATUS                    Status;
> +  EFI_ACPI_TABLE_PROTOCOL       *AcpiTable;
> +  UINTN                         Size;
> +  EFI_ACPI_DESCRIPTION_HEADER   *TableHeader;
> +  UINTN                         TableKey;
> +  UINT8                         *CurrPtr;
> +  UINT32                        *Signature;
> +  NAME_LAYOUT                   *NamePtr;
> +  UINT8                         UpdateCounter;
> +
> +  Status = GetSectionFromFv (
> +             &gEfiCallerIdGuid,
> +             EFI_SECTION_RAW,
> +             0,
> +             (VOID **) &TableHeader,
> +             &Size
> +             );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  //
> +  // This is Acpi Debug SSDT. Acpi Debug should be enabled if we reach here
> so load the table.
> +  //
> +  ASSERT (((EFI_ACPI_DESCRIPTION_HEADER *) TableHeader)->OemTableId
> ==
> + SIGNATURE_64 ('A', 'D', 'e', 'b', 'T', 'a', 'b', 'l'));
> +
> +  //
> +  // Patch some pointers for the ASL code before loading the SSDT.
> +  //
> +
> +  //
> +  // Count pointer updates, so we can stop after all three pointers are
> patched.
> +  //
> +  UpdateCounter = 1;
> +  for (CurrPtr = (UINT8 *) TableHeader; CurrPtr <= ((UINT8 *) TableHeader +
> TableHeader->Length) && UpdateCounter < 4; CurrPtr++) {
> +    Signature = (UINT32 *) (CurrPtr + 1);
> +    //
> +    // patch DPTR (address of Acpi debug memory buffer)
> +    //
> +    if ((*CurrPtr == AML_NAME_OP) && *Signature == SIGNATURE_32 ('D',
> 'P', 'T', 'R')) {
> +      NamePtr = (NAME_LAYOUT *) CurrPtr;
> +      NamePtr->Value  = (UINT32) (UINTN) AcpiDebugAddress;
> +      UpdateCounter++;
> +    }
> +    //
> +    // patch EPTR (end of Acpi debug memory buffer)
> +    //
> +    if ((*CurrPtr == AML_NAME_OP) && *Signature == SIGNATURE_32 ('E',
> 'P', 'T', 'R')) {
> +      NamePtr = (NAME_LAYOUT *) CurrPtr;
> +      NamePtr->Value  = BufferEnd;
> +      UpdateCounter++;
> +    }
> +    //
> +    // patch CPTR (used as an index that starts after the Acpi Debug head)
> +    //
> +    if ((*CurrPtr == AML_NAME_OP) && *Signature == SIGNATURE_32 ('C',
> 'P', 'T', 'R')) {
> +      NamePtr = (NAME_LAYOUT *) CurrPtr;
> +      NamePtr->Value  = BufferIndex;
> +      UpdateCounter++;
> +    }
> +  }
> +
> +  //
> +  // Add the table
> +  //
> +  Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID
> + **)&AcpiTable);  ASSERT_EFI_ERROR (Status);
> +
> +  TableKey = 0;
> +  Status = AcpiTable->InstallAcpiTable (
> +                        AcpiTable,
> +                        TableHeader,
> +                        Size,
> +                        &TableKey
> +                        );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  gBS->FreePool (TableHeader);
> +  return ;
> +}
> +
> +/**
> +  Allocate Acpi Debug memory.
> +
> +  @param[out] BufferSize    Pointer to Acpi debug memory buffer size.
> +
> +  @return Address of Acpi debug memory buffer. 0 if PcdAcpiDebugEnable
> is FALSE.
> +
> +**/
> +EFI_PHYSICAL_ADDRESS
> +AllocateAcpiDebugMemory (
> +  OUT UINT32           *BufferSize
> +  )
> +{
> +  EFI_STATUS           Status;
> +  EFI_PHYSICAL_ADDRESS AcpiDebugAddress;
> +
> +  AcpiDebugAddress = 0;
> +  *BufferSize = 0;
> +
> +  if (PcdGetBool (PcdAcpiDebugEnable)) {
> +    //
> +    // Reserve memory to store Acpi Debug data.
> +    //
> +    AcpiDebugAddress = 0xFFFFFFFF;
> +    Status = gBS->AllocatePages (
> +                    AllocateMaxAddress,
> +                    EfiReservedMemoryType,
> +                    EFI_SIZE_TO_PAGES (PcdGet32 (PcdAcpiDebugBufferSize)),
> +                    &AcpiDebugAddress
> +                    );
> +    ASSERT_EFI_ERROR(Status);
> +
> +    DEBUG ((DEBUG_INFO, "AcpiDebugAddress - 0x%08x\n",
> + AcpiDebugAddress));
> +
> +    Status = PcdSet32S (PcdAcpiDebugAddress, (UINT32) AcpiDebugAddress);
> +    ASSERT_EFI_ERROR(Status);
> +    *BufferSize = PcdGet32 (PcdAcpiDebugBufferSize);  }
> +
> +  return AcpiDebugAddress;
> +}
> +
> +/**
> +  Acpi Debug EndOfDxe notification.
> +
> +  @param[in] Event      Event whose notification function is being invoked.
> +  @param[in] Context    Pointer to the notification function's context.
> +
> +**/
> +VOID
> +EFIAPI
> +AcpiDebugEndOfDxeNotification (
> +  IN EFI_EVENT  Event,
> +  IN VOID       *Context
> +  )
> +{
> +  UINT32        BufferSize;
> +  UINT32        BufferIndex;
> +
> +  mAcpiDebug = (ACPI_DEBUG_HEAD *) (UINTN)
> AllocateAcpiDebugMemory
> + (&BufferSize);  if (mAcpiDebug != NULL) {
> +    //
> +    // Init ACPI DEBUG buffer to lower case 'x'.
> +    //
> +    SetMem ((VOID *) mAcpiDebug, BufferSize, 0x78);
> +
> +    //
> +    // Clear header of AD_SIZE bytes.
> +    //
> +    ZeroMem ((VOID *) mAcpiDebug, AD_SIZE);
> +
> +    //
> +    // Write a signature to the first line of the buffer, "INTEL ACPI DEBUG".
> +    //
> +    CopyMem ((VOID *) mAcpiDebug, ACPI_DEBUG_STR, sizeof
> + (ACPI_DEBUG_STR) - 1);
> +
> +    BufferIndex = (UINT32) (UINTN) mAcpiDebug;
> +    mBufferEnd = BufferIndex + BufferSize;
> +
> +    //
> +    // Leave the Index after the Acpi Debug head.
> +    //
> +    BufferIndex += AD_SIZE;
> +
> +    //
> +    // Patch and Load the SSDT ACPI Tables.
> +    //
> +    PatchAndLoadAcpiTable (mAcpiDebug, BufferIndex, mBufferEnd);
> +
> +    mAcpiDebug->Head = BufferIndex;
> +    mAcpiDebug->Tail = BufferIndex;
> +    mAcpiDebug->BufferSize = BufferSize;  }
> +
> +  //
> +  // Close event, so it will not be invoked again.
> +  //
> +  gBS->CloseEvent (Event);
> +
> +  return ;
> +}
> +
> +/**
> +  Initialize ACPI Debug.
> +
> +  @param[in] ImageHandle    The firmware allocated handle for the EFI
> image.
> +  @param[in] SystemTable    A pointer to the EFI System Table.
> +
> +  @retval EFI_SUCCESS       The driver initializes correctly.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +InitializeAcpiDebugDxe (
> +  IN EFI_HANDLE         ImageHandle,
> +  IN EFI_SYSTEM_TABLE   *SystemTable
> +  )
> +{
> +  EFI_STATUS            Status;
> +  EFI_EVENT             EndOfDxeEvent;
> +
> +  //
> +  // Register EndOfDxe notification
> +  // that point could ensure the Acpi Debug related PCDs initialized.
> +  //
> +  Status = gBS->CreateEventEx (
> +                  EVT_NOTIFY_SIGNAL,
> +                  TPL_CALLBACK,
> +                  AcpiDebugEndOfDxeNotification,
> +                  NULL,
> +                  &gEfiEndOfDxeEventGroupGuid,
> +                  &EndOfDxeEvent
> +                  );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Software SMI callback for ACPI Debug which is called from ACPI method.
> +
> +  @param[in]      DispatchHandle    The unique handle assigned to this
> handler by SmiHandlerRegister().
> +  @param[in]      Context           Points to an optional handler context which
> was specified when the
> +                                    handler was registered.
> +  @param[in, out] CommBuffer        A pointer to a collection of data in
> memory that will
> +                                    be conveyed from a non-SMM environment into an SMM
> environment.
> +  @param[in, out] CommBufferSize    The size of the CommBuffer.
> +
> +  @retval EFI_SUCCESS               The interrupt was handled successfully.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +AcpiDebugSmmCallback (
> +  IN EFI_HANDLE     DispatchHandle,
> +  IN CONST VOID     *Context,
> +  IN OUT VOID       *CommBuffer,
> +  IN OUT UINTN      *CommBufferSize
> +  )
> +{
> +  UINT8             Buffer[MAX_BUFFER_SIZE];
> +
> +  //
> +  // Validate the fields in mAcpiDebug to ensure there is no harm to SMI
> handler.
> +  // mAcpiDebug is below 4GB and the start address of whole buffer.
> +  //
> +  if ((mAcpiDebug->BufferSize != (mBufferEnd - (UINT32) (UINTN)
> mAcpiDebug)) ||
> +      (mAcpiDebug->Head < (UINT32) ((UINTN) mAcpiDebug + AD_SIZE)) ||
> +      (mAcpiDebug->Head > mBufferEnd) ||
> +      (mAcpiDebug->Tail < (UINT32) ((UINTN) mAcpiDebug + AD_SIZE)) ||
> +      (mAcpiDebug->Tail > mBufferEnd)) {
> +    //
> +    // If some fields in mAcpiDebug are invaid, return directly.
> +    //
> +    return EFI_SUCCESS;
> +  }
> +
> +  if (!(BOOLEAN)mAcpiDebug->Wrap && ((mAcpiDebug->Head >= (UINT32)
> ((UINTN) mAcpiDebug + AD_SIZE))
> +    && (mAcpiDebug->Head < mAcpiDebug->Tail))){
> +    //
> +    // If curent ----- buffer + 020
> +    //                 ...
> +    //                 ... Head
> +    //                 ... Data for SMM print
> +    //                 ... Tail
> +    //                 ... Vacant for ASL input
> +    //           ----- buffer end
> +    //
> +    // skip NULL block
> +    //
> +    while ((*(CHAR8 *) (UINTN) mAcpiDebug->Head == '\0') &&
> (mAcpiDebug->Head < mAcpiDebug->Tail)) {
> +      mAcpiDebug->Head ++;
> +    }
> +
> +    if (mAcpiDebug->Head < mAcpiDebug->Tail){
> +      ZeroMem (Buffer, MAX_BUFFER_SIZE);
> +      AsciiStrnCpyS ((CHAR8 *) Buffer, MAX_BUFFER_SIZE, (CHAR8 *)
> + (UINTN) mAcpiDebug->Head, MAX_BUFFER_SIZE - 1);
> +
> +      DEBUG ((DEBUG_INFO | DEBUG_ERROR, "%a%a\n", Buffer,
> (BOOLEAN)mAcpiDebug->Truncate ? "..." : ""));
> +      mAcpiDebug->Head += MAX_BUFFER_SIZE;
> +
> +      if (mAcpiDebug->Head >= (mAcpiDebug->Tail)){
> +        //
> +        // When head == tail, we do nothing in handler.
> +        //
> +        mAcpiDebug->Head = mAcpiDebug->Tail;
> +      }
> +    }
> +  } else if ((BOOLEAN)mAcpiDebug->Wrap && ((mAcpiDebug->Head >
> mAcpiDebug->Tail)
> +    && (mAcpiDebug->Head < (UINT32) ((UINTN) mAcpiDebug +
> mAcpiDebug->BufferSize)))){
> +    //
> +    // If curent ----- buffer + 020
> +    //                 ... Tail
> +    //                 ... Vacant for ASL input
> +    //                 ... Head
> +    //                 ... Data for SMM print
> +    //           ----- buffer end
> +    //
> +    while((*(CHAR8 *) (UINTN) mAcpiDebug->Head == '\0') &&
> (mAcpiDebug->Head < (UINT32) ((UINTN) mAcpiDebug + mAcpiDebug-
> >BufferSize))) {
> +      mAcpiDebug->Head ++;
> +    }
> +    if (mAcpiDebug->Head < (UINT32) ((UINTN) mAcpiDebug + mAcpiDebug-
> >BufferSize)){
> +      ZeroMem (Buffer, MAX_BUFFER_SIZE);
> +      AsciiStrnCpyS ((CHAR8 *) Buffer, MAX_BUFFER_SIZE, (CHAR8 *) (UINTN)
> mAcpiDebug->Head, MAX_BUFFER_SIZE - 1);
> +      DEBUG ((DEBUG_INFO | DEBUG_ERROR, "%a%a\n", Buffer,
> (BOOLEAN)mAcpiDebug->Truncate ? "..." : ""));
> +      mAcpiDebug->Head += MAX_BUFFER_SIZE;
> +
> +      if (mAcpiDebug->Head >= (UINT32) ((UINTN) mAcpiDebug +
> mAcpiDebug->BufferSize)) {
> +        //
> +        // We met end of buffer.
> +        //
> +        mAcpiDebug->Wrap = 0;
> +        mAcpiDebug->Head = (UINT32) ((UINTN) mAcpiDebug + AD_SIZE);
> +      }
> +    }
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Acpi Debug SmmEndOfDxe notification.
> +
> +  @param[in] Protocol   Points to the protocol's unique identifier.
> +  @param[in] Interface  Points to the interface instance.
> +  @param[in] Handle     The handle on which the interface was installed.
> +
> +  @retval EFI_SUCCESS   Notification runs successfully.
> +
> + **/
> +EFI_STATUS
> +EFIAPI
> +AcpiDebugSmmEndOfDxeNotification (
> +  IN CONST EFI_GUID     *Protocol,
> +  IN VOID               *Interface,
> +  IN EFI_HANDLE         Handle
> +  )
> +{
> +  EFI_STATUS                        Status;
> +  EFI_SMM_SW_DISPATCH2_PROTOCOL     *SwDispatch;
> +  EFI_SMM_SW_REGISTER_CONTEXT       SwContext;
> +  EFI_HANDLE                        SwHandle;
> +
> +  AcpiDebugEndOfDxeNotification (NULL, NULL);
> +
> +  if (mAcpiDebug != NULL) {
> +    //
> +    // Get the Sw dispatch protocol and register SMI callback function.
> +    //
> +    SwDispatch = NULL;
> +    Status = mSmst->SmmLocateProtocol
> (&gEfiSmmSwDispatch2ProtocolGuid, NULL, (VOID **) &SwDispatch);
> +    ASSERT_EFI_ERROR (Status);
> +    SwContext.SwSmiInputValue = (UINTN) -1;
> +    Status = SwDispatch->Register (SwDispatch, AcpiDebugSmmCallback,
> &SwContext, &SwHandle);
> +    ASSERT_EFI_ERROR (Status);
> +    mAcpiDebug->SmiTrigger = (UINT8) SwContext.SwSmiInputValue;
> +    mAcpiDebug->SmmVersion = 1;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Initialize ACPI Debug.
> +
> +  @param[in] ImageHandle    The firmware allocated handle for the EFI
> image.
> +  @param[in] SystemTable    A pointer to the EFI System Table.
> +
> +  @retval EFI_SUCCESS       The driver initializes correctly.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +InitializeAcpiDebugSmm (
> +  IN EFI_HANDLE         ImageHandle,
> +  IN EFI_SYSTEM_TABLE   *SystemTable
> +  )
> +{
> +  EFI_STATUS                Status;
> +  VOID                      *Registration;
> +  EFI_SMM_BASE2_PROTOCOL    *SmmBase2;
> +  BOOLEAN                   InSmm;
> +
> +  Status = gBS->LocateProtocol (&gEfiSmmBase2ProtocolGuid, NULL, (VOID
> + **) &SmmBase2);  ASSERT_EFI_ERROR (Status);  Status = SmmBase2-
> >InSmm
> + (SmmBase2, &InSmm);  ASSERT_EFI_ERROR (Status);  ASSERT (InSmm);
> + Status = SmmBase2->GetSmstLocation (SmmBase2, &mSmst);
> + ASSERT_EFI_ERROR (Status);
> +
> +  //
> +  // Register SmmEndOfDxe notification
> +  // that point could ensure the Acpi Debug related PCDs initialized.
> +  //
> +  Registration = NULL;
> +  Status = mSmst->SmmRegisterProtocolNotify (
> +                    &gEfiSmmEndOfDxeProtocolGuid,
> +                    AcpiDebugSmmEndOfDxeNotification,
> +                    &Registration
> +                    );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  return EFI_SUCCESS;
> +}
> +
> diff --git
> a/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugDxe.inf
> b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugDxe.inf
> new file mode 100644
> index 0000000..edfca5e
> --- /dev/null
> +++ b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugDxe.inf
> @@ -0,0 +1,63 @@
> +### @file
> +# Component description file for Smbios Misc module.
> +#
> +# Copyright (c) 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 which
> accompanies this distribution.
> +# The full text of the license may be found at #
> +http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +#
> +###
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = AcpiDebugDxe
> +  FILE_GUID                      = EC98FF95-242C-4513-B1BC-69FA24111C58
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  ENTRY_POINT                    = InitializeAcpiDebugDxe
> +#
> +# The following information is for reference only and not required by the
> build tools.
> +#
> +#  VALID_ARCHITECTURES           = IA32 X64 IPF
> +#
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  UefiBootServicesTableLib
> +  UefiDriverEntryPoint
> +  DebugLib
> +  PcdLib
> +  DxeServicesLib
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  AdvancedFeaturePkg/AdvancedFeaturePkg.dec
> +
> +[Pcd]
> +  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugEnable      ##
> CONSUMES
> +  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugBufferSize  ##
> CONSUMES
> +  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugAddress     ##
> PRODUCES
> +
> +[Sources]
> +  AcpiDebug.c
> +  AcpiDebug.asl
> +
> +[Protocols]
> +  gEfiAcpiTableProtocolGuid         ## CONSUMES
> +  gEfiSmmBase2ProtocolGuid          ## CONSUMES # only for SMM version
> +  gEfiSmmSwDispatch2ProtocolGuid    ## CONSUMES # only for SMM
> version
> +  gEfiSmmEndOfDxeProtocolGuid       ## NOTIFY # only for SMM version
> +
> +[Guids]
> +  gEfiEndOfDxeEventGroupGuid        ## CONSUMES ## Event
> +
> +[Depex]
> +  gEfiAcpiTableProtocolGuid
> +
> diff --git
> a/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugSmm.inf
> b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugSmm.inf
> new file mode 100644
> index 0000000..f0cbfb1
> --- /dev/null
> +++ b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugSmm.inf
> @@ -0,0 +1,65 @@
> +### @file
> +# Component description file for Smbios Misc module.
> +#
> +# Copyright (c) 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 which
> accompanies this distribution.
> +# The full text of the license may be found at #
> +http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +#
> +###
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = AcpiDebugSmm
> +  FILE_GUID                      = 9069C144-0A7E-41ef-9C07-418BCA9BF939
> +  MODULE_TYPE                    = DXE_SMM_DRIVER
> +  VERSION_STRING                 = 1.0
> +  PI_SPECIFICATION_VERSION       = 0x0001000A
> +  ENTRY_POINT                    = InitializeAcpiDebugSmm
> +#
> +# The following information is for reference only and not required by the
> build tools.
> +#
> +#  VALID_ARCHITECTURES           = IA32 X64 IPF
> +#
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  UefiBootServicesTableLib
> +  UefiDriverEntryPoint
> +  DebugLib
> +  PcdLib
> +  DxeServicesLib
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  AdvancedFeaturePkg/AdvancedFeaturePkg.dec
> +
> +[Pcd]
> +  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugEnable      ##
> CONSUMES
> +  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugBufferSize  ##
> CONSUMES
> +  gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugAddress     ##
> PRODUCES
> +
> +[Sources]
> +  AcpiDebug.c
> +  AcpiDebug.asl
> +
> +[Protocols]
> +  gEfiAcpiTableProtocolGuid         ## CONSUMES
> +  gEfiSmmBase2ProtocolGuid          ## CONSUMES
> +  gEfiSmmSwDispatch2ProtocolGuid    ## CONSUMES
> +  gEfiSmmEndOfDxeProtocolGuid       ## NOTIFY
> +
> +[Guids]
> +  gEfiEndOfDxeEventGroupGuid        ## CONSUMES ## Event # only for DXE
> version
> +
> +[Depex]
> +  gEfiAcpiTableProtocolGuid AND
> +  gEfiSmmBase2ProtocolGuid AND
> +  gEfiSmmSwDispatch2ProtocolGuid
> diff --git a/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/Readme.txt
> b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/Readme.txt
> new file mode 100644
> index 0000000..65ed5b3
> --- /dev/null
> +++ b/Platform/Intel/AdvancedFeaturePkg/AcpiDebug/Readme.txt
> @@ -0,0 +1,47 @@
> +ACPI Debug feature - an alternative to Port 80 and WinDBG
> +
> +How it works:
> +  Acpi Debug does this:
> +  Opens a 64kb memory buffer during POST.
> +  Patches the buffer address in SSDT ASL code.
> +  Displays the address in SETUP for user reference.
> +  Write strings or numbers to the buffer from ASL code with the ADBG
> method.
> +
> +How to use it:
> +  Enable the feature in SETUP->Advanced->ACPI DEBUG, and confirm
> gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugEnable is TRUE.
> +  The ACPI ASL code must be instrumented with the debug method.
> +  Strings up to 32 characters (shorter strings will be padded with
> +Zero's, longer strings will be truncated)
> +  Examples:
> +    ADBG("This is a test.")
> +    ADBG(Arg0)
> +
> +  DXE version: The bios engineer will read the strings from the buffer on the
> target machine with read/write memory utility.
> +  SMM version: Check debug serial that would show debug strings.
> +
> +  Sample code for ADBG:
> +    External (MDBG, MethodObj)
> +    Method (ADBG, 1, Serialized)
> +    {
> +      If (CondRefOf (MDBG)) // Check if ACPI Debug SSDT is loaded
> +      {
> +        Return (MDBG (Arg0))
> +      }
> +      Return (0)
> +    }
> +
> +  Sample code for Setup Pages
> +    oneof varid   = SETUP_DATA.AcpiDebug,
> +      prompt      = STRING_TOKEN(STR_ACPI_DEBUG_PROMPT),
> +      help        = STRING_TOKEN(STR_ACPI_DEBUG_HELP),
> +      option text = STRING_TOKEN(STR_DISABLED), value = 0, flags = DEFAULT
> | MANUFACTURING | RESET_REQUIRED;
> +      option text = STRING_TOKEN(STR_ENABLED), value = 1, flags =
> RESET_REQUIRED;
> +    endoneof;
> +
> +    suppressif ideqval SETUP_DATA.AcpiDebug == 0;
> +      text
> +        help  = STRING_TOKEN(STR_ACPI_DEBUG_ADDRESS_HELP),
> +        text  = STRING_TOKEN(STR_ACPI_DEBUG_ADDRESS_NAME),
> +        text  = STRING_TOKEN(STR_ACPI_DEBUG_ADDRESS_VALUE),
> +        flags = 0,
> +        key   = 0;
> +    endif;
> \ No newline at end of file
> diff --git a/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dec
> b/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dec
> index fb27647..e09facd 100644
> --- a/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dec
> +++ b/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dec
> @@ -146,11 +146,17 @@ gAdvancedFeaturePkgTokenSpaceGuid         =
> {0xa8514688, 0x6693, 0x4ab5, {0xaa,
> 
>  [PcdsFixedAtBuild]
> 
> gAdvancedFeaturePkgTokenSpaceGuid.PcdMaxSOLChannels|0x3|UINT8|0x
> 40000009
> +  ## This PCD specifies AcpiDebug feature is enable/disable.
> +
> +
> gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugEnable|FALSE|BOOLE
> AN|0x0
> + 0000012  ## This PCD specifies AcpiDebug buffer size.
> +
> +
> gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugBufferSize|0x10000|U
> INT3
> + 2|0x00000013
> 
>  [PcdsDynamic, PcdsDynamicEx]
> 
> gAdvancedFeaturePkgTokenSpaceGuid.PcdIpmiIoBaseAddress|0xCA2|UINT
> 16|0x90000022
> 
> gAdvancedFeaturePkgTokenSpaceGuid.PcdFRB2EnabledFlag|TRUE|BOOLEA
> N|0x10000030
> 
> gAdvancedFeaturePkgTokenSpaceGuid.PcdFRBTimeoutValue|360|UINT16|0
> x10000040
> +  ## This PCD specifies AcpiDebug buffer address
> +
> +
> gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugAddress|0|UINT32|0x
> 00000
> + 014
> 
>  [PcdsFeatureFlag]
>    gAdvancedFeaturePkgTokenSpaceGuid.PcdNetworkEnable
> |FALSE|BOOLEAN|0xF00000A1
> diff --git a/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dsc
> b/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dsc
> index 4fcf9ac..1ec1b13 100644
> --- a/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dsc
> +++ b/Platform/Intel/AdvancedFeaturePkg/AdvancedFeaturePkg.dsc
> @@ -155,3 +155,5 @@
>    AdvancedFeaturePkg/Ipmi/BmcElog/BmcElog.inf
>    AdvancedFeaturePkg/Ipmi/BmcAcpi/BmcAcpi.inf
> 
> +  AdvancedFeaturePkg/AcpiDebug/AcpiDebugDxe.inf
> +  AdvancedFeaturePkg/AcpiDebug/AcpiDebugSmm.inf
> \ No newline at end of file
> --
> 2.21.0.windows.1
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


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

* Re: [Patch] AdvancedFeaturePkg/AcpiDebug: Add new AcpiDebug modules.
  2019-04-01  3:16 [Patch] AdvancedFeaturePkg/AcpiDebug: Add new AcpiDebug modules Eric Dong
  2019-04-01  3:26 ` Dong, Eric
@ 2019-04-01 16:52 ` Laszlo Ersek
  2019-04-02  0:02   ` Dong, Eric
  1 sibling, 1 reply; 4+ messages in thread
From: Laszlo Ersek @ 2019-04-01 16:52 UTC (permalink / raw)
  To: Eric Dong, edk2-devel; +Cc: Hao Wu

On 04/01/19 05:16, Eric Dong wrote:
> Add new AcpiDebug modules which provide ACPI Debug feature.
> Detail about this feature see the readme.txt in the patch.
> 
> Change-Id: Ib977ece46f3494301574b04af32282b99045f673
> Cc: Hao Wu <hao.a.wu@intel.com>
> Cc: Michael Kubacki <michael.a.kubacki@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Eric Dong <eric.dong@intel.com>
> ---
>  .../AcpiDebug/AcpiDebug.asl                   | 109 ++++
>  .../AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c  | 485 ++++++++++++++++++
>  .../AcpiDebug/AcpiDebugDxe.inf                |  63 +++
>  .../AcpiDebug/AcpiDebugSmm.inf                |  65 +++
>  .../AdvancedFeaturePkg/AcpiDebug/Readme.txt   |  47 ++
>  .../AdvancedFeaturePkg/AdvancedFeaturePkg.dec |   6 +
>  .../AdvancedFeaturePkg/AdvancedFeaturePkg.dsc |   2 +
>  7 files changed, 777 insertions(+)
>  create mode 100644 Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.asl
>  create mode 100644 Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c
>  create mode 100644 Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugDxe.inf
>  create mode 100644 Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugSmm.inf
>  create mode 100644 Platform/Intel/AdvancedFeaturePkg/AcpiDebug/Readme.txt

What repository is this for? Is it for edk2-platforms? Such patches
should be posted with a subject prefix like [edk2-platforms PATCH], please.

Thanks
Laszlo


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

* Re: [Patch] AdvancedFeaturePkg/AcpiDebug: Add new AcpiDebug modules.
  2019-04-01 16:52 ` Laszlo Ersek
@ 2019-04-02  0:02   ` Dong, Eric
  0 siblings, 0 replies; 4+ messages in thread
From: Dong, Eric @ 2019-04-02  0:02 UTC (permalink / raw)
  To: Laszlo Ersek, edk2-devel@lists.01.org; +Cc: Wu, Hao A

Hi Laszlo,

yes, it's for edk2-platforms.  Sorry for this one, will follow this rule next time.

Thanks,
Eric
> -----Original Message-----
> From: Laszlo Ersek [mailto:lersek@redhat.com]
> Sent: Tuesday, April 2, 2019 12:53 AM
> To: Dong, Eric <eric.dong@intel.com>; edk2-devel@lists.01.org
> Cc: Wu, Hao A <hao.a.wu@intel.com>
> Subject: Re: [edk2] [Patch] AdvancedFeaturePkg/AcpiDebug: Add new
> AcpiDebug modules.
> 
> On 04/01/19 05:16, Eric Dong wrote:
> > Add new AcpiDebug modules which provide ACPI Debug feature.
> > Detail about this feature see the readme.txt in the patch.
> >
> > Change-Id: Ib977ece46f3494301574b04af32282b99045f673
> > Cc: Hao Wu <hao.a.wu@intel.com>
> > Cc: Michael Kubacki <michael.a.kubacki@intel.com>
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Eric Dong <eric.dong@intel.com>
> > ---
> >  .../AcpiDebug/AcpiDebug.asl                   | 109 ++++
> >  .../AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c  | 485
> ++++++++++++++++++
> >  .../AcpiDebug/AcpiDebugDxe.inf                |  63 +++
> >  .../AcpiDebug/AcpiDebugSmm.inf                |  65 +++
> >  .../AdvancedFeaturePkg/AcpiDebug/Readme.txt   |  47 ++
> >  .../AdvancedFeaturePkg/AdvancedFeaturePkg.dec |   6 +
> >  .../AdvancedFeaturePkg/AdvancedFeaturePkg.dsc |   2 +
> >  7 files changed, 777 insertions(+)
> >  create mode 100644
> > Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.asl
> >  create mode 100644
> > Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebug.c
> >  create mode 100644
> > Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugDxe.inf
> >  create mode 100644
> > Platform/Intel/AdvancedFeaturePkg/AcpiDebug/AcpiDebugSmm.inf
> >  create mode 100644
> > Platform/Intel/AdvancedFeaturePkg/AcpiDebug/Readme.txt
> 
> What repository is this for? Is it for edk2-platforms? Such patches should be
> posted with a subject prefix like [edk2-platforms PATCH], please.
> 
> Thanks
> Laszlo

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

end of thread, other threads:[~2019-04-02  0:03 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-04-01  3:16 [Patch] AdvancedFeaturePkg/AcpiDebug: Add new AcpiDebug modules Eric Dong
2019-04-01  3:26 ` Dong, Eric
2019-04-01 16:52 ` Laszlo Ersek
2019-04-02  0:02   ` Dong, Eric

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