;------------------------------------------------------------------------------ | |
; @file | |
; Main routine of the pre-SEC code up through the jump into SEC | |
; | |
; Copyright (c) 2008 - 2009, Intel Corporation. All rights reserved.<BR> | |
; SPDX-License-Identifier: BSD-2-Clause-Patent | |
; | |
;------------------------------------------------------------------------------ | |
BITS 16 | |
; | |
; Modified: EBX, ECX, EDX, EBP | |
; | |
; @param[in,out] RAX/EAX Initial value of the EAX register | |
; (BIST: Built-in Self Test) | |
; @param[in,out] DI 'BP': boot-strap processor, or | |
; 'AP': application processor | |
; @param[out] RBP/EBP Address of Boot Firmware Volume (BFV) | |
; @param[out] DS Selector allowing flat access to all addresses | |
; @param[out] ES Selector allowing flat access to all addresses | |
; @param[out] FS Selector allowing flat access to all addresses | |
; @param[out] GS Selector allowing flat access to all addresses | |
; @param[out] SS Selector allowing flat access to all addresses | |
; | |
; @return None This routine jumps to SEC and does not return | |
; | |
Main16: | |
OneTimeCall EarlyInit16 | |
; | |
; Transition the processor from 16-bit real mode to 32-bit flat mode | |
; | |
OneTimeCall TransitionFromReal16To32BitFlat | |
BITS 32 | |
; Clear the WorkArea header. The SEV probe routines will populate the | |
; work area when detected. | |
mov byte[WORK_AREA_GUEST_TYPE], 0 | |
%ifdef ARCH_X64 | |
jmp SearchBfv | |
; | |
; Entry point of Main32 | |
; | |
Main32: | |
OneTimeCall InitTdx | |
SearchBfv: | |
%endif | |
; | |
; Search for the Boot Firmware Volume (BFV) | |
; | |
OneTimeCall Flat32SearchForBfvBase | |
; | |
; EBP - Start of BFV | |
; | |
; | |
; Search for the SEC entry point | |
; | |
OneTimeCall Flat32SearchForSecEntryPoint | |
; | |
; ESI - SEC Core entry point | |
; EBP - Start of BFV | |
; | |
%ifdef ARCH_IA32 | |
; | |
; SEV support can be built and run using the Ia32/X64 split environment. | |
; Set the OVMF/SEV work area as appropriate. | |
; | |
OneTimeCall CheckSevFeatures | |
; | |
; Restore initial EAX value into the EAX register | |
; | |
mov eax, esp | |
; | |
; Jump to the 32-bit SEC entry point | |
; | |
jmp esi | |
%else | |
; | |
; Transition the processor from 32-bit flat mode to 64-bit flat mode | |
; | |
OneTimeCall Transition32FlatTo64Flat | |
BITS 64 | |
; | |
; Some values were calculated in 32-bit mode. Make sure the upper | |
; 32-bits of 64-bit registers are zero for these values. | |
; | |
mov rax, 0x00000000ffffffff | |
and rsi, rax | |
and rbp, rax | |
and rsp, rax | |
; | |
; RSI - SEC Core entry point | |
; RBP - Start of BFV | |
; | |
; | |
; Restore initial EAX value into the RAX register | |
; | |
mov rax, rsp | |
; | |
; Jump to the 64-bit SEC entry point | |
; | |
jmp rsi | |
%endif |