Ensure that all guest memory is fd-based. Signed-off-by: Fuad Tabba <tabba@xxxxxxxxxx> --- framebuffer.c | 2 ++ hw/vesa.c | 15 +++++++++++++-- include/kvm/framebuffer.h | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/framebuffer.c b/framebuffer.c index fb8f51d..a025293 100644 --- a/framebuffer.c +++ b/framebuffer.c @@ -73,6 +73,8 @@ int fb__exit(struct kvm *kvm) fb->targets[i]->stop(fb); munmap(fb->mem, fb->mem_size); + if (fb->mem_fd >= 0) + close(fb->mem_fd); } return 0; diff --git a/hw/vesa.c b/hw/vesa.c index 7f82cdb..522ffa3 100644 --- a/hw/vesa.c +++ b/hw/vesa.c @@ -41,6 +41,7 @@ static struct framebuffer vesafb = { .depth = VESA_BPP, .mem_addr = VESA_MEM_ADDR, .mem_size = VESA_MEM_SIZE, + .mem_fd = -1, }; static void vesa_pci_io(struct kvm_cpu *vcpu, u64 addr, u8 *data, u32 len, @@ -66,6 +67,7 @@ struct framebuffer *vesa__init(struct kvm *kvm) { u16 vesa_base_addr; char *mem; + int mem_fd; int r; BUILD_BUG_ON(!is_power_of_two(VESA_MEM_SIZE)); @@ -88,22 +90,31 @@ struct framebuffer *vesa__init(struct kvm *kvm) if (r < 0) goto unregister_ioport; - mem = mmap(NULL, VESA_MEM_SIZE, PROT_RW, MAP_ANON_NORESERVE, -1, 0); - if (mem == MAP_FAILED) { + mem_fd = memfd_alloc(ARM_PVTIME_SIZE, false, 0, 0); + if (mem_fd < 0) { r = -errno; goto unregister_device; } + mem = mmap(NULL, VESA_MEM_SIZE, PROT_RW, MAP_PRIVATE, mem_fd, 0); + if (mem == MAP_FAILED) { + r = -errno; + goto close_memfd; + } + r = kvm__register_dev_mem(kvm, VESA_MEM_ADDR, VESA_MEM_SIZE, mem); if (r < 0) goto unmap_dev; vesafb.mem = mem; + vesafb.mem_fd = mem_fd; vesafb.kvm = kvm; return fb__register(&vesafb); unmap_dev: munmap(mem, VESA_MEM_SIZE); +close_memfd: + close(mem_fd); unregister_device: device__unregister(&vesa_device); unregister_ioport: diff --git a/include/kvm/framebuffer.h b/include/kvm/framebuffer.h index e3200e5..c340273 100644 --- a/include/kvm/framebuffer.h +++ b/include/kvm/framebuffer.h @@ -22,6 +22,7 @@ struct framebuffer { char *mem; u64 mem_addr; u64 mem_size; + int mem_fd; struct kvm *kvm; unsigned long nr_targets; -- 2.38.1.431.g37b22c650d-goog