public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Wu, Hao A" <hao.a.wu@intel.com>
To: "Ni, Ray" <ray.ni@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Dong, Eric" <eric.dong@intel.com>,
	Laszlo Ersek <lersek@redhat.com>,
	"Zeng, Star" <star.zeng@intel.com>,
	"Fu, Siyuan" <siyuan.fu@intel.com>,
	"Kinney, Michael D" <michael.d.kinney@intel.com>
Subject: Re: [PATCH v1 2/4] UefiCpuPkg/MpInitLib: Reduce the size when loading microcode patches
Date: Tue, 24 Dec 2019 05:48:45 +0000	[thread overview]
Message-ID: <B80AF82E9BFB8E4FBD8C89DA810C6A093C974CBE@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <734D49CCEBEEF84792F5B80ED585239D5C3A9E32@SHSMSX104.ccr.corp.intel.com>

> -----Original Message-----
> From: Ni, Ray
> Sent: Tuesday, December 24, 2019 11:32 AM
> To: Wu, Hao A; devel@edk2.groups.io
> Cc: Dong, Eric; Laszlo Ersek; Zeng, Star; Fu, Siyuan; Kinney, Michael D
> Subject: RE: [PATCH v1 2/4] UefiCpuPkg/MpInitLib: Reduce the size when
> loading microcode patches
> 
> 6 minor comments.


Hello Ray,

Thanks for the feedbacks.

For 1,2,4,5, I will update the patch to address your comments.

For 3, my concern is that:

ALIGN_VALUE (TotalSize , SIZE_1KB) 

might have a chance to overflow, how about changing the logic to:

      if (TotalSize > ALIGN_VALUE (TotalSize, SIZE_1KB) ||
          ALIGN_VALUE (TotalSize, SIZE_1KB) > MAX_UINTN - TotalLoadSize) {
        goto OnExit;
      }

For 6, the 'ApInitReconfig' flag value is still being used in function
ResetProcessorToIdleState().

Also, I found that there are several places in MpInitLib that use:

  CpuMpData->InitFlag != ApInitDone
  CpuMpData->InitFlag != ApInitConfig

In some if statements.

So I prefer the evaluation of the removal of the 'ApInitReconfig' flag value to
be handled in another separate patch series. Do you agree?

Best Regards,
Hao Wu


> 
> > -----Original Message-----
> > From: Wu, Hao A <hao.a.wu@intel.com>
> > Sent: Tuesday, December 24, 2019 9:37 AM
> > To: devel@edk2.groups.io
> > Cc: Wu, Hao A <hao.a.wu@intel.com>; Dong, Eric <eric.dong@intel.com>; Ni,
> > Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>; Zeng, Star
> > <star.zeng@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>; Kinney, Michael
> > D <michael.d.kinney@intel.com>
> > Subject: [PATCH v1 2/4] UefiCpuPkg/MpInitLib: Reduce the size when
> > loading microcode patches
> >
> > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=2429
> >
> > This commit will attempt to reduce the copy size when loading the
> > microcode patches data from flash into memory.
> >
> > Such optimization is done by a pre-process of the microcode patch headers
> > (on flash). A microcode patch will be loaded into memory only when the
> > below 2 criteria are met:
> >
> > A. With a microcode patch header (which means the data is not padding data
> >    between microcode patches);
> > B. The 'ProcessorSignature' & 'ProcessorFlags' fields in the header match
> >    at least one processor within system.
> >
> > Criterion B will require all the processors to be woken up once to collect
> > their CPUID and Platform ID information. Hence, this commit will move the
> > copy, detect and apply of microcode patch on BSP and APs after all the
> > processors have been woken up.
> >
> > Cc: Eric Dong <eric.dong@intel.com>
> > Cc: Ray Ni <ray.ni@intel.com>
> > Cc: Laszlo Ersek <lersek@redhat.com>
> > Cc: Star Zeng <star.zeng@intel.com>
> > Cc: Siyuan Fu <siyuan.fu@intel.com>
> > Cc: Michael D Kinney <michael.d.kinney@intel.com>
> > Signed-off-by: Hao A Wu <hao.a.wu@intel.com>
> > ---
> >  UefiCpuPkg/Library/MpInitLib/MpLib.h     |  24 ++
> >  UefiCpuPkg/Library/MpInitLib/Microcode.c | 235 ++++++++++++++++++++
> >  UefiCpuPkg/Library/MpInitLib/MpLib.c     |  82 ++-----
> >  3 files changed, 283 insertions(+), 58 deletions(-)
> >
> > diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h
> > b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> > index 4440dc2701..56b0df664a 100644
> > --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
> > +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> > @@ -44,6 +44,20 @@
> >  #define CPU_SWITCH_STATE_LOADED 2
> >
> >  //
> > +// Default maximum number of entries to store the microcode patches
> > information
> > +//
> > +#define DEFAULT_MAX_MICROCODE_PATCH_NUM 8
> > +
> > +//
> > +// Data structure for microcode patch information
> > +//
> > +typedef struct {
> > +  UINTN    Address;
> > +  UINTN    Size;
> > +  UINTN    AlignedSize;
> > +} MICROCODE_PATCH_INFO;
> > +
> > +//
> >  // CPU exchange information for switch BSP
> >  //
> >  typedef struct {
> > @@ -576,6 +590,16 @@ MicrocodeDetect (
> >    );
> >
> >  /**
> > +  Load the required microcode patches data into memory.
> > +
> > +  @param[in, out]  CpuMpData    The pointer to CPU MP Data structure.
> > +**/
> > +VOID
> > +LoadMicrocodePatch (
> > +  IN OUT CPU_MP_DATA             *CpuMpData
> > +  );
> > +
> > +/**
> >    Detect whether Mwait-monitor feature is supported.
> >
> >    @retval TRUE    Mwait-monitor feature is supported.
> > diff --git a/UefiCpuPkg/Library/MpInitLib/Microcode.c
> > b/UefiCpuPkg/Library/MpInitLib/Microcode.c
> > index 199b1f23ce..68088b26a5 100644
> > --- a/UefiCpuPkg/Library/MpInitLib/Microcode.c
> > +++ b/UefiCpuPkg/Library/MpInitLib/Microcode.c
> > @@ -331,3 +331,238 @@ Done:
> >         MicroData [0x%08x], Revision [0x%08x]\n", Eax.Uint32, ProcessorFlags,
> > (UINTN) MicrocodeData, LatestRevision));
> >    }
> >  }
> > +
> > +/**
> > +  Actual worker function that loads the required microcode patches into
> > memory.
> > +
> > +  @param[in, out]  CpuMpData          The pointer to CPU MP Data structure.
> > +  @param[in]       PatchInfoBuffer    The pointer to an array of information
> on
> > +                                      the microcode patches that will be loaded
> > +                                      into memory.
> > +  @param[in]       PatchNumber        The number of microcode patches that
> > will
> > +                                      be loaded into memory.
> > +  @param[in]       TotalLoadSize      The total size of all the microcode
> > +                                      patches to be loaded.
> > +**/
> > +VOID
> > +LoadMicrocodePatchWorker (
> > +  IN OUT CPU_MP_DATA             *CpuMpData,
> > +  IN     MICROCODE_PATCH_INFO    *PatchInfoBuffer,
> > +  IN     UINTN                   PatchNumber,
> 
> 1. "PatchInfoBuffer" -> "Patches"?
> "PatchNumber" -> "PatchCount"?
> 
> > +  //
> > +  // Load all the required microcode patches into memory
> > +  //
> > +  for (Walker = MicrocodePatchInRam, Index = 0; Index < PatchNumber;
> > Index++) {
> > +    CopyMem (
> > +      Walker,
> > +      (VOID *) PatchInfoBuffer[Index].Address,
> > +      PatchInfoBuffer[Index].Size
> > +      );
> > +
> > +    if (PatchInfoBuffer[Index].AlignedSize > PatchInfoBuffer[Index].Size) {
> 
> 2. This if-check is not needed because AlignedSize always >= Size.
> Below ZeroMem() will directly return due to the 2nd parameter is 0.
> 
> > +      //
> > +      // Zero-fill the padding area
> > +      //
> > +      ZeroMem (
> > +        Walker + PatchInfoBuffer[Index].Size,
> > +        PatchInfoBuffer[Index].AlignedSize - PatchInfoBuffer[Index].Size
> > +        );
> > +    }
> > +
> 
> > +      if (TotalSize > MAX_UINTN - TotalLoadSize ||
> > +          ALIGN_VALUE (TotalSize, SIZE_1KB) > MAX_UINTN - TotalLoadSize) {
> > +        goto OnExit;
> > +      }
> 3. ALIGN_VALUE (TotalSize , SIZE_1KB) always >= TotalSize.
> So can we only check
>   ALIGN_VALUE (TotalSize, SIZE_1KB) > MAX_UINTN - TotalLoadSize
> ?
> 
> 
> > +      PatchInfoBuffer[PatchNumber - 1].Address     = (UINTN)
> > MicrocodeEntryPoint;
> > +      PatchInfoBuffer[PatchNumber - 1].Size        = TotalSize;
> > +      PatchInfoBuffer[PatchNumber - 1].AlignedSize = ALIGN_VALUE
> > (TotalSize, SIZE_1KB);
> 
> 4. "PatchNumber" -> "PatchCount"?
> 
> > +      TotalLoadSize += PatchInfoBuffer[PatchNumber - 1].AlignedSize;
> > +    }
> > +
> > +    //
> > +    // Process the next microcode patch
> > +    //
> > +    MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *) (((UINTN)
> > MicrocodeEntryPoint) + TotalSize);
> > +  } while (((UINTN) MicrocodeEntryPoint < MicrocodeEnd));
> > +
> > +  if (PatchNumber == 0) {
> > +    //
> > +    // No patch needs to be loaded
> > +    //
> > +    goto OnExit;
> 
> 5. This "goto" is not necessary. You can call below two lines when PatchCount !=
> 0.
> Less "goto" is better.
> 
> > +  }
> > +
> > +  DEBUG ((
> > +    DEBUG_INFO,
> > +    "%a: 0x%x microcode patches will be loaded into memory, with size
> > 0x%x.\n",
> > +    __FUNCTION__, PatchNumber, TotalLoadSize
> > +    ));
> > +
> > +  LoadMicrocodePatchWorker (CpuMpData, PatchInfoBuffer, PatchNumber,
> > TotalLoadSize);
> > +
> > +OnExit:
> > +  if (PatchInfoBuffer != NULL) {
> > +    FreePool (PatchInfoBuffer);
> > +  }
> > +  return;
> > +}
> 
> > @@ -1788,7 +1752,6 @@ MpInitLibInitialize (
> >      //
> >      CpuMpData->CpuCount  = OldCpuMpData->CpuCount;
> >      CpuMpData->BspNumber = OldCpuMpData->BspNumber;
> > -    CpuMpData->InitFlag  = ApInitReconfig;
> 
> 6. Do you think that ApInitReconfig definition can be removed?


  reply	other threads:[~2019-12-24  5:48 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-24  1:36 [PATCH v1 0/4] Microcode related optimizations Wu, Hao A
2019-12-24  1:36 ` [PATCH v1 1/4] UefiCpuPkg/MpInitLib: Collect processors' CPUID & Platform ID info Wu, Hao A
2019-12-24  2:51   ` Ni, Ray
2019-12-24  1:36 ` [PATCH v1 2/4] UefiCpuPkg/MpInitLib: Reduce the size when loading microcode patches Wu, Hao A
2019-12-24  3:32   ` Ni, Ray
2019-12-24  5:48     ` Wu, Hao A [this message]
2019-12-24  1:36 ` [PATCH v1 3/4] UefiCpuPkg: Add definitions for EDKII microcode patch HOB Wu, Hao A
2019-12-24  3:48   ` Ni, Ray
2019-12-24  5:48     ` Wu, Hao A
2019-12-24  8:15   ` Ni, Ray
2019-12-25  5:42     ` Wu, Hao A
2019-12-24  1:36 ` [PATCH v1 4/4] UefiCpuPkg/MpInitLib: Produce " Wu, Hao A
2019-12-24  3:54   ` Ni, Ray
2019-12-25  5:42     ` Wu, Hao A

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=B80AF82E9BFB8E4FBD8C89DA810C6A093C974CBE@SHSMSX104.ccr.corp.intel.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