[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [edk2-devel] [PATCH v2 08/31] OvmfPkg/XenResetVector: Allow to jumpstart from either hvmloader or PVH
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 <anthony.perard@xxxxxxxxxx> > --- > 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 <lersek@xxxxxxxxxx> 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.<BR> > +; 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.<BR> > +; 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 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |