xref: /linux/arch/riscv/kvm/vcpu_onereg.c (revision 021bc4b9)
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/cpufeature.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 */
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),
43 	KVM_ISA_EXT_ARR(ZBA),
44 	KVM_ISA_EXT_ARR(ZBB),
45 	KVM_ISA_EXT_ARR(ZBC),
46 	KVM_ISA_EXT_ARR(ZBKB),
47 	KVM_ISA_EXT_ARR(ZBKC),
48 	KVM_ISA_EXT_ARR(ZBKX),
49 	KVM_ISA_EXT_ARR(ZBS),
50 	KVM_ISA_EXT_ARR(ZFA),
51 	KVM_ISA_EXT_ARR(ZFH),
52 	KVM_ISA_EXT_ARR(ZFHMIN),
53 	KVM_ISA_EXT_ARR(ZICBOM),
54 	KVM_ISA_EXT_ARR(ZICBOZ),
55 	KVM_ISA_EXT_ARR(ZICNTR),
56 	KVM_ISA_EXT_ARR(ZICOND),
57 	KVM_ISA_EXT_ARR(ZICSR),
58 	KVM_ISA_EXT_ARR(ZIFENCEI),
59 	KVM_ISA_EXT_ARR(ZIHINTNTL),
60 	KVM_ISA_EXT_ARR(ZIHINTPAUSE),
61 	KVM_ISA_EXT_ARR(ZIHPM),
62 	KVM_ISA_EXT_ARR(ZKND),
63 	KVM_ISA_EXT_ARR(ZKNE),
64 	KVM_ISA_EXT_ARR(ZKNH),
65 	KVM_ISA_EXT_ARR(ZKR),
66 	KVM_ISA_EXT_ARR(ZKSED),
67 	KVM_ISA_EXT_ARR(ZKSH),
68 	KVM_ISA_EXT_ARR(ZKT),
69 	KVM_ISA_EXT_ARR(ZVBB),
70 	KVM_ISA_EXT_ARR(ZVBC),
71 	KVM_ISA_EXT_ARR(ZVFH),
72 	KVM_ISA_EXT_ARR(ZVFHMIN),
73 	KVM_ISA_EXT_ARR(ZVKB),
74 	KVM_ISA_EXT_ARR(ZVKG),
75 	KVM_ISA_EXT_ARR(ZVKNED),
76 	KVM_ISA_EXT_ARR(ZVKNHA),
77 	KVM_ISA_EXT_ARR(ZVKNHB),
78 	KVM_ISA_EXT_ARR(ZVKSED),
79 	KVM_ISA_EXT_ARR(ZVKSH),
80 	KVM_ISA_EXT_ARR(ZVKT),
81 };
82 
83 static unsigned long kvm_riscv_vcpu_base2isa_ext(unsigned long base_ext)
84 {
85 	unsigned long i;
86 
87 	for (i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) {
88 		if (kvm_isa_ext_arr[i] == base_ext)
89 			return i;
90 	}
91 
92 	return KVM_RISCV_ISA_EXT_MAX;
93 }
94 
95 static bool kvm_riscv_vcpu_isa_enable_allowed(unsigned long ext)
96 {
97 	switch (ext) {
98 	case KVM_RISCV_ISA_EXT_H:
99 		return false;
100 	case KVM_RISCV_ISA_EXT_V:
101 		return riscv_v_vstate_ctrl_user_allowed();
102 	default:
103 		break;
104 	}
105 
106 	return true;
107 }
108 
109 static bool kvm_riscv_vcpu_isa_disable_allowed(unsigned long ext)
110 {
111 	switch (ext) {
112 	/* Extensions which don't have any mechanism to disable */
113 	case KVM_RISCV_ISA_EXT_A:
114 	case KVM_RISCV_ISA_EXT_C:
115 	case KVM_RISCV_ISA_EXT_I:
116 	case KVM_RISCV_ISA_EXT_M:
117 	case KVM_RISCV_ISA_EXT_SSTC:
118 	case KVM_RISCV_ISA_EXT_SVINVAL:
119 	case KVM_RISCV_ISA_EXT_SVNAPOT:
120 	case KVM_RISCV_ISA_EXT_ZBA:
121 	case KVM_RISCV_ISA_EXT_ZBB:
122 	case KVM_RISCV_ISA_EXT_ZBC:
123 	case KVM_RISCV_ISA_EXT_ZBKB:
124 	case KVM_RISCV_ISA_EXT_ZBKC:
125 	case KVM_RISCV_ISA_EXT_ZBKX:
126 	case KVM_RISCV_ISA_EXT_ZBS:
127 	case KVM_RISCV_ISA_EXT_ZFA:
128 	case KVM_RISCV_ISA_EXT_ZFH:
129 	case KVM_RISCV_ISA_EXT_ZFHMIN:
130 	case KVM_RISCV_ISA_EXT_ZICNTR:
131 	case KVM_RISCV_ISA_EXT_ZICOND:
132 	case KVM_RISCV_ISA_EXT_ZICSR:
133 	case KVM_RISCV_ISA_EXT_ZIFENCEI:
134 	case KVM_RISCV_ISA_EXT_ZIHINTNTL:
135 	case KVM_RISCV_ISA_EXT_ZIHINTPAUSE:
136 	case KVM_RISCV_ISA_EXT_ZIHPM:
137 	case KVM_RISCV_ISA_EXT_ZKND:
138 	case KVM_RISCV_ISA_EXT_ZKNE:
139 	case KVM_RISCV_ISA_EXT_ZKNH:
140 	case KVM_RISCV_ISA_EXT_ZKR:
141 	case KVM_RISCV_ISA_EXT_ZKSED:
142 	case KVM_RISCV_ISA_EXT_ZKSH:
143 	case KVM_RISCV_ISA_EXT_ZKT:
144 	case KVM_RISCV_ISA_EXT_ZVBB:
145 	case KVM_RISCV_ISA_EXT_ZVBC:
146 	case KVM_RISCV_ISA_EXT_ZVFH:
147 	case KVM_RISCV_ISA_EXT_ZVFHMIN:
148 	case KVM_RISCV_ISA_EXT_ZVKB:
149 	case KVM_RISCV_ISA_EXT_ZVKG:
150 	case KVM_RISCV_ISA_EXT_ZVKNED:
151 	case KVM_RISCV_ISA_EXT_ZVKNHA:
152 	case KVM_RISCV_ISA_EXT_ZVKNHB:
153 	case KVM_RISCV_ISA_EXT_ZVKSED:
154 	case KVM_RISCV_ISA_EXT_ZVKSH:
155 	case KVM_RISCV_ISA_EXT_ZVKT:
156 		return false;
157 	/* Extensions which can be disabled using Smstateen */
158 	case KVM_RISCV_ISA_EXT_SSAIA:
159 		return riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN);
160 	default:
161 		break;
162 	}
163 
164 	return true;
165 }
166 
167 void kvm_riscv_vcpu_setup_isa(struct kvm_vcpu *vcpu)
168 {
169 	unsigned long host_isa, i;
170 
171 	for (i = 0; i < ARRAY_SIZE(kvm_isa_ext_arr); i++) {
172 		host_isa = kvm_isa_ext_arr[i];
173 		if (__riscv_isa_extension_available(NULL, host_isa) &&
174 		    kvm_riscv_vcpu_isa_enable_allowed(i))
175 			set_bit(host_isa, vcpu->arch.isa);
176 	}
177 }
178 
179 static int kvm_riscv_vcpu_get_reg_config(struct kvm_vcpu *vcpu,
180 					 const struct kvm_one_reg *reg)
181 {
182 	unsigned long __user *uaddr =
183 			(unsigned long __user *)(unsigned long)reg->addr;
184 	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
185 					    KVM_REG_SIZE_MASK |
186 					    KVM_REG_RISCV_CONFIG);
187 	unsigned long reg_val;
188 
189 	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
190 		return -EINVAL;
191 
192 	switch (reg_num) {
193 	case KVM_REG_RISCV_CONFIG_REG(isa):
194 		reg_val = vcpu->arch.isa[0] & KVM_RISCV_BASE_ISA_MASK;
195 		break;
196 	case KVM_REG_RISCV_CONFIG_REG(zicbom_block_size):
197 		if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOM))
198 			return -ENOENT;
199 		reg_val = riscv_cbom_block_size;
200 		break;
201 	case KVM_REG_RISCV_CONFIG_REG(zicboz_block_size):
202 		if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOZ))
203 			return -ENOENT;
204 		reg_val = riscv_cboz_block_size;
205 		break;
206 	case KVM_REG_RISCV_CONFIG_REG(mvendorid):
207 		reg_val = vcpu->arch.mvendorid;
208 		break;
209 	case KVM_REG_RISCV_CONFIG_REG(marchid):
210 		reg_val = vcpu->arch.marchid;
211 		break;
212 	case KVM_REG_RISCV_CONFIG_REG(mimpid):
213 		reg_val = vcpu->arch.mimpid;
214 		break;
215 	case KVM_REG_RISCV_CONFIG_REG(satp_mode):
216 		reg_val = satp_mode >> SATP_MODE_SHIFT;
217 		break;
218 	default:
219 		return -ENOENT;
220 	}
221 
222 	if (copy_to_user(uaddr, &reg_val, KVM_REG_SIZE(reg->id)))
223 		return -EFAULT;
224 
225 	return 0;
226 }
227 
228 static int kvm_riscv_vcpu_set_reg_config(struct kvm_vcpu *vcpu,
229 					 const struct kvm_one_reg *reg)
230 {
231 	unsigned long __user *uaddr =
232 			(unsigned long __user *)(unsigned long)reg->addr;
233 	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
234 					    KVM_REG_SIZE_MASK |
235 					    KVM_REG_RISCV_CONFIG);
236 	unsigned long i, isa_ext, reg_val;
237 
238 	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
239 		return -EINVAL;
240 
241 	if (copy_from_user(&reg_val, uaddr, KVM_REG_SIZE(reg->id)))
242 		return -EFAULT;
243 
244 	switch (reg_num) {
245 	case KVM_REG_RISCV_CONFIG_REG(isa):
246 		/*
247 		 * This ONE REG interface is only defined for
248 		 * single letter extensions.
249 		 */
250 		if (fls(reg_val) >= RISCV_ISA_EXT_BASE)
251 			return -EINVAL;
252 
253 		/*
254 		 * Return early (i.e. do nothing) if reg_val is the same
255 		 * value retrievable via kvm_riscv_vcpu_get_reg_config().
256 		 */
257 		if (reg_val == (vcpu->arch.isa[0] & KVM_RISCV_BASE_ISA_MASK))
258 			break;
259 
260 		if (!vcpu->arch.ran_atleast_once) {
261 			/* Ignore the enable/disable request for certain extensions */
262 			for (i = 0; i < RISCV_ISA_EXT_BASE; i++) {
263 				isa_ext = kvm_riscv_vcpu_base2isa_ext(i);
264 				if (isa_ext >= KVM_RISCV_ISA_EXT_MAX) {
265 					reg_val &= ~BIT(i);
266 					continue;
267 				}
268 				if (!kvm_riscv_vcpu_isa_enable_allowed(isa_ext))
269 					if (reg_val & BIT(i))
270 						reg_val &= ~BIT(i);
271 				if (!kvm_riscv_vcpu_isa_disable_allowed(isa_ext))
272 					if (!(reg_val & BIT(i)))
273 						reg_val |= BIT(i);
274 			}
275 			reg_val &= riscv_isa_extension_base(NULL);
276 			/* Do not modify anything beyond single letter extensions */
277 			reg_val = (vcpu->arch.isa[0] & ~KVM_RISCV_BASE_ISA_MASK) |
278 				  (reg_val & KVM_RISCV_BASE_ISA_MASK);
279 			vcpu->arch.isa[0] = reg_val;
280 			kvm_riscv_vcpu_fp_reset(vcpu);
281 		} else {
282 			return -EBUSY;
283 		}
284 		break;
285 	case KVM_REG_RISCV_CONFIG_REG(zicbom_block_size):
286 		if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOM))
287 			return -ENOENT;
288 		if (reg_val != riscv_cbom_block_size)
289 			return -EINVAL;
290 		break;
291 	case KVM_REG_RISCV_CONFIG_REG(zicboz_block_size):
292 		if (!riscv_isa_extension_available(vcpu->arch.isa, ZICBOZ))
293 			return -ENOENT;
294 		if (reg_val != riscv_cboz_block_size)
295 			return -EINVAL;
296 		break;
297 	case KVM_REG_RISCV_CONFIG_REG(mvendorid):
298 		if (reg_val == vcpu->arch.mvendorid)
299 			break;
300 		if (!vcpu->arch.ran_atleast_once)
301 			vcpu->arch.mvendorid = reg_val;
302 		else
303 			return -EBUSY;
304 		break;
305 	case KVM_REG_RISCV_CONFIG_REG(marchid):
306 		if (reg_val == vcpu->arch.marchid)
307 			break;
308 		if (!vcpu->arch.ran_atleast_once)
309 			vcpu->arch.marchid = reg_val;
310 		else
311 			return -EBUSY;
312 		break;
313 	case KVM_REG_RISCV_CONFIG_REG(mimpid):
314 		if (reg_val == vcpu->arch.mimpid)
315 			break;
316 		if (!vcpu->arch.ran_atleast_once)
317 			vcpu->arch.mimpid = reg_val;
318 		else
319 			return -EBUSY;
320 		break;
321 	case KVM_REG_RISCV_CONFIG_REG(satp_mode):
322 		if (reg_val != (satp_mode >> SATP_MODE_SHIFT))
323 			return -EINVAL;
324 		break;
325 	default:
326 		return -ENOENT;
327 	}
328 
329 	return 0;
330 }
331 
332 static int kvm_riscv_vcpu_get_reg_core(struct kvm_vcpu *vcpu,
333 				       const struct kvm_one_reg *reg)
334 {
335 	struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
336 	unsigned long __user *uaddr =
337 			(unsigned long __user *)(unsigned long)reg->addr;
338 	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
339 					    KVM_REG_SIZE_MASK |
340 					    KVM_REG_RISCV_CORE);
341 	unsigned long reg_val;
342 
343 	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
344 		return -EINVAL;
345 	if (reg_num >= sizeof(struct kvm_riscv_core) / sizeof(unsigned long))
346 		return -ENOENT;
347 
348 	if (reg_num == KVM_REG_RISCV_CORE_REG(regs.pc))
349 		reg_val = cntx->sepc;
350 	else if (KVM_REG_RISCV_CORE_REG(regs.pc) < reg_num &&
351 		 reg_num <= KVM_REG_RISCV_CORE_REG(regs.t6))
352 		reg_val = ((unsigned long *)cntx)[reg_num];
353 	else if (reg_num == KVM_REG_RISCV_CORE_REG(mode))
354 		reg_val = (cntx->sstatus & SR_SPP) ?
355 				KVM_RISCV_MODE_S : KVM_RISCV_MODE_U;
356 	else
357 		return -ENOENT;
358 
359 	if (copy_to_user(uaddr, &reg_val, KVM_REG_SIZE(reg->id)))
360 		return -EFAULT;
361 
362 	return 0;
363 }
364 
365 static int kvm_riscv_vcpu_set_reg_core(struct kvm_vcpu *vcpu,
366 				       const struct kvm_one_reg *reg)
367 {
368 	struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
369 	unsigned long __user *uaddr =
370 			(unsigned long __user *)(unsigned long)reg->addr;
371 	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
372 					    KVM_REG_SIZE_MASK |
373 					    KVM_REG_RISCV_CORE);
374 	unsigned long reg_val;
375 
376 	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
377 		return -EINVAL;
378 	if (reg_num >= sizeof(struct kvm_riscv_core) / sizeof(unsigned long))
379 		return -ENOENT;
380 
381 	if (copy_from_user(&reg_val, uaddr, KVM_REG_SIZE(reg->id)))
382 		return -EFAULT;
383 
384 	if (reg_num == KVM_REG_RISCV_CORE_REG(regs.pc))
385 		cntx->sepc = reg_val;
386 	else if (KVM_REG_RISCV_CORE_REG(regs.pc) < reg_num &&
387 		 reg_num <= KVM_REG_RISCV_CORE_REG(regs.t6))
388 		((unsigned long *)cntx)[reg_num] = reg_val;
389 	else if (reg_num == KVM_REG_RISCV_CORE_REG(mode)) {
390 		if (reg_val == KVM_RISCV_MODE_S)
391 			cntx->sstatus |= SR_SPP;
392 		else
393 			cntx->sstatus &= ~SR_SPP;
394 	} else
395 		return -ENOENT;
396 
397 	return 0;
398 }
399 
400 static int kvm_riscv_vcpu_general_get_csr(struct kvm_vcpu *vcpu,
401 					  unsigned long reg_num,
402 					  unsigned long *out_val)
403 {
404 	struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
405 
406 	if (reg_num >= sizeof(struct kvm_riscv_csr) / sizeof(unsigned long))
407 		return -ENOENT;
408 
409 	if (reg_num == KVM_REG_RISCV_CSR_REG(sip)) {
410 		kvm_riscv_vcpu_flush_interrupts(vcpu);
411 		*out_val = (csr->hvip >> VSIP_TO_HVIP_SHIFT) & VSIP_VALID_MASK;
412 		*out_val |= csr->hvip & ~IRQ_LOCAL_MASK;
413 	} else
414 		*out_val = ((unsigned long *)csr)[reg_num];
415 
416 	return 0;
417 }
418 
419 static int kvm_riscv_vcpu_general_set_csr(struct kvm_vcpu *vcpu,
420 					  unsigned long reg_num,
421 					  unsigned long reg_val)
422 {
423 	struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
424 
425 	if (reg_num >= sizeof(struct kvm_riscv_csr) / sizeof(unsigned long))
426 		return -ENOENT;
427 
428 	if (reg_num == KVM_REG_RISCV_CSR_REG(sip)) {
429 		reg_val &= VSIP_VALID_MASK;
430 		reg_val <<= VSIP_TO_HVIP_SHIFT;
431 	}
432 
433 	((unsigned long *)csr)[reg_num] = reg_val;
434 
435 	if (reg_num == KVM_REG_RISCV_CSR_REG(sip))
436 		WRITE_ONCE(vcpu->arch.irqs_pending_mask[0], 0);
437 
438 	return 0;
439 }
440 
441 static inline int kvm_riscv_vcpu_smstateen_set_csr(struct kvm_vcpu *vcpu,
442 						   unsigned long reg_num,
443 						   unsigned long reg_val)
444 {
445 	struct kvm_vcpu_smstateen_csr *csr = &vcpu->arch.smstateen_csr;
446 
447 	if (reg_num >= sizeof(struct kvm_riscv_smstateen_csr) /
448 		sizeof(unsigned long))
449 		return -EINVAL;
450 
451 	((unsigned long *)csr)[reg_num] = reg_val;
452 	return 0;
453 }
454 
455 static int kvm_riscv_vcpu_smstateen_get_csr(struct kvm_vcpu *vcpu,
456 					    unsigned long reg_num,
457 					    unsigned long *out_val)
458 {
459 	struct kvm_vcpu_smstateen_csr *csr = &vcpu->arch.smstateen_csr;
460 
461 	if (reg_num >= sizeof(struct kvm_riscv_smstateen_csr) /
462 		sizeof(unsigned long))
463 		return -EINVAL;
464 
465 	*out_val = ((unsigned long *)csr)[reg_num];
466 	return 0;
467 }
468 
469 static int kvm_riscv_vcpu_get_reg_csr(struct kvm_vcpu *vcpu,
470 				      const struct kvm_one_reg *reg)
471 {
472 	int rc;
473 	unsigned long __user *uaddr =
474 			(unsigned long __user *)(unsigned long)reg->addr;
475 	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
476 					    KVM_REG_SIZE_MASK |
477 					    KVM_REG_RISCV_CSR);
478 	unsigned long reg_val, reg_subtype;
479 
480 	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
481 		return -EINVAL;
482 
483 	reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
484 	reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
485 	switch (reg_subtype) {
486 	case KVM_REG_RISCV_CSR_GENERAL:
487 		rc = kvm_riscv_vcpu_general_get_csr(vcpu, reg_num, &reg_val);
488 		break;
489 	case KVM_REG_RISCV_CSR_AIA:
490 		rc = kvm_riscv_vcpu_aia_get_csr(vcpu, reg_num, &reg_val);
491 		break;
492 	case KVM_REG_RISCV_CSR_SMSTATEEN:
493 		rc = -EINVAL;
494 		if (riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN))
495 			rc = kvm_riscv_vcpu_smstateen_get_csr(vcpu, reg_num,
496 							      &reg_val);
497 		break;
498 	default:
499 		rc = -ENOENT;
500 		break;
501 	}
502 	if (rc)
503 		return rc;
504 
505 	if (copy_to_user(uaddr, &reg_val, KVM_REG_SIZE(reg->id)))
506 		return -EFAULT;
507 
508 	return 0;
509 }
510 
511 static int kvm_riscv_vcpu_set_reg_csr(struct kvm_vcpu *vcpu,
512 				      const struct kvm_one_reg *reg)
513 {
514 	int rc;
515 	unsigned long __user *uaddr =
516 			(unsigned long __user *)(unsigned long)reg->addr;
517 	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
518 					    KVM_REG_SIZE_MASK |
519 					    KVM_REG_RISCV_CSR);
520 	unsigned long reg_val, reg_subtype;
521 
522 	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
523 		return -EINVAL;
524 
525 	if (copy_from_user(&reg_val, uaddr, KVM_REG_SIZE(reg->id)))
526 		return -EFAULT;
527 
528 	reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
529 	reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
530 	switch (reg_subtype) {
531 	case KVM_REG_RISCV_CSR_GENERAL:
532 		rc = kvm_riscv_vcpu_general_set_csr(vcpu, reg_num, reg_val);
533 		break;
534 	case KVM_REG_RISCV_CSR_AIA:
535 		rc = kvm_riscv_vcpu_aia_set_csr(vcpu, reg_num, reg_val);
536 		break;
537 	case KVM_REG_RISCV_CSR_SMSTATEEN:
538 		rc = -EINVAL;
539 		if (riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN))
540 			rc = kvm_riscv_vcpu_smstateen_set_csr(vcpu, reg_num,
541 							      reg_val);
542 		break;
543 	default:
544 		rc = -ENOENT;
545 		break;
546 	}
547 	if (rc)
548 		return rc;
549 
550 	return 0;
551 }
552 
553 static int riscv_vcpu_get_isa_ext_single(struct kvm_vcpu *vcpu,
554 					 unsigned long reg_num,
555 					 unsigned long *reg_val)
556 {
557 	unsigned long host_isa_ext;
558 
559 	if (reg_num >= KVM_RISCV_ISA_EXT_MAX ||
560 	    reg_num >= ARRAY_SIZE(kvm_isa_ext_arr))
561 		return -ENOENT;
562 
563 	host_isa_ext = kvm_isa_ext_arr[reg_num];
564 	if (!__riscv_isa_extension_available(NULL, host_isa_ext))
565 		return -ENOENT;
566 
567 	*reg_val = 0;
568 	if (__riscv_isa_extension_available(vcpu->arch.isa, host_isa_ext))
569 		*reg_val = 1; /* Mark the given extension as available */
570 
571 	return 0;
572 }
573 
574 static int riscv_vcpu_set_isa_ext_single(struct kvm_vcpu *vcpu,
575 					 unsigned long reg_num,
576 					 unsigned long reg_val)
577 {
578 	unsigned long host_isa_ext;
579 
580 	if (reg_num >= KVM_RISCV_ISA_EXT_MAX ||
581 	    reg_num >= ARRAY_SIZE(kvm_isa_ext_arr))
582 		return -ENOENT;
583 
584 	host_isa_ext = kvm_isa_ext_arr[reg_num];
585 	if (!__riscv_isa_extension_available(NULL, host_isa_ext))
586 		return -ENOENT;
587 
588 	if (reg_val == test_bit(host_isa_ext, vcpu->arch.isa))
589 		return 0;
590 
591 	if (!vcpu->arch.ran_atleast_once) {
592 		/*
593 		 * All multi-letter extension and a few single letter
594 		 * extension can be disabled
595 		 */
596 		if (reg_val == 1 &&
597 		    kvm_riscv_vcpu_isa_enable_allowed(reg_num))
598 			set_bit(host_isa_ext, vcpu->arch.isa);
599 		else if (!reg_val &&
600 			 kvm_riscv_vcpu_isa_disable_allowed(reg_num))
601 			clear_bit(host_isa_ext, vcpu->arch.isa);
602 		else
603 			return -EINVAL;
604 		kvm_riscv_vcpu_fp_reset(vcpu);
605 	} else {
606 		return -EBUSY;
607 	}
608 
609 	return 0;
610 }
611 
612 static int riscv_vcpu_get_isa_ext_multi(struct kvm_vcpu *vcpu,
613 					unsigned long reg_num,
614 					unsigned long *reg_val)
615 {
616 	unsigned long i, ext_id, ext_val;
617 
618 	if (reg_num > KVM_REG_RISCV_ISA_MULTI_REG_LAST)
619 		return -ENOENT;
620 
621 	for (i = 0; i < BITS_PER_LONG; i++) {
622 		ext_id = i + reg_num * BITS_PER_LONG;
623 		if (ext_id >= KVM_RISCV_ISA_EXT_MAX)
624 			break;
625 
626 		ext_val = 0;
627 		riscv_vcpu_get_isa_ext_single(vcpu, ext_id, &ext_val);
628 		if (ext_val)
629 			*reg_val |= KVM_REG_RISCV_ISA_MULTI_MASK(ext_id);
630 	}
631 
632 	return 0;
633 }
634 
635 static int riscv_vcpu_set_isa_ext_multi(struct kvm_vcpu *vcpu,
636 					unsigned long reg_num,
637 					unsigned long reg_val, bool enable)
638 {
639 	unsigned long i, ext_id;
640 
641 	if (reg_num > KVM_REG_RISCV_ISA_MULTI_REG_LAST)
642 		return -ENOENT;
643 
644 	for_each_set_bit(i, &reg_val, BITS_PER_LONG) {
645 		ext_id = i + reg_num * BITS_PER_LONG;
646 		if (ext_id >= KVM_RISCV_ISA_EXT_MAX)
647 			break;
648 
649 		riscv_vcpu_set_isa_ext_single(vcpu, ext_id, enable);
650 	}
651 
652 	return 0;
653 }
654 
655 static int kvm_riscv_vcpu_get_reg_isa_ext(struct kvm_vcpu *vcpu,
656 					  const struct kvm_one_reg *reg)
657 {
658 	int rc;
659 	unsigned long __user *uaddr =
660 			(unsigned long __user *)(unsigned long)reg->addr;
661 	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
662 					    KVM_REG_SIZE_MASK |
663 					    KVM_REG_RISCV_ISA_EXT);
664 	unsigned long reg_val, reg_subtype;
665 
666 	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
667 		return -EINVAL;
668 
669 	reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
670 	reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
671 
672 	reg_val = 0;
673 	switch (reg_subtype) {
674 	case KVM_REG_RISCV_ISA_SINGLE:
675 		rc = riscv_vcpu_get_isa_ext_single(vcpu, reg_num, &reg_val);
676 		break;
677 	case KVM_REG_RISCV_ISA_MULTI_EN:
678 	case KVM_REG_RISCV_ISA_MULTI_DIS:
679 		rc = riscv_vcpu_get_isa_ext_multi(vcpu, reg_num, &reg_val);
680 		if (!rc && reg_subtype == KVM_REG_RISCV_ISA_MULTI_DIS)
681 			reg_val = ~reg_val;
682 		break;
683 	default:
684 		rc = -ENOENT;
685 	}
686 	if (rc)
687 		return rc;
688 
689 	if (copy_to_user(uaddr, &reg_val, KVM_REG_SIZE(reg->id)))
690 		return -EFAULT;
691 
692 	return 0;
693 }
694 
695 static int kvm_riscv_vcpu_set_reg_isa_ext(struct kvm_vcpu *vcpu,
696 					  const struct kvm_one_reg *reg)
697 {
698 	unsigned long __user *uaddr =
699 			(unsigned long __user *)(unsigned long)reg->addr;
700 	unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
701 					    KVM_REG_SIZE_MASK |
702 					    KVM_REG_RISCV_ISA_EXT);
703 	unsigned long reg_val, reg_subtype;
704 
705 	if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
706 		return -EINVAL;
707 
708 	reg_subtype = reg_num & KVM_REG_RISCV_SUBTYPE_MASK;
709 	reg_num &= ~KVM_REG_RISCV_SUBTYPE_MASK;
710 
711 	if (copy_from_user(&reg_val, uaddr, KVM_REG_SIZE(reg->id)))
712 		return -EFAULT;
713 
714 	switch (reg_subtype) {
715 	case KVM_REG_RISCV_ISA_SINGLE:
716 		return riscv_vcpu_set_isa_ext_single(vcpu, reg_num, reg_val);
717 	case KVM_REG_RISCV_SBI_MULTI_EN:
718 		return riscv_vcpu_set_isa_ext_multi(vcpu, reg_num, reg_val, true);
719 	case KVM_REG_RISCV_SBI_MULTI_DIS:
720 		return riscv_vcpu_set_isa_ext_multi(vcpu, reg_num, reg_val, false);
721 	default:
722 		return -ENOENT;
723 	}
724 
725 	return 0;
726 }
727 
728 static int copy_config_reg_indices(const struct kvm_vcpu *vcpu,
729 				u64 __user *uindices)
730 {
731 	int n = 0;
732 
733 	for (int i = 0; i < sizeof(struct kvm_riscv_config)/sizeof(unsigned long);
734 		 i++) {
735 		u64 size;
736 		u64 reg;
737 
738 		/*
739 		 * Avoid reporting config reg if the corresponding extension
740 		 * was not available.
741 		 */
742 		if (i == KVM_REG_RISCV_CONFIG_REG(zicbom_block_size) &&
743 			!riscv_isa_extension_available(vcpu->arch.isa, ZICBOM))
744 			continue;
745 		else if (i == KVM_REG_RISCV_CONFIG_REG(zicboz_block_size) &&
746 			!riscv_isa_extension_available(vcpu->arch.isa, ZICBOZ))
747 			continue;
748 
749 		size = IS_ENABLED(CONFIG_32BIT) ? KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
750 		reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CONFIG | i;
751 
752 		if (uindices) {
753 			if (put_user(reg, uindices))
754 				return -EFAULT;
755 			uindices++;
756 		}
757 
758 		n++;
759 	}
760 
761 	return n;
762 }
763 
764 static unsigned long num_config_regs(const struct kvm_vcpu *vcpu)
765 {
766 	return copy_config_reg_indices(vcpu, NULL);
767 }
768 
769 static inline unsigned long num_core_regs(void)
770 {
771 	return sizeof(struct kvm_riscv_core) / sizeof(unsigned long);
772 }
773 
774 static int copy_core_reg_indices(u64 __user *uindices)
775 {
776 	int n = num_core_regs();
777 
778 	for (int i = 0; i < n; i++) {
779 		u64 size = IS_ENABLED(CONFIG_32BIT) ?
780 			   KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
781 		u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CORE | i;
782 
783 		if (uindices) {
784 			if (put_user(reg, uindices))
785 				return -EFAULT;
786 			uindices++;
787 		}
788 	}
789 
790 	return n;
791 }
792 
793 static inline unsigned long num_csr_regs(const struct kvm_vcpu *vcpu)
794 {
795 	unsigned long n = sizeof(struct kvm_riscv_csr) / sizeof(unsigned long);
796 
797 	if (riscv_isa_extension_available(vcpu->arch.isa, SSAIA))
798 		n += sizeof(struct kvm_riscv_aia_csr) / sizeof(unsigned long);
799 	if (riscv_isa_extension_available(vcpu->arch.isa, SMSTATEEN))
800 		n += sizeof(struct kvm_riscv_smstateen_csr) / sizeof(unsigned long);
801 
802 	return n;
803 }
804 
805 static int copy_csr_reg_indices(const struct kvm_vcpu *vcpu,
806 				u64 __user *uindices)
807 {
808 	int n1 = sizeof(struct kvm_riscv_csr) / sizeof(unsigned long);
809 	int n2 = 0, n3 = 0;
810 
811 	/* copy general csr regs */
812 	for (int i = 0; i < n1; i++) {
813 		u64 size = IS_ENABLED(CONFIG_32BIT) ?
814 			   KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
815 		u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CSR |
816 				  KVM_REG_RISCV_CSR_GENERAL | i;
817 
818 		if (uindices) {
819 			if (put_user(reg, uindices))
820 				return -EFAULT;
821 			uindices++;
822 		}
823 	}
824 
825 	/* copy AIA csr regs */
826 	if (riscv_isa_extension_available(vcpu->arch.isa, SSAIA)) {
827 		n2 = sizeof(struct kvm_riscv_aia_csr) / sizeof(unsigned long);
828 
829 		for (int i = 0; i < n2; i++) {
830 			u64 size = IS_ENABLED(CONFIG_32BIT) ?
831 				   KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
832 			u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CSR |
833 					  KVM_REG_RISCV_CSR_AIA | i;
834 
835 			if (uindices) {
836 				if (put_user(reg, uindices))
837 					return -EFAULT;
838 				uindices++;
839 			}
840 		}
841 	}
842 
843 	/* copy Smstateen csr regs */
844 	if (riscv_isa_extension_available(vcpu->arch.isa, SMSTATEEN)) {
845 		n3 = sizeof(struct kvm_riscv_smstateen_csr) / sizeof(unsigned long);
846 
847 		for (int i = 0; i < n3; i++) {
848 			u64 size = IS_ENABLED(CONFIG_32BIT) ?
849 				   KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
850 			u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CSR |
851 					  KVM_REG_RISCV_CSR_SMSTATEEN | i;
852 
853 			if (uindices) {
854 				if (put_user(reg, uindices))
855 					return -EFAULT;
856 				uindices++;
857 			}
858 		}
859 	}
860 
861 	return n1 + n2 + n3;
862 }
863 
864 static inline unsigned long num_timer_regs(void)
865 {
866 	return sizeof(struct kvm_riscv_timer) / sizeof(u64);
867 }
868 
869 static int copy_timer_reg_indices(u64 __user *uindices)
870 {
871 	int n = num_timer_regs();
872 
873 	for (int i = 0; i < n; i++) {
874 		u64 reg = KVM_REG_RISCV | KVM_REG_SIZE_U64 |
875 			  KVM_REG_RISCV_TIMER | i;
876 
877 		if (uindices) {
878 			if (put_user(reg, uindices))
879 				return -EFAULT;
880 			uindices++;
881 		}
882 	}
883 
884 	return n;
885 }
886 
887 static inline unsigned long num_fp_f_regs(const struct kvm_vcpu *vcpu)
888 {
889 	const struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
890 
891 	if (riscv_isa_extension_available(vcpu->arch.isa, f))
892 		return sizeof(cntx->fp.f) / sizeof(u32);
893 	else
894 		return 0;
895 }
896 
897 static int copy_fp_f_reg_indices(const struct kvm_vcpu *vcpu,
898 				u64 __user *uindices)
899 {
900 	int n = num_fp_f_regs(vcpu);
901 
902 	for (int i = 0; i < n; i++) {
903 		u64 reg = KVM_REG_RISCV | KVM_REG_SIZE_U32 |
904 			  KVM_REG_RISCV_FP_F | i;
905 
906 		if (uindices) {
907 			if (put_user(reg, uindices))
908 				return -EFAULT;
909 			uindices++;
910 		}
911 	}
912 
913 	return n;
914 }
915 
916 static inline unsigned long num_fp_d_regs(const struct kvm_vcpu *vcpu)
917 {
918 	const struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
919 
920 	if (riscv_isa_extension_available(vcpu->arch.isa, d))
921 		return sizeof(cntx->fp.d.f) / sizeof(u64) + 1;
922 	else
923 		return 0;
924 }
925 
926 static int copy_fp_d_reg_indices(const struct kvm_vcpu *vcpu,
927 				u64 __user *uindices)
928 {
929 	int i;
930 	int n = num_fp_d_regs(vcpu);
931 	u64 reg;
932 
933 	/* copy fp.d.f indices */
934 	for (i = 0; i < n-1; i++) {
935 		reg = KVM_REG_RISCV | KVM_REG_SIZE_U64 |
936 		      KVM_REG_RISCV_FP_D | i;
937 
938 		if (uindices) {
939 			if (put_user(reg, uindices))
940 				return -EFAULT;
941 			uindices++;
942 		}
943 	}
944 
945 	/* copy fp.d.fcsr indices */
946 	reg = KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_D | i;
947 	if (uindices) {
948 		if (put_user(reg, uindices))
949 			return -EFAULT;
950 		uindices++;
951 	}
952 
953 	return n;
954 }
955 
956 static int copy_isa_ext_reg_indices(const struct kvm_vcpu *vcpu,
957 				u64 __user *uindices)
958 {
959 	unsigned int n = 0;
960 	unsigned long isa_ext;
961 
962 	for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) {
963 		u64 size = IS_ENABLED(CONFIG_32BIT) ?
964 			   KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
965 		u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_ISA_EXT | i;
966 
967 		isa_ext = kvm_isa_ext_arr[i];
968 		if (!__riscv_isa_extension_available(NULL, isa_ext))
969 			continue;
970 
971 		if (uindices) {
972 			if (put_user(reg, uindices))
973 				return -EFAULT;
974 			uindices++;
975 		}
976 
977 		n++;
978 	}
979 
980 	return n;
981 }
982 
983 static inline unsigned long num_isa_ext_regs(const struct kvm_vcpu *vcpu)
984 {
985 	return copy_isa_ext_reg_indices(vcpu, NULL);;
986 }
987 
988 static int copy_sbi_ext_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
989 {
990 	unsigned int n = 0;
991 
992 	for (int i = 0; i < KVM_RISCV_SBI_EXT_MAX; i++) {
993 		u64 size = IS_ENABLED(CONFIG_32BIT) ?
994 			   KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
995 		u64 reg = KVM_REG_RISCV | size | KVM_REG_RISCV_SBI_EXT |
996 			  KVM_REG_RISCV_SBI_SINGLE | i;
997 
998 		if (!riscv_vcpu_supports_sbi_ext(vcpu, i))
999 			continue;
1000 
1001 		if (uindices) {
1002 			if (put_user(reg, uindices))
1003 				return -EFAULT;
1004 			uindices++;
1005 		}
1006 
1007 		n++;
1008 	}
1009 
1010 	return n;
1011 }
1012 
1013 static unsigned long num_sbi_ext_regs(struct kvm_vcpu *vcpu)
1014 {
1015 	return copy_sbi_ext_reg_indices(vcpu, NULL);
1016 }
1017 
1018 static int copy_sbi_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
1019 {
1020 	struct kvm_vcpu_sbi_context *scontext = &vcpu->arch.sbi_context;
1021 	int total = 0;
1022 
1023 	if (scontext->ext_status[KVM_RISCV_SBI_EXT_STA] == KVM_RISCV_SBI_EXT_STATUS_ENABLED) {
1024 		u64 size = IS_ENABLED(CONFIG_32BIT) ? KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
1025 		int n = sizeof(struct kvm_riscv_sbi_sta) / sizeof(unsigned long);
1026 
1027 		for (int i = 0; i < n; i++) {
1028 			u64 reg = KVM_REG_RISCV | size |
1029 				  KVM_REG_RISCV_SBI_STATE |
1030 				  KVM_REG_RISCV_SBI_STA | i;
1031 
1032 			if (uindices) {
1033 				if (put_user(reg, uindices))
1034 					return -EFAULT;
1035 				uindices++;
1036 			}
1037 		}
1038 
1039 		total += n;
1040 	}
1041 
1042 	return total;
1043 }
1044 
1045 static inline unsigned long num_sbi_regs(struct kvm_vcpu *vcpu)
1046 {
1047 	return copy_sbi_reg_indices(vcpu, NULL);
1048 }
1049 
1050 static inline unsigned long num_vector_regs(const struct kvm_vcpu *vcpu)
1051 {
1052 	if (!riscv_isa_extension_available(vcpu->arch.isa, v))
1053 		return 0;
1054 
1055 	/* vstart, vl, vtype, vcsr, vlenb and 32 vector regs */
1056 	return 37;
1057 }
1058 
1059 static int copy_vector_reg_indices(const struct kvm_vcpu *vcpu,
1060 				u64 __user *uindices)
1061 {
1062 	const struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
1063 	int n = num_vector_regs(vcpu);
1064 	u64 reg, size;
1065 	int i;
1066 
1067 	if (n == 0)
1068 		return 0;
1069 
1070 	/* copy vstart, vl, vtype, vcsr and vlenb */
1071 	size = IS_ENABLED(CONFIG_32BIT) ? KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
1072 	for (i = 0; i < 5; i++) {
1073 		reg = KVM_REG_RISCV | size | KVM_REG_RISCV_VECTOR | i;
1074 
1075 		if (uindices) {
1076 			if (put_user(reg, uindices))
1077 				return -EFAULT;
1078 			uindices++;
1079 		}
1080 	}
1081 
1082 	/* vector_regs have a variable 'vlenb' size */
1083 	size = __builtin_ctzl(cntx->vector.vlenb);
1084 	size <<= KVM_REG_SIZE_SHIFT;
1085 	for (i = 0; i < 32; i++) {
1086 		reg = KVM_REG_RISCV | KVM_REG_RISCV_VECTOR | size |
1087 			KVM_REG_RISCV_VECTOR_REG(i);
1088 
1089 		if (uindices) {
1090 			if (put_user(reg, uindices))
1091 				return -EFAULT;
1092 			uindices++;
1093 		}
1094 	}
1095 
1096 	return n;
1097 }
1098 
1099 /*
1100  * kvm_riscv_vcpu_num_regs - how many registers do we present via KVM_GET/SET_ONE_REG
1101  *
1102  * This is for all registers.
1103  */
1104 unsigned long kvm_riscv_vcpu_num_regs(struct kvm_vcpu *vcpu)
1105 {
1106 	unsigned long res = 0;
1107 
1108 	res += num_config_regs(vcpu);
1109 	res += num_core_regs();
1110 	res += num_csr_regs(vcpu);
1111 	res += num_timer_regs();
1112 	res += num_fp_f_regs(vcpu);
1113 	res += num_fp_d_regs(vcpu);
1114 	res += num_vector_regs(vcpu);
1115 	res += num_isa_ext_regs(vcpu);
1116 	res += num_sbi_ext_regs(vcpu);
1117 	res += num_sbi_regs(vcpu);
1118 
1119 	return res;
1120 }
1121 
1122 /*
1123  * kvm_riscv_vcpu_copy_reg_indices - get indices of all registers.
1124  */
1125 int kvm_riscv_vcpu_copy_reg_indices(struct kvm_vcpu *vcpu,
1126 				    u64 __user *uindices)
1127 {
1128 	int ret;
1129 
1130 	ret = copy_config_reg_indices(vcpu, uindices);
1131 	if (ret < 0)
1132 		return ret;
1133 	uindices += ret;
1134 
1135 	ret = copy_core_reg_indices(uindices);
1136 	if (ret < 0)
1137 		return ret;
1138 	uindices += ret;
1139 
1140 	ret = copy_csr_reg_indices(vcpu, uindices);
1141 	if (ret < 0)
1142 		return ret;
1143 	uindices += ret;
1144 
1145 	ret = copy_timer_reg_indices(uindices);
1146 	if (ret < 0)
1147 		return ret;
1148 	uindices += ret;
1149 
1150 	ret = copy_fp_f_reg_indices(vcpu, uindices);
1151 	if (ret < 0)
1152 		return ret;
1153 	uindices += ret;
1154 
1155 	ret = copy_fp_d_reg_indices(vcpu, uindices);
1156 	if (ret < 0)
1157 		return ret;
1158 	uindices += ret;
1159 
1160 	ret = copy_vector_reg_indices(vcpu, uindices);
1161 	if (ret < 0)
1162 		return ret;
1163 	uindices += ret;
1164 
1165 	ret = copy_isa_ext_reg_indices(vcpu, uindices);
1166 	if (ret < 0)
1167 		return ret;
1168 	uindices += ret;
1169 
1170 	ret = copy_sbi_ext_reg_indices(vcpu, uindices);
1171 	if (ret < 0)
1172 		return ret;
1173 	uindices += ret;
1174 
1175 	ret = copy_sbi_reg_indices(vcpu, uindices);
1176 	if (ret < 0)
1177 		return ret;
1178 	uindices += ret;
1179 
1180 	return 0;
1181 }
1182 
1183 int kvm_riscv_vcpu_set_reg(struct kvm_vcpu *vcpu,
1184 			   const struct kvm_one_reg *reg)
1185 {
1186 	switch (reg->id & KVM_REG_RISCV_TYPE_MASK) {
1187 	case KVM_REG_RISCV_CONFIG:
1188 		return kvm_riscv_vcpu_set_reg_config(vcpu, reg);
1189 	case KVM_REG_RISCV_CORE:
1190 		return kvm_riscv_vcpu_set_reg_core(vcpu, reg);
1191 	case KVM_REG_RISCV_CSR:
1192 		return kvm_riscv_vcpu_set_reg_csr(vcpu, reg);
1193 	case KVM_REG_RISCV_TIMER:
1194 		return kvm_riscv_vcpu_set_reg_timer(vcpu, reg);
1195 	case KVM_REG_RISCV_FP_F:
1196 		return kvm_riscv_vcpu_set_reg_fp(vcpu, reg,
1197 						 KVM_REG_RISCV_FP_F);
1198 	case KVM_REG_RISCV_FP_D:
1199 		return kvm_riscv_vcpu_set_reg_fp(vcpu, reg,
1200 						 KVM_REG_RISCV_FP_D);
1201 	case KVM_REG_RISCV_VECTOR:
1202 		return kvm_riscv_vcpu_set_reg_vector(vcpu, reg);
1203 	case KVM_REG_RISCV_ISA_EXT:
1204 		return kvm_riscv_vcpu_set_reg_isa_ext(vcpu, reg);
1205 	case KVM_REG_RISCV_SBI_EXT:
1206 		return kvm_riscv_vcpu_set_reg_sbi_ext(vcpu, reg);
1207 	case KVM_REG_RISCV_SBI_STATE:
1208 		return kvm_riscv_vcpu_set_reg_sbi(vcpu, reg);
1209 	default:
1210 		break;
1211 	}
1212 
1213 	return -ENOENT;
1214 }
1215 
1216 int kvm_riscv_vcpu_get_reg(struct kvm_vcpu *vcpu,
1217 			   const struct kvm_one_reg *reg)
1218 {
1219 	switch (reg->id & KVM_REG_RISCV_TYPE_MASK) {
1220 	case KVM_REG_RISCV_CONFIG:
1221 		return kvm_riscv_vcpu_get_reg_config(vcpu, reg);
1222 	case KVM_REG_RISCV_CORE:
1223 		return kvm_riscv_vcpu_get_reg_core(vcpu, reg);
1224 	case KVM_REG_RISCV_CSR:
1225 		return kvm_riscv_vcpu_get_reg_csr(vcpu, reg);
1226 	case KVM_REG_RISCV_TIMER:
1227 		return kvm_riscv_vcpu_get_reg_timer(vcpu, reg);
1228 	case KVM_REG_RISCV_FP_F:
1229 		return kvm_riscv_vcpu_get_reg_fp(vcpu, reg,
1230 						 KVM_REG_RISCV_FP_F);
1231 	case KVM_REG_RISCV_FP_D:
1232 		return kvm_riscv_vcpu_get_reg_fp(vcpu, reg,
1233 						 KVM_REG_RISCV_FP_D);
1234 	case KVM_REG_RISCV_VECTOR:
1235 		return kvm_riscv_vcpu_get_reg_vector(vcpu, reg);
1236 	case KVM_REG_RISCV_ISA_EXT:
1237 		return kvm_riscv_vcpu_get_reg_isa_ext(vcpu, reg);
1238 	case KVM_REG_RISCV_SBI_EXT:
1239 		return kvm_riscv_vcpu_get_reg_sbi_ext(vcpu, reg);
1240 	case KVM_REG_RISCV_SBI_STATE:
1241 		return kvm_riscv_vcpu_get_reg_sbi(vcpu, reg);
1242 	default:
1243 		break;
1244 	}
1245 
1246 	return -ENOENT;
1247 }
1248