You've already forked slimbootloader
mirror of
https://github.com/Dasharo/slimbootloader.git
synced 2026-03-06 15:26:20 -08:00
Add MP service for payload
This patch adds a MpServiceLib for payload so that a payload can utilize this library to run tasks on specified processor. Signed-off-by: Maurice Ma <maurice.ma@intel.com>
This commit is contained in:
@@ -48,10 +48,21 @@ typedef struct {
|
||||
CPU_TASK CpuTask[0];
|
||||
} SYS_CPU_TASK;
|
||||
|
||||
typedef struct {
|
||||
UINT32 ApicId;
|
||||
} CPU_INFO;
|
||||
|
||||
typedef struct {
|
||||
UINT32 CpuCount;
|
||||
CPU_INFO CpuInfo[0];
|
||||
} SYS_CPU_INFO;
|
||||
|
||||
typedef struct {
|
||||
EFI_PHYSICAL_ADDRESS SysCpuTask;
|
||||
EFI_PHYSICAL_ADDRESS SysCpuInfo;
|
||||
} SYS_CPU_TASK_HOB;
|
||||
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif
|
||||
|
||||
@@ -408,6 +408,7 @@
|
||||
AbSupportLib | PayloadPkg/Library/AbSupportLib/AbSupportLib.inf
|
||||
SblParameterLib | PayloadPkg/Library/SblParameterLib/SblParameterLib.inf
|
||||
TrustyBootLib | PayloadPkg/Library/TrustyBootLib/TrustyBootLib.inf
|
||||
MpServiceLib | PayloadPkg/Library/MpServiceLib/MpServiceLib.inf
|
||||
}
|
||||
|
||||
!if $(ENABLE_FWU)
|
||||
|
||||
@@ -18,15 +18,6 @@ typedef enum {
|
||||
EnumMpInitFull = 0xFF
|
||||
} MP_INIT_PHASE;
|
||||
|
||||
typedef struct {
|
||||
UINT32 ApicId;
|
||||
} CPU_INFO;
|
||||
|
||||
typedef struct {
|
||||
UINT32 CpuCount;
|
||||
CPU_INFO CpuInfo[0];
|
||||
} SYS_CPU_INFO;
|
||||
|
||||
typedef VOID (*PLATFORM_CPU_INIT_HOOK) (UINT32 CpuIndex);
|
||||
|
||||
|
||||
|
||||
@@ -956,6 +956,7 @@ BuildExtraInfoHob (
|
||||
|
||||
if (SysCpuTaskHob != NULL) {
|
||||
SysCpuTaskHob->SysCpuTask = (UINTN) MpGetTask();
|
||||
SysCpuTaskHob->SysCpuInfo = (UINTN) MpGetInfo();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
674
MdePkg/Include/Protocol/MpService.h
Normal file
674
MdePkg/Include/Protocol/MpService.h
Normal file
File diff suppressed because it is too large
Load Diff
71
PayloadPkg/Include/Library/MpServiceLib.h
Normal file
71
PayloadPkg/Include/Library/MpServiceLib.h
Normal file
@@ -0,0 +1,71 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
#ifndef _MP_SERVICE_LIB_H_
|
||||
#define _MP_SERVICE_LIB_H_
|
||||
|
||||
#include <Protocol/MpService.h>
|
||||
#include <Guid/MpCpuTaskInfoHob.h>
|
||||
|
||||
/**
|
||||
Get processor info pointer for all CPUs.
|
||||
|
||||
@retval Pointer to SYS_CPU_INFO structure.
|
||||
|
||||
**/
|
||||
SYS_CPU_INFO *
|
||||
EFIAPI
|
||||
GetCpuInfo (
|
||||
VOID
|
||||
);
|
||||
|
||||
/**
|
||||
Get processor task pointer for all CPUs.
|
||||
|
||||
@retval Pointer to SYS_CPU_TASK structure.
|
||||
|
||||
**/
|
||||
SYS_CPU_TASK *
|
||||
EFIAPI
|
||||
GetCpuTask (
|
||||
VOID
|
||||
);
|
||||
|
||||
/**
|
||||
Dump processor task running state
|
||||
|
||||
This is a debug function to dump current task running state for each
|
||||
processor.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
DumpCpuTask (
|
||||
VOID
|
||||
);
|
||||
|
||||
/**
|
||||
Run a task function for a specific processor.
|
||||
|
||||
@param[in] Index CPU index
|
||||
@param[in] TaskFunc Task function pointer
|
||||
@param[in] Argument Argument for the task function
|
||||
|
||||
@retval EFI_NOT_FOUND CPU task hob does not exist.
|
||||
@retval EFI_INVALID_PARAMETER Invalid Index parameter.
|
||||
@retval EFI_NOT_READY CPU state is not ready for new task yet.
|
||||
@retval EFI_SUCCESS CPU accepted the new task successfully.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
RunCpuTask (
|
||||
IN UINT32 Index,
|
||||
IN CPU_TASK_FUNC TaskFunc,
|
||||
IN UINT64 Argument
|
||||
);
|
||||
|
||||
#endif
|
||||
160
PayloadPkg/Library/MpServiceLib/MpServiceLib.c
Normal file
160
PayloadPkg/Library/MpServiceLib/MpServiceLib.c
Normal file
@@ -0,0 +1,160 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
#include <PiPei.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/HobLib.h>
|
||||
#include <Library/MpServiceLib.h>
|
||||
#include <Library/SynchronizationLib.h>
|
||||
#include <Library/BootloaderCommonLib.h>
|
||||
|
||||
STATIC SYS_CPU_TASK *mSysCpuTask;
|
||||
STATIC SYS_CPU_INFO *mSysCpuInfo;
|
||||
|
||||
/**
|
||||
Initial global data used by MP service library.
|
||||
|
||||
@retval TRUE Global data was successfully initialized.
|
||||
FALSE Failed to initial global data.
|
||||
|
||||
**/
|
||||
STATIC
|
||||
BOOLEAN
|
||||
InitCpuGlobal (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
UINT8 *GuidHob;
|
||||
SYS_CPU_TASK_HOB *SysCpuTaskHob;
|
||||
|
||||
GuidHob = GetNextGuidHob (&gLoaderMpCpuTaskInfoGuid, GetHobListPtr());
|
||||
if (GuidHob != NULL) {
|
||||
SysCpuTaskHob = (SYS_CPU_TASK_HOB *) GET_GUID_HOB_DATA (GuidHob);
|
||||
mSysCpuTask = (SYS_CPU_TASK *)(UINTN)SysCpuTaskHob->SysCpuTask;
|
||||
mSysCpuInfo = (SYS_CPU_INFO *)(UINTN)SysCpuTaskHob->SysCpuInfo;
|
||||
return TRUE;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Get processor info pointer for all CPUs.
|
||||
|
||||
@retval Pointer to SYS_CPU_INFO structure.
|
||||
|
||||
**/
|
||||
SYS_CPU_INFO *
|
||||
EFIAPI
|
||||
GetCpuInfo (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
if (mSysCpuInfo == NULL) {
|
||||
InitCpuGlobal ();
|
||||
}
|
||||
|
||||
return mSysCpuInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
Get processor task pointer for all CPUs.
|
||||
|
||||
@retval Pointer to SYS_CPU_TASK structure.
|
||||
|
||||
**/
|
||||
SYS_CPU_TASK *
|
||||
EFIAPI
|
||||
GetCpuTask (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
if (mSysCpuInfo == NULL) {
|
||||
InitCpuGlobal ();
|
||||
}
|
||||
|
||||
return mSysCpuTask;
|
||||
}
|
||||
|
||||
/**
|
||||
Dump processor task running state
|
||||
|
||||
This is a debug function to dump current task running state for each
|
||||
processor.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
DumpCpuTask (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
UINT32 Index;
|
||||
SYS_CPU_TASK *SysCpuTask;
|
||||
|
||||
SysCpuTask = GetCpuTask ();
|
||||
if (SysCpuTask == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < SysCpuTask->CpuCount; Index++) {
|
||||
DEBUG ((DEBUG_INFO, "CPU%02X: %02X %010lX %010lX %010lX\n",
|
||||
Index,
|
||||
SysCpuTask->CpuTask[Index].State,
|
||||
SysCpuTask->CpuTask[Index].TaskFunc,
|
||||
SysCpuTask->CpuTask[Index].Argument,
|
||||
SysCpuTask->CpuTask[Index].Result));
|
||||
}
|
||||
DEBUG ((DEBUG_INFO, "\n"));
|
||||
}
|
||||
|
||||
/**
|
||||
Run a task function for a specific processor.
|
||||
|
||||
@param[in] Index CPU index
|
||||
@param[in] TaskFunc Task function pointer
|
||||
@param[in] Argument Argument for the task function
|
||||
|
||||
@retval EFI_NOT_FOUND CPU task hob does not exist.
|
||||
@retval EFI_INVALID_PARAMETER Invalid Index parameter.
|
||||
@retval EFI_NOT_READY CPU state is not ready for new task yet.
|
||||
@retval EFI_SUCCESS CPU accepted the new task successfully.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
RunCpuTask (
|
||||
IN UINT32 Index,
|
||||
IN CPU_TASK_FUNC TaskFunc,
|
||||
IN UINT64 Argument
|
||||
)
|
||||
{
|
||||
SYS_CPU_TASK *SysCpuTask;
|
||||
|
||||
SysCpuTask = GetCpuTask ();
|
||||
if (SysCpuTask == NULL) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
if ((Index >= SysCpuTask->CpuCount) || (Index == 0)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (SysCpuTask->CpuTask[Index].State != EnumCpuReady) {
|
||||
return EFI_NOT_READY;
|
||||
}
|
||||
|
||||
SysCpuTask->CpuTask[Index].TaskFunc = (UINT64)(UINTN)TaskFunc;
|
||||
SysCpuTask->CpuTask[Index].Argument = Argument;
|
||||
SysCpuTask->CpuTask[Index].State = EnumCpuStart;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
33
PayloadPkg/Library/MpServiceLib/MpServiceLib.inf
Normal file
33
PayloadPkg/Library/MpServiceLib/MpServiceLib.inf
Normal file
@@ -0,0 +1,33 @@
|
||||
## @file
|
||||
# An instance to support MP CPU APIs.
|
||||
#
|
||||
# Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = MpServiceLib
|
||||
FILE_GUID = 854BFC39-09C3-41BC-8920-3DB5B5B45FA3
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = MpServiceLib
|
||||
|
||||
[Sources]
|
||||
MpServiceLib.c
|
||||
|
||||
[LibraryClasses]
|
||||
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
PayloadPkg/PayloadPkg.dec
|
||||
BootloaderCommonPkg/BootloaderCommonPkg.dec
|
||||
|
||||
[Guids]
|
||||
|
||||
|
||||
[Pcd]
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
#include <Library/UniversalPayloadLib.h>
|
||||
#include <Library/LinuxLib.h>
|
||||
#include <Library/ThunkLib.h>
|
||||
#include <Library/MpServiceLib.h>
|
||||
#include <Library/ContainerLib.h>
|
||||
#include <Library/DebugLogBufferLib.h>
|
||||
#include <Guid/SeedInfoHobGuid.h>
|
||||
|
||||
@@ -82,6 +82,9 @@
|
||||
LinuxLib
|
||||
ContainerLib
|
||||
StringSupportLib
|
||||
LocalApicLib
|
||||
SynchronizationLib
|
||||
MpServiceLib
|
||||
|
||||
[Guids]
|
||||
gOsConfigDataGuid
|
||||
@@ -90,6 +93,7 @@
|
||||
gBootLoaderVersionGuid
|
||||
gFlashMapInfoGuid
|
||||
gSeedListInfoHobGuid
|
||||
gLoaderMpCpuTaskInfoGuid
|
||||
|
||||
[Pcd]
|
||||
gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
|
||||
|
||||
Reference in New Issue
Block a user