s390/comments: unify copyright messages and remove file names
[pandora-kernel.git] / arch / s390 / kvm / kvm-s390.c
index 217ce44..c552d1f 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * s390host.c --  hosting zSeries kernel virtual machines
+ * hosting zSeries kernel virtual machines
  *
- * Copyright IBM Corp. 2008,2009
+ * Copyright IBM Corp. 2008, 2009
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License (version 2 only)
@@ -28,6 +28,7 @@
 #include <asm/pgtable.h>
 #include <asm/nmi.h>
 #include <asm/switch_to.h>
+#include <asm/sclp.h>
 #include "kvm-s390.h"
 #include "gaccess.h"
 
@@ -74,6 +75,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
        { "instruction_sigp_restart", VCPU_STAT(instruction_sigp_restart) },
        { "diagnose_10", VCPU_STAT(diagnose_10) },
        { "diagnose_44", VCPU_STAT(diagnose_44) },
+       { "diagnose_9c", VCPU_STAT(diagnose_9c) },
        { NULL }
 };
 
@@ -133,8 +135,16 @@ int kvm_dev_ioctl_check_extension(long ext)
        case KVM_CAP_S390_UCONTROL:
 #endif
        case KVM_CAP_SYNC_REGS:
+       case KVM_CAP_ONE_REG:
                r = 1;
                break;
+       case KVM_CAP_NR_VCPUS:
+       case KVM_CAP_MAX_VCPUS:
+               r = KVM_MAX_VCPUS;
+               break;
+       case KVM_CAP_S390_COW:
+               r = sclp_get_fac85() & 0x2;
+               break;
        default:
                r = 0;
        }
@@ -423,6 +433,71 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
        return 0;
 }
 
+int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu)
+{
+       /* kvm common code refers to this, but never calls it */
+       BUG();
+       return 0;
+}
+
+static int kvm_arch_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu,
+                                          struct kvm_one_reg *reg)
+{
+       int r = -EINVAL;
+
+       switch (reg->id) {
+       case KVM_REG_S390_TODPR:
+               r = put_user(vcpu->arch.sie_block->todpr,
+                            (u32 __user *)reg->addr);
+               break;
+       case KVM_REG_S390_EPOCHDIFF:
+               r = put_user(vcpu->arch.sie_block->epoch,
+                            (u64 __user *)reg->addr);
+               break;
+       case KVM_REG_S390_CPU_TIMER:
+               r = put_user(vcpu->arch.sie_block->cputm,
+                            (u64 __user *)reg->addr);
+               break;
+       case KVM_REG_S390_CLOCK_COMP:
+               r = put_user(vcpu->arch.sie_block->ckc,
+                            (u64 __user *)reg->addr);
+               break;
+       default:
+               break;
+       }
+
+       return r;
+}
+
+static int kvm_arch_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu,
+                                          struct kvm_one_reg *reg)
+{
+       int r = -EINVAL;
+
+       switch (reg->id) {
+       case KVM_REG_S390_TODPR:
+               r = get_user(vcpu->arch.sie_block->todpr,
+                            (u32 __user *)reg->addr);
+               break;
+       case KVM_REG_S390_EPOCHDIFF:
+               r = get_user(vcpu->arch.sie_block->epoch,
+                            (u64 __user *)reg->addr);
+               break;
+       case KVM_REG_S390_CPU_TIMER:
+               r = get_user(vcpu->arch.sie_block->cputm,
+                            (u64 __user *)reg->addr);
+               break;
+       case KVM_REG_S390_CLOCK_COMP:
+               r = get_user(vcpu->arch.sie_block->ckc,
+                            (u64 __user *)reg->addr);
+               break;
+       default:
+               break;
+       }
+
+       return r;
+}
+
 static int kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu)
 {
        kvm_s390_vcpu_initial_reset(vcpu);
@@ -753,6 +828,18 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
        case KVM_S390_INITIAL_RESET:
                r = kvm_arch_vcpu_ioctl_initial_reset(vcpu);
                break;
+       case KVM_SET_ONE_REG:
+       case KVM_GET_ONE_REG: {
+               struct kvm_one_reg reg;
+               r = -EFAULT;
+               if (copy_from_user(&reg, argp, sizeof(reg)))
+                       break;
+               if (ioctl == KVM_SET_ONE_REG)
+                       r = kvm_arch_vcpu_ioctl_set_one_reg(vcpu, &reg);
+               else
+                       r = kvm_arch_vcpu_ioctl_get_one_reg(vcpu, &reg);
+               break;
+       }
 #ifdef CONFIG_KVM_S390_UCONTROL
        case KVM_S390_UCAS_MAP: {
                struct kvm_s390_ucas_mapping ucasmap;