1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2019 Western Digital Corporation or its affiliates.
4 * Copyright (C) 2023 Ventana Micro Systems Inc.
10 #include <linux/bitops.h>
11 #include <linux/errno.h>
12 #include <linux/err.h>
13 #include <linux/uaccess.h>
14 #include <linux/kvm_host.h>
15 #include <asm/cacheflush.h>
16 #include <asm/cpufeature.h>
17 #include <asm/kvm_vcpu_vector.h>
18 #include <asm/pgtable.h>
19 #include <asm/vector.h>
21 #define KVM_RISCV_BASE_ISA_MASK GENMASK(25, 0)
23 #define KVM_ISA_EXT_ARR(ext) \
24 [KVM_RISCV_ISA_EXT_##ext] = RISCV_ISA_EXT_##ext
26 /* Mapping between KVM ISA Extension ID & Host ISA extension ID */
27 static const unsigned long kvm_isa_ext_arr[] = {
28 /* Single letter extensions (alphabetically sorted) */
29 [KVM_RISCV_ISA_EXT_A] = RISCV_ISA_EXT_a,
30 [KVM_RISCV_ISA_EXT_C] = RISCV_ISA_EXT_c,
31 [KVM_RISCV_ISA_EXT_D] = RISCV_ISA_EXT_d,
32 [KVM_RISCV_ISA_EXT_F] = RISCV_ISA_EXT_f,
33 [KVM_RISCV_ISA_EXT_H] = RISCV_ISA_EXT_h,
34 [KVM_RISCV_ISA_EXT_I] = RISCV_ISA_EXT_i,
35 [KVM_RISCV_ISA_EXT_M] = RISCV_ISA_EXT_m,
36 [KVM_RISCV_ISA_EXT_V] = RISCV_ISA_EXT_v,
37 /* Multi letter extensions (alphabetically sorted) */
38 [KVM_RISCV_ISA_EXT_SMNPM] = RISCV_ISA_EXT_SSNPM,
39 KVM_ISA_EXT_ARR(SMSTATEEN),
40 KVM_ISA_EXT_ARR(SSAIA),
41 KVM_ISA_EXT_ARR(SSCOFPMF),
42 KVM_ISA_EXT_ARR(SSNPM),
43 KVM_ISA_EXT_ARR(SSTC),
44 KVM_ISA_EXT_ARR(SVADE),
45 KVM_ISA_EXT_ARR(SVADU),
46 KVM_ISA_EXT_ARR(SVINVAL),
47 KVM_ISA_EXT_ARR(SVNAPOT),
48 KVM_ISA_EXT_ARR(SVPBMT),
49 KVM_ISA_EXT_ARR(ZACAS),
50 KVM_ISA_EXT_ARR(ZAWRS),
54 KVM_ISA_EXT_ARR(ZBKB),
55 KVM_ISA_EXT_ARR(ZBKC),
56 KVM_ISA_EXT_ARR(ZBKX),
62 KVM_ISA_EXT_ARR(ZCMOP),
65 KVM_ISA_EXT_ARR(ZFHMIN),
66 KVM_ISA_EXT_ARR(ZICBOM),
67 KVM_ISA_EXT_ARR(ZICBOZ),
68 KVM_ISA_EXT_ARR(ZICNTR),
69 KVM_ISA_EXT_ARR(ZICOND),
70 KVM_ISA_EXT_ARR(ZICSR),
71 KVM_ISA_EXT_ARR(ZIFENCEI),
72 KVM_ISA_EXT_ARR(ZIHINTNTL),
73 KVM_ISA_EXT_ARR(ZIHINTPAUSE),
74 KVM_ISA_EXT_ARR(ZIHPM),
75 KVM_ISA_EXT_ARR(ZIMOP),
76 KVM_ISA_EXT_ARR(ZKND),
77 KVM_ISA_EXT_ARR(ZKNE),
78 KVM_ISA_EXT_ARR(ZKNH),
80 KVM_ISA_EXT_ARR(ZKSED),
81 KVM_ISA_EXT_ARR(ZKSH),
83 KVM_ISA_EXT_ARR(ZTSO),
84 KVM_ISA_EXT_ARR(ZVBB),
85 KVM_ISA_EXT_ARR(ZVBC),
86 KVM_ISA_EXT_ARR(ZVFH),
87 KVM_ISA_EXT_ARR(ZVFHMIN),
88 KVM_ISA_EXT_ARR(ZVKB),
89 KVM_ISA_EXT_ARR(ZVKG),
90 KVM_ISA_EXT_ARR(ZVKNED),
91 KVM_ISA_EXT_ARR(ZVKNHA),
92 KVM_ISA_EXT_ARR(ZVKNHB),
93 KVM_ISA_EXT_ARR(ZVKSED),
94 KVM_ISA_EXT_ARR(ZVKSH),
95 KVM_ISA_EXT_ARR(ZVKT),
98 static unsigned long kvm_riscv_vcpu_base2isa_ext(unsigned long base_ext)
102 for (i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) {
103 if (kvm_isa_ext_arr[i] == base_ext)
107 return KVM_RISCV_ISA_EXT_MAX;
110 static bool kvm_riscv_vcpu_isa_enable_allowed(unsigned long ext)
113 case KVM_RISCV_ISA_EXT_H:
115 case KVM_RISCV_ISA_EXT_SSCOFPMF:
116 /* Sscofpmf depends on interrupt filtering defined in ssaia */
117 return __riscv_isa_extension_available(NULL, RISCV_ISA_EXT_SSAIA);
118 case KVM_RISCV_ISA_EXT_SVADU:
120 * The henvcfg.ADUE is read-only zero if menvcfg.ADUE is zero.
121 * Guest OS can use Svadu only when host OS enable Svadu.
123 return arch_has_hw_pte_young();
124 case KVM_RISCV_ISA_EXT_V:
125 return riscv_v_vstate_ctrl_user_allowed();
133 static bool kvm_riscv_vcpu_isa_disable_allowed(unsigned long ext)
136 /* Extensions which don't have any mechanism to disable */
137 case KVM_RISCV_ISA_EXT_A:
138 case KVM_RISCV_ISA_EXT_C:
139 case KVM_RISCV_ISA_EXT_I:
140 case KVM_RISCV_ISA_EXT_M:
141 case KVM_RISCV_ISA_EXT_SMNPM:
142 /* There is not architectural config bit to disable sscofpmf completely */
143 case KVM_RISCV_ISA_EXT_SSCOFPMF:
144 case KVM_RISCV_ISA_EXT_SSNPM:
145 case KVM_RISCV_ISA_EXT_SSTC:
146 case KVM_RISCV_ISA_EXT_SVINVAL:
147 case KVM_RISCV_ISA_EXT_SVNAPOT:
148 case KVM_RISCV_ISA_EXT_ZACAS:
149 case KVM_RISCV_ISA_EXT_ZAWRS:
150 case KVM_RISCV_ISA_EXT_ZBA:
151 case KVM_RISCV_ISA_EXT_ZBB:
152 case KVM_RISCV_ISA_EXT_ZBC:
153 case KVM_RISCV_ISA_EXT_ZBKB:
154 case KVM_RISCV_ISA_EXT_ZBKC:
155 case KVM_RISCV_ISA_EXT_ZBKX:
156 case KVM_RISCV_ISA_EXT_ZBS:
157 case KVM_RISCV_ISA_EXT_ZCA:
158 case KVM_RISCV_ISA_EXT_ZCB:
159 case KVM_RISCV_ISA_EXT_ZCD:
160 case KVM_RISCV_ISA_EXT_ZCF:
161 case KVM_RISCV_ISA_EXT_ZCMOP:
162 case KVM_RISCV_ISA_EXT_ZFA:
163 case KVM_RISCV_ISA_EXT_ZFH:
164 case KVM_RISCV_ISA_EXT_ZFHMIN:
165 case KVM_RISCV_ISA_EXT_ZICNTR:
166 case KVM_RISCV_ISA_EXT_ZICOND:
167 case KVM_RISCV_ISA_EXT_ZICSR:
168 case KVM_RISCV_ISA_EXT_ZIFENCEI:
169 case KVM_RISCV_ISA_EXT_ZIHINTNTL:
170 case KVM_RISCV_ISA_EXT_ZIHINTPAUSE:
171 case KVM_RISCV_ISA_EXT_ZIHPM:
172 case KVM_RISCV_ISA_EXT_ZIMOP:
173 case KVM_RISCV_ISA_EXT_ZKND:
174 case KVM_RISCV_ISA_EXT_ZKNE:
175 case KVM_RISCV_ISA_EXT_ZKNH:
176 case KVM_RISCV_ISA_EXT_ZKR:
177 case KVM_RISCV_ISA_EXT_ZKSED:
178 case KVM_RISCV_ISA_EXT_ZKSH:
179 case KVM_RISCV_ISA_EXT_ZKT:
180 case KVM_RISCV_ISA_EXT_ZTSO:
181 case KVM_RISCV_ISA_EXT_ZVBB:
182 case KVM_RISCV_ISA_EXT_ZVBC:
183 case KVM_RISCV_ISA_EXT_ZVFH:
184 case KVM_RISCV_ISA_EXT_ZVFHMIN:
185 case KVM_RISCV_ISA_EXT_ZVKB:
186 case KVM_RISCV_ISA_EXT_ZVKG:
187 case KVM_RISCV_ISA_EXT_ZVKNED:
188 case KVM_RISCV_ISA_EXT_ZVKNHA:
189 case KVM_RISCV_ISA_EXT_ZVKNHB:
190 case KVM_RISCV_ISA_EXT_ZVKSED:
191 case KVM_RISCV_ISA_EXT_ZVKSH:
192 case KVM_RISCV_ISA_EXT_ZVKT:
194 /* Extensions which can be disabled using Smstateen */
195 case KVM_RISCV_ISA_EXT_SSAIA:
196 return riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN);
197 case KVM_RISCV_ISA_EXT_SVADE:
199 * The henvcfg.ADUE is read-only zero if menvcfg.ADUE is zero.
200 * Svade is not allowed to disable when the platform use Svade.
202 return arch_has_hw_pte_young();
210 void kvm_riscv_vcpu_setup_isa(struct kvm_vcpu *vcpu)
212 unsigned long host_isa, i;
214 for (i = 0; i < ARRAY_SIZE(kvm_isa_ext_arr); i++) {
215 host_isa = kvm_isa_ext_arr[i];
216 if (__riscv_isa_extension_available(NULL, host_isa) &&
217 kvm_riscv_vcpu_isa_enable_allowed(i))
218 set_bit(host_isa, vcpu->arch.isa);
222 static int kvm_riscv_vcpu_get_reg_config(struct kvm_vcpu *vcpu,
223 const struct kvm_one_reg *reg)
225 unsigned long __user *uaddr =
226 (unsigned long __user *)(unsigned long)reg->addr;
227 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
229 KVM_REG_RISCV_CONFIG);
230 unsigned long reg_val;
232 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
236 case KVM_REG_RISCV_CONFIG_REG(isa):
237 reg_val = vcpu->arch.isa[0] & KVM_RISCV_BASE_ISA_MASK;
239 case KVM_REG_RISCV_CONFIG_REG(zicbom_block_size):
240 if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOM))
242 reg_val = riscv_cbom_block_size;
244 case KVM_REG_RISCV_CONFIG_REG(zicboz_block_size):
245 if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOZ))
247 reg_val = riscv_cboz_block_size;
249 case KVM_REG_RISCV_CONFIG_REG(mvendorid):
250 reg_val = vcpu->arch.mvendorid;
252 case KVM_REG_RISCV_CONFIG_REG(marchid):
253 reg_val = vcpu->arch.marchid;
255 case KVM_REG_RISCV_CONFIG_REG(mimpid):
256 reg_val = vcpu->arch.mimpid;
258 case KVM_REG_RISCV_CONFIG_REG(satp_mode):
259 reg_val = satp_mode >> SATP_MODE_SHIFT;
265 if (copy_to_user(uaddr, ®_val, KVM_REG_SIZE(reg->id)))
271 static int kvm_riscv_vcpu_set_reg_config(struct kvm_vcpu *vcpu,
272 const struct kvm_one_reg *reg)
274 unsigned long __user *uaddr =
275 (unsigned long __user *)(unsigned long)reg->addr;
276 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
278 KVM_REG_RISCV_CONFIG);
279 unsigned long i, isa_ext, reg_val;
281 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
284 if (copy_from_user(®_val, uaddr, KVM_REG_SIZE(reg->id)))
288 case KVM_REG_RISCV_CONFIG_REG(isa):
290 * This ONE REG interface is only defined for
291 * single letter extensions.
293 if (fls(reg_val) >= RISCV_ISA_EXT_BASE)
297 * Return early (i.e. do nothing) if reg_val is the same
298 * value retrievable via kvm_riscv_vcpu_get_reg_config().
300 if (reg_val == (vcpu->arch.isa[0] & KVM_RISCV_BASE_ISA_MASK))
303 if (!vcpu->arch.ran_atleast_once) {
304 /* Ignore the enable/disable request for certain extensions */
305 for (i = 0; i < RISCV_ISA_EXT_BASE; i++) {
306 isa_ext = kvm_riscv_vcpu_base2isa_ext(i);
307 if (isa_ext >= KVM_RISCV_ISA_EXT_MAX) {
311 if (!kvm_riscv_vcpu_isa_enable_allowed(isa_ext))
312 if (reg_val & BIT(i))
314 if (!kvm_riscv_vcpu_isa_disable_allowed(isa_ext))
315 if (!(reg_val & BIT(i)))
318 reg_val &= riscv_isa_extension_base(NULL);
319 /* Do not modify anything beyond single letter extensions */
320 reg_val = (vcpu->arch.isa[0] & ~KVM_RISCV_BASE_ISA_MASK) |
321 (reg_val & KVM_RISCV_BASE_ISA_MASK);
322 vcpu->arch.isa[0] = reg_val;
323 kvm_riscv_vcpu_fp_reset(vcpu);
328 case KVM_REG_RISCV_CONFIG_REG(zicbom_block_size):
329 if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOM))
331 if (reg_val != riscv_cbom_block_size)
334 case KVM_REG_RISCV_CONFIG_REG(zicboz_block_size):
335 if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOZ))
337 if (reg_val != riscv_cboz_block_size)
340 case KVM_REG_RISCV_CONFIG_REG(mvendorid):
341 if (reg_val == vcpu->arch.mvendorid)
343 if (!vcpu->arch.ran_atleast_once)
344 vcpu->arch.mvendorid = reg_val;
348 case KVM_REG_RISCV_CONFIG_REG(marchid):
349 if (reg_val == vcpu->arch.marchid)
351 if (!vcpu->arch.ran_atleast_once)
352 vcpu->arch.marchid = reg_val;
356 case KVM_REG_RISCV_CONFIG_REG(mimpid):
357 if (reg_val == vcpu->arch.mimpid)
359 if (!vcpu->arch.ran_atleast_once)
360 vcpu->arch.mimpid = reg_val;
364 case KVM_REG_RISCV_CONFIG_REG(satp_mode):
365 if (reg_val != (satp_mode >> SATP_MODE_SHIFT))
375 static int kvm_riscv_vcpu_get_reg_core(struct kvm_vcpu *vcpu,
376 const struct kvm_one_reg *reg)
378 struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
379 unsigned long __user *uaddr =
380 (unsigned long __user *)(unsigned long)reg->addr;
381 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
384 unsigned long reg_val;
386 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
388 if (reg_num >= sizeof(struct kvm_riscv_core) / sizeof(unsigned long))
391 if (reg_num == KVM_REG_RISCV_CORE_REG(regs.pc))
392 reg_val = cntx->sepc;
393 else if (KVM_REG_RISCV_CORE_REG(regs.pc) < reg_num &&
394 reg_num <= KVM_REG_RISCV_CORE_REG(regs.t6))
395 reg_val = ((unsigned long *)cntx)[reg_num];
396 else if (reg_num == KVM_REG_RISCV_CORE_REG(mode))
397 reg_val = (cntx->sstatus & SR_SPP) ?
398 KVM_RISCV_MODE_S : KVM_RISCV_MODE_U;
402 if (copy_to_user(uaddr, ®_val, KVM_REG_SIZE(reg->id)))
408 static int kvm_riscv_vcpu_set_reg_core(struct kvm_vcpu *vcpu,
409 const struct kvm_one_reg *reg)
411 struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
412 unsigned long __user *uaddr =
413 (unsigned long __user *)(unsigned long)reg->addr;
414 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
417 unsigned long reg_val;
419 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
421 if (reg_num >= sizeof(struct kvm_riscv_core) / sizeof(unsigned long))
424 if (copy_from_user(®_val, uaddr, KVM_REG_SIZE(reg->id)))
427 if (reg_num == KVM_REG_RISCV_CORE_REG(regs.pc))
428 cntx->sepc = reg_val;
429 else if (KVM_REG_RISCV_CORE_REG(regs.pc) < reg_num &&
430 reg_num <= KVM_REG_RISCV_CORE_REG(regs.t6))
431 ((unsigned long *)cntx)[reg_num] = reg_val;
432 else if (reg_num == KVM_REG_RISCV_CORE_REG(mode)) {
433 if (reg_val == KVM_RISCV_MODE_S)
434 cntx->sstatus |= SR_SPP;
436 cntx->sstatus &= ~SR_SPP;
443 static int kvm_riscv_vcpu_general_get_csr(struct kvm_vcpu *vcpu,
444 unsigned long reg_num,
445 unsigned long *out_val)
447 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
449 if (reg_num >= sizeof(struct kvm_riscv_csr) / sizeof(unsigned long))
452 if (reg_num == KVM_REG_RISCV_CSR_REG(sip)) {
453 kvm_riscv_vcpu_flush_interrupts(vcpu);
454 *out_val = (csr->hvip >> VSIP_TO_HVIP_SHIFT) & VSIP_VALID_MASK;
455 *out_val |= csr->hvip & ~IRQ_LOCAL_MASK;
457 *out_val = ((unsigned long *)csr)[reg_num];
462 static int kvm_riscv_vcpu_general_set_csr(struct kvm_vcpu *vcpu,
463 unsigned long reg_num,
464 unsigned long reg_val)
466 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
468 if (reg_num >= sizeof(struct kvm_riscv_csr) / sizeof(unsigned long))
471 if (reg_num == KVM_REG_RISCV_CSR_REG(sip)) {
472 reg_val &= VSIP_VALID_MASK;
473 reg_val <<= VSIP_TO_HVIP_SHIFT;
476 ((unsigned long *)csr)[reg_num] = reg_val;
478 if (reg_num == KVM_REG_RISCV_CSR_REG(sip))
479 WRITE_ONCE(vcpu->arch.irqs_pending_mask[0], 0);
484 static inline int kvm_riscv_vcpu_smstateen_set_csr(struct kvm_vcpu *vcpu,
485 unsigned long reg_num,
486 unsigned long reg_val)
488 struct kvm_vcpu_smstateen_csr *csr = &vcpu->arch.smstateen_csr;
490 if (reg_num >= sizeof(struct kvm_riscv_smstateen_csr) /
491 sizeof(unsigned long))
494 ((unsigned long *)csr)[reg_num] = reg_val;
498 static int kvm_riscv_vcpu_smstateen_get_csr(struct kvm_vcpu *vcpu,
499 unsigned long reg_num,
500 unsigned long *out_val)
502 struct kvm_vcpu_smstateen_csr *csr = &vcpu->arch.smstateen_csr;
504 if (reg_num >= sizeof(struct kvm_riscv_smstateen_csr) /
505 sizeof(unsigned long))
508 *out_val = ((unsigned long *)csr)[reg_num];
512 static int kvm_riscv_vcpu_get_reg_csr(struct kvm_vcpu *vcpu,
513 const struct kvm_one_reg *reg)
516 unsigned long __user *uaddr =
517 (unsigned long __user *)(unsigned long)reg->addr;
518 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
521 unsigned long reg_val, reg_subtype;
523 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
526 reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
527 reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
528 switch (reg_subtype) {
529 case KVM_REG_RISCV_CSR_GENERAL:
530 rc = kvm_riscv_vcpu_general_get_csr(vcpu, reg_num, ®_val);
532 case KVM_REG_RISCV_CSR_AIA:
533 rc = kvm_riscv_vcpu_aia_get_csr(vcpu, reg_num, ®_val);
535 case KVM_REG_RISCV_CSR_SMSTATEEN:
537 if (riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN))
538 rc = kvm_riscv_vcpu_smstateen_get_csr(vcpu, reg_num,
548 if (copy_to_user(uaddr, ®_val, KVM_REG_SIZE(reg->id)))
554 static int kvm_riscv_vcpu_set_reg_csr(struct kvm_vcpu *vcpu,
555 const struct kvm_one_reg *reg)
558 unsigned long __user *uaddr =
559 (unsigned long __user *)(unsigned long)reg->addr;
560 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
563 unsigned long reg_val, reg_subtype;
565 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
568 if (copy_from_user(®_val, uaddr, KVM_REG_SIZE(reg->id)))
571 reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
572 reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
573 switch (reg_subtype) {
574 case KVM_REG_RISCV_CSR_GENERAL:
575 rc = kvm_riscv_vcpu_general_set_csr(vcpu, reg_num, reg_val);
577 case KVM_REG_RISCV_CSR_AIA:
578 rc = kvm_riscv_vcpu_aia_set_csr(vcpu, reg_num, reg_val);
580 case KVM_REG_RISCV_CSR_SMSTATEEN:
582 if (riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN))
583 rc = kvm_riscv_vcpu_smstateen_set_csr(vcpu, reg_num,
596 static int riscv_vcpu_get_isa_ext_single(struct kvm_vcpu *vcpu,
597 unsigned long reg_num,
598 unsigned long *reg_val)
600 unsigned long host_isa_ext;
602 if (reg_num >= KVM_RISCV_ISA_EXT_MAX ||
603 reg_num >= ARRAY_SIZE(kvm_isa_ext_arr))
606 host_isa_ext = kvm_isa_ext_arr[reg_num];
607 if (!__riscv_isa_extension_available(NULL, host_isa_ext))
611 if (__riscv_isa_extension_available(vcpu->arch.isa, host_isa_ext))
612 *reg_val = 1; /* Mark the given extension as available */
617 static int riscv_vcpu_set_isa_ext_single(struct kvm_vcpu *vcpu,
618 unsigned long reg_num,
619 unsigned long reg_val)
621 unsigned long host_isa_ext;
623 if (reg_num >= KVM_RISCV_ISA_EXT_MAX ||
624 reg_num >= ARRAY_SIZE(kvm_isa_ext_arr))
627 host_isa_ext = kvm_isa_ext_arr[reg_num];
628 if (!__riscv_isa_extension_available(NULL, host_isa_ext))
631 if (reg_val == test_bit(host_isa_ext, vcpu->arch.isa))
634 if (!vcpu->arch.ran_atleast_once) {
636 * All multi-letter extension and a few single letter
637 * extension can be disabled
640 kvm_riscv_vcpu_isa_enable_allowed(reg_num))
641 set_bit(host_isa_ext, vcpu->arch.isa);
643 kvm_riscv_vcpu_isa_disable_allowed(reg_num))
644 clear_bit(host_isa_ext, vcpu->arch.isa);
647 kvm_riscv_vcpu_fp_reset(vcpu);
655 static int riscv_vcpu_get_isa_ext_multi(struct kvm_vcpu *vcpu,
656 unsigned long reg_num,
657 unsigned long *reg_val)
659 unsigned long i, ext_id, ext_val;
661 if (reg_num > KVM_REG_RISCV_ISA_MULTI_REG_LAST)
664 for (i = 0; i < BITS_PER_LONG; i++) {
665 ext_id = i + reg_num * BITS_PER_LONG;
666 if (ext_id >= KVM_RISCV_ISA_EXT_MAX)
670 riscv_vcpu_get_isa_ext_single(vcpu, ext_id, &ext_val);
672 *reg_val |= KVM_REG_RISCV_ISA_MULTI_MASK(ext_id);
678 static int riscv_vcpu_set_isa_ext_multi(struct kvm_vcpu *vcpu,
679 unsigned long reg_num,
680 unsigned long reg_val, bool enable)
682 unsigned long i, ext_id;
684 if (reg_num > KVM_REG_RISCV_ISA_MULTI_REG_LAST)
687 for_each_set_bit(i, ®_val, BITS_PER_LONG) {
688 ext_id = i + reg_num * BITS_PER_LONG;
689 if (ext_id >= KVM_RISCV_ISA_EXT_MAX)
692 riscv_vcpu_set_isa_ext_single(vcpu, ext_id, enable);
698 static int kvm_riscv_vcpu_get_reg_isa_ext(struct kvm_vcpu *vcpu,
699 const struct kvm_one_reg *reg)
702 unsigned long __user *uaddr =
703 (unsigned long __user *)(unsigned long)reg->addr;
704 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
706 KVM_REG_RISCV_ISA_EXT);
707 unsigned long reg_val, reg_subtype;
709 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
712 reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
713 reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
716 switch (reg_subtype) {
717 case KVM_REG_RISCV_ISA_SINGLE:
718 rc = riscv_vcpu_get_isa_ext_single(vcpu, reg_num, ®_val);
720 case KVM_REG_RISCV_ISA_MULTI_EN:
721 case KVM_REG_RISCV_ISA_MULTI_DIS:
722 rc = riscv_vcpu_get_isa_ext_multi(vcpu, reg_num, ®_val);
723 if (!rc && reg_subtype == KVM_REG_RISCV_ISA_MULTI_DIS)
732 if (copy_to_user(uaddr, ®_val, KVM_REG_SIZE(reg->id)))
738 static int kvm_riscv_vcpu_set_reg_isa_ext(struct kvm_vcpu *vcpu,
739 const struct kvm_one_reg *reg)
741 unsigned long __user *uaddr =
742 (unsigned long __user *)(unsigned long)reg->addr;
743 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
745 KVM_REG_RISCV_ISA_EXT);
746 unsigned long reg_val, reg_subtype;
748 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
751 reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
752 reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
754 if (copy_from_user(®_val, uaddr, KVM_REG_SIZE(reg->id)))
757 switch (reg_subtype) {
758 case KVM_REG_RISCV_ISA_SINGLE:
759 return riscv_vcpu_set_isa_ext_single(vcpu, reg_num, reg_val);
760 case KVM_REG_RISCV_ISA_MULTI_EN:
761 return riscv_vcpu_set_isa_ext_multi(vcpu, reg_num, reg_val, true);
762 case KVM_REG_RISCV_ISA_MULTI_DIS:
763 return riscv_vcpu_set_isa_ext_multi(vcpu, reg_num, reg_val, false);
771 static int copy_config_reg_indices(const struct kvm_vcpu *vcpu,
772 u64 __user *uindices)
776 for (int i = 0; i < sizeof(struct kvm_riscv_config)/sizeof(unsigned long);
782 * Avoid reporting config reg if the corresponding extension
785 if (i == KVM_REG_RISCV_CONFIG_REG(zicbom_block_size) &&
786 !riscv_isa_extension_available(vcpu->arch.isa, ZICBOM))
788 else if (i == KVM_REG_RISCV_CONFIG_REG(zicboz_block_size) &&
789 !riscv_isa_extension_available(vcpu->arch.isa, ZICBOZ))
792 size = IS_ENABLED(CONFIG_32BIT) ? KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
793 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CONFIG | i;
796 if (put_user(reg, uindices))
807 static unsigned long num_config_regs(const struct kvm_vcpu *vcpu)
809 return copy_config_reg_indices(vcpu, NULL);
812 static inline unsigned long num_core_regs(void)
814 return sizeof(struct kvm_riscv_core) / sizeof(unsigned long);
817 static int copy_core_reg_indices(u64 __user *uindices)
819 int n = num_core_regs();
821 for (int i = 0; i < n; i++) {
822 u64 size = IS_ENABLED(CONFIG_32BIT) ?
823 KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
824 u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CORE | i;
827 if (put_user(reg, uindices))
836 static inline unsigned long num_csr_regs(const struct kvm_vcpu *vcpu)
838 unsigned long n = sizeof(struct kvm_riscv_csr) / sizeof(unsigned long);
840 if (riscv_isa_extension_available(vcpu->arch.isa, SSAIA))
841 n += sizeof(struct kvm_riscv_aia_csr) / sizeof(unsigned long);
842 if (riscv_isa_extension_available(vcpu->arch.isa, SMSTATEEN))
843 n += sizeof(struct kvm_riscv_smstateen_csr) / sizeof(unsigned long);
848 static int copy_csr_reg_indices(const struct kvm_vcpu *vcpu,
849 u64 __user *uindices)
851 int n1 = sizeof(struct kvm_riscv_csr) / sizeof(unsigned long);
854 /* copy general csr regs */
855 for (int i = 0; i < n1; i++) {
856 u64 size = IS_ENABLED(CONFIG_32BIT) ?
857 KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
858 u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CSR |
859 KVM_REG_RISCV_CSR_GENERAL | i;
862 if (put_user(reg, uindices))
868 /* copy AIA csr regs */
869 if (riscv_isa_extension_available(vcpu->arch.isa, SSAIA)) {
870 n2 = sizeof(struct kvm_riscv_aia_csr) / sizeof(unsigned long);
872 for (int i = 0; i < n2; i++) {
873 u64 size = IS_ENABLED(CONFIG_32BIT) ?
874 KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
875 u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CSR |
876 KVM_REG_RISCV_CSR_AIA | i;
879 if (put_user(reg, uindices))
886 /* copy Smstateen csr regs */
887 if (riscv_isa_extension_available(vcpu->arch.isa, SMSTATEEN)) {
888 n3 = sizeof(struct kvm_riscv_smstateen_csr) / sizeof(unsigned long);
890 for (int i = 0; i < n3; i++) {
891 u64 size = IS_ENABLED(CONFIG_32BIT) ?
892 KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
893 u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CSR |
894 KVM_REG_RISCV_CSR_SMSTATEEN | i;
897 if (put_user(reg, uindices))
907 static inline unsigned long num_timer_regs(void)
909 return sizeof(struct kvm_riscv_timer) / sizeof(u64);
912 static int copy_timer_reg_indices(u64 __user *uindices)
914 int n = num_timer_regs();
916 for (int i = 0; i < n; i++) {
917 u64 reg = KVM_REG_RISCV | KVM_REG_SIZE_U64 |
918 KVM_REG_RISCV_TIMER | i;
921 if (put_user(reg, uindices))
930 static inline unsigned long num_fp_f_regs(const struct kvm_vcpu *vcpu)
932 const struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
934 if (riscv_isa_extension_available(vcpu->arch.isa, f))
935 return sizeof(cntx->fp.f) / sizeof(u32);
940 static int copy_fp_f_reg_indices(const struct kvm_vcpu *vcpu,
941 u64 __user *uindices)
943 int n = num_fp_f_regs(vcpu);
945 for (int i = 0; i < n; i++) {
946 u64 reg = KVM_REG_RISCV | KVM_REG_SIZE_U32 |
947 KVM_REG_RISCV_FP_F | i;
950 if (put_user(reg, uindices))
959 static inline unsigned long num_fp_d_regs(const struct kvm_vcpu *vcpu)
961 const struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
963 if (riscv_isa_extension_available(vcpu->arch.isa, d))
964 return sizeof(cntx->fp.d.f) / sizeof(u64) + 1;
969 static int copy_fp_d_reg_indices(const struct kvm_vcpu *vcpu,
970 u64 __user *uindices)
973 int n = num_fp_d_regs(vcpu);
976 /* copy fp.d.f indices */
977 for (i = 0; i < n-1; i++) {
978 reg = KVM_REG_RISCV | KVM_REG_SIZE_U64 |
979 KVM_REG_RISCV_FP_D | i;
982 if (put_user(reg, uindices))
988 /* copy fp.d.fcsr indices */
989 reg = KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_D | i;
991 if (put_user(reg, uindices))
999 static int copy_isa_ext_reg_indices(const struct kvm_vcpu *vcpu,
1000 u64 __user *uindices)
1003 unsigned long isa_ext;
1005 for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) {
1006 u64 size = IS_ENABLED(CONFIG_32BIT) ?
1007 KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
1008 u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_ISA_EXT | i;
1010 isa_ext = kvm_isa_ext_arr[i];
1011 if (!__riscv_isa_extension_available(NULL, isa_ext))
1015 if (put_user(reg, uindices))
1026 static inline unsigned long num_isa_ext_regs(const struct kvm_vcpu *vcpu)
1028 return copy_isa_ext_reg_indices(vcpu, NULL);
1031 static int copy_sbi_ext_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
1035 for (int i = 0; i < KVM_RISCV_SBI_EXT_MAX; i++) {
1036 u64 size = IS_ENABLED(CONFIG_32BIT) ?
1037 KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
1038 u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_SBI_EXT |
1039 KVM_REG_RISCV_SBI_SINGLE | i;
1041 if (!riscv_vcpu_supports_sbi_ext(vcpu, i))
1045 if (put_user(reg, uindices))
1056 static unsigned long num_sbi_ext_regs(struct kvm_vcpu *vcpu)
1058 return copy_sbi_ext_reg_indices(vcpu, NULL);
1061 static int copy_sbi_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
1063 struct kvm_vcpu_sbi_context *scontext = &vcpu->arch.sbi_context;
1066 if (scontext->ext_status[KVM_RISCV_SBI_EXT_STA] == KVM_RISCV_SBI_EXT_STATUS_ENABLED) {
1067 u64 size = IS_ENABLED(CONFIG_32BIT) ? KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
1068 int n = sizeof(struct kvm_riscv_sbi_sta) / sizeof(unsigned long);
1070 for (int i = 0; i < n; i++) {
1071 u64 reg = KVM_REG_RISCV | size |
1072 KVM_REG_RISCV_SBI_STATE |
1073 KVM_REG_RISCV_SBI_STA | i;
1076 if (put_user(reg, uindices))
1088 static inline unsigned long num_sbi_regs(struct kvm_vcpu *vcpu)
1090 return copy_sbi_reg_indices(vcpu, NULL);
1093 static inline unsigned long num_vector_regs(const struct kvm_vcpu *vcpu)
1095 if (!riscv_isa_extension_available(vcpu->arch.isa, v))
1098 /* vstart, vl, vtype, vcsr, vlenb and 32 vector regs */
1102 static int copy_vector_reg_indices(const struct kvm_vcpu *vcpu,
1103 u64 __user *uindices)
1105 const struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
1106 int n = num_vector_regs(vcpu);
1113 /* copy vstart, vl, vtype, vcsr and vlenb */
1114 size = IS_ENABLED(CONFIG_32BIT) ? KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
1115 for (i = 0; i < 5; i++) {
1116 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_VECTOR | i;
1119 if (put_user(reg, uindices))
1125 /* vector_regs have a variable 'vlenb' size */
1126 size = __builtin_ctzl(cntx->vector.vlenb);
1127 size <<= KVM_REG_SIZE_SHIFT;
1128 for (i = 0; i < 32; i++) {
1129 reg = KVM_REG_RISCV | KVM_REG_RISCV_VECTOR | size |
1130 KVM_REG_RISCV_VECTOR_REG(i);
1133 if (put_user(reg, uindices))
1143 * kvm_riscv_vcpu_num_regs - how many registers do we present via KVM_GET/SET_ONE_REG
1145 * This is for all registers.
1147 unsigned long kvm_riscv_vcpu_num_regs(struct kvm_vcpu *vcpu)
1149 unsigned long res = 0;
1151 res += num_config_regs(vcpu);
1152 res += num_core_regs();
1153 res += num_csr_regs(vcpu);
1154 res += num_timer_regs();
1155 res += num_fp_f_regs(vcpu);
1156 res += num_fp_d_regs(vcpu);
1157 res += num_vector_regs(vcpu);
1158 res += num_isa_ext_regs(vcpu);
1159 res += num_sbi_ext_regs(vcpu);
1160 res += num_sbi_regs(vcpu);
1166 * kvm_riscv_vcpu_copy_reg_indices - get indices of all registers.
1168 int kvm_riscv_vcpu_copy_reg_indices(struct kvm_vcpu *vcpu,
1169 u64 __user *uindices)
1173 ret = copy_config_reg_indices(vcpu, uindices);
1178 ret = copy_core_reg_indices(uindices);
1183 ret = copy_csr_reg_indices(vcpu, uindices);
1188 ret = copy_timer_reg_indices(uindices);
1193 ret = copy_fp_f_reg_indices(vcpu, uindices);
1198 ret = copy_fp_d_reg_indices(vcpu, uindices);
1203 ret = copy_vector_reg_indices(vcpu, uindices);
1208 ret = copy_isa_ext_reg_indices(vcpu, uindices);
1213 ret = copy_sbi_ext_reg_indices(vcpu, uindices);
1218 ret = copy_sbi_reg_indices(vcpu, uindices);
1226 int kvm_riscv_vcpu_set_reg(struct kvm_vcpu *vcpu,
1227 const struct kvm_one_reg *reg)
1229 switch (reg->id & KVM_REG_RISCV_TYPE_MASK) {
1230 case KVM_REG_RISCV_CONFIG:
1231 return kvm_riscv_vcpu_set_reg_config(vcpu, reg);
1232 case KVM_REG_RISCV_CORE:
1233 return kvm_riscv_vcpu_set_reg_core(vcpu, reg);
1234 case KVM_REG_RISCV_CSR:
1235 return kvm_riscv_vcpu_set_reg_csr(vcpu, reg);
1236 case KVM_REG_RISCV_TIMER:
1237 return kvm_riscv_vcpu_set_reg_timer(vcpu, reg);
1238 case KVM_REG_RISCV_FP_F:
1239 return kvm_riscv_vcpu_set_reg_fp(vcpu, reg,
1240 KVM_REG_RISCV_FP_F);
1241 case KVM_REG_RISCV_FP_D:
1242 return kvm_riscv_vcpu_set_reg_fp(vcpu, reg,
1243 KVM_REG_RISCV_FP_D);
1244 case KVM_REG_RISCV_VECTOR:
1245 return kvm_riscv_vcpu_set_reg_vector(vcpu, reg);
1246 case KVM_REG_RISCV_ISA_EXT:
1247 return kvm_riscv_vcpu_set_reg_isa_ext(vcpu, reg);
1248 case KVM_REG_RISCV_SBI_EXT:
1249 return kvm_riscv_vcpu_set_reg_sbi_ext(vcpu, reg);
1250 case KVM_REG_RISCV_SBI_STATE:
1251 return kvm_riscv_vcpu_set_reg_sbi(vcpu, reg);
1259 int kvm_riscv_vcpu_get_reg(struct kvm_vcpu *vcpu,
1260 const struct kvm_one_reg *reg)
1262 switch (reg->id & KVM_REG_RISCV_TYPE_MASK) {
1263 case KVM_REG_RISCV_CONFIG:
1264 return kvm_riscv_vcpu_get_reg_config(vcpu, reg);
1265 case KVM_REG_RISCV_CORE:
1266 return kvm_riscv_vcpu_get_reg_core(vcpu, reg);
1267 case KVM_REG_RISCV_CSR:
1268 return kvm_riscv_vcpu_get_reg_csr(vcpu, reg);
1269 case KVM_REG_RISCV_TIMER:
1270 return kvm_riscv_vcpu_get_reg_timer(vcpu, reg);
1271 case KVM_REG_RISCV_FP_F:
1272 return kvm_riscv_vcpu_get_reg_fp(vcpu, reg,
1273 KVM_REG_RISCV_FP_F);
1274 case KVM_REG_RISCV_FP_D:
1275 return kvm_riscv_vcpu_get_reg_fp(vcpu, reg,
1276 KVM_REG_RISCV_FP_D);
1277 case KVM_REG_RISCV_VECTOR:
1278 return kvm_riscv_vcpu_get_reg_vector(vcpu, reg);
1279 case KVM_REG_RISCV_ISA_EXT:
1280 return kvm_riscv_vcpu_get_reg_isa_ext(vcpu, reg);
1281 case KVM_REG_RISCV_SBI_EXT:
1282 return kvm_riscv_vcpu_get_reg_sbi_ext(vcpu, reg);
1283 case KVM_REG_RISCV_SBI_STATE:
1284 return kvm_riscv_vcpu_get_reg_sbi(vcpu, reg);