]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: selftests: Extend state_test to check next_rip
authorYosry Ahmed <yosry@kernel.org>
Wed, 25 Feb 2026 00:59:46 +0000 (00:59 +0000)
committerSean Christopherson <seanjc@google.com>
Mon, 2 Mar 2026 23:58:23 +0000 (15:58 -0800)
Similar to vGIF, extend state_test to make sure that next_rip is saved
correctly in nested state. GUEST_SYNC() in L2 causes IO emulation by
KVM, which advances the RIP to the value of next_rip. Hence, if next_rip
is saved correctly, its value should match the saved RIP value.

Signed-off-by: Yosry Ahmed <yosry@kernel.org>
Link: https://patch.msgid.link/20260225005950.3739782-5-yosry@kernel.org
Signed-off-by: Sean Christopherson <seanjc@google.com>
tools/testing/selftests/kvm/x86/state_test.c

index 57c7546f3d7c55afd1be3108339b638bd91bed70..992a52504a4ab536e5dccddb4464b10394105b43 100644 (file)
@@ -236,6 +236,17 @@ void svm_check_nested_state(int stage, struct kvm_x86_state *state)
                if (stage == 6)
                        TEST_ASSERT_EQ(!!(vmcb->control.int_ctl & V_GIF_MASK), 0);
        }
+
+       if (kvm_cpu_has(X86_FEATURE_NRIPS)) {
+               /*
+                * GUEST_SYNC() causes IO emulation in KVM, in which case the
+                * RIP is advanced before exiting to userspace. Hence, the RIP
+                * in the saved state should be the same as nRIP saved by the
+                * CPU in the VMCB.
+                */
+               if (stage == 6)
+                       TEST_ASSERT_EQ(vmcb->control.next_rip, state->regs.rip);
+       }
 }
 
 void check_nested_state(int stage, struct kvm_x86_state *state)