Statistics
| Branch: | Revision:

root / cpu-common.h @ 44459349

History | View | Annotate | Download (4.8 kB)

1 1ad2134f Paul Brook
#ifndef CPU_COMMON_H
2 1ad2134f Paul Brook
#define CPU_COMMON_H 1
3 1ad2134f Paul Brook
4 1ad2134f Paul Brook
/* CPU interfaces that are target indpendent.  */
5 1ad2134f Paul Brook
6 1ad2134f Paul Brook
#if defined(__arm__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__)
7 1ad2134f Paul Brook
#define WORDS_ALIGNED
8 1ad2134f Paul Brook
#endif
9 1ad2134f Paul Brook
10 1ad2134f Paul Brook
#include "bswap.h"
11 f6f3fbca Michael S. Tsirkin
#include "qemu-queue.h"
12 1ad2134f Paul Brook
13 b3755a91 Paul Brook
#if !defined(CONFIG_USER_ONLY)
14 b3755a91 Paul Brook
15 1ad2134f Paul Brook
/* address in the RAM (different from a physical address) */
16 c227f099 Anthony Liguori
typedef unsigned long ram_addr_t;
17 1ad2134f Paul Brook
18 1ad2134f Paul Brook
/* memory API */
19 1ad2134f Paul Brook
20 c227f099 Anthony Liguori
typedef void CPUWriteMemoryFunc(void *opaque, target_phys_addr_t addr, uint32_t value);
21 c227f099 Anthony Liguori
typedef uint32_t CPUReadMemoryFunc(void *opaque, target_phys_addr_t addr);
22 1ad2134f Paul Brook
23 c227f099 Anthony Liguori
void cpu_register_physical_memory_offset(target_phys_addr_t start_addr,
24 c227f099 Anthony Liguori
                                         ram_addr_t size,
25 c227f099 Anthony Liguori
                                         ram_addr_t phys_offset,
26 c227f099 Anthony Liguori
                                         ram_addr_t region_offset);
27 c227f099 Anthony Liguori
static inline void cpu_register_physical_memory(target_phys_addr_t start_addr,
28 c227f099 Anthony Liguori
                                                ram_addr_t size,
29 c227f099 Anthony Liguori
                                                ram_addr_t phys_offset)
30 1ad2134f Paul Brook
{
31 1ad2134f Paul Brook
    cpu_register_physical_memory_offset(start_addr, size, phys_offset, 0);
32 1ad2134f Paul Brook
}
33 1ad2134f Paul Brook
34 c227f099 Anthony Liguori
ram_addr_t cpu_get_physical_page_desc(target_phys_addr_t addr);
35 c227f099 Anthony Liguori
ram_addr_t qemu_ram_alloc(ram_addr_t);
36 c227f099 Anthony Liguori
void qemu_ram_free(ram_addr_t addr);
37 1ad2134f Paul Brook
/* This should only be used for ram local to a device.  */
38 c227f099 Anthony Liguori
void *qemu_get_ram_ptr(ram_addr_t addr);
39 1ad2134f Paul Brook
/* This should not be used by devices.  */
40 c227f099 Anthony Liguori
ram_addr_t qemu_ram_addr_from_host(void *ptr);
41 1ad2134f Paul Brook
42 d60efc6b Blue Swirl
int cpu_register_io_memory(CPUReadMemoryFunc * const *mem_read,
43 d60efc6b Blue Swirl
                           CPUWriteMemoryFunc * const *mem_write,
44 1ad2134f Paul Brook
                           void *opaque);
45 1ad2134f Paul Brook
void cpu_unregister_io_memory(int table_address);
46 1ad2134f Paul Brook
47 c227f099 Anthony Liguori
void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
48 1ad2134f Paul Brook
                            int len, int is_write);
49 c227f099 Anthony Liguori
static inline void cpu_physical_memory_read(target_phys_addr_t addr,
50 1ad2134f Paul Brook
                                            uint8_t *buf, int len)
51 1ad2134f Paul Brook
{
52 1ad2134f Paul Brook
    cpu_physical_memory_rw(addr, buf, len, 0);
53 1ad2134f Paul Brook
}
54 c227f099 Anthony Liguori
static inline void cpu_physical_memory_write(target_phys_addr_t addr,
55 1ad2134f Paul Brook
                                             const uint8_t *buf, int len)
56 1ad2134f Paul Brook
{
57 1ad2134f Paul Brook
    cpu_physical_memory_rw(addr, (uint8_t *)buf, len, 1);
58 1ad2134f Paul Brook
}
59 c227f099 Anthony Liguori
void *cpu_physical_memory_map(target_phys_addr_t addr,
60 c227f099 Anthony Liguori
                              target_phys_addr_t *plen,
61 1ad2134f Paul Brook
                              int is_write);
62 c227f099 Anthony Liguori
void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len,
63 c227f099 Anthony Liguori
                               int is_write, target_phys_addr_t access_len);
