Re: [PATCH v7 09/20] x86/virt/tdx: Get information about TDX module and TDX-capable memory

From: Huang, Kai
Date: Fri Dec 02 2022 - 06:12:00 EST


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.