From: Laszlo Ersek <lersek@redhat.com>
To: Anthony PERARD <anthony.perard@citrix.com>, devel@edk2.groups.io
Cc: xen-devel@lists.xenproject.org,
Julien Grall <julien.grall@arm.com>,
Jordan Justen <jordan.l.justen@intel.com>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>
Subject: Re: [Xen-devel] [PATCH v3 08/35] OvmfPkg/XenResetVector: Allow jumpstart from either hvmloader or PVH
Date: Fri, 5 Jul 2019 16:54:50 +0200 [thread overview]
Message-ID: <246252e2-08fa-72c9-3184-dd5617f2f83f@redhat.com> (raw)
In-Reply-To: <20190704144233.27968-9-anthony.perard@citrix.com>
On 07/04/19 16:42, 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 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>
> ---
>
> Notes:
> v3:
> - rebased, SPDX
> - fix commit message
There are more changes in v3 than that.
First, some comment updates -- OK.
Second (and actually this goes back to another unlisted v3 change,
namely on patch#6 first):
- in v2:
- in patch #6, you store EAX to ESP at the top of xenPVHMain
- in patch #8, you stash EAX in EBP at the top of xenPVHMain, then
store EBP to ESP at the end of xenPVHMain
- in v3:
- in patch #6, you zero ESP at the top of xenPVHMain
- in patch #8 (this patch), you move the zeroing to the end of
xenPVHMain
To the extent that I care :) , this looks OK to me -- and so my A-b
stands --, but this change could be relevant for xen-devel reviewers,
and should be pointed out.
Thanks
Laszlo
> .../XenResetVector/Ia16/Real16ToFlat32.asm | 3 +
> .../XenResetVector/Ia32/Flat32ToFlat64.asm | 68 +++++++++++++++
> .../XenResetVector/Ia32/SearchForBfvBase.asm | 87 +++++++++++++++++++
> OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm | 43 +++++++--
> 4 files changed, 194 insertions(+), 7 deletions(-)
> create mode 100644 OvmfPkg/XenResetVector/Ia32/Flat32ToFlat64.asm
> create mode 100644 OvmfPkg/XenResetVector/Ia32/SearchForBfvBase.asm
>
> diff --git a/OvmfPkg/XenResetVector/Ia16/Real16ToFlat32.asm b/OvmfPkg/XenResetVector/Ia16/Real16ToFlat32.asm
> index 5c329bfaea..36ea74f7fe 100644
> --- a/OvmfPkg/XenResetVector/Ia16/Real16ToFlat32.asm
> +++ b/OvmfPkg/XenResetVector/Ia16/Real16ToFlat32.asm
> @@ -54,6 +54,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/OvmfPkg/XenResetVector/Ia32/Flat32ToFlat64.asm b/OvmfPkg/XenResetVector/Ia32/Flat32ToFlat64.asm
> new file mode 100644
> index 0000000000..661a8e7028
> --- /dev/null
> +++ b/OvmfPkg/XenResetVector/Ia32/Flat32ToFlat64.asm
> @@ -0,0 +1,68 @@
> +;------------------------------------------------------------------------------
> +; @file
> +; 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.
> +;
> +; SPDX-License-Identifier: BSD-2-Clause-Patent
> +;
> +;------------------------------------------------------------------------------
> +
> +BITS 32
> +
> +;
> +; Modified: EAX, EBX, ECX, EDX, ESP
> +;
> +Transition32FlatTo64Flat:
> +
> + OneTimeCall SetCr3ForPageTables64
> +
> + mov eax, cr4
> + bts eax, 5 ; enable PAE
> + mov cr4, eax
> +
> + mov ecx, 0xc0000080
> + rdmsr
> + bts eax, 8 ; set LME
> + wrmsr
> +
> + mov eax, cr0
> + bts eax, 31 ; set PG
> + mov cr0, eax ; enable paging
> +
> + ;
> + ; 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/OvmfPkg/XenResetVector/Ia32/SearchForBfvBase.asm b/OvmfPkg/XenResetVector/Ia32/SearchForBfvBase.asm
> new file mode 100644
> index 0000000000..190389c46f
> --- /dev/null
> +++ b/OvmfPkg/XenResetVector/Ia32/SearchForBfvBase.asm
> @@ -0,0 +1,87 @@
> +;------------------------------------------------------------------------------
> +; @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
> +
> diff --git a/OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm b/OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm
> index f42df3dba2..2df0f12e18 100644
> --- a/OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm
> +++ b/OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm
> @@ -16,25 +16,42 @@ xenPVHMain:
> ;
> mov di, 'BP'
>
> - ;
> - ; ESP will be used as initial value of the EAX register
> - ; in Main.asm
> - ;
> - xor esp, esp
> -
> ;
> ; 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
>
> - 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,6 +64,18 @@ xenPVHMain:
> 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
>
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2019-07-05 14:55 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-04 14:41 [Xen-devel] [PATCH v3 00/35] Specific platform to run OVMF in Xen PVH and HVM guests Anthony PERARD
2019-07-04 14:41 ` [Xen-devel] [PATCH v3 01/35] OvmfPkg/ResetSystemLib: Add missing dependency on PciLib Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 02/35] OvmfPkg: Create platform OvmfXen Anthony PERARD
2019-07-05 13:29 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 03/35] OvmfPkg: Introduce XenResetVector Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 04/35] OvmfPkg: Introduce XenPlatformPei Anthony PERARD
2019-07-05 13:53 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 05/35] OvmfPkg/OvmfXen: Creating an ELF header Anthony PERARD
2019-07-05 14:09 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 06/35] OvmfPkg/XenResetVector: Add new entry point for Xen PVH Anthony PERARD
2019-07-05 13:57 ` Andrew Cooper
2019-07-19 10:20 ` Anthony PERARD
2019-07-19 14:33 ` Laszlo Ersek
2019-07-19 14:41 ` Andrew Cooper
2019-07-19 15:51 ` Anthony PERARD
2019-07-05 14:14 ` Laszlo Ersek
2019-07-15 11:46 ` Roger Pau Monné
2019-07-15 11:50 ` Andrew Cooper
2019-07-15 14:25 ` Roger Pau Monné
2019-07-19 14:00 ` Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 07/35] OvmfPkg/XenResetVector: Saving start of day pointer for PVH guests Anthony PERARD
2019-07-05 14:24 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 08/35] OvmfPkg/XenResetVector: Allow jumpstart from either hvmloader or PVH Anthony PERARD
2019-07-05 14:54 ` Laszlo Ersek [this message]
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 09/35] OvmfPkg/OvmfXen: use a TimerLib instance that depends only on the CPU Anthony PERARD
2019-07-05 15:01 ` Laszlo Ersek
2019-07-15 14:22 ` Roger Pau Monné
2019-07-22 13:49 ` Anthony PERARD
2019-07-22 19:28 ` Laszlo Ersek
2019-07-23 9:02 ` Roger Pau Monné
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 10/35] OvmfPkg/XenPlatformPei: Detect OVMF_INFO from hvmloader Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 11/35] OvmfPkg/XenPlatformPei: Use mXenHvmloaderInfo to get E820 Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 12/35] OvmfPkg/XenPlatformPei: Grab RSDP from PVH guest start of day struct Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 13/35] OvmfPkg/Library/XenPlatformLib: New library Anthony PERARD
2019-07-08 14:34 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 14/35] OvmfPkg/AcpiPlatformDxe: Use XenPlatformLib Anthony PERARD
2019-07-08 14:38 ` Laszlo Ersek
2019-07-10 9:42 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 15/35] OvmfPkg/AcpiPlatformDxe: Use Xen PVH RSDP if it exist Anthony PERARD
2019-07-08 14:42 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 16/35] OvmfPkg/XenHypercallLib: Enable it in PEIM Anthony PERARD
2019-07-08 14:51 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 17/35] OvmfPkg/XenPlatformPei: Reinit XenHypercallLib Anthony PERARD
2019-07-08 15:07 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 18/35] OvmfPkg/XenPlatformPei: Introduce XenHvmloaderDetected Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 19/35] OvmfPkg/XenPlatformPei: Reserve hvmloader's memory only when it has run Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 20/35] OvmfPkg/XenPlatformPei: Setup HyperPages earlier Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 21/35] OvmfPkg/XenPlatformPei: Introduce XenPvhDetected Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 22/35] OvmfPkg: Import XENMEM_memory_map hypercall to Xen/memory.h Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 23/35] OvmfPkg/XenPlatformPei: no hvmloader: get the E820 table via hypercall Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 24/35] OvmfPkg/XenPlatformPei: Rework memory detection Anthony PERARD
2019-07-15 14:15 ` Roger Pau Monné
2019-07-22 14:53 ` Anthony PERARD
2019-07-22 19:45 ` Laszlo Ersek
2019-07-22 23:08 ` Laszlo Ersek
2019-07-23 9:42 ` Roger Pau Monné
2019-07-23 16:06 ` Anthony PERARD
2019-07-24 16:17 ` Anthony PERARD
2019-07-25 9:08 ` Roger Pau Monné
2019-07-25 10:05 ` Anthony PERARD
2019-07-25 11:03 ` Roger Pau Monné
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 25/35] OvmfPkg/XenPlatformPei: Reserve VGA memory region, to boot Linux Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 26/35] OvmfPkg/XenPlatformPei: Ignore missing PCI Host Bridge on Xen PVH Anthony PERARD
2019-07-08 15:31 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 27/35] OvmfPkg/XenPlatformLib: Cache result for XenDetected Anthony PERARD
2019-07-10 9:31 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 28/35] OvmfPkg/PlatformBootManagerLib: Use XenDetected from XenPlatformLib Anthony PERARD
2019-07-10 9:45 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 29/35] OvmfPkg/PlatformBootManagerLib: Handle the absence of PCI bus on Xen PVH Anthony PERARD
2019-07-10 9:50 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 30/35] OvmfPkg/OvmfXen: Override PcdFSBClock to Xen vLAPIC timer frequency Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 31/35] OvmfPkg/OvmfXen: Introduce XenTimerDxe Anthony PERARD
2019-07-10 10:12 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 32/35] OvmfPkg/PlatformBootManagerLib: Use a Xen console for ConOut/ConIn Anthony PERARD
2019-07-10 10:48 ` Laszlo Ersek
2019-07-22 17:06 ` Anthony PERARD
2019-07-23 7:31 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 33/35] OvmfPkg: Introduce XenIoPvhDxe to initialize Grant Tables Anthony PERARD
2019-07-10 14:05 ` Laszlo Ersek
2019-07-26 16:06 ` Anthony PERARD
2019-07-26 17:19 ` Laszlo Ersek
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 34/35] OvmfPkg: Move XenRealTimeClockLib from ArmVirtPkg Anthony PERARD
2019-07-04 14:42 ` [Xen-devel] [PATCH v3 35/35] OvmfPkg/OvmfXen: use RealTimeClockRuntimeDxe from EmbeddedPkg Anthony PERARD
2019-07-05 12:21 ` [Xen-devel] [edk2-devel] [PATCH v3 00/35] Specific platform to run OVMF in Xen PVH and HVM guests Laszlo Ersek
2019-07-19 16:42 ` Anthony PERARD
2019-07-22 19:09 ` Laszlo Ersek
2019-07-05 15:06 ` [Xen-devel] " Laszlo Ersek
2019-07-10 14:12 ` Laszlo Ersek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=246252e2-08fa-72c9-3184-dd5617f2f83f@redhat.com \
--to=lersek@redhat.com \
--cc=anthony.perard@citrix.com \
--cc=ard.biesheuvel@linaro.org \
--cc=devel@edk2.groups.io \
--cc=jordan.l.justen@intel.com \
--cc=julien.grall@arm.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.