Re: [PATCH] x86/svm: require VMSAVEvirt for nested virt
Teddy Astie <[email protected]>
| Newsgroups | org.xenproject.lists.xen-devel |
|---|---|
| Message-ID | <1785152912.8631fc262581453bbf619ec5b2062170.19fa367bc22000e099@vates.tech> |
Le 27/07/2026 à 09:20, Stephen Cheng a écrit : > Virtual VMLOAD/VMSAVE lets an L1 guest execute VMLOAD and VMSAVE > without intercepts. Without it, Xen has to map the L1-provided VMCB > and re-execute each instruction in L0, complicating security-sensitive > state handling. > > Make VMSAVEvirt a hard requirement for nested SVM. Advertise it to > L1, enable it when L1 enables SVM, and remove the nested VMLOAD/VMSAVE > emulation path. Any remaining intercept therefore comes from a guest > which has not enabled SVM and receives #UD. > > Assisted-by: Claude:claude-opus-4-8 > Signed-off-by: Stephen Cheng <[email protected]> > --- > docs/designs/nested-svm-cpu-features.md | 11 +++ > xen/arch/x86/cpu-policy.c | 3 +- > xen/arch/x86/hvm/svm/nestedsvm.c | 24 ++++-- > xen/arch/x86/hvm/svm/svm.c | 100 +++--------------------- > xen/arch/x86/hvm/svm/svm.h | 2 - > 5 files changed, 41 insertions(+), 99 deletions(-) > > diff --git a/docs/designs/nested-svm-cpu-features.md b/docs/designs/nested-svm-cpu-features.md > index ce168e68e1..798480b259 100644 > --- a/docs/designs/nested-svm-cpu-features.md > +++ b/docs/designs/nested-svm-cpu-features.md > @@ -109,3 +109,14 @@ leaf 8000000A:edx > Using it in L0 reduces the chance that we'll make some sort of error > in the decode path. And if hardware supports it, it's easy enough > to provide to the L1. > + > +- 15 `VLoadSave` *Virtual VMLOAD/VMSAVE*: Require for L0, provide to L1 > + > + Without this feature Xen has to intercept the L1 hypervisor's VMLOAD > + and VMSAVE instructions and emulate them by re-executing the real > + instruction on a mapped copy of the L1-supplied VMCB. That path > + handles a complex, security-sensitive subset of state (the hidden > + segment descriptors for FS/GS/TR/LDTR plus the SYSCALL/SYSENTER > + MSRs), so on faithfulness grounds we'd much rather let the hardware > + do it. When present, the instructions execute natively in the guest > + without a #VMEXIT, which is both simpler and faster. I'm not convinced making "VMSAVEvirt" mandatory is a good idea, in particular, there is a errata (1454 - Processor May Log Unexpected LS MCE Error When Executing Virtualized VMLOAD or Virtualized VMSAVE) on Family 19h regarding this feature. Had you considered improving the current implementation of virtualized VMLOAD/VMSAVE ? AIUI, the way Xen currently implements this instruction (by mapping the L1 VMCB then calling vmload/vmsave on it) is more of a implementation choice than a requirement. A better (at least, likely safer) way to emulate such instructions (and not relying on VMSAVEvirt) would be to copy parts of L1 VMCB from/to L0 VMCB and let Xen perform the appropriate vmload/vmsave on its own VMCBs as usual. Teddy
OpenPGP_0x660FA9D102CBCFD0.asc
(application/pgp-keys, 2.4 KB)
-----BEGIN PGP PUBLIC KEY BLOCK----- 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 x9fhaZEsniw8/bYgC3igkk5YJiOa =lUIA -----END PGP PUBLIC KEY BLOCK-----
OpenPGP_signature.asc
(application/pgp-signature, 665 B)
-----BEGIN PGP SIGNATURE----- wsD5BAABCAAjFiEEGAIew9LzHY3pdrqtZg+p0QLLz9AFAmpnRY8FAwAAAAAACgkQZg+p0QLLz9AJ aAv8CmVWiwhtIJJuzp9q+locFhcVOSN8AhhLVehKZ80Q1agzMIAvB1JIucVLG+fS+LalErEggfM4 8TU28zsEicWMt5s4fgnFZsNMQkeiubGotro4SAMzYuyjyxJz8Ofh/THfy3xoLBqsS/OrT81GM4YG SpVeo/UyOFVdFlbA0azkryCsxpIG1rFr0uRuYFwHCN3+AVhDWke6i06Do99v8sMGlmGvSDxmfIjL ckJq5zKd+3WA6T9taxhfsFWec+aZeXaCef7f29ClkNb/ihe7jQwHeQ7U7ybf5d+0IKzJXovZtnOA 0x3D9s4N1E7EVkCapxeR6SIIAvQf+58/Nc1DkWhLfXkl664yCeD+fU06UGBtScLOn2UiO5qV8ZM8 EJPS0sIFYwZ60mEC9UHSjC3urQi9Pi4hsTC3Xi3vh3iN864V/KBVD25bKx+i2DjPkdFA6TQYzLbu wZyle2sZJLW4vMGGkH5rzhKZrPpkubDVsv+UYSaYW7x5V4JwWhYh4KIMc3yL =8kGS -----END PGP SIGNATURE-----