Messages in this thread |  | | From | "Huang, Kai" <> | Subject | Re: [PATCH v7 09/20] x86/virt/tdx: Get information about TDX module and TDX-capable memory | Date | Fri, 2 Dec 2022 11:11:40 +0000 |
| |
On Tue, 2022-11-22 at 15:39 -0800, Dave Hansen wrote: > > +#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]; > > + }; > > Can you double check what the "right" way to do variable arrays is these > days? I thought the [0] method was discouraged. > > Also, it isn't *really* 892 bytes of reserved space, right? Anything > that's not cpuid_configs[] is reserved, I presume. Could you try to be > more precise there?
Hi Dave,
I did some search, and I think we should use DECLARE_FLEX_ARRAY() macro?
And also to address you concern that not all 892 bytes are reserved, how about below:
union { - struct cpuid_config cpuid_configs[0]; - u8 reserved5[892]; + DECLARE_FLEX_ARRAY(struct cpuid_config, cpuid_configs); + u8 padding[892]; }; } __packed __aligned(TDSYSINFO_STRUCT_ALIGNMENT);
The goal is to make the size of 'struct tdsysinfo_struct' to be 1024B so we can use a static variable for it, and at the meantime, it can still have 1024B (enough space) for the TDH.SYS.INFO to write to.
|  |