Thanks Mike. I have checked in SVN 18958, with comment update as your 
suggestion.

-----Original Message-----
From: Kinney, Michael D 
Sent: Thursday, November 26, 2015 2:39 AM
To: Laszlo Ersek; edk2-de...@ml01.01.org; Kinney, Michael D
Cc: Yao, Jiewen; Fan, Jeff
Subject: RE: [edk2] [PATCH v2 2/2] UefiCpuPkg/CpuS3DataDxe: Add module to 
initialize ACPI_CPU_DATA for S3

Laszlo,

I have rb Jiewen's patch to SmmCpuFeaturesLib, so it should go in soon.

Mike

> -----Original Message-----
> From: Laszlo Ersek [mailto:ler...@redhat.com]
> Sent: Wednesday, November 25, 2015 10:23 AM
> To: Kinney, Michael D <michael.d.kin...@intel.com>; 
> edk2-de...@ml01.01.org
> Cc: Yao, Jiewen <jiewen....@intel.com>; Fan, Jeff <jeff....@intel.com>
> Subject: Re: [edk2] [PATCH v2 2/2] UefiCpuPkg/CpuS3DataDxe: Add module 
> to initialize ACPI_CPU_DATA for S3
> 
> On 11/25/15 18:05, Kinney, Michael D wrote:
> > Laszlo,
> >
> > Thanks for the feedback and the testing!
> >
> > I have made the updates you suggested in this series except for 
> > removing the lines that initialize the RegisterTable fields.  I left 
> > those there to make it easier for CPU/Platform package that needs to 
> > use this module as a starting point for a custom version.
> >
> > This series has been committed, so it is now available for use with 
> > your OVMF SMM v5 series.
> 
> /me does a little dance
> 
> Thank you :)
> 
> What do you think about the scheduling between the OVMF SMM series and:
> 
> http://thread.gmane.org/gmane.comp.bios.edk2.devel/4770/focus=4832
> 
> Do you think it makes sense for me to await until Jiewen's series too 
> is committed, and post v5 on top of that?
> 
> (This means copying the null implementations of
> SmmCpuFeaturesCompleteSmmReadyToLock() and
> SmmCpuFeaturesAllocatePageTableMemory() into OVMF's SmmCpuFeaturesLib 
> instance, for v5.)
> 
> Thanks!
> Laszlo
> 
> >
> > Mike
> >
> >> -----Original Message-----
> >> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf 
> >> Of Laszlo Ersek
> >> Sent: Wednesday, November 25, 2015 3:04 AM
> >> To: Kinney, Michael D <michael.d.kin...@intel.com>; 
> >> edk2-de...@ml01.01.org
> >> Cc: Yao, Jiewen <jiewen....@intel.com>; Fan, Jeff 
> >> <jeff....@intel.com>
> >> Subject: Re: [edk2] [PATCH v2 2/2] UefiCpuPkg/CpuS3DataDxe: Add 
> >> module to initialize ACPI_CPU_DATA for S3
> >>
> >> On 11/25/15 00:47, Michael Kinney wrote:
> >>> This module initializes the ACPI_CPU_DATA structure and registers 
> >>> the address of this structure in the PcdCpuS3DataAddress PCD.  
> >>> This is a generic/simple version of this module.  It does not 
> >>> provide a machine check handler or CPU register initialization tables for 
> >>> ACPI S3 resume.
> >>> It also only supports the number of CPUs reported by the MP 
> >>> Services Protocol, so this module does not support hot plug CPUs.  
> >>> This module can be copied into a CPU specific package and 
> >>> customized if these additional features are required.
> >>>
> >>> This patch series is in response to the OvmfPkg patch series from 
> >>> Laszlo Ersek that enables SMM on OVMF.  The v4 version of the 
> >>> patch series from Laszlo includes an OVMF specific CPU module to 
> >>> initialize the ACPI_CPU_DATA structure.
> >>>
> >>> This proposed patch series replaces the patches listed below.
> >>>
> >>> [PATCH v4 27/41] OvmfPkg:
> >>>   add skeleton QuarkPort/CpuS3DataDxe
> >>>
> >>> [PATCH v4 28/41] OvmfPkg:
> >>>   QuarkPort/CpuS3DataDxe: fill in ACPI_CPU_DATA.StartupVector
> >>>
> >>> [PATCH v4 29/41] OvmfPkg:
> >>>   QuarkPort/CpuS3DataDxe: handle IDT, GDT and MCE in ACPI_CPU_DATA
> >>>
> >>> [PATCH v4 30/41] OvmfPkg:
> >>>   QuarkPort/CpuS3DataDxe: handle StackAddress and StackSize
> >>>
> >>> [PATCH v4 31/41] OvmfPkg:
> >>>   import CpuConfigLib header from 
> >>> Quark_EDKII_v1.1.0/IA32FamilyCpuBasePkg
> >>>
> >>> [PATCH v4 32/41] OvmfPkg:
> >>>   QuarkPort/CpuS3DataDxe: fill in ACPI_CPU_DATA.NumberOfCpus
> >>>
> >>> [PATCH v4 33/41] OvmfPkg:
> >>>   QuarkPort/CpuS3DataDxe: fill in ACPI_CPU_DATA.MtrrTable
> >>>
> >>> [PATCH v4 34/41] OvmfPkg:
> >>>   QuarkPort/CpuS3DataDxe: handle register tables in ACPI_CPU_DATA
> >>>
> >>> [PATCH v4 35/41] OvmfPkg:
> >>>   port CpuS3DataDxe to X64
> >>>
> >>> [PATCH v4 36/41] OvmfPkg:
> >>>   build QuarkPort/CpuS3DataDxe for -D SMM_REQUIRE
> >>>
> >>> Cc: Laszlo Ersek <ler...@redhat.com>
> >>> Cc: "Yao, Jiewen" <jiewen....@intel.com>
> >>> Cc: "Fan, Jeff" <jeff....@intel.com>
> >>> Contributed-under: TianoCore Contribution Agreement 1.0
> >>> Signed-off-by: Michael Kinney <michael.d.kin...@intel.com>
> >>> ---
> >>>  UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c      | 271 
> >>> +++++++++++++++++++++++++++++++
> >>>  UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf |  64 ++++++++
> >>>  UefiCpuPkg/UefiCpuPkg.dsc                |   1 +
> >>>  3 files changed, 336 insertions(+)  create mode 100644 
> >>> UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> >>>  create mode 100644 UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
> >>
> >> (1) The commit message looks great, thank you very much for the references.
> >>
> >> A small request: please mark, under "port CpuS3DataDxe to X64" 
> >> (i.e., [PATCH v4 35/41]), that that patch was originally authored by Paolo 
> >> Bonzini.
> >>
> >> There's no need to submit a v3 of this series just because of this; 
> >> it can be fixed up before committing the patch.
> >>
> >>>
> >>> diff --git a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c 
> >>> b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> >>> new file mode 100644
> >>> index 0000000..7cf923d
> >>> --- /dev/null
> >>> +++ b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> >>> @@ -0,0 +1,271 @@
> >>> +/** @file
> >>> +ACPI CPU Data initialization module
> >>> +
> >>> +This module initializes the ACPI_CPU_DATA structure and registers 
> >>> +the address of this structure in the PcdCpuS3DataAddress PCD.  
> >>> +This is a generic/simple version of this module.  It does not 
> >>> +provide a machine check handler or CPU register initialization 
> >>> +tables for ACPI S3 resume.  It also only supports the number of 
> >>> +CPUs reported by the MP Services Protocol, so this module does 
> >>> +not support hot plug CPUs.  This module can be copied into a CPU 
> >>> specific package and customized if these additional features are required.
> >>> +
> >>> +Copyright (c) 2013 - 2015, Intel Corporation. All rights 
> >>> +reserved.<BR> Copyright (c) 2015, Red Hat, Inc.
> >>> +
> >>> +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.
> >>> +
> >>> +**/
> >>> +
> >>> +#include <PiDxe.h>
> >>> +
> >>> +#include <AcpiCpuData.h>
> >>> +
> >>> +#include <Library/BaseLib.h>
> >>> +#include <Library/BaseMemoryLib.h> #include 
> >>> +<Library/UefiBootServicesTableLib.h>
> >>> +#include <Library/DebugLib.h>
> >>> +#include <Library/MtrrLib.h>
> >>> +
> >>> +#include <Protocol/MpService.h>
> >>> +#include <Guid/EventGroup.h>
> >>> +
> >>> +//
> >>> +// Data structure used to allocate ACPI_CPU_DATA and its 
> >>> +supporting structures // typedef struct {
> >>> +  ACPI_CPU_DATA             AcpuCpuData;
> >>
> >> (2) Please fix the typo in the name of this field: it should be 
> >> Acp[i]CpuData. Apologies for not noticing it in v1.
> >>
> >> No need to submit a v3 just because of this; can be fixed up on commit.
> >>
> >>> +  MTRR_SETTINGS             MtrrTable;
> >>> +  IA32_DESCRIPTOR           GdtrProfile;
> >>> +  IA32_DESCRIPTOR           IdtrProfile;
> >>> +} ACPI_CPU_DATA_EX;
> >>> +
> >>> +/**
> >>> +  Allocate EfiACPIMemoryNVS below 4G memory address.
> >>> +
> >>> +  This function allocates EfiACPIMemoryNVS below 4G memory address.
> >>> +
> >>> +  @param[in] Size   Size of memory to allocate.
> >>> +
> >>> +  @return       Allocated address for output.
> >>> +
> >>> +**/
> >>> +VOID *
> >>> +AllocateAcpiNvsMemoryBelow4G (
> >>> +  IN UINTN  Size
> >>> +  )
> >>> +{
> >>> +  EFI_PHYSICAL_ADDRESS  Address;
> >>> +  EFI_STATUS            Status;
> >>> +  VOID                  *Buffer;
> >>> +
> >>> +  Address = BASE_4GB - 1;
> >>> +  Status  = gBS->AllocatePages (
> >>> +                   AllocateMaxAddress,
> >>> +                   EfiACPIMemoryNVS,
> >>> +                   EFI_SIZE_TO_PAGES (Size),
> >>> +                   &Address
> >>> +                   );
> >>> +  if (EFI_ERROR (Status)) {
> >>> +    return NULL;
> >>> +  }
> >>> +
> >>> +  Buffer = (VOID *)(UINTN)Address;  ZeroMem (Buffer, Size);
> >>> +
> >>> +  return Buffer;
> >>> +}
> >>> +
> >>> +/**
> >>> +  Callback function executed when the EndOfDxe event group is signaled.
> >>> +
> >>> +  We delay saving the MTRR settings until BDS signals EndOfDxe.
> >>> +
> >>> +  @param[in]  Event    Event whose notification function is being 
> >>> invoked.
> >>> +  @param[out] Context  Pointer to the MTRR_SETTINGS buffer to fill in.
> >>> +**/
> >>> +VOID
> >>> +EFIAPI
> >>> +SaveMtrrsOnEndOfDxe (
> >>> +  IN  EFI_EVENT  Event,
> >>> +  OUT VOID       *Context
> >>> +  )
> >>> +{
> >>> +  DEBUG ((EFI_D_VERBOSE, "%a\n", __FUNCTION__));
> >>> +  MtrrGetAllMtrrs (Context);
> >>> +
> >>> +  //
> >>> +  // Close event, so it will not be invoked again.
> >>> +  //
> >>> +  gBS->CloseEvent (Event);
> >>> +}
> >>> +
> >>> +/**
> >>> +   The entry function of the CpuS3Data driver.
> >>> +
> >>> +   Allocate and initialize all fields of the ACPI_CPU_DATA structure 
> >>> except the
> >>> +   MTRR settings.  Register an event notification on 
> >>> gEfiEndOfDxeEventGroupGuid
> >>> +   to capture the ACPI_CPU_DATA MTRR settings.  The PcdCpuS3DataAddress 
> >>> is set
> >>> +   to the address that ACPI_CPU_DATA is allocated.
> >>
> >> (3) I think the last sentence above should go like:
> >>
> >>   [] PcdCpuS3DataAddress is set to the address that ACPI_CPU_DATA is
> >>   allocated [at].
> >>
> >> Can be fixed up at commit time.
> >>
> >>> +
> >>> +   @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 entry point is executed successfully.
> >>> +   @retval other           Some error occurs when executing this entry 
> >>> point.
> >>> +
> >>> +**/
> >>> +EFI_STATUS
> >>> +EFIAPI
> >>> +CpuS3DataInitialize (
> >>> +  IN EFI_HANDLE        ImageHandle,
> >>> +  IN EFI_SYSTEM_TABLE  *SystemTable
> >>> +  )
> >>> +{
> >>> +  EFI_STATUS                 Status;
> >>> +  ACPI_CPU_DATA_EX           *AcpiCpuDataEx;
> >>> +  ACPI_CPU_DATA              *AcpiCpuData;
> >>> +  EFI_MP_SERVICES_PROTOCOL   *MpServices;
> >>> +  UINTN                      NumberOfCpus;
> >>> +  UINTN                      NumberOfEnabledProcessors;
> >>> +  VOID                       *Stack;
> >>> +  UINTN                      TableSize;
> >>> +  CPU_REGISTER_TABLE         *RegisterTable;
> >>> +  UINTN                      Index;
> >>> +  EFI_PROCESSOR_INFORMATION  ProcessorInfoBuffer;
> >>> +  UINTN                      GdtSize;
> >>> +  UINTN                      IdtSize;
> >>> +  VOID                       *Gdt;
> >>> +  VOID                       *Idt;
> >>> +  EFI_EVENT                  Event;
> >>> +
> >>> +  //
> >>> +  // Allocate ACPI NVS memory below 4G memory for use on ACPI S3 resume.
> >>> +  //
> >>> +  AcpiCpuDataEx = AllocateAcpiNvsMemoryBelow4G (sizeof 
> >>> + (ACPI_CPU_DATA_EX));  ASSERT (AcpiCpuDataEx != NULL);  
> >>> + AcpiCpuData = &AcpiCpuDataEx->AcpuCpuData;
> >>> +
> >>> +  //
> >>> +  // Get MP Services Protocol
> >>> +  //
> >>> +  Status = gBS->LocateProtocol (
> >>> +                  &gEfiMpServiceProtocolGuid,
> >>> +                  NULL,
> >>> +                  (VOID **)&MpServices
> >>> +                  );
> >>> +  ASSERT_EFI_ERROR (Status);
> >>> +
> >>> +  //
> >>> +  // If there are 1 or more APs, then allocate a 4KB reserved 
> >>> + page below 1MB  //
> >>
> >> (4) I think this comment should be dropped now. The code is 
> >> correct; the comment is stale. Can be fixed up when committing the patch.
> >>
> >>> +  AcpiCpuData->StartupVector = BASE_1MB - 1;  Status = 
> >>> + gBS->AllocatePages (
> >>> +    AllocateMaxAddress,
> >>> +    EfiReservedMemoryType,
> >>> +    1,
> >>> +    &AcpiCpuData->StartupVector
> >>> +    );
> >>
> >> (5) The indentation of the function arguments and the closing paren 
> >> doesn't seem right. Can be fixed up on commit.
> >>
> >>> +  ASSERT_EFI_ERROR (Status);
> >>> +
> >>> +  //
> >>> +  // Get the number of CPUs
> >>> +  //
> >>> +  Status = MpServices->GetNumberOfProcessors (
> >>> +                         MpServices,
> >>> +                         &NumberOfCpus,
> >>> +                         &NumberOfEnabledProcessors
> >>> +                         );
> >>> +  ASSERT_EFI_ERROR (Status);
> >>> +  AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
> >>> +
> >>> +  //
> >>> +  // Initialize ACPI_CPU_DATA fields  //
> >>> +  AcpiCpuData->StackSize                 = PcdGet32 (PcdCpuApStackSize);
> >>> +  AcpiCpuData->ApMachineCheckHandlerBase = 0;  
> >>> + AcpiCpuData->ApMachineCheckHandlerSize = 0;  
> >>> + AcpiCpuData->GdtrProfile  = 
> >>> + (EFI_PHYSICAL_ADDRESS)(UINTN)&AcpiCpuDataEx->GdtrProfile;
> >>> +  AcpiCpuData->IdtrProfile  = 
> >>> (EFI_PHYSICAL_ADDRESS)(UINTN)&AcpiCpuDataEx->IdtrProfile;
> >>> +  AcpiCpuData->MtrrTable    = 
> >>> (EFI_PHYSICAL_ADDRESS)(UINTN)&AcpiCpuDataEx->MtrrTable;
> >>> +
> >>> +  //
> >>> +  // Allocate stack space for all CPUs  //  Stack = 
> >>> + AllocateAcpiNvsMemoryBelow4G (NumberOfCpus * 
> >>> + AcpiCpuData->StackSize);  ASSERT (Stack != NULL);  
> >>> + AcpiCpuData->StackAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Stack;
> >>> +
> >>> +  //
> >>> +  // Get the boot processor's GDT and IDT  //  AsmReadGdtr 
> >>> + (&AcpiCpuDataEx->GdtrProfile);  AsmReadIdtr 
> >>> + (&AcpiCpuDataEx->IdtrProfile);
> >>
> >> Turns out you have removed the casts for v2 -- great, thanks!
> >>
> >>> +
> >>> +  //
> >>> +  // Allocate GDT and IDT in ACPI NVS and copy current GDT and 
> >>> + IDT contents  //  GdtSize = AcpiCpuDataEx->GdtrProfile.Limit + 
> >>> + 1;  IdtSize = AcpiCpuDataEx->IdtrProfile.Limit + 1;  Gdt = 
> >>> + AllocateAcpiNvsMemoryBelow4G (GdtSize + IdtSize);  ASSERT (Gdt 
> >>> + != NULL);  Idt = (VOID *)((UINTN)Gdt + GdtSize);  CopyMem (Gdt, 
> >>> + (VOID *)AcpiCpuDataEx->GdtrProfile.Base, GdtSize);  CopyMem 
> >>> + (Idt, (VOID *)AcpiCpuDataEx->IdtrProfile.Base, IdtSize);  
> >>> + AcpiCpuDataEx->GdtrProfile.Base = (UINTN)Gdt;  
> >>> + AcpiCpuDataEx->IdtrProfile.Base = (UINTN)Idt;
> >>> +
> >>> +  //
> >>> +  // Allocate buffer for empty RegisterTable and 
> >>> + PreSmmInitRegisterTable for all CPUs  //  TableSize = 2 * 
> >>> + NumberOfCpus * sizeof (CPU_REGISTER_TABLE);  RegisterTable = 
> >>> + (CPU_REGISTER_TABLE *)AllocateAcpiNvsMemoryBelow4G (TableSize);  
> >>> + ASSERT (RegisterTable != NULL);  for (Index = 0; Index < 
> >>> + NumberOfCpus; Index++) {
> >>> +    Status = MpServices->GetProcessorInfo (
> >>> +                           MpServices,
> >>> +                           Index,
> >>> +                           &ProcessorInfoBuffer
> >>> +                           );
> >>> +    ASSERT_EFI_ERROR (Status);
> >>> +
> >>> +    RegisterTable[Index].InitialApicId      = 
> >>> (UINT32)ProcessorInfoBuffer.ProcessorId;
> >>> +    RegisterTable[Index].TableLength        = 0;
> >>> +    RegisterTable[Index].AllocatedSize      = 0;
> >>> +    RegisterTable[Index].RegisterTableEntry = NULL;
> >>> +
> >>> +    RegisterTable[NumberOfCpus + Index].InitialApicId      = 
> >>> (UINT32)ProcessorInfoBuffer.ProcessorId;
> >>> +    RegisterTable[NumberOfCpus + Index].TableLength        = 0;
> >>> +    RegisterTable[NumberOfCpus + Index].AllocatedSize      = 0;
> >>> +    RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 
> >>> + NULL;  }
> >>
> >> (6) Because AllocateAcpiNvsMemoryBelow4G() zero-fills the allocated 
> >> buffer, all field assignments except InitialApicId could be 
> >> dropped, for further simplification.
> >>
> >> Not necessary to do, and if you opt to drop the zero / NULL 
> >> assignments, that can be done on commit.
> >>
> >> ... On the other hand, if a different package needs to customize 
> >> this module, they will probably appreciate the field assignments 
> >> (the left hand sides anyway) already being spelled out -- so I 
> >> guess this could actually prove helpful down the road.
> >>
> >>
> >> With the above minor tweaks (of which (6) is definitely optional):
> >>
> >> Reviewed-by: Laszlo Ersek <ler...@redhat.com>
> >>
> >> In addition, I rebased my series on top of this one. I tested S3 
> >> with 32-bit and 64-bit Fedora guests, and also with a 64-bit 
> >> Windows 8.1 guest (all using 4 VCPUs and running on KVM). Everything 
> >> worked fine.
> >>
> >> Series
> >> Tested-by: Laszlo Ersek <ler...@redhat.com>
> >>
> >> I'm ready to post my version 5 series soon after this one gets committed.
> >>
> >> Thank you!
> >> Laszlo
> >>
> >>
> >>> +  AcpiCpuData->RegisterTable           = 
> >>> (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;
> >>> +  AcpiCpuData->PreSmmInitRegisterTable = 
> >>> + (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);
> >>> +
> >>> +  //
> >>> +  // Set PcdCpuS3DataAddress to the base address of the 
> >>> + ACPI_CPU_DATA structure  //  Status = PcdSet64S 
> >>> + (PcdCpuS3DataAddress, (UINT64)(UINTN)AcpiCpuData);  
> >>> + ASSERT_EFI_ERROR (Status);
> >>> +
> >>> +  //
> >>> +  // Register EFI_END_OF_DXE_EVENT_GROUP_GUID event.
> >>> +  // The notification function saves MTRRs for ACPI_CPU_DATA  //  
> >>> + Status = gBS->CreateEventEx (
> >>> +                  EVT_NOTIFY_SIGNAL,
> >>> +                  TPL_CALLBACK,
> >>> +                  SaveMtrrsOnEndOfDxe,
> >>> +                  &AcpiCpuDataEx->MtrrTable,
> >>> +                  &gEfiEndOfDxeEventGroupGuid,
> >>> +                  &Event
> >>> +                  );
> >>> +  ASSERT_EFI_ERROR (Status);
> >>> +
> >>> +  return EFI_SUCCESS;
> >>> +}
> >>> diff --git a/UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf 
> >>> b/UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
> >>> new file mode 100644
> >>> index 0000000..2ef16a7
> >>> --- /dev/null
> >>> +++ b/UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
> >>> @@ -0,0 +1,64 @@
> >>> +## @file
> >>> +#  ACPI CPU Data initialization module # #  This module 
> >>> +initializes the ACPI_CPU_DATA structure and registers the address 
> >>> +#  of this structure in the PcdCpuS3DataAddress PCD.  This is a 
> >>> +generic/simple #  version of this module.  It does not provide a 
> >>> +machine check handler or CPU #  register initialization tables 
> >>> +for ACPI S3 resume.  It also only supports the #  number of CPUs 
> >>> +reported by the MP Services Protocol, so this module does not #  
> >>> +support hot plug CPUs.  This module can be copied into a CPU specific 
> >>> package #  and customized if these additional features are required.
> >>> +#
> >>> +#  Copyright (c) 2013-2015, Intel Corporation. All rights 
> >>> +reserved.<BR> #  Copyright (c) 2015, Red Hat, Inc.
> >>> +#
> >>> +#  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                      = CpuS3DataDxe
> >>> +  FILE_GUID                      = 4D2E57EE-0E3F-44DD-93C4-D3B57E96945D
> >>> +  MODULE_TYPE                    = DXE_DRIVER
> >>> +  VERSION_STRING                 = 1.0
> >>> +  ENTRY_POINT                    = CpuS3DataInitialize
> >>> +
> >>> +# The following information is for reference only and not 
> >>> +required by the build # tools.
> >>> +#
> >>> +#  VALID_ARCHITECTURES           = IA32 X64
> >>> +
> >>> +[Sources]
> >>> +  CpuS3Data.c
> >>> +
> >>> +[Packages]
> >>> +  MdePkg/MdePkg.dec
> >>> +  UefiCpuPkg/UefiCpuPkg.dec
> >>> +
> >>> +[LibraryClasses]
> >>> +  UefiDriverEntryPoint
> >>> +  UefiBootServicesTableLib
> >>> +  BaseMemoryLib
> >>> +  DebugLib
> >>> +  BaseLib
> >>> +  MtrrLib
> >>> +
> >>> +[Guids]
> >>> +  gEfiEndOfDxeEventGroupGuid         ## CONSUMES
> >>> +
> >>> +[Protocols]
> >>> +  gEfiMpServiceProtocolGuid          ## CONSUMES
> >>> +
> >>> +[Pcd]
> >>> +  gUefiCpuPkgTokenSpaceGuid.PcdCpuApStackSize    ## CONSUMES
> >>> +  gUefiCpuPkgTokenSpaceGuid.PcdCpuS3DataAddress  ## PRODUCES
> >>> +
> >>> +[Depex]
> >>> +  gEfiMpServiceProtocolGuid
> >>> diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc 
> >>> index 756645f..4061050 100644
> >>> --- a/UefiCpuPkg/UefiCpuPkg.dsc
> >>> +++ b/UefiCpuPkg/UefiCpuPkg.dsc
> >>> @@ -101,6 +101,7 @@
> >>>    UefiCpuPkg/CpuDxe/CpuDxe.inf
> >>>    UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf
> >>>    UefiCpuPkg/CpuMpPei/CpuMpPei.inf
> >>> +  UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf
> >>>    UefiCpuPkg/Library/BaseUefiCpuLib/BaseUefiCpuLib.inf
> >>>    UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.inf
> >>>    UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.inf
> >>>
> >>
> >> _______________________________________________
> >> edk2-devel mailing list
> >> edk2-devel@lists.01.org
> >> https://lists.01.org/mailman/listinfo/edk2-devel

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to