mbox series

[v3,00/35] Specific platform to run OVMF in Xen PVH and HVM guests

Message ID 20190704144233.27968-1-anthony.perard@citrix.com (mailing list archive)
Headers show
Series Specific platform to run OVMF in Xen PVH and HVM guests | expand

Message

Anthony PERARD July 4, 2019, 2:41 p.m. UTC
Patch series available in this git branch:
https://xenbits.xen.org/git-http/people/aperard/ovmf.git br.platform-xen-pvh-v3

Hi,

I've started to create a Xen specific platform, in OvmfPkg/XenOvmf.dsc
with the goal to make it work on both Xen HVM and Xen PVH.

The first few patches only create the platform and duplicate some code from
OvmfPkg and the later patches makes OVMF boot in a Xen PVH guest and can boot
a Linux guest.

After this patch series, I'd like to wait a bit before removing Xen support
from the OvmfPkg*.dsc, to allow time to switch to the new Xen only platform,
maybe 1 year.

To build and boot:

To build, simply run OvmfPkg/build.sh -p OvmfPkg/OvmfXen.dsc
Then use OVMF.fd as a kernel of a pvh guest config file (with xl/libxl).

Patch series available in this git branch:
https://xenbits.xen.org/git-http/people/aperard/ovmf.git br.platform-xen-pvh-v3

