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
@@ -482,22 +482,13 @@ ASM_PFX(AsmExchangeRole):
|
||||
push r14
|
||||
push r15
|
||||
|
||||
mov rax, cr0
|
||||
push rax
|
||||
|
||||
mov rax, cr4
|
||||
push rax
|
||||
|
||||
; rsi contains MyInfo pointer
|
||||
mov rsi, rcx
|
||||
|
||||
; rdi contains OthersInfo pointer
|
||||
mov rdi, rdx
|
||||
|
||||
;Store EFLAGS, GDTR and IDTR regiter to stack
|
||||
pushfq
|
||||
sgdt [rsi + CPU_EXCHANGE_ROLE_INFO.Gdtr]
|
||||
sidt [rsi + CPU_EXCHANGE_ROLE_INFO.Idtr]
|
||||
|
||||
; Store the its StackPointer
|
||||
mov [rsi + CPU_EXCHANGE_ROLE_INFO.StackPointer], rsp
|
||||
@@ -513,12 +504,6 @@ WaitForOtherStored:
|
||||
jmp WaitForOtherStored
|
||||
|
||||
OtherStored:
|
||||
; Since another CPU already stored its state, load them
|
||||
; load GDTR value
|
||||
lgdt [rdi + CPU_EXCHANGE_ROLE_INFO.Gdtr]
|
||||
|
||||
; load IDTR value
|
||||
lidt [rdi + CPU_EXCHANGE_ROLE_INFO.Idtr]
|
||||
|
||||
; load its future StackPointer
|
||||
mov rsp, [rdi + CPU_EXCHANGE_ROLE_INFO.StackPointer]
|
||||
@@ -538,12 +523,6 @@ OtherLoaded:
|
||||
; since the other CPU already get the data it want, leave this procedure
|
||||
popfq
|
||||
|
||||
pop rax
|
||||
mov cr4, rax
|
||||
|
||||
pop rax
|
||||
mov cr0, rax
|
||||
|
||||
pop r15
|
||||
pop r14
|
||||
pop r13
|
||||
|
Reference in New Issue
Block a user