]>
Commit | Line | Data |
---|---|---|
185ecf40 SH |
1 | /* |
2 | * Thread-safe guest to host memory mapping | |
3 | * | |
4 | * Copyright 2012 Red Hat, Inc. and/or its affiliates | |
5 | * | |
6 | * Authors: | |
7 | * Stefan Hajnoczi <stefanha@redhat.com> | |
8 | * | |
9 | * This work is licensed under the terms of the GNU GPL, version 2 or later. | |
10 | * See the COPYING file in the top-level directory. | |
11 | * | |
12 | */ | |
13 | ||
14 | #ifndef HOSTMEM_H | |
15 | #define HOSTMEM_H | |
16 | ||
17 | #include "exec/memory.h" | |
18 | #include "qemu/thread.h" | |
19 | ||
20 | typedef struct { | |
dfde4e6e | 21 | MemoryRegion *mr; |
185ecf40 SH |
22 | void *host_addr; |
23 | hwaddr guest_addr; | |
24 | uint64_t size; | |
25 | bool readonly; | |
26 | } HostMemRegion; | |
27 | ||
28 | typedef struct { | |
29 | /* The listener is invoked when regions change and a new list of regions is | |
30 | * built up completely before they are installed. | |
31 | */ | |
32 | MemoryListener listener; | |
33 | HostMemRegion *new_regions; | |
34 | size_t num_new_regions; | |
35 | ||
36 | /* Current regions are accessed from multiple threads either to lookup | |
37 | * addresses or to install a new list of regions. The lock protects the | |
38 | * pointer and the regions. | |
39 | */ | |
40 | QemuMutex current_regions_lock; | |
41 | HostMemRegion *current_regions; | |
42 | size_t num_current_regions; | |
43 | } HostMem; | |
44 | ||
45 | void hostmem_init(HostMem *hostmem); | |
46 | void hostmem_finalize(HostMem *hostmem); | |
47 | ||
48 | /** | |
49 | * Map a guest physical address to a pointer | |
50 | * | |
51 | * Note that there is map/unmap mechanism here. The caller must ensure that | |
52 | * mapped memory is no longer used across events like hot memory unplug. This | |
53 | * can be done with other mechanisms like bdrv_drain_all() that quiesce | |
54 | * in-flight I/O. | |
55 | */ | |
56 | void *hostmem_lookup(HostMem *hostmem, hwaddr phys, hwaddr len, bool is_write); | |
57 | ||
58 | #endif /* HOSTMEM_H */ |