Anthony PERARD (35):
  OvmfPkg/ResetSystemLib: Add missing dependency on PciLib
  OvmfPkg: Create platform OvmfXen
  OvmfPkg: Introduce XenResetVector
  OvmfPkg: Introduce XenPlatformPei
  OvmfPkg/OvmfXen: Creating an ELF header
  OvmfPkg/XenResetVector: Add new entry point for Xen PVH
  OvmfPkg/XenResetVector: Saving start of day pointer for PVH guests
  OvmfPkg/XenResetVector: Allow jumpstart from either hvmloader or PVH
  OvmfPkg/OvmfXen: use a TimerLib instance that depends only on the CPU
  OvmfPkg/XenPlatformPei: Detect OVMF_INFO from hvmloader
  OvmfPkg/XenPlatformPei: Use mXenHvmloaderInfo to get E820
  OvmfPkg/XenPlatformPei: Grab RSDP from PVH guest start of day struct
  OvmfPkg/Library/XenPlatformLib: New library
  OvmfPkg/AcpiPlatformDxe: Use XenPlatformLib
  OvmfPkg/AcpiPlatformDxe: Use Xen PVH RSDP if it exist
  OvmfPkg/XenHypercallLib: Enable it in PEIM
  OvmfPkg/XenPlatformPei: Reinit XenHypercallLib
  OvmfPkg/XenPlatformPei: Introduce XenHvmloaderDetected
  OvmfPkg/XenPlatformPei: Reserve hvmloader's memory only when it has
    run
  OvmfPkg/XenPlatformPei: Setup HyperPages earlier
  OvmfPkg/XenPlatformPei: Introduce XenPvhDetected
  OvmfPkg: Import XENMEM_memory_map hypercall to Xen/memory.h
  OvmfPkg/XenPlatformPei: no hvmloader: get the E820 table via hypercall
  OvmfPkg/XenPlatformPei: Rework memory detection
  OvmfPkg/XenPlatformPei: Reserve VGA memory region, to boot Linux
  OvmfPkg/XenPlatformPei: Ignore missing PCI Host Bridge on Xen PVH
  OvmfPkg/XenPlatformLib: Cache result for XenDetected
  OvmfPkg/PlatformBootManagerLib: Use XenDetected from XenPlatformLib
  OvmfPkg/PlatformBootManagerLib: Handle the absence of PCI bus on Xen
    PVH
  OvmfPkg/OvmfXen: Override PcdFSBClock to Xen vLAPIC timer frequency
  OvmfPkg/OvmfXen: Introduce XenTimerDxe
  OvmfPkg/PlatformBootManagerLib: Use a Xen console for ConOut/ConIn
  OvmfPkg: Introduce XenIoPvhDxe to initialize Grant Tables
  OvmfPkg: Move XenRealTimeClockLib from ArmVirtPkg
  OvmfPkg/OvmfXen: use RealTimeClockRuntimeDxe from EmbeddedPkg

 OvmfPkg/OvmfPkg.dec                           |   7 +
 ArmVirtPkg/ArmVirtXen.dsc                     |   2 +-
 OvmfPkg/OvmfPkgIa32.dsc                       |   1 +
 OvmfPkg/OvmfPkgIa32X64.dsc                    |   1 +
 OvmfPkg/OvmfPkgX64.dsc                        |   1 +
 OvmfPkg/{OvmfPkgX64.dsc => OvmfXen.dsc}       | 238 +-------
 OvmfPkg/OvmfXen.fdf                           | 539 ++++++++++++++++++
 OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf   |   2 +-
 .../PlatformBootManagerLib.inf                |   5 +
 .../Library/ResetSystemLib/ResetSystemLib.inf |   1 +
 .../XenHypercallLib/XenHypercallLib.inf       |   4 +-
 .../Library/XenPlatformLib/XenPlatformLib.inf |  33 ++
 .../XenRealTimeClockLib.inf                   |   0
 OvmfPkg/XenIoPvhDxe/XenIoPvhDxe.inf           |  34 ++
 OvmfPkg/XenPlatformPei/XenPlatformPei.inf     | 100 ++++
 OvmfPkg/XenResetVector/XenResetVector.inf     |  41 ++
 OvmfPkg/XenTimerDxe/XenTimerDxe.inf           |  42 ++
 OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h        |   6 +-
 OvmfPkg/Include/Guid/XenInfo.h                |   8 +-
 .../Xen/arch-x86/hvm/start_info.h             | 143 +++++
 OvmfPkg/Include/IndustryStandard/Xen/memory.h |  23 +
 OvmfPkg/Include/Library/XenHypercallLib.h     |  12 +
 OvmfPkg/Include/Library/XenPlatformLib.h      |  53 ++
 .../PlatformBootManagerLib/BdsPlatform.h      |   1 +
 OvmfPkg/XenPlatformPei/Cmos.h                 |  52 ++
 OvmfPkg/XenPlatformPei/Platform.h             | 129 +++++
 OvmfPkg/XenPlatformPei/Xen.h                  |  39 ++
 OvmfPkg/XenTimerDxe/XenTimerDxe.h             | 177 ++++++
 OvmfPkg/AcpiPlatformDxe/Xen.c                 |  41 +-
 .../PlatformBootManagerLib/BdsPlatform.c      |  42 +-
 .../PlatformBootManagerLib/PlatformData.c     |  59 +-
 .../Library/ResetSystemLib/ResetSystemLib.c   |   3 +-
 .../Library/XenHypercallLib/X86XenHypercall.c |   8 +-
 .../Library/XenHypercallLib/XenHypercall.c    |  16 +
 .../Library/XenPlatformLib/XenPlatformLib.c   |  81 +++
 .../XenRealTimeClockLib/XenRealTimeClockLib.c |   0
 OvmfPkg/OvmfXenElfHeaderGenerator.c           | 140 +++++
 OvmfPkg/PlatformPei/Xen.c                     |   3 -
 OvmfPkg/XenIoPvhDxe/XenIoPvhDxe.c             | 108 ++++
 OvmfPkg/XenPlatformPei/AmdSev.c               |  64 +++
 OvmfPkg/XenPlatformPei/ClearCache.c           | 112 ++++
 OvmfPkg/XenPlatformPei/Cmos.c                 |  60 ++
 OvmfPkg/XenPlatformPei/Fv.c                   |  76 +++
 OvmfPkg/XenPlatformPei/MemDetect.c            | 492 ++++++++++++++++
 OvmfPkg/XenPlatformPei/Platform.c             | 452 +++++++++++++++
 OvmfPkg/XenPlatformPei/Xen.c                  | 378 ++++++++++++
 OvmfPkg/XenTimerDxe/XenTimerDxe.c             | 355 ++++++++++++
 .../XenResetVector/Ia16/Real16ToFlat32.asm    | 137 +++++
 .../XenResetVector/Ia16/ResetVectorVtf0.asm   |  81 +++
 .../XenResetVector/Ia32/Flat32ToFlat64.asm    |  68 +++
 OvmfPkg/XenResetVector/Ia32/PageTables64.asm  | 149 +++++
 .../XenResetVector/Ia32/SearchForBfvBase.asm  |  87 +++
 OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm    |  84 +++
 OvmfPkg/XenResetVector/XenResetVector.nasmb   |  71 +++
 54 files changed, 4563 insertions(+), 298 deletions(-)
 copy OvmfPkg/{OvmfPkgX64.dsc => OvmfXen.dsc} (76%)
 create mode 100644 OvmfPkg/OvmfXen.fdf
 create mode 100644 OvmfPkg/Library/XenPlatformLib/XenPlatformLib.inf
 rename {ArmVirtPkg => OvmfPkg}/Library/XenRealTimeClockLib/XenRealTimeClockLib.inf (100%)
 create mode 100644 OvmfPkg/XenIoPvhDxe/XenIoPvhDxe.inf
 create mode 100644 OvmfPkg/XenPlatformPei/XenPlatformPei.inf
 create mode 100644 OvmfPkg/XenResetVector/XenResetVector.inf
 create mode 100644 OvmfPkg/XenTimerDxe/XenTimerDxe.inf
 create mode 100644 OvmfPkg/Include/IndustryStandard/Xen/arch-x86/hvm/start_info.h
 create mode 100644 OvmfPkg/Include/Library/XenPlatformLib.h
 create mode 100644 OvmfPkg/XenPlatformPei/Cmos.h
 create mode 100644 OvmfPkg/XenPlatformPei/Platform.h
 create mode 100644 OvmfPkg/XenPlatformPei/Xen.h
 create mode 100644 OvmfPkg/XenTimerDxe/XenTimerDxe.h
 create mode 100644 OvmfPkg/Library/XenPlatformLib/XenPlatformLib.c
 rename {ArmVirtPkg => OvmfPkg}/Library/XenRealTimeClockLib/XenRealTimeClockLib.c (100%)
 create mode 100644 OvmfPkg/OvmfXenElfHeaderGenerator.c
 create mode 100644 OvmfPkg/XenIoPvhDxe/XenIoPvhDxe.c
 create mode 100644 OvmfPkg/XenPlatformPei/AmdSev.c
 create mode 100644 OvmfPkg/XenPlatformPei/ClearCache.c
 create mode 100644 OvmfPkg/XenPlatformPei/Cmos.c
 create mode 100644 OvmfPkg/XenPlatformPei/Fv.c
 create mode 100644 OvmfPkg/XenPlatformPei/MemDetect.c
 create mode 100644 OvmfPkg/XenPlatformPei/Platform.c
 create mode 100644 OvmfPkg/XenPlatformPei/Xen.c
 create mode 100644 OvmfPkg/XenTimerDxe/XenTimerDxe.c
 create mode 100644 OvmfPkg/XenResetVector/Ia16/Real16ToFlat32.asm
 create mode 100644 OvmfPkg/XenResetVector/Ia16/ResetVectorVtf0.asm
 create mode 100644 OvmfPkg/XenResetVector/Ia32/Flat32ToFlat64.asm
 create mode 100644 OvmfPkg/XenResetVector/Ia32/PageTables64.asm
 create mode 100644 OvmfPkg/XenResetVector/Ia32/SearchForBfvBase.asm
 create mode 100644 OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm
 create mode 100644 OvmfPkg/XenResetVector/XenResetVector.nasmb

