19 #include <linux/export.h>
20 #include <linux/slab.h>
23 #include <asm/cputable.h>
24 #include <asm/cacheflush.h>
25 #include <asm/tlbflush.h>
26 #include <asm/uaccess.h>
30 #include <asm/mmu_context.h>
33 #include <linux/sched.h>
39 #define VCPU_STAT(x) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU
48 {
"inst_emu",
VCPU_STAT(emulated_inst_exits) },
50 {
"ext_intr",
VCPU_STAT(ext_intr_exits) },
52 {
"halt_wakeup",
VCPU_STAT(halt_wakeup) },
74 vcpu->
arch.shared->srr0 = kvmppc_get_pc(vcpu);
76 kvmppc_set_pc(vcpu, kvmppc_interrupt_offset(vcpu) + vec);
77 vcpu->
arch.mmu.reset_msr(vcpu);
80 static int kvmppc_book3s_vec2irqprio(
unsigned int vec)
107 static void kvmppc_book3s_dequeue_irqprio(
struct kvm_vcpu *vcpu,
110 unsigned long old_pending = vcpu->
arch.pending_exceptions;
112 clear_bit(kvmppc_book3s_vec2irqprio(vec),
113 &vcpu->
arch.pending_exceptions);
115 kvmppc_update_int_pending(vcpu, vcpu->
arch.pending_exceptions,
121 vcpu->
stat.queue_intr++;
123 set_bit(kvmppc_book3s_vec2irqprio(vec),
124 &vcpu->
arch.pending_exceptions);
174 bool crit = kvmppc_critical_section(vcpu);
178 deliver = (vcpu->
arch.shared->msr &
MSR_EE) && !crit;
183 deliver = (vcpu->
arch.shared->msr &
MSR_EE) && !crit;
263 unsigned long *pending = &vcpu->
arch.pending_exceptions;
264 unsigned long old_pending = vcpu->
arch.pending_exceptions;
268 if (vcpu->
arch.pending_exceptions)
271 priority =
__ffs(*pending);
274 clear_irqprio(vcpu, priority)) {
285 kvmppc_update_int_pending(vcpu, *pending, old_pending);
294 if (!(vcpu->
arch.shared->msr & MSR_SF))
315 int relocated = (vcpu->
arch.shared->msr & (data ? MSR_DR : MSR_IR));
319 r = vcpu->
arch.mmu.xlate(vcpu, eaddr, pte, data);
333 static hva_t kvmppc_bad_hva(
void)
350 if (kvm_is_error_hva(hpage))
355 return kvmppc_bad_hva();
365 if (kvmppc_xlate(vcpu, *eaddr, data, &pte))
387 if (kvmppc_xlate(vcpu, *eaddr, data, &pte))
392 hva = kvmppc_pte_to_hva(vcpu, &pte,
true);
393 if (kvm_is_error_hva(hva))
418 regs->
pc = kvmppc_get_pc(vcpu);
419 regs->
cr = kvmppc_get_cr(vcpu);
420 regs->
ctr = kvmppc_get_ctr(vcpu);
421 regs->
lr = kvmppc_get_lr(vcpu);
422 regs->
xer = kvmppc_get_xer(vcpu);
423 regs->
msr = vcpu->
arch.shared->msr;
424 regs->
srr0 = vcpu->
arch.shared->srr0;
425 regs->
srr1 = vcpu->
arch.shared->srr1;
437 regs->
gpr[i] = kvmppc_get_gpr(vcpu, i);
446 kvmppc_set_pc(vcpu, regs->
pc);
447 kvmppc_set_cr(vcpu, regs->
cr);
448 kvmppc_set_ctr(vcpu, regs->
ctr);
449 kvmppc_set_lr(vcpu, regs->
lr);
450 kvmppc_set_xer(vcpu, regs->
xer);
452 vcpu->
arch.shared->srr0 = regs->
srr0;
453 vcpu->
arch.shared->srr1 = regs->
srr1;
464 kvmppc_set_gpr(vcpu, i, regs->
gpr[i]);