Re: [edk2-devel] [PATCH v5 08/35] OvmfPkg/XenResetVector: Allow jumpstart from either hvmloader or PVH

2019-08-21 Thread Laszlo Ersek
Hi Anthony,

On 08/13/19 13:30, 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 
> Acked-by: Laszlo Ersek 
> ---
> 
> Notes:
> v3:
> - rebased, SPDX
> - fix commit message
> 
>  .../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 00..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.
> +; Copyright (c) 2019, Citrix Systems, Inc.
> +;
> +; SPDX-License-Identifier: BSD-2-Clause-Patent
> +;
> +;--
> +
> +BITS32
> +
> +;
> +; Modified:  EAX, EBX, ECX, EDX, ESP
> +;
> +Transition32FlatTo64Flat:
> +
> +OneTimeCall SetCr3ForPageTables64
> +
> +mov eax, cr4
> +bts eax, 5  ; enable PAE
> +mov cr4, eax
> +
> +mov ecx, 0xc080
> +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
> +;
> +pushdword LINEAR_CODE64_SEL
> +mov eax, ADDR_OF(jumpTo64BitAndLandHere)
> +add eax, edx ; add delta
> +pusheax
> +retf
> +
> +BITS64
> +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 00..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.
> +; 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 

[edk2-devel] [PATCH v5 08/35] OvmfPkg/XenResetVector: Allow jumpstart from either hvmloader or PVH

2019-08-13 Thread Anthony PERARD
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 
Acked-by: Laszlo Ersek 
---

Notes:
v3:
- rebased, SPDX
- fix commit message

 .../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 00..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.
+; Copyright (c) 2019, Citrix Systems, Inc.
+;
+; SPDX-License-Identifier: BSD-2-Clause-Patent
+;
+;--
+
+BITS32
+
+;
+; Modified:  EAX, EBX, ECX, EDX, ESP
+;
+Transition32FlatTo64Flat:
+
+OneTimeCall SetCr3ForPageTables64
+
+mov eax, cr4
+bts eax, 5  ; enable PAE
+mov cr4, eax
+
+mov ecx, 0xc080
+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
+;
+pushdword LINEAR_CODE64_SEL
+mov eax, ADDR_OF(jumpTo64BitAndLandHere)
+add eax, edx ; add delta
+pusheax
+retf
+
+BITS64
+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 00..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.
+; 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
+
+BITS32
+
+;
+; 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