Files
system76-edk2/OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm
Anthony PERARD f198e254f7 OvmfPkg/XenResetVector: Allow jumpstart from either hvmloader or PVH
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>
2019-08-21 18:03:49 +02:00

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