Comments

Laszlo Ersek July 5, 2019, 12:21 p.m. UTC | #1
Hi Anthony,

On 07/04/19 16:41, Anthony PERARD wrote:
> Patch series available in this git branch:
> https://xenbits.xen.org/git-http/people/aperard/ovmf.git br.platform-xen-pvh-v3
> 
> Hi,
> 
> I've started to create a Xen specific platform, in OvmfPkg/XenOvmf.dsc
> with the goal to make it work on both Xen HVM and Xen PVH.
> 
> The first few patches only create the platform and duplicate some code from
> OvmfPkg and the later patches makes OVMF boot in a Xen PVH guest and can boot
> a Linux guest.
> 
> After this patch series, I'd like to wait a bit before removing Xen support
> from the OvmfPkg*.dsc, to allow time to switch to the new Xen only platform,
> maybe 1 year.
> 
> To build and boot:
> 
> To build, simply run OvmfPkg/build.sh -p OvmfPkg/OvmfXen.dsc
> Then use OVMF.fd as a kernel of a pvh guest config file (with xl/libxl).
> 
> Patch series available in this git branch:
> https://xenbits.xen.org/git-http/people/aperard/ovmf.git br.platform-xen-pvh-v3

The patches on the list are malformed. They have

Content-Transfer-Encoding: quoted-printable

which is fine, in itself; however, they have CR-CR-LF line terminators.

For example, from the first patch:

diff --git a/OvmfPkg/Library/ResetSystemLib/ResetSystemLib.inf b/OvmfPkg/L=
ibrary/ResetSystemLib/ResetSystemLib.inf
index 7c44f99a5c..2f24dac87f 100644
--- a/OvmfPkg/Library/ResetSystemLib/ResetSystemLib.inf
+++ b/OvmfPkg/Library/ResetSystemLib/ResetSystemLib.inf
@@ -30,4 +30,5 @@ [Packages]
 [LibraryClasses]=0D=0D
   DebugLib=0D=0D
   IoLib=0D=0D
+  PciLib=0D=0D
   TimerLib=0D=0D

Note "=0D=0D".

Your other (recent) patches,

- [edk2-devel] [PATCH v2]
  OvmfPkg/XenBusDxe: Close XenIoProtocol openned by children

- [edk2-devel] [PATCH]
  OvmfPkg/XenBusDxe: Don't call DisconnectController in Stop()

had the same problem; I had to use "--ignore-whitespace" with git-am, to
apply them.

Now, if I try to apply this full set with git-am like that, the first
patch in the series applies, but the second still fails:

> error: corrupt patch at line 23
> Patch failed at 0002 OvmfPkg: Create platform OvmfXen

Based on the email headers, the "iphmx.com" references suggest (via a
google search) "Cisco's Ironport Cloud email service".

I think that email service (MTA) is broken.

I decoded your emails (from quoted-printable to 8-bit plaintext),
removed the "Content-Transfer-Encoding" lines, and replaced '\r\r' with
'\r'. This way, git-am completed (with some "new blank line at EOF"
warnings). Applying the "processed" patches on top of commit
a7c7d21ffa9a, the resultant tree is identical to your tree at
"br.platform-xen-pvh-v3" branch (commit e8795d185875). In addition, I ran

$ git range-diff a7c7d21ffa9a \
      xen_pvh_anthony_v3 \
      xen_pvh_anthony_v3_from_email

and the only differences reported by that command were the "Message-Id"
tags appended to the commit messages by my "git-am" invocation. (I have
"am.messageid" set to to "true".)

I like to perform this sanity check when a patch series doesn't apply
as-is (without local tweaking) from the list, but there is a remote
topic branch to fetch (i.e. when there are two things I can compare). So
in this case, the sanity check passed fine; I can now look at the
patches themselves.

If you could use a different MTA (or get the current one fixed), that
would be helpful. (Yes, yes: if the edk2 project didn't use CRLF line
terminators, that would be *even more* helpful.)

Thanks
Laszlo
Laszlo Ersek July 5, 2019, 3:06 p.m. UTC | #2
On 07/04/19 16:41, Anthony PERARD wrote:
> Patch series available in this git branch:
> https://xenbits.xen.org/git-http/people/aperard/ovmf.git br.platform-xen-pvh-v3
> 
> Hi,
> 
> I've started to create a Xen specific platform, in OvmfPkg/XenOvmf.dsc
> with the goal to make it work on both Xen HVM and Xen PVH.
> 
> The first few patches only create the platform and duplicate some code from
> OvmfPkg and the later patches makes OVMF boot in a Xen PVH guest and can boot
> a Linux guest.
> 
> After this patch series, I'd like to wait a bit before removing Xen support
> from the OvmfPkg*.dsc, to allow time to switch to the new Xen only platform,
> maybe 1 year.
> 
> To build and boot:
> 
> To build, simply run OvmfPkg/build.sh -p OvmfPkg/OvmfXen.dsc
> Then use OVMF.fd as a kernel of a pvh guest config file (with xl/libxl).
> 
> Patch series available in this git branch:
> https://xenbits.xen.org/git-http/people/aperard/ovmf.git br.platform-xen-pvh-v3

I intend to continue the review with [PATCH v3 11/35], next week.

Thanks
Laszlo
Laszlo Ersek July 10, 2019, 2:12 p.m. UTC | #3
On 07/04/19 16:41, Anthony PERARD wrote:
> Patch series available in this git branch:
> https://xenbits.xen.org/git-http/people/aperard/ovmf.git br.platform-xen-pvh-v3
> 
> Hi,
> 
> I've started to create a Xen specific platform, in OvmfPkg/XenOvmf.dsc
> with the goal to make it work on both Xen HVM and Xen PVH.
> 
> The first few patches only create the platform and duplicate some code from
> OvmfPkg and the later patches makes OVMF boot in a Xen PVH guest and can boot
> a Linux guest.
> 
> After this patch series, I'd like to wait a bit before removing Xen support
> from the OvmfPkg*.dsc, to allow time to switch to the new Xen only platform,
> maybe 1 year.
> 
> To build and boot:
> 
> To build, simply run OvmfPkg/build.sh -p OvmfPkg/OvmfXen.dsc
> Then use OVMF.fd as a kernel of a pvh guest config file (with xl/libxl).
> 
> Patch series available in this git branch:
> https://xenbits.xen.org/git-http/people/aperard/ovmf.git br.platform-xen-pvh-v3

I believe I've completed the v3 review.

Thanks,
Laszlo
Anthony PERARD July 19, 2019, 4:42 p.m. UTC | #4
On Fri, Jul 05, 2019 at 02:21:13PM +0200, Laszlo Ersek wrote:
> The patches on the list are malformed. They have
> 
> Content-Transfer-Encoding: quoted-printable
> 
> which is fine, in itself; however, they have CR-CR-LF line terminators.
> 
> For example, from the first patch:
> 
> diff --git a/OvmfPkg/Library/ResetSystemLib/ResetSystemLib.inf b/OvmfPkg/L=
> ibrary/ResetSystemLib/ResetSystemLib.inf
> index 7c44f99a5c..2f24dac87f 100644
> --- a/OvmfPkg/Library/ResetSystemLib/ResetSystemLib.inf
> +++ b/OvmfPkg/Library/ResetSystemLib/ResetSystemLib.inf
> @@ -30,4 +30,5 @@ [Packages]
>  [LibraryClasses]=0D=0D
>    DebugLib=0D=0D
>    IoLib=0D=0D
> +  PciLib=0D=0D
>    TimerLib=0D=0D
> 
> Note "=0D=0D".
> 
> Now, if I try to apply this full set with git-am like that, the first
> patch in the series applies, but the second still fails:
> 
> > error: corrupt patch at line 23
> > Patch failed at 0002 OvmfPkg: Create platform OvmfXen
> 
> Based on the email headers, the "iphmx.com" references suggest (via a
> google search) "Cisco's Ironport Cloud email service".
> 
> I think that email service (MTA) is broken.
> 
> If you could use a different MTA (or get the current one fixed), that
> would be helpful. (Yes, yes: if the edk2 project didn't use CRLF line
> terminators, that would be *even more* helpful.)

