From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=softfail (domain: citrix.com, ip: , mailfrom: anthony.perard@citrix.com) Received: from esa4.hc3370-68.iphmx.com (esa4.hc3370-68.iphmx.com []) by groups.io with SMTP; Thu, 04 Jul 2019 07:58:40 -0700 Authentication-Results: esa4.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=anthony.perard@citrix.com; spf=Pass smtp.mailfrom=anthony.perard@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: None (esa4.hc3370-68.iphmx.com: no sender authenticity information available from domain of anthony.perard@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa4.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="anthony.perard@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa4.hc3370-68.iphmx.com: domain of anthony.perard@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa4.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="anthony.perard@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ~all" Received-SPF: None (esa4.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa4.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: gcEoXwaMUWtg37gLBFlzaW9XkZ7W9Jfj+cHNyzSMMsBRcYKIzXVA7TPl5gHjmjSG86QKHxl2qi 2zp4D1+uCWcqBuwXMEX7OYEpReMUX0REHVSMQNhlErnOtnssRrn5I0T0QWO9K3+0KFs441XT1w LfeUYPV07+ybgeJY5u+mNCq9EUVZLSOhRA5xE3ISe3mMASoUvTDIXrXS+ezWYu/WX5z5Rmmw0G l9/pOLtzLmOUV4R6F17o0aN28qqTF7w/5rnufdFCxidxK/xUpAqh4+8TvJUfPucwct2rNUudub zBw= X-SBRS: 2.7 X-MesageID: 2650944 X-Ironport-Server: esa4.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.63,451,1557201600"; d="scan'208";a="2650944" From: "Anthony PERARD" To: CC: , Ard Biesheuvel , Jordan Justen , Laszlo Ersek , Julien Grall , Anthony PERARD Subject: [PATCH v3 12/35] OvmfPkg/XenPlatformPei: Grab RSDP from PVH guest start of day struct Date: Thu, 4 Jul 2019 15:42:10 +0100 Message-ID: <20190704144233.27968-13-anthony.perard@citrix.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190704144233.27968-1-anthony.perard@citrix.com> References: <20190704144233.27968-1-anthony.perard@citrix.com> MIME-Version: 1.0 Return-Path: anthony.perard@citrix.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain Check if there's a start of the day struct provided to PVH guest, save the ACPI RSDP address for later. This patch import import arch-x86/hvm/start_info.h from xen.git. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D1689 Signed-off-by: Anthony PERARD Acked-by: Laszlo Ersek --- Notes: v3: - use SPDX - use SIGNATURE_32 - fix coding style OvmfPkg/XenPlatformPei/XenPlatformPei.inf | 3 + OvmfPkg/Include/Guid/XenInfo.h | 4 + .../Xen/arch-x86/hvm/start_info.h | 143 ++++++++++++++++++ OvmfPkg/XenPlatformPei/Xen.c | 25 +++ 4 files changed, 175 insertions(+) create mode 100644 OvmfPkg/Include/IndustryStandard/Xen/arch-x86/hvm/start= _info.h diff --git a/OvmfPkg/XenPlatformPei/XenPlatformPei.inf b/OvmfPkg/XenPlatfor= mPei/XenPlatformPei.inf index d1265c365a..4d00206d09 100644 --- a/OvmfPkg/XenPlatformPei/XenPlatformPei.inf +++ b/OvmfPkg/XenPlatformPei/XenPlatformPei.inf @@ -84,6 +84,9 @@ [Pcd] gEfiSecurityPkgTokenSpaceGuid.PcdOptionRomImageVerificationPolicy=0D gUefiCpuPkgTokenSpaceGuid.PcdCpuLocalApicBaseAddress=0D =0D + gUefiOvmfPkgTokenSpaceGuid.PcdXenPvhStartOfDayStructPtr=0D + gUefiOvmfPkgTokenSpaceGuid.PcdXenPvhStartOfDayStructPtrSize=0D +=0D [FixedPcd]=0D gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress=0D =0D diff --git a/OvmfPkg/Include/Guid/XenInfo.h b/OvmfPkg/Include/Guid/XenInfo.h index b052d618fd..25743b3884 100644 --- a/OvmfPkg/Include/Guid/XenInfo.h +++ b/OvmfPkg/Include/Guid/XenInfo.h @@ -25,6 +25,10 @@ typedef struct { /// Hypervisor minor version.=0D ///=0D UINT16 VersionMinor;=0D + ///=0D + /// Pointer to the RSDP found in the hvm_start_info provided to a PVH gu= est=0D + ///=0D + VOID *RsdpPvh;=0D } EFI_XEN_INFO;=0D =0D extern EFI_GUID gEfiXenInfoGuid;=0D diff --git a/OvmfPkg/Include/IndustryStandard/Xen/arch-x86/hvm/start_info.h= b/OvmfPkg/Include/IndustryStandard/Xen/arch-x86/hvm/start_info.h new file mode 100644 index 0000000000..15708d6dd5 --- /dev/null +++ b/OvmfPkg/Include/IndustryStandard/Xen/arch-x86/hvm/start_info.h @@ -0,0 +1,143 @@ +/*=0D + * SPDX-License-Identifier: MIT=0D + *=0D + * Copyright (c) 2016, Citrix Systems, Inc.=0D + */=0D +=0D +#ifndef __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__=0D +#define __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__=0D +=0D +/*=0D + * Start of day structure passed to PVH guests and to HVM guests in %ebx.= =0D + *=0D + * NOTE: nothing will be loaded at physical address 0, so a 0 value in any= =0D + * of the address fields should be treated as not present.=0D + *=0D + * 0 +----------------+=0D + * | magic | Contains the magic value XEN_HVM_START_MAGIC_VALU= E=0D + * | | ("xEn3" with the 0x80 bit of the "E" set).=0D + * 4 +----------------+=0D + * | version | Version of this structure. Current version is 1. = New=0D + * | | versions are guaranteed to be backwards-compatibl= e.=0D + * 8 +----------------+=0D + * | flags | SIF_xxx flags.=0D + * 12 +----------------+=0D + * | nr_modules | Number of modules passed to the kernel.=0D + * 16 +----------------+=0D + * | modlist_paddr | Physical address of an array of modules=0D + * | | (layout of the structure below).=0D + * 24 +----------------+=0D + * | cmdline_paddr | Physical address of the command line,=0D + * | | a zero-terminated ASCII string.=0D + * 32 +----------------+=0D + * | rsdp_paddr | Physical address of the RSDP ACPI data structure.= =0D + * 40 +----------------+=0D + * | memmap_paddr | Physical address of the (optional) memory map. On= ly=0D + * | | present in version 1 and newer of the structure.= =0D + * 48 +----------------+=0D + * | memmap_entries | Number of entries in the memory map table. Zero=0D + * | | if there is no memory map being provided. Only=0D + * | | present in version 1 and newer of the structure.= =0D + * 52 +----------------+=0D + * | reserved | Version 1 and newer only.=0D + * 56 +----------------+=0D + *=0D + * The layout of each entry in the module structure is the following:=0D + *=0D + * 0 +----------------+=0D + * | paddr | Physical address of the module.=0D + * 8 +----------------+=0D + * | size | Size of the module in bytes.=0D + * 16 +----------------+=0D + * | cmdline_paddr | Physical address of the command line,=0D + * | | a zero-terminated ASCII string.=0D + * 24 +----------------+=0D + * | reserved |=0D + * 32 +----------------+=0D + *=0D + * The layout of each entry in the memory map table is as follows:=0D + *=0D + * 0 +----------------+=0D + * | addr | Base address=0D + * 8 +----------------+=0D + * | size | Size of mapping in bytes=0D + * 16 +----------------+=0D + * | type | Type of mapping as defined between the hypervisor= =0D + * | | and guest. See XEN_HVM_MEMMAP_TYPE_* values below= .=0D + * 20 +----------------|=0D + * | reserved |=0D + * 24 +----------------+=0D + *=0D + * The address and sizes are always a 64bit little endian unsigned integer= .=0D + *=0D + * NB: Xen on x86 will always try to place all the data below the 4GiB=0D + * boundary.=0D + *=0D + * Version numbers of the hvm_start_info structure have evolved like this:= =0D + *=0D + * Version 0: Initial implementation.=0D + *=0D + * Version 1: Added the memmap_paddr/memmap_entries fields (plus 4 bytes = of=0D + * padding) to the end of the hvm_start_info struct. These new= =0D + * fields can be used to pass a memory map to the guest. The=0D + * memory map is optional and so guests that understand versio= n 1=0D + * of the structure must check that memmap_entries is non-zero= =0D + * before trying to read the memory map.=0D + */=0D +#define XEN_HVM_START_MAGIC_VALUE 0x336ec578=0D +=0D +/*=0D + * The values used in the type field of the memory map table entries are=0D + * defined below and match the Address Range Types as defined in the "Syst= em=0D + * Address Map Interfaces" section of the ACPI Specification. Please refer= to=0D + * section 15 in version 6.2 of the ACPI spec: http://uefi.org/specificati= ons=0D + */=0D +#define XEN_HVM_MEMMAP_TYPE_RAM 1=0D +#define XEN_HVM_MEMMAP_TYPE_RESERVED 2=0D +#define XEN_HVM_MEMMAP_TYPE_ACPI 3=0D +#define XEN_HVM_MEMMAP_TYPE_NVS 4=0D +#define XEN_HVM_MEMMAP_TYPE_UNUSABLE 5=0D +#define XEN_HVM_MEMMAP_TYPE_DISABLED 6=0D +#define XEN_HVM_MEMMAP_TYPE_PMEM 7=0D +=0D +/*=0D + * C representation of the x86/HVM start info layout.=0D + *=0D + * The canonical definition of this layout is above, this is just a way to= =0D + * represent the layout described there using C types.=0D + */=0D +struct hvm_start_info {=0D + UINT32 magic; /* Contains the magic value 0x336ec578 = */=0D + /* ("xEn3" with the 0x80 bit of the "E" set)= .*/=0D + UINT32 version; /* Version of this structure. = */=0D + UINT32 flags; /* SIF_xxx flags. = */=0D + UINT32 nr_modules; /* Number of modules passed to the kernel. = */=0D + UINT64 modlist_paddr; /* Physical address of an array of = */=0D + /* hvm_modlist_entry. = */=0D + UINT64 cmdline_paddr; /* Physical address of the command line. = */=0D + UINT64 rsdp_paddr; /* Physical address of the RSDP ACPI data = */=0D + /* structure. = */=0D + /* All following fields only present in version 1 and newer */=0D + UINT64 memmap_paddr; /* Physical address of an array of = */=0D + /* hvm_memmap_table_entry. = */=0D + UINT32 memmap_entries; /* Number of entries in the memmap table. = */=0D + /* Value will be zero if there is no memory = */=0D + /* map being provided. = */=0D + UINT32 reserved; /* Must be zero. = */=0D +};=0D +=0D +struct hvm_modlist_entry {=0D + UINT64 paddr; /* Physical address of the module. = */=0D + UINT64 size; /* Size of the module in bytes. = */=0D + UINT64 cmdline_paddr; /* Physical address of the command line. = */=0D + UINT64 reserved;=0D +};=0D +=0D +struct hvm_memmap_table_entry {=0D + UINT64 addr; /* Base address of the memory region = */=0D + UINT64 size; /* Size of the memory region in bytes = */=0D + UINT32 type; /* Mapping type = */=0D + UINT32 reserved; /* Must be zero for Version 1. = */=0D +};=0D +=0D +#endif /* __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ */=0D diff --git a/OvmfPkg/XenPlatformPei/Xen.c b/OvmfPkg/XenPlatformPei/Xen.c index 9c2ff6324d..c5293498c4 100644 --- a/OvmfPkg/XenPlatformPei/Xen.c +++ b/OvmfPkg/XenPlatformPei/Xen.c @@ -25,6 +25,7 @@ #include =0D #include =0D #include =0D +#include =0D =0D #include "Platform.h"=0D #include "Xen.h"=0D @@ -86,6 +87,7 @@ XenConnect ( UINT32 XenVersion;=0D EFI_XEN_OVMF_INFO *Info;=0D CHAR8 Sig[sizeof (Info->Signature) + 1];=0D + UINT32 *PVHResetVectorData;=0D =0D AsmCpuid (XenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL);=0D mXenInfo.HyperPages =3D AllocatePages (TransferPages);=0D @@ -121,6 +123,29 @@ XenConnect ( mXenHvmloaderInfo =3D NULL;=0D }=0D =0D + mXenInfo.RsdpPvh =3D NULL;=0D +=0D + //=0D + // Locate and use information from the start of day structure if we have= =0D + // booted via the PVH entry point.=0D + //=0D +=0D + PVHResetVectorData =3D (VOID *)(UINTN) PcdGet32 (PcdXenPvhStartOfDayStru= ctPtr);=0D + //=0D + // That magic value is written in XenResetVector/Ia32/XenPVHMain.asm=0D + //=0D + if (PVHResetVectorData[1] =3D=3D SIGNATURE_32 ('X', 'P', 'V', 'H')) {=0D + struct hvm_start_info *HVMStartInfo;=0D +=0D + HVMStartInfo =3D (VOID *)(UINTN) PVHResetVectorData[0];=0D + if (HVMStartInfo->magic =3D=3D XEN_HVM_START_MAGIC_VALUE) {=0D + ASSERT (HVMStartInfo->rsdp_paddr !=3D 0);=0D + if (HVMStartInfo->rsdp_paddr !=3D 0) {=0D + mXenInfo.RsdpPvh =3D (VOID *)(UINTN)HVMStartInfo->rsdp_paddr;=0D + }=0D + }=0D + }=0D +=0D BuildGuidDataHob (=0D &gEfiXenInfoGuid,=0D &mXenInfo,=0D --=20 Anthony PERARD