mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-23 13:44:33 +02:00
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
|
call eax ; Invoke C function
|
||||||
|
|
||||||
jmp $ ; Never reach here
|
jmp $ ; Never reach here
|
||||||
RendezvousFunnelProcEnd:
|
|
||||||
|
|
||||||
;-------------------------------------------------------------------------------------
|
;-------------------------------------------------------------------------------------
|
||||||
;SwitchToRealProc procedure follows.
|
;SwitchToRealProc procedure follows.
|
||||||
@ -209,6 +208,8 @@ SwitchToRealProcStart:
|
|||||||
jmp $ ; Never reach here
|
jmp $ ; Never reach here
|
||||||
SwitchToRealProcEnd:
|
SwitchToRealProcEnd:
|
||||||
|
|
||||||
|
RendezvousFunnelProcEnd:
|
||||||
|
|
||||||
;-------------------------------------------------------------------------------------
|
;-------------------------------------------------------------------------------------
|
||||||
; AsmRelocateApLoop (MwaitSupport, ApTargetCState, PmCodeSegment, TopOfApStack, CountTofinish, Pm16CodeSegment, SevEsAPJumpTable, WakeupBuffer);
|
; 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.RelocateApLoopFuncAddress], AsmRelocateApLoopStart
|
||||||
mov dword [ebx + MP_ASSEMBLY_ADDRESS_MAP.RelocateApLoopFuncSize], AsmRelocateApLoopEnd - 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.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.SwitchToRealNoNxOffset], SwitchToRealProcStart - Flat32Start
|
||||||
mov dword [ebx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealPM16ModeOffset], 0
|
mov dword [ebx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealPM16ModeOffset], 0
|
||||||
mov dword [ebx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealPM16ModeSize], 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
|
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
;
|
;
|
||||||
; Module Name:
|
; Module Name:
|
||||||
@ -27,8 +27,6 @@ struc MP_ASSEMBLY_ADDRESS_MAP
|
|||||||
.RelocateApLoopFuncAddress CTYPE_UINTN 1
|
.RelocateApLoopFuncAddress CTYPE_UINTN 1
|
||||||
.RelocateApLoopFuncSize CTYPE_UINTN 1
|
.RelocateApLoopFuncSize CTYPE_UINTN 1
|
||||||
.ModeTransitionOffset CTYPE_UINTN 1
|
.ModeTransitionOffset CTYPE_UINTN 1
|
||||||
.SwitchToRealSize CTYPE_UINTN 1
|
|
||||||
.SwitchToRealOffset CTYPE_UINTN 1
|
|
||||||
.SwitchToRealNoNxOffset CTYPE_UINTN 1
|
.SwitchToRealNoNxOffset CTYPE_UINTN 1
|
||||||
.SwitchToRealPM16ModeOffset CTYPE_UINTN 1
|
.SwitchToRealPM16ModeOffset CTYPE_UINTN 1
|
||||||
.SwitchToRealPM16ModeSize CTYPE_UINTN 1
|
.SwitchToRealPM16ModeSize CTYPE_UINTN 1
|
||||||
|
@ -936,8 +936,7 @@ FillExchangeInfoData (
|
|||||||
// EfiBootServicesCode to avoid page fault if NX memory protection is enabled.
|
// EfiBootServicesCode to avoid page fault if NX memory protection is enabled.
|
||||||
//
|
//
|
||||||
if (CpuMpData->WakeupBufferHigh != 0) {
|
if (CpuMpData->WakeupBufferHigh != 0) {
|
||||||
Size = CpuMpData->AddressMap.RendezvousFunnelSize +
|
Size = CpuMpData->AddressMap.RendezvousFunnelSize -
|
||||||
CpuMpData->AddressMap.SwitchToRealSize -
|
|
||||||
CpuMpData->AddressMap.ModeTransitionOffset;
|
CpuMpData->AddressMap.ModeTransitionOffset;
|
||||||
CopyMem (
|
CopyMem (
|
||||||
(VOID *)CpuMpData->WakeupBufferHigh,
|
(VOID *)CpuMpData->WakeupBufferHigh,
|
||||||
@ -991,8 +990,7 @@ BackupAndPrepareWakeupBuffer (
|
|||||||
CopyMem (
|
CopyMem (
|
||||||
(VOID *)CpuMpData->WakeupBuffer,
|
(VOID *)CpuMpData->WakeupBuffer,
|
||||||
(VOID *)CpuMpData->AddressMap.RendezvousFunnelAddress,
|
(VOID *)CpuMpData->AddressMap.RendezvousFunnelAddress,
|
||||||
CpuMpData->AddressMap.RendezvousFunnelSize +
|
CpuMpData->AddressMap.RendezvousFunnelSize
|
||||||
CpuMpData->AddressMap.SwitchToRealSize
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1029,7 +1027,6 @@ GetApResetVectorSize (
|
|||||||
UINTN Size;
|
UINTN Size;
|
||||||
|
|
||||||
Size = AddressMap->RendezvousFunnelSize +
|
Size = AddressMap->RendezvousFunnelSize +
|
||||||
AddressMap->SwitchToRealSize +
|
|
||||||
sizeof (MP_CPU_EXCHANGE_INFO);
|
sizeof (MP_CPU_EXCHANGE_INFO);
|
||||||
|
|
||||||
return Size;
|
return Size;
|
||||||
@ -1054,11 +1051,9 @@ AllocateResetVector (
|
|||||||
CpuMpData->WakeupBuffer = GetWakeupBuffer (ApResetVectorSize);
|
CpuMpData->WakeupBuffer = GetWakeupBuffer (ApResetVectorSize);
|
||||||
CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *)(UINTN)
|
CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *)(UINTN)
|
||||||
(CpuMpData->WakeupBuffer +
|
(CpuMpData->WakeupBuffer +
|
||||||
CpuMpData->AddressMap.RendezvousFunnelSize +
|
CpuMpData->AddressMap.RendezvousFunnelSize);
|
||||||
CpuMpData->AddressMap.SwitchToRealSize);
|
|
||||||
CpuMpData->WakeupBufferHigh = AllocateCodeBuffer (
|
CpuMpData->WakeupBufferHigh = AllocateCodeBuffer (
|
||||||
CpuMpData->AddressMap.RendezvousFunnelSize +
|
CpuMpData->AddressMap.RendezvousFunnelSize -
|
||||||
CpuMpData->AddressMap.SwitchToRealSize -
|
|
||||||
CpuMpData->AddressMap.ModeTransitionOffset
|
CpuMpData->AddressMap.ModeTransitionOffset
|
||||||
);
|
);
|
||||||
//
|
//
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
Common header file for MP Initialize Library.
|
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>
|
Copyright (c) 2020, AMD Inc. All rights reserved.<BR>
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
@ -181,8 +181,6 @@ typedef struct {
|
|||||||
UINT8 *RelocateApLoopFuncAddress;
|
UINT8 *RelocateApLoopFuncAddress;
|
||||||
UINTN RelocateApLoopFuncSize;
|
UINTN RelocateApLoopFuncSize;
|
||||||
UINTN ModeTransitionOffset;
|
UINTN ModeTransitionOffset;
|
||||||
UINTN SwitchToRealSize;
|
|
||||||
UINTN SwitchToRealOffset;
|
|
||||||
UINTN SwitchToRealNoNxOffset;
|
UINTN SwitchToRealNoNxOffset;
|
||||||
UINTN SwitchToRealPM16ModeOffset;
|
UINTN SwitchToRealPM16ModeOffset;
|
||||||
UINTN SwitchToRealPM16ModeSize;
|
UINTN SwitchToRealPM16ModeSize;
|
||||||
|
@ -198,3 +198,151 @@ RestoreGhcb:
|
|||||||
|
|
||||||
SevEsGetApicIdExit:
|
SevEsGetApicIdExit:
|
||||||
OneTimeCallRet SevEsGetApicId
|
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
|
BITS 64
|
||||||
|
|
||||||
;
|
|
||||||
; Required for the AMD SEV helper functions
|
|
||||||
;
|
|
||||||
%include "AmdSev.nasm"
|
|
||||||
|
|
||||||
LongModeStart:
|
LongModeStart:
|
||||||
mov esi, ebx
|
mov esi, ebx
|
||||||
lea edi, [esi + MP_CPU_EXCHANGE_INFO_FIELD (InitFlag)]
|
lea edi, [esi + MP_CPU_EXCHANGE_INFO_FIELD (InitFlag)]
|
||||||
@ -265,155 +260,13 @@ CProcedureInvoke:
|
|||||||
add rsp, 20h
|
add rsp, 20h
|
||||||
jmp $ ; Should never reach here
|
jmp $ ; Should never reach here
|
||||||
|
|
||||||
|
;
|
||||||
|
; Required for the AMD SEV helper functions
|
||||||
|
;
|
||||||
|
%include "AmdSev.nasm"
|
||||||
|
|
||||||
RendezvousFunnelProcEnd:
|
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);
|
; 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.RelocateApLoopFuncAddress], rax
|
||||||
mov qword [rcx + MP_ASSEMBLY_ADDRESS_MAP.RelocateApLoopFuncSize], AsmRelocateApLoopEnd - AsmRelocateApLoopStart
|
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.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.SwitchToRealNoNxOffset], SwitchToRealProcStart - Flat32Start
|
||||||
mov qword [rcx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealPM16ModeOffset], PM16Mode - RendezvousFunnelProcStart
|
mov qword [rcx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealPM16ModeOffset], PM16Mode - RendezvousFunnelProcStart
|
||||||
mov qword [rcx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealPM16ModeSize], SwitchToRealProcEnd - PM16Mode
|
mov qword [rcx + MP_ASSEMBLY_ADDRESS_MAP.SwitchToRealPM16ModeSize], SwitchToRealProcEnd - PM16Mode
|
||||||
|
Loading…
x
Reference in New Issue
Block a user