On 12/24/18 03:12, Eric Dong wrote:
> GetProcessorIndex function calls GetMpPpi to get the MP Ppi.
> Ap will calls GetProcessorIndex function which final let AP
> calls PeiService.
>
> This patch avoid GetProcessorIndex call PeiService.
>
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1411
>
> Cc: Ruiyu Ni <[email protected]>
> Cc: Laszlo Ersek <[email protected]>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Eric Dong <[email protected]>
> ---
> .../RegisterCpuFeaturesLib/CpuFeaturesInitialize.c | 2 +-
> .../DxeRegisterCpuFeaturesLib.c | 6 ++++--
> .../PeiRegisterCpuFeaturesLib.c | 21
> ++++++++++++++++-----
> .../RegisterCpuFeaturesLib/RegisterCpuFeatures.h | 6 +++++-
> 4 files changed, 26 insertions(+), 9 deletions(-)
There are a number of things I dislike about this patch:
>
> diff --git
> a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
> b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
> index 624ddee055..6dcc73765b 100644
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
> @@ -409,7 +409,7 @@ CollectProcessorData (
> CPU_FEATURES_DATA *CpuFeaturesData;
>
> CpuFeaturesData = (CPU_FEATURES_DATA *)Buffer;
> - ProcessorNumber = GetProcessorIndex ();
> + ProcessorNumber = GetProcessorIndex (CpuFeaturesData);
> CpuInfo = &CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo;
> //
> // collect processor information
> diff --git
> a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c
> b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c
> index 926698dc95..6f3e5bd2a8 100644
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c
> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c
> @@ -66,11 +66,13 @@ GetMpProtocol (
> /**
> Worker function to return processor index.
>
> + @param CpuFeaturesData Cpu Feature Data structure.
> +
> @return The processor index.
> **/
> UINTN
> GetProcessorIndex (
> - VOID
> + IN CPU_FEATURES_DATA *CpuFeaturesData
> )
> {
> EFI_STATUS Status;
> @@ -225,7 +227,7 @@ CpuFeaturesInitialize (
>
> CpuFeaturesData = GetCpuFeaturesData ();
>
> - OldBspNumber = GetProcessorIndex();
> + OldBspNumber = GetProcessorIndex(CpuFeaturesData);
> CpuFeaturesData->BspNumber = OldBspNumber;
>
> Status = gBS->CreateEvent (
(1) In other parts of the patch, we use the opportunity to correct the
non-idiomatic parenthesizing style (that is, missing space). We miss
that here.
> diff --git
> a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c
> b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c
> index 0bb3dee8b6..0bbcb50181 100644
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c
> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c
> @@ -96,20 +96,26 @@ GetMpPpi (
> /**
> Worker function to return processor index.
>
> + @param CpuFeaturesData Cpu Feature Data structure.
> +
> @return The processor index.
> **/
> UINTN
> GetProcessorIndex (
> - VOID
> + IN CPU_FEATURES_DATA *CpuFeaturesData
> )
> {
> EFI_STATUS Status;
> - EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;
> UINTN ProcessorIndex;
> + EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;
(2) This change looks unnecessary; it just grows the patch.
>
> - CpuMpPpi = GetMpPpi ();
> + ASSERT (CpuFeaturesData->CpuMpPpi != NULL);
> + if (CpuFeaturesData->CpuMpPpi == NULL) {
> + return (UINTN) (-1);
> + }
> + CpuMpPpi = (EFI_PEI_MP_SERVICES_PPI *)CpuFeaturesData->CpuMpPpi;
>
> - Status = CpuMpPpi->WhoAmI(GetPeiServicesTablePointer (), CpuMpPpi,
> &ProcessorIndex);
> + Status = CpuMpPpi->WhoAmI(NULL, CpuMpPpi, &ProcessorIndex);
(3) This exploits internal knowledge about the PPI WhoAmI member
implementation in CpuMpPei, namely that PeiWhoAmI() ignores "PeiServices".
I think this minimally deserves a comment.
> ASSERT_EFI_ERROR (Status);
> return ProcessorIndex;
> }
> @@ -286,6 +292,9 @@ GetNumberOfProcessor (
> {
> EFI_STATUS Status;
> EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;
> + CPU_FEATURES_DATA *CpuFeaturesData;
> +
> + CpuFeaturesData = GetCpuFeaturesData();
>
> //
> // Get MP Services Protocol
> @@ -298,6 +307,8 @@ GetNumberOfProcessor (
> );
> ASSERT_EFI_ERROR (Status);
>
> + CpuFeaturesData->CpuMpPpi = CpuMpPpi;
> +
> //
> // Get the number of CPUs
> //
(4) I think it's pretty ugly to cache CpuMpPpi in the
GetNumberOfProcessor() function of the PEI instance of the library.
The function is called from CpuFeaturesDetect()
[RegisterCpuFeaturesLib.c] and GetAcpiCpuData() [CpuFeaturesInitialize.c].
Thus, caching CpuMpPpi right here doesn't make much sense to me, beyond
"it happens early enough, and doing it multiple times doesn't hurt".
I guess we can live with such a hack, but then a comment should be added.
Anyway, OVMF does not use this library class, so I'm neutral on this
patch, I just didn't want to ignore it altogether. I don't feel
comfortable acking the patch, given the hacks in it, but I also don't
intend to prevent it from going in. Please proceed with Ray's review.
I'll probably skip reviewing v3 if there's going to be one.
Thanks,
Laszlo
> @@ -329,7 +340,7 @@ CpuFeaturesInitialize (
>
> CpuFeaturesData = GetCpuFeaturesData ();
>
> - OldBspNumber = GetProcessorIndex();
> + OldBspNumber = GetProcessorIndex (CpuFeaturesData);
> CpuFeaturesData->BspNumber = OldBspNumber;
>
> //
> diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
> b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
> index cf3da84837..19c3420511 100644
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
> @@ -85,6 +85,8 @@ typedef struct {
> UINTN BspNumber;
>
> PROGRAM_CPU_REGISTER_FLAGS CpuFlags;
> +
> + VOID *CpuMpPpi;
> } CPU_FEATURES_DATA;
>
> #define CPU_FEATURE_ENTRY_FROM_LINK(a) \
> @@ -108,11 +110,13 @@ GetCpuFeaturesData (
> /**
> Worker function to return processor index.
>
> + @param CpuFeaturesData Cpu Feature Data structure.
> +
> @return The processor index.
> **/
> UINTN
> GetProcessorIndex (
> - VOID
> + IN CPU_FEATURES_DATA *CpuFeaturesData
> );
>
> /**
>
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel