[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.