Merge branch 'tip/perf/jump-label-2' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / arch / s390 / kvm / kvm-s390.c
index ae37058..985d825 100644 (file)
@@ -207,6 +207,7 @@ out_nokvm:
 void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
 {
        VCPU_EVENT(vcpu, 3, "%s", "free cpu");
+       clear_bit(63 - vcpu->vcpu_id, (unsigned long *) &vcpu->kvm->arch.sca->mcn);
        if (vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda ==
                (__u64) vcpu->arch.sie_block)
                vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda = 0;
@@ -296,7 +297,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
 {
        atomic_set(&vcpu->arch.sie_block->cpuflags, CPUSTAT_ZARCH);
        set_bit(KVM_REQ_MMU_RELOAD, &vcpu->requests);
-       vcpu->arch.sie_block->ecb   = 2;
+       vcpu->arch.sie_block->ecb   = 6;
        vcpu->arch.sie_block->eca   = 0xC1002001U;
        vcpu->arch.sie_block->fac   = (int) (long) facilities;
        hrtimer_init(&vcpu->arch.ckc_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
@@ -329,6 +330,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
                kvm->arch.sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
        vcpu->arch.sie_block->scaoh = (__u32)(((__u64)kvm->arch.sca) >> 32);
        vcpu->arch.sie_block->scaol = (__u32)(__u64)kvm->arch.sca;
+       set_bit(63 - id, (unsigned long *) &kvm->arch.sca->mcn);
 
        spin_lock_init(&vcpu->arch.local_int.lock);
        INIT_LIST_HEAD(&vcpu->arch.local_int.list);
@@ -363,63 +365,49 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
 
 static int kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu)
 {
-       vcpu_load(vcpu);
        kvm_s390_vcpu_initial_reset(vcpu);
-       vcpu_put(vcpu);
        return 0;
 }
 
 int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
 {
-       vcpu_load(vcpu);
        memcpy(&vcpu->arch.guest_gprs, &regs->gprs, sizeof(regs->gprs));
-       vcpu_put(vcpu);
        return 0;
 }
 
 int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
 {
-       vcpu_load(vcpu);
        memcpy(&regs->gprs, &vcpu->arch.guest_gprs, sizeof(regs->gprs));
-       vcpu_put(vcpu);
        return 0;
 }
 
 int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
                                  struct kvm_sregs *sregs)
 {
-       vcpu_load(vcpu);
        memcpy(&vcpu->arch.guest_acrs, &sregs->acrs, sizeof(sregs->acrs));
        memcpy(&vcpu->arch.sie_block->gcr, &sregs->crs, sizeof(sregs->crs));
-       vcpu_put(vcpu);
        return 0;
 }
 
 int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
                                  struct kvm_sregs *sregs)
 {
-       vcpu_load(vcpu);
        memcpy(&sregs->acrs, &vcpu->arch.guest_acrs, sizeof(sregs->acrs));
        memcpy(&sregs->crs, &vcpu->arch.sie_block->gcr, sizeof(sregs->crs));
-       vcpu_put(vcpu);
        return 0;
 }
 
 int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
 {
-       vcpu_load(vcpu);
        memcpy(&vcpu->arch.guest_fpregs.fprs, &fpu->fprs, sizeof(fpu->fprs));
        vcpu->arch.guest_fpregs.fpc = fpu->fpc;
-       vcpu_put(vcpu);
        return 0;
 }
 
 int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
 {
-       vcpu_load(vcpu);
        memcpy(&fpu->fprs, &vcpu->arch.guest_fpregs.fprs, sizeof(fpu->fprs));
        fpu->fpc = vcpu->arch.guest_fpregs.fpc;
-       vcpu_put(vcpu);
        return 0;
 }
 
