* [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