lkml.org 
[lkml]   [2022]   [Mar]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v5 007/104] x86/virt/tdx: Add a helper function to return system wide info about TDX module
    Date
    From: Isaku Yamahata <isaku.yamahata@intel.com>

    TDX KVM needs system-wide information about the TDX module, struct
    tdsysinfo_struct. Add a helper function tdx_get_sysinfo() to return it
    instead of KVM getting it with various error checks. Move out the struct
    definition about it to common place tdx_host.h.

    Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
    ---
    arch/x86/include/asm/tdx.h | 55 ++++++++++++++++++++++++++++++++++++++
    arch/x86/virt/vmx/tdx.c | 16 +++++++++--
    arch/x86/virt/vmx/tdx.h | 52 -----------------------------------
    3 files changed, 69 insertions(+), 54 deletions(-)

    diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h
    index 24f2b7e8b280..9a8dc6afcb63 100644
    --- a/arch/x86/include/asm/tdx.h
    +++ b/arch/x86/include/asm/tdx.h
    @@ -82,15 +82,70 @@ static inline long tdx_kvm_hypercall(unsigned int nr, unsigned long p1,
    #endif /* CONFIG_INTEL_TDX_GUEST && CONFIG_KVM_GUEST */

    #ifdef CONFIG_INTEL_TDX_HOST
    +struct tdx_cpuid_config {
    + u32 leaf;
    + u32 sub_leaf;
    + u32 eax;
    + u32 ebx;
    + u32 ecx;
    + u32 edx;
    +} __packed;
    +
    +#define TDSYSINFO_STRUCT_SIZE 1024
    +#define TDSYSINFO_STRUCT_ALIGNMENT 1024
    +
    +struct tdsysinfo_struct {
    + /* TDX-SEAM Module Info */
    + u32 attributes;
    + u32 vendor_id;
    + u32 build_date;
    + u16 build_num;
    + u16 minor_version;
    + u16 major_version;
    + u8 reserved0[14];
    + /* Memory Info */
    + u16 max_tdmrs;
    + u16 max_reserved_per_tdmr;
    + u16 pamt_entry_size;
    + u8 reserved1[10];
    + /* Control Struct Info */
    + u16 tdcs_base_size;
    + u8 reserved2[2];
    + u16 tdvps_base_size;
    + u8 tdvps_xfam_dependent_size;
    + u8 reserved3[9];
    + /* TD Capabilities */
    + u64 attributes_fixed0;
    + u64 attributes_fixed1;
    + u64 xfam_fixed0;
    + u64 xfam_fixed1;
    + u8 reserved4[32];
    + u32 num_cpuid_config;
    + /*
    + * The actual number of CPUID_CONFIG depends on above
    + * 'num_cpuid_config'. The size of 'struct tdsysinfo_struct'
    + * is 1024B defined by TDX architecture. Use a union with
    + * specific padding to make 'sizeof(struct tdsysinfo_struct)'
    + * equal to 1024.
    + */
    + union {
    + struct tdx_cpuid_config cpuid_configs[0];
    + u8 reserved5[892];
    + };
    +} __packed __aligned(TDSYSINFO_STRUCT_ALIGNMENT);
    +
    void tdx_detect_cpu(struct cpuinfo_x86 *c);
    int tdx_detect(void);
    int tdx_init(void);
    bool platform_has_tdx(void);
    +const struct tdsysinfo_struct *tdx_get_sysinfo(void);
    #else
    static inline void tdx_detect_cpu(struct cpuinfo_x86 *c) { }
    static inline int tdx_detect(void) { return -ENODEV; }
    static inline int tdx_init(void) { return -ENODEV; }
    static inline bool platform_has_tdx(void) { return false; }
    +struct tdsysinfo_struct;
    +static inline const struct tdsysinfo_struct *tdx_get_sysinfo(void) { return NULL; }
    #endif /* CONFIG_INTEL_TDX_HOST */

    #endif /* !__ASSEMBLY__ */
    diff --git a/arch/x86/virt/vmx/tdx.c b/arch/x86/virt/vmx/tdx.c
    index da4d1df95503..e45f188479cb 100644
    --- a/arch/x86/virt/vmx/tdx.c
    +++ b/arch/x86/virt/vmx/tdx.c
    @@ -641,7 +641,7 @@ static int sanitize_cmrs(struct cmr_info *cmr_array, int cmr_num)
    return 0;
    }

    -static int tdx_get_sysinfo(void)
    +static int __tdx_get_sysinfo(void)
    {
    struct tdx_module_output out;
    u64 tdsysinfo_sz, cmr_num;
    @@ -676,6 +676,18 @@ static int tdx_get_sysinfo(void)
    return sanitize_cmrs(tdx_cmr_array, cmr_num);
    }

    +const struct tdsysinfo_struct *tdx_get_sysinfo(void)
    +{
    + const struct tdsysinfo_struct *r = NULL;
    +
    + mutex_lock(&tdx_module_lock);
    + if (tdx_module_status == TDX_MODULE_INITIALIZED)
    + r = &tdx_sysinfo;
    + mutex_unlock(&tdx_module_lock);
    + return r;
    +}
    +EXPORT_SYMBOL_GPL(tdx_get_sysinfo);
    +
    /*
    * Only E820_TYPE_RAM and E820_TYPE_PRAM are considered as candidate for
    * TDX usable memory. The latter is treated as RAM because it is created
    @@ -1383,7 +1395,7 @@ static int init_tdx_module(void)
    goto out;

    /* Get TDX module information and CMRs */
    - ret = tdx_get_sysinfo();
    + ret = __tdx_get_sysinfo();
    if (ret)
    goto out;

    diff --git a/arch/x86/virt/vmx/tdx.h b/arch/x86/virt/vmx/tdx.h
    index 212f83374c0a..b071d299327b 100644
    --- a/arch/x86/virt/vmx/tdx.h
    +++ b/arch/x86/virt/vmx/tdx.h
    @@ -37,58 +37,6 @@ struct cmr_info {
    #define MAX_CMRS 32
    #define CMR_INFO_ARRAY_ALIGNMENT 512

    -struct cpuid_config {
    - u32 leaf;
    - u32 sub_leaf;
    - u32 eax;
    - u32 ebx;
    - u32 ecx;
    - u32 edx;
    -} __packed;
    -
    -#define TDSYSINFO_STRUCT_SIZE 1024
    -#define TDSYSINFO_STRUCT_ALIGNMENT 1024
    -
    -struct tdsysinfo_struct {
    - /* TDX-SEAM Module Info */
    - u32 attributes;
    - u32 vendor_id;
    - u32 build_date;
    - u16 build_num;
    - u16 minor_version;
    - u16 major_version;
    - u8 reserved0[14];
    - /* Memory Info */
    - u16 max_tdmrs;
    - u16 max_reserved_per_tdmr;
    - u16 pamt_entry_size;
    - u8 reserved1[10];
    - /* Control Struct Info */
    - u16 tdcs_base_size;
    - u8 reserved2[2];
    - u16 tdvps_base_size;
    - u8 tdvps_xfam_dependent_size;
    - u8 reserved3[9];
    - /* TD Capabilities */
    - u64 attributes_fixed0;
    - u64 attributes_fixed1;
    - u64 xfam_fixed0;
    - u64 xfam_fixed1;
    - u8 reserved4[32];
    - u32 num_cpuid_config;
    - /*
    - * The actual number of CPUID_CONFIG depends on above
    - * 'num_cpuid_config'. The size of 'struct tdsysinfo_struct'
    - * is 1024B defined by TDX architecture. Use a union with
    - * specific padding to make 'sizeof(struct tdsysinfo_struct)'
    - * equal to 1024.
    - */
    - union {
    - struct cpuid_config cpuid_configs[0];
    - u8 reserved5[892];
    - };
    -} __packed __aligned(TDSYSINFO_STRUCT_ALIGNMENT);
    -
    struct tdmr_reserved_area {
    u64 offset;
    u64 size;
    --
    2.25.1
    \
     
     \ /
      Last update: 2022-03-04 21:05    [W:4.164 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site