lkml.org 
[lkml]   [2021]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC v2-fix-v1 1/1] x86/tdx: Add helper to do MapGPA hypercall
    Date
    From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>

    MapGPA hypercall is used by TDX guests to request VMM convert
    the existing mapping of given GPA address range between
    private/shared.

    tdx_hcall_gpa_intent() is the wrapper used for making MapGPA
    hypercall.

    Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Reviewed-by: Andi Kleen <ak@linux.intel.com>
    Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
    ---

    Changes since RFC v2:
    * Renamed tdg_map_gpa() to tdx_hcall_gpa_intent().
    * Fixed commit log and comments as per review comments.

    arch/x86/include/asm/tdx.h | 17 +++++++++++++++++
    arch/x86/kernel/tdx.c | 24 ++++++++++++++++++++++++
    2 files changed, 41 insertions(+)

    diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h
    index a93528246595..eb9fa5f4d0e3 100644
    --- a/arch/x86/include/asm/tdx.h
    +++ b/arch/x86/include/asm/tdx.h
    @@ -7,6 +7,15 @@

    #ifndef __ASSEMBLY__

    +/*
    + * Page mapping type enum. This is software construct not
    + * part of any hardware or VMM ABI.
    + */
    +enum tdx_map_type {
    + TDX_MAP_PRIVATE,
    + TDX_MAP_SHARED,
    +};
    +
    #ifdef CONFIG_INTEL_TDX_GUEST

    #include <asm/cpufeature.h>
    @@ -119,6 +128,8 @@ do { \
    #endif

    extern phys_addr_t tdg_shared_mask(void);
    +extern int tdx_hcall_gpa_intent(phys_addr_t gpa, int numpages,
    + enum tdx_map_type map_type);

    #else // !CONFIG_INTEL_TDX_GUEST

    @@ -143,6 +154,12 @@ static inline phys_addr_t tdg_shared_mask(void)
    {
    return 0;
    }
    +
    +static inline int tdx_hcall_gpa_intent(phys_addr_t gpa, int numpages,
    + enum tdx_map_type map_type)
    +{
    + return -ENODEV;
    +}
    #endif /* CONFIG_INTEL_TDX_GUEST */

    #ifdef CONFIG_INTEL_TDX_GUEST_KVM
    diff --git a/arch/x86/kernel/tdx.c b/arch/x86/kernel/tdx.c
    index 0c8b10b78f32..a8ebd2d10093 100644
    --- a/arch/x86/kernel/tdx.c
    +++ b/arch/x86/kernel/tdx.c
    @@ -16,6 +16,9 @@
    #define TDINFO 1
    #define TDGETVEINFO 3

    +/* TDX hypercall Leaf IDs */
    +#define TDVMCALL_MAP_GPA 0x10001
    +
    #define VE_GET_IO_TYPE(exit_qual) (((exit_qual) & 8) ? 0 : 1)
    #define VE_GET_IO_SIZE(exit_qual) (((exit_qual) & 7) + 1)
    #define VE_GET_PORT_NUM(exit_qual) ((exit_qual) >> 16)
    @@ -122,6 +125,27 @@ static void tdg_get_info(void)
    physical_mask &= ~tdg_shared_mask();
    }

    +/*
    + * Inform the VMM of the guest's intent for this physical page:
    + * shared with the VMM or private to the guest. The VMM is
    + * expected to change its mapping of the page in response.
    + *
    + * Note: shared->private conversions require further guest
    + * action to accept the page.
    + */
    +int tdx_hcall_gpa_intent(phys_addr_t gpa, int numpages,
    + enum tdx_map_type map_type)
    +{
    + u64 ret;
    +
    + if (map_type == TDX_MAP_SHARED)
    + gpa |= tdg_shared_mask();
    +
    + ret = tdx_hypercall(TDVMCALL_MAP_GPA, gpa, PAGE_SIZE * numpages, 0, 0);
    +
    + return ret ? -EIO : 0;
    +}
    +
    static __cpuidle void tdg_halt(void)
    {
    u64 ret;
    --
    2.25.1
    \
     
     \ /
      Last update: 2021-05-27 06:57    [W:2.237 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site