Lines Matching refs:vcpu

45 static void kvm_riscv_reset_vcpu(struct kvm_vcpu *vcpu)
47 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
48 struct kvm_vcpu_csr *reset_csr = &vcpu->arch.guest_reset_csr;
49 struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
50 struct kvm_cpu_context *reset_cntx = &vcpu->arch.guest_reset_context;
59 loaded = (vcpu->cpu != -1);
61 kvm_arch_vcpu_put(vcpu);
63 vcpu->arch.last_exit_cpu = -1;
69 kvm_riscv_vcpu_fp_reset(vcpu);
71 kvm_riscv_vcpu_vector_reset(vcpu);
73 kvm_riscv_vcpu_timer_reset(vcpu);
75 kvm_riscv_vcpu_aia_reset(vcpu);
77 bitmap_zero(vcpu->arch.irqs_pending, KVM_RISCV_VCPU_NR_IRQS);
78 bitmap_zero(vcpu->arch.irqs_pending_mask, KVM_RISCV_VCPU_NR_IRQS);
80 kvm_riscv_vcpu_pmu_reset(vcpu);
82 vcpu->arch.hfence_head = 0;
83 vcpu->arch.hfence_tail = 0;
84 memset(vcpu->arch.hfence_queue, 0, sizeof(vcpu->arch.hfence_queue));
88 kvm_arch_vcpu_load(vcpu, smp_processor_id());
97 int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
101 struct kvm_vcpu_csr *reset_csr = &vcpu->arch.guest_reset_csr;
104 vcpu->arch.ran_atleast_once = false;
105 vcpu->arch.mmu_page_cache.gfp_zero = __GFP_ZERO;
106 bitmap_zero(vcpu->arch.isa, RISCV_ISA_EXT_MAX);
109 kvm_riscv_vcpu_setup_isa(vcpu);
112 vcpu->arch.mvendorid = sbi_get_mvendorid();
113 vcpu->arch.marchid = sbi_get_marchid();
114 vcpu->arch.mimpid = sbi_get_mimpid();
117 spin_lock_init(&vcpu->arch.hfence_lock);
120 cntx = &vcpu->arch.guest_reset_context;
127 if (kvm_riscv_vcpu_alloc_vector_context(vcpu, cntx))
134 kvm_riscv_vcpu_timer_init(vcpu);
137 kvm_riscv_vcpu_pmu_init(vcpu);
140 rc = kvm_riscv_vcpu_aia_init(vcpu);
145 kvm_riscv_reset_vcpu(vcpu);
150 void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
153 * vcpu with id 0 is the designated boot cpu.
157 if (vcpu->vcpu_idx != 0)
158 kvm_riscv_vcpu_power_off(vcpu);
161 void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
164 kvm_riscv_vcpu_aia_deinit(vcpu);
167 kvm_riscv_vcpu_timer_deinit(vcpu);
169 kvm_riscv_vcpu_pmu_deinit(vcpu);
172 kvm_mmu_free_memory_cache(&vcpu->arch.mmu_page_cache);
175 kvm_riscv_vcpu_free_vector_context(vcpu);
178 int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
180 return kvm_riscv_vcpu_timer_pending(vcpu);
183 void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu)
185 kvm_riscv_aia_wakeon_hgei(vcpu, true);
188 void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu)
190 kvm_riscv_aia_wakeon_hgei(vcpu, false);
193 int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
195 return (kvm_riscv_vcpu_has_interrupts(vcpu, -1UL) &&
196 !vcpu->arch.power_off && !vcpu->arch.pause);
199 int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu)
201 return kvm_vcpu_exiting_guest_mode(vcpu) == IN_GUEST_MODE;
204 bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu)
206 return (vcpu->arch.guest_context.sstatus & SR_SPP) ? true : false;
209 vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
217 struct kvm_vcpu *vcpu = filp->private_data;
227 return kvm_riscv_vcpu_set_interrupt(vcpu, IRQ_VS_EXT);
229 return kvm_riscv_vcpu_unset_interrupt(vcpu, IRQ_VS_EXT);
238 struct kvm_vcpu *vcpu = filp->private_data;
252 r = kvm_riscv_vcpu_set_reg(vcpu, &reg);
254 r = kvm_riscv_vcpu_get_reg(vcpu, &reg);
266 reg_list.n = kvm_riscv_vcpu_num_regs(vcpu);
272 r = kvm_riscv_vcpu_copy_reg_indices(vcpu, user_list->reg);
282 int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
288 int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
294 int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
299 int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
304 int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
310 int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
315 int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
320 void kvm_riscv_vcpu_flush_interrupts(struct kvm_vcpu *vcpu)
322 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
325 if (READ_ONCE(vcpu->arch.irqs_pending_mask[0])) {
326 mask = xchg_acquire(&vcpu->arch.irqs_pending_mask[0], 0);
327 val = READ_ONCE(vcpu->arch.irqs_pending[0]) & mask;
334 kvm_riscv_vcpu_aia_flush_interrupts(vcpu);
337 void kvm_riscv_vcpu_sync_interrupts(struct kvm_vcpu *vcpu)
340 struct kvm_vcpu_arch *v = &vcpu->arch;
341 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
361 kvm_riscv_vcpu_aia_sync_interrupts(vcpu);
364 kvm_riscv_vcpu_timer_sync(vcpu);
367 int kvm_riscv_vcpu_set_interrupt(struct kvm_vcpu *vcpu, unsigned int irq)
380 set_bit(irq, vcpu->arch.irqs_pending);
382 set_bit(irq, vcpu->arch.irqs_pending_mask);
384 kvm_vcpu_kick(vcpu);
389 int kvm_riscv_vcpu_unset_interrupt(struct kvm_vcpu *vcpu, unsigned int irq)
402 clear_bit(irq, vcpu->arch.irqs_pending);
404 set_bit(irq, vcpu->arch.irqs_pending_mask);
409 bool kvm_riscv_vcpu_has_interrupts(struct kvm_vcpu *vcpu, u64 mask)
413 ie = ((vcpu->arch.guest_csr.vsie & VSIP_VALID_MASK)
415 ie |= vcpu->arch.guest_csr.vsie & ~IRQ_LOCAL_MASK &
417 if (READ_ONCE(vcpu->arch.irqs_pending[0]) & ie)
421 return kvm_riscv_vcpu_aia_has_interrupts(vcpu, mask);
424 void kvm_riscv_vcpu_power_off(struct kvm_vcpu *vcpu)
426 vcpu->arch.power_off = true;
427 kvm_make_request(KVM_REQ_SLEEP, vcpu);
428 kvm_vcpu_kick(vcpu);
431 void kvm_riscv_vcpu_power_on(struct kvm_vcpu *vcpu)
433 vcpu->arch.power_off = false;
434 kvm_vcpu_wake_up(vcpu);
437 int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
440 if (vcpu->arch.power_off)
448 int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
455 vcpu->arch.power_off = false;
458 kvm_riscv_vcpu_power_off(vcpu);
467 int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
496 void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
498 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
510 kvm_riscv_vcpu_update_config(vcpu->arch.isa);
512 kvm_riscv_gstage_update_hgatp(vcpu);
514 kvm_riscv_vcpu_timer_restore(vcpu);
516 kvm_riscv_vcpu_host_fp_save(&vcpu->arch.host_context);
517 kvm_riscv_vcpu_guest_fp_restore(&vcpu->arch.guest_context,
518 vcpu->arch.isa);
519 kvm_riscv_vcpu_host_vector_save(&vcpu->arch.host_context);
520 kvm_riscv_vcpu_guest_vector_restore(&vcpu->arch.guest_context,
521 vcpu->arch.isa);
523 kvm_riscv_vcpu_aia_load(vcpu, cpu);
525 vcpu->cpu = cpu;
528 void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
530 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
532 vcpu->cpu = -1;
534 kvm_riscv_vcpu_aia_put(vcpu);
536 kvm_riscv_vcpu_guest_fp_save(&vcpu->arch.guest_context,
537 vcpu->arch.isa);
538 kvm_riscv_vcpu_host_fp_restore(&vcpu->arch.host_context);
540 kvm_riscv_vcpu_timer_save(vcpu);
541 kvm_riscv_vcpu_guest_vector_save(&vcpu->arch.guest_context,
542 vcpu->arch.isa);
543 kvm_riscv_vcpu_host_vector_restore(&vcpu->arch.host_context);
556 static void kvm_riscv_check_vcpu_requests(struct kvm_vcpu *vcpu)
558 struct rcuwait *wait = kvm_arch_vcpu_get_wait(vcpu);
560 if (kvm_request_pending(vcpu)) {
561 if (kvm_check_request(KVM_REQ_SLEEP, vcpu)) {
562 kvm_vcpu_srcu_read_unlock(vcpu);
564 (!vcpu->arch.power_off) && (!vcpu->arch.pause),
566 kvm_vcpu_srcu_read_lock(vcpu);
568 if (vcpu->arch.power_off || vcpu->arch.pause) {
573 kvm_make_request(KVM_REQ_SLEEP, vcpu);
577 if (kvm_check_request(KVM_REQ_VCPU_RESET, vcpu))
578 kvm_riscv_reset_vcpu(vcpu);
580 if (kvm_check_request(KVM_REQ_UPDATE_HGATP, vcpu))
581 kvm_riscv_gstage_update_hgatp(vcpu);
583 if (kvm_check_request(KVM_REQ_FENCE_I, vcpu))
584 kvm_riscv_fence_i_process(vcpu);
590 if (kvm_check_request(KVM_REQ_HFENCE_GVMA_VMID_ALL, vcpu))
591 kvm_riscv_hfence_gvma_vmid_all_process(vcpu);
593 if (kvm_check_request(KVM_REQ_HFENCE_VVMA_ALL, vcpu))
594 kvm_riscv_hfence_vvma_all_process(vcpu);
596 if (kvm_check_request(KVM_REQ_HFENCE, vcpu))
597 kvm_riscv_hfence_process(vcpu);
601 static void kvm_riscv_update_hvip(struct kvm_vcpu *vcpu)
603 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
606 kvm_riscv_vcpu_aia_update_hvip(vcpu);
616 static void noinstr kvm_riscv_vcpu_enter_exit(struct kvm_vcpu *vcpu)
619 __kvm_riscv_switch_to(&vcpu->arch);
620 vcpu->arch.last_exit_cpu = vcpu->cpu;
624 int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
628 struct kvm_run *run = vcpu->run;
631 vcpu->arch.ran_atleast_once = true;
633 kvm_vcpu_srcu_read_lock(vcpu);
638 ret = kvm_riscv_vcpu_mmio_return(vcpu, vcpu->run);
642 ret = kvm_riscv_vcpu_sbi_return(vcpu, vcpu->run);
646 ret = kvm_riscv_vcpu_csr_return(vcpu, vcpu->run);
653 kvm_vcpu_srcu_read_unlock(vcpu);
658 kvm_vcpu_srcu_read_unlock(vcpu);
662 vcpu_load(vcpu);
664 kvm_sigset_activate(vcpu);
670 ret = xfer_to_guest_mode_handle_work(vcpu);
675 kvm_riscv_gstage_vmid_update(vcpu);
677 kvm_riscv_check_vcpu_requests(vcpu);
682 ret = kvm_riscv_vcpu_aia_update(vcpu);
694 * Documentation/virt/kvm/vcpu-requests.rst
696 vcpu->mode = IN_GUEST_MODE;
698 kvm_vcpu_srcu_read_unlock(vcpu);
705 kvm_riscv_vcpu_flush_interrupts(vcpu);
708 kvm_riscv_update_hvip(vcpu);
711 kvm_riscv_gstage_vmid_ver_changed(&vcpu->kvm->arch.vmid) ||
712 kvm_request_pending(vcpu) ||
714 vcpu->mode = OUTSIDE_GUEST_MODE;
717 kvm_vcpu_srcu_read_lock(vcpu);
727 kvm_riscv_local_tlb_sanitize(vcpu);
731 kvm_riscv_vcpu_enter_exit(vcpu);
733 vcpu->mode = OUTSIDE_GUEST_MODE;
734 vcpu->stat.exits++;
741 trap.sepc = vcpu->arch.guest_context.sepc;
748 kvm_riscv_vcpu_sync_interrupts(vcpu);
769 kvm_vcpu_srcu_read_lock(vcpu);
771 ret = kvm_riscv_vcpu_exit(vcpu, run, &trap);
774 kvm_sigset_deactivate(vcpu);
776 vcpu_put(vcpu);
778 kvm_vcpu_srcu_read_unlock(vcpu);