From patchwork Mon Apr 12 13:30:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anthony PERARD X-Patchwork-Id: 12198059 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 2AB9BC43603 for ; Mon, 12 Apr 2021 13:30:36 +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 C24EA61288 for ; Mon, 12 Apr 2021 13:30:35 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C24EA61288 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.109095.208239 (Exim 4.92) (envelope-from ) id 1lVwe2-0000GT-9r; Mon, 12 Apr 2021 13:30:26 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 109095.208239; Mon, 12 Apr 2021 13:30:26 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lVwe2-0000GJ-5e; Mon, 12 Apr 2021 13:30:26 +0000 Received: by outflank-mailman (input) for mailman id 109095; Mon, 12 Apr 2021 13:30:24 +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 1lVwe0-0008Sj-Is for xen-devel@lists.xenproject.org; Mon, 12 Apr 2021 13:30:24 +0000 Received: from esa2.hc3370-68.iphmx.com (unknown [216.71.145.153]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id c14a59cc-827f-4aac-8fe2-57a6714767b0; Mon, 12 Apr 2021 13:30:13 +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: c14a59cc-827f-4aac-8fe2-57a6714767b0 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1618234213; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ZZM3fS71ShAReSW7BNCtBbZWlZnitQ89Vlw8cWIKfw8=; b=CzG9jVBIAbrODxrnBUKTPCDJ4n1lE7WOtuGxnVBvpsXex/oNZL1xEnI4 ImhqEEW6qkxUq/9IUom7kPFJMuuAkT2FxBegC2Qx8mOdA5hnrtkwkRzTg 1Wg3LgeQJN44kewMk0TwNPsiagUvBELzv5XigupYbeEKn9pbJPSaxLLVy s=; Authentication-Results: esa2.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none IronPort-SDR: 1BoSdeXa3S22D9Cvx4+drs0G7AicQ5+ydatqOtWc959YtjL0oce7YNPcQ5LY3HE7IAZXHToRz7 RTVzYUHK8izZpK0iCpuAZyfdbMWVfklKphyTitpdmPfcsHIsc5I6r1Uie3jQb3HVvL8967UA3y xQAzlspcdn3SUxDciUoTBw7MAP+7c38o6chs3ZdwHpY+QptnpaTC+MtDsBtsVXpA5RuDLpvgS0 s/OuQemP8hsaXvo63AHOkIDeQVvpbWQGJQLRt9wbYuzmAKEhbo44lWgyRqpdjFDQGP+MU5cAyn Uz0= X-SBRS: 4.0 X-MesageID: 41386147 X-Ironport-Server: esa2.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED IronPort-HdrOrdr: A9a23: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 X-IronPort-AV: E=Sophos;i="5.82,216,1613451600"; d="scan'208";a="41386147" From: Anthony PERARD To: CC: Laszlo Ersek , Jordan Justen , Ard Biesheuvel , , Anthony PERARD , Julien Grall , Brijesh Singh , "Tom Lendacky" Subject: [PATCH v3 4/7] OvmfPkg/IndustryStandard: Introduce PageTable.h Date: Mon, 12 Apr 2021 14:30:00 +0100 Message-ID: <20210412133003.146438-5-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 We are going to use the page table structure in yet another place, collect the types and macro that can be used from another module rather than making yet another copy. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2490 Signed-off-by: Anthony PERARD Acked-by: Tom Lendacky Reviewed-by: Laszlo Ersek --- Notes: CC: Brijesh Singh v3: - fix typos and coding style v2: - new patch .../IndustryStandard/PageTable.h} | 117 +------------- .../BaseMemEncryptSevLib/X64/VirtualMemory.h | 143 +----------------- 2 files changed, 5 insertions(+), 255 deletions(-) copy OvmfPkg/{Library/BaseMemEncryptSevLib/X64/VirtualMemory.h => Include/IndustryStandard/PageTable.h} (60%) diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h b/OvmfPkg/Include/IndustryStandard/PageTable.h similarity index 60% copy from OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h copy to OvmfPkg/Include/IndustryStandard/PageTable.h index 996f94f07ebb..5e797eeea8ef 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h +++ b/OvmfPkg/Include/IndustryStandard/PageTable.h @@ -1,6 +1,6 @@ /** @file - Virtual Memory Management Services to set or clear the memory encryption bit + x86_64 Page Tables structures Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
Copyright (c) 2017 - 2020, AMD Incorporated. All rights reserved.
@@ -11,17 +11,10 @@ **/ -#ifndef __VIRTUAL_MEMORY__ -#define __VIRTUAL_MEMORY__ +#ifndef PAGE_TABLE_H_ +#define PAGE_TABLE_H_ -#include -#include -#include -#include -#include -#include - -#define SYS_CODE64_SEL 0x38 +#include #pragma pack(1) @@ -165,106 +158,4 @@ typedef union { #define PTE_OFFSET(x) ( (x >> 12) & PAGETABLE_ENTRY_MASK) #define PAGING_1G_ADDRESS_MASK_64 0x000FFFFFC0000000ull -#define PAGE_TABLE_POOL_ALIGNMENT BASE_2MB -#define PAGE_TABLE_POOL_UNIT_SIZE SIZE_2MB -#define PAGE_TABLE_POOL_UNIT_PAGES \ - EFI_SIZE_TO_PAGES (PAGE_TABLE_POOL_UNIT_SIZE) -#define PAGE_TABLE_POOL_ALIGN_MASK \ - (~(EFI_PHYSICAL_ADDRESS)(PAGE_TABLE_POOL_ALIGNMENT - 1)) - -typedef struct { - VOID *NextPool; - UINTN Offset; - UINTN FreePages; -} PAGE_TABLE_POOL; - -/** - Return the pagetable memory encryption mask. - - @return The pagetable memory encryption mask. - -**/ -UINT64 -EFIAPI -InternalGetMemEncryptionAddressMask ( - VOID - ); - -/** - This function clears memory encryption bit for the memory region specified by - PhysicalAddress and Length from the current page table context. - - @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use - current CR3) - @param[in] PhysicalAddress The physical address that is the start - address of a memory region. - @param[in] Length The length of memory region - @param[in] Flush Flush the caches before applying the - encryption mask - - @retval RETURN_SUCCESS The attributes were cleared for the - memory region. - @retval RETURN_INVALID_PARAMETER Number of pages is zero. - @retval RETURN_UNSUPPORTED Clearing the memory encyrption attribute - is not supported -**/ -RETURN_STATUS -EFIAPI -InternalMemEncryptSevSetMemoryDecrypted ( - IN PHYSICAL_ADDRESS Cr3BaseAddress, - IN PHYSICAL_ADDRESS PhysicalAddress, - IN UINTN Length, - IN BOOLEAN Flush - ); - -/** - This function sets memory encryption bit for the memory region specified by - PhysicalAddress and Length from the current page table context. - - @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use - current CR3) - @param[in] PhysicalAddress The physical address that is the start - address of a memory region. - @param[in] Length The length of memory region - @param[in] Flush Flush the caches before applying the - encryption mask - - @retval RETURN_SUCCESS The attributes were set for the memory - region. - @retval RETURN_INVALID_PARAMETER Number of pages is zero. - @retval RETURN_UNSUPPORTED Setting the memory encyrption attribute - is not supported -**/ -RETURN_STATUS -EFIAPI -InternalMemEncryptSevSetMemoryEncrypted ( - IN PHYSICAL_ADDRESS Cr3BaseAddress, - IN PHYSICAL_ADDRESS PhysicalAddress, - IN UINTN Length, - IN BOOLEAN Flush - ); - -/** - Returns the encryption state of the specified virtual address range. - - @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use - current CR3) - @param[in] BaseAddress Base address to check - @param[in] Length Length of virtual address range - - @retval MemEncryptSevAddressRangeUnencrypted Address range is mapped - unencrypted - @retval MemEncryptSevAddressRangeEncrypted Address range is mapped - encrypted - @retval MemEncryptSevAddressRangeMixed Address range is mapped mixed - @retval MemEncryptSevAddressRangeError Address range is not mapped -**/ -MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE -EFIAPI -InternalMemEncryptSevGetAddressRangeState ( - IN PHYSICAL_ADDRESS Cr3BaseAddress, - IN PHYSICAL_ADDRESS BaseAddress, - IN UINTN Length - ); - #endif diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h index 996f94f07ebb..fe2a0b2826cd 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h @@ -14,6 +14,7 @@ #ifndef __VIRTUAL_MEMORY__ #define __VIRTUAL_MEMORY__ +#include #include #include #include @@ -23,148 +24,6 @@ #define SYS_CODE64_SEL 0x38 -#pragma pack(1) - -// -// Page-Map Level-4 Offset (PML4) and -// Page-Directory-Pointer Offset (PDPE) entries 4K & 2MB -// - -typedef union { - struct { - UINT64 Present:1; // 0 = Not present in memory, - // 1 = Present in memory - UINT64 ReadWrite:1; // 0 = Read-Only, 1= Read/Write - UINT64 UserSupervisor:1; // 0 = Supervisor, 1=User - UINT64 WriteThrough:1; // 0 = Write-Back caching, - // 1 = Write-Through caching - UINT64 CacheDisabled:1; // 0 = Cached, 1=Non-Cached - UINT64 Accessed:1; // 0 = Not accessed, - // 1 = Accessed (set by CPU) - UINT64 Reserved:1; // Reserved - UINT64 MustBeZero:2; // Must Be Zero - UINT64 Available:3; // Available for use by system software - UINT64 PageTableBaseAddress:40; // Page Table Base Address - UINT64 AvabilableHigh:11; // Available for use by system software - UINT64 Nx:1; // No Execute bit - } Bits; - UINT64 Uint64; -} PAGE_MAP_AND_DIRECTORY_POINTER; - -// -// Page Table Entry 4KB -// -typedef union { - struct { - UINT64 Present:1; // 0 = Not present in memory, - // 1 = Present in memory - UINT64 ReadWrite:1; // 0 = Read-Only, 1= Read/Write - UINT64 UserSupervisor:1; // 0 = Supervisor, 1=User - UINT64 WriteThrough:1; // 0 = Write-Back caching, - // 1 = Write-Through caching - UINT64 CacheDisabled:1; // 0 = Cached, 1=Non-Cached - UINT64 Accessed:1; // 0 = Not accessed, - // 1 = Accessed (set by CPU) - UINT64 Dirty:1; // 0 = Not Dirty, 1 = written by - // processor on access to page - UINT64 PAT:1; // - UINT64 Global:1; // 0 = Not global page, 1 = global page - // TLB not cleared on CR3 write - UINT64 Available:3; // Available for use by system software - UINT64 PageTableBaseAddress:40; // Page Table Base Address - UINT64 AvabilableHigh:11; // Available for use by system software - UINT64 Nx:1; // 0 = Execute Code, - // 1 = No Code Execution - } Bits; - UINT64 Uint64; -} PAGE_TABLE_4K_ENTRY; - -// -// Page Table Entry 2MB -// -typedef union { - struct { - UINT64 Present:1; // 0 = Not present in memory, - // 1 = Present in memory - UINT64 ReadWrite:1; // 0 = Read-Only, 1= Read/Write - UINT64 UserSupervisor:1; // 0 = Supervisor, 1=User - UINT64 WriteThrough:1; // 0 = Write-Back caching, - // 1=Write-Through caching - UINT64 CacheDisabled:1; // 0 = Cached, 1=Non-Cached - UINT64 Accessed:1; // 0 = Not accessed, - // 1 = Accessed (set by CPU) - UINT64 Dirty:1; // 0 = Not Dirty, 1 = written by - // processor on access to page - UINT64 MustBe1:1; // Must be 1 - UINT64 Global:1; // 0 = Not global page, 1 = global page - // TLB not cleared on CR3 write - UINT64 Available:3; // Available for use by system software - UINT64 PAT:1; // - UINT64 MustBeZero:8; // Must be zero; - UINT64 PageTableBaseAddress:31; // Page Table Base Address - UINT64 AvabilableHigh:11; // Available for use by system software - UINT64 Nx:1; // 0 = Execute Code, - // 1 = No Code Execution - } Bits; - UINT64 Uint64; -} PAGE_TABLE_ENTRY; - -// -// Page Table Entry 1GB -// -typedef union { - struct { - UINT64 Present:1; // 0 = Not present in memory, - // 1 = Present in memory - UINT64 ReadWrite:1; // 0 = Read-Only, 1= Read/Write - UINT64 UserSupervisor:1; // 0 = Supervisor, 1=User - UINT64 WriteThrough:1; // 0 = Write-Back caching, - // 1 = Write-Through caching - UINT64 CacheDisabled:1; // 0 = Cached, 1=Non-Cached - UINT64 Accessed:1; // 0 = Not accessed, - // 1 = Accessed (set by CPU) - UINT64 Dirty:1; // 0 = Not Dirty, 1 = written by - // processor on access to page - UINT64 MustBe1:1; // Must be 1 - UINT64 Global:1; // 0 = Not global page, 1 = global page - // TLB not cleared on CR3 write - UINT64 Available:3; // Available for use by system software - UINT64 PAT:1; // - UINT64 MustBeZero:17; // Must be zero; - UINT64 PageTableBaseAddress:22; // Page Table Base Address - UINT64 AvabilableHigh:11; // Available for use by system software - UINT64 Nx:1; // 0 = Execute Code, - // 1 = No Code Execution - } Bits; - UINT64 Uint64; -} PAGE_TABLE_1G_ENTRY; - -#pragma pack() - -#define IA32_PG_P BIT0 -#define IA32_PG_RW BIT1 -#define IA32_PG_PS BIT7 - -#define PAGING_PAE_INDEX_MASK 0x1FF - -#define PAGING_4K_ADDRESS_MASK_64 0x000FFFFFFFFFF000ull -#define PAGING_2M_ADDRESS_MASK_64 0x000FFFFFFFE00000ull -#define PAGING_1G_ADDRESS_MASK_64 0x000FFFFFC0000000ull - -#define PAGING_L1_ADDRESS_SHIFT 12 -#define PAGING_L2_ADDRESS_SHIFT 21 -#define PAGING_L3_ADDRESS_SHIFT 30 -#define PAGING_L4_ADDRESS_SHIFT 39 - -#define PAGING_PML4E_NUMBER 4 - -#define PAGETABLE_ENTRY_MASK ((1UL << 9) - 1) -#define PML4_OFFSET(x) ( (x >> 39) & PAGETABLE_ENTRY_MASK) -#define PDP_OFFSET(x) ( (x >> 30) & PAGETABLE_ENTRY_MASK) -#define PDE_OFFSET(x) ( (x >> 21) & PAGETABLE_ENTRY_MASK) -#define PTE_OFFSET(x) ( (x >> 12) & PAGETABLE_ENTRY_MASK) -#define PAGING_1G_ADDRESS_MASK_64 0x000FFFFFC0000000ull - #define PAGE_TABLE_POOL_ALIGNMENT BASE_2MB #define PAGE_TABLE_POOL_UNIT_SIZE SIZE_2MB #define PAGE_TABLE_POOL_UNIT_PAGES \