edk2/edk2-UefiCpuPkg-MpInitLib-A...

109 lines
3.3 KiB
Diff

From 78881a773805298141feaeaf5670ebce616a8338 Mon Sep 17 00:00:00 2001
From: Gerd Hoffmann <kraxel@redhat.com>
Date: Thu, 22 Feb 2024 17:01:01 +0100
Subject: [PATCH 05/10] UefiCpuPkg/MpInitLib: Add support for multiple HOBs to
GetMpHandOffHob
RH-Author: Gerd Hoffmann <None>
RH-MergeRequest: 59: backport 4096 vcpu patches for c9s
RH-Jira: RHEL-22202
RH-Acked-by: Oliver Steffen <osteffen@redhat.com>
RH-Commit: [5/10] d738dc794cf7f5b8440bb9c23f21a11eb220add3 (kraxel.rh/centos-src-edk2)
Rename the function to GetNextMpHandOffHob(), add MP_HAND_OFF parameter.
When called with NULL pointer return the body of the first HOB, otherwise
return the next in the chain.
Also add the function prototype to the MpLib.h header file.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Message-Id: <20240222160106.686484-2-kraxel@redhat.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
(cherry picked from commit a3ee1eea96752cf2d4e0f70310facc109b7c4352)
---
UefiCpuPkg/Library/MpInitLib/MpLib.c | 26 ++++++++++++++++----------
UefiCpuPkg/Library/MpInitLib/MpLib.h | 12 ++++++++++++
2 files changed, 28 insertions(+), 10 deletions(-)
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
index 7bc93dfa13..00b36b0e18 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
@@ -1967,25 +1967,31 @@ SwitchApContext (
}
/**
- Get pointer to MP_HAND_OFF GUIDed HOB.
+ Get pointer to next MP_HAND_OFF GUIDed HOB body.
+
+ @param[in] MpHandOff Previous HOB body. Pass NULL to get the first HOB.
@return The pointer to MP_HAND_OFF structure.
**/
MP_HAND_OFF *
-GetMpHandOffHob (
- VOID
+GetNextMpHandOffHob (
+ IN CONST MP_HAND_OFF *MpHandOff
)
{
EFI_HOB_GUID_TYPE *GuidHob;
- MP_HAND_OFF *MpHandOff;
- MpHandOff = NULL;
- GuidHob = GetFirstGuidHob (&mMpHandOffGuid);
- if (GuidHob != NULL) {
- MpHandOff = (MP_HAND_OFF *)GET_GUID_HOB_DATA (GuidHob);
+ if (MpHandOff == NULL) {
+ GuidHob = GetFirstGuidHob (&mMpHandOffGuid);
+ } else {
+ GuidHob = (VOID *)(((UINT8 *)MpHandOff) - sizeof (EFI_HOB_GUID_TYPE));
+ GuidHob = GetNextGuidHob (&mMpHandOffGuid, GET_NEXT_HOB (GuidHob));
+ }
+
+ if (GuidHob == NULL) {
+ return NULL;
}
- return MpHandOff;
+ return (MP_HAND_OFF *)GET_GUID_HOB_DATA (GuidHob);
}
/**
@@ -2026,7 +2032,7 @@ MpInitLibInitialize (
UINTN BackupBufferAddr;
UINTN ApIdtBase;
- MpHandOff = GetMpHandOffHob ();
+ MpHandOff = GetNextMpHandOffHob (NULL);
if (MpHandOff == NULL) {
MaxLogicalProcessorNumber = PcdGet32 (PcdCpuMaxLogicalProcessorNumber);
} else {
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h
index a96a6389c1..fab2b2d493 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
@@ -485,6 +485,18 @@ SwitchApContext (
IN MP_HAND_OFF *MpHandOff
);
+/**
+ Get pointer to next MP_HAND_OFF GUIDed HOB body.
+
+ @param[in] MpHandOff Previous HOB body. Pass NULL to get the first HOB.
+
+ @return The pointer to MP_HAND_OFF structure.
+**/
+MP_HAND_OFF *
+GetNextMpHandOffHob (
+ IN CONST MP_HAND_OFF *MpHandOff
+ );
+
/**
Get available EfiBootServicesCode memory below 4GB by specified size.
--
2.39.3