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: Carsten Otte <cotte@de.ibm.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
Родитель
e168bf8de3
Коммит
5b1c1493af
|
@ -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 @@ out:
|
||||||
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 @@ out:
|
||||||
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,
|
||||||
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 @@ out:
|
||||||
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 {
|
||||||
/* 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,
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче