提交 5b1c1493 编写于 作者: C Carsten Otte 提交者: Avi Kivity

KVM: s390: ucontrol: export SIE control block to user

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: NCarsten Otte <cotte@de.ibm.com>
Signed-off-by: NMarcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: NAvi Kivity <avi@redhat.com>
上级 e168bf8d
...@@ -218,6 +218,11 @@ allocation of vcpu ids. For example, if userspace wants ...@@ -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 single-threaded guest vcpus, it should make all vcpu ids be a multiple
of the number of vcpus per vcore. 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) 4.8 KVM_GET_DIRTY_LOG (vm ioctl)
Capability: basic Capability: basic
......
...@@ -1566,6 +1566,11 @@ long kvm_arch_vcpu_ioctl(struct file *filp, ...@@ -1566,6 +1566,11 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
return r; 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, int kvm_arch_prepare_memory_region(struct kvm *kvm,
struct kvm_memory_slot *memslot, struct kvm_memory_slot *memslot,
struct kvm_memory_slot old, struct kvm_memory_slot old,
......
...@@ -659,6 +659,11 @@ long kvm_arch_vcpu_ioctl(struct file *filp, ...@@ -659,6 +659,11 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
return r; 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) static int kvm_vm_ioctl_get_pvinfo(struct kvm_ppc_pvinfo *pvinfo)
{ {
u32 inst_lis = 0x3c000000; u32 inst_lis = 0x3c000000;
......
...@@ -763,6 +763,19 @@ long kvm_arch_vcpu_ioctl(struct file *filp, ...@@ -763,6 +763,19 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
return r; 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 */ /* Section: memory related */
int kvm_arch_prepare_memory_region(struct kvm *kvm, int kvm_arch_prepare_memory_region(struct kvm *kvm,
struct kvm_memory_slot *memslot, struct kvm_memory_slot *memslot,
......
...@@ -2814,6 +2814,11 @@ long kvm_arch_vcpu_ioctl(struct file *filp, ...@@ -2814,6 +2814,11 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
return r; 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) static int kvm_vm_ioctl_set_tss_addr(struct kvm *kvm, unsigned long addr)
{ {
int ret; int ret;
......
...@@ -440,6 +440,8 @@ struct kvm_ppc_pvinfo { ...@@ -440,6 +440,8 @@ struct kvm_ppc_pvinfo {
/* machine type bits, to be used as argument to KVM_CREATE_VM */ /* machine type bits, to be used as argument to KVM_CREATE_VM */
#define KVM_VM_S390_UCONTROL 1 #define KVM_VM_S390_UCONTROL 1
#define KVM_S390_SIE_PAGE_OFFSET 1
/* /*
* ioctls for /dev/kvm fds: * ioctls for /dev/kvm fds:
*/ */
......
...@@ -450,6 +450,7 @@ long kvm_arch_dev_ioctl(struct file *filp, ...@@ -450,6 +450,7 @@ long kvm_arch_dev_ioctl(struct file *filp,
unsigned int ioctl, unsigned long arg); unsigned int ioctl, unsigned long arg);
long kvm_arch_vcpu_ioctl(struct file *filp, long kvm_arch_vcpu_ioctl(struct file *filp,
unsigned int ioctl, unsigned long arg); 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); int kvm_dev_ioctl_check_extension(long ext);
......
...@@ -1657,7 +1657,7 @@ static int kvm_vcpu_fault(struct vm_area_struct *vma, struct vm_fault *vmf) ...@@ -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); page = virt_to_page(vcpu->kvm->coalesced_mmio_ring);
#endif #endif
else else
return VM_FAULT_SIGBUS; return kvm_arch_vcpu_fault(vcpu, vmf);
get_page(page); get_page(page);
vmf->page = page; vmf->page = page;
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册