Lines Matching refs:vcpu

74 static inline void kvmppc_update_int_pending(struct kvm_vcpu *vcpu,
77 if (is_kvmppc_hv_enabled(vcpu->kvm))
80 kvmppc_set_int_pending(vcpu, 1);
82 kvmppc_set_int_pending(vcpu, 0);
85 static inline bool kvmppc_critical_section(struct kvm_vcpu *vcpu)
91 if (is_kvmppc_hv_enabled(vcpu->kvm))
94 crit_raw = kvmppc_get_critical(vcpu);
95 crit_r1 = kvmppc_get_gpr(vcpu, 1);
98 if (!(kvmppc_get_msr(vcpu) & MSR_SF)) {
106 crit = crit && !(kvmppc_get_msr(vcpu) & MSR_PR);
111 void kvmppc_inject_interrupt(struct kvm_vcpu *vcpu, int vec, u64 flags)
113 vcpu->kvm->arch.kvm_ops->inject_interrupt(vcpu, vec, flags);
143 void kvmppc_book3s_dequeue_irqprio(struct kvm_vcpu *vcpu,
146 unsigned long old_pending = vcpu->arch.pending_exceptions;
149 &vcpu->arch.pending_exceptions);
151 kvmppc_update_int_pending(vcpu, vcpu->arch.pending_exceptions,
155 void kvmppc_book3s_queue_irqprio(struct kvm_vcpu *vcpu, unsigned int vec)
157 vcpu->stat.queue_intr++;
160 &vcpu->arch.pending_exceptions);
167 void kvmppc_core_queue_machine_check(struct kvm_vcpu *vcpu, ulong flags)
170 kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_MACHINE_CHECK, flags);
174 void kvmppc_core_queue_program(struct kvm_vcpu *vcpu, ulong flags)
177 kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_PROGRAM, flags);
181 void kvmppc_core_queue_fpunavail(struct kvm_vcpu *vcpu)
184 kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_FP_UNAVAIL, 0);
187 void kvmppc_core_queue_vec_unavail(struct kvm_vcpu *vcpu)
190 kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_ALTIVEC, 0);
193 void kvmppc_core_queue_vsx_unavail(struct kvm_vcpu *vcpu)
196 kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_VSX, 0);
199 void kvmppc_core_queue_dec(struct kvm_vcpu *vcpu)
201 kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_DECREMENTER);
205 int kvmppc_core_pending_dec(struct kvm_vcpu *vcpu)
207 return test_bit(BOOK3S_IRQPRIO_DECREMENTER, &vcpu->arch.pending_exceptions);
211 void kvmppc_core_dequeue_dec(struct kvm_vcpu *vcpu)
213 kvmppc_book3s_dequeue_irqprio(vcpu, BOOK3S_INTERRUPT_DECREMENTER);
217 void kvmppc_core_queue_external(struct kvm_vcpu *vcpu,
232 * KVM_INTERRUPT_SET on a pseries guest vcpu, because the
241 vcpu->arch.external_oneshot = 1;
243 kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_EXTERNAL);
246 void kvmppc_core_dequeue_external(struct kvm_vcpu *vcpu)
248 kvmppc_book3s_dequeue_irqprio(vcpu, BOOK3S_INTERRUPT_EXTERNAL);
251 void kvmppc_core_queue_data_storage(struct kvm_vcpu *vcpu, ulong dar,
254 kvmppc_set_dar(vcpu, dar);
255 kvmppc_set_dsisr(vcpu, flags);
256 kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_DATA_STORAGE, 0);
260 void kvmppc_core_queue_inst_storage(struct kvm_vcpu *vcpu, ulong flags)
262 kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_INST_STORAGE, flags);
266 static int kvmppc_book3s_irqprio_deliver(struct kvm_vcpu *vcpu,
271 bool crit = kvmppc_critical_section(vcpu);
275 deliver = (kvmppc_get_msr(vcpu) & MSR_EE) && !crit;
279 deliver = (kvmppc_get_msr(vcpu) & MSR_EE) && !crit;
338 kvmppc_inject_interrupt(vcpu, vec, 0);
346 static bool clear_irqprio(struct kvm_vcpu *vcpu, unsigned int priority)
358 if (vcpu->arch.external_oneshot) {
359 vcpu->arch.external_oneshot = 0;
368 int kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu)
370 unsigned long *pending = &vcpu->arch.pending_exceptions;
371 unsigned long old_pending = vcpu->arch.pending_exceptions;
375 if (vcpu->arch.pending_exceptions)
376 printk(KERN_EMERG "KVM: Check pending: %lx\n", vcpu->arch.pending_exceptions);
380 if (kvmppc_book3s_irqprio_deliver(vcpu, priority) &&
381 clear_irqprio(vcpu, priority)) {
382 clear_bit(priority, &vcpu->arch.pending_exceptions);
392 kvmppc_update_int_pending(vcpu, *pending, old_pending);
398 kvm_pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa, bool writing,
401 ulong mp_pa = vcpu->arch.magic_page_pa & KVM_PAM;
404 if (!(kvmppc_get_msr(vcpu) & MSR_SF))
410 ulong shared_page = ((ulong)vcpu->arch.shared) & PAGE_MASK;
420 return gfn_to_pfn_prot(vcpu->kvm, gfn, writing, writable);
424 int kvmppc_xlate(struct kvm_vcpu *vcpu, ulong eaddr, enum xlate_instdata xlid,
429 int relocated = (kvmppc_get_msr(vcpu) & (data ? MSR_DR : MSR_IR));
433 r = vcpu->arch.mmu.xlate(vcpu, eaddr, pte, data, iswrite);
443 if ((kvmppc_get_msr(vcpu) & (MSR_IR | MSR_DR)) == MSR_DR &&
445 if ((vcpu->arch.hflags & BOOK3S_HFLAG_SPLIT_HACK) &&
454 int kvmppc_load_last_inst(struct kvm_vcpu *vcpu,
457 ulong pc = kvmppc_get_pc(vcpu);
463 r = kvmppc_ld(vcpu, &pc, sizeof(u32), inst, false);
471 int kvmppc_subarch_vcpu_init(struct kvm_vcpu *vcpu)
476 void kvmppc_subarch_vcpu_uninit(struct kvm_vcpu *vcpu)
480 int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
485 vcpu_load(vcpu);
486 ret = vcpu->kvm->arch.kvm_ops->get_sregs(vcpu, sregs);
487 vcpu_put(vcpu);
492 int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
497 vcpu_load(vcpu);
498 ret = vcpu->kvm->arch.kvm_ops->set_sregs(vcpu, sregs);
499 vcpu_put(vcpu);
504 int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
508 regs->pc = kvmppc_get_pc(vcpu);
509 regs->cr = kvmppc_get_cr(vcpu);
510 regs->ctr = kvmppc_get_ctr(vcpu);
511 regs->lr = kvmppc_get_lr(vcpu);
512 regs->xer = kvmppc_get_xer(vcpu);
513 regs->msr = kvmppc_get_msr(vcpu);
514 regs->srr0 = kvmppc_get_srr0(vcpu);
515 regs->srr1 = kvmppc_get_srr1(vcpu);
516 regs->pid = vcpu->arch.pid;
517 regs->sprg0 = kvmppc_get_sprg0(vcpu);
518 regs->sprg1 = kvmppc_get_sprg1(vcpu);
519 regs->sprg2 = kvmppc_get_sprg2(vcpu);
520 regs->sprg3 = kvmppc_get_sprg3(vcpu);
521 regs->sprg4 = kvmppc_get_sprg4(vcpu);
522 regs->sprg5 = kvmppc_get_sprg5(vcpu);
523 regs->sprg6 = kvmppc_get_sprg6(vcpu);
524 regs->sprg7 = kvmppc_get_sprg7(vcpu);
527 regs->gpr[i] = kvmppc_get_gpr(vcpu, i);
532 int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
536 kvmppc_set_pc(vcpu, regs->pc);
537 kvmppc_set_cr(vcpu, regs->cr);
538 kvmppc_set_ctr(vcpu, regs->ctr);
539 kvmppc_set_lr(vcpu, regs->lr);
540 kvmppc_set_xer(vcpu, regs->xer);
541 kvmppc_set_msr(vcpu, regs->msr);
542 kvmppc_set_srr0(vcpu, regs->srr0);
543 kvmppc_set_srr1(vcpu, regs->srr1);
544 kvmppc_set_sprg0(vcpu, regs->sprg0);
545 kvmppc_set_sprg1(vcpu, regs->sprg1);
546 kvmppc_set_sprg2(vcpu, regs->sprg2);
547 kvmppc_set_sprg3(vcpu, regs->sprg3);
548 kvmppc_set_sprg4(vcpu, regs->sprg4);
549 kvmppc_set_sprg5(vcpu, regs->sprg5);
550 kvmppc_set_sprg6(vcpu, regs->sprg6);
551 kvmppc_set_sprg7(vcpu, regs->sprg7);
554 kvmppc_set_gpr(vcpu, i, regs->gpr[i]);
559 int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
564 int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
569 int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id,
575 r = vcpu->kvm->arch.kvm_ops->get_one_reg(vcpu, id, val);
580 *val = get_reg_val(id, kvmppc_get_dar(vcpu));
583 *val = get_reg_val(id, kvmppc_get_dsisr(vcpu));
587 *val = get_reg_val(id, VCPU_FPR(vcpu, i));
590 *val = get_reg_val(id, vcpu->arch.fp.fpscr);
596 val->vsxval[0] = vcpu->arch.fp.fpr[i][0];
597 val->vsxval[1] = vcpu->arch.fp.fpr[i][1];
608 if (!vcpu->arch.icp && !vcpu->arch.xive_vcpu) {
613 *val = get_reg_val(id, kvmppc_xive_get_icp(vcpu));
615 *val = get_reg_val(id, kvmppc_xics_get_icp(vcpu));
620 if (!vcpu->arch.xive_vcpu) {
625 r = kvmppc_xive_native_get_vp(vcpu, val);
631 *val = get_reg_val(id, vcpu->arch.fscr);
634 *val = get_reg_val(id, vcpu->arch.tar);
637 *val = get_reg_val(id, vcpu->arch.ebbhr);
640 *val = get_reg_val(id, vcpu->arch.ebbrr);
643 *val = get_reg_val(id, vcpu->arch.bescr);
646 *val = get_reg_val(id, vcpu->arch.ic);
657 int kvmppc_set_one_reg(struct kvm_vcpu *vcpu, u64 id,
663 r = vcpu->kvm->arch.kvm_ops->set_one_reg(vcpu, id, val);
668 kvmppc_set_dar(vcpu, set_reg_val(id, *val));
671 kvmppc_set_dsisr(vcpu, set_reg_val(id, *val));
675 VCPU_FPR(vcpu, i) = set_reg_val(id, *val);
678 vcpu->arch.fp.fpscr = set_reg_val(id, *val);
684 vcpu->arch.fp.fpr[i][0] = val->vsxval[0];
685 vcpu->arch.fp.fpr[i][1] = val->vsxval[1];
693 if (!vcpu->arch.icp && !vcpu->arch.xive_vcpu) {
698 r = kvmppc_xive_set_icp(vcpu, set_reg_val(id, *val));
700 r = kvmppc_xics_set_icp(vcpu, set_reg_val(id, *val));
705 if (!vcpu->arch.xive_vcpu) {
710 r = kvmppc_xive_native_set_vp(vcpu, val);
716 vcpu->arch.fscr = set_reg_val(id, *val);
719 vcpu->arch.tar = set_reg_val(id, *val);
722 vcpu->arch.ebbhr = set_reg_val(id, *val);
725 vcpu->arch.ebbrr = set_reg_val(id, *val);
728 vcpu->arch.bescr = set_reg_val(id, *val);
731 vcpu->arch.ic = set_reg_val(id, *val);
742 void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
744 vcpu->kvm->arch.kvm_ops->vcpu_load(vcpu, cpu);
747 void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu)
749 vcpu->kvm->arch.kvm_ops->vcpu_put(vcpu);
752 void kvmppc_set_msr(struct kvm_vcpu *vcpu, u64 msr)
754 vcpu->kvm->arch.kvm_ops->set_msr(vcpu, msr);
758 int kvmppc_vcpu_run(struct kvm_vcpu *vcpu)
760 return vcpu->kvm->arch.kvm_ops->vcpu_run(vcpu);
763 int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
769 int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
772 vcpu_load(vcpu);
773 vcpu->guest_debug = dbg->control;
774 vcpu_put(vcpu);
778 void kvmppc_decrementer_func(struct kvm_vcpu *vcpu)
780 kvmppc_core_queue_dec(vcpu);
781 kvm_vcpu_kick(vcpu);
784 int kvmppc_core_vcpu_create(struct kvm_vcpu *vcpu)
786 return vcpu->kvm->arch.kvm_ops->vcpu_create(vcpu);
789 void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu)
791 vcpu->kvm->arch.kvm_ops->vcpu_free(vcpu);
794 int kvmppc_core_check_requests(struct kvm_vcpu *vcpu)
796 return vcpu->kvm->arch.kvm_ops->check_requests(vcpu);
894 int kvmppc_h_logical_ci_load(struct kvm_vcpu *vcpu)
896 unsigned long size = kvmppc_get_gpr(vcpu, 4);
897 unsigned long addr = kvmppc_get_gpr(vcpu, 5);
905 srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
906 ret = kvm_io_bus_read(vcpu, KVM_MMIO_BUS, addr, size, &buf);
907 srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx);
913 kvmppc_set_gpr(vcpu, 4, *(u8 *)&buf);
917 kvmppc_set_gpr(vcpu, 4, be16_to_cpu(*(__be16 *)&buf));
921 kvmppc_set_gpr(vcpu, 4, be32_to_cpu(*(__be32 *)&buf));
925 kvmppc_set_gpr(vcpu, 4, be64_to_cpu(*(__be64 *)&buf));
936 int kvmppc_h_logical_ci_store(struct kvm_vcpu *vcpu)
938 unsigned long size = kvmppc_get_gpr(vcpu, 4);
939 unsigned long addr = kvmppc_get_gpr(vcpu, 5);
940 unsigned long val = kvmppc_get_gpr(vcpu, 6);
966 srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
967 ret = kvm_io_bus_write(vcpu, KVM_MMIO_BUS, addr, size, &buf);
968 srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx);