This patch allows the ResetVector to be run indenpendently from build time addresses. The goal of the patch is to avoid having to create RAM just below 4G when creating a Xen PVH guest while being compatible with the way hvmloader currently load OVMF, just below 4G. Only the new PVH entry point will do the calculation. The ResetVector will figure out its current running address by creating a temporary stack, make a call and calculate the difference between the build time address and the address at run time. This patch copies and make the necessary modification to some other asm files: - copy of UefiCpuPkg/.../Flat32ToFlat64.asm: Allow Transition32FlatTo64Flat to be run from anywhere in memory - copy of UefiCpuPkg/../SearchForBfvBase.asm: Add a extra parameter to indicate where to start the search for the boot firmware volume. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1689 Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Acked-by: Laszlo Ersek <lersek@redhat.com> Message-Id: <20190813113119.14804-9-anthony.perard@citrix.com>
85 lines
2.2 KiB
NASM
85 lines
2.2 KiB
NASM
;------------------------------------------------------------------------------
|
|
; @file
|
|
; An entry point use by Xen when a guest is started in PVH mode.
|
|
;
|
|
; Copyright (c) 2019, Citrix Systems, Inc.
|
|
;
|
|
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
BITS 32
|
|
|
|
xenPVHMain:
|
|
;
|
|
; 'BP' to indicate boot-strap processor
|
|
;
|
|
mov di, 'BP'
|
|
|
|
;
|
|
; Store "Start of day" struct pointer for later use
|
|
;
|
|
mov dword[PVH_SPACE (0)], ebx
|
|
mov dword[PVH_SPACE (4)], 'XPVH'
|
|
|
|
;
|
|
; calculate delta between build-addr and run position
|
|
;
|
|
mov esp, PVH_SPACE(16) ; create a temporary stack
|
|
call .delta
|
|
.delta:
|
|
pop edx ; get addr of .delta
|
|
sub edx, ADDR_OF(.delta) ; calculate delta
|
|
|
|
;
|
|
; Find address of GDT and gdtr and fix the later
|
|
;
|
|
mov ebx, ADDR_OF(gdtr)
|
|
add ebx, edx ; add delta gdtr
|
|
mov eax, ADDR_OF(GDT_BASE)
|
|
add eax, edx ; add delta to GDT_BASE
|
|
mov dword[ebx + 2], eax ; fix GDT_BASE addr in gdtr
|
|
lgdt [ebx]
|
|
|
|
mov eax, SEC_DEFAULT_CR0
|
|
mov cr0, eax
|
|
|
|
;
|
|
; push return addr to the stack, then return far
|
|
;
|
|
push dword LINEAR_CODE_SEL ; segment to select
|
|
mov eax, ADDR_OF(.jmpToNewCodeSeg) ; return addr
|
|
add eax, edx ; add delta to return addr
|
|
push eax
|
|
retf
|
|
.jmpToNewCodeSeg:
|
|
|
|
mov eax, SEC_DEFAULT_CR4
|
|
mov cr4, eax
|
|
|
|
mov ax, LINEAR_SEL
|
|
mov ds, ax
|
|
mov es, ax
|
|
mov fs, ax
|
|
mov gs, ax
|
|
mov ss, ax
|
|
|
|
;
|
|
; ESP will be used as initial value of the EAX register
|
|
; in Main.asm
|
|
;
|
|
xor esp, esp
|
|
|
|
;
|
|
; parameter for Flat32SearchForBfvBase
|
|
;
|
|
mov eax, ADDR_OF(fourGigabytes)
|
|
add eax, edx ; add delta
|
|
|
|
;
|
|
; Jump to the main routine of the pre-SEC code
|
|
; skiping the 16-bit part of the routine and
|
|
; into the 32-bit flat mode part
|
|
;
|
|
OneTimeCallRet TransitionFromReal16To32BitFlat
|