From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: redhat.com, ip: 209.132.183.28, mailfrom: lersek@redhat.com) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by groups.io with SMTP; Thu, 11 Apr 2019 04:19:31 -0700 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B9122C06644A; Thu, 11 Apr 2019 11:19:30 +0000 (UTC) Received: from lacos-laptop-7.usersys.redhat.com (ovpn-120-225.rdu2.redhat.com [10.10.120.225]) by smtp.corp.redhat.com (Postfix) with ESMTP id DF4D360BF7; Thu, 11 Apr 2019 11:19:28 +0000 (UTC) Subject: Re: [edk2-devel] [PATCH v2 08/31] OvmfPkg/XenResetVector: Allow to jumpstart from either hvmloader or PVH To: devel@edk2.groups.io, anthony.perard@citrix.com Cc: Jordan Justen , Ard Biesheuvel , Julien Grall , xen-devel@lists.xenproject.org References: <20190409110844.14746-1-anthony.perard@citrix.com> <20190409110844.14746-9-anthony.perard@citrix.com> From: "Laszlo Ersek" Message-ID: Date: Thu, 11 Apr 2019 13:19:27 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20190409110844.14746-9-anthony.perard@citrix.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Thu, 11 Apr 2019 11:19:30 +0000 (UTC) Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit On 04/09/19 13:08, Anthony PERARD wrote: > 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 been compatible with the way (1) s/been/being/ > 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 been runnned from anywhere in memory (2) s/been runned/be run/ > _ copy of UefiCpuPkg/../SearchForBfvBase.asm: (3) please replace the underscore (_) with a hyphen (-) > Add a extra parameter to indicate where to start the search for the > boot firmware volume. > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Anthony PERARD > --- > OvmfPkg/XenResetVector/Ia16/Real16ToFlat32.asm | 3 ++ > {UefiCpuPkg/ResetVector/Vtf0 => OvmfPkg/XenResetVector}/Ia32/Flat32ToFlat64.asm | 25 ++++++++++++++-- > {UefiCpuPkg/ResetVector/Vtf0 => OvmfPkg/XenResetVector}/Ia32/SearchForBfvBase.asm | 19 +++++++++---- > OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm | 30 ++++++++++++++++++-- > 4 files changed, 66 insertions(+), 11 deletions(-) (4) For the subject line: please drop the word "to". With those: Acked-by: Laszlo Ersek Thanks Laszlo > > diff --git a/OvmfPkg/XenResetVector/Ia16/Real16ToFlat32.asm b/OvmfPkg/XenResetVector/Ia16/Real16ToFlat32.asm > index e22e92c8a6..eebced6ced 100644 > --- a/OvmfPkg/XenResetVector/Ia16/Real16ToFlat32.asm > +++ b/OvmfPkg/XenResetVector/Ia16/Real16ToFlat32.asm > @@ -61,6 +61,9 @@ jumpTo32BitAndLandHere: > mov gs, ax > mov ss, ax > > + ; parameter for Flat32SearchForBfvBase > + xor eax, eax ; Start searching from top of 4GB for BfvBase > + > OneTimeCallRet TransitionFromReal16To32BitFlat > > ALIGN 2 > diff --git a/UefiCpuPkg/ResetVector/Vtf0/Ia32/Flat32ToFlat64.asm b/OvmfPkg/XenResetVector/Ia32/Flat32ToFlat64.asm > similarity index 69% > copy from UefiCpuPkg/ResetVector/Vtf0/Ia32/Flat32ToFlat64.asm > copy to OvmfPkg/XenResetVector/Ia32/Flat32ToFlat64.asm > index 5b6b375330..ca03ea43e0 100644 > --- a/UefiCpuPkg/ResetVector/Vtf0/Ia32/Flat32ToFlat64.asm > +++ b/OvmfPkg/XenResetVector/Ia32/Flat32ToFlat64.asm > @@ -3,6 +3,8 @@ > ; Transition from 32 bit flat protected mode into 64 bit flat protected mode > ; > ; Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.
> +; Copyright (c) 2019, Citrix Systems, Inc. > +; > ; This program and the accompanying materials > ; are licensed and made available under the terms and conditions of the BSD License > ; which accompanies this distribution. The full text of the license may be found at > @@ -16,7 +18,7 @@ > BITS 32 > > ; > -; Modified: EAX > +; Modified: EAX, EBX, ECX, EDX, ESP > ; > Transition32FlatTo64Flat: > > @@ -35,10 +37,29 @@ Transition32FlatTo64Flat: > bts eax, 31 ; set PG > mov cr0, eax ; enable paging > > - jmp LINEAR_CODE64_SEL:ADDR_OF(jumpTo64BitAndLandHere) > + ; backup ESP > + mov ebx, esp > + > + ;; recalculate delta > + mov esp, PVH_SPACE(16) > + call .delta > +.delta: > + pop edx > + sub edx, ADDR_OF(.delta) > + > + ; push return addr and seg to the stack, then return far > + push dword LINEAR_CODE64_SEL > + mov eax, ADDR_OF(jumpTo64BitAndLandHere) > + add eax, edx ; add delta > + push eax > + retf > + > BITS 64 > jumpTo64BitAndLandHere: > > + ; restore ESP > + mov esp, ebx > + > debugShowPostCode POSTCODE_64BIT_MODE > > OneTimeCallRet Transition32FlatTo64Flat > diff --git a/UefiCpuPkg/ResetVector/Vtf0/Ia32/SearchForBfvBase.asm b/OvmfPkg/XenResetVector/Ia32/SearchForBfvBase.asm > similarity index 83% > copy from UefiCpuPkg/ResetVector/Vtf0/Ia32/SearchForBfvBase.asm > copy to OvmfPkg/XenResetVector/Ia32/SearchForBfvBase.asm > index d0c2d8c39c..0519e05601 100644 > --- a/UefiCpuPkg/ResetVector/Vtf0/Ia32/SearchForBfvBase.asm > +++ b/OvmfPkg/XenResetVector/Ia32/SearchForBfvBase.asm > @@ -3,6 +3,8 @@ > ; Search for the Boot Firmware Volume (BFV) base address > ; > ; Copyright (c) 2008 - 2009, Intel Corporation. All rights reserved.
> +; Copyright (c) 2019, Citrix Systems, Inc. > +; > ; This program and the accompanying materials > ; are licensed and made available under the terms and conditions of the BSD License > ; which accompanies this distribution. The full text of the license may be found at > @@ -23,22 +25,26 @@ > BITS 32 > > ; > -; Modified: EAX, EBX > +; Modified: EAX, EBX, ECX > ; Preserved: EDI, ESP > ; > +; @param[in] EAX Start search from here > ; @param[out] EBP Address of Boot Firmware Volume (BFV) > ; > Flat32SearchForBfvBase: > > - xor eax, eax > + mov ecx, eax > searchingForBfvHeaderLoop: > ; > - ; We check for a firmware volume at every 4KB address in the top 16MB > - ; just below 4GB. (Addresses at 0xffHHH000 where H is any hex digit.) > + ; We check for a firmware volume at every 4KB address in the 16MB > + ; just below where we started, ECX. > ; > sub eax, 0x1000 > - cmp eax, 0xff000000 > - jb searchedForBfvHeaderButNotFound > + mov ebx, ecx > + sub ebx, eax > + cmp ebx, 0x01000000 > + ; if ECX-EAX > 16MB; jump notfound > + ja searchedForBfvHeaderButNotFound > > ; > ; Check FFS GUID > @@ -59,6 +65,7 @@ searchingForBfvHeaderLoop: > jne searchingForBfvHeaderLoop > mov ebx, eax > add ebx, dword [eax + 0x20] > + cmp ebx, ecx > jnz searchingForBfvHeaderLoop > > jmp searchedForBfvHeaderAndItWasFound > diff --git a/OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm b/OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm > index 4e55b0ac1f..612b2e9c44 100644 > --- a/OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm > +++ b/OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm > @@ -19,22 +19,39 @@ BITS 32 > xenPVHMain: > mov di, 'BP' > > - ; ESP - Initial value of the EAX register (BIST: Built-in Self Test) > - mov esp, eax > + ; EBP - Initial value of the EAX register (BIST: Built-in Self Test) > + mov ebp, eax > > ;; 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 > + > cli > > + ;; 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 > > - jmp LINEAR_CODE_SEL:ADDR_OF(.jmpToNewCodeSeg) > + ;; 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 > @@ -47,5 +64,12 @@ xenPVHMain: > mov gs, ax > mov ss, ax > > + ; ESP - Initial value of the EAX register (BIST: Built-in Self Test) > + mov esp, ebp > + > + ; parameter for Flat32SearchForBfvBase > + mov eax, ADDR_OF(fourGigabytes) > + add eax, edx ; add delta > + > ; return to the Main16 > OneTimeCallRet TransitionFromReal16To32BitFlat >