Statistics
| Branch: | Revision:

root / include / exec / memory-internal.h @ 0d09e41a

History | View | Annotate | Download (4.1 kB)

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
typedef struct PhysPageEntry PhysPageEntry;
26

    
27
struct PhysPageEntry {
28
    uint16_t is_leaf : 1;
29
     /* index into phys_sections (is_leaf) or phys_map_nodes (!is_leaf) */
30
    uint16_t ptr : 15;
31
};
32

    
33
typedef struct AddressSpaceDispatch AddressSpaceDispatch;
34

    
35
struct AddressSpaceDispatch {
36
    /* This is a multi-level map on the physical address space.
37
     * The bottom level has pointers to MemoryRegionSections.
38
     */
39
    PhysPageEntry phys_map;
40
    MemoryListener listener;
41
};
42

    
43
void address_space_init_dispatch(AddressSpace *as);
44
void address_space_destroy_dispatch(AddressSpace *as);
45

    
46
ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
47
                                   MemoryRegion *mr);
48
ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr);
49
void qemu_ram_free(ram_addr_t addr);
50
void qemu_ram_free_from_ptr(ram_addr_t addr);
51

    
52
struct MemoryRegion;
53
struct MemoryRegionSection;
54

    
55
void qemu_register_coalesced_mmio(hwaddr addr, ram_addr_t size);
56
void qemu_unregister_coalesced_mmio(hwaddr addr, ram_addr_t size);
57

    
58
#define VGA_DIRTY_FLAG       0x01
59
#define CODE_DIRTY_FLAG      0x02
60
#define MIGRATION_DIRTY_FLAG 0x08
61

    
62
static inline int cpu_physical_memory_get_dirty_flags(ram_addr_t addr)
63
{
64
    return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS];
65
}
66

    
67
/* read dirty bit (return 0 or 1) */
68
static inline int cpu_physical_memory_is_dirty(ram_addr_t addr)
69
{
70
    return cpu_physical_memory_get_dirty_flags(addr) == 0xff;
71
}
72

    
73
static inline int cpu_physical_memory_get_dirty(ram_addr_t start,
74
                                                ram_addr_t length,
75
                                                int dirty_flags)
76
{
77
    int ret = 0;
78
    ram_addr_t addr, end;
79

    
80
    end = TARGET_PAGE_ALIGN(start + length);
81
    start &= TARGET_PAGE_MASK;
82
    for (addr = start; addr < end; addr += TARGET_PAGE_SIZE) {
83
        ret |= cpu_physical_memory_get_dirty_flags(addr) & dirty_flags;
84
    }
85
    return ret;
86
}
87

    
88
static inline int cpu_physical_memory_set_dirty_flags(ram_addr_t addr,
89
                                                      int dirty_flags)
90
{
91
    return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] |= dirty_flags;
92
}
93

    
94
static inline void cpu_physical_memory_set_dirty(ram_addr_t addr)
95
{
96
    cpu_physical_memory_set_dirty_flags(addr, 0xff);
97
}
98

    
99
static inline int cpu_physical_memory_clear_dirty_flags(ram_addr_t addr,
100
                                                        int dirty_flags)
101
{
102
    int mask = ~dirty_flags;
103

    
104
    return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] &= mask;
105
}
106

    
107
static inline void cpu_physical_memory_set_dirty_range(ram_addr_t start,
108
                                                       ram_addr_t length,
109
                                                       int dirty_flags)
110
{
111
    ram_addr_t addr, end;
112

    
113
    end = TARGET_PAGE_ALIGN(start + length);
114
    start &= TARGET_PAGE_MASK;
115
    for (addr = start; addr < end; addr += TARGET_PAGE_SIZE) {
116
        cpu_physical_memory_set_dirty_flags(addr, dirty_flags);
117
    }
118
    xen_modified_memory(addr, length);
119
}
120

    
121
static inline void cpu_physical_memory_mask_dirty_range(ram_addr_t start,
122
                                                        ram_addr_t length,
123
                                                        int dirty_flags)
124
{
125
    ram_addr_t addr, end;
126

    
127
    end = TARGET_PAGE_ALIGN(start + length);
128
    start &= TARGET_PAGE_MASK;
129
    for (addr = start; addr < end; addr += TARGET_PAGE_SIZE) {
130
        cpu_physical_memory_clear_dirty_flags(addr, dirty_flags);
131
    }
132
}
133

    
134
void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
135
                                     int dirty_flags);
136

    
137
extern const IORangeOps memory_region_iorange_ops;
138

    
139
#endif
140

    
141
#endif