64 1ad2134f Paul Brook
void *cpu_register_map_client(void *opaque, void (*callback)(void *opaque));
65 1ad2134f Paul Brook
void cpu_unregister_map_client(void *cookie);
66 1ad2134f Paul Brook
67 f6f3fbca Michael S. Tsirkin
struct CPUPhysMemoryClient;
68 f6f3fbca Michael S. Tsirkin
typedef struct CPUPhysMemoryClient CPUPhysMemoryClient;
69 f6f3fbca Michael S. Tsirkin
struct CPUPhysMemoryClient {
70 f6f3fbca Michael S. Tsirkin
    void (*set_memory)(struct CPUPhysMemoryClient *client,
71 f6f3fbca Michael S. Tsirkin
                       target_phys_addr_t start_addr,
72 f6f3fbca Michael S. Tsirkin
                       ram_addr_t size,
73 f6f3fbca Michael S. Tsirkin
                       ram_addr_t phys_offset);
74 f6f3fbca Michael S. Tsirkin
    int (*sync_dirty_bitmap)(struct CPUPhysMemoryClient *client,
75 f6f3fbca Michael S. Tsirkin
                             target_phys_addr_t start_addr,
76 f6f3fbca Michael S. Tsirkin
                             target_phys_addr_t end_addr);
77 f6f3fbca Michael S. Tsirkin
    int (*migration_log)(struct CPUPhysMemoryClient *client,
78 f6f3fbca Michael S. Tsirkin
                         int enable);
79 f6f3fbca Michael S. Tsirkin
    QLIST_ENTRY(CPUPhysMemoryClient) list;
80 f6f3fbca Michael S. Tsirkin
};
81 f6f3fbca Michael S. Tsirkin
82 f6f3fbca Michael S. Tsirkin
void cpu_register_phys_memory_client(CPUPhysMemoryClient *);
83 f6f3fbca Michael S. Tsirkin
void cpu_unregister_phys_memory_client(CPUPhysMemoryClient *);
84 f6f3fbca Michael S. Tsirkin
85 6842a08e Blue Swirl
/* Coalesced MMIO regions are areas where write operations can be reordered.
86 6842a08e Blue Swirl
 * This usually implies that write operations are side-effect free.  This allows
87 6842a08e Blue Swirl
 * batching which can make a major impact on performance when using
88 6842a08e Blue Swirl
 * virtualization.
89 6842a08e Blue Swirl
 */
90 6842a08e Blue Swirl
void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
91 6842a08e Blue Swirl
92 6842a08e Blue Swirl
void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
93 6842a08e Blue Swirl
94 6842a08e Blue Swirl
void qemu_flush_coalesced_mmio_buffer(void);
95 6842a08e Blue Swirl
96 c227f099 Anthony Liguori
uint32_t ldub_phys(target_phys_addr_t addr);
97 c227f099 Anthony Liguori
uint32_t lduw_phys(target_phys_addr_t addr);
98 c227f099 Anthony Liguori
uint32_t ldl_phys(target_phys_addr_t addr);
99 c227f099 Anthony Liguori
uint64_t ldq_phys(target_phys_addr_t addr);
100 c227f099 Anthony Liguori
void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val);
101 c227f099 Anthony Liguori
void stq_phys_notdirty(target_phys_addr_t addr, uint64_t val);
102 c227f099 Anthony Liguori
void stb_phys(target_phys_addr_t addr, uint32_t val);
103 c227f099 Anthony Liguori
void stw_phys(target_phys_addr_t addr, uint32_t val);
104 c227f099 Anthony Liguori
void stl_phys(target_phys_addr_t addr, uint32_t val);
105 c227f099 Anthony Liguori
void stq_phys(target_phys_addr_t addr, uint64_t val);
106 c227f099 Anthony Liguori
107 c227f099 Anthony Liguori
void cpu_physical_memory_write_rom(target_phys_addr_t addr,
108 1ad2134f Paul Brook
                                   const uint8_t *buf, int len);
109 1ad2134f Paul Brook
110 1ad2134f Paul Brook
#define IO_MEM_SHIFT       3
111 1ad2134f Paul Brook
112 1ad2134f Paul Brook
#define IO_MEM_RAM         (0 << IO_MEM_SHIFT) /* hardcoded offset */
113 1ad2134f Paul Brook
#define IO_MEM_ROM         (1 << IO_MEM_SHIFT) /* hardcoded offset */
114 1ad2134f Paul Brook
#define IO_MEM_UNASSIGNED  (2 << IO_MEM_SHIFT)
115 1ad2134f Paul Brook
#define IO_MEM_NOTDIRTY    (3 << IO_MEM_SHIFT)
116 1ad2134f Paul Brook
117 1ad2134f Paul Brook
/* Acts like a ROM when read and like a device when written.  */
118 1ad2134f Paul Brook
#define IO_MEM_ROMD        (1)
119 1ad2134f Paul Brook
#define IO_MEM_SUBPAGE     (2)
120 1ad2134f Paul Brook
#define IO_MEM_SUBWIDTH    (4)
121 1ad2134f Paul Brook
122 b3755a91 Paul Brook
#endif
123 b3755a91 Paul Brook
124 1ad2134f Paul Brook
#endif /* !CPU_COMMON_H */