xref: /qemu/include/exec/memory-internal.h (revision 94833c89)
1 /*
2  * Declarations for obsolete exec.c functions
3  *
4  * Copyright 2011 Red Hat, Inc. and/or its affiliates
5  *
6  * Authors:
7  *  Avi Kivity <avi@redhat.com>
8  *
9  * This work is licensed under the terms of the GNU GPL, version 2 or
10  * later.  See the COPYING file in the top-level directory.
11  *
12  */
13 
14 /*
15  * This header is for use by exec.c and memory.c ONLY.  Do not include it.
16  * The functions declared here will be removed soon.
17  */
18 
19 #ifndef MEMORY_INTERNAL_H
20 #define MEMORY_INTERNAL_H
21 
22 #ifndef CONFIG_USER_ONLY
23 #include "hw/xen/xen.h"
24 
25 
26 typedef struct AddressSpaceDispatch AddressSpaceDispatch;
27 
28 void address_space_init_dispatch(AddressSpace *as);
29 void address_space_destroy_dispatch(AddressSpace *as);
30 
31 extern const MemoryRegionOps unassigned_mem_ops;
32 
33 bool memory_region_access_valid(MemoryRegion *mr, hwaddr addr,
34                                 unsigned size, bool is_write);
35 
36 ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
37                                    MemoryRegion *mr);
38 ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr);
39 void *qemu_get_ram_ptr(ram_addr_t addr);
40 void qemu_ram_free(ram_addr_t addr);
41 void qemu_ram_free_from_ptr(ram_addr_t addr);
42 
43 static inline bool cpu_physical_memory_get_dirty(ram_addr_t start,
44                                                  ram_addr_t length,
45                                                  unsigned client)
46 {
47     ram_addr_t addr, end;
48 
49     assert(client < DIRTY_MEMORY_NUM);
50 
51     end = TARGET_PAGE_ALIGN(start + length);
52     start &= TARGET_PAGE_MASK;
53     for (addr = start; addr < end; addr += TARGET_PAGE_SIZE) {
54         if (test_bit(addr >> TARGET_PAGE_BITS,
55                      ram_list.dirty_memory[client])) {
56             return true;
57         }
58     }
59     return false;
60 }
61 
62 static inline bool cpu_physical_memory_get_dirty_flag(ram_addr_t addr,
63                                                       unsigned client)
64 {
65     return cpu_physical_memory_get_dirty(addr, 1, client);
66 }
67 
68 /* read dirty bit (return 0 or 1) */
69 static inline bool cpu_physical_memory_is_dirty(ram_addr_t addr)
70 {
71     bool vga = cpu_physical_memory_get_dirty_flag(addr, DIRTY_MEMORY_VGA);
72     bool code = cpu_physical_memory_get_dirty_flag(addr, DIRTY_MEMORY_CODE);
73     bool migration =
74         cpu_physical_memory_get_dirty_flag(addr, DIRTY_MEMORY_MIGRATION);
75     return vga && code && migration;
76 }
77 
78 static inline void cpu_physical_memory_set_dirty_flag(ram_addr_t addr,
79                                                       unsigned client)
80 {
81     assert(client < DIRTY_MEMORY_NUM);
82     set_bit(addr >> TARGET_PAGE_BITS, ram_list.dirty_memory[client]);
83 }
84 
85 static inline void cpu_physical_memory_set_dirty_range(ram_addr_t start,
86                                                        ram_addr_t length)
87 {
88     ram_addr_t addr, end;
89 
90     end = TARGET_PAGE_ALIGN(start + length);
91     start &= TARGET_PAGE_MASK;
92     for (addr = start; addr < end; addr += TARGET_PAGE_SIZE) {
93         set_bit(addr >> TARGET_PAGE_BITS,
94                 ram_list.dirty_memory[DIRTY_MEMORY_MIGRATION]);
95         set_bit(addr >> TARGET_PAGE_BITS,
96                 ram_list.dirty_memory[DIRTY_MEMORY_VGA]);
97         set_bit(addr >> TARGET_PAGE_BITS,
98                 ram_list.dirty_memory[DIRTY_MEMORY_CODE]);
99     }
100     xen_modified_memory(addr, length);
101 }
102 
103 static inline void cpu_physical_memory_mask_dirty_range(ram_addr_t start,
104                                                         ram_addr_t length,
105                                                         unsigned client)
106 {
107     ram_addr_t addr, end;
108 
109     assert(client < DIRTY_MEMORY_NUM);
110     end = TARGET_PAGE_ALIGN(start + length);
111     start &= TARGET_PAGE_MASK;
112     for (addr = start; addr < end; addr += TARGET_PAGE_SIZE) {
113         clear_bit(addr >> TARGET_PAGE_BITS, ram_list.dirty_memory[client]);
114     }
115 }
116 
117 void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
118                                      unsigned client);
119 
120 #endif
121 
122 #endif
123