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>
88 lines
2.3 KiB
NASM
88 lines
2.3 KiB
NASM
;------------------------------------------------------------------------------
|
|
; @file
|
|
; Search for the Boot Firmware Volume (BFV) base address
|
|
;
|
|
; Copyright (c) 2008 - 2009, Intel Corporation. All rights reserved.<BR>
|
|
; Copyright (c) 2019, Citrix Systems, Inc.
|
|
;
|
|
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
;#define EFI_FIRMWARE_FILE_SYSTEM2_GUID \
|
|
; { 0x8c8ce578, 0x8a3d, 0x4f1c, { 0x99, 0x35, 0x89, 0x61, 0x85, 0xc3, 0x2d, 0xd3 } }
|
|
%define FFS_GUID_DWORD0 0x8c8ce578
|
|
%define FFS_GUID_DWORD1 0x4f1c8a3d
|
|
%define FFS_GUID_DWORD2 0x61893599
|
|
%define FFS_GUID_DWORD3 0xd32dc385
|
|
|
|
BITS 32
|
|
|
|
;
|
|
; Modified: EAX, EBX, ECX
|
|
; Preserved: EDI, ESP
|
|
;
|
|
; @param[in] EAX Start search from here
|
|
; @param[out] EBP Address of Boot Firmware Volume (BFV)
|
|
;
|
|
Flat32SearchForBfvBase:
|
|
|
|
mov ecx, eax
|
|
searchingForBfvHeaderLoop:
|
|
;
|
|
; We check for a firmware volume at every 4KB address in the 16MB
|
|
; just below where we started, ECX.
|
|
;
|
|
sub eax, 0x1000
|
|
mov ebx, ecx
|
|
sub ebx, eax
|
|
cmp ebx, 0x01000000
|
|
; if ECX-EAX > 16MB; jump notfound
|
|
ja searchedForBfvHeaderButNotFound
|
|
|
|
;
|
|
; Check FFS GUID
|
|
;
|
|
cmp dword [eax + 0x10], FFS_GUID_DWORD0
|
|
jne searchingForBfvHeaderLoop
|
|
cmp dword [eax + 0x14], FFS_GUID_DWORD1
|
|
jne searchingForBfvHeaderLoop
|
|
cmp dword [eax + 0x18], FFS_GUID_DWORD2
|
|
jne searchingForBfvHeaderLoop
|
|
cmp dword [eax + 0x1c], FFS_GUID_DWORD3
|
|
jne searchingForBfvHeaderLoop
|
|
|
|
;
|
|
; Check FV Length
|
|
;
|
|
cmp dword [eax + 0x24], 0
|
|
jne searchingForBfvHeaderLoop
|
|
mov ebx, eax
|
|
add ebx, dword [eax + 0x20]
|
|
cmp ebx, ecx
|
|
jnz searchingForBfvHeaderLoop
|
|
|
|
jmp searchedForBfvHeaderAndItWasFound
|
|
|
|
searchedForBfvHeaderButNotFound:
|
|
;
|
|
; Hang if the SEC entry point was not found
|
|
;
|
|
debugShowPostCode POSTCODE_BFV_NOT_FOUND
|
|
|
|
;
|
|
; 0xbfbfbfbf in the EAX & EBP registers helps signal what failed
|
|
; for debugging purposes.
|
|
;
|
|
mov eax, 0xBFBFBFBF
|
|
mov ebp, eax
|
|
jmp $
|
|
|
|
searchedForBfvHeaderAndItWasFound:
|
|
mov ebp, eax
|
|
|
|
debugShowPostCode POSTCODE_BFV_FOUND
|
|
|
|
OneTimeCallRet Flat32SearchForBfvBase
|
|
|