From nobody Thu Nov 14 16:53:43 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+45548+1787277+3901457@groups.io ARC-Seal: i=1; a=rsa-sha256; t=1565697488; cv=none; d=zoho.com; s=zohoarc; b=Gcg6Hz9iOGCVFtF+37v70+nJQ5joYPXSaYE/tEU1djhV1dPW7ixekeCOcNOm8Lj6D7ca2DW692h/Vaor1hRMvh7jy8/JLbzNVwKk0HrqM+MvJw1KN1ekuNcs1AOdqLujJ/32KeSNZHG6nrmzlDbbsA9it2pIOvHJgGfUoxG/pI0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565697488; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To:ARC-Authentication-Results; bh=I29oy2s2n4LpkukeM2YGPzxh4hofnhqhv5jRtmRiJO8=; b=c0gaztDn5JCjlafsMaWfn5JVHeheFf+9HbVXUJv2qhOPOB5GYRINaZYi3PDrp+V1B79WjfuzwkfCPVc2Ob7Nhvwwh4YUJ1ZASieMhCjNPiIXWVu3inNWfSup24GqGbEOYDvguOpPGM7cv8aiQFoEZNpcAOAw6J7qCkLK6SLVQ+I= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+45548+1787277+3901457@groups.io Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1565697488346165.93173564059987; Tue, 13 Aug 2019 04:58:08 -0700 (PDT) Return-Path: X-Received: from esa4.hc3370-68.iphmx.com (esa4.hc3370-68.iphmx.com []) by groups.io with SMTP; Tue, 13 Aug 2019 04:58:07 -0700 Received-SPF: pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+45548+1787277+3901457@groups.io; helo=web01.groups.io; 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: WqMj+zgq/5le8z3OmpMjmPWjUb8JfU//taGgZ5Z/aIDlegMjoX5HBCMrfYg6epy6cOXk+JMLLM T2C47ehG221kSO9iDpKHrsZmpRi/I9H+mzcz4w6XAkZ8PBVgGDG6ITvcIfso+pGEbsZmYNt/nj BftT9ODY8vnSe+Xdb2wxkazhwubc7FK966teTJ+VJGlbR7AEhoE1YqruX4RteNmZNPJd/x1cY2 D/ST34Wh5ZAnfputjoT01xhuX51aWrxlcwSeuldQkmJlrHoLNrMnNqdzp7M1Rm8Eey58+kbhJY oKA= X-SBRS: 2.7 X-MesageID: 4402030 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.64,381,1559534400"; d="scan'208";a="4402030" From: "Anthony PERARD" To: CC: Laszlo Ersek , Jordan Justen , Julien Grall , , Ard Biesheuvel , Anthony PERARD Subject: [edk2-devel] [PATCH v5 12/35] OvmfPkg/XenPlatformPei: Grab RSDP from PVH guest start of day struct Date: Tue, 13 Aug 2019 12:30:56 +0100 Message-ID: <20190813113119.14804-13-anthony.perard@citrix.com> In-Reply-To: <20190813113119.14804-1-anthony.perard@citrix.com> References: <20190813113119.14804-1-anthony.perard@citrix.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,anthony.perard@citrix.com Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1565697487; bh=I29oy2s2n4LpkukeM2YGPzxh4hofnhqhv5jRtmRiJO8=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=glm065rXmukVp6MM32ZBj76g8PxrXY7dKgQdfczZZLutceg/p5hav+DiWBbA5FiyxX+ YZlQ6fhV7PiBcG9YnsBj4W8IFAtfcgfsqoKTrRo32vbgKcQVn4X7KDXvd5AVDxjr/cTXn 1TNzBpcpTBSBlI6iLMHrTt40HDQyaekpMAM= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" 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 gUefiCpuPkgTokenSpaceGuid.PcdCpuLocalApicBaseAddress =20 + gUefiOvmfPkgTokenSpaceGuid.PcdXenPvhStartOfDayStructPtr + gUefiOvmfPkgTokenSpaceGuid.PcdXenPvhStartOfDayStructPtrSize + [FixedPcd] gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress =20 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. /// UINT16 VersionMinor; + /// + /// Pointer to the RSDP found in the hvm_start_info provided to a PVH gu= est + /// + VOID *RsdpPvh; } EFI_XEN_INFO; =20 extern EFI_GUID gEfiXenInfoGuid; 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 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (c) 2016, Citrix Systems, Inc. + */ + +#ifndef __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ +#define __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ + +/* + * Start of day structure passed to PVH guests and to HVM guests in %ebx. + * + * NOTE: nothing will be loaded at physical address 0, so a 0 value in any + * of the address fields should be treated as not present. + * + * 0 +----------------+ + * | magic | Contains the magic value XEN_HVM_START_MAGIC_VALUE + * | | ("xEn3" with the 0x80 bit of the "E" set). + * 4 +----------------+ + * | version | Version of this structure. Current version is 1. = New + * | | versions are guaranteed to be backwards-compatibl= e. + * 8 +----------------+ + * | flags | SIF_xxx flags. + * 12 +----------------+ + * | nr_modules | Number of modules passed to the kernel. + * 16 +----------------+ + * | modlist_paddr | Physical address of an array of modules + * | | (layout of the structure below). + * 24 +----------------+ + * | cmdline_paddr | Physical address of the command line, + * | | a zero-terminated ASCII string. + * 32 +----------------+ + * | rsdp_paddr | Physical address of the RSDP ACPI data structure. + * 40 +----------------+ + * | memmap_paddr | Physical address of the (optional) memory map. On= ly + * | | present in version 1 and newer of the structure. + * 48 +----------------+ + * | memmap_entries | Number of entries in the memory map table. Zero + * | | if there is no memory map being provided. Only + * | | present in version 1 and newer of the structure. + * 52 +----------------+ + * | reserved | Version 1 and newer only. + * 56 +----------------+ + * + * The layout of each entry in the module structure is the following: + * + * 0 +----------------+ + * | paddr | Physical address of the module. + * 8 +----------------+ + * | size | Size of the module in bytes. + * 16 +----------------+ + * | cmdline_paddr | Physical address of the command line, + * | | a zero-terminated ASCII string. + * 24 +----------------+ + * | reserved | + * 32 +----------------+ + * + * The layout of each entry in the memory map table is as follows: + * + * 0 +----------------+ + * | addr | Base address + * 8 +----------------+ + * | size | Size of mapping in bytes + * 16 +----------------+ + * | type | Type of mapping as defined between the hypervisor + * | | and guest. See XEN_HVM_MEMMAP_TYPE_* values below. + * 20 +----------------| + * | reserved | + * 24 +----------------+ + * + * The address and sizes are always a 64bit little endian unsigned integer. + * + * NB: Xen on x86 will always try to place all the data below the 4GiB + * boundary. + * + * Version numbers of the hvm_start_info structure have evolved like this: + * + * Version 0: Initial implementation. + * + * Version 1: Added the memmap_paddr/memmap_entries fields (plus 4 bytes = of + * padding) to the end of the hvm_start_info struct. These new + * fields can be used to pass a memory map to the guest. The + * memory map is optional and so guests that understand versio= n 1 + * of the structure must check that memmap_entries is non-zero + * before trying to read the memory map. + */ +#define XEN_HVM_START_MAGIC_VALUE 0x336ec578 + +/* + * The values used in the type field of the memory map table entries are + * defined below and match the Address Range Types as defined in the "Syst= em + * Address Map Interfaces" section of the ACPI Specification. Please refer= to + * section 15 in version 6.2 of the ACPI spec: http://uefi.org/specificati= ons + */ +#define XEN_HVM_MEMMAP_TYPE_RAM 1 +#define XEN_HVM_MEMMAP_TYPE_RESERVED 2 +#define XEN_HVM_MEMMAP_TYPE_ACPI 3 +#define XEN_HVM_MEMMAP_TYPE_NVS 4 +#define XEN_HVM_MEMMAP_TYPE_UNUSABLE 5 +#define XEN_HVM_MEMMAP_TYPE_DISABLED 6 +#define XEN_HVM_MEMMAP_TYPE_PMEM 7 + +/* + * C representation of the x86/HVM start info layout. + * + * The canonical definition of this layout is above, this is just a way to + * represent the layout described there using C types. + */ +struct hvm_start_info { + UINT32 magic; /* Contains the magic value 0x336ec578 = */ + /* ("xEn3" with the 0x80 bit of the "E" set)= .*/ + UINT32 version; /* Version of this structure. = */ + UINT32 flags; /* SIF_xxx flags. = */ + UINT32 nr_modules; /* Number of modules passed to the kernel. = */ + UINT64 modlist_paddr; /* Physical address of an array of = */ + /* hvm_modlist_entry. = */ + UINT64 cmdline_paddr; /* Physical address of the command line. = */ + UINT64 rsdp_paddr; /* Physical address of the RSDP ACPI data = */ + /* structure. = */ + /* All following fields only present in version 1 and newer */ + UINT64 memmap_paddr; /* Physical address of an array of = */ + /* hvm_memmap_table_entry. = */ + UINT32 memmap_entries; /* Number of entries in the memmap table. = */ + /* Value will be zero if there is no memory = */ + /* map being provided. = */ + UINT32 reserved; /* Must be zero. = */ +}; + +struct hvm_modlist_entry { + UINT64 paddr; /* Physical address of the module. = */ + UINT64 size; /* Size of the module in bytes. = */ + UINT64 cmdline_paddr; /* Physical address of the command line. = */ + UINT64 reserved; +}; + +struct hvm_memmap_table_entry { + UINT64 addr; /* Base address of the memory region = */ + UINT64 size; /* Size of the memory region in bytes = */ + UINT32 type; /* Mapping type = */ + UINT32 reserved; /* Must be zero for Version 1. = */ +}; + +#endif /* __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ */ diff --git a/OvmfPkg/XenPlatformPei/Xen.c b/OvmfPkg/XenPlatformPei/Xen.c index 5c7d7ddc1c..b366139a0a 100644 --- a/OvmfPkg/XenPlatformPei/Xen.c +++ b/OvmfPkg/XenPlatformPei/Xen.c @@ -25,6 +25,7 @@ #include #include #include +#include =20 #include "Platform.h" #include "Xen.h" @@ -86,6 +87,7 @@ XenConnect ( UINT32 XenVersion; EFI_XEN_OVMF_INFO *Info; CHAR8 Sig[sizeof (Info->Signature) + 1]; + UINT32 *PVHResetVectorData; =20 AsmCpuid (XenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL); mXenInfo.HyperPages =3D AllocatePages (TransferPages); @@ -121,6 +123,29 @@ XenConnect ( mXenHvmloaderInfo =3D NULL; } =20 + mXenInfo.RsdpPvh =3D NULL; + + // + // Locate and use information from the start of day structure if we have + // booted via the PVH entry point. + // + + PVHResetVectorData =3D (VOID *)(UINTN) PcdGet32 (PcdXenPvhStartOfDayStru= ctPtr); + // + // That magic value is written in XenResetVector/Ia32/XenPVHMain.asm + // + if (PVHResetVectorData[1] =3D=3D SIGNATURE_32 ('X', 'P', 'V', 'H')) { + struct hvm_start_info *HVMStartInfo; + + HVMStartInfo =3D (VOID *)(UINTN) PVHResetVectorData[0]; + if (HVMStartInfo->magic =3D=3D XEN_HVM_START_MAGIC_VALUE) { + ASSERT (HVMStartInfo->rsdp_paddr !=3D 0); + if (HVMStartInfo->rsdp_paddr !=3D 0) { + mXenInfo.RsdpPvh =3D (VOID *)(UINTN)HVMStartInfo->rsdp_paddr; + } + } + } + BuildGuidDataHob ( &gEfiXenInfoGuid, &mXenInfo, --=20 Anthony PERARD -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#45548): https://edk2.groups.io/g/devel/message/45548 Mute This Topic: https://groups.io/mt/32851696/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-