public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Laszlo Ersek" <lersek@redhat.com>
To: devel@edk2.groups.io, kraxel@redhat.com
Cc: Oliver Steffen <osteffen@redhat.com>, Ray Ni <ray.ni@intel.com>,
	Rahul Kumar <rahul1.kumar@intel.com>
Subject: Re: [edk2-devel] [PATCH 1/1] UefiCpuPkg/MpInitLib: add struct MP_HAND_OFF_CONFIG
Date: Wed, 28 Feb 2024 04:48:33 +0100	[thread overview]
Message-ID: <9a842e89-b73e-bc0f-6054-06db01c7bf73@redhat.com> (raw)
In-Reply-To: <20240227114122.1140614-1-kraxel@redhat.com>

On 2/27/24 12:41, Gerd Hoffmann wrote:
> Move the WaitLoopExecutionMode and StartupSignalValue fields to a
> separate HOB with the new struct.
> 
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  UefiCpuPkg/Library/MpInitLib/MpHandOff.h | 13 ++++++--
>  UefiCpuPkg/Library/MpInitLib/MpLib.h     |  3 +-
>  UefiCpuPkg/Library/MpInitLib/MpLib.c     | 38 ++++++++++++++++++++----
>  UefiCpuPkg/Library/MpInitLib/PeiMpLib.c  | 34 +++++++++++++--------
>  4 files changed, 66 insertions(+), 22 deletions(-)
> 
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpHandOff.h b/UefiCpuPkg/Library/MpInitLib/MpHandOff.h
> index 77854d6a81f8..ae93b7e3d7c9 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpHandOff.h
> +++ b/UefiCpuPkg/Library/MpInitLib/MpHandOff.h
> @@ -15,7 +15,13 @@
>      0x11e2bd88, 0xed38, 0x4abd, {0xa3, 0x99, 0x21, 0xf2, 0x5f, 0xd0, 0x7a, 0x60 } \
>    }
>  
> +#define MP_HANDOFF_CONFIG_GUID \
> +  { \
> +    0xdabbd793, 0x7b46, 0x4144, {0x8a, 0xd4, 0x10, 0x1c, 0x7c, 0x08, 0xeb, 0xfa } \
> +  }
> +
>  extern EFI_GUID  mMpHandOffGuid;
> +extern EFI_GUID  mMpHandOffConfigGuid;
>  
>  //
>  // The information required to transfer from the PEI phase to the
> @@ -43,8 +49,11 @@ typedef struct {
>    //
>    UINT32                ProcessorIndex;
>    UINT32                CpuCount;
> -  UINT32                WaitLoopExecutionMode;
> -  UINT32                StartupSignalValue;
>    PROCESSOR_HAND_OFF    Info[];
>  } MP_HAND_OFF;
> +
> +typedef struct {
> +  UINT32    WaitLoopExecutionMode;
> +  UINT32    StartupSignalValue;
> +} MP_HAND_OFF_CONFIG;
>  #endif
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> index 3a7b9896cff4..d26035559f22 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
> +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> @@ -482,7 +482,8 @@ GetWakeupBuffer (
>  **/
>  VOID
>  SwitchApContext (
> -  IN CONST MP_HAND_OFF  *FirstMpHandOff
> +  IN CONST MP_HAND_OFF_CONFIG  *MpHandOffConfig,
> +  IN CONST MP_HAND_OFF         *FirstMpHandOff
>    );
>  
>  /**
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
> index 8c186211fb38..a22bcfc0bc30 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
> +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
> @@ -15,6 +15,7 @@
>  
>  EFI_GUID  mCpuInitMpLibHobGuid = CPU_INIT_MP_LIB_HOB_GUID;
>  EFI_GUID  mMpHandOffGuid       = MP_HANDOFF_GUID;
> +EFI_GUID  mMpHandOffConfigGuid = MP_HANDOFF_CONFIG_GUID;
>  
>  /**
>    Save the volatile registers required to be restored following INIT IPI.
> @@ -1935,11 +1936,13 @@ GetBspNumber (
>    This procedure allows the AP to switch to another section of
>    memory and continue its loop there.
>  
> -  @param[in] FirstMpHandOff  Pointer to first MP hand-off HOB body.
> +  @param[in] MpHandOffConfig  Pointer to MP hand-off config HOB body.
> +  @param[in] FirstMpHandOff   Pointer to first MP hand-off HOB body.
>  **/
>  VOID
>  SwitchApContext (
> -  IN CONST MP_HAND_OFF  *FirstMpHandOff
> +  IN CONST MP_HAND_OFF_CONFIG  *MpHandOffConfig,
> +  IN CONST MP_HAND_OFF         *FirstMpHandOff
>    )
>  {
>    UINTN              Index;
> @@ -1955,7 +1958,7 @@ SwitchApContext (
>      for (Index = 0; Index < MpHandOff->CpuCount; Index++) {
>        if (MpHandOff->ProcessorIndex + Index != BspNumber) {
>          *(UINTN *)(UINTN)MpHandOff->Info[Index].StartupProcedureAddress = (UINTN)SwitchContextPerAp;
> -        *(UINT32 *)(UINTN)MpHandOff->Info[Index].StartupSignalAddress   = MpHandOff->StartupSignalValue;
> +        *(UINT32 *)(UINTN)MpHandOff->Info[Index].StartupSignalAddress   = MpHandOffConfig->StartupSignalValue;
>        }
>      }
>    }
> @@ -1975,6 +1978,26 @@ SwitchApContext (
>    }
>  }
>  
> +/**
> +  Get pointer to MP_HAND_OFF_CONFIG GUIDed HOB body.
> +
> +  @return  The pointer to MP_HAND_OFF_CONFIG structure.
> +**/
> +MP_HAND_OFF_CONFIG *
> +GetMpHandOffConfigHob (
> +  VOID
> +  )
> +{
> +  EFI_HOB_GUID_TYPE  *GuidHob;
> +
> +  GuidHob = GetFirstGuidHob (&mMpHandOffConfigGuid);
> +  if (GuidHob == NULL) {
> +    return NULL;
> +  }
> +
> +  return (MP_HAND_OFF_CONFIG *)GET_GUID_HOB_DATA (GuidHob);
> +}
> +
>  /**
>    Get pointer to next MP_HAND_OFF GUIDed HOB body.
>  
> @@ -2022,6 +2045,7 @@ MpInitLibInitialize (
>    VOID
>    )
>  {
> +  MP_HAND_OFF_CONFIG       *MpHandOffConfig;
>    MP_HAND_OFF              *FirstMpHandOff;
>    MP_HAND_OFF              *MpHandOff;
>    CPU_INFO_IN_HOB          *CpuInfoInHob;
> @@ -2239,13 +2263,15 @@ MpInitLibInitialize (
>        }
>      }
>  
> +    MpHandOffConfig = GetMpHandOffConfigHob ();
> +    ASSERT (MpHandOffConfig != NULL);

So, in connection to the other subthread

Re: [edk2-devel] CodeQL Analysis in edk2
msgid: <80abb140-9a9c-43b8-ba0b-d8ea631d9051@linux.microsoft.com>
https://edk2.groups.io/g/devel/message/116054

I suggest replacing this with:

    if (MpHandOffConfig == NULL) {
      DEBUG ((
        DEBUG_ERROR,
        "%a: at least one MpHandOff HOB, but no MpHandOffConfig HOB\n",
        __func__
      ));
      ASSERT (MpHandOffConfig != NULL);
      CpuDeadLoop ();
    }

(We should use a generic "panic" here; but for now, CpuDeadLoop() should
do. There are two prior examples for that in MpInitLib already.)

With that update:

Reviewed-by: Laszlo Ersek <lersek@redhat.com>

Thanks
Laszlo


>      DEBUG ((
>        DEBUG_INFO,
>        "FirstMpHandOff->WaitLoopExecutionMode: %04d, sizeof (VOID *): %04d\n",
> -      FirstMpHandOff->WaitLoopExecutionMode,
> +      MpHandOffConfig->WaitLoopExecutionMode,
>        sizeof (VOID *)
>        ));
> -    if (FirstMpHandOff->WaitLoopExecutionMode == sizeof (VOID *)) {
> +    if (MpHandOffConfig->WaitLoopExecutionMode == sizeof (VOID *)) {
>        ASSERT (CpuMpData->ApLoopMode != ApInHltLoop);
>  
>        CpuMpData->FinishedCount                        = 0;
> @@ -2261,7 +2287,7 @@ MpInitLibInitialize (
>        // enables the APs to switch to a different memory section and continue their
>        // looping process there.
>        //
> -      SwitchApContext (FirstMpHandOff);
> +      SwitchApContext (MpHandOffConfig, FirstMpHandOff);
>        //
>        // Wait for all APs finished initialization
>        //
> diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
> index ec1aa666923d..4d3acb491f36 100644
> --- a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
> +++ b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
> @@ -126,14 +126,15 @@ SaveCpuMpData (
>    IN CPU_MP_DATA  *CpuMpData
>    )
>  {
> -  UINT32           MaxCpusPerHob;
> -  UINT32           CpusInHob;
> -  UINT64           Data64;
> -  UINT32           Index;
> -  UINT32           HobBase;
> -  CPU_INFO_IN_HOB  *CpuInfoInHob;
> -  MP_HAND_OFF      *MpHandOff;
> -  UINTN            MpHandOffSize;
> +  UINT32              MaxCpusPerHob;
> +  UINT32              CpusInHob;
> +  UINT64              Data64;
> +  UINT32              Index;
> +  UINT32              HobBase;
> +  CPU_INFO_IN_HOB     *CpuInfoInHob;
> +  MP_HAND_OFF         *MpHandOff;
> +  MP_HAND_OFF_CONFIG  MpHandOffConfig;
> +  UINTN               MpHandOffSize;
>  
>    MaxCpusPerHob = (0xFFF8 - sizeof (EFI_HOB_GUID_TYPE) - sizeof (MP_HAND_OFF)) / sizeof (PROCESSOR_HAND_OFF);
>  
> @@ -155,11 +156,6 @@ SaveCpuMpData (
>  
>        MpHandOff->ProcessorIndex = HobBase;
>        MpHandOff->CpuCount       = CpusInHob;
> -
> -      if (CpuMpData->ApLoopMode != ApInHltLoop) {
> -        MpHandOff->StartupSignalValue    = MP_HAND_OFF_SIGNAL;
> -        MpHandOff->WaitLoopExecutionMode = sizeof (VOID *);
> -      }
>      }
>  
>      MpHandOff->Info[Index-HobBase].ApicId = CpuInfoInHob[Index].ApicId;
> @@ -170,6 +166,18 @@ SaveCpuMpData (
>      }
>    }
>  
> +  ZeroMem (&MpHandOffConfig, sizeof (MpHandOffConfig));
> +  if (CpuMpData->ApLoopMode != ApInHltLoop) {
> +    MpHandOffConfig.StartupSignalValue    = MP_HAND_OFF_SIGNAL;
> +    MpHandOffConfig.WaitLoopExecutionMode = sizeof (VOID *);
> +  }
> +
> +  BuildGuidDataHob (
> +    &mMpHandOffConfigGuid,
> +    (VOID *)&MpHandOffConfig,
> +    sizeof (MpHandOffConfig)
> +    );
> +
>    //
>    // Build location of CPU MP DATA buffer in HOB
>    //



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#116077): https://edk2.groups.io/g/devel/message/116077
Mute This Topic: https://groups.io/mt/104600810/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



  reply	other threads:[~2024-02-28  3:48 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-27 11:41 [edk2-devel] [PATCH 1/1] UefiCpuPkg/MpInitLib: add struct MP_HAND_OFF_CONFIG Gerd Hoffmann
2024-02-28  3:48 ` Laszlo Ersek [this message]
2024-02-28  3:56 ` Laszlo Ersek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9a842e89-b73e-bc0f-6054-06db01c7bf73@redhat.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox