linux/virt/kvm/arm
Jia He 97418e968b KVM: arm/arm64: Remove excessive permission check in kvm_arch_prepare_memory_region
In kvm_arch_prepare_memory_region, arm kvm regards the memory region as
writable if the flag has no KVM_MEM_READONLY, and the vm is readonly if
!VM_WRITE.

But there is common usage for setting kvm memory region as follows:
e.g. qemu side (see the PROT_NONE flag)
1. mmap(NULL, size, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
   memory_region_init_ram_ptr()
2. re mmap the above area with read/write authority.

Such example is used in virtio-fs qemu codes which hasn't been upstreamed
[1]. But seems we can't forbid this example.

Without this patch, it will cause an EPERM during kvm_set_memory_region()
and cause qemu boot crash.

As told by Ard, "the underlying assumption is incorrect, i.e., that the
value of vm_flags at this point in time defines how the VMA is used
during its lifetime. There may be other cases where a VMA is created
with VM_READ vm_flags that are changed to VM_READ|VM_WRITE later, and
we are currently rejecting this use case as well."

[1] https://gitlab.com/virtio-fs/qemu/blob/5a356e/hw/virtio/vhost-user-fs.c#L488

Suggested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Jia He <justin.he@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Christoffer Dall <christoffer.dall@arm.com>
Link: https://lore.kernel.org/r/20191206020802.196108-1-justin.he@arm.com
2019-12-06 19:37:48 +00:00
..
hyp KVM: arm: vgic-v3: Mark expected switch fall-through 2019-07-26 15:37:11 +01:00
vgic KVM: arm/arm64: vgic: Use wrapper function to lock/unlock all vcpus in kvm_vgic_create() 2019-12-06 11:41:38 +00:00
aarch32.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 234 2019-06-19 17:09:07 +02:00
arch_timer.c KVM: arm/arm64: Let the timer expire in hardirq context on RT 2019-11-07 16:13:33 +00:00
arm.c KVM: arm/arm64: Get rid of unused arg in cpu_init_hyp_mode() 2019-12-06 11:41:18 +00:00
hypercalls.c KVM: arm64: Support stolen time reporting via shared structure 2019-10-21 19:20:28 +01:00
mmio.c KVM: arm/arm64: Allow reporting non-ISV data aborts to userspace 2019-10-21 18:59:44 +01:00
mmu.c KVM: arm/arm64: Remove excessive permission check in kvm_arch_prepare_memory_region 2019-12-06 19:37:48 +00:00
perf.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 234 2019-06-19 17:09:07 +02:00
pmu.c KVM: arm/arm64: Introduce kvm_pmu_vcpu_init() to setup PMU counter index 2019-07-23 09:23:44 +01:00
psci.c KVM: arm/arm64: Factor out hypercall handling from PSCI code 2019-10-21 19:20:26 +01:00
pvtime.c KVM: arm64: Provide VCPU attributes for stolen time 2019-10-21 19:20:29 +01:00
trace.h KVM: arm/arm64: Fix TRACE_INCLUDE_PATH 2019-02-19 21:05:51 +00:00