static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu, struct kvm_enable_cap *cap) { int r; if (cap->flags) return -EINVAL; switch (cap->cap) { case KVM_CAP_PPC_OSI: r = 0; vcpu->arch.osi_enabled = true; break; case KVM_CAP_PPC_PAPR: r = 0; vcpu->arch.papr_enabled = true; break; default: r = -EINVAL; break; } if (!r) r = kvmppc_sanity_check(vcpu); return r; }
/* Initial guest state: 16MB mapping 0 -> 0, PC = 0, MSR = 0, R1 = 16MB */ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) { int i; int r; vcpu->arch.pc = 0; vcpu->arch.shared->msr = 0; vcpu->arch.shadow_msr = MSR_USER | MSR_DE | MSR_IS | MSR_DS; vcpu->arch.shared->pir = vcpu->vcpu_id; kvmppc_set_gpr(vcpu, 1, (16<<20) - 8); /* -8 for the callee-save LR slot */ vcpu->arch.shadow_pid = 1; /* Eye-catching numbers so we know if the guest takes an interrupt * before it's programmed its own IVPR/IVORs. */ vcpu->arch.ivpr = 0x55550000; for (i = 0; i < BOOKE_IRQPRIO_MAX; i++) vcpu->arch.ivor[i] = 0x7700 | i * 4; kvmppc_init_timing_stats(vcpu); r = kvmppc_core_vcpu_setup(vcpu); kvmppc_sanity_check(vcpu); return r; }
static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu, struct kvm_enable_cap *cap) { int r; if (cap->flags) return -EINVAL; switch (cap->cap) { case KVM_CAP_PPC_OSI: r = 0; vcpu->arch.osi_enabled = true; break; case KVM_CAP_PPC_PAPR: r = 0; vcpu->arch.papr_enabled = true; break; case KVM_CAP_PPC_EPR: r = 0; vcpu->arch.epr_enabled = cap->args[0]; break; #ifdef CONFIG_BOOKE case KVM_CAP_PPC_BOOKE_WATCHDOG: r = 0; vcpu->arch.watchdog_enabled = true; break; #endif #if defined(CONFIG_KVM_E500V2) || defined(CONFIG_KVM_E500MC) case KVM_CAP_SW_TLB: { struct kvm_config_tlb cfg; void __user *user_ptr = (void __user *)(uintptr_t)cap->args[0]; r = -EFAULT; if (copy_from_user(&cfg, user_ptr, sizeof(cfg))) break; r = kvm_vcpu_ioctl_config_tlb(vcpu, &cfg); break; } #endif default: r = -EINVAL; break; } if (!r) r = kvmppc_sanity_check(vcpu); return r; }
static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu, struct kvm_enable_cap *cap) { int r; if (cap->flags) return -EINVAL; switch (cap->cap) { case KVM_CAP_PPC_OSI: r = 0; vcpu->arch.osi_enabled = true; break; case KVM_CAP_PPC_PAPR: r = 0; vcpu->arch.papr_enabled = true; break; case KVM_CAP_PPC_EPR: r = 0; if (cap->args[0]) vcpu->arch.epr_flags |= KVMPPC_EPR_USER; else vcpu->arch.epr_flags &= ~KVMPPC_EPR_USER; break; #ifdef CONFIG_BOOKE case KVM_CAP_PPC_BOOKE_WATCHDOG: r = 0; vcpu->arch.watchdog_enabled = true; break; #endif #if defined(CONFIG_KVM_E500V2) || defined(CONFIG_KVM_E500MC) case KVM_CAP_SW_TLB: { struct kvm_config_tlb cfg; void __user *user_ptr = (void __user *)(uintptr_t)cap->args[0]; r = -EFAULT; if (copy_from_user(&cfg, user_ptr, sizeof(cfg))) break; r = kvm_vcpu_ioctl_config_tlb(vcpu, &cfg); break; } #endif #ifdef CONFIG_KVM_MPIC case KVM_CAP_IRQ_MPIC: { struct fd f; struct kvm_device *dev; r = -EBADF; f = fdget(cap->args[0]); if (!f.file) break; r = -EPERM; dev = kvm_device_from_filp(f.file); if (dev) r = kvmppc_mpic_connect_vcpu(dev, vcpu, cap->args[1]); fdput(f); break; } #endif #ifdef CONFIG_KVM_XICS case KVM_CAP_IRQ_XICS: { struct fd f; struct kvm_device *dev; r = -EBADF; f = fdget(cap->args[0]); if (!f.file) break; r = -EPERM; dev = kvm_device_from_filp(f.file); if (dev) r = kvmppc_xics_connect_vcpu(dev, vcpu, cap->args[1]); fdput(f); break; } #endif /* CONFIG_KVM_XICS */ default: r = -EINVAL; break; } if (!r) r = kvmppc_sanity_check(vcpu); return r; }