Lines Matching +full:cpu +full:- +full:crit

1 // SPDX-License-Identifier: GPL-2.0-only
7 * Kevin Wolf <mail@kevin-wolf.de>
101 if (is_kvmppc_hv_enabled(vcpu->kvm)) in kvmppc_update_int_pending()
113 bool crit; in kvmppc_critical_section() local
115 if (is_kvmppc_hv_enabled(vcpu->kvm)) in kvmppc_critical_section()
121 /* Truncate crit indicators in 32 bit mode */ in kvmppc_critical_section()
127 /* Critical section when crit == r1 */ in kvmppc_critical_section()
128 crit = (crit_raw == crit_r1); in kvmppc_critical_section()
130 crit = crit && !(kvmppc_get_msr(vcpu) & MSR_PR); in kvmppc_critical_section()
132 return crit; in kvmppc_critical_section()
137 vcpu->kvm->arch.kvm_ops->inject_interrupt(vcpu, vec, flags); in kvmppc_inject_interrupt()
170 unsigned long old_pending = vcpu->arch.pending_exceptions; in kvmppc_book3s_dequeue_irqprio()
173 &vcpu->arch.pending_exceptions); in kvmppc_book3s_dequeue_irqprio()
175 kvmppc_update_int_pending(vcpu, vcpu->arch.pending_exceptions, in kvmppc_book3s_dequeue_irqprio()
181 vcpu->stat.queue_intr++; in kvmppc_book3s_queue_irqprio()
184 &vcpu->arch.pending_exceptions); in kvmppc_book3s_queue_irqprio()
237 return test_bit(BOOK3S_IRQPRIO_DECREMENTER, &vcpu->arch.pending_exceptions); in kvmppc_core_pending_dec()
270 if (irq->irq == KVM_INTERRUPT_SET) in kvmppc_core_queue_external()
271 vcpu->arch.external_oneshot = 1; in kvmppc_core_queue_external()
301 bool crit = kvmppc_critical_section(vcpu); in kvmppc_book3s_irqprio_deliver() local
305 deliver = (kvmppc_get_msr(vcpu) & MSR_EE) && !crit; in kvmppc_book3s_irqprio_deliver()
309 deliver = (kvmppc_get_msr(vcpu) & MSR_EE) && !crit; in kvmppc_book3s_irqprio_deliver()
388 if (vcpu->arch.external_oneshot) { in clear_irqprio()
389 vcpu->arch.external_oneshot = 0; in clear_irqprio()
400 unsigned long *pending = &vcpu->arch.pending_exceptions; in kvmppc_core_prepare_to_enter()
401 unsigned long old_pending = vcpu->arch.pending_exceptions; in kvmppc_core_prepare_to_enter()
405 if (vcpu->arch.pending_exceptions) in kvmppc_core_prepare_to_enter()
406 printk(KERN_EMERG "KVM: Check pending: %lx\n", vcpu->arch.pending_exceptions); in kvmppc_core_prepare_to_enter()
412 clear_bit(priority, &vcpu->arch.pending_exceptions); in kvmppc_core_prepare_to_enter()
431 ulong mp_pa = vcpu->arch.magic_page_pa & KVM_PAM; in kvmppc_gpa_to_pfn()
440 ulong shared_page = ((ulong)vcpu->arch.shared) & PAGE_MASK; in kvmppc_gpa_to_pfn()
450 return gfn_to_pfn_prot(vcpu->kvm, gfn, writing, writable); in kvmppc_gpa_to_pfn()
463 r = vcpu->arch.mmu.xlate(vcpu, eaddr, pte, data, iswrite); in kvmppc_xlate()
465 pte->eaddr = eaddr; in kvmppc_xlate()
466 pte->raddr = eaddr & KVM_PAM; in kvmppc_xlate()
467 pte->vpage = VSID_REAL | eaddr >> 12; in kvmppc_xlate()
468 pte->may_read = true; in kvmppc_xlate()
469 pte->may_write = true; in kvmppc_xlate()
470 pte->may_execute = true; in kvmppc_xlate()
475 if ((vcpu->arch.hflags & BOOK3S_HFLAG_SPLIT_HACK) && in kvmppc_xlate()
477 pte->raddr &= ~SPLIT_HACK_MASK; in kvmppc_xlate()
487 * as used in HEIR, vcpu->arch.last_inst and vcpu->arch.emul_inst.
488 * Like vcpu->arch.last_inst but unlike vcpu->arch.emul_inst, each
489 * half of the value needs byte-swapping if the guest endianness is
500 pc -= 4; in kvmppc_load_last_inst()
538 ret = vcpu->kvm->arch.kvm_ops->get_sregs(vcpu, sregs); in kvm_arch_vcpu_ioctl_get_sregs()
550 ret = vcpu->kvm->arch.kvm_ops->set_sregs(vcpu, sregs); in kvm_arch_vcpu_ioctl_set_sregs()
560 regs->pc = kvmppc_get_pc(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
561 regs->cr = kvmppc_get_cr(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
562 regs->ctr = kvmppc_get_ctr(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
563 regs->lr = kvmppc_get_lr(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
564 regs->xer = kvmppc_get_xer(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
565 regs->msr = kvmppc_get_msr(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
566 regs->srr0 = kvmppc_get_srr0(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
567 regs->srr1 = kvmppc_get_srr1(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
568 regs->pid = vcpu->arch.pid; in kvm_arch_vcpu_ioctl_get_regs()
569 regs->sprg0 = kvmppc_get_sprg0(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
570 regs->sprg1 = kvmppc_get_sprg1(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
571 regs->sprg2 = kvmppc_get_sprg2(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
572 regs->sprg3 = kvmppc_get_sprg3(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
573 regs->sprg4 = kvmppc_get_sprg4(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
574 regs->sprg5 = kvmppc_get_sprg5(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
575 regs->sprg6 = kvmppc_get_sprg6(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
576 regs->sprg7 = kvmppc_get_sprg7(vcpu); in kvm_arch_vcpu_ioctl_get_regs()
578 for (i = 0; i < ARRAY_SIZE(regs->gpr); i++) in kvm_arch_vcpu_ioctl_get_regs()
579 regs->gpr[i] = kvmppc_get_gpr(vcpu, i); in kvm_arch_vcpu_ioctl_get_regs()
588 kvmppc_set_pc(vcpu, regs->pc); in kvm_arch_vcpu_ioctl_set_regs()
589 kvmppc_set_cr(vcpu, regs->cr); in kvm_arch_vcpu_ioctl_set_regs()
590 kvmppc_set_ctr(vcpu, regs->ctr); in kvm_arch_vcpu_ioctl_set_regs()
591 kvmppc_set_lr(vcpu, regs->lr); in kvm_arch_vcpu_ioctl_set_regs()
592 kvmppc_set_xer(vcpu, regs->xer); in kvm_arch_vcpu_ioctl_set_regs()
593 kvmppc_set_msr(vcpu, regs->msr); in kvm_arch_vcpu_ioctl_set_regs()
594 kvmppc_set_srr0(vcpu, regs->srr0); in kvm_arch_vcpu_ioctl_set_regs()
595 kvmppc_set_srr1(vcpu, regs->srr1); in kvm_arch_vcpu_ioctl_set_regs()
596 kvmppc_set_sprg0(vcpu, regs->sprg0); in kvm_arch_vcpu_ioctl_set_regs()
597 kvmppc_set_sprg1(vcpu, regs->sprg1); in kvm_arch_vcpu_ioctl_set_regs()
598 kvmppc_set_sprg2(vcpu, regs->sprg2); in kvm_arch_vcpu_ioctl_set_regs()
599 kvmppc_set_sprg3(vcpu, regs->sprg3); in kvm_arch_vcpu_ioctl_set_regs()
600 kvmppc_set_sprg4(vcpu, regs->sprg4); in kvm_arch_vcpu_ioctl_set_regs()
601 kvmppc_set_sprg5(vcpu, regs->sprg5); in kvm_arch_vcpu_ioctl_set_regs()
602 kvmppc_set_sprg6(vcpu, regs->sprg6); in kvm_arch_vcpu_ioctl_set_regs()
603 kvmppc_set_sprg7(vcpu, regs->sprg7); in kvm_arch_vcpu_ioctl_set_regs()
605 for (i = 0; i < ARRAY_SIZE(regs->gpr); i++) in kvm_arch_vcpu_ioctl_set_regs()
606 kvmppc_set_gpr(vcpu, i, regs->gpr[i]); in kvm_arch_vcpu_ioctl_set_regs()
613 return -EOPNOTSUPP; in kvm_arch_vcpu_ioctl_get_fpu()
618 return -EOPNOTSUPP; in kvm_arch_vcpu_ioctl_set_fpu()
627 r = vcpu->kvm->arch.kvm_ops->get_one_reg(vcpu, id, val); in kvmppc_get_one_reg()
628 if (r == -EINVAL) { in kvmppc_get_one_reg()
638 i = id - KVM_REG_PPC_FPR0; in kvmppc_get_one_reg()
642 *val = get_reg_val(id, vcpu->arch.fp.fpscr); in kvmppc_get_one_reg()
647 i = id - KVM_REG_PPC_VSR0; in kvmppc_get_one_reg()
648 val->vsxval[0] = vcpu->arch.fp.fpr[i][0]; in kvmppc_get_one_reg()
649 val->vsxval[1] = vcpu->arch.fp.fpr[i][1]; in kvmppc_get_one_reg()
651 r = -ENXIO; in kvmppc_get_one_reg()
660 if (!vcpu->arch.icp && !vcpu->arch.xive_vcpu) { in kvmppc_get_one_reg()
661 r = -ENXIO; in kvmppc_get_one_reg()
672 if (!vcpu->arch.xive_vcpu) { in kvmppc_get_one_reg()
673 r = -ENXIO; in kvmppc_get_one_reg()
679 r = -ENXIO; in kvmppc_get_one_reg()
683 *val = get_reg_val(id, vcpu->arch.fscr); in kvmppc_get_one_reg()
686 *val = get_reg_val(id, vcpu->arch.tar); in kvmppc_get_one_reg()
689 *val = get_reg_val(id, vcpu->arch.ebbhr); in kvmppc_get_one_reg()
692 *val = get_reg_val(id, vcpu->arch.ebbrr); in kvmppc_get_one_reg()
695 *val = get_reg_val(id, vcpu->arch.bescr); in kvmppc_get_one_reg()
698 *val = get_reg_val(id, vcpu->arch.ic); in kvmppc_get_one_reg()
701 r = -EINVAL; in kvmppc_get_one_reg()
715 r = vcpu->kvm->arch.kvm_ops->set_one_reg(vcpu, id, val); in kvmppc_set_one_reg()
716 if (r == -EINVAL) { in kvmppc_set_one_reg()
726 i = id - KVM_REG_PPC_FPR0; in kvmppc_set_one_reg()
730 vcpu->arch.fp.fpscr = set_reg_val(id, *val); in kvmppc_set_one_reg()
735 i = id - KVM_REG_PPC_VSR0; in kvmppc_set_one_reg()
736 vcpu->arch.fp.fpr[i][0] = val->vsxval[0]; in kvmppc_set_one_reg()
737 vcpu->arch.fp.fpr[i][1] = val->vsxval[1]; in kvmppc_set_one_reg()
739 r = -ENXIO; in kvmppc_set_one_reg()
745 if (!vcpu->arch.icp && !vcpu->arch.xive_vcpu) { in kvmppc_set_one_reg()
746 r = -ENXIO; in kvmppc_set_one_reg()
757 if (!vcpu->arch.xive_vcpu) { in kvmppc_set_one_reg()
758 r = -ENXIO; in kvmppc_set_one_reg()
764 r = -ENXIO; in kvmppc_set_one_reg()
768 vcpu->arch.fscr = set_reg_val(id, *val); in kvmppc_set_one_reg()
771 vcpu->arch.tar = set_reg_val(id, *val); in kvmppc_set_one_reg()
774 vcpu->arch.ebbhr = set_reg_val(id, *val); in kvmppc_set_one_reg()
777 vcpu->arch.ebbrr = set_reg_val(id, *val); in kvmppc_set_one_reg()
780 vcpu->arch.bescr = set_reg_val(id, *val); in kvmppc_set_one_reg()
783 vcpu->arch.ic = set_reg_val(id, *val); in kvmppc_set_one_reg()
786 r = -EINVAL; in kvmppc_set_one_reg()
794 void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) in kvmppc_core_vcpu_load() argument
796 vcpu->kvm->arch.kvm_ops->vcpu_load(vcpu, cpu); in kvmppc_core_vcpu_load()
801 vcpu->kvm->arch.kvm_ops->vcpu_put(vcpu); in kvmppc_core_vcpu_put()
806 vcpu->kvm->arch.kvm_ops->set_msr(vcpu, msr); in kvmppc_set_msr()
812 return vcpu->kvm->arch.kvm_ops->vcpu_run(vcpu); in kvmppc_vcpu_run()
825 vcpu->guest_debug = dbg->control; in kvm_arch_vcpu_ioctl_set_guest_debug()
838 return vcpu->kvm->arch.kvm_ops->vcpu_create(vcpu); in kvmppc_core_vcpu_create()
843 vcpu->kvm->arch.kvm_ops->vcpu_free(vcpu); in kvmppc_core_vcpu_free()
848 return vcpu->kvm->arch.kvm_ops->check_requests(vcpu); in kvmppc_core_check_requests()
858 return kvm->arch.kvm_ops->get_dirty_log(kvm, log); in kvm_vm_ioctl_get_dirty_log()
863 kvm->arch.kvm_ops->free_memslot(slot); in kvmppc_core_free_memslot()
868 kvm->arch.kvm_ops->flush_memslot(kvm, memslot); in kvmppc_core_flush_memslot()
876 return kvm->arch.kvm_ops->prepare_memory_region(kvm, old, new, change); in kvmppc_core_prepare_memory_region()
884 kvm->arch.kvm_ops->commit_memory_region(kvm, old, new, change); in kvmppc_core_commit_memory_region()
889 return kvm->arch.kvm_ops->unmap_gfn_range(kvm, range); in kvm_unmap_gfn_range()
894 return kvm->arch.kvm_ops->age_gfn(kvm, range); in kvm_age_gfn()
899 return kvm->arch.kvm_ops->test_age_gfn(kvm, range); in kvm_test_age_gfn()
904 return kvm->arch.kvm_ops->set_spte_gfn(kvm, range); in kvm_set_spte_gfn()
911 INIT_LIST_HEAD_RCU(&kvm->arch.spapr_tce_tables); in kvmppc_core_init_vm()
912 INIT_LIST_HEAD(&kvm->arch.rtas_tokens); in kvmppc_core_init_vm()
913 mutex_init(&kvm->arch.rtas_token_lock); in kvmppc_core_init_vm()
916 return kvm->arch.kvm_ops->init_vm(kvm); in kvmppc_core_init_vm()
921 kvm->arch.kvm_ops->destroy_vm(kvm); in kvmppc_core_destroy_vm()
925 WARN_ON(!list_empty(&kvm->arch.spapr_tce_tables)); in kvmppc_core_destroy_vm()
933 kfree(kvm->arch.xive_devices.native); in kvmppc_core_destroy_vm()
934 kvm->arch.xive_devices.native = NULL; in kvmppc_core_destroy_vm()
935 kfree(kvm->arch.xive_devices.xics_on_xive); in kvmppc_core_destroy_vm()
936 kvm->arch.xive_devices.xics_on_xive = NULL; in kvmppc_core_destroy_vm()
937 kfree(kvm->arch.xics_device); in kvmppc_core_destroy_vm()
938 kvm->arch.xics_device = NULL; in kvmppc_core_destroy_vm()
953 srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); in kvmppc_h_logical_ci_load()
955 srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx); in kvmppc_h_logical_ci_load()
1014 srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); in kvmppc_h_logical_ci_store()
1016 srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx); in kvmppc_h_logical_ci_store()
1026 return kvm->arch.kvm_ops->hcall_implemented(hcall); in kvmppc_book3s_hcall_implemented()
1045 return kvm_set_irq(kvm, irq_source_id, irq_entry->gsi, in kvm_arch_set_irq_inatomic()
1052 return kvm_set_irq(kvm, irq_source_id, e->gsi, level, line_status); in kvmppc_book3s_set_irq()
1058 entries->gsi = gsi; in kvm_irq_map_gsi()
1059 entries->type = KVM_IRQ_ROUTING_IRQCHIP; in kvm_irq_map_gsi()
1060 entries->set = kvmppc_book3s_set_irq; in kvm_irq_map_gsi()
1061 entries->irqchip.irqchip = 0; in kvm_irq_map_gsi()
1062 entries->irqchip.pin = gsi; in kvm_irq_map_gsi()