Re: [PATCH RFC 1/7] x86/virt/tdx: Add SEAMCALL wrapper to enter/exit TDX guest

From: Adrian Hunter
Date: Mon Nov 25 2024 - 09:54:36 EST


On 22/11/24 18:33, Dave Hansen wrote:
> On 11/22/24 03:10, Adrian Hunter wrote:
>> +struct tdh_vp_enter_tdcall {
>> + u64 reg_mask : 32,
>> + vm_idx : 2,
>> + reserved_0 : 30;
>> + u64 data[TDX_ERR_DATA_PART_2];
>> + u64 fn; /* Non-zero for hypercalls, zero otherwise */
>> + u64 subfn;
>> + union {
>> + struct tdh_vp_enter_vmcall vmcall;
>> + struct tdh_vp_enter_gettdvmcallinfo gettdvmcallinfo;
>> + struct tdh_vp_enter_mapgpa mapgpa;
>> + struct tdh_vp_enter_getquote getquote;
>> + struct tdh_vp_enter_reportfatalerror reportfatalerror;
>> + struct tdh_vp_enter_cpuid cpuid;
>> + struct tdh_vp_enter_mmio mmio;
>> + struct tdh_vp_enter_hlt hlt;
>> + struct tdh_vp_enter_io io;
>> + struct tdh_vp_enter_rd rd;
>> + struct tdh_vp_enter_wr wr;
>> + };
>> +};
>
> Let's say someone declares this:
>
> struct tdh_vp_enter_mmio {
> u64 size;
> u64 mmio_addr;
> u64 direction;
> u64 value;
> };
>
> How long is that going to take you to debug?

When adding a new hardware definition, it would be sensible
to check the hardware definition first before checking anything
else.

However, to stop existing members being accidentally moved,
could add:

#define CHECK_OFFSETS_EQ(reg, member) \
BUILD_BUG_ON(offsetof(struct tdx_module_args, reg) != offsetof(union tdh_vp_enter_args, member));

CHECK_OFFSETS_EQ(r12, tdcall.mmio.size);
CHECK_OFFSETS_EQ(r13, tdcall.mmio.direction);
CHECK_OFFSETS_EQ(r14, tdcall.mmio.mmio_addr);
CHECK_OFFSETS_EQ(r15, tdcall.mmio.value);