@@ -427,14 +415,12 @@ static int kvm_arch_vcpu_ioctl_set_initial_psw(struct kvm_vcpu *vcpu, psw_t psw)
 {
        int rc = 0;
 
-       vcpu_load(vcpu);
        if (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_RUNNING)
                rc = -EBUSY;
        else {
                vcpu->run->psw_mask = psw.mask;
                vcpu->run->psw_addr = psw.addr;
        }
-       vcpu_put(vcpu);
        return rc;
 }
 
@@ -498,8 +484,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
        int rc;
        sigset_t sigsaved;
 
-       vcpu_load(vcpu);
-
 rerun_vcpu:
        if (vcpu->requests)
                if (test_and_clear_bit(KVM_REQ_MMU_RELOAD, &vcpu->requests))
@@ -568,8 +552,6 @@ rerun_vcpu:
        if (vcpu->sigset_active)
                sigprocmask(SIG_SETMASK, &sigsaved, NULL);
 
-       vcpu_put(vcpu);
-
        vcpu->stat.exit_userspace++;
        return rc;
 }
@@ -589,7 +571,7 @@ static int __guestcopy(struct kvm_vcpu *vcpu, u64 guestdest, const void *from,
  * KVM_S390_STORE_STATUS_NOADDR: -> 0x1200 on 64 bit
  * KVM_S390_STORE_STATUS_PREFIXED: -> prefix
  */
-int __kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)
+int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)
 {
        const unsigned char archmode = 1;
        int prefix;
@@ -651,45 +633,42 @@ int __kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)
        return 0;
 }
 
-static int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)
-{
-       int rc;
-
-       vcpu_load(vcpu);
-       rc = __kvm_s390_vcpu_store_status(vcpu, addr);
-       vcpu_put(vcpu);
-       return rc;
-}
-
 long kvm_arch_vcpu_ioctl(struct file *filp,
                         unsigned int ioctl, unsigned long arg)
 {
        struct kvm_vcpu *vcpu = filp->private_data;
        void __user *argp = (void __user *)arg;
+       long r;
 
        switch (ioctl) {
        case KVM_S390_INTERRUPT: {
                struct kvm_s390_interrupt s390int;
 
+               r = -EFAULT;
                if (copy_from_user(&s390int, argp, sizeof(s390int)))
-                       return -EFAULT;
-               return kvm_s390_inject_vcpu(vcpu, &s390int);
+                       break;
+               r = kvm_s390_inject_vcpu(vcpu, &s390int);
+               break;
        }
        case KVM_S390_STORE_STATUS:
-               return kvm_s390_vcpu_store_status(vcpu, arg);
+               r = kvm_s390_vcpu_store_status(vcpu, arg);
+               break;
        case KVM_S390_SET_INITIAL_PSW: {
                psw_t psw;
 
+               r = -EFAULT;
                if (copy_from_user(&psw, argp, sizeof(psw)))
-                       return -EFAULT;
-               return kvm_arch_vcpu_ioctl_set_initial_psw(vcpu, psw);
+                       break;
+               r = kvm_arch_vcpu_ioctl_set_initial_psw(vcpu, psw);
+               break;
        }
        case KVM_S390_INITIAL_RESET:
-               return kvm_arch_vcpu_ioctl_initial_reset(vcpu);
+               r = kvm_arch_vcpu_ioctl_initial_reset(vcpu);
+               break;
        default:
-               ;
+               r = -EINVAL;
        }
-       return -EINVAL;
+       return r;
 }
 
 /* Section: memory related */
@@ -744,11 +723,6 @@ void kvm_arch_flush_shadow(struct kvm *kvm)
 {
 }
 
-gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn)
-{
-       return gfn;
-}
-
 static int __init kvm_s390_init(void)
 {
        int ret;
@@ -766,8 +740,8 @@ static int __init kvm_s390_init(void)
                kvm_exit();
                return -ENOMEM;
        }
-       stfle(facilities, 1);
-       facilities[0] &= 0xff00fff3f0700000ULL;
+       memcpy(facilities, S390_lowcore.stfle_fac_list, 16);
+       facilities[0] &= 0xff00fff3f47c0000ULL;
        return 0;
 }