/* * Thread-safe guest to host memory mapping * * Copyright 2012 Red Hat, Inc. and/or its affiliates * * Authors: * Stefan Hajnoczi * * This work is licensed under the terms of the GNU GPL, version 2 or later. * See the COPYING file in the top-level directory. * */ #ifndef HOSTMEM_H #define HOSTMEM_H #include "exec/memory.h" #include "qemu/thread.h" typedef struct { void *host_addr; hwaddr guest_addr; uint64_t size; bool readonly; } HostMemRegion; typedef struct { /* The listener is invoked when regions change and a new list of regions is * built up completely before they are installed. */ MemoryListener listener; HostMemRegion *new_regions; size_t num_new_regions; /* Current regions are accessed from multiple threads either to lookup * addresses or to install a new list of regions. The lock protects the * pointer and the regions. */ QemuMutex current_regions_lock; HostMemRegion *current_regions; size_t num_current_regions; } HostMem; void hostmem_init(HostMem *hostmem); void hostmem_finalize(HostMem *hostmem); /** * Map a guest physical address to a pointer * * Note that there is map/unmap mechanism here. The caller must ensure that * mapped memory is no longer used across events like hot memory unplug. This * can be done with other mechanisms like bdrv_drain_all() that quiesce * in-flight I/O. */ void *hostmem_lookup(HostMem *hostmem, hwaddr phys, hwaddr len, bool is_write); #endif /* HOSTMEM_H */