1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2019 Western Digital Corporation or its affiliates.
4 * Copyright (C) 2023 Ventana Micro Systems Inc.
5 *
6 * Authors:
7 *	Anup Patel <apatel@ventanamicro.com>
8 */
9
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/hwcap.h>
17#include <asm/kvm_vcpu_vector.h>
18#include <asm/vector.h>
19
20#define KVM_RISCV_BASE_ISA_MASK		GENMASK(25, 0)
21
22#define KVM_ISA_EXT_ARR(ext)		\
23[KVM_RISCV_ISA_EXT_##ext] = RISCV_ISA_EXT_##ext
24
25/* Mapping between KVM ISA Extension ID & Host ISA extension ID */
26static 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(SSAIA),
38	KVM_ISA_EXT_ARR(SSTC),
39	KVM_ISA_EXT_ARR(SVINVAL),
40	KVM_ISA_EXT_ARR(SVNAPOT),
41	KVM_ISA_EXT_ARR(SVPBMT),
42	KVM_ISA_EXT_ARR(ZBA),
43	KVM_ISA_EXT_ARR(ZBB),
44	KVM_ISA_EXT_ARR(ZBS),
45	KVM_ISA_EXT_ARR(ZICBOM),
46	KVM_ISA_EXT_ARR(ZICBOZ),
47	KVM_ISA_EXT_ARR(ZICNTR),
48	KVM_ISA_EXT_ARR(ZICSR),
49	KVM_ISA_EXT_ARR(ZIFENCEI),
50	KVM_ISA_EXT_ARR(ZIHINTPAUSE),
51	KVM_ISA_EXT_ARR(ZIHPM),
52};
53
54static unsigned long kvm_riscv_vcpu_base2isa_ext(unsigned long base_ext)
55{
56	unsigned long i;
57
58	for (i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) {
59		if (kvm_isa_ext_arr[i] == base_ext)
60			return i;
61	}
62
63	return KVM_RISCV_ISA_EXT_MAX;
64}
65
66static bool kvm_riscv_vcpu_isa_enable_allowed(unsigned long ext)
67{
68	switch (ext) {
69	case KVM_RISCV_ISA_EXT_H:
70		return false;
71	case KVM_RISCV_ISA_EXT_V:
72		return riscv_v_vstate_ctrl_user_allowed();
73	default:
74		break;
75	}
76
77	return true;
78}
79
80static bool kvm_riscv_vcpu_isa_disable_allowed(unsigned long ext)
81{
82	switch (ext) {
83	case KVM_RISCV_ISA_EXT_A:
84	case KVM_RISCV_ISA_EXT_C:
85	case KVM_RISCV_ISA_EXT_I:
86	case KVM_RISCV_ISA_EXT_M:
87	case KVM_RISCV_ISA_EXT_SSAIA:
88	case KVM_RISCV_ISA_EXT_SSTC:
89	case KVM_RISCV_ISA_EXT_SVINVAL:
90	case KVM_RISCV_ISA_EXT_SVNAPOT:
91	case KVM_RISCV_ISA_EXT_ZBA:
92	case KVM_RISCV_ISA_EXT_ZBB:
93	case KVM_RISCV_ISA_EXT_ZBS:
94	case KVM_RISCV_ISA_EXT_ZICNTR:
95	case KVM_RISCV_ISA_EXT_ZICSR:
96	case KVM_RISCV_ISA_EXT_ZIFENCEI:
97	case KVM_RISCV_ISA_EXT_ZIHINTPAUSE:
98	case KVM_RISCV_ISA_EXT_ZIHPM:
99		return false;
100	default:
101		break;
102	}
103
104	return true;
105}
106
107void kvm_riscv_vcpu_setup_isa(struct kvm_vcpu *vcpu)
108{
109	unsigned long host_isa, i;
110
111	for (i = 0; i < ARRAY_SIZE(kvm_isa_ext_arr); i++) {
112		host_isa = kvm_isa_ext_arr[i];
113		if (__riscv_isa_extension_available(NULL, host_isa) &&
114		    kvm_riscv_vcpu_isa_enable_allowed(i))
115			set_bit(host_isa, vcpu->arch.isa);
116	}
117}
118
119static int kvm_riscv_vcpu_get_reg_config(struct kvm_vcpu *vcpu,
120					 const struct kvm_one_reg *reg)
121{
122	unsigned long __user *uaddr =
123			(unsigned long __user *)(unsigned long)reg->addr;
124	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
125					    KVM_REG_SIZE_MASK |
126					    KVM_REG_RISCV_CONFIG);
127	unsigned long reg_val;
128
129	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
130		return -EINVAL;
131
132	switch (reg_num) {
133	case KVM_REG_RISCV_CONFIG_REG(isa):
134		reg_val = vcpu->arch.isa[0] & KVM_RISCV_BASE_ISA_MASK;
135		break;
136	case KVM_REG_RISCV_CONFIG_REG(zicbom_block_size):
137		if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOM))
138			return -ENOENT;
139		reg_val = riscv_cbom_block_size;
140		break;
141	case KVM_REG_RISCV_CONFIG_REG(zicboz_block_size):
142		if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOZ))
143			return -ENOENT;
144		reg_val = riscv_cboz_block_size;
145		break;
146	case KVM_REG_RISCV_CONFIG_REG(mvendorid):
147		reg_val = vcpu->arch.mvendorid;
148		break;
149	case KVM_REG_RISCV_CONFIG_REG(marchid):
150		reg_val = vcpu->arch.marchid;
151		break;
152	case KVM_REG_RISCV_CONFIG_REG(mimpid):
153		reg_val = vcpu->arch.mimpid;
154		break;
155	case KVM_REG_RISCV_CONFIG_REG(satp_mode):
156		reg_val = satp_mode >> SATP_MODE_SHIFT;
157		break;
158	default:
159		return -ENOENT;
160	}
161
162	if (copy_to_user(uaddr, &reg_val, KVM_REG_SIZE(reg->id)))
163		return -EFAULT;
164
165	return 0;
166}
167
168static int kvm_riscv_vcpu_set_reg_config(struct kvm_vcpu *vcpu,
169					 const struct kvm_one_reg *reg)
170{
171	unsigned long __user *uaddr =
172			(unsigned long __user *)(unsigned long)reg->addr;
173	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
174					    KVM_REG_SIZE_MASK |
175					    KVM_REG_RISCV_CONFIG);
176	unsigned long i, isa_ext, reg_val;
177
178	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
179		return -EINVAL;
180
181	if (copy_from_user(&reg_val, uaddr, KVM_REG_SIZE(reg->id)))
182		return -EFAULT;
183
184	switch (reg_num) {
185	case KVM_REG_RISCV_CONFIG_REG(isa):
186		/*
187		 * This ONE REG interface is only defined for
188		 * single letter extensions.
189		 */
190		if (fls(reg_val) >= RISCV_ISA_EXT_BASE)
191			return -EINVAL;
192
193		/*
194		 * Return early (i.e. do nothing) if reg_val is the same
195		 * value retrievable via kvm_riscv_vcpu_get_reg_config().
196		 */
197		if (reg_val == (vcpu->arch.isa[0] & KVM_RISCV_BASE_ISA_MASK))
198			break;
199
200		if (!vcpu->arch.ran_atleast_once) {
201			/* Ignore the enable/disable request for certain extensions */
202			for (i = 0; i < RISCV_ISA_EXT_BASE; i++) {
203				isa_ext = kvm_riscv_vcpu_base2isa_ext(i);
204				if (isa_ext >= KVM_RISCV_ISA_EXT_MAX) {
205					reg_val &= ~BIT(i);
206					continue;
207				}
208				if (!kvm_riscv_vcpu_isa_enable_allowed(isa_ext))
209					if (reg_val & BIT(i))
210						reg_val &= ~BIT(i);
211				if (!kvm_riscv_vcpu_isa_disable_allowed(isa_ext))
212					if (!(reg_val & BIT(i)))
213						reg_val |= BIT(i);
214			}
215			reg_val &= riscv_isa_extension_base(NULL);
216			/* Do not modify anything beyond single letter extensions */
217			reg_val = (vcpu->arch.isa[0] & ~KVM_RISCV_BASE_ISA_MASK) |
218				  (reg_val & KVM_RISCV_BASE_ISA_MASK);
219			vcpu->arch.isa[0] = reg_val;
220			kvm_riscv_vcpu_fp_reset(vcpu);
221		} else {
222			return -EBUSY;
223		}
224		break;
225	case KVM_REG_RISCV_CONFIG_REG(zicbom_block_size):
226		if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOM))
227			return -ENOENT;
228		if (reg_val != riscv_cbom_block_size)
229			return -EINVAL;
230		break;
231	case KVM_REG_RISCV_CONFIG_REG(zicboz_block_size):
232		if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOZ))
233			return -ENOENT;
234		if (reg_val != riscv_cboz_block_size)
235			return -EINVAL;
236		break;
237	case KVM_REG_RISCV_CONFIG_REG(mvendorid):
238		if (reg_val == vcpu->arch.mvendorid)
239			break;
240		if (!vcpu->arch.ran_atleast_once)
241			vcpu->arch.mvendorid = reg_val;
242		else
243			return -EBUSY;
244		break;
245	case KVM_REG_RISCV_CONFIG_REG(marchid):
246		if (reg_val == vcpu->arch.marchid)
247			break;
248		if (!vcpu->arch.ran_atleast_once)
249			vcpu->arch.marchid = reg_val;
250		else
251			return -EBUSY;
252		break;
253	case KVM_REG_RISCV_CONFIG_REG(mimpid):
254		if (reg_val == vcpu->arch.mimpid)
255			break;
256		if (!vcpu->arch.ran_atleast_once)
257			vcpu->arch.mimpid = reg_val;
258		else
259			return -EBUSY;
260		break;
261	case KVM_REG_RISCV_CONFIG_REG(satp_mode):
262		if (reg_val != (satp_mode >> SATP_MODE_SHIFT))
263			return -EINVAL;
264		break;
265	default:
266		return -ENOENT;
267	}
268
269	return 0;
270}
271
272static int kvm_riscv_vcpu_get_reg_core(struct kvm_vcpu *vcpu,
273				       const struct kvm_one_reg *reg)
274{
275	struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
276	unsigned long __user *uaddr =
277			(unsigned long __user *)(unsigned long)reg->addr;
278	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
279					    KVM_REG_SIZE_MASK |
280					    KVM_REG_RISCV_CORE);
281	unsigned long reg_val;
282
283	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
284		return -EINVAL;
285	if (reg_num >= sizeof(struct kvm_riscv_core) / sizeof(unsigned long))
286		return -ENOENT;
287
288	if (reg_num == KVM_REG_RISCV_CORE_REG(regs.pc))
289		reg_val = cntx->sepc;
290	else if (KVM_REG_RISCV_CORE_REG(regs.pc) < reg_num &&
291		 reg_num <= KVM_REG_RISCV_CORE_REG(regs.t6))
292		reg_val = ((unsigned long *)cntx)[reg_num];
293	else if (reg_num == KVM_REG_RISCV_CORE_REG(mode))
294		reg_val = (cntx->sstatus & SR_SPP) ?
295				KVM_RISCV_MODE_S : KVM_RISCV_MODE_U;
296	else
297		return -ENOENT;
298
299	if (copy_to_user(uaddr, &reg_val, KVM_REG_SIZE(reg->id)))
300		return -EFAULT;
301
302	return 0;
303}
304
305static int kvm_riscv_vcpu_set_reg_core(struct kvm_vcpu *vcpu,
306				       const struct kvm_one_reg *reg)
307{
308	struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
309	unsigned long __user *uaddr =
310			(unsigned long __user *)(unsigned long)reg->addr;
311	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
312					    KVM_REG_SIZE_MASK |
313					    KVM_REG_RISCV_CORE);
314	unsigned long reg_val;
315
316	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
317		return -EINVAL;
318	if (reg_num >= sizeof(struct kvm_riscv_core) / sizeof(unsigned long))
319		return -ENOENT;
320
321	if (copy_from_user(&reg_val, uaddr, KVM_REG_SIZE(reg->id)))
322		return -EFAULT;
323
324	if (reg_num == KVM_REG_RISCV_CORE_REG(regs.pc))
325		cntx->sepc = reg_val;
326	else if (KVM_REG_RISCV_CORE_REG(regs.pc) < reg_num &&
327		 reg_num <= KVM_REG_RISCV_CORE_REG(regs.t6))
328		((unsigned long *)cntx)[reg_num] = reg_val;
329	else if (reg_num == KVM_REG_RISCV_CORE_REG(mode)) {
330		if (reg_val == KVM_RISCV_MODE_S)
331			cntx->sstatus |= SR_SPP;
332		else
333			cntx->sstatus &= ~SR_SPP;
334	} else
335		return -ENOENT;
336
337	return 0;
338}
339
340static int kvm_riscv_vcpu_general_get_csr(struct kvm_vcpu *vcpu,
341					  unsigned long reg_num,
342					  unsigned long *out_val)
343{
344	struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
345
346	if (reg_num >= sizeof(struct kvm_riscv_csr) / sizeof(unsigned long))
347		return -ENOENT;
348
349	if (reg_num == KVM_REG_RISCV_CSR_REG(sip)) {
350		kvm_riscv_vcpu_flush_interrupts(vcpu);
351		*out_val = (csr->hvip >> VSIP_TO_HVIP_SHIFT) & VSIP_VALID_MASK;
352		*out_val |= csr->hvip & ~IRQ_LOCAL_MASK;
353	} else
354		*out_val = ((unsigned long *)csr)[reg_num];
355
356	return 0;
357}
358
359static int kvm_riscv_vcpu_general_set_csr(struct kvm_vcpu *vcpu,
360					  unsigned long reg_num,
361					  unsigned long reg_val)
362{
363	struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
364
365	if (reg_num >= sizeof(struct kvm_riscv_csr) / sizeof(unsigned long))
366		return -ENOENT;
367
368	if (reg_num == KVM_REG_RISCV_CSR_REG(sip)) {
369		reg_val &= VSIP_VALID_MASK;
370		reg_val <<= VSIP_TO_HVIP_SHIFT;
371	}
372
373	((unsigned long *)csr)[reg_num] = reg_val;
374
375	if (reg_num == KVM_REG_RISCV_CSR_REG(sip))
376		WRITE_ONCE(vcpu->arch.irqs_pending_mask[0], 0);
377
378	return 0;
379}
380
381static int kvm_riscv_vcpu_get_reg_csr(struct kvm_vcpu *vcpu,
382				      const struct kvm_one_reg *reg)
383{
384	int rc;
385	unsigned long __user *uaddr =
386			(unsigned long __user *)(unsigned long)reg->addr;
387	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
388					    KVM_REG_SIZE_MASK |
389					    KVM_REG_RISCV_CSR);
390	unsigned long reg_val, reg_subtype;
391
392	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
393		return -EINVAL;
394
395	reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
396	reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
397	switch (reg_subtype) {
398	case KVM_REG_RISCV_CSR_GENERAL:
399		rc = kvm_riscv_vcpu_general_get_csr(vcpu, reg_num, &reg_val);
400		break;
401	case KVM_REG_RISCV_CSR_AIA:
402		rc = kvm_riscv_vcpu_aia_get_csr(vcpu, reg_num, &reg_val);
403		break;
404	default:
405		rc = -ENOENT;
406		break;
407	}
408	if (rc)
409		return rc;
410
411	if (copy_to_user(uaddr, &reg_val, KVM_REG_SIZE(reg->id)))
412		return -EFAULT;
413
414	return 0;
415}
416
417static int kvm_riscv_vcpu_set_reg_csr(struct kvm_vcpu *vcpu,
418				      const struct kvm_one_reg *reg)
419{
420	int rc;
421	unsigned long __user *uaddr =
422			(unsigned long __user *)(unsigned long)reg->addr;
423	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
424					    KVM_REG_SIZE_MASK |
425					    KVM_REG_RISCV_CSR);
426	unsigned long reg_val, reg_subtype;
427
428	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
429		return -EINVAL;
430
431	if (copy_from_user(&reg_val, uaddr, KVM_REG_SIZE(reg->id)))
432		return -EFAULT;
433
434	reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
435	reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
436	switch (reg_subtype) {
437	case KVM_REG_RISCV_CSR_GENERAL:
438		rc = kvm_riscv_vcpu_general_set_csr(vcpu, reg_num, reg_val);
439		break;
440	case KVM_REG_RISCV_CSR_AIA:
441		rc = kvm_riscv_vcpu_aia_set_csr(vcpu, reg_num, reg_val);
442		break;
443	default:
444		rc = -ENOENT;
445		break;
446	}
447	if (rc)
448		return rc;
449
450	return 0;
451}
452
453static int riscv_vcpu_get_isa_ext_single(struct kvm_vcpu *vcpu,
454					 unsigned long reg_num,
455					 unsigned long *reg_val)
456{
457	unsigned long host_isa_ext;
458
459	if (reg_num >= KVM_RISCV_ISA_EXT_MAX ||
460	    reg_num >= ARRAY_SIZE(kvm_isa_ext_arr))
461		return -ENOENT;
462
463	host_isa_ext = kvm_isa_ext_arr[reg_num];
464	if (!__riscv_isa_extension_available(NULL, host_isa_ext))
465		return -ENOENT;
466
467	*reg_val = 0;
468	if (__riscv_isa_extension_available(vcpu->arch.isa, host_isa_ext))
469		*reg_val = 1; /* Mark the given extension as available */
470
471	return 0;
472}
473
474static int riscv_vcpu_set_isa_ext_single(struct kvm_vcpu *vcpu,
475					 unsigned long reg_num,
476					 unsigned long reg_val)
477{
478	unsigned long host_isa_ext;
479
480	if (reg_num >= KVM_RISCV_ISA_EXT_MAX ||
481	    reg_num >= ARRAY_SIZE(kvm_isa_ext_arr))
482		return -ENOENT;
483
484	host_isa_ext = kvm_isa_ext_arr[reg_num];
485	if (!__riscv_isa_extension_available(NULL, host_isa_ext))
486		return -ENOENT;
487
488	if (reg_val == test_bit(host_isa_ext, vcpu->arch.isa))
489		return 0;
490
491	if (!vcpu->arch.ran_atleast_once) {
492		/*
493		 * All multi-letter extension and a few single letter
494		 * extension can be disabled
495		 */
496		if (reg_val == 1 &&
497		    kvm_riscv_vcpu_isa_enable_allowed(reg_num))
498			set_bit(host_isa_ext, vcpu->arch.isa);
499		else if (!reg_val &&
500			 kvm_riscv_vcpu_isa_disable_allowed(reg_num))
501			clear_bit(host_isa_ext, vcpu->arch.isa);
502		else
503			return -EINVAL;
504		kvm_riscv_vcpu_fp_reset(vcpu);
505	} else {
506		return -EBUSY;
507	}
508
509	return 0;
510}
511
512static int riscv_vcpu_get_isa_ext_multi(struct kvm_vcpu *vcpu,
513					unsigned long reg_num,
514					unsigned long *reg_val)
515{
516	unsigned long i, ext_id, ext_val;
517
518	if (reg_num > KVM_REG_RISCV_ISA_MULTI_REG_LAST)
519		return -ENOENT;
520
521	for (i = 0; i < BITS_PER_LONG; i++) {
522		ext_id = i + reg_num * BITS_PER_LONG;
523		if (ext_id >= KVM_RISCV_ISA_EXT_MAX)
524			break;
525
526		ext_val = 0;
527		riscv_vcpu_get_isa_ext_single(vcpu, ext_id, &ext_val);
528		if (ext_val)
529			*reg_val |= KVM_REG_RISCV_ISA_MULTI_MASK(ext_id);
530	}
531
532	return 0;
533}
534
535static int riscv_vcpu_set_isa_ext_multi(struct kvm_vcpu *vcpu,
536					unsigned long reg_num,
537					unsigned long reg_val, bool enable)
538{
539	unsigned long i, ext_id;
540
541	if (reg_num > KVM_REG_RISCV_ISA_MULTI_REG_LAST)
542		return -ENOENT;
543
544	for_each_set_bit(i, &reg_val, BITS_PER_LONG) {
545		ext_id = i + reg_num * BITS_PER_LONG;
546		if (ext_id >= KVM_RISCV_ISA_EXT_MAX)
547			break;
548
549		riscv_vcpu_set_isa_ext_single(vcpu, ext_id, enable);
550	}
551
552	return 0;
553}
554
555static int kvm_riscv_vcpu_get_reg_isa_ext(struct kvm_vcpu *vcpu,
556					  const struct kvm_one_reg *reg)
557{
558	int rc;
559	unsigned long __user *uaddr =
560			(unsigned long __user *)(unsigned long)reg->addr;
561	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
562					    KVM_REG_SIZE_MASK |
563					    KVM_REG_RISCV_ISA_EXT);
564	unsigned long reg_val, reg_subtype;
565
566	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
567		return -EINVAL;
568
569	reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
570	reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
571
572	reg_val = 0;
573	switch (reg_subtype) {
574	case KVM_REG_RISCV_ISA_SINGLE:
575		rc = riscv_vcpu_get_isa_ext_single(vcpu, reg_num, &reg_val);
576		break;
577	case KVM_REG_RISCV_ISA_MULTI_EN:
578	case KVM_REG_RISCV_ISA_MULTI_DIS:
579		rc = riscv_vcpu_get_isa_ext_multi(vcpu, reg_num, &reg_val);
580		if (!rc && reg_subtype == KVM_REG_RISCV_ISA_MULTI_DIS)
581			reg_val = ~reg_val;
582		break;
583	default:
584		rc = -ENOENT;
585	}
586	if (rc)
587		return rc;
588
589	if (copy_to_user(uaddr, &reg_val, KVM_REG_SIZE(reg->id)))
590		return -EFAULT;
591
592	return 0;
593}
594
595static int kvm_riscv_vcpu_set_reg_isa_ext(struct kvm_vcpu *vcpu,
596					  const struct kvm_one_reg *reg)
597{
598	unsigned long __user *uaddr =
599			(unsigned long __user *)(unsigned long)reg->addr;
600	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
601					    KVM_REG_SIZE_MASK |
602					    KVM_REG_RISCV_ISA_EXT);
603	unsigned long reg_val, reg_subtype;
604
605	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
606		return -EINVAL;
607
608	reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
609	reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
610
611	if (copy_from_user(&reg_val, uaddr, KVM_REG_SIZE(reg->id)))
612		return -EFAULT;
613
614	switch (reg_subtype) {
615	case KVM_REG_RISCV_ISA_SINGLE:
616		return riscv_vcpu_set_isa_ext_single(vcpu, reg_num, reg_val);
617	case KVM_REG_RISCV_SBI_MULTI_EN:
618		return riscv_vcpu_set_isa_ext_multi(vcpu, reg_num, reg_val, true);
619	case KVM_REG_RISCV_SBI_MULTI_DIS:
620		return riscv_vcpu_set_isa_ext_multi(vcpu, reg_num, reg_val, false);
621	default:
622		return -ENOENT;
623	}
624
625	return 0;
626}
627
628static int copy_config_reg_indices(const struct kvm_vcpu *vcpu,
629				u64 __user *uindices)
630{
631	int n = 0;
632
633	for (int i = 0; i < sizeof(struct kvm_riscv_config)/sizeof(unsigned long);
634		 i++) {
635		u64 size;
636		u64 reg;
637
638		/*
639		 * Avoid reporting config reg if the corresponding extension
640		 * was not available.
641		 */
642		if (i == KVM_REG_RISCV_CONFIG_REG(zicbom_block_size) &&
643			!riscv_isa_extension_available(vcpu->arch.isa, ZICBOM))
644			continue;
645		else if (i == KVM_REG_RISCV_CONFIG_REG(zicboz_block_size) &&
646			!riscv_isa_extension_available(vcpu->arch.isa, ZICBOZ))
647			continue;
648
649		size = IS_ENABLED(CONFIG_32BIT) ? KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
650		reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CONFIG | i;
651
652		if (uindices) {
653			if (put_user(reg, uindices))
654				return -EFAULT;
655			uindices++;
656		}
657
658		n++;
659	}
660
661	return n;
662}
663
664static unsigned long num_config_regs(const struct kvm_vcpu *vcpu)
665{
666	return copy_config_reg_indices(vcpu, NULL);
667}
668
669static inline unsigned long num_core_regs(void)
670{
671	return sizeof(struct kvm_riscv_core) / sizeof(unsigned long);
672}
673
674static int copy_core_reg_indices(u64 __user *uindices)
675{
676	int n = num_core_regs();
677
678	for (int i = 0; i < n; i++) {
679		u64 size = IS_ENABLED(CONFIG_32BIT) ?
680			   KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
681		u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CORE | i;
682
683		if (uindices) {
684			if (put_user(reg, uindices))
685				return -EFAULT;
686			uindices++;
687		}
688	}
689
690	return n;
691}
692
693static inline unsigned long num_csr_regs(const struct kvm_vcpu *vcpu)
694{
695	unsigned long n = sizeof(struct kvm_riscv_csr) / sizeof(unsigned long);
696
697	if (riscv_isa_extension_available(vcpu->arch.isa, SSAIA))
698		n += sizeof(struct kvm_riscv_aia_csr) / sizeof(unsigned long);
699
700	return n;
701}
702
703static int copy_csr_reg_indices(const struct kvm_vcpu *vcpu,
704				u64 __user *uindices)
705{
706	int n1 = sizeof(struct kvm_riscv_csr) / sizeof(unsigned long);
707	int n2 = 0;
708
709	/* copy general csr regs */
710	for (int i = 0; i < n1; i++) {
711		u64 size = IS_ENABLED(CONFIG_32BIT) ?
712			   KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
713		u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CSR |
714				  KVM_REG_RISCV_CSR_GENERAL | i;
715
716		if (uindices) {
717			if (put_user(reg, uindices))
718				return -EFAULT;
719			uindices++;
720		}
721	}
722
723	/* copy AIA csr regs */
724	if (riscv_isa_extension_available(vcpu->arch.isa, SSAIA)) {
725		n2 = sizeof(struct kvm_riscv_aia_csr) / sizeof(unsigned long);
726
727		for (int i = 0; i < n2; i++) {
728			u64 size = IS_ENABLED(CONFIG_32BIT) ?
729				   KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
730			u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CSR |
731					  KVM_REG_RISCV_CSR_AIA | i;
732
733			if (uindices) {
734				if (put_user(reg, uindices))
735					return -EFAULT;
736				uindices++;
737			}
738		}
739	}
740
741	return n1 + n2;
742}
743
744static inline unsigned long num_timer_regs(void)
745{
746	return sizeof(struct kvm_riscv_timer) / sizeof(u64);
747}
748
749static int copy_timer_reg_indices(u64 __user *uindices)
750{
751	int n = num_timer_regs();
752
753	for (int i = 0; i < n; i++) {
754		u64 reg = KVM_REG_RISCV | KVM_REG_SIZE_U64 |
755			  KVM_REG_RISCV_TIMER | i;
756
757		if (uindices) {
758			if (put_user(reg, uindices))
759				return -EFAULT;
760			uindices++;
761		}
762	}
763
764	return n;
765}
766
767static inline unsigned long num_fp_f_regs(const struct kvm_vcpu *vcpu)
768{
769	const struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
770
771	if (riscv_isa_extension_available(vcpu->arch.isa, f))
772		return sizeof(cntx->fp.f) / sizeof(u32);
773	else
774		return 0;
775}
776
777static int copy_fp_f_reg_indices(const struct kvm_vcpu *vcpu,
778				u64 __user *uindices)
779{
780	int n = num_fp_f_regs(vcpu);
781
782	for (int i = 0; i < n; i++) {
783		u64 reg = KVM_REG_RISCV | KVM_REG_SIZE_U32 |
784			  KVM_REG_RISCV_FP_F | i;
785
786		if (uindices) {
787			if (put_user(reg, uindices))
788				return -EFAULT;
789			uindices++;
790		}
791	}
792
793	return n;
794}
795
796static inline unsigned long num_fp_d_regs(const struct kvm_vcpu *vcpu)
797{
798	const struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
799
800	if (riscv_isa_extension_available(vcpu->arch.isa, d))
801		return sizeof(cntx->fp.d.f) / sizeof(u64) + 1;
802	else
803		return 0;
804}
805
806static int copy_fp_d_reg_indices(const struct kvm_vcpu *vcpu,
807				u64 __user *uindices)
808{
809	int i;
810	int n = num_fp_d_regs(vcpu);
811	u64 reg;
812
813	/* copy fp.d.f indices */
814	for (i = 0; i < n-1; i++) {
815		reg = KVM_REG_RISCV | KVM_REG_SIZE_U64 |
816		      KVM_REG_RISCV_FP_D | i;
817
818		if (uindices) {
819			if (put_user(reg, uindices))
820				return -EFAULT;
821			uindices++;
822		}
823	}
824
825	/* copy fp.d.fcsr indices */
826	reg = KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_D | i;
827	if (uindices) {
828		if (put_user(reg, uindices))
829			return -EFAULT;
830		uindices++;
831	}
832
833	return n;
834}
835
836static int copy_isa_ext_reg_indices(const struct kvm_vcpu *vcpu,
837				u64 __user *uindices)
838{
839	unsigned int n = 0;
840	unsigned long isa_ext;
841
842	for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) {
843		u64 size = IS_ENABLED(CONFIG_32BIT) ?
844			   KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
845		u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_ISA_EXT | i;
846
847		isa_ext = kvm_isa_ext_arr[i];
848		if (!__riscv_isa_extension_available(NULL, isa_ext))
849			continue;
850
851		if (uindices) {
852			if (put_user(reg, uindices))
853				return -EFAULT;
854			uindices++;
855		}
856
857		n++;
858	}
859
860	return n;
861}
862
863static inline unsigned long num_isa_ext_regs(const struct kvm_vcpu *vcpu)
864{
865	return copy_isa_ext_reg_indices(vcpu, NULL);;
866}
867
868static inline unsigned long num_sbi_ext_regs(void)
869{
870	/*
871	 * number of KVM_REG_RISCV_SBI_SINGLE +
872	 * 2 x (number of KVM_REG_RISCV_SBI_MULTI)
873	 */
874	return KVM_RISCV_SBI_EXT_MAX + 2*(KVM_REG_RISCV_SBI_MULTI_REG_LAST+1);
875}
876
877static int copy_sbi_ext_reg_indices(u64 __user *uindices)
878{
879	int n;
880
881	/* copy KVM_REG_RISCV_SBI_SINGLE */
882	n = KVM_RISCV_SBI_EXT_MAX;
883	for (int i = 0; i < n; i++) {
884		u64 size = IS_ENABLED(CONFIG_32BIT) ?
885			   KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
886		u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_SBI_EXT |
887			  KVM_REG_RISCV_SBI_SINGLE | i;
888
889		if (uindices) {
890			if (put_user(reg, uindices))
891				return -EFAULT;
892			uindices++;
893		}
894	}
895
896	/* copy KVM_REG_RISCV_SBI_MULTI */
897	n = KVM_REG_RISCV_SBI_MULTI_REG_LAST + 1;
898	for (int i = 0; i < n; i++) {
899		u64 size = IS_ENABLED(CONFIG_32BIT) ?
900			   KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
901		u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_SBI_EXT |
902			  KVM_REG_RISCV_SBI_MULTI_EN | i;
903
904		if (uindices) {
905			if (put_user(reg, uindices))
906				return -EFAULT;
907			uindices++;
908		}
909
910		reg = KVM_REG_RISCV | size | KVM_REG_RISCV_SBI_EXT |
911			  KVM_REG_RISCV_SBI_MULTI_DIS | i;
912
913		if (uindices) {
914			if (put_user(reg, uindices))
915				return -EFAULT;
916			uindices++;
917		}
918	}
919
920	return num_sbi_ext_regs();
921}
922
923/*
924 * kvm_riscv_vcpu_num_regs - how many registers do we present via KVM_GET/SET_ONE_REG
925 *
926 * This is for all registers.
927 */
928unsigned long kvm_riscv_vcpu_num_regs(struct kvm_vcpu *vcpu)
929{
930	unsigned long res = 0;
931
932	res += num_config_regs(vcpu);
933	res += num_core_regs();
934	res += num_csr_regs(vcpu);
935	res += num_timer_regs();
936	res += num_fp_f_regs(vcpu);
937	res += num_fp_d_regs(vcpu);
938	res += num_isa_ext_regs(vcpu);
939	res += num_sbi_ext_regs();
940
941	return res;
942}
943
944/*
945 * kvm_riscv_vcpu_copy_reg_indices - get indices of all registers.
946 */
947int kvm_riscv_vcpu_copy_reg_indices(struct kvm_vcpu *vcpu,
948				    u64 __user *uindices)
949{
950	int ret;
951
952	ret = copy_config_reg_indices(vcpu, uindices);
953	if (ret < 0)
954		return ret;
955	uindices += ret;
956
957	ret = copy_core_reg_indices(uindices);
958	if (ret < 0)
959		return ret;
960	uindices += ret;
961
962	ret = copy_csr_reg_indices(vcpu, uindices);
963	if (ret < 0)
964		return ret;
965	uindices += ret;
966
967	ret = copy_timer_reg_indices(uindices);
968	if (ret < 0)
969		return ret;
970	uindices += ret;
971
972	ret = copy_fp_f_reg_indices(vcpu, uindices);
973	if (ret < 0)
974		return ret;
975	uindices += ret;
976
977	ret = copy_fp_d_reg_indices(vcpu, uindices);
978	if (ret < 0)
979		return ret;
980	uindices += ret;
981
982	ret = copy_isa_ext_reg_indices(vcpu, uindices);
983	if (ret < 0)
984		return ret;
985	uindices += ret;
986
987	ret = copy_sbi_ext_reg_indices(uindices);
988	if (ret < 0)
989		return ret;
990
991	return 0;
992}
993
994int kvm_riscv_vcpu_set_reg(struct kvm_vcpu *vcpu,
995			   const struct kvm_one_reg *reg)
996{
997	switch (reg->id & KVM_REG_RISCV_TYPE_MASK) {
998	case KVM_REG_RISCV_CONFIG:
999		return kvm_riscv_vcpu_set_reg_config(vcpu, reg);
1000	case KVM_REG_RISCV_CORE:
1001		return kvm_riscv_vcpu_set_reg_core(vcpu, reg);
1002	case KVM_REG_RISCV_CSR:
1003		return kvm_riscv_vcpu_set_reg_csr(vcpu, reg);
1004	case KVM_REG_RISCV_TIMER:
1005		return kvm_riscv_vcpu_set_reg_timer(vcpu, reg);
1006	case KVM_REG_RISCV_FP_F:
1007		return kvm_riscv_vcpu_set_reg_fp(vcpu, reg,
1008						 KVM_REG_RISCV_FP_F);
1009	case KVM_REG_RISCV_FP_D:
1010		return kvm_riscv_vcpu_set_reg_fp(vcpu, reg,
1011						 KVM_REG_RISCV_FP_D);
1012	case KVM_REG_RISCV_ISA_EXT:
1013		return kvm_riscv_vcpu_set_reg_isa_ext(vcpu, reg);
1014	case KVM_REG_RISCV_SBI_EXT:
1015		return kvm_riscv_vcpu_set_reg_sbi_ext(vcpu, reg);
1016	case KVM_REG_RISCV_VECTOR:
1017		return kvm_riscv_vcpu_set_reg_vector(vcpu, reg);
1018	default:
1019		break;
1020	}
1021
1022	return -ENOENT;
1023}
1024
1025int kvm_riscv_vcpu_get_reg(struct kvm_vcpu *vcpu,
1026			   const struct kvm_one_reg *reg)
1027{
1028	switch (reg->id & KVM_REG_RISCV_TYPE_MASK) {
1029	case KVM_REG_RISCV_CONFIG:
1030		return kvm_riscv_vcpu_get_reg_config(vcpu, reg);
1031	case KVM_REG_RISCV_CORE:
1032		return kvm_riscv_vcpu_get_reg_core(vcpu, reg);
1033	case KVM_REG_RISCV_CSR:
1034		return kvm_riscv_vcpu_get_reg_csr(vcpu, reg);
1035	case KVM_REG_RISCV_TIMER:
1036		return kvm_riscv_vcpu_get_reg_timer(vcpu, reg);
1037	case KVM_REG_RISCV_FP_F:
1038		return kvm_riscv_vcpu_get_reg_fp(vcpu, reg,
1039						 KVM_REG_RISCV_FP_F);
1040	case KVM_REG_RISCV_FP_D:
1041		return kvm_riscv_vcpu_get_reg_fp(vcpu, reg,
1042						 KVM_REG_RISCV_FP_D);
1043	case KVM_REG_RISCV_ISA_EXT:
1044		return kvm_riscv_vcpu_get_reg_isa_ext(vcpu, reg);
1045	case KVM_REG_RISCV_SBI_EXT:
1046		return kvm_riscv_vcpu_get_reg_sbi_ext(vcpu, reg);
1047	case KVM_REG_RISCV_VECTOR:
1048		return kvm_riscv_vcpu_get_reg_vector(vcpu, reg);
1049	default:
1050		break;
1051	}
1052
1053	return -ENOENT;
1054}
1055