diff options
| author | Xu Yilun <yilun.xu@linux.intel.com> | 2026-09-21 20:39:23 +0800 |
|---|---|---|
| committer | Dave Hansen <dave.hansen@linux.intel.com> | 2026-09-21 14:38:15 -0700 |
| commit | c9fc85f1e44e4e933c7e6702b100b9505715f6a8 (patch) | |
| tree | e380c583ba3642531bc7da5788b048e024589172 /scripts/patch-kernel | |
| parent | e61c837817acde1df7ebd977b798683a3d9b0dda (diff) | |
| download | linux-next-c9fc85f1e44e4e933c7e6702b100b9505715f6a8.tar.gz linux-next-c9fc85f1e44e4e933c7e6702b100b9505715f6a8.zip | |
x86/virt/tdx: Formalize SEAMCALL leaf version encoding support
The TDX architecture includes a syscall-like ABI for OSes to communicate
with SEAM mode software. This ABI has the concept of a "leaf". Each leaf
is roughly analogous to a Linux syscall: it has a set of register
arguments and does one logical thing like adding a page of memory to a
VM or running a VM. The TDX architecture refers to this interface
function as a "SEAMCALL leaf".
Just like syscalls, the TDX architecture wants to evolve the ABI to
extend functionality while keeping compatibility. But unlike syscalls,
which do this by picking a totally new syscall number, the ABI encodes
the "version" number directly into the bits of a register argument. So
instead of openatN being whatever the next free number is, the SEAMCALL
leaf number and version number are encoded into certain bits in how the
RAX register is defined in the ABI.
In Linux, several seamcall*() wrappers have been introduced to invoke
SEAMCALL leafs. They all take a u64 "fn" argument for the leaf number
which eventually gets set in the register. As above, the version number
lives in the same register as the leaf number. So callers that want to
select a specific version of the leaf, can jam it in the right place in
the register by passing it in the "fn" argument. Today only the caller
of TDH.VP.INIT does this hack, but future kernel changes will need to
select versions for more SEAMCALL leafs. So a less hacky solution is
needed.
Explicitly define the arguments for seamcall*() wrappers:
- Add a build-time assertion to ensure "fn" only contains valid
SEAMCALL leaf number bits. Note the P-SEAMLDR selector bit (bit 63)
is part of the leaf number for SEAM loader calls, so it is allowed.
This also means the "fn" can't be a narrower type, such as u16, to
exclude unrelated bits.
- Add a "version" field in struct tdx_module_args [1], so most
existing callers get a default "version == 0" behavior without code
churn. Update the TDH.VP.INIT caller to specify the version
descriptively.
Encode the leaf number and tdx_module_args.version into RAX in assembly,
because this is the place where the "fn" and struct tdx_module_args
fields are marshaled into registers.
AI was used under supervision to review code and workshop logs. In
particular, it helped evaluate the assembly changes.
Signed-off-by: Xu Yilun <yilun.xu@linux.intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Kiryl Shutsemau (Meta) <kas@kernel.org>
Reviewed-by: Nikolay Borisov <nik.borisov@suse.com>
Reviewed-by: Tony Lindgren <tony.lindgren@linux.intel.com>
Reviewed-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
Reviewed-by: Kishen Maloor <kishen.maloor@intel.com>
Link: https://lore.kernel.org/kvm/4f4b0f29-424b-45ed-8cfd-c77da2ea390f@intel.com/ # [1]
Link: https://patch.msgid.link/20260921-seamcall-version-v7-1-cf05fe76b467@linux.intel.com
Diffstat (limited to 'scripts/patch-kernel')
0 files changed, 0 insertions, 0 deletions
