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.
7 * Anup Patel <apatel@ventanamicro.com>
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/vector.h>
20 #define KVM_RISCV_BASE_ISA_MASK GENMASK(25, 0)
22 #define KVM_ISA_EXT_ARR(ext) \
23 [KVM_RISCV_ISA_EXT_##ext] = RISCV_ISA_EXT_##ext
25 /* Mapping between KVM ISA Extension ID & Host ISA extension ID */
26 static const unsigned long kvm_isa_ext_arr[] = {
27 /* Single letter extensions (alphabetically sorted) */
28 [KVM_RISCV_ISA_EXT_A] = RISCV_ISA_EXT_a,
29 [KVM_RISCV_ISA_EXT_C] = RISCV_ISA_EXT_c,
30 [KVM_RISCV_ISA_EXT_D] = RISCV_ISA_EXT_d,
31 [KVM_RISCV_ISA_EXT_F] = RISCV_ISA_EXT_f,
32 [KVM_RISCV_ISA_EXT_H] = RISCV_ISA_EXT_h,
33 [KVM_RISCV_ISA_EXT_I] = RISCV_ISA_EXT_i,
34 [KVM_RISCV_ISA_EXT_M] = RISCV_ISA_EXT_m,
35 [KVM_RISCV_ISA_EXT_V] = RISCV_ISA_EXT_v,
36 /* Multi letter extensions (alphabetically sorted) */
37 KVM_ISA_EXT_ARR(SMSTATEEN),
38 KVM_ISA_EXT_ARR(SSAIA),
39 KVM_ISA_EXT_ARR(SSTC),
40 KVM_ISA_EXT_ARR(SVINVAL),
41 KVM_ISA_EXT_ARR(SVNAPOT),
42 KVM_ISA_EXT_ARR(SVPBMT),
46 KVM_ISA_EXT_ARR(ZICBOM),
47 KVM_ISA_EXT_ARR(ZICBOZ),
48 KVM_ISA_EXT_ARR(ZICNTR),
49 KVM_ISA_EXT_ARR(ZICOND),
50 KVM_ISA_EXT_ARR(ZICSR),
51 KVM_ISA_EXT_ARR(ZIFENCEI),
52 KVM_ISA_EXT_ARR(ZIHINTPAUSE),
53 KVM_ISA_EXT_ARR(ZIHPM),
56 static unsigned long kvm_riscv_vcpu_base2isa_ext(unsigned long base_ext)
60 for (i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) {
61 if (kvm_isa_ext_arr[i] == base_ext)
65 return KVM_RISCV_ISA_EXT_MAX;
68 static bool kvm_riscv_vcpu_isa_enable_allowed(unsigned long ext)
71 case KVM_RISCV_ISA_EXT_H:
73 case KVM_RISCV_ISA_EXT_V:
74 return riscv_v_vstate_ctrl_user_allowed();
82 static bool kvm_riscv_vcpu_isa_disable_allowed(unsigned long ext)
85 /* Extensions which don't have any mechanism to disable */
86 case KVM_RISCV_ISA_EXT_A:
87 case KVM_RISCV_ISA_EXT_C:
88 case KVM_RISCV_ISA_EXT_I:
89 case KVM_RISCV_ISA_EXT_M:
90 case KVM_RISCV_ISA_EXT_SSTC:
91 case KVM_RISCV_ISA_EXT_SVINVAL:
92 case KVM_RISCV_ISA_EXT_SVNAPOT:
93 case KVM_RISCV_ISA_EXT_ZBA:
94 case KVM_RISCV_ISA_EXT_ZBB:
95 case KVM_RISCV_ISA_EXT_ZBS:
96 case KVM_RISCV_ISA_EXT_ZICNTR:
97 case KVM_RISCV_ISA_EXT_ZICOND:
98 case KVM_RISCV_ISA_EXT_ZICSR:
99 case KVM_RISCV_ISA_EXT_ZIFENCEI:
100 case KVM_RISCV_ISA_EXT_ZIHINTPAUSE:
101 case KVM_RISCV_ISA_EXT_ZIHPM:
103 /* Extensions which can be disabled using Smstateen */
104 case KVM_RISCV_ISA_EXT_SSAIA:
105 return riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN);
113 void kvm_riscv_vcpu_setup_isa(struct kvm_vcpu *vcpu)
115 unsigned long host_isa, i;
117 for (i = 0; i < ARRAY_SIZE(kvm_isa_ext_arr); i++) {
118 host_isa = kvm_isa_ext_arr[i];
119 if (__riscv_isa_extension_available(NULL, host_isa) &&
120 kvm_riscv_vcpu_isa_enable_allowed(i))
121 set_bit(host_isa, vcpu->arch.isa);
125 static int kvm_riscv_vcpu_get_reg_config(struct kvm_vcpu *vcpu,
126 const struct kvm_one_reg *reg)
128 unsigned long __user *uaddr =
129 (unsigned long __user *)(unsigned long)reg->addr;
130 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
132 KVM_REG_RISCV_CONFIG);
133 unsigned long reg_val;
135 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
139 case KVM_REG_RISCV_CONFIG_REG(isa):
140 reg_val = vcpu->arch.isa[0] & KVM_RISCV_BASE_ISA_MASK;
142 case KVM_REG_RISCV_CONFIG_REG(zicbom_block_size):
143 if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOM))
145 reg_val = riscv_cbom_block_size;
147 case KVM_REG_RISCV_CONFIG_REG(zicboz_block_size):
148 if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOZ))
150 reg_val = riscv_cboz_block_size;
152 case KVM_REG_RISCV_CONFIG_REG(mvendorid):
153 reg_val = vcpu->arch.mvendorid;
155 case KVM_REG_RISCV_CONFIG_REG(marchid):
156 reg_val = vcpu->arch.marchid;
158 case KVM_REG_RISCV_CONFIG_REG(mimpid):
159 reg_val = vcpu->arch.mimpid;
161 case KVM_REG_RISCV_CONFIG_REG(satp_mode):
162 reg_val = satp_mode >> SATP_MODE_SHIFT;
168 if (copy_to_user(uaddr, ®_val, KVM_REG_SIZE(reg->id)))
174 static int kvm_riscv_vcpu_set_reg_config(struct kvm_vcpu *vcpu,
175 const struct kvm_one_reg *reg)
177 unsigned long __user *uaddr =
178 (unsigned long __user *)(unsigned long)reg->addr;
179 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
181 KVM_REG_RISCV_CONFIG);
182 unsigned long i, isa_ext, reg_val;
184 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
187 if (copy_from_user(®_val, uaddr, KVM_REG_SIZE(reg->id)))
191 case KVM_REG_RISCV_CONFIG_REG(isa):
193 * This ONE REG interface is only defined for
194 * single letter extensions.
196 if (fls(reg_val) >= RISCV_ISA_EXT_BASE)
200 * Return early (i.e. do nothing) if reg_val is the same
201 * value retrievable via kvm_riscv_vcpu_get_reg_config().
203 if (reg_val == (vcpu->arch.isa[0] & KVM_RISCV_BASE_ISA_MASK))
206 if (!vcpu->arch.ran_atleast_once) {
207 /* Ignore the enable/disable request for certain extensions */
208 for (i = 0; i < RISCV_ISA_EXT_BASE; i++) {
209 isa_ext = kvm_riscv_vcpu_base2isa_ext(i);
210 if (isa_ext >= KVM_RISCV_ISA_EXT_MAX) {
214 if (!kvm_riscv_vcpu_isa_enable_allowed(isa_ext))
215 if (reg_val & BIT(i))
217 if (!kvm_riscv_vcpu_isa_disable_allowed(isa_ext))
218 if (!(reg_val & BIT(i)))
221 reg_val &= riscv_isa_extension_base(NULL);
222 /* Do not modify anything beyond single letter extensions */
223 reg_val = (vcpu->arch.isa[0] & ~KVM_RISCV_BASE_ISA_MASK) |
224 (reg_val & KVM_RISCV_BASE_ISA_MASK);
225 vcpu->arch.isa[0] = reg_val;
226 kvm_riscv_vcpu_fp_reset(vcpu);
231 case KVM_REG_RISCV_CONFIG_REG(zicbom_block_size):
232 if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOM))
234 if (reg_val != riscv_cbom_block_size)
237 case KVM_REG_RISCV_CONFIG_REG(zicboz_block_size):
238 if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOZ))
240 if (reg_val != riscv_cboz_block_size)
243 case KVM_REG_RISCV_CONFIG_REG(mvendorid):
244 if (reg_val == vcpu->arch.mvendorid)
246 if (!vcpu->arch.ran_atleast_once)
247 vcpu->arch.mvendorid = reg_val;
251 case KVM_REG_RISCV_CONFIG_REG(marchid):
252 if (reg_val == vcpu->arch.marchid)
254 if (!vcpu->arch.ran_atleast_once)
255 vcpu->arch.marchid = reg_val;
259 case KVM_REG_RISCV_CONFIG_REG(mimpid):
260 if (reg_val == vcpu->arch.mimpid)
262 if (!vcpu->arch.ran_atleast_once)
263 vcpu->arch.mimpid = reg_val;
267 case KVM_REG_RISCV_CONFIG_REG(satp_mode):
268 if (reg_val != (satp_mode >> SATP_MODE_SHIFT))
278 static int kvm_riscv_vcpu_get_reg_core(struct kvm_vcpu *vcpu,
279 const struct kvm_one_reg *reg)
281 struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
282 unsigned long __user *uaddr =
283 (unsigned long __user *)(unsigned long)reg->addr;
284 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
287 unsigned long reg_val;
289 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
291 if (reg_num >= sizeof(struct kvm_riscv_core) / sizeof(unsigned long))
294 if (reg_num == KVM_REG_RISCV_CORE_REG(regs.pc))
295 reg_val = cntx->sepc;
296 else if (KVM_REG_RISCV_CORE_REG(regs.pc) < reg_num &&
297 reg_num <= KVM_REG_RISCV_CORE_REG(regs.t6))
298 reg_val = ((unsigned long *)cntx)[reg_num];
299 else if (reg_num == KVM_REG_RISCV_CORE_REG(mode))
300 reg_val = (cntx->sstatus & SR_SPP) ?
301 KVM_RISCV_MODE_S : KVM_RISCV_MODE_U;
305 if (copy_to_user(uaddr, ®_val, KVM_REG_SIZE(reg->id)))
311 static int kvm_riscv_vcpu_set_reg_core(struct kvm_vcpu *vcpu,
312 const struct kvm_one_reg *reg)
314 struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
315 unsigned long __user *uaddr =
316 (unsigned long __user *)(unsigned long)reg->addr;
317 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
320 unsigned long reg_val;
322 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
324 if (reg_num >= sizeof(struct kvm_riscv_core) / sizeof(unsigned long))
327 if (copy_from_user(®_val, uaddr, KVM_REG_SIZE(reg->id)))
330 if (reg_num == KVM_REG_RISCV_CORE_REG(regs.pc))
331 cntx->sepc = reg_val;
332 else if (KVM_REG_RISCV_CORE_REG(regs.pc) < reg_num &&
333 reg_num <= KVM_REG_RISCV_CORE_REG(regs.t6))
334 ((unsigned long *)cntx)[reg_num] = reg_val;
335 else if (reg_num == KVM_REG_RISCV_CORE_REG(mode)) {
336 if (reg_val == KVM_RISCV_MODE_S)
337 cntx->sstatus |= SR_SPP;
339 cntx->sstatus &= ~SR_SPP;
346 static int kvm_riscv_vcpu_general_get_csr(struct kvm_vcpu *vcpu,
347 unsigned long reg_num,
348 unsigned long *out_val)
350 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
352 if (reg_num >= sizeof(struct kvm_riscv_csr) / sizeof(unsigned long))
355 if (reg_num == KVM_REG_RISCV_CSR_REG(sip)) {
356 kvm_riscv_vcpu_flush_interrupts(vcpu);
357 *out_val = (csr->hvip >> VSIP_TO_HVIP_SHIFT) & VSIP_VALID_MASK;
358 *out_val |= csr->hvip & ~IRQ_LOCAL_MASK;
360 *out_val = ((unsigned long *)csr)[reg_num];
365 static int kvm_riscv_vcpu_general_set_csr(struct kvm_vcpu *vcpu,
366 unsigned long reg_num,
367 unsigned long reg_val)
369 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
371 if (reg_num >= sizeof(struct kvm_riscv_csr) / sizeof(unsigned long))
374 if (reg_num == KVM_REG_RISCV_CSR_REG(sip)) {
375 reg_val &= VSIP_VALID_MASK;
376 reg_val <<= VSIP_TO_HVIP_SHIFT;
379 ((unsigned long *)csr)[reg_num] = reg_val;
381 if (reg_num == KVM_REG_RISCV_CSR_REG(sip))
382 WRITE_ONCE(vcpu->arch.irqs_pending_mask[0], 0);
387 static inline int kvm_riscv_vcpu_smstateen_set_csr(struct kvm_vcpu *vcpu,
388 unsigned long reg_num,
389 unsigned long reg_val)
391 struct kvm_vcpu_smstateen_csr *csr = &vcpu->arch.smstateen_csr;
393 if (reg_num >= sizeof(struct kvm_riscv_smstateen_csr) /
394 sizeof(unsigned long))
397 ((unsigned long *)csr)[reg_num] = reg_val;
401 static int kvm_riscv_vcpu_smstateen_get_csr(struct kvm_vcpu *vcpu,
402 unsigned long reg_num,
403 unsigned long *out_val)
405 struct kvm_vcpu_smstateen_csr *csr = &vcpu->arch.smstateen_csr;
407 if (reg_num >= sizeof(struct kvm_riscv_smstateen_csr) /
408 sizeof(unsigned long))
411 *out_val = ((unsigned long *)csr)[reg_num];
415 static int kvm_riscv_vcpu_get_reg_csr(struct kvm_vcpu *vcpu,
416 const struct kvm_one_reg *reg)
419 unsigned long __user *uaddr =
420 (unsigned long __user *)(unsigned long)reg->addr;
421 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
424 unsigned long reg_val, reg_subtype;
426 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
429 reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
430 reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
431 switch (reg_subtype) {
432 case KVM_REG_RISCV_CSR_GENERAL:
433 rc = kvm_riscv_vcpu_general_get_csr(vcpu, reg_num, ®_val);
435 case KVM_REG_RISCV_CSR_AIA:
436 rc = kvm_riscv_vcpu_aia_get_csr(vcpu, reg_num, ®_val);
438 case KVM_REG_RISCV_CSR_SMSTATEEN:
440 if (riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN))
441 rc = kvm_riscv_vcpu_smstateen_get_csr(vcpu, reg_num,
451 if (copy_to_user(uaddr, ®_val, KVM_REG_SIZE(reg->id)))
457 static int kvm_riscv_vcpu_set_reg_csr(struct kvm_vcpu *vcpu,
458 const struct kvm_one_reg *reg)
461 unsigned long __user *uaddr =
462 (unsigned long __user *)(unsigned long)reg->addr;
463 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
466 unsigned long reg_val, reg_subtype;
468 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
471 if (copy_from_user(®_val, uaddr, KVM_REG_SIZE(reg->id)))
474 reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
475 reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
476 switch (reg_subtype) {
477 case KVM_REG_RISCV_CSR_GENERAL:
478 rc = kvm_riscv_vcpu_general_set_csr(vcpu, reg_num, reg_val);
480 case KVM_REG_RISCV_CSR_AIA:
481 rc = kvm_riscv_vcpu_aia_set_csr(vcpu, reg_num, reg_val);
483 case KVM_REG_RISCV_CSR_SMSTATEEN:
485 if (riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN))
486 rc = kvm_riscv_vcpu_smstateen_set_csr(vcpu, reg_num,
499 static int riscv_vcpu_get_isa_ext_single(struct kvm_vcpu *vcpu,
500 unsigned long reg_num,
501 unsigned long *reg_val)
503 unsigned long host_isa_ext;
505 if (reg_num >= KVM_RISCV_ISA_EXT_MAX ||
506 reg_num >= ARRAY_SIZE(kvm_isa_ext_arr))
509 host_isa_ext = kvm_isa_ext_arr[reg_num];
510 if (!__riscv_isa_extension_available(NULL, host_isa_ext))
514 if (__riscv_isa_extension_available(vcpu->arch.isa, host_isa_ext))
515 *reg_val = 1; /* Mark the given extension as available */
520 static int riscv_vcpu_set_isa_ext_single(struct kvm_vcpu *vcpu,
521 unsigned long reg_num,
522 unsigned long reg_val)
524 unsigned long host_isa_ext;
526 if (reg_num >= KVM_RISCV_ISA_EXT_MAX ||
527 reg_num >= ARRAY_SIZE(kvm_isa_ext_arr))
530 host_isa_ext = kvm_isa_ext_arr[reg_num];
531 if (!__riscv_isa_extension_available(NULL, host_isa_ext))
534 if (reg_val == test_bit(host_isa_ext, vcpu->arch.isa))
537 if (!vcpu->arch.ran_atleast_once) {
539 * All multi-letter extension and a few single letter
540 * extension can be disabled
543 kvm_riscv_vcpu_isa_enable_allowed(reg_num))
544 set_bit(host_isa_ext, vcpu->arch.isa);
546 kvm_riscv_vcpu_isa_disable_allowed(reg_num))
547 clear_bit(host_isa_ext, vcpu->arch.isa);
550 kvm_riscv_vcpu_fp_reset(vcpu);
558 static int riscv_vcpu_get_isa_ext_multi(struct kvm_vcpu *vcpu,
559 unsigned long reg_num,
560 unsigned long *reg_val)
562 unsigned long i, ext_id, ext_val;
564 if (reg_num > KVM_REG_RISCV_ISA_MULTI_REG_LAST)
567 for (i = 0; i < BITS_PER_LONG; i++) {
568 ext_id = i + reg_num * BITS_PER_LONG;
569 if (ext_id >= KVM_RISCV_ISA_EXT_MAX)
573 riscv_vcpu_get_isa_ext_single(vcpu, ext_id, &ext_val);
575 *reg_val |= KVM_REG_RISCV_ISA_MULTI_MASK(ext_id);
581 static int riscv_vcpu_set_isa_ext_multi(struct kvm_vcpu *vcpu,
582 unsigned long reg_num,
583 unsigned long reg_val, bool enable)
585 unsigned long i, ext_id;
587 if (reg_num > KVM_REG_RISCV_ISA_MULTI_REG_LAST)
590 for_each_set_bit(i, ®_val, BITS_PER_LONG) {
591 ext_id = i + reg_num * BITS_PER_LONG;
592 if (ext_id >= KVM_RISCV_ISA_EXT_MAX)
595 riscv_vcpu_set_isa_ext_single(vcpu, ext_id, enable);
601 static int kvm_riscv_vcpu_get_reg_isa_ext(struct kvm_vcpu *vcpu,
602 const struct kvm_one_reg *reg)
605 unsigned long __user *uaddr =
606 (unsigned long __user *)(unsigned long)reg->addr;
607 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
609 KVM_REG_RISCV_ISA_EXT);
610 unsigned long reg_val, reg_subtype;
612 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
615 reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
616 reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
619 switch (reg_subtype) {
620 case KVM_REG_RISCV_ISA_SINGLE:
621 rc = riscv_vcpu_get_isa_ext_single(vcpu, reg_num, ®_val);
623 case KVM_REG_RISCV_ISA_MULTI_EN:
624 case KVM_REG_RISCV_ISA_MULTI_DIS:
625 rc = riscv_vcpu_get_isa_ext_multi(vcpu, reg_num, ®_val);
626 if (!rc && reg_subtype == KVM_REG_RISCV_ISA_MULTI_DIS)
635 if (copy_to_user(uaddr, ®_val, KVM_REG_SIZE(reg->id)))
641 static int kvm_riscv_vcpu_set_reg_isa_ext(struct kvm_vcpu *vcpu,
642 const struct kvm_one_reg *reg)
644 unsigned long __user *uaddr =
645 (unsigned long __user *)(unsigned long)reg->addr;
646 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
648 KVM_REG_RISCV_ISA_EXT);
649 unsigned long reg_val, reg_subtype;
651 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
654 reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
655 reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
657 if (copy_from_user(®_val, uaddr, KVM_REG_SIZE(reg->id)))
660 switch (reg_subtype) {
661 case KVM_REG_RISCV_ISA_SINGLE:
662 return riscv_vcpu_set_isa_ext_single(vcpu, reg_num, reg_val);
663 case KVM_REG_RISCV_SBI_MULTI_EN:
664 return riscv_vcpu_set_isa_ext_multi(vcpu, reg_num, reg_val, true);
665 case KVM_REG_RISCV_SBI_MULTI_DIS:
666 return riscv_vcpu_set_isa_ext_multi(vcpu, reg_num, reg_val, false);
674 static int copy_config_reg_indices(const struct kvm_vcpu *vcpu,
675 u64 __user *uindices)
679 for (int i = 0; i < sizeof(struct kvm_riscv_config)/sizeof(unsigned long);
685 * Avoid reporting config reg if the corresponding extension
688 if (i == KVM_REG_RISCV_CONFIG_REG(zicbom_block_size) &&
689 !riscv_isa_extension_available(vcpu->arch.isa, ZICBOM))
691 else if (i == KVM_REG_RISCV_CONFIG_REG(zicboz_block_size) &&
692 !riscv_isa_extension_available(vcpu->arch.isa, ZICBOZ))
695 size = IS_ENABLED(CONFIG_32BIT) ? KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
696 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CONFIG | i;
699 if (put_user(reg, uindices))
710 static unsigned long num_config_regs(const struct kvm_vcpu *vcpu)
712 return copy_config_reg_indices(vcpu, NULL);
715 static inline unsigned long num_core_regs(void)
717 return sizeof(struct kvm_riscv_core) / sizeof(unsigned long);
720 static int copy_core_reg_indices(u64 __user *uindices)
722 int n = num_core_regs();
724 for (int i = 0; i < n; i++) {
725 u64 size = IS_ENABLED(CONFIG_32BIT) ?
726 KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
727 u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CORE | i;
730 if (put_user(reg, uindices))
739 static inline unsigned long num_csr_regs(const struct kvm_vcpu *vcpu)
741 unsigned long n = sizeof(struct kvm_riscv_csr) / sizeof(unsigned long);
743 if (riscv_isa_extension_available(vcpu->arch.isa, SSAIA))
744 n += sizeof(struct kvm_riscv_aia_csr) / sizeof(unsigned long);
745 if (riscv_isa_extension_available(vcpu->arch.isa, SMSTATEEN))
746 n += sizeof(struct kvm_riscv_smstateen_csr) / sizeof(unsigned long);
751 static int copy_csr_reg_indices(const struct kvm_vcpu *vcpu,
752 u64 __user *uindices)
754 int n1 = sizeof(struct kvm_riscv_csr) / sizeof(unsigned long);
757 /* copy general csr regs */
758 for (int i = 0; i < n1; i++) {
759 u64 size = IS_ENABLED(CONFIG_32BIT) ?
760 KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
761 u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CSR |
762 KVM_REG_RISCV_CSR_GENERAL | i;
765 if (put_user(reg, uindices))
771 /* copy AIA csr regs */
772 if (riscv_isa_extension_available(vcpu->arch.isa, SSAIA)) {
773 n2 = sizeof(struct kvm_riscv_aia_csr) / sizeof(unsigned long);
775 for (int i = 0; i < n2; i++) {
776 u64 size = IS_ENABLED(CONFIG_32BIT) ?
777 KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
778 u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CSR |
779 KVM_REG_RISCV_CSR_AIA | i;
782 if (put_user(reg, uindices))
789 /* copy Smstateen csr regs */
790 if (riscv_isa_extension_available(vcpu->arch.isa, SMSTATEEN)) {
791 n3 = sizeof(struct kvm_riscv_smstateen_csr) / sizeof(unsigned long);
793 for (int i = 0; i < n3; i++) {
794 u64 size = IS_ENABLED(CONFIG_32BIT) ?
795 KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
796 u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CSR |
797 KVM_REG_RISCV_CSR_SMSTATEEN | i;
800 if (put_user(reg, uindices))
810 static inline unsigned long num_timer_regs(void)
812 return sizeof(struct kvm_riscv_timer) / sizeof(u64);
815 static int copy_timer_reg_indices(u64 __user *uindices)
817 int n = num_timer_regs();
819 for (int i = 0; i < n; i++) {
820 u64 reg = KVM_REG_RISCV | KVM_REG_SIZE_U64 |
821 KVM_REG_RISCV_TIMER | i;
824 if (put_user(reg, uindices))
833 static inline unsigned long num_fp_f_regs(const struct kvm_vcpu *vcpu)
835 const struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
837 if (riscv_isa_extension_available(vcpu->arch.isa, f))
838 return sizeof(cntx->fp.f) / sizeof(u32);
843 static int copy_fp_f_reg_indices(const struct kvm_vcpu *vcpu,
844 u64 __user *uindices)
846 int n = num_fp_f_regs(vcpu);
848 for (int i = 0; i < n; i++) {
849 u64 reg = KVM_REG_RISCV | KVM_REG_SIZE_U32 |
850 KVM_REG_RISCV_FP_F | i;
853 if (put_user(reg, uindices))
862 static inline unsigned long num_fp_d_regs(const struct kvm_vcpu *vcpu)
864 const struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
866 if (riscv_isa_extension_available(vcpu->arch.isa, d))
867 return sizeof(cntx->fp.d.f) / sizeof(u64) + 1;
872 static int copy_fp_d_reg_indices(const struct kvm_vcpu *vcpu,
873 u64 __user *uindices)
876 int n = num_fp_d_regs(vcpu);
879 /* copy fp.d.f indices */
880 for (i = 0; i < n-1; i++) {
881 reg = KVM_REG_RISCV | KVM_REG_SIZE_U64 |
882 KVM_REG_RISCV_FP_D | i;
885 if (put_user(reg, uindices))
891 /* copy fp.d.fcsr indices */
892 reg = KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_D | i;
894 if (put_user(reg, uindices))
902 static int copy_isa_ext_reg_indices(const struct kvm_vcpu *vcpu,
903 u64 __user *uindices)
906 unsigned long isa_ext;
908 for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) {
909 u64 size = IS_ENABLED(CONFIG_32BIT) ?
910 KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
911 u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_ISA_EXT | i;
913 isa_ext = kvm_isa_ext_arr[i];
914 if (!__riscv_isa_extension_available(NULL, isa_ext))
918 if (put_user(reg, uindices))
929 static inline unsigned long num_isa_ext_regs(const struct kvm_vcpu *vcpu)
931 return copy_isa_ext_reg_indices(vcpu, NULL);;
934 static int copy_sbi_ext_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
938 for (int i = 0; i < KVM_RISCV_SBI_EXT_MAX; i++) {
939 u64 size = IS_ENABLED(CONFIG_32BIT) ?
940 KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
941 u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_SBI_EXT |
942 KVM_REG_RISCV_SBI_SINGLE | i;
944 if (!riscv_vcpu_supports_sbi_ext(vcpu, i))
948 if (put_user(reg, uindices))
959 static unsigned long num_sbi_ext_regs(struct kvm_vcpu *vcpu)
961 return copy_sbi_ext_reg_indices(vcpu, NULL);
964 static int copy_sbi_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
966 struct kvm_vcpu_sbi_context *scontext = &vcpu->arch.sbi_context;
969 if (scontext->ext_status[KVM_RISCV_SBI_EXT_STA] == KVM_RISCV_SBI_EXT_STATUS_ENABLED) {
970 u64 size = IS_ENABLED(CONFIG_32BIT) ? KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
971 int n = sizeof(struct kvm_riscv_sbi_sta) / sizeof(unsigned long);
973 for (int i = 0; i < n; i++) {
974 u64 reg = KVM_REG_RISCV | size |
975 KVM_REG_RISCV_SBI_STATE |
976 KVM_REG_RISCV_SBI_STA | i;
979 if (put_user(reg, uindices))
991 static inline unsigned long num_sbi_regs(struct kvm_vcpu *vcpu)
993 return copy_sbi_reg_indices(vcpu, NULL);
996 static inline unsigned long num_vector_regs(const struct kvm_vcpu *vcpu)
998 if (!riscv_isa_extension_available(vcpu->arch.isa, v))
1001 /* vstart, vl, vtype, vcsr, vlenb and 32 vector regs */
1005 static int copy_vector_reg_indices(const struct kvm_vcpu *vcpu,
1006 u64 __user *uindices)
1008 const struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
1009 int n = num_vector_regs(vcpu);
1016 /* copy vstart, vl, vtype, vcsr and vlenb */
1017 size = IS_ENABLED(CONFIG_32BIT) ? KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
1018 for (i = 0; i < 5; i++) {
1019 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_VECTOR | i;
1022 if (put_user(reg, uindices))
1028 /* vector_regs have a variable 'vlenb' size */
1029 size = __builtin_ctzl(cntx->vector.vlenb);
1030 size <<= KVM_REG_SIZE_SHIFT;
1031 for (i = 0; i < 32; i++) {
1032 reg = KVM_REG_RISCV | KVM_REG_RISCV_VECTOR | size |
1033 KVM_REG_RISCV_VECTOR_REG(i);
1036 if (put_user(reg, uindices))
1046 * kvm_riscv_vcpu_num_regs - how many registers do we present via KVM_GET/SET_ONE_REG
1048 * This is for all registers.
1050 unsigned long kvm_riscv_vcpu_num_regs(struct kvm_vcpu *vcpu)
1052 unsigned long res = 0;
1054 res += num_config_regs(vcpu);
1055 res += num_core_regs();
1056 res += num_csr_regs(vcpu);
1057 res += num_timer_regs();
1058 res += num_fp_f_regs(vcpu);
1059 res += num_fp_d_regs(vcpu);
1060 res += num_vector_regs(vcpu);
1061 res += num_isa_ext_regs(vcpu);
1062 res += num_sbi_ext_regs(vcpu);
1063 res += num_sbi_regs(vcpu);
1069 * kvm_riscv_vcpu_copy_reg_indices - get indices of all registers.
1071 int kvm_riscv_vcpu_copy_reg_indices(struct kvm_vcpu *vcpu,
1072 u64 __user *uindices)
1076 ret = copy_config_reg_indices(vcpu, uindices);
1081 ret = copy_core_reg_indices(uindices);
1086 ret = copy_csr_reg_indices(vcpu, uindices);
1091 ret = copy_timer_reg_indices(uindices);
1096 ret = copy_fp_f_reg_indices(vcpu, uindices);
1101 ret = copy_fp_d_reg_indices(vcpu, uindices);
1106 ret = copy_vector_reg_indices(vcpu, uindices);
1111 ret = copy_isa_ext_reg_indices(vcpu, uindices);
1116 ret = copy_sbi_ext_reg_indices(vcpu, uindices);
1121 ret = copy_sbi_reg_indices(vcpu, uindices);
1129 int kvm_riscv_vcpu_set_reg(struct kvm_vcpu *vcpu,
1130 const struct kvm_one_reg *reg)
1132 switch (reg->id & KVM_REG_RISCV_TYPE_MASK) {
1133 case KVM_REG_RISCV_CONFIG:
1134 return kvm_riscv_vcpu_set_reg_config(vcpu, reg);
1135 case KVM_REG_RISCV_CORE:
1136 return kvm_riscv_vcpu_set_reg_core(vcpu, reg);
1137 case KVM_REG_RISCV_CSR:
1138 return kvm_riscv_vcpu_set_reg_csr(vcpu, reg);
1139 case KVM_REG_RISCV_TIMER:
1140 return kvm_riscv_vcpu_set_reg_timer(vcpu, reg);
1141 case KVM_REG_RISCV_FP_F:
1142 return kvm_riscv_vcpu_set_reg_fp(vcpu, reg,
1143 KVM_REG_RISCV_FP_F);
1144 case KVM_REG_RISCV_FP_D:
1145 return kvm_riscv_vcpu_set_reg_fp(vcpu, reg,
1146 KVM_REG_RISCV_FP_D);
1147 case KVM_REG_RISCV_VECTOR:
1148 return kvm_riscv_vcpu_set_reg_vector(vcpu, reg);
1149 case KVM_REG_RISCV_ISA_EXT:
1150 return kvm_riscv_vcpu_set_reg_isa_ext(vcpu, reg);
1151 case KVM_REG_RISCV_SBI_EXT:
1152 return kvm_riscv_vcpu_set_reg_sbi_ext(vcpu, reg);
1153 case KVM_REG_RISCV_SBI_STATE:
1154 return kvm_riscv_vcpu_set_reg_sbi(vcpu, reg);
1162 int kvm_riscv_vcpu_get_reg(struct kvm_vcpu *vcpu,
1163 const struct kvm_one_reg *reg)
1165 switch (reg->id & KVM_REG_RISCV_TYPE_MASK) {
1166 case KVM_REG_RISCV_CONFIG:
1167 return kvm_riscv_vcpu_get_reg_config(vcpu, reg);
1168 case KVM_REG_RISCV_CORE:
1169 return kvm_riscv_vcpu_get_reg_core(vcpu, reg);
1170 case KVM_REG_RISCV_CSR:
1171 return kvm_riscv_vcpu_get_reg_csr(vcpu, reg);
1172 case KVM_REG_RISCV_TIMER:
1173 return kvm_riscv_vcpu_get_reg_timer(vcpu, reg);
1174 case KVM_REG_RISCV_FP_F:
1175 return kvm_riscv_vcpu_get_reg_fp(vcpu, reg,
1176 KVM_REG_RISCV_FP_F);
1177 case KVM_REG_RISCV_FP_D:
1178 return kvm_riscv_vcpu_get_reg_fp(vcpu, reg,
1179 KVM_REG_RISCV_FP_D);
1180 case KVM_REG_RISCV_VECTOR:
1181 return kvm_riscv_vcpu_get_reg_vector(vcpu, reg);
1182 case KVM_REG_RISCV_ISA_EXT:
1183 return kvm_riscv_vcpu_get_reg_isa_ext(vcpu, reg);
1184 case KVM_REG_RISCV_SBI_EXT:
1185 return kvm_riscv_vcpu_get_reg_sbi_ext(vcpu, reg);
1186 case KVM_REG_RISCV_SBI_STATE:
1187 return kvm_riscv_vcpu_get_reg_sbi(vcpu, reg);