From: Igor Kotrasinski <i.kotrasi...@partner.samsung.com> This patchset adds a "memory exposing" device that allows two QEMU instances to share arbitrary memory regions. Unlike ivshmem, it does not create a new region of memory that's shared between VMs, but instead allows one VM to access any memory region of the other VM we choose to share.
The motivation for this device is a sort of ARM Trustzone "emulation", where a rich system running on one machine (e.g. x86_64 linux) is able to perform SMCs to a trusted system running on another (e.g. OpTEE on ARM). With a device that allows sharing arbitrary memory between VMs, this can be achieved with minimal changes to the trusted system and its linux driver while allowing the rich system to run on a speedier x86 emulator. I prepared additional patches for linux, OpTEE OS and OpTEE build system as a PoC that such emulation works and passes OpTEE tests; I'm not sure what would be the best way to share them. This patchset is my first foray into QEMU source code and I'm certain it's not yet ready to be merged in. I'm not sure whether memory sharing code has any race conditions or breaks rules of working with memory regions, or if having VMs communicate synchronously via chardevs is the right way to do it. I do believe the basic idea for sharing memory regions is sound and that it could be useful for inter-VM communication. Changes in v2: - Fixed patchew errors. - Rebased on master. Igor Kotrasinski (9): memory: Add function for finding flat memory ranges memory: Support mmap offset for fd-backed memory regions memory: Hack - use shared memory when possible hw/misc/memexpose: Add documentation hw/misc/memexpose: Add core memexpose files hw/misc/memexpose: Add memexpose pci device hw/misc/memexpose: Add memexpose memory region device hw/misc/memexpose: Add simple tests hw/arm/virt: Hack in support for memexpose device Kconfig.host | 3 + MAINTAINERS | 13 + Makefile | 1 + backends/hostmem-memfd.c | 2 +- configure | 8 + docs/specs/memexpose-spec.txt | 168 +++++++++ exec.c | 10 +- hw/arm/virt.c | 110 +++++- hw/core/numa.c | 4 +- hw/mem/Kconfig | 3 + hw/misc/Makefile.objs | 1 + hw/misc/ivshmem.c | 3 +- hw/misc/memexpose/Makefile.objs | 4 + hw/misc/memexpose/memexpose-core.c | 630 ++++++++++++++++++++++++++++++++ hw/misc/memexpose/memexpose-core.h | 109 ++++++ hw/misc/memexpose/memexpose-memregion.c | 142 +++++++ hw/misc/memexpose/memexpose-memregion.h | 41 +++ hw/misc/memexpose/memexpose-msg.c | 261 +++++++++++++ hw/misc/memexpose/memexpose-msg.h | 161 ++++++++ hw/misc/memexpose/memexpose-pci.c | 218 +++++++++++ include/exec/memory.h | 21 ++ include/exec/ram_addr.h | 2 +- include/hw/arm/virt.h | 5 + include/qemu/mmap-alloc.h | 1 + memory.c | 82 ++++- tests/qtest/Makefile.include | 2 + tests/qtest/memexpose-test.c | 364 ++++++++++++++++++ util/mmap-alloc.c | 7 +- util/oslib-posix.c | 2 +- 29 files changed, 2362 insertions(+), 16 deletions(-) create mode 100644 docs/specs/memexpose-spec.txt create mode 100644 hw/misc/memexpose/Makefile.objs create mode 100644 hw/misc/memexpose/memexpose-core.c create mode 100644 hw/misc/memexpose/memexpose-core.h create mode 100644 hw/misc/memexpose/memexpose-memregion.c create mode 100644 hw/misc/memexpose/memexpose-memregion.h create mode 100644 hw/misc/memexpose/memexpose-msg.c create mode 100644 hw/misc/memexpose/memexpose-msg.h create mode 100644 hw/misc/memexpose/memexpose-pci.c create mode 100644 tests/qtest/memexpose-test.c -- 2.7.4