lkml.org 
[lkml]   [2022]   [Apr]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: x86/tdx] x86/tdx: Exclude shared bit from __PHYSICAL_MASK
    The following commit has been merged into the x86/tdx branch of tip:

    Commit-ID: 65fab5bc033aad1a9faf976caec46558c2f88319
    Gitweb: https://git.kernel.org/tip/65fab5bc033aad1a9faf976caec46558c2f88319
    Author: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    AuthorDate: Wed, 06 Apr 2022 02:29:14 +03:00
    Committer: Dave Hansen <dave.hansen@linux.intel.com>
    CommitterDate: Thu, 07 Apr 2022 08:27:51 -07:00

    x86/tdx: Exclude shared bit from __PHYSICAL_MASK

    In TDX guests, by default memory is protected from host access. If a
    guest needs to communicate with the VMM (like the I/O use case), it uses
    a single bit in the physical address to communicate the protected/shared
    attribute of the given page.

    In the x86 ARCH code, __PHYSICAL_MASK macro represents the width of the
    physical address in the given architecture. It is used in creating
    physical PAGE_MASK for address bits in the kernel. Since in TDX guest,
    a single bit is used as metadata, it needs to be excluded from valid
    physical address bits to avoid using incorrect addresses bits in the
    kernel.

    Enable DYNAMIC_PHYSICAL_MASK to support updating the __PHYSICAL_MASK.

    Co-developed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
    Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
    Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: Andi Kleen <ak@linux.intel.com>
    Reviewed-by: Tony Luck <tony.luck@intel.com>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/20220405232939.73860-6-kirill.shutemov@linux.intel.com
    ---
    arch/x86/Kconfig | 1 +
    arch/x86/coco/tdx/tdx.c | 8 ++++++++
    2 files changed, 9 insertions(+)

    diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
    index 984315c..aea4cc4 100644
    --- a/arch/x86/Kconfig
    +++ b/arch/x86/Kconfig
    @@ -883,6 +883,7 @@ config INTEL_TDX_GUEST
    depends on X86_64 && CPU_SUP_INTEL
    depends on X86_X2APIC
    select ARCH_HAS_CC_PLATFORM
    + select DYNAMIC_PHYSICAL_MASK
    help
    Support running as a guest under Intel TDX. Without this support,
    the guest kernel can not boot or run under TDX.
    diff --git a/arch/x86/coco/tdx/tdx.c b/arch/x86/coco/tdx/tdx.c
    index 96b2611..e84f6dd 100644
    --- a/arch/x86/coco/tdx/tdx.c
    +++ b/arch/x86/coco/tdx/tdx.c
    @@ -89,5 +89,13 @@ void __init tdx_early_init(void)
    cc_mask = get_cc_mask();
    cc_set_mask(cc_mask);

    + /*
    + * All bits above GPA width are reserved and kernel treats shared bit
    + * as flag, not as part of physical address.
    + *
    + * Adjust physical mask to only cover valid GPA bits.
    + */
    + physical_mask &= cc_mask - 1;
    +
    pr_info("Guest detected\n");
    }
    \
     
     \ /
      Last update: 2022-09-17 16:21    [W:5.041 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site