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