All of lore.kernel.org
 help / color / mirror / Atom feed
From: Binbin Wu <binbin.wu@linux.intel.com>
To: Chao Gao <chao.gao@intel.com>
Cc: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev,
	kvm@vger.kernel.org, yilun.xu@linux.intel.com,
	tony.lindgren@linux.intel.com, rick.p.edgecombe@intel.com,
	nik.borisov@suse.com, Thomas Gleixner <tglx@kernel.org>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
	Kiryl Shutsemau <kas@kernel.org>
Subject: Re: [PATCH v4 10/10] x86/virt/tdx: Verify structure member sizes against metadata field IDs
Date: Tue, 13 Oct 2026 19:10:36 +0800	[thread overview]
Message-ID: <94be5e5e-808d-469e-bf72-e1d9b7c7c879@linux.intel.com> (raw)
In-Reply-To: <20261012094754.27702-11-chao.gao@intel.com>

On 10/12/2026 5:47 PM, Chao Gao wrote:
> The TDX module reports its capabilities and limits as a set of metadata
> fields, each identified by a field ID, and TDH.SYS.RD reads one field by
> its ID. TDH.SYS.RD returns the value as a u64, but metadata fields are not
> all 64 bits wide. A field ID therefore encodes the field's size into
> bits 33:32.
> 
> The kernel mirrors these fields in C structures, and each member's size
> must match the size encoded in the field ID. FIELD_MAP() stores the member
> size and uses it to decide how many bytes to copy from the value returned
> by TDH.SYS.RD. The size in the field ID is never consulted, so any mismatch
> goes unnoticed. Declaring a u32 member for a 64-bit field, for example,
> would silently store only its low 4 bytes.
> 
> Add a build-time check that the size encoded in each field ID matches the
> size of the corresponding C structure member. A wrongly typed member then
> fails the build with no runtime cost.
> 
> BUILD_BUG_ON() cannot be used in a structure initializer, so use
> BUILD_BUG_ON_ZERO() and add its zero result to the .size initializer. This
> performs the build-time check without changing the stored size.
> 
> An alternative would be to leave the size bits out of the field ID
> definitions and construct the IDs from the member sizes, which makes a
> mismatch impossible. But the TDX module ABI definitions list the full field
> IDs, and definitions with the size bits stripped would match nothing in the
> docs, making them harder to verify. Keep the IDs exactly as documented and
> check the size they encode against the C type instead.
> 
> AI was used under supervision to review code and workshop logs. It
> suggested moving the size check into its own macro to keep the .size line
> short. Rick also used AI to write TDX_FIELD_SIZE_CODE(), which converts a
> member size to the size encoding in the field ID.
> 
> Signed-off-by: Chao Gao <chao.gao@intel.com>

Reviewed-by: Binbin Wu <binbin.wu@linux.intel.com>

One nit below.

[...]

>  
> +/*
> + * The size encoded in the field ID and the size of the destination C
> + * member must agree.
> + */
> +#define TDX_FIELD_SIZE_CHECK(_field, _type, _member)		\
> +	BUILD_BUG_ON_ZERO(((_field) & TDX_FIELD_SIZE_MASK) !=	\
> +		TDX_FIELD_SIZE_CODE(sizeof_field(_type, _member)))
> +
>  #define __FIELD_MAP(_field, _type, _member)			\
>  {								\
>  	.field_id	= _field,				\
>  	.offset		= offsetof(_type, _member),		\
> -	.size		= sizeof_field(_type, _member),		\
> +	.size		= sizeof_field(_type, _member) +	\
> +			  TDX_FIELD_SIZE_CHECK(			\
> +				_field, _type, _member),	\
>  }
>  

Nit:

This doesn't cover the TDX_FIELD_CPUID_CONFIG_LEAVES and
TDX_FIELD_CPUID_CONFIG_VALUES.

Not sure it's worth to add static_assert() in get_tdx_sys_info_td_conf(). But if
not, maybe it can be mentioned it in the changelog.

      reply	other threads:[~2026-10-13 11:10 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-12  9:47 [PATCH v4 00/10] TDX: Stop auto-generating the global metadata code Chao Gao
2026-10-12  9:47 ` [PATCH v4 01/10] x86/virt/tdx: Add a helper to read a table of metadata fields Chao Gao
2026-10-13  7:00   ` Binbin Wu
2026-10-12  9:47 ` [PATCH v4 02/10] x86/virt/tdx: Convert the version metadata reader Chao Gao
2026-10-13  8:22   ` Binbin Wu
2026-10-12  9:47 ` [PATCH v4 03/10] x86/virt/tdx: Convert the features " Chao Gao
2026-10-13  8:45   ` Binbin Wu
2026-10-12  9:47 ` [PATCH v4 04/10] x86/virt/tdx: Convert the tdmr " Chao Gao
2026-10-13  9:02   ` Binbin Wu
2026-10-12  9:47 ` [PATCH v4 05/10] x86/virt/tdx: Convert the td_ctrl " Chao Gao
2026-10-13  9:13   ` Binbin Wu
2026-10-12  9:47 ` [PATCH v4 06/10] x86/virt/tdx: Convert the handoff " Chao Gao
2026-10-13  9:21   ` Binbin Wu
2026-10-12  9:47 ` [PATCH v4 07/10] x86/virt/tdx: Convert the td_conf " Chao Gao
2026-10-13  9:57   ` Binbin Wu
2026-10-12  9:47 ` [PATCH v4 08/10] x86/virt/tdx: Remove tdx_global_metadata.c Chao Gao
2026-10-13 10:18   ` Binbin Wu
2026-10-12  9:47 ` [PATCH v4 09/10] x86/virt/tdx: Use early returns in get_tdx_sys_info() Chao Gao
2026-10-13 10:33   ` Binbin Wu
2026-10-12  9:47 ` [PATCH v4 10/10] x86/virt/tdx: Verify structure member sizes against metadata field IDs Chao Gao
2026-10-13 11:10   ` Binbin Wu [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=94be5e5e-808d-469e-bf72-e1d9b7c7c879@linux.intel.com \
    --to=binbin.wu@linux.intel.com \
    --cc=bp@alien8.de \
    --cc=chao.gao@intel.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=kas@kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-coco@lists.linux.dev \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=nik.borisov@suse.com \
    --cc=rick.p.edgecombe@intel.com \
    --cc=tglx@kernel.org \
    --cc=tony.lindgren@linux.intel.com \
    --cc=x86@kernel.org \
    --cc=yilun.xu@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.