public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Laszlo Ersek <lersek@redhat.com>
To: Jian J Wang <jian.j.wang@intel.com>, edk2-devel@lists.01.org
Cc: Ruiyu Ni <ruiyu.ni@intel.com>, Eric Dong <eric.dong@intel.com>
Subject: Re: [PATCH] UefiCpuPkg/MpInitLib: fix issue in wakeup buffer initialization
Date: Wed, 24 Jan 2018 16:29:39 +0100	[thread overview]
Message-ID: <890f02ba-c4b3-0bd1-7cf4-8cc9b308861d@redhat.com> (raw)
In-Reply-To: <20180124020845.6096-1-jian.j.wang@intel.com>

On 01/24/18 03:08, Jian J Wang wrote:
> To fix an issue in which enabling NX feature will mark the AP wakeup
> buffer as non-executable and fail the AP init, the buffer was split
> into two part: the lower part in memory within 1MB and the higher part
> within allocated executable memory (EfiBootServicesCode). But the
> address of higher part memory was stored in lower part memory, which
> is actually shared with legacy components and will be overwritten by
> LegacyBiosDxe driver if CSM is enabled.
> 
> This patch fixes this issue by storing the address of higher part
> memory in CpuMpData instead of ExchangeInfo.
> 
> Cc: Ruiyu Ni <ruiyu.ni@intel.com>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Jian J Wang <jian.j.wang@intel.com>
> ---
>  UefiCpuPkg/Library/MpInitLib/MpLib.c | 20 ++++++++++----------
>  UefiCpuPkg/Library/MpInitLib/MpLib.h |  1 +
>  2 files changed, 11 insertions(+), 10 deletions(-)
> 
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
> index 6231968c74..42011d6231 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
> +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
> @@ -823,19 +823,20 @@ FillExchangeInfoData (
>    // Copy all 32-bit code and 64-bit code into memory with type of
>    // EfiBootServicesCode to avoid page fault if NX memory protection is enabled.
>    //
> -  if (ExchangeInfo->ModeTransitionMemory != 0) {
> +  if (CpuMpData->WakeupBufferHigh != 0) {
>      Size = CpuMpData->AddressMap.RendezvousFunnelSize -
>             CpuMpData->AddressMap.ModeTransitionOffset;
>      CopyMem (
> -      (VOID *)(UINTN)ExchangeInfo->ModeTransitionMemory,
> +      (VOID *)CpuMpData->WakeupBufferHigh,
>        CpuMpData->AddressMap.RendezvousFunnelAddress +
>        CpuMpData->AddressMap.ModeTransitionOffset,
>        Size
>        );
>  
> -    ExchangeInfo->ModeHighMemory = ExchangeInfo->ModeTransitionMemory;
> -    ExchangeInfo->ModeHighMemory += (UINT32)ExchangeInfo->ModeOffset -
> -               (UINT32)CpuMpData->AddressMap.ModeTransitionOffset;
> +    ExchangeInfo->ModeTransitionMemory = (UINT32)CpuMpData->WakeupBufferHigh;
> +    ExchangeInfo->ModeHighMemory = (UINT32)CpuMpData->WakeupBufferHigh +
> +                                   (UINT32)ExchangeInfo->ModeOffset -
> +                                   (UINT32)CpuMpData->AddressMap.ModeTransitionOffset;
>      ExchangeInfo->ModeHighSegment = (UINT16)ExchangeInfo->CodeSegment;
>    } else {
>      ExchangeInfo->ModeTransitionMemory = (UINT32)
> @@ -916,11 +917,10 @@ AllocateResetVector (
>      CpuMpData->WakeupBuffer      = GetWakeupBuffer (ApResetVectorSize);
>      CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *) (UINTN)
>                      (CpuMpData->WakeupBuffer + CpuMpData->AddressMap.RendezvousFunnelSize);
> -    CpuMpData->MpCpuExchangeInfo->ModeTransitionMemory = (UINT32)
> -                    GetModeTransitionBuffer (
> -                      CpuMpData->AddressMap.RendezvousFunnelSize -
> -                      CpuMpData->AddressMap.ModeTransitionOffset
> -                      );
> +    CpuMpData->WakeupBufferHigh  = GetModeTransitionBuffer (
> +                                    CpuMpData->AddressMap.RendezvousFunnelSize -
> +                                    CpuMpData->AddressMap.ModeTransitionOffset
> +                                    );
>    }
>    BackupAndPrepareWakeupBuffer (CpuMpData);
>  }
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> index 0232fe896a..e7f9a4de0a 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
> +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> @@ -208,6 +208,7 @@ struct _CPU_MP_DATA {
>    UINTN                          CpuApStackSize;
>    MP_ASSEMBLY_ADDRESS_MAP        AddressMap;
>    UINTN                          WakeupBuffer;
> +  UINTN                          WakeupBufferHigh;
>    UINTN                          BackupBuffer;
>    UINTN                          BackupBufferSize;
>  
> 

As far as I see, all the values stored by FillExchangeInfoData() remain
the same. The difference is that "ModeTransitionMemory" becomes an
*output* field for FillExchangeInfoData(), from being an input field. We
now explicitly store the value to it that we previously *assumed* it
would hold (preserve), from AllocateResetVector().

The input now comes through WakeupBufferHigh, from the
AllocateResetVector() function.

Thus, I think the patch could have been written a bit more simply: we
could have added the assignment

ExchangeInfo->ModeTransitionMemory = (UINT32)CpuMpData->WakeupBufferHigh

before the "if" in FillExchangeInfoData(), and then the rest of
FillExchangeInfoData() would have needed no changes. But perhaps that
would have been harder to understand.

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

Thanks
Laszlo


  reply	other threads:[~2018-01-24 15:24 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-24  2:08 [PATCH] UefiCpuPkg/MpInitLib: fix issue in wakeup buffer initialization Jian J Wang
2018-01-24 15:29 ` Laszlo Ersek [this message]
2018-01-25  1:23   ` Wang, Jian J

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=890f02ba-c4b3-0bd1-7cf4-8cc9b308861d@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