lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20260120080013.2153519-28-anup.patel@oss.qualcomm.com>
Date: Tue, 20 Jan 2026 13:30:13 +0530
From: Anup Patel <anup.patel@....qualcomm.com>
To: Paolo Bonzini <pbonzini@...hat.com>, Atish Patra <atish.patra@...ux.dev>
Cc: Palmer Dabbelt <palmer@...belt.com>, Paul Walmsley <pjw@...nel.org>,
        Alexandre Ghiti <alex@...ti.fr>, Shuah Khan <shuah@...nel.org>,
        Anup Patel <anup@...infault.org>,
        Andrew Jones <andrew.jones@....qualcomm.com>,
        kvm-riscv@...ts.infradead.org, kvm@...r.kernel.org,
        linux-riscv@...ts.infradead.org, linux-kernel@...r.kernel.org,
        linux-kselftest@...r.kernel.org,
        Anup Patel <anup.patel@....qualcomm.com>
Subject: [PATCH 27/27] RISC-V: KVM: selftests: Add nested virt CSRs to get-reg-list test

The KVM RISC-V allows Guest/VM nested vitualization CSRs to be
accessed via ONE_REG so add this to get-reg-list test.

Signed-off-by: Anup Patel <anup.patel@....qualcomm.com>
---
 .../selftests/kvm/riscv/get-reg-list.c        | 103 +++++++++++++++++-
 1 file changed, 102 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/kvm/riscv/get-reg-list.c b/tools/testing/selftests/kvm/riscv/get-reg-list.c
index 53af7a453327..88dc08c611cd 100644
--- a/tools/testing/selftests/kvm/riscv/get-reg-list.c
+++ b/tools/testing/selftests/kvm/riscv/get-reg-list.c
@@ -327,6 +327,8 @@ static const char *core_id_to_str(const char *prefix, __u64 id)
 	"KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_REG(" #csr ")"
 #define RISCV_CSR_SMSTATEEN(csr) \
 	"KVM_REG_RISCV_CSR_SMSTATEEN | KVM_REG_RISCV_CSR_REG(" #csr ")"
+#define RISCV_CSR_HEXT(csr) \
+	"KVM_REG_RISCV_CSR_HEXT | KVM_REG_RISCV_CSR_REG(" #csr ")"
 
 static const char *general_csr_id_to_str(__u64 reg_off)
 {
@@ -394,6 +396,56 @@ static const char *smstateen_csr_id_to_str(__u64 reg_off)
 	return NULL;
 }
 
+static const char *hext_csr_id_to_str(__u64 reg_off)
+{
+	/* reg_off is the offset into struct kvm_riscv_hext_csr */
+	switch (reg_off) {
+	case KVM_REG_RISCV_CSR_HEXT_REG(hstatus):
+		return RISCV_CSR_HEXT(hstatus);
+	case KVM_REG_RISCV_CSR_HEXT_REG(hedeleg):
+		return RISCV_CSR_HEXT(hedeleg);
+	case KVM_REG_RISCV_CSR_HEXT_REG(hideleg):
+		return RISCV_CSR_HEXT(hideleg);
+	case KVM_REG_RISCV_CSR_HEXT_REG(hvip):
+		return RISCV_CSR_HEXT(hvip);
+	case KVM_REG_RISCV_CSR_HEXT_REG(hcounteren):
+		return RISCV_CSR_HEXT(hcounteren);
+	case KVM_REG_RISCV_CSR_HEXT_REG(htimedelta):
+		return RISCV_CSR_HEXT(htimedelta);
+	case KVM_REG_RISCV_CSR_HEXT_REG(htimedeltah):
+		return RISCV_CSR_HEXT(htimedeltah);
+	case KVM_REG_RISCV_CSR_HEXT_REG(htval):
+		return RISCV_CSR_HEXT(htval);
+	case KVM_REG_RISCV_CSR_HEXT_REG(htinst):
+		return RISCV_CSR_HEXT(htinst);
+	case KVM_REG_RISCV_CSR_HEXT_REG(henvcfg):
+		return RISCV_CSR_HEXT(henvcfg);
+	case KVM_REG_RISCV_CSR_HEXT_REG(henvcfgh):
+		return RISCV_CSR_HEXT(henvcfgh);
+	case KVM_REG_RISCV_CSR_HEXT_REG(hgatp):
+		return RISCV_CSR_HEXT(hgatp);
+	case KVM_REG_RISCV_CSR_HEXT_REG(vsstatus):
+		return RISCV_CSR_HEXT(vsstatus);
+	case KVM_REG_RISCV_CSR_HEXT_REG(vsie):
+		return RISCV_CSR_HEXT(vsie);
+	case KVM_REG_RISCV_CSR_HEXT_REG(vstvec):
+		return RISCV_CSR_HEXT(vstvec);
+	case KVM_REG_RISCV_CSR_HEXT_REG(vsscratch):
+		return RISCV_CSR_HEXT(vsscratch);
+	case KVM_REG_RISCV_CSR_HEXT_REG(vsepc):
+		return RISCV_CSR_HEXT(vsepc);
+	case KVM_REG_RISCV_CSR_HEXT_REG(vscause):
+		return RISCV_CSR_HEXT(vscause);
+	case KVM_REG_RISCV_CSR_HEXT_REG(vstval):
+		return RISCV_CSR_HEXT(vstval);
+	case KVM_REG_RISCV_CSR_HEXT_REG(vsatp):
+		return RISCV_CSR_HEXT(vsatp);
+	}
+
+	TEST_FAIL("Unknown h-extension csr reg: 0x%llx", reg_off);
+	return NULL;
+}
+
 static const char *csr_id_to_str(const char *prefix, __u64 id)
 {
 	__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_CSR);