I'm not sure that using a different MTA is going to help. I don't think
I can find a patch on the list that I can apply (without using unix2dos).
I did send a patch to my gmail address, and it looks fine (=0D in the
expected places and nowhere else). So maybe when a patch is sent through
a mailing list, some more formating is done?

Anyway, can I try sending patch encoded in base64 instead of
quoted-printable? That would probably work better.

I found <20190704040731.5303-1-glin@suse.com> on the list that is base64
encoded, that I can easily apply and patchew too.
Laszlo Ersek July 22, 2019, 7:09 p.m. UTC | #5
On 07/19/19 18:42, Anthony PERARD wrote:
> On Fri, Jul 05, 2019 at 02:21:13PM +0200, Laszlo Ersek wrote:
>> The patches on the list are malformed. They have
>>
>> Content-Transfer-Encoding: quoted-printable
>>
>> which is fine, in itself; however, they have CR-CR-LF line terminators.
>>
>> For example, from the first patch:
>>
>> diff --git a/OvmfPkg/Library/ResetSystemLib/ResetSystemLib.inf b/OvmfPkg/L=
>> ibrary/ResetSystemLib/ResetSystemLib.inf
>> index 7c44f99a5c..2f24dac87f 100644
>> --- a/OvmfPkg/Library/ResetSystemLib/ResetSystemLib.inf
>> +++ b/OvmfPkg/Library/ResetSystemLib/ResetSystemLib.inf
>> @@ -30,4 +30,5 @@ [Packages]
>>  [LibraryClasses]=0D=0D
>>    DebugLib=0D=0D
>>    IoLib=0D=0D
>> +  PciLib=0D=0D
>>    TimerLib=0D=0D
>>
>> Note "=0D=0D".
>>
>> Now, if I try to apply this full set with git-am like that, the first
>> patch in the series applies, but the second still fails:
>>
>>> error: corrupt patch at line 23
>>> Patch failed at 0002 OvmfPkg: Create platform OvmfXen
>>
>> Based on the email headers, the "iphmx.com" references suggest (via a
>> google search) "Cisco's Ironport Cloud email service".
>>
>> I think that email service (MTA) is broken.
>>
>> If you could use a different MTA (or get the current one fixed), that
>> would be helpful. (Yes, yes: if the edk2 project didn't use CRLF line
>> terminators, that would be *even more* helpful.)
> 
> I'm not sure that using a different MTA is going to help. I don't think
> I can find a patch on the list that I can apply (without using unix2dos).
> I did send a patch to my gmail address, and it looks fine (=0D in the
> expected places and nowhere else). So maybe when a patch is sent through
> a mailing list, some more formating is done?
> 
> Anyway, can I try sending patch encoded in base64 instead of
> quoted-printable? That would probably work better.
> 
> I found <20190704040731.5303-1-glin@suse.com> on the list that is base64
> encoded, that I can easily apply and patchew too.

That patch ("[edk2-devel] [PATCH v2] OvmfPkg: use DxeTpmMeasurementLib
if and only if TPM2_ENABLE") worked fine for me as well.

However, Gary confirmed elsewhere that he had to tweak the posting
process manually, for that patch:

http://mid.mail-archive.com/20190704085826.GD32340@GaryWorkstation

Thanks
Laszlo