From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.43; helo=mga05.intel.com; envelope-from=eric.dong@intel.com; receiver=edk2-devel@lists.01.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 7BF82211E011B for ; Sun, 31 Mar 2019 20:27:00 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 31 Mar 2019 20:26:59 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,295,1549958400"; d="scan'208";a="333788441" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by fmsmga005.fm.intel.com with ESMTP; 31 Mar 2019 20:26:59 -0700 Received: from fmsmsx120.amr.corp.intel.com (10.18.124.208) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.408.0; Sun, 31 Mar 2019 20:26:59 -0700 Received: from shsmsx108.ccr.corp.intel.com (10.239.4.97) by fmsmsx120.amr.corp.intel.com (10.18.124.208) with Microsoft SMTP Server (TLS) id 14.3.408.0; Sun, 31 Mar 2019 20:26:58 -0700 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.206]) by SHSMSX108.ccr.corp.intel.com ([169.254.8.147]) with mapi id 14.03.0415.000; Mon, 1 Apr 2019 11:26:57 +0800 From: "Dong, Eric" To: "Dong, Eric" , "edk2-devel@lists.01.org" CC: "Wu, Hao A" , "Kubacki, Michael A" Thread-Topic: [edk2] [Patch] AdvancedFeaturePkg/AcpiDebug: Add new AcpiDebug modules. Thread-Index: AQHU6DlleOBwHvHuXkWM6MnCKeRWJ6YmpJnw Date: Mon, 1 Apr 2019 03:26:56 +0000 Message-ID: References: <20190401031638.14692-1-eric.dong@intel.com> In-Reply-To: <20190401031638.14692-1-eric.dong@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [Patch] AdvancedFeaturePkg/AcpiDebug: Add new AcpiDebug modules. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 01 Apr 2019 03:27:00 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Include Package owner Kubacki. Already in the Cc list but don't know why n= ot 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 > Subject: [edk2] [Patch] AdvancedFeaturePkg/AcpiDebug: Add new > AcpiDebug modules. >=20 > Add new AcpiDebug modules which provide ACPI Debug feature. > Detail about this feature see the readme.txt in the patch. >=20 > Change-Id: Ib977ece46f3494301574b04af32282b99045f673 > Cc: Hao Wu > Cc: Michael Kubacki > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Eric Dong > --- > .../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 >=20 > 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.
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, fixe= d > 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 regi= on > 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 St= ring > + Store (0, TRUN) > + If (LGreaterEqual (SizeOf (Local1), 32)) > + { > + Store (1, TRUN) // the input from ASL >=3D 32 > + } > + Mid (Local1, 0, 31, AAAA) // extract the input to current > + buffer > + > + Add (CPTR, 32, CPTR) // advance current pointer to next string l= ocation > in memory buffer > + If (LGreaterEqual (CPTR, EPTR) ) // check for end of 64kb Acpi d= ebug > 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.
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 > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > + > +#define ACPI_DEBUG_STR "INTEL ACPI DEBUG" > + > +// > +// ASL NAME structure > +// > +#pragma pack(1) > +typedef struct { > + UINT8 NameOp; // Byte [0]=3D0x08:NameOp. > + UINT32 NameString; // Byte [4:1]=3DName of object. > + UINT8 DWordPrefix; // Byte [5]=3D0x0C: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 o= ut > + 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 =3D 0; > +ACPI_DEBUG_HEAD *mAcpiDebug =3D NULL; > + > +EFI_SMM_SYSTEM_TABLE2 *mSmst =3D 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 h= ead. > + @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 =3D 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 h= ere > so load the table. > + // > + ASSERT (((EFI_ACPI_DESCRIPTION_HEADER *) TableHeader)->OemTableId > =3D=3D > + 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 =3D 1; > + for (CurrPtr =3D (UINT8 *) TableHeader; CurrPtr <=3D ((UINT8 *) TableH= eader + > TableHeader->Length) && UpdateCounter < 4; CurrPtr++) { > + Signature =3D (UINT32 *) (CurrPtr + 1); > + // > + // patch DPTR (address of Acpi debug memory buffer) > + // > + if ((*CurrPtr =3D=3D AML_NAME_OP) && *Signature =3D=3D SIGNATURE_32 = ('D', > 'P', 'T', 'R')) { > + NamePtr =3D (NAME_LAYOUT *) CurrPtr; > + NamePtr->Value =3D (UINT32) (UINTN) AcpiDebugAddress; > + UpdateCounter++; > + } > + // > + // patch EPTR (end of Acpi debug memory buffer) > + // > + if ((*CurrPtr =3D=3D AML_NAME_OP) && *Signature =3D=3D SIGNATURE_32 = ('E', > 'P', 'T', 'R')) { > + NamePtr =3D (NAME_LAYOUT *) CurrPtr; > + NamePtr->Value =3D BufferEnd; > + UpdateCounter++; > + } > + // > + // patch CPTR (used as an index that starts after the Acpi Debug hea= d) > + // > + if ((*CurrPtr =3D=3D AML_NAME_OP) && *Signature =3D=3D SIGNATURE_32 = ('C', > 'P', 'T', 'R')) { > + NamePtr =3D (NAME_LAYOUT *) CurrPtr; > + NamePtr->Value =3D BufferIndex; > + UpdateCounter++; > + } > + } > + > + // > + // Add the table > + // > + Status =3D gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOI= D > + **)&AcpiTable); ASSERT_EFI_ERROR (Status); > + > + TableKey =3D 0; > + Status =3D 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 =3D 0; > + *BufferSize =3D 0; > + > + if (PcdGetBool (PcdAcpiDebugEnable)) { > + // > + // Reserve memory to store Acpi Debug data. > + // > + AcpiDebugAddress =3D 0xFFFFFFFF; > + Status =3D gBS->AllocatePages ( > + AllocateMaxAddress, > + EfiReservedMemoryType, > + EFI_SIZE_TO_PAGES (PcdGet32 (PcdAcpiDebugBufferSize)= ), > + &AcpiDebugAddress > + ); > + ASSERT_EFI_ERROR(Status); > + > + DEBUG ((DEBUG_INFO, "AcpiDebugAddress - 0x%08x\n", > + AcpiDebugAddress)); > + > + Status =3D PcdSet32S (PcdAcpiDebugAddress, (UINT32) AcpiDebugAddress= ); > + ASSERT_EFI_ERROR(Status); > + *BufferSize =3D PcdGet32 (PcdAcpiDebugBufferSize); } > + > + return AcpiDebugAddress; > +} > + > +/** > + Acpi Debug EndOfDxe notification. > + > + @param[in] Event Event whose notification function is being invok= ed. > + @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 =3D (ACPI_DEBUG_HEAD *) (UINTN) > AllocateAcpiDebugMemory > + (&BufferSize); if (mAcpiDebug !=3D 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 DE= BUG". > + // > + CopyMem ((VOID *) mAcpiDebug, ACPI_DEBUG_STR, sizeof > + (ACPI_DEBUG_STR) - 1); > + > + BufferIndex =3D (UINT32) (UINTN) mAcpiDebug; > + mBufferEnd =3D BufferIndex + BufferSize; > + > + // > + // Leave the Index after the Acpi Debug head. > + // > + BufferIndex +=3D AD_SIZE; > + > + // > + // Patch and Load the SSDT ACPI Tables. > + // > + PatchAndLoadAcpiTable (mAcpiDebug, BufferIndex, mBufferEnd); > + > + mAcpiDebug->Head =3D BufferIndex; > + mAcpiDebug->Tail =3D BufferIndex; > + mAcpiDebug->BufferSize =3D 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 =3D 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 contex= t 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 environme= nt into an SMM > environment. > + @param[in, out] CommBufferSize The size of the CommBuffer. > + > + @retval EFI_SUCCESS The interrupt was handled successful= ly. > + > +**/ > +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 !=3D (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 >=3D (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 =3D=3D '\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 +=3D MAX_BUFFER_SIZE; > + > + if (mAcpiDebug->Head >=3D (mAcpiDebug->Tail)){ > + // > + // When head =3D=3D tail, we do nothing in handler. > + // > + mAcpiDebug->Head =3D 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 =3D=3D '\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 +=3D MAX_BUFFER_SIZE; > + > + if (mAcpiDebug->Head >=3D (UINT32) ((UINTN) mAcpiDebug + > mAcpiDebug->BufferSize)) { > + // > + // We met end of buffer. > + // > + mAcpiDebug->Wrap =3D 0; > + mAcpiDebug->Head =3D (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 !=3D NULL) { > + // > + // Get the Sw dispatch protocol and register SMI callback function. > + // > + SwDispatch =3D NULL; > + Status =3D mSmst->SmmLocateProtocol > (&gEfiSmmSwDispatch2ProtocolGuid, NULL, (VOID **) &SwDispatch); > + ASSERT_EFI_ERROR (Status); > + SwContext.SwSmiInputValue =3D (UINTN) -1; > + Status =3D SwDispatch->Register (SwDispatch, AcpiDebugSmmCallback, > &SwContext, &SwHandle); > + ASSERT_EFI_ERROR (Status); > + mAcpiDebug->SmiTrigger =3D (UINT8) SwContext.SwSmiInputValue; > + mAcpiDebug->SmmVersion =3D 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 =3D gBS->LocateProtocol (&gEfiSmmBase2ProtocolGuid, NULL, (VOID > + **) &SmmBase2); ASSERT_EFI_ERROR (Status); Status =3D SmmBase2- > >InSmm > + (SmmBase2, &InSmm); ASSERT_EFI_ERROR (Status); ASSERT (InSmm); > + Status =3D SmmBase2->GetSmstLocation (SmmBase2, &mSmst); > + ASSERT_EFI_ERROR (Status); > + > + // > + // Register SmmEndOfDxe notification > + // that point could ensure the Acpi Debug related PCDs initialized. > + // > + Registration =3D NULL; > + Status =3D 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.
# # > +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 =3D 0x00010005 > + BASE_NAME =3D AcpiDebugDxe > + FILE_GUID =3D EC98FF95-242C-4513-B1BC-69FA24111C5= 8 > + MODULE_TYPE =3D DXE_DRIVER > + VERSION_STRING =3D 1.0 > + ENTRY_POINT =3D InitializeAcpiDebugDxe > +# > +# The following information is for reference only and not required by th= e > build tools. > +# > +# VALID_ARCHITECTURES =3D 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.
# # > +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 =3D 0x00010005 > + BASE_NAME =3D AcpiDebugSmm > + FILE_GUID =3D 9069C144-0A7E-41ef-9C07-418BCA9BF93= 9 > + MODULE_TYPE =3D DXE_SMM_DRIVER > + VERSION_STRING =3D 1.0 > + PI_SPECIFICATION_VERSION =3D 0x0001000A > + ENTRY_POINT =3D InitializeAcpiDebugSmm > +# > +# The following information is for reference only and not required by th= e > build tools. > +# > +# VALID_ARCHITECTURES =3D 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 o= n 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 =3D SETUP_DATA.AcpiDebug, > + prompt =3D STRING_TOKEN(STR_ACPI_DEBUG_PROMPT), > + help =3D STRING_TOKEN(STR_ACPI_DEBUG_HELP), > + option text =3D STRING_TOKEN(STR_DISABLED), value =3D 0, flags =3D= DEFAULT > | MANUFACTURING | RESET_REQUIRED; > + option text =3D STRING_TOKEN(STR_ENABLED), value =3D 1, flags =3D > RESET_REQUIRED; > + endoneof; > + > + suppressif ideqval SETUP_DATA.AcpiDebug =3D=3D 0; > + text > + help =3D STRING_TOKEN(STR_ACPI_DEBUG_ADDRESS_HELP), > + text =3D STRING_TOKEN(STR_ACPI_DEBUG_ADDRESS_NAME), > + text =3D STRING_TOKEN(STR_ACPI_DEBUG_ADDRESS_VALUE), > + flags =3D 0, > + key =3D 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 =3D > {0xa8514688, 0x6693, 0x4ab5, {0xaa, >=20 > [PcdsFixedAtBuild] >=20 > 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 >=20 > [PcdsDynamic, PcdsDynamicEx] >=20 > gAdvancedFeaturePkgTokenSpaceGuid.PcdIpmiIoBaseAddress|0xCA2|UINT > 16|0x90000022 >=20 > gAdvancedFeaturePkgTokenSpaceGuid.PcdFRB2EnabledFlag|TRUE|BOOLEA > N|0x10000030 >=20 > gAdvancedFeaturePkgTokenSpaceGuid.PcdFRBTimeoutValue|360|UINT16|0 > x10000040 > + ## This PCD specifies AcpiDebug buffer address > + > + > gAdvancedFeaturePkgTokenSpaceGuid.PcdAcpiDebugAddress|0|UINT32|0x > 00000 > + 014 >=20 > [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 >=20 > + AdvancedFeaturePkg/AcpiDebug/AcpiDebugDxe.inf > + AdvancedFeaturePkg/AcpiDebug/AcpiDebugSmm.inf > \ No newline at end of file > -- > 2.21.0.windows.1 >=20 > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel