From: Hemanth Selam <hemanth.selam@gmail.com>
To: Sean Christopherson <seanjc@google.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Shuah Khan <shuah@kernel.org>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-kselftest@vger.kernel.org
Subject: [PATCH 1/2] KVM: selftests: Actually compare sregs and events in sync_regs_test
Date: Wed, 2 Sep 2026 17:32:34 +0530 [thread overview]
Message-ID: <20260902120235.18486-2-hemanth.selam@gmail.com> (raw)
In-Reply-To: <20260902120235.18486-1-hemanth.selam@gmail.com>
compare_sregs() and compare_vcpu_events() have been empty since the test
was written, so the checks that req_and_verify_all_valid() and
set_and_verify_various() run after every KVM_RUN only ever compared the
general purpose registers. KVM could return anything at all in the sregs
and events halves of the kvm_run sync region and the test would still
pass.
Fill both in, in the style of compare_regs(): every field of struct
kvm_sregs, including the segment and descriptor table members and the
interrupt bitmap, and every field of struct kvm_vcpu_events. Both sides
of each comparison come from the same vCPU without it having run in
between, so they are expected to match exactly.
Assisted-by: Cursor:claude-opus-5
Signed-off-by: Hemanth Selam <hemanth.selam@gmail.com>
---
.../selftests/kvm/x86/sync_regs_test.c | 89 +++++++++++++++++++
1 file changed, 89 insertions(+)
diff --git a/tools/testing/selftests/kvm/x86/sync_regs_test.c b/tools/testing/selftests/kvm/x86/sync_regs_test.c
index ed0c21b427c9..c7d1f3cca16e 100644
--- a/tools/testing/selftests/kvm/x86/sync_regs_test.c
+++ b/tools/testing/selftests/kvm/x86/sync_regs_test.c
@@ -70,13 +70,102 @@ static void compare_regs(struct kvm_regs *left, struct kvm_regs *right)
#undef REG_COMPARE
}
+static void compare_segment(struct kvm_segment *left, struct kvm_segment *right,
+ const char *name)
+{
+#define SEG_COMPARE(field) \
+ TEST_ASSERT(left->field == right->field, \
+ "Segment %s." #field \
+ " values did not match: 0x%llx, 0x%llx", \
+ name, (unsigned long long)left->field, \
+ (unsigned long long)right->field)
+ SEG_COMPARE(base);
+ SEG_COMPARE(limit);
+ SEG_COMPARE(selector);
+ SEG_COMPARE(type);
+ SEG_COMPARE(present);
+ SEG_COMPARE(dpl);
+ SEG_COMPARE(db);
+ SEG_COMPARE(s);
+ SEG_COMPARE(l);
+ SEG_COMPARE(g);
+ SEG_COMPARE(avl);
+ SEG_COMPARE(unusable);
+#undef SEG_COMPARE
+}
+
+static void compare_dtable(struct kvm_dtable *left, struct kvm_dtable *right,
+ const char *name)
+{
+ TEST_ASSERT(left->base == right->base,
+ "Descriptor table %s.base values did not match: 0x%llx, 0x%llx",
+ name, left->base, right->base);
+ TEST_ASSERT(left->limit == right->limit,
+ "Descriptor table %s.limit values did not match: 0x%x, 0x%x",
+ name, left->limit, right->limit);
+}
+
static void compare_sregs(struct kvm_sregs *left, struct kvm_sregs *right)
{
+#define SREG_COMPARE(reg) \
+ TEST_ASSERT(left->reg == right->reg, \
+ "Register " #reg \
+ " values did not match: 0x%llx, 0x%llx", \
+ left->reg, right->reg)
+ compare_segment(&left->cs, &right->cs, "cs");
+ compare_segment(&left->ds, &right->ds, "ds");
+ compare_segment(&left->es, &right->es, "es");
+ compare_segment(&left->fs, &right->fs, "fs");
+ compare_segment(&left->gs, &right->gs, "gs");
+ compare_segment(&left->ss, &right->ss, "ss");
+ compare_segment(&left->tr, &right->tr, "tr");
+ compare_segment(&left->ldt, &right->ldt, "ldt");
+ compare_dtable(&left->gdt, &right->gdt, "gdt");
+ compare_dtable(&left->idt, &right->idt, "idt");
+ SREG_COMPARE(cr0);
+ SREG_COMPARE(cr2);
+ SREG_COMPARE(cr3);
+ SREG_COMPARE(cr4);
+ SREG_COMPARE(cr8);
+ SREG_COMPARE(efer);
+ SREG_COMPARE(apic_base);
+#undef SREG_COMPARE
+ TEST_ASSERT(!memcmp(left->interrupt_bitmap, right->interrupt_bitmap,
+ sizeof(left->interrupt_bitmap)),
+ "interrupt_bitmap values did not match");
}
static void compare_vcpu_events(struct kvm_vcpu_events *left,
struct kvm_vcpu_events *right)
{
+#define EVENT_COMPARE(field) \
+ TEST_ASSERT(left->field == right->field, \
+ "Event " #field \
+ " values did not match: 0x%llx, 0x%llx", \
+ (unsigned long long)left->field, \
+ (unsigned long long)right->field)
+ EVENT_COMPARE(exception.injected);
+ EVENT_COMPARE(exception.nr);
+ EVENT_COMPARE(exception.has_error_code);
+ EVENT_COMPARE(exception.pending);
+ EVENT_COMPARE(exception.error_code);
+ EVENT_COMPARE(interrupt.injected);
+ EVENT_COMPARE(interrupt.nr);
+ EVENT_COMPARE(interrupt.soft);
+ EVENT_COMPARE(interrupt.shadow);
+ EVENT_COMPARE(nmi.injected);
+ EVENT_COMPARE(nmi.pending);
+ EVENT_COMPARE(nmi.masked);
+ EVENT_COMPARE(sipi_vector);
+ EVENT_COMPARE(flags);
+ EVENT_COMPARE(smi.smm);
+ EVENT_COMPARE(smi.pending);
+ EVENT_COMPARE(smi.smm_inside_nmi);
+ EVENT_COMPARE(smi.latched_init);
+ EVENT_COMPARE(triple_fault.pending);
+ EVENT_COMPARE(exception_has_payload);
+ EVENT_COMPARE(exception_payload);
+#undef EVENT_COMPARE
}
#define TEST_SYNC_FIELDS (KVM_SYNC_X86_REGS|KVM_SYNC_X86_SREGS|KVM_SYNC_X86_EVENTS)
--
2.43.7
next prev parent reply other threads:[~2026-09-02 12:02 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-02 12:02 [PATCH 0/2] KVM: selftests: Verify sregs and events in sync_regs_test Hemanth Selam
2026-09-02 12:02 ` Hemanth Selam [this message]
2026-09-02 12:22 ` [PATCH 1/2] KVM: selftests: Actually compare " sashiko-bot
2026-09-03 6:17 ` Hemanth Selam
2026-09-02 12:02 ` [PATCH 2/2] KVM: selftests: Verify the events half of the sync regs region Hemanth Selam
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260902120235.18486-2-hemanth.selam@gmail.com \
--to=hemanth.selam@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=shuah@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.