From: "Laszlo Ersek" <lersek@redhat.com>
To: Ray Ni <ray.ni@intel.com>, devel@edk2.groups.io
Cc: Eric Dong <eric.dong@intel.com>, Rahul Kumar <rahul1.kumar@intel.com>
Subject: Re: [PATCH v2] UefiCpuPkg/MpInitLib: avoid printing debug messages in AP
Date: Tue, 16 Mar 2021 17:44:48 +0100 [thread overview]
Message-ID: <0bcd4862-376c-9dc7-0cfe-0baed696a9e0@redhat.com> (raw)
In-Reply-To: <20210316015203.1507-1-ray.ni@intel.com>
On 03/16/21 02:52, Ray Ni wrote:
> MpInitLib contains a function MicrocodeDetect() which is called by
> all threads as an AP procedure.
> Today this function contains below code:
>
> if (CurrentRevision != LatestRevision) {
> AcquireSpinLock(&CpuMpData->MpLock);
> DEBUG ((
> EFI_D_ERROR,
> "Updated microcode signature [0x%08x] does not match \
> loaded microcode signature [0x%08x]\n",
> CurrentRevision, LatestRevision
> ));
> ReleaseSpinLock(&CpuMpData->MpLock);
> }
>
> When the if-check is passed, the code may call into PEI services:
> 1. AcquireSpinLock
> When the PcdSpinTimeout is not 0, TimerLib
> GetPerformanceCounterProperties() is called. And some of the
> TimerLib implementations would get the information cached in
> HOB. But AP procedure cannot call PEI services to retrieve the
> HOB list.
>
> 2. DEBUG
> Certain DebugLib relies on ReportStatusCode services and the
> ReportStatusCode PPI is retrieved through the PEI services.
> DebugLibSerialPort should be used.
> But when SerialPortLib is implemented to depend on PEI services,
> even using DebugLibSerialPort can still cause AP calls PEI
> services resulting hang.
>
> It causes a lot of debugging effort on the platform side.
>
> There are 2 options to fix the problem:
> 1. make sure platform DSC chooses the proper DebugLib and set the
> PcdSpinTimeout to 0. So that AcquireSpinLock and DEBUG don't call
> PEI services.
> 2. remove the AcquireSpinLock and DEBUG call from the procedure.
>
> Option #2 is preferred because it's not practical to ask every
> platform DSC to be written properly.
>
> Following option #2, there are two sub-options:
> 2.A. Just remove the if-check.
> 2.B. Capture the CurrentRevision and ExpectedRevision in the memory
> for each AP and print them together from BSP.
>
> The patch follows option 2.B.
>
> Signed-off-by: Ray Ni <ray.ni@intel.com>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Cc: Rahul Kumar <rahul1.kumar@intel.com>
> ---
> UefiCpuPkg/Library/MpInitLib/Microcode.c | 11 +----------
> UefiCpuPkg/Library/MpInitLib/MpLib.c | 25 ++++++++++++++++++++++++
> UefiCpuPkg/Library/MpInitLib/MpLib.h | 1 +
> 3 files changed, 27 insertions(+), 10 deletions(-)
>
> diff --git a/UefiCpuPkg/Library/MpInitLib/Microcode.c b/UefiCpuPkg/Library/MpInitLib/Microcode.c
> index 15629591e2..297c2abcd1 100644
> --- a/UefiCpuPkg/Library/MpInitLib/Microcode.c
> +++ b/UefiCpuPkg/Library/MpInitLib/Microcode.c
> @@ -315,17 +315,8 @@ Done:
> MSR_IA32_BIOS_UPDT_TRIG,
> (UINT64) (UINTN) MicrocodeData
> );
> - //
> - // Get and check new microcode signature
> - //
> - CurrentRevision = GetCurrentMicrocodeSignature ();
> - if (CurrentRevision != LatestRevision) {
> - AcquireSpinLock(&CpuMpData->MpLock);
> - DEBUG ((EFI_D_ERROR, "Updated microcode signature [0x%08x] does not match \
> - loaded microcode signature [0x%08x]\n", CurrentRevision, LatestRevision));
> - ReleaseSpinLock(&CpuMpData->MpLock);
> - }
> }
> + CpuMpData->CpuData[ProcessorNumber].MicrocodeRevision = GetCurrentMicrocodeSignature ();
> }
>
> /**
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
> index 5040053dad..3d945972a0 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
> +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
> @@ -2135,6 +2135,31 @@ MpInitLibInitialize (
> }
> }
>
> + //
> + // Dump the microcode revision for each core.
> + //
> + DEBUG_CODE (
> + UINT32 ThreadId;
> + UINT32 ExpectedMicrocodeRevision;
> + CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
> + for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
> + GetProcessorLocationByApicId (CpuInfoInHob[Index].InitialApicId, NULL, NULL, &ThreadId);
> + if (ThreadId == 0) {
> + //
> + // MicrocodeDetect() loads microcode in first thread of each core, so,
> + // CpuMpData->CpuData[Index].MicrocodeEntryAddr is initialized only for first thread of each core.
> + //
> + ExpectedMicrocodeRevision = 0;
> + if (CpuMpData->CpuData[Index].MicrocodeEntryAddr != 0) {
> + ExpectedMicrocodeRevision = ((CPU_MICROCODE_HEADER *)(UINTN)CpuMpData->CpuData[Index].MicrocodeEntryAddr)->UpdateRevision;
> + }
> + DEBUG ((
> + DEBUG_INFO, "CPU[%04d]: Microcode revision = %08x, expected = %08x\n",
> + Index, CpuMpData->CpuData[Index].MicrocodeRevision, ExpectedMicrocodeRevision
> + ));
> + }
> + }
> + );
> //
> // Initialize global data for MP support
> //
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> index 0bd60388b1..66f9eb2304 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
> +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> @@ -144,6 +144,7 @@ typedef struct {
> UINT32 ProcessorSignature;
> UINT8 PlatformId;
> UINT64 MicrocodeEntryAddr;
> + UINT32 MicrocodeRevision;
> } CPU_AP_DATA;
>
> //
>
Acked-by: Laszlo Ersek <lersek@redhat.com>
next prev parent reply other threads:[~2021-03-16 16:44 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-16 1:52 [PATCH v2] UefiCpuPkg/MpInitLib: avoid printing debug messages in AP Ni, Ray
2021-03-16 16:44 ` Laszlo Ersek [this message]
2021-03-17 4:55 ` Dong, Eric
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0bcd4862-376c-9dc7-0cfe-0baed696a9e0@redhat.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox