KVM: s390: ucontrol: export SIE control block to user
authorCarsten Otte <cotte@de.ibm.com>
Wed, 4 Jan 2012 09:25:23 +0000 (10:25 +0100)
committerAvi Kivity <avi@redhat.com>
Mon, 5 Mar 2012 12:52:19 +0000 (14:52 +0200)
This patch exports the s390 SIE hardware control block to userspace
via the mapping of the vcpu file descriptor. In order to do so,
a new arch callback named kvm_arch_vcpu_fault  is introduced for all
architectures. It allows to map architecture specific pages.

Signed-off-by: Carsten Otte <cotte@de.ibm.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Documentation/virtual/kvm/api.txt
arch/ia64/kvm/kvm-ia64.c
arch/powerpc/kvm/powerpc.c
arch/s390/kvm/kvm-s390.c
arch/x86/kvm/x86.c
include/linux/kvm.h
include/linux/kvm_host.h
virt/kvm/kvm_main.c

index 6e53ff51422f7f0fb8ea3282b04779adbddc175e..5ebf47d99e56378cf29c65f2e2df98093f265d4b 100644 (file)
@@ -218,6 +218,11 @@ allocation of vcpu ids.  For example, if userspace wants
 single-threaded guest vcpus, it should make all vcpu ids be a multiple
 of the number of vcpus per vcore.
 
+For virtual cpus that have been created with S390 user controlled virtual
+machines, the resulting vcpu fd can be memory mapped at page offset
+KVM_S390_SIE_PAGE_OFFSET in order to obtain a memory map of the virtual
+cpu's hardware control block.
+
 4.8 KVM_GET_DIRTY_LOG (vm ioctl)
 
 Capability: basic
index df6b14194051461212bd4dd3287e7af45b43b856..8ca7261e7b3daf8e81a82603bd538bc40ef66727 100644 (file)
@@ -1566,6 +1566,11 @@ out:
        return r;
 }
 
+int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
+{
+       return VM_FAULT_SIGBUS;
+}
+
 int kvm_arch_prepare_memory_region(struct kvm *kvm,
                struct kvm_memory_slot *memslot,
                struct kvm_memory_slot old,
index 83f2445698747c79d8389449c1cb9951c4c9d6cd..a5671616af8689721129047ced3570ee35f9cbf3 100644 (file)
@@ -659,6 +659,11 @@ out:
        return r;
 }
 
+int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
+{
+       return VM_FAULT_SIGBUS;
+}
+
 static int kvm_vm_ioctl_get_pvinfo(struct kvm_ppc_pvinfo *pvinfo)
 {
        u32 inst_lis = 0x3c000000;
index af05328aca25b557cbe2a0629e2677ff94036968..d6bc65aeb9506f27cbe5a4dd20d5109ee271cddb 100644 (file)
@@ -763,6 +763,19 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
        return r;
 }
 
+int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
+{
+#ifdef CONFIG_KVM_S390_UCONTROL
+       if ((vmf->pgoff == KVM_S390_SIE_PAGE_OFFSET)
+                && (kvm_is_ucontrol(vcpu->kvm))) {
+               vmf->page = virt_to_page(vcpu->arch.sie_block);
+               get_page(vmf->page);
+               return 0;
+       }
+#endif
+       return VM_FAULT_SIGBUS;
+}
+
 /* Section: memory related */
 int kvm_arch_prepare_memory_region(struct kvm *kvm,
                                   struct kvm_memory_slot *memslot,
index 06925b4bcc272b87308b770ee8e831bd16db41f7..a3ce196d21fe6fe02743cd9f45d74c3f361583b0 100644 (file)
@@ -2814,6 +2814,11 @@ out:
        return r;
 }
 
+int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
+{
+       return VM_FAULT_SIGBUS;
+}
+
 static int kvm_vm_ioctl_set_tss_addr(struct kvm *kvm, unsigned long addr)
 {
        int ret;
index 7f686f6708b0cb5cc1a1edf9593b208dcf5f672b..8f888df206a28a1569934e50b64af0cc77e48672 100644 (file)
@@ -440,6 +440,8 @@ struct kvm_ppc_pvinfo {
 /* machine type bits, to be used as argument to KVM_CREATE_VM */
 #define KVM_VM_S390_UCONTROL   1
 
+#define KVM_S390_SIE_PAGE_OFFSET 1
+
 /*
  * ioctls for /dev/kvm fds:
  */
index 82375e145e6409b755d240c0e6554ee873196fda..d4d4d7092110f5886aa379e1cc69bd1cc75436db 100644 (file)
@@ -450,6 +450,7 @@ long kvm_arch_dev_ioctl(struct file *filp,
                        unsigned int ioctl, unsigned long arg);
 long kvm_arch_vcpu_ioctl(struct file *filp,
                         unsigned int ioctl, unsigned long arg);
+int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf);
 
 int kvm_dev_ioctl_check_extension(long ext);
 
index 32e3b048a6cf29be9fe5f2e60da9763a23fffb25..64be836f3348bebc959442c801371c2c2f64a42c 100644 (file)
@@ -1657,7 +1657,7 @@ static int kvm_vcpu_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
                page = virt_to_page(vcpu->kvm->coalesced_mmio_ring);
 #endif
        else
-               return VM_FAULT_SIGBUS;
+               return kvm_arch_vcpu_fault(vcpu, vmf);
        get_page(page);
        vmf->page = page;
        return 0;