diff options
-rw-r--r-- | UefiCpuPkg/Library/MpInitLib/DxeMpLib.c | 19 | ||||
-rw-r--r-- | 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 1204abd577..733a9fb7be 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 e5842ef505..9dae827306 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;
}
|