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