mirror of https://github.com/acidanthera/audk.git
MpInitLib: Put SEV logic in separate file
The patch does several simplifications: 1. Treat SwitchToRealProc as part of RendezvousFunnelProc. So the common logic in MpLib.c doesn't need to be aware of SwitchToRealProc. As a result, SwitchToRealSize/Offset are removed from MP_ASSEMBLY_ADDRESS_MAP. 2. Move SwitchToRealProc to AmdSev.nasm. All other assembly code in AmdSev.nasm is called through OneTimeCall. Signed-off-by: Ray Ni <ray.ni@intel.com> Reviewed-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Tested-by: Tom Lendacky <thomas.lendacky@amd.com> Cc: Rahul Kumar <rahul1.kumar@intel.com> Cc: Michael Roth <michael.roth@amd.com> Cc: James Bottomley <jejb@linux.ibm.com> Cc: Min Xu <min.m.xu@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Erdem Aktas <erdemaktas@google.com> Cc: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
76323c3145
commit
b4d7b9d2b5
|
@ -199,7 +199,6 @@ CProcedureInvoke:
|
|||
call eax ; Invoke C function
|
||||
|
||||
jmp $ ; Never reach here
|
||||
RendezvousFunnelProcEnd:
|
||||
|
||||
;-------------------------------------------------------------------------------------
|
||||
;SwitchToRealProc procedure follows.
|
||||
|
@ -209,6 +208,8 @@ SwitchToRealProcStart:
|
|||
jmp $ ; Never reach here
|
||||
SwitchToRealProcEnd:
|
||||
|
||||
RendezvousFunnelProcEnd:
|
||||
|
||||
;-------------------------------------------------------------------------------------
|
||||
; AsmRelocateApLoop (MwaitSupport, ApTargetCState, PmCodeSegment, TopOfApStack, CountTofinish, Pm16CodeSegment, SevEsAPJumpTable, WakeupBuffer);
|
||||
;
|
||||
|
@ -258,8 +259,6 @@ ASM_PFX(AsmGetAddressMap):
|
|||
mov dword [ebx + MP_ASSEMBLY_ADDRESS_MAP.RelocateApLoopFuncAddress], AsmRelocateApLoopStart
|
||||
mov dword [ebx + MP_ASSEMBLY_ADDRESS_MAP.RelocateApLoopFuncSize], AsmRelocateApLoopEnd - AsmRelocateApLoopStart
|
||||
mov dword [ebx + MP_ASSEMBLY_ADDRESS_MAP.ModeTransitionOffset], Flat32Start - RendezvousFunnelProcStart
|
||||
mov dword [ebx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealSize], SwitchToRealProcEnd - SwitchToRealProcStart
|
||||
mov dword [ebx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealOffset], SwitchToRealProcStart - RendezvousFunnelProcStart
|
||||
mov dword [ebx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealNoNxOffset], SwitchToRealProcStart - Flat32Start
|
||||
mov dword [ebx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealPM16ModeOffset], 0
|
||||
mov dword [ebx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealPM16ModeSize], 0
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
;------------------------------------------------------------------------------ ;
|
||||
; Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>
|
||||
; Copyright (c) 2015 - 2022, Intel Corporation. All rights reserved.<BR>
|
||||
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
;
|
||||
; Module Name:
|
||||
|
@ -27,8 +27,6 @@ struc MP_ASSEMBLY_ADDRESS_MAP
|
|||
.RelocateApLoopFuncAddress CTYPE_UINTN 1
|
||||
.RelocateApLoopFuncSize CTYPE_UINTN 1
|
||||
.ModeTransitionOffset CTYPE_UINTN 1
|
||||
.SwitchToRealSize CTYPE_UINTN 1
|
||||
.SwitchToRealOffset CTYPE_UINTN 1
|
||||
.SwitchToRealNoNxOffset CTYPE_UINTN 1
|
||||
.SwitchToRealPM16ModeOffset CTYPE_UINTN 1
|
||||
.SwitchToRealPM16ModeSize CTYPE_UINTN 1
|
||||
|
|
|
@ -936,8 +936,7 @@ FillExchangeInfoData (
|
|||
// EfiBootServicesCode to avoid page fault if NX memory protection is enabled.
|
||||
//
|
||||
if (CpuMpData->WakeupBufferHigh != 0) {
|
||||
Size = CpuMpData->AddressMap.RendezvousFunnelSize +
|
||||
CpuMpData->AddressMap.SwitchToRealSize -
|
||||
Size = CpuMpData->AddressMap.RendezvousFunnelSize -
|
||||
CpuMpData->AddressMap.ModeTransitionOffset;
|
||||
CopyMem (
|
||||
(VOID *)CpuMpData->WakeupBufferHigh,
|
||||
|
@ -991,8 +990,7 @@ BackupAndPrepareWakeupBuffer (
|
|||
CopyMem (
|
||||
(VOID *)CpuMpData->WakeupBuffer,
|
||||
(VOID *)CpuMpData->AddressMap.RendezvousFunnelAddress,
|
||||
CpuMpData->AddressMap.RendezvousFunnelSize +
|
||||
CpuMpData->AddressMap.SwitchToRealSize
|
||||
CpuMpData->AddressMap.RendezvousFunnelSize
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -1029,7 +1027,6 @@ GetApResetVectorSize (
|
|||
UINTN Size;
|
||||
|
||||
Size = AddressMap->RendezvousFunnelSize +
|
||||
AddressMap->SwitchToRealSize +
|
||||
sizeof (MP_CPU_EXCHANGE_INFO);
|
||||
|
||||
return Size;
|
||||
|
@ -1054,11 +1051,9 @@ AllocateResetVector (
|
|||
CpuMpData->WakeupBuffer = GetWakeupBuffer (ApResetVectorSize);
|
||||
CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *)(UINTN)
|
||||
(CpuMpData->WakeupBuffer +
|
||||
CpuMpData->AddressMap.RendezvousFunnelSize +
|
||||
CpuMpData->AddressMap.SwitchToRealSize);
|
||||
CpuMpData->AddressMap.RendezvousFunnelSize);
|
||||
CpuMpData->WakeupBufferHigh = AllocateCodeBuffer (
|
||||
CpuMpData->AddressMap.RendezvousFunnelSize +
|
||||
CpuMpData->AddressMap.SwitchToRealSize -
|
||||
CpuMpData->AddressMap.RendezvousFunnelSize -
|
||||
CpuMpData->AddressMap.ModeTransitionOffset
|
||||
);
|
||||
//
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
Common header file for MP Initialize Library.
|
||||
|
||||
Copyright (c) 2016 - 2021, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2016 - 2022, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2020, AMD Inc. All rights reserved.<BR>
|
||||
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
@ -181,8 +181,6 @@ typedef struct {
|
|||
UINT8 *RelocateApLoopFuncAddress;
|
||||
UINTN RelocateApLoopFuncSize;
|
||||
UINTN ModeTransitionOffset;
|
||||
UINTN SwitchToRealSize;
|
||||
UINTN SwitchToRealOffset;
|
||||
UINTN SwitchToRealNoNxOffset;
|
||||
UINTN SwitchToRealPM16ModeOffset;
|
||||
UINTN SwitchToRealPM16ModeSize;
|
||||
|
|
|
@ -198,3 +198,151 @@ RestoreGhcb:
|
|||
|
||||
SevEsGetApicIdExit:
|
||||
OneTimeCallRet SevEsGetApicId
|
||||
|
||||
|
||||
;-------------------------------------------------------------------------------------
|
||||
;SwitchToRealProc procedure follows.
|
||||
;ALSO THIS PROCEDURE IS EXECUTED BY APs TRANSITIONING TO 16 BIT MODE. HENCE THIS PROC
|
||||
;IS IN MACHINE CODE.
|
||||
; SwitchToRealProc (UINTN BufferStart, UINT16 Code16, UINT16 Code32, UINTN StackStart)
|
||||
; rcx - Buffer Start
|
||||
; rdx - Code16 Selector Offset
|
||||
; r8 - Code32 Selector Offset
|
||||
; r9 - Stack Start
|
||||
;-------------------------------------------------------------------------------------
|
||||
SwitchToRealProcStart:
|
||||
BITS 64
|
||||
cli
|
||||
|
||||
;
|
||||
; Get RDX reset value before changing stacks since the
|
||||
; new stack won't be able to accomodate a #VC exception.
|
||||
;
|
||||
push rax
|
||||
push rbx
|
||||
push rcx
|
||||
push rdx
|
||||
|
||||
mov rax, 1
|
||||
cpuid
|
||||
mov rsi, rax ; Save off the reset value for RDX
|
||||
|
||||
pop rdx
|
||||
pop rcx
|
||||
pop rbx
|
||||
pop rax
|
||||
|
||||
;
|
||||
; Establish stack below 1MB
|
||||
;
|
||||
mov rsp, r9
|
||||
|
||||
;
|
||||
; Push ultimate Reset Vector onto the stack
|
||||
;
|
||||
mov rax, rcx
|
||||
shr rax, 4
|
||||
push word 0x0002 ; RFLAGS
|
||||
push ax ; CS
|
||||
push word 0x0000 ; RIP
|
||||
push word 0x0000 ; For alignment, will be discarded
|
||||
|
||||
;
|
||||
; Get address of "16-bit operand size" label
|
||||
;
|
||||
lea rbx, [PM16Mode]
|
||||
|
||||
;
|
||||
; Push addresses used to change to compatibility mode
|
||||
;
|
||||
lea rax, [CompatMode]
|
||||
push r8
|
||||
push rax
|
||||
|
||||
;
|
||||
; Clear R8 - R15, for reset, before going into 32-bit mode
|
||||
;
|
||||
xor r8, r8
|
||||
xor r9, r9
|
||||
xor r10, r10
|
||||
xor r11, r11
|
||||
xor r12, r12
|
||||
xor r13, r13
|
||||
xor r14, r14
|
||||
xor r15, r15
|
||||
|
||||
;
|
||||
; Far return into 32-bit mode
|
||||
;
|
||||
retfq
|
||||
|
||||
BITS 32
|
||||
CompatMode:
|
||||
;
|
||||
; Set up stack to prepare for exiting protected mode
|
||||
;
|
||||
push edx ; Code16 CS
|
||||
push ebx ; PM16Mode label address
|
||||
|
||||
;
|
||||
; Disable paging
|
||||
;
|
||||
mov eax, cr0 ; Read CR0
|
||||
btr eax, 31 ; Set PG=0
|
||||
mov cr0, eax ; Write CR0
|
||||
|
||||
;
|
||||
; Disable long mode
|
||||
;
|
||||
mov ecx, 0c0000080h ; EFER MSR number
|
||||
rdmsr ; Read EFER
|
||||
btr eax, 8 ; Set LME=0
|
||||
wrmsr ; Write EFER
|
||||
|
||||
;
|
||||
; Disable PAE
|
||||
;
|
||||
mov eax, cr4 ; Read CR4
|
||||
btr eax, 5 ; Set PAE=0
|
||||
mov cr4, eax ; Write CR4
|
||||
|
||||
mov edx, esi ; Restore RDX reset value
|
||||
|
||||
;
|
||||
; Switch to 16-bit operand size
|
||||
;
|
||||
retf
|
||||
|
||||
BITS 16
|
||||
;
|
||||
; At entry to this label
|
||||
; - RDX will have its reset value
|
||||
; - On the top of the stack
|
||||
; - Alignment data (two bytes) to be discarded
|
||||
; - IP for Real Mode (two bytes)
|
||||
; - CS for Real Mode (two bytes)
|
||||
;
|
||||
; This label is also used with AsmRelocateApLoop. During MP finalization,
|
||||
; the code from PM16Mode to SwitchToRealProcEnd is copied to the start of
|
||||
; the WakeupBuffer, allowing a parked AP to be booted by an OS.
|
||||
;
|
||||
PM16Mode:
|
||||
mov eax, cr0 ; Read CR0
|
||||
btr eax, 0 ; Set PE=0
|
||||
mov cr0, eax ; Write CR0
|
||||
|
||||
pop ax ; Discard alignment data
|
||||
|
||||
;
|
||||
; Clear registers (except RDX and RSP) before going into 16-bit mode
|
||||
;
|
||||
xor eax, eax
|
||||
xor ebx, ebx
|
||||
xor ecx, ecx
|
||||
xor esi, esi
|
||||
xor edi, edi
|
||||
xor ebp, ebp
|
||||
|
||||
iret
|
||||
|
||||
SwitchToRealProcEnd:
|
||||
|
|
|
@ -152,11 +152,6 @@ SkipEnable5LevelPaging:
|
|||
|
||||
BITS 64
|
||||
|
||||
;
|
||||
; Required for the AMD SEV helper functions
|
||||
;
|
||||
%include "AmdSev.nasm"
|
||||
|
||||
LongModeStart:
|
||||
mov esi, ebx
|
||||
lea edi, [esi + MP_CPU_EXCHANGE_INFO_FIELD (InitFlag)]
|
||||
|
@ -265,155 +260,13 @@ CProcedureInvoke:
|
|||
add rsp, 20h
|
||||
jmp $ ; Should never reach here
|
||||
|
||||
;
|
||||
; Required for the AMD SEV helper functions
|
||||
;
|
||||
%include "AmdSev.nasm"
|
||||
|
||||
RendezvousFunnelProcEnd:
|
||||
|
||||
;-------------------------------------------------------------------------------------
|
||||
;SwitchToRealProc procedure follows.
|
||||
;ALSO THIS PROCEDURE IS EXECUTED BY APs TRANSITIONING TO 16 BIT MODE. HENCE THIS PROC
|
||||
;IS IN MACHINE CODE.
|
||||
; SwitchToRealProc (UINTN BufferStart, UINT16 Code16, UINT16 Code32, UINTN StackStart)
|
||||
; rcx - Buffer Start
|
||||
; rdx - Code16 Selector Offset
|
||||
; r8 - Code32 Selector Offset
|
||||
; r9 - Stack Start
|
||||
;-------------------------------------------------------------------------------------
|
||||
SwitchToRealProcStart:
|
||||
BITS 64
|
||||
cli
|
||||
|
||||
;
|
||||
; Get RDX reset value before changing stacks since the
|
||||
; new stack won't be able to accomodate a #VC exception.
|
||||
;
|
||||
push rax
|
||||
push rbx
|
||||
push rcx
|
||||
push rdx
|
||||
|
||||
mov rax, 1
|
||||
cpuid
|
||||
mov rsi, rax ; Save off the reset value for RDX
|
||||
|
||||
pop rdx
|
||||
pop rcx
|
||||
pop rbx
|
||||
pop rax
|
||||
|
||||
;
|
||||
; Establish stack below 1MB
|
||||
;
|
||||
mov rsp, r9
|
||||
|
||||
;
|
||||
; Push ultimate Reset Vector onto the stack
|
||||
;
|
||||
mov rax, rcx
|
||||
shr rax, 4
|
||||
push word 0x0002 ; RFLAGS
|
||||
push ax ; CS
|
||||
push word 0x0000 ; RIP
|
||||
push word 0x0000 ; For alignment, will be discarded
|
||||
|
||||
;
|
||||
; Get address of "16-bit operand size" label
|
||||
;
|
||||
lea rbx, [PM16Mode]
|
||||
|
||||
;
|
||||
; Push addresses used to change to compatibility mode
|
||||
;
|
||||
lea rax, [CompatMode]
|
||||
push r8
|
||||
push rax
|
||||
|
||||
;
|
||||
; Clear R8 - R15, for reset, before going into 32-bit mode
|
||||
;
|
||||
xor r8, r8
|
||||
xor r9, r9
|
||||
xor r10, r10
|
||||
xor r11, r11
|
||||
xor r12, r12
|
||||
xor r13, r13
|
||||
xor r14, r14
|
||||
xor r15, r15
|
||||
|
||||
;
|
||||
; Far return into 32-bit mode
|
||||
;
|
||||
retfq
|
||||
|
||||
BITS 32
|
||||
CompatMode:
|
||||
;
|
||||
; Set up stack to prepare for exiting protected mode
|
||||
;
|
||||
push edx ; Code16 CS
|
||||
push ebx ; PM16Mode label address
|
||||
|
||||
;
|
||||
; Disable paging
|
||||
;
|
||||
mov eax, cr0 ; Read CR0
|
||||
btr eax, 31 ; Set PG=0
|
||||
mov cr0, eax ; Write CR0
|
||||
|
||||
;
|
||||
; Disable long mode
|
||||
;
|
||||
mov ecx, 0c0000080h ; EFER MSR number
|
||||
rdmsr ; Read EFER
|
||||
btr eax, 8 ; Set LME=0
|
||||
wrmsr ; Write EFER
|
||||
|
||||
;
|
||||
; Disable PAE
|
||||
;
|
||||
mov eax, cr4 ; Read CR4
|
||||
btr eax, 5 ; Set PAE=0
|
||||
mov cr4, eax ; Write CR4
|
||||
|
||||
mov edx, esi ; Restore RDX reset value
|
||||
|
||||
;
|
||||
; Switch to 16-bit operand size
|
||||
;
|
||||
retf
|
||||
|
||||
BITS 16
|
||||
;
|
||||
; At entry to this label
|
||||
; - RDX will have its reset value
|
||||
; - On the top of the stack
|
||||
; - Alignment data (two bytes) to be discarded
|
||||
; - IP for Real Mode (two bytes)
|
||||
; - CS for Real Mode (two bytes)
|
||||
;
|
||||
; This label is also used with AsmRelocateApLoop. During MP finalization,
|
||||
; the code from PM16Mode to SwitchToRealProcEnd is copied to the start of
|
||||
; the WakeupBuffer, allowing a parked AP to be booted by an OS.
|
||||
;
|
||||
PM16Mode:
|
||||
mov eax, cr0 ; Read CR0
|
||||
btr eax, 0 ; Set PE=0
|
||||
mov cr0, eax ; Write CR0
|
||||
|
||||
pop ax ; Discard alignment data
|
||||
|
||||
;
|
||||
; Clear registers (except RDX and RSP) before going into 16-bit mode
|
||||
;
|
||||
xor eax, eax
|
||||
xor ebx, ebx
|
||||
xor ecx, ecx
|
||||
xor esi, esi
|
||||
xor edi, edi
|
||||
xor ebp, ebp
|
||||
|
||||
iret
|
||||
|
||||
SwitchToRealProcEnd:
|
||||
|
||||
;-------------------------------------------------------------------------------------
|
||||
; AsmRelocateApLoop (MwaitSupport, ApTargetCState, PmCodeSegment, TopOfApStack, CountTofinish, Pm16CodeSegment, SevEsAPJumpTable, WakeupBuffer);
|
||||
;-------------------------------------------------------------------------------------
|
||||
|
@ -596,8 +449,6 @@ ASM_PFX(AsmGetAddressMap):
|
|||
mov qword [rcx + MP_ASSEMBLY_ADDRESS_MAP.RelocateApLoopFuncAddress], rax
|
||||
mov qword [rcx + MP_ASSEMBLY_ADDRESS_MAP.RelocateApLoopFuncSize], AsmRelocateApLoopEnd - AsmRelocateApLoopStart
|
||||
mov qword [rcx + MP_ASSEMBLY_ADDRESS_MAP.ModeTransitionOffset], Flat32Start - RendezvousFunnelProcStart
|
||||
mov qword [rcx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealSize], SwitchToRealProcEnd - SwitchToRealProcStart
|
||||
mov qword [rcx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealOffset], SwitchToRealProcStart - RendezvousFunnelProcStart
|
||||
mov qword [rcx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealNoNxOffset], SwitchToRealProcStart - Flat32Start
|
||||
mov qword [rcx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealPM16ModeOffset], PM16Mode - RendezvousFunnelProcStart
|
||||
mov qword [rcx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealPM16ModeSize], SwitchToRealProcEnd - PM16Mode
|
||||
|
|
Loading…
Reference in New Issue