-/** @file\r
- The library implements the Extended SAL Library Class for boot service only modules.\r
-\r
- Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php.\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include <PiDxe.h>\r
-\r
-#include <Protocol/ExtendedSalBootService.h>\r
-#include <Protocol/ExtendedSalServiceClasses.h>\r
-\r
-#include <Library/ExtendedSalLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/DebugLib.h>\r
-\r
-/**\r
- Stores the physical plabel of ESAL entrypoint.\r
-\r
- This assembly function stores the physical plabel of ESAL entrypoint\r
- where GetEsalEntryPoint() can easily retrieve.\r
-\r
- @param EntryPoint Physical address of ESAL entrypoint\r
- @param Gp Physical GP of ESAL entrypoint\r
-\r
- @return r8 = EFI_SAL_SUCCESS\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-SetEsalPhysicalEntryPoint (\r
- IN UINT64 EntryPoint,\r
- IN UINT64 Gp\r
- );\r
-\r
-/**\r
- Retrieves plabel of ESAL entrypoint.\r
-\r
- This function retrives plabel of ESAL entrypoint stored by\r
- SetEsalPhysicalEntryPoint().\r
-\r
- @return r8 = EFI_SAL_SUCCESS\r
- r9 = Physical Plabel\r
- r10 = Virtual Plabel\r
- r11 = PSR\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-GetEsalEntryPoint (\r
- VOID\r
- );\r
-\r
-EXTENDED_SAL_BOOT_SERVICE_PROTOCOL *mEsalBootService = NULL;\r
-EFI_PLABEL mPlabel;\r
-\r
-/**\r
- Constructor function to get Extended SAL Boot Service Protocol, and initializes\r
- physical plabel of ESAL entrypoint.\r
-\r
- This function first locates Extended SAL Boot Service Protocol and caches it in global variable.\r
- Then it initializes the physical plable of ESAL entrypoint, and stores\r
- it where GetEsalEntryPoint() can easily retrieve.\r
-\r
- @param ImageHandle The firmware allocated handle for the EFI image.\r
- @param SystemTable A pointer to the EFI System Table.\r
-\r
- @retval EFI_SUCCESS Plable of ESAL entrypoint successfully stored.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-DxeExtendedSalLibConstruct (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- EFI_PLABEL *Plabel;\r
- EFI_STATUS Status;\r
-\r
- //\r
- // The protocol contains a function pointer, which is an indirect procedure call.\r
- // An indirect procedure call goes through a plabel, and pointer to a function is\r
- // a pointer to a plabel. To implement indirect procedure calls that can work in\r
- // both physical and virtual mode, two plabels are required (one physical and one\r
- // virtual). So lets grap the physical PLABEL for the EsalEntryPoint and store it\r
- // away. We cache it in a module global, so we can register the vitrual version.\r
- //\r
- Status = gBS->LocateProtocol (&gEfiExtendedSalBootServiceProtocolGuid, NULL, (VOID **) &mEsalBootService);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- Plabel = (EFI_PLABEL *) (UINTN) mEsalBootService->ExtendedSalProc;\r
- mPlabel.EntryPoint = Plabel->EntryPoint;\r
- mPlabel.GP = Plabel->GP;\r
- //\r
- // Stores the physical plabel of ESAL entrypoint where GetEsalEntryPoint() can easily retrieve.\r
- //\r
- SetEsalPhysicalEntryPoint (mPlabel.EntryPoint, mPlabel.GP);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Registers function of ESAL class and it's associated global.\r
-\r
- This function registers function of ESAL class, together with its associated global.\r
- It is worker function for RegisterEsalClass().\r
- It is only for boot time.\r
-\r
- @param FunctionId ID of function to register\r
- @param ClassGuidLo GUID of ESAL class, lower 64-bits\r
- @param ClassGuidHi GUID of ESAL class, upper 64-bits\r
- @param Function Function to register with ClassGuid/FunctionId pair\r
- @param ModuleGlobal Module global for the function.\r
-\r
- @return Status returned by RegisterExtendedSalProc() of Extended SAL Boot Service Protocol\r
-\r
-**/\r
-EFI_STATUS\r
-RegisterEsalFunction (\r
- IN UINT64 FunctionId,\r
- IN UINT64 ClassGuidLo,\r
- IN UINT64 ClassGuidHi,\r
- IN SAL_INTERNAL_EXTENDED_SAL_PROC Function,\r
- IN VOID *ModuleGlobal\r
- )\r
-{\r
- return mEsalBootService->RegisterExtendedSalProc (\r
- mEsalBootService,\r
- ClassGuidLo,\r
- ClassGuidHi,\r
- FunctionId,\r
- Function,\r
- ModuleGlobal\r
- );\r
-}\r
-\r
-/**\r
- Registers ESAL Class and it's associated global.\r
-\r
- This function registers one or more Extended SAL services in a given\r
- class along with the associated global context.\r
- This function is only available prior to ExitBootServices().\r
-\r
- @param ClassGuidLo GUID of function class, lower 64-bits\r
- @param ClassGuidHi GUID of function class, upper 64-bits\r
- @param ModuleGlobal Module global for the class.\r
- @param ... List of Function/FunctionId pairs, ended by NULL\r
-\r
- @retval EFI_SUCCESS The Extended SAL services were registered.\r
- @retval EFI_UNSUPPORTED This function was called after ExitBootServices().\r
- @retval EFI_OUT_OF_RESOURCES There are not enough resources available to register one or more of the specified services.\r
- @retval Other ClassGuid could not be installed onto a new handle.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-RegisterEsalClass (\r
- IN CONST UINT64 ClassGuidLo,\r
- IN CONST UINT64 ClassGuidHi,\r
- IN VOID *ModuleGlobal, OPTIONAL\r
- ...\r
- )\r
-{\r
- VA_LIST Args;\r
- EFI_STATUS Status;\r
- SAL_INTERNAL_EXTENDED_SAL_PROC Function;\r
- UINT64 FunctionId;\r
- EFI_HANDLE NewHandle;\r
- EFI_GUID ClassGuid;\r
-\r
- VA_START (Args, ModuleGlobal);\r
-\r
- //\r
- // Register all functions of the class to register.\r
- //\r
- Status = EFI_SUCCESS;\r
- while (!EFI_ERROR (Status)) {\r
- Function = (SAL_INTERNAL_EXTENDED_SAL_PROC) VA_ARG (Args, SAL_INTERNAL_EXTENDED_SAL_PROC);\r
- //\r
- // NULL serves as the end mark of function list\r
- //\r
- if (Function == NULL) {\r
- break;\r
- }\r
-\r
- FunctionId = VA_ARG (Args, UINT64);\r
-\r
- Status = RegisterEsalFunction (FunctionId, ClassGuidLo, ClassGuidHi, Function, ModuleGlobal);\r
- }\r
-\r
- VA_END (Args);\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- NewHandle = NULL;\r
- *((UINT64 *)(&ClassGuid) + 0) = ClassGuidLo;\r
- *((UINT64 *)(&ClassGuid) + 1) = ClassGuidHi;\r
- return gBS->InstallProtocolInterface (\r
- &NewHandle,\r
- &ClassGuid,\r
- EFI_NATIVE_INTERFACE,\r
- NULL\r
- );\r
-}\r
-\r
-/**\r
- Calls an Extended SAL Class service that was previously registered with RegisterEsalClass().\r
-\r
- This function gets the entrypoint of Extended SAL, and calls an Extended SAL Class service\r
- that was previously registered with RegisterEsalClass() through this entrypoint.\r
-\r
- @param ClassGuidLo GUID of function, lower 64-bits\r
- @param ClassGuidHi GUID of function, upper 64-bits\r
- @param FunctionId Function in ClassGuid to call\r
- @param Arg2 Argument 2 ClassGuid/FunctionId defined\r
- @param Arg3 Argument 3 ClassGuid/FunctionId defined\r
- @param Arg4 Argument 4 ClassGuid/FunctionId defined\r
- @param Arg5 Argument 5 ClassGuid/FunctionId defined\r
- @param Arg6 Argument 6 ClassGuid/FunctionId defined\r
- @param Arg7 Argument 7 ClassGuid/FunctionId defined\r
- @param Arg8 Argument 8 ClassGuid/FunctionId defined\r
-\r
- @retval EFI_SAL_SUCCESS ESAL procedure successfully called.\r
- @retval EFI_SAL_ERROR The address of ExtendedSalProc() can not be correctly\r
- initialized.\r
- @retval Other Status returned from ExtendedSalProc() service of\r
- EXTENDED_SAL_BOOT_SERVICE_PROTOCOL.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalCall (\r
- IN UINT64 ClassGuidLo,\r
- IN UINT64 ClassGuidHi,\r
- IN UINT64 FunctionId,\r
- IN UINT64 Arg2,\r
- IN UINT64 Arg3,\r
- IN UINT64 Arg4,\r
- IN UINT64 Arg5,\r
- IN UINT64 Arg6,\r
- IN UINT64 Arg7,\r
- IN UINT64 Arg8\r
- )\r
-{\r
- SAL_RETURN_REGS ReturnReg;\r
- EXTENDED_SAL_PROC EsalProc;\r
-\r
- //\r
- // Get the entrypoint of Extended SAL\r
- //\r
- ReturnReg = GetEsalEntryPoint ();\r
- if (*(UINT64 *)ReturnReg.r9 == 0 && *(UINT64 *)(ReturnReg.r9 + 8) == 0) {\r
- //\r
- // The ESAL Entry Point could not be initialized\r
- //\r
- ReturnReg.Status = EFI_SAL_ERROR;\r
- return ReturnReg;\r
- }\r
-\r
- //\r
- // Test PSR.it which is BIT36\r
- //\r
- if ((ReturnReg.r11 & BIT36) != 0) {\r
- //\r
- // Virtual mode plabel to entry point\r
- //\r
- EsalProc = (EXTENDED_SAL_PROC) ReturnReg.r10;\r
- } else {\r
- //\r
- // Physical mode plabel to entry point\r
- //\r
- EsalProc = (EXTENDED_SAL_PROC) ReturnReg.r9;\r
- }\r
-\r
- return EsalProc (\r
- ClassGuidLo,\r
- ClassGuidHi,\r
- FunctionId,\r
- Arg2,\r
- Arg3,\r
- Arg4,\r
- Arg5,\r
- Arg6,\r
- Arg7,\r
- Arg8\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalStallFunctionId service of Extended SAL Stall Services Class.\r
-\r
- This function is a wrapper for the EsalStallFunctionId service of Extended SAL\r
- Stall Services Class. See EsalStallFunctionId of Extended SAL Specification.\r
-\r
- @param Microseconds The number of microseconds to delay.\r
-\r
- @retval EFI_SAL_SUCCESS Call completed without error.\r
- @retval EFI_SAL_INVALID_ARGUMENT Invalid argument.\r
- @retval EFI_SAL_VIRTUAL_ADDRESS_ERROR Virtual address not registered\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalStall (\r
- IN UINTN Microseconds\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_STALL_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_STALL_SERVICES_PROTOCOL_GUID_HI,\r
- StallFunctionId,\r
- Microseconds,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalSetNewPalEntryFunctionId service of Extended SAL PAL Services Services Class.\r
-\r
- This function is a wrapper for the EsalSetNewPalEntryFunctionId service of Extended SAL\r
- PAL Services Services Class. See EsalSetNewPalEntryFunctionId of Extended SAL Specification.\r
-\r
- @param PhysicalAddress If TRUE, then PalEntryPoint is a physical address.\r
- If FALSE, then PalEntryPoint is a virtual address.\r
- @param PalEntryPoint The PAL Entry Point being set.\r
-\r
- @retval EFI_SAL_SUCCESS The PAL Entry Point was set.\r
- @retval EFI_SAL_VIRTUAL_ADDRESS_ERROR This function was called in virtual mode before\r
- virtual mappings for the specified Extended SAL\r
- Procedure are available.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalSetNewPalEntry (\r
- IN BOOLEAN PhysicalAddress,\r
- IN UINT64 PalEntryPoint\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_PAL_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_PAL_SERVICES_PROTOCOL_GUID_HI,\r
- SetNewPalEntryFunctionId,\r
- PhysicalAddress,\r
- PalEntryPoint,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalGetNewPalEntryFunctionId service of Extended SAL PAL Services Services Class.\r
-\r
- This function is a wrapper for the EsalGetNewPalEntryFunctionId service of Extended SAL\r
- PAL Services Services Class. See EsalGetNewPalEntryFunctionId of Extended SAL Specification.\r
-\r
- @param PhysicalAddress If TRUE, then PalEntryPoint is a physical address.\r
- If FALSE, then PalEntryPoint is a virtual address.\r
-\r
- @retval EFI_SAL_SUCCESS The PAL Entry Point was retrieved and returned in\r
- SAL_RETURN_REGS.r9.\r
- @retval EFI_SAL_VIRTUAL_ADDRESS_ERROR This function was called in virtual mode before\r
- virtual mappings for the specified Extended SAL\r
- Procedure are available.\r
- @return r9 PAL entry point retrieved.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalGetNewPalEntry (\r
- IN BOOLEAN PhysicalAddress\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_PAL_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_PAL_SERVICES_PROTOCOL_GUID_HI,\r
- GetNewPalEntryFunctionId,\r
- PhysicalAddress,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalGetStateBufferFunctionId service of Extended SAL MCA Log Services Class.\r
-\r
- This function is a wrapper for the EsalGetStateBufferFunctionId service of Extended SAL\r
- MCA Log Services Class. See EsalGetStateBufferFunctionId of Extended SAL Specification.\r
-\r
- @param McaType See type parameter of SAL Procedure SAL_GET_STATE_INFO.\r
- @param McaBuffer A pointer to the base address of the returned buffer.\r
- Copied from SAL_RETURN_REGS.r9.\r
- @param BufferSize A pointer to the size, in bytes, of the returned buffer.\r
- Copied from SAL_RETURN_REGS.r10.\r
-\r
- @retval EFI_SAL_SUCCESS The memory buffer to store error records was returned in r9 and r10.\r
- @retval EFI_OUT_OF_RESOURCES A memory buffer for string error records in not available\r
- @return r9 Base address of the returned buffer\r
- @return r10 Size of the returned buffer in bytes\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalGetStateBuffer (\r
- IN UINT64 McaType,\r
- OUT UINT8 **McaBuffer,\r
- OUT UINTN *BufferSize\r
- )\r
-{\r
- SAL_RETURN_REGS Regs;\r
-\r
- Regs = EsalCall (\r
- EFI_EXTENDED_SAL_MCA_LOG_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_MCA_LOG_SERVICES_PROTOCOL_GUID_HI,\r
- EsalGetStateBufferFunctionId,\r
- McaType,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-\r
- *McaBuffer = (UINT8 *) Regs.r9;\r
- *BufferSize = Regs.r10;\r
-\r
- return Regs;\r
-}\r
-\r
-/**\r
- Wrapper for the EsalSaveStateBufferFunctionId service of Extended SAL MCA Log Services Class.\r
-\r
- This function is a wrapper for the EsalSaveStateBufferFunctionId service of Extended SAL\r
- MCA Log Services Class. See EsalSaveStateBufferFunctionId of Extended SAL Specification.\r
-\r
- @param McaType See type parameter of SAL Procedure SAL_GET_STATE_INFO.\r
-\r
- @retval EFI_SUCCESS The memory buffer containing the error record was written to nonvolatile storage.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalSaveStateBuffer (\r
- IN UINT64 McaType\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_MCA_LOG_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_MCA_LOG_SERVICES_PROTOCOL_GUID_HI,\r
- EsalSaveStateBufferFunctionId,\r
- McaType,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalGetVectorsFunctionId service of Extended SAL Base Services Class.\r
-\r
- This function is a wrapper for the EsalGetVectorsFunctionId service of Extended SAL\r
- Base Services Class. See EsalGetVectorsFunctionId of Extended SAL Specification.\r
-\r
- @param VectorType The vector type to retrieve.\r
- 0 - MCA, 1 - BSP INIT, 2 - BOOT_RENDEZ, 3 - AP INIT.\r
-\r
- @retval EFI_SAL_SUCCESS Call completed without error.\r
- @retval EFI_SAL_INVALID_ARGUMENT Invalid argument.\r
- @retval EFI_SAL_NO_INFORMATION The requested vector has not been registered\r
- with the SAL Procedure SAL_SET_VECTORS.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalGetVectors (\r
- IN UINT64 VectorType\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_BASE_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_BASE_SERVICES_PROTOCOL_GUID_HI,\r
- EsalGetVectorsFunctionId,\r
- VectorType,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalMcGetParamsFunctionId service of Extended SAL Base Services Class.\r
-\r
- This function is a wrapper for the EsalMcGetParamsFunctionId service of Extended SAL\r
- Base Services Class. See EsalMcGetParamsFunctionId of Extended SAL Specification.\r
-\r
- @param ParamInfoType The parameter type to retrieve.\r
- 1 - rendezvous interrupt\r
- 2 - wake up\r
- 3 - Corrected Platform Error Vector.\r
-\r
- @retval EFI_SAL_SUCCESS Call completed without error.\r
- @retval EFI_SAL_INVALID_ARGUMENT Invalid argument.\r
- @retval EFI_SAL_NO_INFORMATION The requested vector has not been registered\r
- with the SAL Procedure SAL_MC_SET_PARAMS.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalMcGetParams (\r
- IN UINT64 ParamInfoType\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_BASE_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_BASE_SERVICES_PROTOCOL_GUID_HI,\r
- EsalMcGetParamsFunctionId,\r
- ParamInfoType,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalMcGetParamsFunctionId service of Extended SAL Base Services Class.\r
-\r
- This function is a wrapper for the EsalMcGetParamsFunctionId service of Extended SAL\r
- Base Services Class. See EsalMcGetParamsFunctionId of Extended SAL Specification.\r
-\r
- @retval EFI_SAL_SUCCESS Call completed without error.\r
- @retval EFI_SAL_NO_INFORMATION The requested vector has not been registered\r
- with the SAL Procedure SAL_MC_SET_PARAMS.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalMcGetMcParams (\r
- VOID\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_BASE_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_BASE_SERVICES_PROTOCOL_GUID_HI,\r
- EsalMcGetMcParamsFunctionId,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalGetMcCheckinFlagsFunctionId service of Extended SAL Base Services Class.\r
-\r
- This function is a wrapper for the EsalGetMcCheckinFlagsFunctionId service of Extended SAL\r
- Base Services Class. See EsalGetMcCheckinFlagsFunctionId of Extended SAL Specification.\r
-\r
- @param CpuIndex The index of the CPU of set of enabled CPUs to check.\r
-\r
- @retval EFI_SAL_SUCCESS The checkin status of the requested CPU was returned.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalGetMcCheckinFlags (\r
- IN UINT64 CpuIndex\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_BASE_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_BASE_SERVICES_PROTOCOL_GUID_HI,\r
- EsalGetMcCheckinFlagsFunctionId,\r
- CpuIndex,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalAddCpuDataFunctionId service of Extended SAL MP Services Class.\r
-\r
- This function is a wrapper for the EsalAddCpuDataFunctionId service of Extended SAL\r
- MP Services Class. See EsalAddCpuDataFunctionId of Extended SAL Specification.\r
-\r
- @param CpuGlobalId The Global ID for the CPU being added.\r
- @param Enabled The enable flag for the CPU being added.\r
- TRUE means the CPU is enabled.\r
- FALSE means the CPU is disabled.\r
- @param PalCompatibility The PAL Compatibility value for the CPU being added.\r
-\r
- @retval EFI_SAL_SUCCESS The CPU was added to the database.\r
- @retval EFI_SAL_NOT_ENOUGH_SCRATCH There are not enough resource available to add the CPU.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalAddCpuData (\r
- IN UINT64 CpuGlobalId,\r
- IN BOOLEAN Enabled,\r
- IN UINT64 PalCompatibility\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_HI,\r
- AddCpuDataFunctionId,\r
- CpuGlobalId,\r
- Enabled,\r
- PalCompatibility,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalRemoveCpuDataFunctionId service of Extended SAL MP Services Class.\r
-\r
- This function is a wrapper for the EsalRemoveCpuDataFunctionId service of Extended SAL\r
- MP Services Class. See EsalRemoveCpuDataFunctionId of Extended SAL Specification.\r
-\r
- @param CpuGlobalId The Global ID for the CPU being removed.\r
-\r
- @retval EFI_SAL_SUCCESS The CPU was removed from the database.\r
- @retval EFI_SAL_NO_INFORMATION The specified CPU is not in the database.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalRemoveCpuData (\r
- IN UINT64 CpuGlobalId\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_HI,\r
- RemoveCpuDataFunctionId,\r
- CpuGlobalId,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalModifyCpuDataFunctionId service of Extended SAL MP Services Class.\r
-\r
- This function is a wrapper for the EsalModifyCpuDataFunctionId service of Extended SAL\r
- MP Services Class. See EsalModifyCpuDataFunctionId of Extended SAL Specification.\r
-\r
- @param CpuGlobalId The Global ID for the CPU being modified.\r
- @param Enabled The enable flag for the CPU being modified.\r
- TRUE means the CPU is enabled.\r
- FALSE means the CPU is disabled.\r
- @param PalCompatibility The PAL Compatibility value for the CPU being modified.\r
-\r
- @retval EFI_SAL_SUCCESS The CPU database was updated.\r
- @retval EFI_SAL_NO_INFORMATION The specified CPU is not in the database.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalModifyCpuData (\r
- IN UINT64 CpuGlobalId,\r
- IN BOOLEAN Enabled,\r
- IN UINT64 PalCompatibility\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_HI,\r
- ModifyCpuDataFunctionId,\r
- CpuGlobalId,\r
- Enabled,\r
- PalCompatibility,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalGetCpuDataByIdFunctionId service of Extended SAL MP Services Class.\r
-\r
- This function is a wrapper for the EsalGetCpuDataByIdFunctionId service of Extended SAL\r
- MP Services Class. See EsalGetCpuDataByIdFunctionId of Extended SAL Specification.\r
-\r
- @param CpuGlobalId The Global ID for the CPU being looked up.\r
- @param IndexByEnabledCpu If TRUE, then the index of set of enabled CPUs of database is returned.\r
- If FALSE, then the index of set of all CPUs of database is returned.\r
-\r
- @retval EFI_SAL_SUCCESS The information on the specified CPU was returned.\r
- @retval EFI_SAL_NO_INFORMATION The specified CPU is not in the database.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalGetCpuDataById (\r
- IN UINT64 CpuGlobalId,\r
- IN BOOLEAN IndexByEnabledCpu\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_HI,\r
- GetCpuDataByIDFunctionId,\r
- CpuGlobalId,\r
- IndexByEnabledCpu,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalGetCpuDataByIndexFunctionId service of Extended SAL MP Services Class.\r
-\r
- This function is a wrapper for the EsalGetCpuDataByIndexFunctionId service of Extended SAL\r
- MP Services Class. See EsalGetCpuDataByIndexFunctionId of Extended SAL Specification.\r
-\r
- @param Index The Global ID for the CPU being modified.\r
- @param IndexByEnabledCpu If TRUE, then the index of set of enabled CPUs of database is returned.\r
- If FALSE, then the index of set of all CPUs of database is returned.\r
-\r
- @retval EFI_SAL_SUCCESS The information on the specified CPU was returned.\r
- @retval EFI_SAL_NO_INFORMATION The specified CPU is not in the database.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalGetCpuDataByIndex (\r
- IN UINT64 Index,\r
- IN BOOLEAN IndexByEnabledCpu\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_HI,\r
- GetCpuDataByIndexFunctionId,\r
- Index,\r
- IndexByEnabledCpu,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalWhoAmIFunctionId service of Extended SAL MP Services Class.\r
-\r
- This function is a wrapper for the EsalWhoAmIFunctionId service of Extended SAL\r
- MP Services Class. See EsalWhoAmIFunctionId of Extended SAL Specification.\r
-\r
- @param IndexByEnabledCpu If TRUE, then the index of set of enabled CPUs of database is returned.\r
- If FALSE, then the index of set of all CPUs of database is returned.\r
-\r
- @retval EFI_SAL_SUCCESS The Global ID for the calling CPU was returned.\r
- @retval EFI_SAL_NO_INFORMATION The calling CPU is not in the database.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalWhoAmI (\r
- IN BOOLEAN IndexByEnabledCpu\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_HI,\r
- CurrentProcInfoFunctionId,\r
- IndexByEnabledCpu,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalNumProcessors service of Extended SAL MP Services Class.\r
-\r
- This function is a wrapper for the EsalNumProcessors service of Extended SAL\r
- MP Services Class. See EsalNumProcessors of Extended SAL Specification.\r
-\r
- @retval EFI_SAL_SUCCESS The information on the number of CPUs in the platform\r
- was returned.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalNumProcessors (\r
- VOID\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_HI,\r
- NumProcessorsFunctionId,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalSetMinStateFnctionId service of Extended SAL MP Services Class.\r
-\r
- This function is a wrapper for the EsalSetMinStateFnctionId service of Extended SAL\r
- MP Services Class. See EsalSetMinStateFnctionId of Extended SAL Specification.\r
-\r
- @param CpuGlobalId The Global ID for the CPU whose MINSTATE pointer is being set.\r
- @param MinStatePointer The physical address of the MINSTATE buffer for the CPU\r
- specified by CpuGlobalId.\r
-\r
- @retval EFI_SAL_SUCCESS The MINSTATE pointer was set for the specified CPU.\r
- @retval EFI_SAL_NO_INFORMATION The specified CPU is not in the database.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalSetMinState (\r
- IN UINT64 CpuGlobalId,\r
- IN EFI_PHYSICAL_ADDRESS MinStatePointer\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_HI,\r
- SetMinStateFunctionId,\r
- CpuGlobalId,\r
- MinStatePointer,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalGetMinStateFunctionId service of Extended SAL MP Services Class.\r
-\r
- This function is a wrapper for the EsalGetMinStateFunctionId service of Extended SAL\r
- MP Services Class. See EsalGetMinStateFunctionId of Extended SAL Specification.\r
-\r
- @param CpuGlobalId The Global ID for the CPU whose MINSTATE pointer is being retrieved.\r
-\r
- @retval EFI_SAL_SUCCESS The MINSTATE pointer for the specified CPU was retrieved.\r
- @retval EFI_SAL_NO_INFORMATION The specified CPU is not in the database.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalGetMinState (\r
- IN UINT64 CpuGlobalId\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_HI,\r
- GetMinStateFunctionId,\r
- CpuGlobalId,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r
-\r
-/**\r
- Wrapper for the EsalMcsGetStateInfoFunctionId service of Extended SAL MCA Services Class.\r
-\r
- This function is a wrapper for the EsalMcsGetStateInfoFunctionId service of Extended SAL\r
- MCA Services Class. See EsalMcsGetStateInfoFunctionId of Extended SAL Specification.\r
-\r
- @param CpuGlobalId The Global ID for the CPU whose MCA state buffer is being retrieved.\r
- @param StateBufferPointer A pointer to the returned MCA state buffer.\r
- @param RequiredStateBufferSize A pointer to the size, in bytes, of the returned MCA state buffer.\r
-\r
- @retval EFI_SUCCESS MINSTATE successfully got and size calculated.\r
- @retval EFI_SAL_NO_INFORMATION Fail to get MINSTATE.\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalMcaGetStateInfo (\r
- IN UINT64 CpuGlobalId,\r
- OUT EFI_PHYSICAL_ADDRESS *StateBufferPointer,\r
- OUT UINT64 *RequiredStateBufferSize\r
- )\r
-{\r
- SAL_RETURN_REGS Regs;\r
-\r
- Regs = EsalCall (\r
- EFI_EXTENDED_SAL_MCA_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_MCA_SERVICES_PROTOCOL_GUID_HI,\r
- McaGetStateInfoFunctionId,\r
- CpuGlobalId,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-\r
- *StateBufferPointer = (EFI_PHYSICAL_ADDRESS) Regs.r9;\r
- *RequiredStateBufferSize = (UINT64) Regs.r10;\r
-\r
- return Regs;\r
-}\r
-\r
-/**\r
- Wrapper for the EsalMcaRegisterCpuFunctionId service of Extended SAL MCA Services Class.\r
-\r
- This function is a wrapper for the EsalMcaRegisterCpuFunctionId service of Extended SAL\r
- MCA Services Class. See EsalMcaRegisterCpuFunctionId of Extended SAL Specification.\r
-\r
- @param CpuGlobalId The Global ID for the CPU whose MCA state buffer is being set.\r
- @param StateBufferPointer A pointer to the MCA state buffer.\r
-\r
- @retval EFI_SAL_NO_INFORMATION Cannot get the processor info with the CpuId\r
- @retval EFI_SUCCESS Save the processor's state info successfully\r
-\r
-**/\r
-SAL_RETURN_REGS\r
-EFIAPI\r
-EsalMcaRegisterCpu (\r
- IN UINT64 CpuGlobalId,\r
- IN EFI_PHYSICAL_ADDRESS StateBufferPointer\r
- )\r
-{\r
- return EsalCall (\r
- EFI_EXTENDED_SAL_MCA_SERVICES_PROTOCOL_GUID_LO,\r
- EFI_EXTENDED_SAL_MCA_SERVICES_PROTOCOL_GUID_HI,\r
- McaRegisterCpuFunctionId,\r
- CpuGlobalId,\r
- StateBufferPointer,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-}\r