19b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/** @file
29b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyThe Quark CPU specific programming for PiSmmCpuDxeSmm module.
39b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
49b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyCopyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>
59b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyThis program and the accompanying materials
69b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneyare licensed and made available under the terms and conditions of the BSD License
79b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneywhich accompanies this distribution.  The full text of the license may be found at
89b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneyhttp://opensource.org/licenses/bsd-license.php
99b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
109b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
119b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
129b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
139b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
149b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
159b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#include <PiSmm.h>
169b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#include <Library/SmmCpuFeaturesLib.h>
179b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#include <Register/SmramSaveStateMap.h>
189b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#include <Library/QNCAccessLib.h>
199b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
209b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define  EFI_MSR_SMRR_PHYS_MASK_VALID          BIT11
219b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define  EFI_MSR_SMRR_MASK                     0xFFFFF000
229b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
239b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
249b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Called during the very first SMI into System Management Mode to initialize
259b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CPU features, including SMBASE, for the currently executing CPU.  Since this
269b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  is the first SMI, the SMRAM Save State Map is at the default address of
279b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET.  The currently executing
289b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CPU is specified by CpuIndex and CpuIndex can be used to access information
299b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  about the currently executing CPU in the ProcessorInfo array and the
309b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  HotPlugCpuData data structure.
319b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
329b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] CpuIndex        The index of the CPU to initialize.  The value
339b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                             must be between 0 and the NumberOfCpus field in
349b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                             the System Management System Table (SMST).
359b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] IsMonarch       TRUE if the CpuIndex is the index of the CPU that
369b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                             was elected as monarch during System Management
379b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                             Mode initialization.
389b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                             FALSE if the CpuIndex is not the index of the CPU
399b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                             that was elected as monarch during System
409b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                             Management Mode initialization.
419b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] ProcessorInfo   Pointer to an array of EFI_PROCESSOR_INFORMATION
429b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                             structures.  ProcessorInfo[CpuIndex] contains the
439b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                             information for the currently executing CPU.
449b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] CpuHotPlugData  Pointer to the CPU_HOT_PLUG_DATA structure that
459b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                             contains the ApidId and SmBase arrays.
469b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
479b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID
489b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
499b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesInitializeProcessor (
509b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN                      CpuIndex,
519b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN BOOLEAN                    IsMonarch,
529b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN EFI_PROCESSOR_INFORMATION  *ProcessorInfo,
539b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN CPU_HOT_PLUG_DATA          *CpuHotPlugData
549b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
559b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
569b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  SMRAM_SAVE_STATE_MAP  *CpuState;
579b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
589b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  //
599b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  // Configure SMBASE.
609b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  //
619b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET);
629b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CpuState->x86.SMBASE = CpuHotPlugData->SmBase[CpuIndex];
639b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
649b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  //
659b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  // Use QNC to initialize SMRR on Quark
669b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  //
679b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  QNCPortWrite(QUARK_NC_HOST_BRIDGE_SB_PORT_ID, QUARK_NC_HOST_BRIDGE_IA32_MTRR_SMRR_PHYSBASE, CpuHotPlugData->SmrrBase);
689b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  QNCPortWrite(QUARK_NC_HOST_BRIDGE_SB_PORT_ID, QUARK_NC_HOST_BRIDGE_IA32_MTRR_SMRR_PHYSMASK, (~(CpuHotPlugData->SmrrSize - 1) & EFI_MSR_SMRR_MASK) | EFI_MSR_SMRR_PHYS_MASK_VALID);
699b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
709b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
719b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
729b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  This function updates the SMRAM save state on the currently executing CPU
739b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  to resume execution at a specific address after an RSM instruction.  This
749b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  function must evaluate the SMRAM save state to determine the execution mode
759b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  the RSM instruction resumes and update the resume execution address with
769b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  either NewInstructionPointer32 or NewInstructionPoint.  The auto HALT restart
779b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  flag in the SMRAM save state must always be cleared.  This function returns
789b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  the value of the instruction pointer from the SMRAM save state that was
799b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  replaced.  If this function returns 0, then the SMRAM save state was not
809b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  modified.
819b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
829b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  This function is called during the very first SMI on each CPU after
839b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  SmmCpuFeaturesInitializeProcessor() to set a flag in normal execution mode
849b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  to signal that the SMBASE of each CPU has been updated before the default
859b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  SMBASE address is used for the first SMI to the next CPU.
869b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
879b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] CpuIndex                 The index of the CPU to hook.  The value
889b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                                      must be between 0 and the NumberOfCpus
899b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                                      field in the System Management System Table
909b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                                      (SMST).
919b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] CpuState                 Pointer to SMRAM Save State Map for the
929b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                                      currently executing CPU.
939b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] NewInstructionPointer32  Instruction pointer to use if resuming to
949b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                                      32-bit execution mode from 64-bit SMM.
959b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] NewInstructionPointer    Instruction pointer to use if resuming to
969b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                                      same execution mode as SMM.
979b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
989b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval 0    This function did modify the SMRAM save state.
999b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval > 0  The original instruction pointer value from the SMRAM save state
1009b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney               before it was replaced.
1019b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
1029b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyUINT64
1039b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
1049b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesHookReturnFromSmm (
1059b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN                 CpuIndex,
1069b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN SMRAM_SAVE_STATE_MAP  *CpuState,
1079b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINT64                NewInstructionPointer32,
1089b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINT64                NewInstructionPointer
1099b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
1109b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
1119b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  return 0;
1129b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
1139b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1149b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
1159b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Hook point in normal execution mode that allows the one CPU that was elected
1169b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  as monarch during System Management Mode initialization to perform additional
1179b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  initialization actions immediately after all of the CPUs have processed their
1189b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  first SMI and called SmmCpuFeaturesInitializeProcessor() relocating SMBASE
1199b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  into a buffer in SMRAM and called SmmCpuFeaturesHookReturnFromSmm().
1209b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
1219b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID
1229b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
1239b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesSmmRelocationComplete (
1249b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  VOID
1259b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
1269b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
1279b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
1289b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1299b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
1309b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Return the size, in bytes, of a custom SMI Handler in bytes.  If 0 is
1319b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  returned, then a custom SMI handler is not provided by this library,
1329b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  and the default SMI handler must be used.
1339b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1349b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval 0    Use the default SMI handler.
1359b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval > 0  Use the SMI handler installed by SmmCpuFeaturesInstallSmiHandler()
1369b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney               The caller is required to allocate enough SMRAM for each CPU to
1379b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney               support the size of the custom SMI handler.
1389b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
1399b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyUINTN
1409b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
1419b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesGetSmiHandlerSize (
1429b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  VOID
1439b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
1449b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
1459b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  return 0;
1469b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
1479b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1489b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
1499b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Install a custom SMI handler for the CPU specified by CpuIndex.  This function
1509b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  is only called if SmmCpuFeaturesGetSmiHandlerSize() returns a size is greater
1519b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  than zero and is called by the CPU that was elected as monarch during System
1529b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Management Mode initialization.
1539b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1549b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] CpuIndex   The index of the CPU to install the custom SMI handler.
1559b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                        The value must be between 0 and the NumberOfCpus field
1569b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                        in the System Management System Table (SMST).
1579b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] SmBase     The SMBASE address for the CPU specified by CpuIndex.
1589b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] SmiStack   The stack to use when an SMI is processed by the
1599b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                        the CPU specified by CpuIndex.
1609b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] StackSize  The size, in bytes, if the stack used when an SMI is
1619b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                        processed by the CPU specified by CpuIndex.
1629b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] GdtBase    The base address of the GDT to use when an SMI is
1639b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                        processed by the CPU specified by CpuIndex.
1649b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] GdtSize    The size, in bytes, of the GDT used when an SMI is
1659b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                        processed by the CPU specified by CpuIndex.
1669b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] IdtBase    The base address of the IDT to use when an SMI is
1679b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                        processed by the CPU specified by CpuIndex.
1689b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] IdtSize    The size, in bytes, of the IDT used when an SMI is
1699b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                        processed by the CPU specified by CpuIndex.
1709b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] Cr3        The base address of the page tables to use when an SMI
1719b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                        is processed by the CPU specified by CpuIndex.
1729b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
1739b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID
1749b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
1759b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesInstallSmiHandler (
1769b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN   CpuIndex,
1779b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINT32  SmBase,
1789b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN VOID    *SmiStack,
1799b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN   StackSize,
1809b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN   GdtBase,
1819b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN   GdtSize,
1829b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN   IdtBase,
1839b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN   IdtSize,
1849b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINT32  Cr3
1859b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
1869b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
1879b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
1889b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1899b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
1909b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Determines if MTRR registers must be configured to set SMRAM cache-ability
1919b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  when executing in System Management Mode.
1929b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1939b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval TRUE   MTRR registers must be configured to set SMRAM cache-ability.
1949b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval FALSE  MTRR registers do not need to be configured to set SMRAM
1959b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                   cache-ability.
1969b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
1979b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyBOOLEAN
1989b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
1999b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesNeedConfigureMtrrs (
2009b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  VOID
2019b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
2029b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
2039b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  return TRUE;
2049b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
2059b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2069b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
2079b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Disable SMRR register if SMRR is supported and SmmCpuFeaturesNeedConfigureMtrrs()
2089b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  returns TRUE.
2099b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
2109b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID
2119b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
2129b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesDisableSmrr (
2139b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  VOID
2149b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
2159b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
2169b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  //
2179b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  // Use QNC to disable SMRR on Quark
2189b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  //
2199b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  QNCPortWrite(
2209b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    QUARK_NC_HOST_BRIDGE_SB_PORT_ID,
2219b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    QUARK_NC_HOST_BRIDGE_IA32_MTRR_SMRR_PHYSMASK,
2229b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    QNCPortRead(QUARK_NC_HOST_BRIDGE_SB_PORT_ID, QUARK_NC_HOST_BRIDGE_IA32_MTRR_SMRR_PHYSMASK) & ~EFI_MSR_SMRR_PHYS_MASK_VALID
2239b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    );
2249b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
2259b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2269b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
2279b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Enable SMRR register if SMRR is supported and SmmCpuFeaturesNeedConfigureMtrrs()
2289b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  returns TRUE.
2299b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
2309b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID
2319b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
2329b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesReenableSmrr (
2339b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  VOID
2349b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
2359b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
2369b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  //
2379b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  // Use QNC to enable SMRR on Quark
2389b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  //
2399b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  QNCPortWrite(
2409b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    QUARK_NC_HOST_BRIDGE_SB_PORT_ID,
2419b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    QUARK_NC_HOST_BRIDGE_IA32_MTRR_SMRR_PHYSMASK,
2429b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    QNCPortRead(QUARK_NC_HOST_BRIDGE_SB_PORT_ID, QUARK_NC_HOST_BRIDGE_IA32_MTRR_SMRR_PHYSMASK) | EFI_MSR_SMRR_PHYS_MASK_VALID
2439b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    );
2449b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
2459b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2469b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
2479b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Processor specific hook point each time a CPU enters System Management Mode.
2489b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2499b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] CpuIndex  The index of the CPU that has entered SMM.  The value
2509b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                       must be between 0 and the NumberOfCpus field in the
2519b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                       System Management System Table (SMST).
2529b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
2539b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID
2549b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
2559b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesRendezvousEntry (
2569b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN  CpuIndex
2579b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
2589b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
2599b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
2609b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2619b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
2629b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Processor specific hook point each time a CPU exits System Management Mode.
2639b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2649b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] CpuIndex  The index of the CPU that is exiting SMM.  The value must
2659b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                       be between 0 and the NumberOfCpus field in the System
2669b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                       Management System Table (SMST).
2679b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
2689b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID
2699b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
2709b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesRendezvousExit (
2719b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN  CpuIndex
2729b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
2739b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
2749b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
2759b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2769b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
2779b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Check to see if an SMM register is supported by a specified CPU.
2789b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2799b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] CpuIndex  The index of the CPU to check for SMM register support.
2809b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                       The value must be between 0 and the NumberOfCpus field
2819b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                       in the System Management System Table (SMST).
2829b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] RegName   Identifies the SMM register to check for support.
2839b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2849b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval TRUE   The SMM register specified by RegName is supported by the CPU
2859b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                 specified by CpuIndex.
2869b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval FALSE  The SMM register specified by RegName is not supported by the
2879b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                 CPU specified by CpuIndex.
2889b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
2899b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyBOOLEAN
2909b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
2919b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesIsSmmRegisterSupported (
2929b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN         CpuIndex,
2939b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN SMM_REG_NAME  RegName
2949b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
2959b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
2969b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  return FALSE;
2979b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
2989b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2999b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
3009b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Returns the current value of the SMM register for the specified CPU.
3019b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  If the SMM register is not supported, then 0 is returned.
3029b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3039b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] CpuIndex  The index of the CPU to read the SMM register.  The
3049b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                       value must be between 0 and the NumberOfCpus field in
3059b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                       the System Management System Table (SMST).
3069b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] RegName   Identifies the SMM register to read.
3079b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3089b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @return  The value of the SMM register specified by RegName from the CPU
3099b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney           specified by CpuIndex.
3109b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
3119b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyUINT64
3129b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
3139b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesGetSmmRegister (
3149b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN         CpuIndex,
3159b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN SMM_REG_NAME  RegName
3169b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
3179b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
3189b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  return 0;
3199b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
3209b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3219b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
3229b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Sets the value of an SMM register on a specified CPU.
3239b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  If the SMM register is not supported, then no action is performed.
3249b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3259b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] CpuIndex  The index of the CPU to write the SMM register.  The
3269b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                       value must be between 0 and the NumberOfCpus field in
3279b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                       the System Management System Table (SMST).
3289b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] RegName   Identifies the SMM register to write.
3299b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                       registers are read-only.
3309b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] Value     The value to write to the SMM register.
3319b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
3329b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID
3339b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
3349b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesSetSmmRegister (
3359b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN         CpuIndex,
3369b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN SMM_REG_NAME  RegName,
3379b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINT64        Value
3389b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
3399b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
3409b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
3419b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3429b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
3439b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Read an SMM Save State register on the target processor.  If this function
3449b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  returns EFI_UNSUPPORTED, then the caller is responsible for reading the
3459b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  SMM Save Sate register.
3469b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3479b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in]  CpuIndex  The index of the CPU to read the SMM Save State.  The
3489b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                        value must be between 0 and the NumberOfCpus field in
3499b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                        the System Management System Table (SMST).
3509b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in]  Register  The SMM Save State register to read.
3519b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in]  Width     The number of bytes to read from the CPU save state.
3529b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[out] Buffer    Upon return, this holds the CPU register value read
3539b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                        from the save state.
3549b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3559b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval EFI_SUCCESS           The register was read from Save State.
3569b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval EFI_INVALID_PARAMTER  Buffer is NULL.
3579b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval EFI_UNSUPPORTED       This function does not support reading Register.
3589b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3599b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
3609b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFI_STATUS
3619b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
3629b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesReadSaveStateRegister (
3639b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN  UINTN                        CpuIndex,
3649b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN  EFI_SMM_SAVE_STATE_REGISTER  Register,
3659b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN  UINTN                        Width,
3669b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  OUT VOID                         *Buffer
3679b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
3689b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
3699b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  return EFI_UNSUPPORTED;
3709b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
3719b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3729b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
3739b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Writes an SMM Save State register on the target processor.  If this function
3749b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  returns EFI_UNSUPPORTED, then the caller is responsible for writing the
3759b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  SMM Save Sate register.
3769b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3779b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] CpuIndex  The index of the CPU to write the SMM Save State.  The
3789b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                       value must be between 0 and the NumberOfCpus field in
3799b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                       the System Management System Table (SMST).
3809b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] Register  The SMM Save State register to write.
3819b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] Width     The number of bytes to write to the CPU save state.
3829b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param[in] Buffer    Upon entry, this holds the new CPU register value.
3839b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3849b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval EFI_SUCCESS           The register was written to Save State.
3859b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval EFI_INVALID_PARAMTER  Buffer is NULL.
3869b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval EFI_UNSUPPORTED       This function does not support writing Register.
3879b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
3889b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFI_STATUS
3899b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
3909b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesWriteSaveStateRegister (
3919b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN                        CpuIndex,
3929b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN EFI_SMM_SAVE_STATE_REGISTER  Register,
3939b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN                        Width,
3949b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN CONST VOID                   *Buffer
3959b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
3969b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
3979b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  return EFI_UNSUPPORTED;
3989b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
3999b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
4009b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
4019b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  This function is hook point called after the gEfiSmmReadyToLockProtocolGuid
4029b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  notification is completely processed.
4039b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
4049b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID
4059b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
4069b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesCompleteSmmReadyToLock (
4079b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  VOID
4089b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
4099b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
4109b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
4119b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
4129b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/**
4139b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  This API provides a method for a CPU to allocate a specific region for storing page tables.
4149b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
4159b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  This API can be called more once to allocate memory for page tables.
4169b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
4179b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Allocates the number of 4KB pages of type EfiRuntimeServicesData and returns a pointer to the
4189b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  allocated buffer.  The buffer returned is aligned on a 4KB boundary.  If Pages is 0, then NULL
4199b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  is returned.  If there is not enough memory remaining to satisfy the request, then NULL is
4209b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  returned.
4219b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
4229b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  This function can also return NULL if there is no preference on where the page tables are allocated in SMRAM.
4239b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
4249b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @param  Pages                 The number of 4 KB pages to allocate.
4259b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
4269b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @return A pointer to the allocated buffer for page tables.
4279b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  @retval NULL      Fail to allocate a specific region for storing page tables,
4289b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney                    Or there is no preference on where the page tables are allocated in SMRAM.
4299b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
4309b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
4319b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID *
4329b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyEFIAPI
4339b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySmmCpuFeaturesAllocatePageTableMemory (
4349b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IN UINTN           Pages
4359b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
4369b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
4379b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  return NULL;
4389b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
439