Lines Matching refs:vcpu

50 static void kvm_riscv_reset_vcpu(struct kvm_vcpu *vcpu)  in kvm_riscv_reset_vcpu()  argument
52 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr; in kvm_riscv_reset_vcpu()
53 struct kvm_vcpu_csr *reset_csr = &vcpu->arch.guest_reset_csr; in kvm_riscv_reset_vcpu()
54 struct kvm_cpu_context *cntx = &vcpu->arch.guest_context; in kvm_riscv_reset_vcpu()
55 struct kvm_cpu_context *reset_cntx = &vcpu->arch.guest_reset_context; in kvm_riscv_reset_vcpu()
61 kvm_riscv_vcpu_fp_reset(vcpu); in kvm_riscv_reset_vcpu()
63 kvm_riscv_vcpu_timer_reset(vcpu); in kvm_riscv_reset_vcpu()
65 WRITE_ONCE(vcpu->arch.irqs_pending, 0); in kvm_riscv_reset_vcpu()
66 WRITE_ONCE(vcpu->arch.irqs_pending_mask, 0); in kvm_riscv_reset_vcpu()
74 int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu) in kvm_arch_vcpu_create() argument
79 vcpu->arch.ran_atleast_once = false; in kvm_arch_vcpu_create()
82 vcpu->arch.isa = riscv_isa_extension_base(NULL) & KVM_RISCV_ISA_ALLOWED; in kvm_arch_vcpu_create()
85 cntx = &vcpu->arch.guest_reset_context; in kvm_arch_vcpu_create()
93 kvm_riscv_vcpu_timer_init(vcpu); in kvm_arch_vcpu_create()
96 kvm_riscv_reset_vcpu(vcpu); in kvm_arch_vcpu_create()
101 void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) in kvm_arch_vcpu_postcreate() argument
105 void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) in kvm_arch_vcpu_destroy() argument
108 kvm_riscv_vcpu_timer_deinit(vcpu); in kvm_arch_vcpu_destroy()
111 kvm_riscv_stage2_flush_cache(vcpu); in kvm_arch_vcpu_destroy()
114 int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) in kvm_cpu_has_pending_timer() argument
116 return kvm_riscv_vcpu_has_interrupts(vcpu, 1UL << IRQ_VS_TIMER); in kvm_cpu_has_pending_timer()
119 void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu) in kvm_arch_vcpu_blocking() argument
123 void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu) in kvm_arch_vcpu_unblocking() argument
127 int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) in kvm_arch_vcpu_runnable() argument
129 return (kvm_riscv_vcpu_has_interrupts(vcpu, -1UL) && in kvm_arch_vcpu_runnable()
130 !vcpu->arch.power_off && !vcpu->arch.pause); in kvm_arch_vcpu_runnable()
133 int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu) in kvm_arch_vcpu_should_kick() argument
135 return kvm_vcpu_exiting_guest_mode(vcpu) == IN_GUEST_MODE; in kvm_arch_vcpu_should_kick()
138 bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu) in kvm_arch_vcpu_in_kernel() argument
140 return (vcpu->arch.guest_context.sstatus & SR_SPP) ? true : false; in kvm_arch_vcpu_in_kernel()
143 vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf) in kvm_arch_vcpu_fault() argument
148 static int kvm_riscv_vcpu_get_reg_config(struct kvm_vcpu *vcpu, in kvm_riscv_vcpu_get_reg_config() argument
163 reg_val = vcpu->arch.isa; in kvm_riscv_vcpu_get_reg_config()
175 static int kvm_riscv_vcpu_set_reg_config(struct kvm_vcpu *vcpu, in kvm_riscv_vcpu_set_reg_config() argument
193 if (!vcpu->arch.ran_atleast_once) { in kvm_riscv_vcpu_set_reg_config()
194 vcpu->arch.isa = reg_val; in kvm_riscv_vcpu_set_reg_config()
195 vcpu->arch.isa &= riscv_isa_extension_base(NULL); in kvm_riscv_vcpu_set_reg_config()
196 vcpu->arch.isa &= KVM_RISCV_ISA_ALLOWED; in kvm_riscv_vcpu_set_reg_config()
197 kvm_riscv_vcpu_fp_reset(vcpu); in kvm_riscv_vcpu_set_reg_config()
209 static int kvm_riscv_vcpu_get_reg_core(struct kvm_vcpu *vcpu, in kvm_riscv_vcpu_get_reg_core() argument
212 struct kvm_cpu_context *cntx = &vcpu->arch.guest_context; in kvm_riscv_vcpu_get_reg_core()
242 static int kvm_riscv_vcpu_set_reg_core(struct kvm_vcpu *vcpu, in kvm_riscv_vcpu_set_reg_core() argument
245 struct kvm_cpu_context *cntx = &vcpu->arch.guest_context; in kvm_riscv_vcpu_set_reg_core()
277 static int kvm_riscv_vcpu_get_reg_csr(struct kvm_vcpu *vcpu, in kvm_riscv_vcpu_get_reg_csr() argument
280 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr; in kvm_riscv_vcpu_get_reg_csr()
294 kvm_riscv_vcpu_flush_interrupts(vcpu); in kvm_riscv_vcpu_get_reg_csr()
305 static int kvm_riscv_vcpu_set_reg_csr(struct kvm_vcpu *vcpu, in kvm_riscv_vcpu_set_reg_csr() argument
308 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr; in kvm_riscv_vcpu_set_reg_csr()
332 WRITE_ONCE(vcpu->arch.irqs_pending_mask, 0); in kvm_riscv_vcpu_set_reg_csr()
337 static int kvm_riscv_vcpu_set_reg(struct kvm_vcpu *vcpu, in kvm_riscv_vcpu_set_reg() argument
341 return kvm_riscv_vcpu_set_reg_config(vcpu, reg); in kvm_riscv_vcpu_set_reg()
343 return kvm_riscv_vcpu_set_reg_core(vcpu, reg); in kvm_riscv_vcpu_set_reg()
345 return kvm_riscv_vcpu_set_reg_csr(vcpu, reg); in kvm_riscv_vcpu_set_reg()
347 return kvm_riscv_vcpu_set_reg_timer(vcpu, reg); in kvm_riscv_vcpu_set_reg()
349 return kvm_riscv_vcpu_set_reg_fp(vcpu, reg, in kvm_riscv_vcpu_set_reg()
352 return kvm_riscv_vcpu_set_reg_fp(vcpu, reg, in kvm_riscv_vcpu_set_reg()
358 static int kvm_riscv_vcpu_get_reg(struct kvm_vcpu *vcpu, in kvm_riscv_vcpu_get_reg() argument
362 return kvm_riscv_vcpu_get_reg_config(vcpu, reg); in kvm_riscv_vcpu_get_reg()
364 return kvm_riscv_vcpu_get_reg_core(vcpu, reg); in kvm_riscv_vcpu_get_reg()
366 return kvm_riscv_vcpu_get_reg_csr(vcpu, reg); in kvm_riscv_vcpu_get_reg()
368 return kvm_riscv_vcpu_get_reg_timer(vcpu, reg); in kvm_riscv_vcpu_get_reg()
370 return kvm_riscv_vcpu_get_reg_fp(vcpu, reg, in kvm_riscv_vcpu_get_reg()
373 return kvm_riscv_vcpu_get_reg_fp(vcpu, reg, in kvm_riscv_vcpu_get_reg()
382 struct kvm_vcpu *vcpu = filp->private_data; in kvm_arch_vcpu_async_ioctl() local
392 return kvm_riscv_vcpu_set_interrupt(vcpu, IRQ_VS_EXT); in kvm_arch_vcpu_async_ioctl()
394 return kvm_riscv_vcpu_unset_interrupt(vcpu, IRQ_VS_EXT); in kvm_arch_vcpu_async_ioctl()
403 struct kvm_vcpu *vcpu = filp->private_data; in kvm_arch_vcpu_ioctl() local
417 r = kvm_riscv_vcpu_set_reg(vcpu, &reg); in kvm_arch_vcpu_ioctl()
419 r = kvm_riscv_vcpu_get_reg(vcpu, &reg); in kvm_arch_vcpu_ioctl()
429 int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, in kvm_arch_vcpu_ioctl_get_sregs() argument
435 int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, in kvm_arch_vcpu_ioctl_set_sregs() argument
441 int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) in kvm_arch_vcpu_ioctl_get_fpu() argument
446 int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) in kvm_arch_vcpu_ioctl_set_fpu() argument
451 int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, in kvm_arch_vcpu_ioctl_translate() argument
457 int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) in kvm_arch_vcpu_ioctl_get_regs() argument
462 int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) in kvm_arch_vcpu_ioctl_set_regs() argument
467 void kvm_riscv_vcpu_flush_interrupts(struct kvm_vcpu *vcpu) in kvm_riscv_vcpu_flush_interrupts() argument
469 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr; in kvm_riscv_vcpu_flush_interrupts()
472 if (READ_ONCE(vcpu->arch.irqs_pending_mask)) { in kvm_riscv_vcpu_flush_interrupts()
473 mask = xchg_acquire(&vcpu->arch.irqs_pending_mask, 0); in kvm_riscv_vcpu_flush_interrupts()
474 val = READ_ONCE(vcpu->arch.irqs_pending) & mask; in kvm_riscv_vcpu_flush_interrupts()
481 void kvm_riscv_vcpu_sync_interrupts(struct kvm_vcpu *vcpu) in kvm_riscv_vcpu_sync_interrupts() argument
484 struct kvm_vcpu_arch *v = &vcpu->arch; in kvm_riscv_vcpu_sync_interrupts()
485 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr; in kvm_riscv_vcpu_sync_interrupts()
505 int kvm_riscv_vcpu_set_interrupt(struct kvm_vcpu *vcpu, unsigned int irq) in kvm_riscv_vcpu_set_interrupt() argument
512 set_bit(irq, &vcpu->arch.irqs_pending); in kvm_riscv_vcpu_set_interrupt()
514 set_bit(irq, &vcpu->arch.irqs_pending_mask); in kvm_riscv_vcpu_set_interrupt()
516 kvm_vcpu_kick(vcpu); in kvm_riscv_vcpu_set_interrupt()
521 int kvm_riscv_vcpu_unset_interrupt(struct kvm_vcpu *vcpu, unsigned int irq) in kvm_riscv_vcpu_unset_interrupt() argument
528 clear_bit(irq, &vcpu->arch.irqs_pending); in kvm_riscv_vcpu_unset_interrupt()
530 set_bit(irq, &vcpu->arch.irqs_pending_mask); in kvm_riscv_vcpu_unset_interrupt()
535 bool kvm_riscv_vcpu_has_interrupts(struct kvm_vcpu *vcpu, unsigned long mask) in kvm_riscv_vcpu_has_interrupts() argument
537 unsigned long ie = ((vcpu->arch.guest_csr.vsie & VSIP_VALID_MASK) in kvm_riscv_vcpu_has_interrupts()
540 return (READ_ONCE(vcpu->arch.irqs_pending) & ie) ? true : false; in kvm_riscv_vcpu_has_interrupts()
543 void kvm_riscv_vcpu_power_off(struct kvm_vcpu *vcpu) in kvm_riscv_vcpu_power_off() argument
545 vcpu->arch.power_off = true; in kvm_riscv_vcpu_power_off()
546 kvm_make_request(KVM_REQ_SLEEP, vcpu); in kvm_riscv_vcpu_power_off()
547 kvm_vcpu_kick(vcpu); in kvm_riscv_vcpu_power_off()
550 void kvm_riscv_vcpu_power_on(struct kvm_vcpu *vcpu) in kvm_riscv_vcpu_power_on() argument
552 vcpu->arch.power_off = false; in kvm_riscv_vcpu_power_on()
553 kvm_vcpu_wake_up(vcpu); in kvm_riscv_vcpu_power_on()
556 int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, in kvm_arch_vcpu_ioctl_get_mpstate() argument
559 if (vcpu->arch.power_off) in kvm_arch_vcpu_ioctl_get_mpstate()
567 int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, in kvm_arch_vcpu_ioctl_set_mpstate() argument
574 vcpu->arch.power_off = false; in kvm_arch_vcpu_ioctl_set_mpstate()
577 kvm_riscv_vcpu_power_off(vcpu); in kvm_arch_vcpu_ioctl_set_mpstate()
586 int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, in kvm_arch_vcpu_ioctl_set_guest_debug() argument
593 void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) in kvm_arch_vcpu_load() argument
595 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr; in kvm_arch_vcpu_load()
607 kvm_riscv_stage2_update_hgatp(vcpu); in kvm_arch_vcpu_load()
609 kvm_riscv_vcpu_timer_restore(vcpu); in kvm_arch_vcpu_load()
611 kvm_riscv_vcpu_host_fp_save(&vcpu->arch.host_context); in kvm_arch_vcpu_load()
612 kvm_riscv_vcpu_guest_fp_restore(&vcpu->arch.guest_context, in kvm_arch_vcpu_load()
613 vcpu->arch.isa); in kvm_arch_vcpu_load()
615 vcpu->cpu = cpu; in kvm_arch_vcpu_load()
618 void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) in kvm_arch_vcpu_put() argument
620 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr; in kvm_arch_vcpu_put()
622 vcpu->cpu = -1; in kvm_arch_vcpu_put()
624 kvm_riscv_vcpu_guest_fp_save(&vcpu->arch.guest_context, in kvm_arch_vcpu_put()
625 vcpu->arch.isa); in kvm_arch_vcpu_put()
626 kvm_riscv_vcpu_host_fp_restore(&vcpu->arch.host_context); in kvm_arch_vcpu_put()
641 static void kvm_riscv_check_vcpu_requests(struct kvm_vcpu *vcpu) in kvm_riscv_check_vcpu_requests() argument
643 struct rcuwait *wait = kvm_arch_vcpu_get_wait(vcpu); in kvm_riscv_check_vcpu_requests()
645 if (kvm_request_pending(vcpu)) { in kvm_riscv_check_vcpu_requests()
646 if (kvm_check_request(KVM_REQ_SLEEP, vcpu)) { in kvm_riscv_check_vcpu_requests()
648 (!vcpu->arch.power_off) && (!vcpu->arch.pause), in kvm_riscv_check_vcpu_requests()
651 if (vcpu->arch.power_off || vcpu->arch.pause) { in kvm_riscv_check_vcpu_requests()
656 kvm_make_request(KVM_REQ_SLEEP, vcpu); in kvm_riscv_check_vcpu_requests()
660 if (kvm_check_request(KVM_REQ_VCPU_RESET, vcpu)) in kvm_riscv_check_vcpu_requests()
661 kvm_riscv_reset_vcpu(vcpu); in kvm_riscv_check_vcpu_requests()
663 if (kvm_check_request(KVM_REQ_UPDATE_HGATP, vcpu)) in kvm_riscv_check_vcpu_requests()
664 kvm_riscv_stage2_update_hgatp(vcpu); in kvm_riscv_check_vcpu_requests()
666 if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu)) in kvm_riscv_check_vcpu_requests()
671 static void kvm_riscv_update_hvip(struct kvm_vcpu *vcpu) in kvm_riscv_update_hvip() argument
673 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr; in kvm_riscv_update_hvip()
678 int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu) in kvm_arch_vcpu_ioctl_run() argument
682 struct kvm_run *run = vcpu->run; in kvm_arch_vcpu_ioctl_run()
685 vcpu->arch.ran_atleast_once = true; in kvm_arch_vcpu_ioctl_run()
687 vcpu->arch.srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); in kvm_arch_vcpu_ioctl_run()
691 ret = kvm_riscv_vcpu_mmio_return(vcpu, vcpu->run); in kvm_arch_vcpu_ioctl_run()
693 srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx); in kvm_arch_vcpu_ioctl_run()
700 ret = kvm_riscv_vcpu_sbi_return(vcpu, vcpu->run); in kvm_arch_vcpu_ioctl_run()
702 srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx); in kvm_arch_vcpu_ioctl_run()
708 srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx); in kvm_arch_vcpu_ioctl_run()
712 vcpu_load(vcpu); in kvm_arch_vcpu_ioctl_run()
714 kvm_sigset_activate(vcpu); in kvm_arch_vcpu_ioctl_run()
722 kvm_riscv_stage2_vmid_update(vcpu); in kvm_arch_vcpu_ioctl_run()
724 kvm_riscv_check_vcpu_requests(vcpu); in kvm_arch_vcpu_ioctl_run()
745 vcpu->mode = IN_GUEST_MODE; in kvm_arch_vcpu_ioctl_run()
747 srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx); in kvm_arch_vcpu_ioctl_run()
754 kvm_riscv_vcpu_flush_interrupts(vcpu); in kvm_arch_vcpu_ioctl_run()
757 kvm_riscv_update_hvip(vcpu); in kvm_arch_vcpu_ioctl_run()
760 kvm_riscv_stage2_vmid_ver_changed(&vcpu->kvm->arch.vmid) || in kvm_arch_vcpu_ioctl_run()
761 kvm_request_pending(vcpu)) { in kvm_arch_vcpu_ioctl_run()
762 vcpu->mode = OUTSIDE_GUEST_MODE; in kvm_arch_vcpu_ioctl_run()
765 vcpu->arch.srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); in kvm_arch_vcpu_ioctl_run()
771 __kvm_riscv_switch_to(&vcpu->arch); in kvm_arch_vcpu_ioctl_run()
773 vcpu->mode = OUTSIDE_GUEST_MODE; in kvm_arch_vcpu_ioctl_run()
774 vcpu->stat.exits++; in kvm_arch_vcpu_ioctl_run()
781 trap.sepc = vcpu->arch.guest_context.sepc; in kvm_arch_vcpu_ioctl_run()
788 kvm_riscv_vcpu_sync_interrupts(vcpu); in kvm_arch_vcpu_ioctl_run()
813 vcpu->arch.srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); in kvm_arch_vcpu_ioctl_run()
815 ret = kvm_riscv_vcpu_exit(vcpu, run, &trap); in kvm_arch_vcpu_ioctl_run()
818 kvm_sigset_deactivate(vcpu); in kvm_arch_vcpu_ioctl_run()
820 vcpu_put(vcpu); in kvm_arch_vcpu_ioctl_run()
822 srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx); in kvm_arch_vcpu_ioctl_run()