public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Jian J Wang <jian.j.wang@intel.com>
To: edk2-devel@lists.01.org
Cc: Ruiyu Ni <ruiyu.ni@intel.com>, Eric Dong <eric.dong@intel.com>,
	Laszlo Ersek <lersek@redhat.com>
Subject: [PATCH] UefiCpuPkg/MpInitLib: fix issue in wakeup buffer initialization
Date: Wed, 24 Jan 2018 10:08:45 +0800	[thread overview]
Message-ID: <20180124020845.6096-1-jian.j.wang@intel.com> (raw)

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;
 
-- 
2.15.1.windows.2



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

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-24  2:08 Jian J Wang [this message]
2018-01-24 15:29 ` [PATCH] UefiCpuPkg/MpInitLib: fix issue in wakeup buffer initialization Laszlo Ersek
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=20180124020845.6096-1-jian.j.wang@intel.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