From patchwork Mon Apr 12 13:30:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anthony PERARD X-Patchwork-Id: 12198061 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,MIME_BASE64_TEXT, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 852B1C43460 for ; Mon, 12 Apr 2021 13:30:40 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 236856128B for ; Mon, 12 Apr 2021 13:30:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 236856128B Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=citrix.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from list by lists.xenproject.org with outflank-mailman.109096.208251 (Exim 4.92) (envelope-from ) id 1lVwe8-0000Oa-Mw; Mon, 12 Apr 2021 13:30:32 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 109096.208251; Mon, 12 Apr 2021 13:30:32 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lVwe8-0000OQ-J6; Mon, 12 Apr 2021 13:30:32 +0000 Received: by outflank-mailman (input) for mailman id 109096; Mon, 12 Apr 2021 13:30:31 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lVwe7-0000NV-GV for xen-devel@lists.xenproject.org; Mon, 12 Apr 2021 13:30:31 +0000 Received: from esa3.hc3370-68.iphmx.com (unknown [216.71.145.155]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 5449de6b-e8eb-4398-b0dd-88c3ad11d798; Mon, 12 Apr 2021 13:30:30 +0000 (UTC) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 5449de6b-e8eb-4398-b0dd-88c3ad11d798 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1618234230; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=zMzNWKkCTd/1v9yO4IdYIcsvsu7LkKwTU6SVpgzD9RU=; b=TZLKcseCoJIiRnGdxKo0oEctjNYtwKoUQCylpaXNGRRDhsShbMhK6xbR GJmLiO2Dsi3qcMjZc0mBQTj5QwOM79dHV2xanPJHdg0BENvlVeGJ5tNky d7TATI93j4+WCDYR1WiQhqfLMMOMKEJeA5FQGmSCoEjOXkarHRemUHFBU U=; Authentication-Results: esa3.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none IronPort-SDR: eD5DP9vxX5LQTSW+pf1qVlZgnbM6gRRuaio//9qwrItnEKV68A8ZcLcvC5boINz5vmXgjTPGOk K3omFMAfS0ziUZuEhUBaYI5Nds6E0r4plhu8pymO6ybsq7z6Rmbtv6BsExDOaXq55lmoRajYbs aATopE26j53ScX3WC6KuNNoC2KNqo1PT+DLUAvWRndQgQuZoWD+Hbe0v+hAgqwHqafe0ciWMqd u/yrYxa9CLsFfAjGZF2AWwUniHtJ4BpnySQQC5J6RXUC12VIYSa5cRqJlgZFhQhcwcbbO+bCJd ++U= X-SBRS: 4.0 X-MesageID: 41388428 X-Ironport-Server: esa3.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED IronPort-HdrOrdr: A9a23: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 ftGQc= X-IronPort-AV: E=Sophos;i="5.82,216,1613451600"; d="scan'208";a="41388428" From: Anthony PERARD To: CC: Laszlo Ersek , Jordan Justen , Ard Biesheuvel , , Anthony PERARD , Julien Grall Subject: [PATCH v3 5/7] OvmfPkg/XenPlatformPei: Map extra physical address Date: Mon, 12 Apr 2021 14:30:01 +0100 Message-ID: <20210412133003.146438-6-anthony.perard@citrix.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210412133003.146438-1-anthony.perard@citrix.com> References: <20210412133003.146438-1-anthony.perard@citrix.com> MIME-Version: 1.0 Some information available in a Xen guest can be mapped anywhere in the physical address space and they don't need to be backed by RAM. For example, the shared info page. While it's easier to put those pages anywhere, it is better to avoid mapping it where the RAM is. It might split a nice 1G guest page table into 4k pages and thus reducing performance of the guest when it accesses its memory. Also mapping a page like the shared info page and then unmapping it or mapping it somewhere else would leave a hole in the RAM that the guest would propably not be able to use anymore. So the patch introduces a new function which can be used to 1:1 mapping of guest physical memory above 4G during the PEI phase so we can map the Xen shared pages outside of memory that can be used by guest, and as high as possible. Signed-off-by: Anthony PERARD Acked-by: Laszlo Ersek --- Notes: v3: - fix typos v2: - new patch OvmfPkg/XenPlatformPei/XenPlatformPei.inf | 1 + OvmfPkg/XenPlatformPei/Platform.h | 5 ++ OvmfPkg/XenPlatformPei/Xen.c | 71 +++++++++++++++++++++++ 3 files changed, 77 insertions(+) diff --git a/OvmfPkg/XenPlatformPei/XenPlatformPei.inf b/OvmfPkg/XenPlatformPei/XenPlatformPei.inf index 0ef77db92c03..8790d907d3ec 100644 --- a/OvmfPkg/XenPlatformPei/XenPlatformPei.inf +++ b/OvmfPkg/XenPlatformPei/XenPlatformPei.inf @@ -66,6 +66,7 @@ [Pcd] gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId diff --git a/OvmfPkg/XenPlatformPei/Platform.h b/OvmfPkg/XenPlatformPei/Platform.h index 7661f4a8de0a..e70ca58078eb 100644 --- a/OvmfPkg/XenPlatformPei/Platform.h +++ b/OvmfPkg/XenPlatformPei/Platform.h @@ -127,6 +127,11 @@ XenGetE820Map ( UINT32 *Count ); +EFI_STATUS +PhysicalAddressIdentityMapping ( + IN EFI_PHYSICAL_ADDRESS AddressToMap + ); + extern EFI_BOOT_MODE mBootMode; extern UINT8 mPhysMemAddressWidth; diff --git a/OvmfPkg/XenPlatformPei/Xen.c b/OvmfPkg/XenPlatformPei/Xen.c index c41fecdc486e..b2a7d1c21dac 100644 --- a/OvmfPkg/XenPlatformPei/Xen.c +++ b/OvmfPkg/XenPlatformPei/Xen.c @@ -17,6 +17,8 @@ // // The Library classes this module consumes // +#include +#include #include #include #include @@ -25,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -386,3 +389,71 @@ InitializeXen ( return EFI_SUCCESS; } + +EFI_STATUS +PhysicalAddressIdentityMapping ( + IN EFI_PHYSICAL_ADDRESS AddressToMap + ) +{ + INTN Index; + PAGE_MAP_AND_DIRECTORY_POINTER *L4, *L3; + PAGE_TABLE_ENTRY *PageTable; + + DEBUG ((DEBUG_INFO, "Mapping 1:1 of address 0x%lx\n", (UINT64)AddressToMap)); + + // L4 / Top level Page Directory Pointers + + L4 = (VOID*)(UINTN)PcdGet32 (PcdOvmfSecPageTablesBase); + Index = PML4_OFFSET (AddressToMap); + + if (!L4[Index].Bits.Present) { + L3 = AllocatePages (1); + if (L3 == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + ZeroMem (L3, EFI_PAGE_SIZE); + + L4[Index].Bits.ReadWrite = 1; + L4[Index].Bits.Accessed = 1; + L4[Index].Bits.PageTableBaseAddress = (EFI_PHYSICAL_ADDRESS)L3 >> 12; + L4[Index].Bits.Present = 1; + } + + // L3 / Next level Page Directory Pointers + + L3 = (VOID*)(EFI_PHYSICAL_ADDRESS)(L4[Index].Bits.PageTableBaseAddress << 12); + Index = PDP_OFFSET (AddressToMap); + + if (!L3[Index].Bits.Present) { + PageTable = AllocatePages (1); + if (PageTable == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + ZeroMem (PageTable, EFI_PAGE_SIZE); + + L3[Index].Bits.ReadWrite = 1; + L3[Index].Bits.Accessed = 1; + L3[Index].Bits.PageTableBaseAddress = (EFI_PHYSICAL_ADDRESS)PageTable >> 12; + L3[Index].Bits.Present = 1; + } + + // L2 / Page Table Entries + + PageTable = (VOID*)(EFI_PHYSICAL_ADDRESS)(L3[Index].Bits.PageTableBaseAddress << 12); + Index = PDE_OFFSET (AddressToMap); + + if (!PageTable[Index].Bits.Present) { + PageTable[Index].Bits.ReadWrite = 1; + PageTable[Index].Bits.Accessed = 1; + PageTable[Index].Bits.Dirty = 1; + PageTable[Index].Bits.MustBe1 = 1; + PageTable[Index].Bits.PageTableBaseAddress = AddressToMap >> 21; + PageTable[Index].Bits.Present = 1; + } + + CpuFlushTlb (); + + return EFI_SUCCESS; +}