Skip to content

Commit c5ba494

Browse files
committed
KVM: nSVM: Save/load CET Shadow Stack state to/from vmcb12/vmcb02
Transfer the three CET Shadow Stack VMCB fields (S_CET, ISST_ADDR, and SSP) on VMRUN, #VMEXIT, and loading nested state (saving nested state simply copies the entire save area). SVM doesn't provide a way to disallow L1 from enabling Shadow Stacks for L2, i.e. KVM *must* provide nested support before advertising SHSTK to userspace. Link: https://lore.kernel.org/r/20250919223258.1604852-37-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent 48b2ec0 commit c5ba494

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

arch/x86/kvm/svm/nested.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,14 @@ static void nested_vmcb02_prepare_save(struct vcpu_svm *svm, struct vmcb *vmcb12
636636
vmcb_mark_dirty(vmcb02, VMCB_DT);
637637
}
638638

639+
if (guest_cpu_cap_has(vcpu, X86_FEATURE_SHSTK) &&
640+
(unlikely(new_vmcb12 || vmcb_is_dirty(vmcb12, VMCB_CET)))) {
641+
vmcb02->save.s_cet = vmcb12->save.s_cet;
642+
vmcb02->save.isst_addr = vmcb12->save.isst_addr;
643+
vmcb02->save.ssp = vmcb12->save.ssp;
644+
vmcb_mark_dirty(vmcb02, VMCB_CET);
645+
}
646+
639647
kvm_set_rflags(vcpu, vmcb12->save.rflags | X86_EFLAGS_FIXED);
640648

641649
svm_set_efer(vcpu, svm->nested.save.efer);
@@ -1044,6 +1052,12 @@ void svm_copy_vmrun_state(struct vmcb_save_area *to_save,
10441052
to_save->rsp = from_save->rsp;
10451053
to_save->rip = from_save->rip;
10461054
to_save->cpl = 0;
1055+
1056+
if (kvm_cpu_cap_has(X86_FEATURE_SHSTK)) {
1057+
to_save->s_cet = from_save->s_cet;
1058+
to_save->isst_addr = from_save->isst_addr;
1059+
to_save->ssp = from_save->ssp;
1060+
}
10471061
}
10481062

10491063
void svm_copy_vmloadsave_state(struct vmcb *to_vmcb, struct vmcb *from_vmcb)
@@ -1111,6 +1125,12 @@ int nested_svm_vmexit(struct vcpu_svm *svm)
11111125
vmcb12->save.dr6 = svm->vcpu.arch.dr6;
11121126
vmcb12->save.cpl = vmcb02->save.cpl;
11131127

1128+
if (guest_cpu_cap_has(vcpu, X86_FEATURE_SHSTK)) {
1129+
vmcb12->save.s_cet = vmcb02->save.s_cet;
1130+
vmcb12->save.isst_addr = vmcb02->save.isst_addr;
1131+
vmcb12->save.ssp = vmcb02->save.ssp;
1132+
}
1133+
11141134
vmcb12->control.int_state = vmcb02->control.int_state;
11151135
vmcb12->control.exit_code = vmcb02->control.exit_code;
11161136
vmcb12->control.exit_code_hi = vmcb02->control.exit_code_hi;

0 commit comments

Comments
 (0)