Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

RISC-V: KVM: Prevent HGATP_MODE_BARE passed

Current kvm_riscv_gstage_mode_detect() assumes H-extension must
have HGATP_MODE_SV39X4/SV32X4 at least, but the spec allows
H-extension with HGATP_MODE_BARE alone. The KVM depends on
!HGATP_MODE_BARE at least, so enhance the gstage-mode-detect
to block HGATP_MODE_BARE.

Move gstage-mode-check closer to gstage-mode-detect to prevent
unnecessary init.

Reviewed-by: Troy Mitchell <troy.mitchell@linux.dev>
Reviewed-by: Nutty Liu <nutty.liu@hotmail.com>
Signed-off-by: Guo Ren (Alibaba DAMO Academy) <guoren@kernel.org>
Reviewed-by: Fangyu Yu <fangyu.yu@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250821142542.2472079-4-guoren@kernel.org
Signed-off-by: Anup Patel <anup@brainfault.org>

authored by

Guo Ren (Alibaba DAMO Academy) and committed by
Anup Patel
b8d13949 9eac3744

+41 -19
+24 -3
arch/riscv/kvm/gstage.c
··· 321 321 if ((csr_read(CSR_HGATP) >> HGATP_MODE_SHIFT) == HGATP_MODE_SV57X4) { 322 322 kvm_riscv_gstage_mode = HGATP_MODE_SV57X4; 323 323 kvm_riscv_gstage_pgd_levels = 5; 324 - goto skip_sv48x4_test; 324 + goto done; 325 325 } 326 326 327 327 /* Try Sv48x4 G-stage mode */ ··· 329 329 if ((csr_read(CSR_HGATP) >> HGATP_MODE_SHIFT) == HGATP_MODE_SV48X4) { 330 330 kvm_riscv_gstage_mode = HGATP_MODE_SV48X4; 331 331 kvm_riscv_gstage_pgd_levels = 4; 332 + goto done; 332 333 } 333 - skip_sv48x4_test: 334 334 335 + /* Try Sv39x4 G-stage mode */ 336 + csr_write(CSR_HGATP, HGATP_MODE_SV39X4 << HGATP_MODE_SHIFT); 337 + if ((csr_read(CSR_HGATP) >> HGATP_MODE_SHIFT) == HGATP_MODE_SV39X4) { 338 + kvm_riscv_gstage_mode = HGATP_MODE_SV39X4; 339 + kvm_riscv_gstage_pgd_levels = 3; 340 + goto done; 341 + } 342 + #else /* CONFIG_32BIT */ 343 + /* Try Sv32x4 G-stage mode */ 344 + csr_write(CSR_HGATP, HGATP_MODE_SV32X4 << HGATP_MODE_SHIFT); 345 + if ((csr_read(CSR_HGATP) >> HGATP_MODE_SHIFT) == HGATP_MODE_SV32X4) { 346 + kvm_riscv_gstage_mode = HGATP_MODE_SV32X4; 347 + kvm_riscv_gstage_pgd_levels = 2; 348 + goto done; 349 + } 350 + #endif 351 + 352 + /* KVM depends on !HGATP_MODE_OFF */ 353 + kvm_riscv_gstage_mode = HGATP_MODE_OFF; 354 + kvm_riscv_gstage_pgd_levels = 0; 355 + 356 + done: 335 357 csr_write(CSR_HGATP, 0); 336 358 kvm_riscv_local_hfence_gvma_all(); 337 - #endif 338 359 }
+17 -16
arch/riscv/kvm/main.c
··· 93 93 return rc; 94 94 95 95 kvm_riscv_gstage_mode_detect(); 96 + switch (kvm_riscv_gstage_mode) { 97 + case HGATP_MODE_SV32X4: 98 + str = "Sv32x4"; 99 + break; 100 + case HGATP_MODE_SV39X4: 101 + str = "Sv39x4"; 102 + break; 103 + case HGATP_MODE_SV48X4: 104 + str = "Sv48x4"; 105 + break; 106 + case HGATP_MODE_SV57X4: 107 + str = "Sv57x4"; 108 + break; 109 + default: 110 + kvm_riscv_nacl_exit(); 111 + return -ENODEV; 112 + } 96 113 97 114 kvm_riscv_gstage_vmid_detect(); 98 115 ··· 152 135 (rc) ? slist : "no features"); 153 136 } 154 137 155 - switch (kvm_riscv_gstage_mode) { 156 - case HGATP_MODE_SV32X4: 157 - str = "Sv32x4"; 158 - break; 159 - case HGATP_MODE_SV39X4: 160 - str = "Sv39x4"; 161 - break; 162 - case HGATP_MODE_SV48X4: 163 - str = "Sv48x4"; 164 - break; 165 - case HGATP_MODE_SV57X4: 166 - str = "Sv57x4"; 167 - break; 168 - default: 169 - return -ENODEV; 170 - } 171 138 kvm_info("using %s G-stage page table format\n", str); 172 139 173 140 kvm_info("VMID %ld bits available\n", kvm_riscv_gstage_vmid_bits());