]>
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 { | |
21 | void *host_addr; | |
22 | hwaddr guest_addr; | |
23 | uint64_t size; | |
24 | bool readonly; | |
25 | } HostMemRegion; | |
26 | ||
27 | typedef struct { | |
28 | /* The listener is invoked when regions change and a new list of regions is | |
29 | * built up completely before they are installed. | |
30 | */ | |
31 | MemoryListener listener; | |
32 | HostMemRegion *new_regions; | |
33 | size_t num_new_regions; | |
34 | ||
35 | /* Current regions are accessed from multiple threads either to lookup | |
36 | * addresses or to install a new list of regions. The lock protects the | |
37 | * pointer and the regions. | |
38 | */ | |
39 | QemuMutex current_regions_lock; | |
40 | HostMemRegion *current_regions; | |
41 | size_t num_current_regions; | |
42 | } HostMem; | |
43 | ||
44 | void hostmem_init(HostMem *hostmem); | |
45 | void hostmem_finalize(HostMem *hostmem); | |
46 | ||
47 | /** | |
48 | * Map a guest physical address to a pointer | |
49 | * | |
50 | * Note that there is map/unmap mechanism here. The caller must ensure that | |
51 | * mapped memory is no longer used across events like hot memory unplug. This | |
52 | * can be done with other mechanisms like bdrv_drain_all() that quiesce | |
53 | * in-flight I/O. | |
54 | */ | |
55 | void *hostmem_lookup(HostMem *hostmem, hwaddr phys, hwaddr len, bool is_write); | |
56 | ||
57 | #endif /* HOSTMEM_H */ |