xref: /linux/arch/loongarch/kvm/vcpu.c (revision a36e9f5cfe9eb3a1dce8769c7058251c42705357)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2020-2023 Loongson Technology Corporation Limited
4  */
5 
6 #include <linux/kvm_host.h>
7 #include <linux/entry-kvm.h>
8 #include <asm/fpu.h>
9 #include <asm/loongarch.h>
10 #include <asm/setup.h>
11 #include <asm/time.h>
12 
13 #define CREATE_TRACE_POINTS
14 #include "trace.h"
15 
16 const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
17 	KVM_GENERIC_VCPU_STATS(),
18 	STATS_DESC_COUNTER(VCPU, int_exits),
19 	STATS_DESC_COUNTER(VCPU, idle_exits),
20 	STATS_DESC_COUNTER(VCPU, cpucfg_exits),
21 	STATS_DESC_COUNTER(VCPU, signal_exits),
22 	STATS_DESC_COUNTER(VCPU, hypercall_exits)
23 };
24 
25 const struct kvm_stats_header kvm_vcpu_stats_header = {
26 	.name_size = KVM_STATS_NAME_SIZE,
27 	.num_desc = ARRAY_SIZE(kvm_vcpu_stats_desc),
28 	.id_offset = sizeof(struct kvm_stats_header),
29 	.desc_offset = sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE,
30 	.data_offset = sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE +
31 		       sizeof(kvm_vcpu_stats_desc),
32 };
33 
34 static void kvm_update_stolen_time(struct kvm_vcpu *vcpu)
35 {
36 	u32 version;
37 	u64 steal;
38 	gpa_t gpa;
39 	struct kvm_memslots *slots;
40 	struct kvm_steal_time __user *st;
41 	struct gfn_to_hva_cache *ghc;
42 
43 	ghc = &vcpu->arch.st.cache;
44 	gpa = vcpu->arch.st.guest_addr;
45 	if (!(gpa & KVM_STEAL_PHYS_VALID))
46 		return;
47 
48 	gpa &= KVM_STEAL_PHYS_MASK;
49 	slots = kvm_memslots(vcpu->kvm);
50 	if (slots->generation != ghc->generation || gpa != ghc->gpa) {
51 		if (kvm_gfn_to_hva_cache_init(vcpu->kvm, ghc, gpa, sizeof(*st))) {
52 			ghc->gpa = INVALID_GPA;
53 			return;
54 		}
55 	}
56 
57 	st = (struct kvm_steal_time __user *)ghc->hva;
58 	unsafe_get_user(version, &st->version, out);
59 	if (version & 1)
60 		version += 1; /* first time write, random junk */
61 
62 	version += 1;
63 	unsafe_put_user(version, &st->version, out);
64 	smp_wmb();
65 
66 	unsafe_get_user(steal, &st->steal, out);
67 	steal += current->sched_info.run_delay - vcpu->arch.st.last_steal;
68 	vcpu->arch.st.last_steal = current->sched_info.run_delay;
69 	unsafe_put_user(steal, &st->steal, out);
70 
71 	smp_wmb();
72 	version += 1;
73 	unsafe_put_user(version, &st->version, out);
74 out:
75 	mark_page_dirty_in_slot(vcpu->kvm, ghc->memslot, gpa_to_gfn(ghc->gpa));
76 }
77 
78 /*
79  * kvm_check_requests - check and handle pending vCPU requests
80  *
81  * Return: RESUME_GUEST if we should enter the guest
82  *         RESUME_HOST  if we should exit to userspace
83  */
84 static int kvm_check_requests(struct kvm_vcpu *vcpu)
85 {
86 	if (!kvm_request_pending(vcpu))
87 		return RESUME_GUEST;
88 
89 	if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu))
90 		vcpu->arch.vpid = 0;  /* Drop vpid for this vCPU */
91 
92 	if (kvm_dirty_ring_check_request(vcpu))
93 		return RESUME_HOST;
94 
95 	if (kvm_check_request(KVM_REQ_STEAL_UPDATE, vcpu))
96 		kvm_update_stolen_time(vcpu);
97 
98 	return RESUME_GUEST;
99 }
100 
101 static void kvm_late_check_requests(struct kvm_vcpu *vcpu)
102 {
103 	lockdep_assert_irqs_disabled();
104 	if (kvm_check_request(KVM_REQ_TLB_FLUSH_GPA, vcpu))
105 		if (vcpu->arch.flush_gpa != INVALID_GPA) {
106 			kvm_flush_tlb_gpa(vcpu, vcpu->arch.flush_gpa);
107 			vcpu->arch.flush_gpa = INVALID_GPA;
108 		}
109 }
110 
111 /*
112  * Check and handle pending signal and vCPU requests etc
113  * Run with irq enabled and preempt enabled
114  *
115  * Return: RESUME_GUEST if we should enter the guest
116  *         RESUME_HOST  if we should exit to userspace
117  *         < 0 if we should exit to userspace, where the return value
118  *         indicates an error
119  */
120 static int kvm_enter_guest_check(struct kvm_vcpu *vcpu)
121 {
122 	int ret;
123 
124 	/*
125 	 * Check conditions before entering the guest
126 	 */
127 	ret = xfer_to_guest_mode_handle_work(vcpu);
128 	if (ret < 0)
129 		return ret;
130 
131 	ret = kvm_check_requests(vcpu);
132 
133 	return ret;
134 }
135 
136 /*
137  * Called with irq enabled
138  *
139  * Return: RESUME_GUEST if we should enter the guest, and irq disabled
140  *         Others if we should exit to userspace
141  */
142 static int kvm_pre_enter_guest(struct kvm_vcpu *vcpu)
143 {
144 	int ret;
145 
146 	do {
147 		ret = kvm_enter_guest_check(vcpu);
148 		if (ret != RESUME_GUEST)
149 			break;
150 
151 		/*
152 		 * Handle vcpu timer, interrupts, check requests and
153 		 * check vmid before vcpu enter guest
154 		 */
155 		local_irq_disable();
156 		kvm_deliver_intr(vcpu);
157 		kvm_deliver_exception(vcpu);
158 		/* Make sure the vcpu mode has been written */
159 		smp_store_mb(vcpu->mode, IN_GUEST_MODE);
160 		kvm_check_vpid(vcpu);
161 
162 		/*
163 		 * Called after function kvm_check_vpid()
164 		 * Since it updates CSR.GSTAT used by kvm_flush_tlb_gpa(),
165 		 * and it may also clear KVM_REQ_TLB_FLUSH_GPA pending bit
166 		 */
167 		kvm_late_check_requests(vcpu);
168 		vcpu->arch.host_eentry = csr_read64(LOONGARCH_CSR_EENTRY);
169 		/* Clear KVM_LARCH_SWCSR_LATEST as CSR will change when enter guest */
170 		vcpu->arch.aux_inuse &= ~KVM_LARCH_SWCSR_LATEST;
171 
172 		if (kvm_request_pending(vcpu) || xfer_to_guest_mode_work_pending()) {
173 			/* make sure the vcpu mode has been written */
174 			smp_store_mb(vcpu->mode, OUTSIDE_GUEST_MODE);
175 			local_irq_enable();
176 			ret = -EAGAIN;
177 		}
178 	} while (ret != RESUME_GUEST);
179 
180 	return ret;
181 }
182 
183 /*
184  * Return 1 for resume guest and "<= 0" for resume host.
185  */
186 static int kvm_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
187 {
188 	int ret = RESUME_GUEST;
189 	unsigned long estat = vcpu->arch.host_estat;
190 	u32 intr = estat & 0x1fff; /* Ignore NMI */
191 	u32 ecode = (estat & CSR_ESTAT_EXC) >> CSR_ESTAT_EXC_SHIFT;
192 
193 	vcpu->mode = OUTSIDE_GUEST_MODE;
194 
195 	/* Set a default exit reason */
196 	run->exit_reason = KVM_EXIT_UNKNOWN;
197 
198 	guest_timing_exit_irqoff();
199 	guest_state_exit_irqoff();
200 	local_irq_enable();
201 
202 	trace_kvm_exit(vcpu, ecode);
203 	if (ecode) {
204 		ret = kvm_handle_fault(vcpu, ecode);
205 	} else {
206 		WARN(!intr, "vm exiting with suspicious irq\n");
207 		++vcpu->stat.int_exits;
208 	}
209 
210 	if (ret == RESUME_GUEST)
211 		ret = kvm_pre_enter_guest(vcpu);
212 
213 	if (ret != RESUME_GUEST) {
214 		local_irq_disable();
215 		return ret;
216 	}
217 
218 	guest_timing_enter_irqoff();
219 	guest_state_enter_irqoff();
220 	trace_kvm_reenter(vcpu);
221 
222 	return RESUME_GUEST;
223 }
224 
225 int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
226 {
227 	return !!(vcpu->arch.irq_pending) &&
228 		vcpu->arch.mp_state.mp_state == KVM_MP_STATE_RUNNABLE;
229 }
230 
231 int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu)
232 {
233 	return kvm_vcpu_exiting_guest_mode(vcpu) == IN_GUEST_MODE;
234 }
235 
236 bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu)
237 {
238 	return false;
239 }
240 
241 vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
242 {
243 	return VM_FAULT_SIGBUS;
244 }
245 
246 int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
247 				  struct kvm_translation *tr)
248 {
249 	return -EINVAL;
250 }
251 
252 int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
253 {
254 	int ret;
255 
256 	/* Protect from TOD sync and vcpu_load/put() */
257 	preempt_disable();
258 	ret = kvm_pending_timer(vcpu) ||
259 		kvm_read_hw_gcsr(LOONGARCH_CSR_ESTAT) & (1 << INT_TI);
260 	preempt_enable();
261 
262 	return ret;
263 }
264 
265 int kvm_arch_vcpu_dump_regs(struct kvm_vcpu *vcpu)
266 {
267 	int i;
268 
269 	kvm_debug("vCPU Register Dump:\n");
270 	kvm_debug("\tPC = 0x%08lx\n", vcpu->arch.pc);
271 	kvm_debug("\tExceptions: %08lx\n", vcpu->arch.irq_pending);
272 
273 	for (i = 0; i < 32; i += 4) {
274 		kvm_debug("\tGPR%02d: %08lx %08lx %08lx %08lx\n", i,
275 		       vcpu->arch.gprs[i], vcpu->arch.gprs[i + 1],
276 		       vcpu->arch.gprs[i + 2], vcpu->arch.gprs[i + 3]);
277 	}
278 
279 	kvm_debug("\tCRMD: 0x%08lx, ESTAT: 0x%08lx\n",
280 		  kvm_read_hw_gcsr(LOONGARCH_CSR_CRMD),
281 		  kvm_read_hw_gcsr(LOONGARCH_CSR_ESTAT));
282 
283 	kvm_debug("\tERA: 0x%08lx\n", kvm_read_hw_gcsr(LOONGARCH_CSR_ERA));
284 
285 	return 0;
286 }
287 
288 int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
289 				struct kvm_mp_state *mp_state)
290 {
291 	*mp_state = vcpu->arch.mp_state;
292 
293 	return 0;
294 }
295 
296 int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
297 				struct kvm_mp_state *mp_state)
298 {
299 	int ret = 0;
300 
301 	switch (mp_state->mp_state) {
302 	case KVM_MP_STATE_RUNNABLE:
303 		vcpu->arch.mp_state = *mp_state;
304 		break;
305 	default:
306 		ret = -EINVAL;
307 	}
308 
309 	return ret;
310 }
311 
312 int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
313 					struct kvm_guest_debug *dbg)
314 {
315 	if (dbg->control & ~KVM_GUESTDBG_VALID_MASK)
316 		return -EINVAL;
317 
318 	if (dbg->control & KVM_GUESTDBG_ENABLE)
319 		vcpu->guest_debug = dbg->control;
320 	else
321 		vcpu->guest_debug = 0;
322 
323 	return 0;
324 }
325 
326 static inline int kvm_set_cpuid(struct kvm_vcpu *vcpu, u64 val)
327 {
328 	int cpuid;
329 	struct kvm_phyid_map *map;
330 	struct loongarch_csrs *csr = vcpu->arch.csr;
331 
332 	if (val >= KVM_MAX_PHYID)
333 		return -EINVAL;
334 
335 	map = vcpu->kvm->arch.phyid_map;
336 	cpuid = kvm_read_sw_gcsr(csr, LOONGARCH_CSR_CPUID);
337 
338 	spin_lock(&vcpu->kvm->arch.phyid_map_lock);
339 	if ((cpuid < KVM_MAX_PHYID) && map->phys_map[cpuid].enabled) {
340 		/* Discard duplicated CPUID set operation */
341 		if (cpuid == val) {
342 			spin_unlock(&vcpu->kvm->arch.phyid_map_lock);
343 			return 0;
344 		}
345 
346 		/*
347 		 * CPUID is already set before
348 		 * Forbid changing to a different CPUID at runtime
349 		 */
350 		spin_unlock(&vcpu->kvm->arch.phyid_map_lock);
351 		return -EINVAL;
352 	}
353 
354 	if (map->phys_map[val].enabled) {
355 		/* Discard duplicated CPUID set operation */
356 		if (vcpu == map->phys_map[val].vcpu) {
357 			spin_unlock(&vcpu->kvm->arch.phyid_map_lock);
358 			return 0;
359 		}
360 
361 		/*
362 		 * New CPUID is already set with other vcpu
363 		 * Forbid sharing the same CPUID between different vcpus
364 		 */
365 		spin_unlock(&vcpu->kvm->arch.phyid_map_lock);
366 		return -EINVAL;
367 	}
368 
369 	kvm_write_sw_gcsr(csr, LOONGARCH_CSR_CPUID, val);
370 	map->phys_map[val].enabled	= true;
371 	map->phys_map[val].vcpu		= vcpu;
372 	spin_unlock(&vcpu->kvm->arch.phyid_map_lock);
373 
374 	return 0;
375 }
376 
377 static inline void kvm_drop_cpuid(struct kvm_vcpu *vcpu)
378 {
379 	int cpuid;
380 	struct kvm_phyid_map *map;
381 	struct loongarch_csrs *csr = vcpu->arch.csr;
382 
383 	map = vcpu->kvm->arch.phyid_map;
384 	cpuid = kvm_read_sw_gcsr(csr, LOONGARCH_CSR_CPUID);
385 
386 	if (cpuid >= KVM_MAX_PHYID)
387 		return;
388 
389 	spin_lock(&vcpu->kvm->arch.phyid_map_lock);
390 	if (map->phys_map[cpuid].enabled) {
391 		map->phys_map[cpuid].vcpu = NULL;
392 		map->phys_map[cpuid].enabled = false;
393 		kvm_write_sw_gcsr(csr, LOONGARCH_CSR_CPUID, KVM_MAX_PHYID);
394 	}
395 	spin_unlock(&vcpu->kvm->arch.phyid_map_lock);
396 }
397 
398 struct kvm_vcpu *kvm_get_vcpu_by_cpuid(struct kvm *kvm, int cpuid)
399 {
400 	struct kvm_phyid_map *map;
401 
402 	if (cpuid >= KVM_MAX_PHYID)
403 		return NULL;
404 
405 	map = kvm->arch.phyid_map;
406 	if (!map->phys_map[cpuid].enabled)
407 		return NULL;
408 
409 	return map->phys_map[cpuid].vcpu;
410 }
411 
412 static int _kvm_getcsr(struct kvm_vcpu *vcpu, unsigned int id, u64 *val)
413 {
414 	unsigned long gintc;
415 	struct loongarch_csrs *csr = vcpu->arch.csr;
416 
417 	if (get_gcsr_flag(id) & INVALID_GCSR)
418 		return -EINVAL;
419 
420 	if (id == LOONGARCH_CSR_ESTAT) {
421 		preempt_disable();
422 		vcpu_load(vcpu);
423 		/*
424 		 * Sync pending interrupts into ESTAT so that interrupt
425 		 * remains during VM migration stage
426 		 */
427 		kvm_deliver_intr(vcpu);
428 		vcpu->arch.aux_inuse &= ~KVM_LARCH_SWCSR_LATEST;
429 		vcpu_put(vcpu);
430 		preempt_enable();
431 
432 		/* ESTAT IP0~IP7 get from GINTC */
433 		gintc = kvm_read_sw_gcsr(csr, LOONGARCH_CSR_GINTC) & 0xff;
434 		*val = kvm_read_sw_gcsr(csr, LOONGARCH_CSR_ESTAT) | (gintc << 2);
435 		return 0;
436 	}
437 
438 	/*
439 	 * Get software CSR state since software state is consistent
440 	 * with hardware for synchronous ioctl
441 	 */
442 	*val = kvm_read_sw_gcsr(csr, id);
443 
444 	return 0;
445 }
446 
447 static int _kvm_setcsr(struct kvm_vcpu *vcpu, unsigned int id, u64 val)
448 {
449 	int ret = 0, gintc;
450 	struct loongarch_csrs *csr = vcpu->arch.csr;
451 
452 	if (get_gcsr_flag(id) & INVALID_GCSR)
453 		return -EINVAL;
454 
455 	if (id == LOONGARCH_CSR_CPUID)
456 		return kvm_set_cpuid(vcpu, val);
457 
458 	if (id == LOONGARCH_CSR_ESTAT) {
459 		/* ESTAT IP0~IP7 inject through GINTC */
460 		gintc = (val >> 2) & 0xff;
461 		kvm_set_sw_gcsr(csr, LOONGARCH_CSR_GINTC, gintc);
462 
463 		gintc = val & ~(0xffUL << 2);
464 		kvm_set_sw_gcsr(csr, LOONGARCH_CSR_ESTAT, gintc);
465 
466 		return ret;
467 	}
468 
469 	kvm_write_sw_gcsr(csr, id, val);
470 
471 	return ret;
472 }
473 
474 static int _kvm_get_cpucfg_mask(int id, u64 *v)
475 {
476 	if (id < 0 || id >= KVM_MAX_CPUCFG_REGS)
477 		return -EINVAL;
478 
479 	switch (id) {
480 	case LOONGARCH_CPUCFG0:
481 		*v = GENMASK(31, 0);
482 		return 0;
483 	case LOONGARCH_CPUCFG1:
484 		/* CPUCFG1_MSGINT is not supported by KVM */
485 		*v = GENMASK(25, 0);
486 		return 0;
487 	case LOONGARCH_CPUCFG2:
488 		/* CPUCFG2 features unconditionally supported by KVM */
489 		*v = CPUCFG2_FP     | CPUCFG2_FPSP  | CPUCFG2_FPDP     |
490 		     CPUCFG2_FPVERS | CPUCFG2_LLFTP | CPUCFG2_LLFTPREV |
491 		     CPUCFG2_LSPW | CPUCFG2_LAM;
492 		/*
493 		 * For the ISA extensions listed below, if one is supported
494 		 * by the host, then it is also supported by KVM.
495 		 */
496 		if (cpu_has_lsx)
497 			*v |= CPUCFG2_LSX;
498 		if (cpu_has_lasx)
499 			*v |= CPUCFG2_LASX;
500 
501 		return 0;
502 	case LOONGARCH_CPUCFG3:
503 		*v = GENMASK(16, 0);
504 		return 0;
505 	case LOONGARCH_CPUCFG4:
506 	case LOONGARCH_CPUCFG5:
507 		*v = GENMASK(31, 0);
508 		return 0;
509 	case LOONGARCH_CPUCFG16:
510 		*v = GENMASK(16, 0);
511 		return 0;
512 	case LOONGARCH_CPUCFG17 ... LOONGARCH_CPUCFG20:
513 		*v = GENMASK(30, 0);
514 		return 0;
515 	default:
516 		/*
517 		 * CPUCFG bits should be zero if reserved by HW or not
518 		 * supported by KVM.
519 		 */
520 		*v = 0;
521 		return 0;
522 	}
523 }
524 
525 static int kvm_check_cpucfg(int id, u64 val)
526 {
527 	int ret;
528 	u64 mask = 0;
529 
530 	ret = _kvm_get_cpucfg_mask(id, &mask);
531 	if (ret)
532 		return ret;
533 
534 	if (val & ~mask)
535 		/* Unsupported features and/or the higher 32 bits should not be set */
536 		return -EINVAL;
537 
538 	switch (id) {
539 	case LOONGARCH_CPUCFG2:
540 		if (!(val & CPUCFG2_LLFTP))
541 			/* Guests must have a constant timer */
542 			return -EINVAL;
543 		if ((val & CPUCFG2_FP) && (!(val & CPUCFG2_FPSP) || !(val & CPUCFG2_FPDP)))
544 			/* Single and double float point must both be set when FP is enabled */
545 			return -EINVAL;
546 		if ((val & CPUCFG2_LSX) && !(val & CPUCFG2_FP))
547 			/* LSX architecturally implies FP but val does not satisfy that */
548 			return -EINVAL;
549 		if ((val & CPUCFG2_LASX) && !(val & CPUCFG2_LSX))
550 			/* LASX architecturally implies LSX and FP but val does not satisfy that */
551 			return -EINVAL;
552 		return 0;
553 	default:
554 		/*
555 		 * Values for the other CPUCFG IDs are not being further validated
556 		 * besides the mask check above.
557 		 */
558 		return 0;
559 	}
560 }
561 
562 static int kvm_get_one_reg(struct kvm_vcpu *vcpu,
563 		const struct kvm_one_reg *reg, u64 *v)
564 {
565 	int id, ret = 0;
566 	u64 type = reg->id & KVM_REG_LOONGARCH_MASK;
567 
568 	switch (type) {
569 	case KVM_REG_LOONGARCH_CSR:
570 		id = KVM_GET_IOC_CSR_IDX(reg->id);
571 		ret = _kvm_getcsr(vcpu, id, v);
572 		break;
573 	case KVM_REG_LOONGARCH_CPUCFG:
574 		id = KVM_GET_IOC_CPUCFG_IDX(reg->id);
575 		if (id >= 0 && id < KVM_MAX_CPUCFG_REGS)
576 			*v = vcpu->arch.cpucfg[id];
577 		else
578 			ret = -EINVAL;
579 		break;
580 	case KVM_REG_LOONGARCH_KVM:
581 		switch (reg->id) {
582 		case KVM_REG_LOONGARCH_COUNTER:
583 			*v = drdtime() + vcpu->kvm->arch.time_offset;
584 			break;
585 		case KVM_REG_LOONGARCH_DEBUG_INST:
586 			*v = INSN_HVCL | KVM_HCALL_SWDBG;
587 			break;
588 		default:
589 			ret = -EINVAL;
590 			break;
591 		}
592 		break;
593 	default:
594 		ret = -EINVAL;
595 		break;
596 	}
597 
598 	return ret;
599 }
600 
601 static int kvm_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
602 {
603 	int ret = 0;
604 	u64 v, size = reg->id & KVM_REG_SIZE_MASK;
605 
606 	switch (size) {
607 	case KVM_REG_SIZE_U64:
608 		ret = kvm_get_one_reg(vcpu, reg, &v);
609 		if (ret)
610 			return ret;
611 		ret = put_user(v, (u64 __user *)(long)reg->addr);
612 		break;
613 	default:
614 		ret = -EINVAL;
615 		break;
616 	}
617 
618 	return ret;
619 }
620 
621 static int kvm_set_one_reg(struct kvm_vcpu *vcpu,
622 			const struct kvm_one_reg *reg, u64 v)
623 {
624 	int id, ret = 0;
625 	u64 type = reg->id & KVM_REG_LOONGARCH_MASK;
626 
627 	switch (type) {
628 	case KVM_REG_LOONGARCH_CSR:
629 		id = KVM_GET_IOC_CSR_IDX(reg->id);
630 		ret = _kvm_setcsr(vcpu, id, v);
631 		break;
632 	case KVM_REG_LOONGARCH_CPUCFG:
633 		id = KVM_GET_IOC_CPUCFG_IDX(reg->id);
634 		ret = kvm_check_cpucfg(id, v);
635 		if (ret)
636 			break;
637 		vcpu->arch.cpucfg[id] = (u32)v;
638 		break;
639 	case KVM_REG_LOONGARCH_KVM:
640 		switch (reg->id) {
641 		case KVM_REG_LOONGARCH_COUNTER:
642 			/*
643 			 * gftoffset is relative with board, not vcpu
644 			 * only set for the first time for smp system
645 			 */
646 			if (vcpu->vcpu_id == 0)
647 				vcpu->kvm->arch.time_offset = (signed long)(v - drdtime());
648 			break;
649 		case KVM_REG_LOONGARCH_VCPU_RESET:
650 			vcpu->arch.st.guest_addr = 0;
651 			memset(&vcpu->arch.irq_pending, 0, sizeof(vcpu->arch.irq_pending));
652 			memset(&vcpu->arch.irq_clear, 0, sizeof(vcpu->arch.irq_clear));
653 			break;
654 		default:
655 			ret = -EINVAL;
656 			break;
657 		}
658 		break;
659 	default:
660 		ret = -EINVAL;
661 		break;
662 	}
663 
664 	return ret;
665 }
666 
667 static int kvm_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
668 {
669 	int ret = 0;
670 	u64 v, size = reg->id & KVM_REG_SIZE_MASK;
671 
672 	switch (size) {
673 	case KVM_REG_SIZE_U64:
674 		ret = get_user(v, (u64 __user *)(long)reg->addr);
675 		if (ret)
676 			return ret;
677 		break;
678 	default:
679 		return -EINVAL;
680 	}
681 
682 	return kvm_set_one_reg(vcpu, reg, v);
683 }
684 
685 int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)
686 {
687 	return -ENOIOCTLCMD;
688 }
689 
690 int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)
691 {
692 	return -ENOIOCTLCMD;
693 }
694 
695 int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
696 {
697 	int i;
698 
699 	for (i = 0; i < ARRAY_SIZE(vcpu->arch.gprs); i++)
700 		regs->gpr[i] = vcpu->arch.gprs[i];
701 
702 	regs->pc = vcpu->arch.pc;
703 
704 	return 0;
705 }
706 
707 int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
708 {
709 	int i;
710 
711 	for (i = 1; i < ARRAY_SIZE(vcpu->arch.gprs); i++)
712 		vcpu->arch.gprs[i] = regs->gpr[i];
713 
714 	vcpu->arch.gprs[0] = 0; /* zero is special, and cannot be set. */
715 	vcpu->arch.pc = regs->pc;
716 
717 	return 0;
718 }
719 
720 static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
721 				     struct kvm_enable_cap *cap)
722 {
723 	/* FPU is enabled by default, will support LSX/LASX later. */
724 	return -EINVAL;
725 }
726 
727 static int kvm_loongarch_cpucfg_has_attr(struct kvm_vcpu *vcpu,
728 					 struct kvm_device_attr *attr)
729 {
730 	switch (attr->attr) {
731 	case 2:
732 		return 0;
733 	default:
734 		return -ENXIO;
735 	}
736 
737 	return -ENXIO;
738 }
739 
740 static int kvm_loongarch_pvtime_has_attr(struct kvm_vcpu *vcpu,
741 					 struct kvm_device_attr *attr)
742 {
743 	if (!kvm_pvtime_supported() ||
744 			attr->attr != KVM_LOONGARCH_VCPU_PVTIME_GPA)
745 		return -ENXIO;
746 
747 	return 0;
748 }
749 
750 static int kvm_loongarch_vcpu_has_attr(struct kvm_vcpu *vcpu,
751 				       struct kvm_device_attr *attr)
752 {
753 	int ret = -ENXIO;
754 
755 	switch (attr->group) {
756 	case KVM_LOONGARCH_VCPU_CPUCFG:
757 		ret = kvm_loongarch_cpucfg_has_attr(vcpu, attr);
758 		break;
759 	case KVM_LOONGARCH_VCPU_PVTIME_CTRL:
760 		ret = kvm_loongarch_pvtime_has_attr(vcpu, attr);
761 		break;
762 	default:
763 		break;
764 	}
765 
766 	return ret;
767 }
768 
769 static int kvm_loongarch_cpucfg_get_attr(struct kvm_vcpu *vcpu,
770 					 struct kvm_device_attr *attr)
771 {
772 	int ret = 0;
773 	uint64_t val;
774 	uint64_t __user *uaddr = (uint64_t __user *)attr->addr;
775 
776 	ret = _kvm_get_cpucfg_mask(attr->attr, &val);
777 	if (ret)
778 		return ret;
779 
780 	put_user(val, uaddr);
781 
782 	return ret;
783 }
784 
785 static int kvm_loongarch_pvtime_get_attr(struct kvm_vcpu *vcpu,
786 					 struct kvm_device_attr *attr)
787 {
788 	u64 gpa;
789 	u64 __user *user = (u64 __user *)attr->addr;
790 
791 	if (!kvm_pvtime_supported() ||
792 			attr->attr != KVM_LOONGARCH_VCPU_PVTIME_GPA)
793 		return -ENXIO;
794 
795 	gpa = vcpu->arch.st.guest_addr;
796 	if (put_user(gpa, user))
797 		return -EFAULT;
798 
799 	return 0;
800 }
801 
802 static int kvm_loongarch_vcpu_get_attr(struct kvm_vcpu *vcpu,
803 				       struct kvm_device_attr *attr)
804 {
805 	int ret = -ENXIO;
806 
807 	switch (attr->group) {
808 	case KVM_LOONGARCH_VCPU_CPUCFG:
809 		ret = kvm_loongarch_cpucfg_get_attr(vcpu, attr);
810 		break;
811 	case KVM_LOONGARCH_VCPU_PVTIME_CTRL:
812 		ret = kvm_loongarch_pvtime_get_attr(vcpu, attr);
813 		break;
814 	default:
815 		break;
816 	}
817 
818 	return ret;
819 }
820 
821 static int kvm_loongarch_cpucfg_set_attr(struct kvm_vcpu *vcpu,
822 					 struct kvm_device_attr *attr)
823 {
824 	return -ENXIO;
825 }
826 
827 static int kvm_loongarch_pvtime_set_attr(struct kvm_vcpu *vcpu,
828 					 struct kvm_device_attr *attr)
829 {
830 	int idx, ret = 0;
831 	u64 gpa, __user *user = (u64 __user *)attr->addr;
832 	struct kvm *kvm = vcpu->kvm;
833 
834 	if (!kvm_pvtime_supported() ||
835 			attr->attr != KVM_LOONGARCH_VCPU_PVTIME_GPA)
836 		return -ENXIO;
837 
838 	if (get_user(gpa, user))
839 		return -EFAULT;
840 
841 	if (gpa & ~(KVM_STEAL_PHYS_MASK | KVM_STEAL_PHYS_VALID))
842 		return -EINVAL;
843 
844 	if (!(gpa & KVM_STEAL_PHYS_VALID)) {
845 		vcpu->arch.st.guest_addr = gpa;
846 		return 0;
847 	}
848 
849 	/* Check the address is in a valid memslot */
850 	idx = srcu_read_lock(&kvm->srcu);
851 	if (kvm_is_error_hva(gfn_to_hva(kvm, gpa >> PAGE_SHIFT)))
852 		ret = -EINVAL;
853 	srcu_read_unlock(&kvm->srcu, idx);
854 
855 	if (!ret) {
856 		vcpu->arch.st.guest_addr = gpa;
857 		vcpu->arch.st.last_steal = current->sched_info.run_delay;
858 		kvm_make_request(KVM_REQ_STEAL_UPDATE, vcpu);
859 	}
860 
861 	return ret;
862 }
863 
864 static int kvm_loongarch_vcpu_set_attr(struct kvm_vcpu *vcpu,
865 				       struct kvm_device_attr *attr)
866 {
867 	int ret = -ENXIO;
868 
869 	switch (attr->group) {
870 	case KVM_LOONGARCH_VCPU_CPUCFG:
871 		ret = kvm_loongarch_cpucfg_set_attr(vcpu, attr);
872 		break;
873 	case KVM_LOONGARCH_VCPU_PVTIME_CTRL:
874 		ret = kvm_loongarch_pvtime_set_attr(vcpu, attr);
875 		break;
876 	default:
877 		break;
878 	}
879 
880 	return ret;
881 }
882 
883 long kvm_arch_vcpu_ioctl(struct file *filp,
884 			 unsigned int ioctl, unsigned long arg)
885 {
886 	long r;
887 	struct kvm_device_attr attr;
888 	void __user *argp = (void __user *)arg;
889 	struct kvm_vcpu *vcpu = filp->private_data;
890 
891 	/*
892 	 * Only software CSR should be modified
893 	 *
894 	 * If any hardware CSR register is modified, vcpu_load/vcpu_put pair
895 	 * should be used. Since CSR registers owns by this vcpu, if switch
896 	 * to other vcpus, other vcpus need reload CSR registers.
897 	 *
898 	 * If software CSR is modified, bit KVM_LARCH_HWCSR_USABLE should
899 	 * be clear in vcpu->arch.aux_inuse, and vcpu_load will check
900 	 * aux_inuse flag and reload CSR registers form software.
901 	 */
902 
903 	switch (ioctl) {
904 	case KVM_SET_ONE_REG:
905 	case KVM_GET_ONE_REG: {
906 		struct kvm_one_reg reg;
907 
908 		r = -EFAULT;
909 		if (copy_from_user(&reg, argp, sizeof(reg)))
910 			break;
911 		if (ioctl == KVM_SET_ONE_REG) {
912 			r = kvm_set_reg(vcpu, &reg);
913 			vcpu->arch.aux_inuse &= ~KVM_LARCH_HWCSR_USABLE;
914 		} else
915 			r = kvm_get_reg(vcpu, &reg);
916 		break;
917 	}
918 	case KVM_ENABLE_CAP: {
919 		struct kvm_enable_cap cap;
920 
921 		r = -EFAULT;
922 		if (copy_from_user(&cap, argp, sizeof(cap)))
923 			break;
924 		r = kvm_vcpu_ioctl_enable_cap(vcpu, &cap);
925 		break;
926 	}
927 	case KVM_HAS_DEVICE_ATTR: {
928 		r = -EFAULT;
929 		if (copy_from_user(&attr, argp, sizeof(attr)))
930 			break;
931 		r = kvm_loongarch_vcpu_has_attr(vcpu, &attr);
932 		break;
933 	}
934 	case KVM_GET_DEVICE_ATTR: {
935 		r = -EFAULT;
936 		if (copy_from_user(&attr, argp, sizeof(attr)))
937 			break;
938 		r = kvm_loongarch_vcpu_get_attr(vcpu, &attr);
939 		break;
940 	}
941 	case KVM_SET_DEVICE_ATTR: {
942 		r = -EFAULT;
943 		if (copy_from_user(&attr, argp, sizeof(attr)))
944 			break;
945 		r = kvm_loongarch_vcpu_set_attr(vcpu, &attr);
946 		break;
947 	}
948 	default:
949 		r = -ENOIOCTLCMD;
950 		break;
951 	}
952 
953 	return r;
954 }
955 
956 int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
957 {
958 	int i = 0;
959 
960 	fpu->fcc = vcpu->arch.fpu.fcc;
961 	fpu->fcsr = vcpu->arch.fpu.fcsr;
962 	for (i = 0; i < NUM_FPU_REGS; i++)
963 		memcpy(&fpu->fpr[i], &vcpu->arch.fpu.fpr[i], FPU_REG_WIDTH / 64);
964 
965 	return 0;
966 }
967 
968 int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
969 {
970 	int i = 0;
971 
972 	vcpu->arch.fpu.fcc = fpu->fcc;
973 	vcpu->arch.fpu.fcsr = fpu->fcsr;
974 	for (i = 0; i < NUM_FPU_REGS; i++)
975 		memcpy(&vcpu->arch.fpu.fpr[i], &fpu->fpr[i], FPU_REG_WIDTH / 64);
976 
977 	return 0;
978 }
979 
980 /* Enable FPU and restore context */
981 void kvm_own_fpu(struct kvm_vcpu *vcpu)
982 {
983 	preempt_disable();
984 
985 	/* Enable FPU */
986 	set_csr_euen(CSR_EUEN_FPEN);
987 
988 	kvm_restore_fpu(&vcpu->arch.fpu);
989 	vcpu->arch.aux_inuse |= KVM_LARCH_FPU;
990 	trace_kvm_aux(vcpu, KVM_TRACE_AUX_RESTORE, KVM_TRACE_AUX_FPU);
991 
992 	preempt_enable();
993 }
994 
995 #ifdef CONFIG_CPU_HAS_LSX
996 /* Enable LSX and restore context */
997 int kvm_own_lsx(struct kvm_vcpu *vcpu)
998 {
999 	if (!kvm_guest_has_fpu(&vcpu->arch) || !kvm_guest_has_lsx(&vcpu->arch))
1000 		return -EINVAL;
1001 
1002 	preempt_disable();
1003 
1004 	/* Enable LSX for guest */
1005 	set_csr_euen(CSR_EUEN_LSXEN | CSR_EUEN_FPEN);
1006 	switch (vcpu->arch.aux_inuse & KVM_LARCH_FPU) {
1007 	case KVM_LARCH_FPU:
1008 		/*
1009 		 * Guest FPU state already loaded,
1010 		 * only restore upper LSX state
1011 		 */
1012 		_restore_lsx_upper(&vcpu->arch.fpu);
1013 		break;
1014 	default:
1015 		/* Neither FP or LSX already active,
1016 		 * restore full LSX state
1017 		 */
1018 		kvm_restore_lsx(&vcpu->arch.fpu);
1019 		break;
1020 	}
1021 
1022 	trace_kvm_aux(vcpu, KVM_TRACE_AUX_RESTORE, KVM_TRACE_AUX_LSX);
1023 	vcpu->arch.aux_inuse |= KVM_LARCH_LSX | KVM_LARCH_FPU;
1024 	preempt_enable();
1025 
1026 	return 0;
1027 }
1028 #endif
1029 
1030 #ifdef CONFIG_CPU_HAS_LASX
1031 /* Enable LASX and restore context */
1032 int kvm_own_lasx(struct kvm_vcpu *vcpu)
1033 {
1034 	if (!kvm_guest_has_fpu(&vcpu->arch) || !kvm_guest_has_lsx(&vcpu->arch) || !kvm_guest_has_lasx(&vcpu->arch))
1035 		return -EINVAL;
1036 
1037 	preempt_disable();
1038 
1039 	set_csr_euen(CSR_EUEN_FPEN | CSR_EUEN_LSXEN | CSR_EUEN_LASXEN);
1040 	switch (vcpu->arch.aux_inuse & (KVM_LARCH_FPU | KVM_LARCH_LSX)) {
1041 	case KVM_LARCH_LSX:
1042 	case KVM_LARCH_LSX | KVM_LARCH_FPU:
1043 		/* Guest LSX state already loaded, only restore upper LASX state */
1044 		_restore_lasx_upper(&vcpu->arch.fpu);
1045 		break;
1046 	case KVM_LARCH_FPU:
1047 		/* Guest FP state already loaded, only restore upper LSX & LASX state */
1048 		_restore_lsx_upper(&vcpu->arch.fpu);
1049 		_restore_lasx_upper(&vcpu->arch.fpu);
1050 		break;
1051 	default:
1052 		/* Neither FP or LSX already active, restore full LASX state */
1053 		kvm_restore_lasx(&vcpu->arch.fpu);
1054 		break;
1055 	}
1056 
1057 	trace_kvm_aux(vcpu, KVM_TRACE_AUX_RESTORE, KVM_TRACE_AUX_LASX);
1058 	vcpu->arch.aux_inuse |= KVM_LARCH_LASX | KVM_LARCH_LSX | KVM_LARCH_FPU;
1059 	preempt_enable();
1060 
1061 	return 0;
1062 }
1063 #endif
1064 
1065 /* Save context and disable FPU */
1066 void kvm_lose_fpu(struct kvm_vcpu *vcpu)
1067 {
1068 	preempt_disable();
1069 
1070 	if (vcpu->arch.aux_inuse & KVM_LARCH_LASX) {
1071 		kvm_save_lasx(&vcpu->arch.fpu);
1072 		vcpu->arch.aux_inuse &= ~(KVM_LARCH_LSX | KVM_LARCH_FPU | KVM_LARCH_LASX);
1073 		trace_kvm_aux(vcpu, KVM_TRACE_AUX_SAVE, KVM_TRACE_AUX_LASX);
1074 
1075 		/* Disable LASX & LSX & FPU */
1076 		clear_csr_euen(CSR_EUEN_FPEN | CSR_EUEN_LSXEN | CSR_EUEN_LASXEN);
1077 	} else if (vcpu->arch.aux_inuse & KVM_LARCH_LSX) {
1078 		kvm_save_lsx(&vcpu->arch.fpu);
1079 		vcpu->arch.aux_inuse &= ~(KVM_LARCH_LSX | KVM_LARCH_FPU);
1080 		trace_kvm_aux(vcpu, KVM_TRACE_AUX_SAVE, KVM_TRACE_AUX_LSX);
1081 
1082 		/* Disable LSX & FPU */
1083 		clear_csr_euen(CSR_EUEN_FPEN | CSR_EUEN_LSXEN);
1084 	} else if (vcpu->arch.aux_inuse & KVM_LARCH_FPU) {
1085 		kvm_save_fpu(&vcpu->arch.fpu);
1086 		vcpu->arch.aux_inuse &= ~KVM_LARCH_FPU;
1087 		trace_kvm_aux(vcpu, KVM_TRACE_AUX_SAVE, KVM_TRACE_AUX_FPU);
1088 
1089 		/* Disable FPU */
1090 		clear_csr_euen(CSR_EUEN_FPEN);
1091 	}
1092 
1093 	preempt_enable();
1094 }
1095 
1096 int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, struct kvm_interrupt *irq)
1097 {
1098 	int intr = (int)irq->irq;
1099 
1100 	if (intr > 0)
1101 		kvm_queue_irq(vcpu, intr);
1102 	else if (intr < 0)
1103 		kvm_dequeue_irq(vcpu, -intr);
1104 	else {
1105 		kvm_err("%s: invalid interrupt ioctl %d\n", __func__, irq->irq);
1106 		return -EINVAL;
1107 	}
1108 
1109 	kvm_vcpu_kick(vcpu);
1110 
1111 	return 0;
1112 }
1113 
1114 long kvm_arch_vcpu_async_ioctl(struct file *filp,
1115 			       unsigned int ioctl, unsigned long arg)
1116 {
1117 	void __user *argp = (void __user *)arg;
1118 	struct kvm_vcpu *vcpu = filp->private_data;
1119 
1120 	if (ioctl == KVM_INTERRUPT) {
1121 		struct kvm_interrupt irq;
1122 
1123 		if (copy_from_user(&irq, argp, sizeof(irq)))
1124 			return -EFAULT;
1125 
1126 		kvm_debug("[%d] %s: irq: %d\n", vcpu->vcpu_id, __func__, irq.irq);
1127 
1128 		return kvm_vcpu_ioctl_interrupt(vcpu, &irq);
1129 	}
1130 
1131 	return -ENOIOCTLCMD;
1132 }
1133 
1134 int kvm_arch_vcpu_precreate(struct kvm *kvm, unsigned int id)
1135 {
1136 	return 0;
1137 }
1138 
1139 int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
1140 {
1141 	unsigned long timer_hz;
1142 	struct loongarch_csrs *csr;
1143 
1144 	vcpu->arch.vpid = 0;
1145 	vcpu->arch.flush_gpa = INVALID_GPA;
1146 
1147 	hrtimer_init(&vcpu->arch.swtimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED);
1148 	vcpu->arch.swtimer.function = kvm_swtimer_wakeup;
1149 
1150 	vcpu->arch.handle_exit = kvm_handle_exit;
1151 	vcpu->arch.guest_eentry = (unsigned long)kvm_loongarch_ops->exc_entry;
1152 	vcpu->arch.csr = kzalloc(sizeof(struct loongarch_csrs), GFP_KERNEL);
1153 	if (!vcpu->arch.csr)
1154 		return -ENOMEM;
1155 
1156 	/*
1157 	 * All kvm exceptions share one exception entry, and host <-> guest
1158 	 * switch also switch ECFG.VS field, keep host ECFG.VS info here.
1159 	 */
1160 	vcpu->arch.host_ecfg = (read_csr_ecfg() & CSR_ECFG_VS);
1161 
1162 	/* Init */
1163 	vcpu->arch.last_sched_cpu = -1;
1164 
1165 	/*
1166 	 * Initialize guest register state to valid architectural reset state.
1167 	 */
1168 	timer_hz = calc_const_freq();
1169 	kvm_init_timer(vcpu, timer_hz);
1170 
1171 	/* Set Initialize mode for guest */
1172 	csr = vcpu->arch.csr;
1173 	kvm_write_sw_gcsr(csr, LOONGARCH_CSR_CRMD, CSR_CRMD_DA);
1174 
1175 	/* Set cpuid */
1176 	kvm_write_sw_gcsr(csr, LOONGARCH_CSR_TMID, vcpu->vcpu_id);
1177 	kvm_write_sw_gcsr(csr, LOONGARCH_CSR_CPUID, KVM_MAX_PHYID);
1178 
1179 	/* Start with no pending virtual guest interrupts */
1180 	csr->csrs[LOONGARCH_CSR_GINTC] = 0;
1181 
1182 	return 0;
1183 }
1184 
1185 void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
1186 {
1187 }
1188 
1189 void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
1190 {
1191 	int cpu;
1192 	struct kvm_context *context;
1193 
1194 	hrtimer_cancel(&vcpu->arch.swtimer);
1195 	kvm_mmu_free_memory_cache(&vcpu->arch.mmu_page_cache);
1196 	kvm_drop_cpuid(vcpu);
1197 	kfree(vcpu->arch.csr);
1198 
1199 	/*
1200 	 * If the vCPU is freed and reused as another vCPU, we don't want the
1201 	 * matching pointer wrongly hanging around in last_vcpu.
1202 	 */
1203 	for_each_possible_cpu(cpu) {
1204 		context = per_cpu_ptr(vcpu->kvm->arch.vmcs, cpu);
1205 		if (context->last_vcpu == vcpu)
1206 			context->last_vcpu = NULL;
1207 	}
1208 }
1209 
1210 static int _kvm_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
1211 {
1212 	bool migrated;
1213 	struct kvm_context *context;
1214 	struct loongarch_csrs *csr = vcpu->arch.csr;
1215 
1216 	/*
1217 	 * Have we migrated to a different CPU?
1218 	 * If so, any old guest TLB state may be stale.
1219 	 */
1220 	migrated = (vcpu->arch.last_sched_cpu != cpu);
1221 
1222 	/*
1223 	 * Was this the last vCPU to run on this CPU?
1224 	 * If not, any old guest state from this vCPU will have been clobbered.
1225 	 */
1226 	context = per_cpu_ptr(vcpu->kvm->arch.vmcs, cpu);
1227 	if (migrated || (context->last_vcpu != vcpu))
1228 		vcpu->arch.aux_inuse &= ~KVM_LARCH_HWCSR_USABLE;
1229 	context->last_vcpu = vcpu;
1230 
1231 	/* Restore timer state regardless */
1232 	kvm_restore_timer(vcpu);
1233 
1234 	/* Control guest page CCA attribute */
1235 	change_csr_gcfg(CSR_GCFG_MATC_MASK, CSR_GCFG_MATC_ROOT);
1236 	kvm_make_request(KVM_REQ_STEAL_UPDATE, vcpu);
1237 
1238 	/* Don't bother restoring registers multiple times unless necessary */
1239 	if (vcpu->arch.aux_inuse & KVM_LARCH_HWCSR_USABLE)
1240 		return 0;
1241 
1242 	write_csr_gcntc((ulong)vcpu->kvm->arch.time_offset);
1243 
1244 	/* Restore guest CSR registers */
1245 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_CRMD);
1246 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_PRMD);
1247 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_EUEN);
1248 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_MISC);
1249 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_ECFG);
1250 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_ERA);
1251 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_BADV);
1252 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_BADI);
1253 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_EENTRY);
1254 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_TLBIDX);
1255 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_TLBEHI);
1256 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_TLBELO0);
1257 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_TLBELO1);
1258 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_ASID);
1259 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_PGDL);
1260 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_PGDH);
1261 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_PWCTL0);
1262 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_PWCTL1);
1263 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_STLBPGSIZE);
1264 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_RVACFG);
1265 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_CPUID);
1266 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_KS0);
1267 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_KS1);
1268 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_KS2);
1269 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_KS3);
1270 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_KS4);
1271 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_KS5);
1272 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_KS6);
1273 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_KS7);
1274 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_TMID);
1275 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_CNTC);
1276 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_TLBRENTRY);
1277 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_TLBRBADV);
1278 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_TLBRERA);
1279 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_TLBRSAVE);
1280 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_TLBRELO0);
1281 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_TLBRELO1);
1282 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_TLBREHI);
1283 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_TLBRPRMD);
1284 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_DMWIN0);
1285 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_DMWIN1);
1286 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_DMWIN2);
1287 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_DMWIN3);
1288 	kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_LLBCTL);
1289 
1290 	/* Restore Root.GINTC from unused Guest.GINTC register */
1291 	write_csr_gintc(csr->csrs[LOONGARCH_CSR_GINTC]);
1292 
1293 	/*
1294 	 * We should clear linked load bit to break interrupted atomics. This
1295 	 * prevents a SC on the next vCPU from succeeding by matching a LL on
1296 	 * the previous vCPU.
1297 	 */
1298 	if (vcpu->kvm->created_vcpus > 1)
1299 		set_gcsr_llbctl(CSR_LLBCTL_WCLLB);
1300 
1301 	vcpu->arch.aux_inuse |= KVM_LARCH_HWCSR_USABLE;
1302 
1303 	return 0;
1304 }
1305 
1306 void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
1307 {
1308 	unsigned long flags;
1309 
1310 	local_irq_save(flags);
1311 	/* Restore guest state to registers */
1312 	_kvm_vcpu_load(vcpu, cpu);
1313 	local_irq_restore(flags);
1314 }
1315 
1316 static int _kvm_vcpu_put(struct kvm_vcpu *vcpu, int cpu)
1317 {
1318 	struct loongarch_csrs *csr = vcpu->arch.csr;
1319 
1320 	kvm_lose_fpu(vcpu);
1321 
1322 	/*
1323 	 * Update CSR state from hardware if software CSR state is stale,
1324 	 * most CSR registers are kept unchanged during process context
1325 	 * switch except CSR registers like remaining timer tick value and
1326 	 * injected interrupt state.
1327 	 */
1328 	if (vcpu->arch.aux_inuse & KVM_LARCH_SWCSR_LATEST)
1329 		goto out;
1330 
1331 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_CRMD);
1332 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_PRMD);
1333 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_EUEN);
1334 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_MISC);
1335 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_ECFG);
1336 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_ERA);
1337 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_BADV);
1338 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_BADI);
1339 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_EENTRY);
1340 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_TLBIDX);
1341 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_TLBEHI);
1342 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_TLBELO0);
1343 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_TLBELO1);
1344 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_ASID);
1345 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_PGDL);
1346 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_PGDH);
1347 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_PWCTL0);
1348 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_PWCTL1);
1349 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_STLBPGSIZE);
1350 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_RVACFG);
1351 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_CPUID);
1352 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_PRCFG1);
1353 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_PRCFG2);
1354 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_PRCFG3);
1355 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_KS0);
1356 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_KS1);
1357 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_KS2);
1358 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_KS3);
1359 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_KS4);
1360 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_KS5);
1361 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_KS6);
1362 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_KS7);
1363 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_TMID);
1364 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_CNTC);
1365 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_LLBCTL);
1366 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_TLBRENTRY);
1367 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_TLBRBADV);
1368 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_TLBRERA);
1369 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_TLBRSAVE);
1370 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_TLBRELO0);
1371 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_TLBRELO1);
1372 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_TLBREHI);
1373 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_TLBRPRMD);
1374 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_DMWIN0);
1375 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_DMWIN1);
1376 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_DMWIN2);
1377 	kvm_save_hw_gcsr(csr, LOONGARCH_CSR_DMWIN3);
1378 
1379 	vcpu->arch.aux_inuse |= KVM_LARCH_SWCSR_LATEST;
1380 
1381 out:
1382 	kvm_save_timer(vcpu);
1383 	/* Save Root.GINTC into unused Guest.GINTC register */
1384 	csr->csrs[LOONGARCH_CSR_GINTC] = read_csr_gintc();
1385 
1386 	return 0;
1387 }
1388 
1389 void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
1390 {
1391 	int cpu;
1392 	unsigned long flags;
1393 
1394 	local_irq_save(flags);
1395 	cpu = smp_processor_id();
1396 	vcpu->arch.last_sched_cpu = cpu;
1397 
1398 	/* Save guest state in registers */
1399 	_kvm_vcpu_put(vcpu, cpu);
1400 	local_irq_restore(flags);
1401 }
1402 
1403 int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
1404 {
1405 	int r = -EINTR;
1406 	struct kvm_run *run = vcpu->run;
1407 
1408 	if (vcpu->mmio_needed) {
1409 		if (!vcpu->mmio_is_write)
1410 			kvm_complete_mmio_read(vcpu, run);
1411 		vcpu->mmio_needed = 0;
1412 	}
1413 
1414 	if (run->exit_reason == KVM_EXIT_LOONGARCH_IOCSR) {
1415 		if (!run->iocsr_io.is_write)
1416 			kvm_complete_iocsr_read(vcpu, run);
1417 	}
1418 
1419 	if (!vcpu->wants_to_run)
1420 		return r;
1421 
1422 	/* Clear exit_reason */
1423 	run->exit_reason = KVM_EXIT_UNKNOWN;
1424 	lose_fpu(1);
1425 	vcpu_load(vcpu);
1426 	kvm_sigset_activate(vcpu);
1427 	r = kvm_pre_enter_guest(vcpu);
1428 	if (r != RESUME_GUEST)
1429 		goto out;
1430 
1431 	guest_timing_enter_irqoff();
1432 	guest_state_enter_irqoff();
1433 	trace_kvm_enter(vcpu);
1434 	r = kvm_loongarch_ops->enter_guest(run, vcpu);
1435 
1436 	trace_kvm_out(vcpu);
1437 	/*
1438 	 * Guest exit is already recorded at kvm_handle_exit()
1439 	 * return value must not be RESUME_GUEST
1440 	 */
1441 	local_irq_enable();
1442 out:
1443 	kvm_sigset_deactivate(vcpu);
1444 	vcpu_put(vcpu);
1445 
1446 	return r;
1447 }
1448