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);