@@ -410,6 +462,8 @@ static const char *csr_id_to_str(const char *prefix, __u64 id)
 		return aia_csr_id_to_str(reg_off);
 	case KVM_REG_RISCV_CSR_SMSTATEEN:
 		return smstateen_csr_id_to_str(reg_off);
+	case KVM_REG_RISCV_CSR_HEXT:
+		return hext_csr_id_to_str(reg_off);
 	}
 
 	return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off);
@@ -941,6 +995,51 @@ static __u64 smstateen_regs[] = {
 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SMSTATEEN,
 };
 
+static __u64 h_regs[] = {
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(hstatus),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(hedeleg),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(hideleg),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(hvip),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(hcounteren),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(htimedelta),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(htimedeltah),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(htval),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(htinst),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(henvcfg),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(henvcfgh),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(hgatp),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(vsstatus),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(vsie),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(vstvec),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(vsscratch),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(vsepc),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(vscause),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(vstval),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_HEXT |
+	KVM_REG_RISCV_CSR_HEXT_REG(vsatp),
+	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE |
+	KVM_RISCV_ISA_EXT_H,
+};
+
 static __u64 fp_f_regs[] = {
 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[0]),
 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[1]),
@@ -1079,6 +1178,8 @@ static __u64 vector_regs[] = {
 	{"aia", .feature = KVM_RISCV_ISA_EXT_SSAIA, .regs = aia_regs, .regs_n = ARRAY_SIZE(aia_regs),}
 #define SUBLIST_SMSTATEEN \
 	{"smstateen", .feature = KVM_RISCV_ISA_EXT_SMSTATEEN, .regs = smstateen_regs, .regs_n = ARRAY_SIZE(smstateen_regs),}
+#define SUBLIST_H \
+	{"h", .feature = KVM_RISCV_ISA_EXT_H, .regs = h_regs, .regs_n = ARRAY_SIZE(h_regs),}
 #define SUBLIST_FP_F \
 	{"fp_f", .feature = KVM_RISCV_ISA_EXT_F, .regs = fp_f_regs, \
 		.regs_n = ARRAY_SIZE(fp_f_regs),}
@@ -1160,7 +1261,7 @@ KVM_ISA_EXT_SUBLIST_CONFIG(aia, AIA);
 KVM_ISA_EXT_SUBLIST_CONFIG(fp_f, FP_F);
 KVM_ISA_EXT_SUBLIST_CONFIG(fp_d, FP_D);
 KVM_ISA_EXT_SUBLIST_CONFIG(v, V);
-KVM_ISA_EXT_SIMPLE_CONFIG(h, H);
+KVM_ISA_EXT_SUBLIST_CONFIG(h, H);
 KVM_ISA_EXT_SIMPLE_CONFIG(smnpm, SMNPM);
 KVM_ISA_EXT_SUBLIST_CONFIG(smstateen, SMSTATEEN);
 KVM_ISA_EXT_SIMPLE_CONFIG(sscofpmf, SSCOFPMF);
-- 
2.43.0


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