From: Jeff Fan <jeff.fan@intel.com>
To: edk2-devel@lists.01.org
Cc: Feng Tian <feng.tian@intel.com>,
Kinney, Michael D <michael.d.kinney@intel.com>,
Ruiyu Ni <ruiyu.ni@intel.com>
Subject: [PATCH 3/6] UefiCpuPkg/MpInitLib: Move save/restore interrupt to SwitchBSPWorker()
Date: Mon, 26 Dec 2016 19:20:59 +0800 [thread overview]
Message-ID: <20161226112102.25512-4-jeff.fan@intel.com> (raw)
In-Reply-To: <20161226112102.25512-1-jeff.fan@intel.com>
During switching BSP phase, we need to disable CPU interruput to prevent stack
crashed by Timer interrupt handle. But when we enabled source debugging feature,
debug timer interrupt handler (existing on both PEI and DXE) also could crash
the stack used during switching BSP. So,we need to move save/restore interrupt
to SwitchBSPWorker().
Cc: Feng Tian <feng.tian@intel.com>
Cc: Kinney, Michael D <michael.d.kinney@intel.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
---
UefiCpuPkg/Library/MpInitLib/DxeMpLib.c | 19 -------------------
UefiCpuPkg/Library/MpInitLib/MpLib.c | 21 +++++++++++++++++++++
2 files changed, 21 insertions(+), 19 deletions(-)
diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
index 1204abd..733a9fb 100644
--- a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
@@ -646,29 +646,10 @@ MpInitLibSwitchBSP (
)
{
EFI_STATUS Status;
- BOOLEAN OldInterruptState;
- //
- // Before send both BSP and AP to a procedure to exchange their roles,
- // interrupt must be disabled. This is because during the exchange role
- // process, 2 CPU may use 1 stack. If interrupt happens, the stack will
- // be corrupted, since interrupt return address will be pushed to stack
- // by hardware.
- //
- OldInterruptState = SaveAndDisableInterrupts ();
-
- //
- // Mask LINT0 & LINT1 for the old BSP
- //
- DisableLvtInterrupts ();
Status = SwitchBSPWorker (ProcessorNumber, EnableOldBSP);
- //
- // Restore interrupt state.
- //
- SetInterruptState (OldInterruptState);
-
return Status;
}
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
index e5842ef..9dae827 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
@@ -1511,6 +1511,21 @@ SwitchBSPWorker (
UINTN CallerNumber;
CPU_STATE State;
MSR_IA32_APIC_BASE_REGISTER ApicBaseMsr;
+ BOOLEAN OldInterruptState;
+
+ //
+ // Before send both BSP and AP to a procedure to exchange their roles,
+ // interrupt must be disabled. This is because during the exchange role
+ // process, 2 CPU may use 1 stack. If interrupt happens, the stack will
+ // be corrupted, since interrupt return address will be pushed to stack
+ // by hardware.
+ //
+ OldInterruptState = SaveAndDisableInterrupts ();
+
+ //
+ // Mask LINT0 & LINT1 for the old BSP
+ //
+ DisableLvtInterrupts ();
CpuMpData = GetCpuMpData ();
@@ -1593,6 +1608,12 @@ SwitchBSPWorker (
//
CpuMpData->BspNumber = (UINT32) ProcessorNumber;
+ //
+ // Restore interrupt state.
+ //
+ SetInterruptState (OldInterruptState);
+
+
return EFI_SUCCESS;
}
--
2.9.3.windows.2
next prev parent reply other threads:[~2016-12-26 11:21 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-26 11:20 [PATCH 0/6] Support source debugging on DXE AP function Jeff Fan
2016-12-26 11:20 ` [PATCH 1/6] UefiCpuPkg/DxeMpInitLib: Support source debugging on " Jeff Fan
2016-12-26 11:20 ` [PATCH 2/6] UefiCpuPkg/MpInitLib: Sync BSP's local APIC timer settings to APs Jeff Fan
2016-12-26 11:20 ` Jeff Fan [this message]
2016-12-26 11:21 ` [PATCH 4/6] UefiCpuPkg/MpInitLib: Swap local APIC timer interrupt state Jeff Fan
2016-12-26 11:21 ` [PATCH 5/6] UefiCpuPkg/MpInitLib: Disable and restore system timer interrupt Jeff Fan
2016-12-26 11:21 ` [PATCH 6/6] UefiCpuPkg/MpInitLib: Set new AP to idle state after switching BSP Jeff Fan
2016-12-28 7:33 ` [PATCH 0/6] Support source debugging on DXE AP function Tian, Feng
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=20161226112102.25512-4-jeff.fan@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