UefiCpuPkg/MpInitLib: Simplify logic in SwitchBsp
When switch bsp, old bsp and new bsp put CR0/CR4 into stack, and put IDT and GDT register into a structure. After they exchange their stack, they restore these registers. This logic is now implemented by assembly code. This patch aims to reuse (Save/Restore)VolatileRegisters function to replace such assembly code for better code readability. Cc: Eric Dong <eric.dong@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Cc: Rahul Kumar <rahul1.kumar@intel.com> Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
This commit is contained in:
committed by
mergify[bot]
parent
76ec17526b
commit
d1abb876f4
@@ -284,15 +284,8 @@ ASM_PFX(AsmExchangeRole):
|
||||
; edi contains OthersInfo pointer
|
||||
mov edi, [ebp + 28h]
|
||||
|
||||
;Store EFLAGS, GDTR and IDTR register to stack
|
||||
;Store EFLAGS to stack
|
||||
pushfd
|
||||
mov eax, cr4
|
||||
push eax ; push cr4 firstly
|
||||
mov eax, cr0
|
||||
push eax
|
||||
|
||||
sgdt [esi + CPU_EXCHANGE_ROLE_INFO.Gdtr]
|
||||
sidt [esi + CPU_EXCHANGE_ROLE_INFO.Idtr]
|
||||
|
||||
; Store the its StackPointer
|
||||
mov [esi + CPU_EXCHANGE_ROLE_INFO.StackPointer],esp
|
||||
@@ -308,13 +301,6 @@ WaitForOtherStored:
|
||||
jmp WaitForOtherStored
|
||||
|
||||
OtherStored:
|
||||
; Since another CPU already stored its state, load them
|
||||
; load GDTR value
|
||||
lgdt [edi + CPU_EXCHANGE_ROLE_INFO.Gdtr]
|
||||
|
||||
; load IDTR value
|
||||
lidt [edi + CPU_EXCHANGE_ROLE_INFO.Idtr]
|
||||
|
||||
; load its future StackPointer
|
||||
mov esp, [edi + CPU_EXCHANGE_ROLE_INFO.StackPointer]
|
||||
|
||||
@@ -331,10 +317,6 @@ WaitForOtherLoaded:
|
||||
|
||||
OtherLoaded:
|
||||
; since the other CPU already get the data it want, leave this procedure
|
||||
pop eax
|
||||
mov cr0, eax
|
||||
pop eax
|
||||
mov cr4, eax
|
||||
popfd
|
||||
|
||||
popad
|
||||
|
Reference in New Issue
Block a user