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-18-anup.patel@oss.qualcomm.com>
Date: Tue, 20 Jan 2026 13:30:03 +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 17/27] RISC-V: KVM: Extend kvm_riscv_isa_check_host() for nested virt

Nested virtualization for various ISA extensions will be enabled
gradually so extend kvm_riscv_isa_check_host() such that certain
ISA extensions can be disabled when nested virtualization is
available.

Signed-off-by: Anup Patel <anup.patel@....qualcomm.com>
---
 arch/riscv/kvm/isa.c | 178 ++++++++++++++++++++++---------------------
 1 file changed, 93 insertions(+), 85 deletions(-)

diff --git a/arch/riscv/kvm/isa.c b/arch/riscv/kvm/isa.c
index 1566d01fc52e..e469c350f5bb 100644
--- a/arch/riscv/kvm/isa.c
+++ b/arch/riscv/kvm/isa.c
@@ -10,91 +10,96 @@
 #include <asm/kvm_isa.h>
 #include <asm/vector.h>
 
-#define KVM_ISA_EXT_ARR(ext)		\
-[KVM_RISCV_ISA_EXT_##ext] = RISCV_ISA_EXT_##ext
+struct kvm_isa_ext {
+	unsigned long ext;
+	bool nested;
+};
+
+#define KVM_ISA_EXT_ARR(ext, nested)		\
+[KVM_RISCV_ISA_EXT_##ext] = { RISCV_ISA_EXT_##ext, nested }
 
 /* Mapping between KVM ISA Extension ID & guest ISA extension ID */
-static const unsigned long kvm_isa_ext_arr[] = {
+static const struct kvm_isa_ext kvm_isa_ext_arr[] = {
 	/* Single letter extensions (alphabetically sorted) */
-	[KVM_RISCV_ISA_EXT_A] = RISCV_ISA_EXT_a,
-	[KVM_RISCV_ISA_EXT_C] = RISCV_ISA_EXT_c,
-	[KVM_RISCV_ISA_EXT_D] = RISCV_ISA_EXT_d,
-	[KVM_RISCV_ISA_EXT_F] = RISCV_ISA_EXT_f,
-	[KVM_RISCV_ISA_EXT_H] = RISCV_ISA_EXT_h,
-	[KVM_RISCV_ISA_EXT_I] = RISCV_ISA_EXT_i,
-	[KVM_RISCV_ISA_EXT_M] = RISCV_ISA_EXT_m,
-	[KVM_RISCV_ISA_EXT_V] = RISCV_ISA_EXT_v,
+	[KVM_RISCV_ISA_EXT_A] = { RISCV_ISA_EXT_a, true },
+	[KVM_RISCV_ISA_EXT_C] = { RISCV_ISA_EXT_c, true },
+	[KVM_RISCV_ISA_EXT_D] = { RISCV_ISA_EXT_d, true },
+	[KVM_RISCV_ISA_EXT_F] = { RISCV_ISA_EXT_f, true },
+	[KVM_RISCV_ISA_EXT_H] = { RISCV_ISA_EXT_h, true },
+	[KVM_RISCV_ISA_EXT_I] = { RISCV_ISA_EXT_i, true },
+	[KVM_RISCV_ISA_EXT_M] = { RISCV_ISA_EXT_m, true },
+	[KVM_RISCV_ISA_EXT_V] = { RISCV_ISA_EXT_v, true },
 	/* Multi letter extensions (alphabetically sorted) */
-	KVM_ISA_EXT_ARR(SMNPM),
-	KVM_ISA_EXT_ARR(SMSTATEEN),
-	KVM_ISA_EXT_ARR(SSAIA),
-	KVM_ISA_EXT_ARR(SSCOFPMF),
-	KVM_ISA_EXT_ARR(SSNPM),
-	KVM_ISA_EXT_ARR(SSTC),
-	KVM_ISA_EXT_ARR(SVADE),
-	KVM_ISA_EXT_ARR(SVADU),
-	KVM_ISA_EXT_ARR(SVINVAL),
-	KVM_ISA_EXT_ARR(SVNAPOT),
-	KVM_ISA_EXT_ARR(SVPBMT),
-	KVM_ISA_EXT_ARR(SVVPTC),
-	KVM_ISA_EXT_ARR(ZAAMO),
-	KVM_ISA_EXT_ARR(ZABHA),
-	KVM_ISA_EXT_ARR(ZACAS),
-	KVM_ISA_EXT_ARR(ZALASR),
-	KVM_ISA_EXT_ARR(ZALRSC),
-	KVM_ISA_EXT_ARR(ZAWRS),
-	KVM_ISA_EXT_ARR(ZBA),
-	KVM_ISA_EXT_ARR(ZBB),
-	KVM_ISA_EXT_ARR(ZBC),
-	KVM_ISA_EXT_ARR(ZBKB),
-	KVM_ISA_EXT_ARR(ZBKC),
-	KVM_ISA_EXT_ARR(ZBKX),
-	KVM_ISA_EXT_ARR(ZBS),
-	KVM_ISA_EXT_ARR(ZCA),
-	KVM_ISA_EXT_ARR(ZCB),
-	KVM_ISA_EXT_ARR(ZCD),
-	KVM_ISA_EXT_ARR(ZCF),
-	KVM_ISA_EXT_ARR(ZCLSD),
-	KVM_ISA_EXT_ARR(ZCMOP),
-	KVM_ISA_EXT_ARR(ZFA),
-	KVM_ISA_EXT_ARR(ZFBFMIN),
-	KVM_ISA_EXT_ARR(ZFH),
-	KVM_ISA_EXT_ARR(ZFHMIN),
-	KVM_ISA_EXT_ARR(ZICBOM),
-	KVM_ISA_EXT_ARR(ZICBOP),
-	KVM_ISA_EXT_ARR(ZICBOZ),
-	KVM_ISA_EXT_ARR(ZICCRSE),
-	KVM_ISA_EXT_ARR(ZICNTR),
-	KVM_ISA_EXT_ARR(ZICOND),
-	KVM_ISA_EXT_ARR(ZICSR),
-	KVM_ISA_EXT_ARR(ZIFENCEI),
-	KVM_ISA_EXT_ARR(ZIHINTNTL),
-	KVM_ISA_EXT_ARR(ZIHINTPAUSE),
-	KVM_ISA_EXT_ARR(ZIHPM),
-	KVM_ISA_EXT_ARR(ZILSD),
-	KVM_ISA_EXT_ARR(ZIMOP),
-	KVM_ISA_EXT_ARR(ZKND),
-	KVM_ISA_EXT_ARR(ZKNE),
-	KVM_ISA_EXT_ARR(ZKNH),
-	KVM_ISA_EXT_ARR(ZKR),
-	KVM_ISA_EXT_ARR(ZKSED),
-	KVM_ISA_EXT_ARR(ZKSH),
-	KVM_ISA_EXT_ARR(ZKT),
-	KVM_ISA_EXT_ARR(ZTSO),
-	KVM_ISA_EXT_ARR(ZVBB),
-	KVM_ISA_EXT_ARR(ZVBC),
-	KVM_ISA_EXT_ARR(ZVFBFMIN),
-	KVM_ISA_EXT_ARR(ZVFBFWMA),
-	KVM_ISA_EXT_ARR(ZVFH),
-	KVM_ISA_EXT_ARR(ZVFHMIN),
-	KVM_ISA_EXT_ARR(ZVKB),
-	KVM_ISA_EXT_ARR(ZVKG),
-	KVM_ISA_EXT_ARR(ZVKNED),
-	KVM_ISA_EXT_ARR(ZVKNHA),
-	KVM_ISA_EXT_ARR(ZVKNHB),
-	KVM_ISA_EXT_ARR(ZVKSED),
-	KVM_ISA_EXT_ARR(ZVKSH),
-	KVM_ISA_EXT_ARR(ZVKT),
+	KVM_ISA_EXT_ARR(SMNPM, false),
+	KVM_ISA_EXT_ARR(SMSTATEEN, false),
+	KVM_ISA_EXT_ARR(SSAIA, false),
+	KVM_ISA_EXT_ARR(SSCOFPMF, false),
+	KVM_ISA_EXT_ARR(SSNPM, false),
+	KVM_ISA_EXT_ARR(SSTC, false),
+	KVM_ISA_EXT_ARR(SVADE, true),
+	KVM_ISA_EXT_ARR(SVADU, true),
+	KVM_ISA_EXT_ARR(SVINVAL, false),
+	KVM_ISA_EXT_ARR(SVNAPOT, false),
+	KVM_ISA_EXT_ARR(SVPBMT, false),
+	KVM_ISA_EXT_ARR(SVVPTC, true),
+	KVM_ISA_EXT_ARR(ZAAMO, true),
+	KVM_ISA_EXT_ARR(ZABHA, true),
+	KVM_ISA_EXT_ARR(ZACAS, true),
+	KVM_ISA_EXT_ARR(ZALASR, true),
+	KVM_ISA_EXT_ARR(ZALRSC, true),
+	KVM_ISA_EXT_ARR(ZAWRS, false),
+	KVM_ISA_EXT_ARR(ZBA, true),
+	KVM_ISA_EXT_ARR(ZBB, true),
+	KVM_ISA_EXT_ARR(ZBC, true),
+	KVM_ISA_EXT_ARR(ZBKB, true),
+	KVM_ISA_EXT_ARR(ZBKC, true),
+	KVM_ISA_EXT_ARR(ZBKX, true),
+	KVM_ISA_EXT_ARR(ZBS, true),
+	KVM_ISA_EXT_ARR(ZCA, true),
+	KVM_ISA_EXT_ARR(ZCB, true),
+	KVM_ISA_EXT_ARR(ZCD, true),
+	KVM_ISA_EXT_ARR(ZCF, true),
+	KVM_ISA_EXT_ARR(ZCLSD, true),
+	KVM_ISA_EXT_ARR(ZCMOP, true),
+	KVM_ISA_EXT_ARR(ZFA, true),
+	KVM_ISA_EXT_ARR(ZFBFMIN, true),
+	KVM_ISA_EXT_ARR(ZFH, true),
+	KVM_ISA_EXT_ARR(ZFHMIN, true),
+	KVM_ISA_EXT_ARR(ZICBOM, false),
+	KVM_ISA_EXT_ARR(ZICBOP, false),
+	KVM_ISA_EXT_ARR(ZICBOZ, false),
+	KVM_ISA_EXT_ARR(ZICCRSE, true),
+	KVM_ISA_EXT_ARR(ZICNTR, true),
+	KVM_ISA_EXT_ARR(ZICOND, true),
+	KVM_ISA_EXT_ARR(ZICSR, true),
+	KVM_ISA_EXT_ARR(ZIFENCEI, true),
+	KVM_ISA_EXT_ARR(ZIHINTNTL, true),
+	KVM_ISA_EXT_ARR(ZIHINTPAUSE, true),
+	KVM_ISA_EXT_ARR(ZIHPM, true),
+	KVM_ISA_EXT_ARR(ZILSD, true),
+	KVM_ISA_EXT_ARR(ZIMOP, true),
+	KVM_ISA_EXT_ARR(ZKND, true),
+	KVM_ISA_EXT_ARR(ZKNE, true),
+	KVM_ISA_EXT_ARR(ZKNH, true),
+	KVM_ISA_EXT_ARR(ZKR, true),
+	KVM_ISA_EXT_ARR(ZKSED, true),
+	KVM_ISA_EXT_ARR(ZKSH, true),
+	KVM_ISA_EXT_ARR(ZKT, true),
+	KVM_ISA_EXT_ARR(ZTSO, true),
+	KVM_ISA_EXT_ARR(ZVBB, true),
+	KVM_ISA_EXT_ARR(ZVBC, true),
+	KVM_ISA_EXT_ARR(ZVFBFMIN, true),
+	KVM_ISA_EXT_ARR(ZVFBFWMA, true),
+	KVM_ISA_EXT_ARR(ZVFH, true),
+	KVM_ISA_EXT_ARR(ZVFHMIN, true),
+	KVM_ISA_EXT_ARR(ZVKB, true),
+	KVM_ISA_EXT_ARR(ZVKG, true),
+	KVM_ISA_EXT_ARR(ZVKNED, true),
+	KVM_ISA_EXT_ARR(ZVKNHA, true),
+	KVM_ISA_EXT_ARR(ZVKNHB, true),
+	KVM_ISA_EXT_ARR(ZVKSED, true),
+	KVM_ISA_EXT_ARR(ZVKSH, true),
+	KVM_ISA_EXT_ARR(ZVKT, true),
 };
 
 unsigned long kvm_riscv_base2isa_ext(unsigned long base_ext)
@@ -102,7 +107,7 @@ unsigned long kvm_riscv_base2isa_ext(unsigned long base_ext)
 	unsigned long i;
 
 	for (i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) {
-		if (kvm_isa_ext_arr[i] == base_ext)
+		if (kvm_isa_ext_arr[i].ext == base_ext)
 			return i;
 	}
 
@@ -117,7 +122,10 @@ int __kvm_riscv_isa_check_host(unsigned long ext, unsigned long *base_ext)
 	    ext >= ARRAY_SIZE(kvm_isa_ext_arr))
 		return -ENOENT;
 
-	switch (kvm_isa_ext_arr[ext]) {
+	if (kvm_riscv_nested_available() && !kvm_isa_ext_arr[ext].nested)
+		return -ENOENT;
+
+	switch (kvm_isa_ext_arr[ext].ext) {
 	case RISCV_ISA_EXT_SMNPM:
 		/*
 		 * Pointer masking effective in (H)S-mode is provided by the
@@ -128,7 +136,7 @@ int __kvm_riscv_isa_check_host(unsigned long ext, unsigned long *base_ext)
 		host_ext = RISCV_ISA_EXT_SSNPM;
 		break;
 	default:
-		host_ext = kvm_isa_ext_arr[ext];
+		host_ext = kvm_isa_ext_arr[ext].ext;
 		break;
 	}
 
@@ -136,7 +144,7 @@ int __kvm_riscv_isa_check_host(unsigned long ext, unsigned long *base_ext)
 		return -ENOENT;
 
 	if (base_ext)
-		*base_ext = kvm_isa_ext_arr[ext];
+		*base_ext = kvm_isa_ext_arr[ext].ext;
 
 	return 0;
 }
-- 
2.43.0


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