1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#ifndef CPU_ALL_H
20#define CPU_ALL_H
21
22#include "qemu-common.h"
23#include "exec/cpu-common.h"
24#include "exec/memory.h"
25#include "qemu/thread.h"
26#include "qom/cpu.h"
27#include "qemu/rcu.h"
28
29#define EXCP_INTERRUPT 0x10000
30#define EXCP_HLT 0x10001
31#define EXCP_DEBUG 0x10002
32#define EXCP_HALTED 0x10003
33#define EXCP_YIELD 0x10004
34
35
36
37
38
39
40
41
42
43#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
44#define BSWAP_NEEDED
45#endif
46
47#ifdef BSWAP_NEEDED
48
49static inline uint16_t tswap16(uint16_t s)
50{
51 return bswap16(s);
52}
53
54static inline uint32_t tswap32(uint32_t s)
55{
56 return bswap32(s);
57}
58
59static inline uint64_t tswap64(uint64_t s)
60{
61 return bswap64(s);
62}
63
64static inline void tswap16s(uint16_t *s)
65{
66 *s = bswap16(*s);
67}
68
69static inline void tswap32s(uint32_t *s)
70{
71 *s = bswap32(*s);
72}
73
74static inline void tswap64s(uint64_t *s)
75{
76 *s = bswap64(*s);
77}
78
79#else
80
81static inline uint16_t tswap16(uint16_t s)
82{
83 return s;
84}
85
86static inline uint32_t tswap32(uint32_t s)
87{
88 return s;
89}
90
91static inline uint64_t tswap64(uint64_t s)
92{
93 return s;
94}
95
96static inline void tswap16s(uint16_t *s)
97{
98}
99
100static inline void tswap32s(uint32_t *s)
101{
102}
103
104static inline void tswap64s(uint64_t *s)
105{
106}
107
108#endif
109
110#if TARGET_LONG_SIZE == 4
111#define tswapl(s) tswap32(s)
112#define tswapls(s) tswap32s((uint32_t *)(s))
113#define bswaptls(s) bswap32s(s)
114#else
115#define tswapl(s) tswap64(s)
116#define tswapls(s) tswap64s((uint64_t *)(s))
117#define bswaptls(s) bswap64s(s)
118#endif
119
120
121
122
123#if defined(TARGET_WORDS_BIGENDIAN)
124#define lduw_p(p) lduw_be_p(p)
125#define ldsw_p(p) ldsw_be_p(p)
126#define ldl_p(p) ldl_be_p(p)
127#define ldq_p(p) ldq_be_p(p)
128#define ldfl_p(p) ldfl_be_p(p)
129#define ldfq_p(p) ldfq_be_p(p)
130#define stw_p(p, v) stw_be_p(p, v)
131#define stl_p(p, v) stl_be_p(p, v)
132#define stq_p(p, v) stq_be_p(p, v)
133#define stfl_p(p, v) stfl_be_p(p, v)
134#define stfq_p(p, v) stfq_be_p(p, v)
135#else
136#define lduw_p(p) lduw_le_p(p)
137#define ldsw_p(p) ldsw_le_p(p)
138#define ldl_p(p) ldl_le_p(p)
139#define ldq_p(p) ldq_le_p(p)
140#define ldfl_p(p) ldfl_le_p(p)
141#define ldfq_p(p) ldfq_le_p(p)
142#define stw_p(p, v) stw_le_p(p, v)
143#define stl_p(p, v) stl_le_p(p, v)
144#define stq_p(p, v) stq_le_p(p, v)
145#define stfl_p(p, v) stfl_le_p(p, v)
146#define stfq_p(p, v) stfq_le_p(p, v)
147#endif
148
149
150
151#if defined(CONFIG_USER_ONLY)
152#include "exec/user/abitypes.h"
153
154
155
156
157extern unsigned long guest_base;
158extern int have_guest_base;
159extern unsigned long reserved_va;
160
161#define GUEST_ADDR_MAX (reserved_va ? reserved_va : \
162 (1ul << TARGET_VIRT_ADDR_SPACE_BITS) - 1)
163#else
164
165#include "exec/hwaddr.h"
166uint32_t lduw_phys(AddressSpace *as, hwaddr addr);
167uint32_t ldl_phys(AddressSpace *as, hwaddr addr);
168uint64_t ldq_phys(AddressSpace *as, hwaddr addr);
169void stl_phys_notdirty(AddressSpace *as, hwaddr addr, uint32_t val);
170void stw_phys(AddressSpace *as, hwaddr addr, uint32_t val);
171void stl_phys(AddressSpace *as, hwaddr addr, uint32_t val);
172void stq_phys(AddressSpace *as, hwaddr addr, uint64_t val);
173
174uint32_t address_space_lduw(AddressSpace *as, hwaddr addr,
175 MemTxAttrs attrs, MemTxResult *result);
176uint32_t address_space_ldl(AddressSpace *as, hwaddr addr,
177 MemTxAttrs attrs, MemTxResult *result);
178uint64_t address_space_ldq(AddressSpace *as, hwaddr addr,
179 MemTxAttrs attrs, MemTxResult *result);
180void address_space_stl_notdirty(AddressSpace *as, hwaddr addr, uint32_t val,
181 MemTxAttrs attrs, MemTxResult *result);
182void address_space_stw(AddressSpace *as, hwaddr addr, uint32_t val,
183 MemTxAttrs attrs, MemTxResult *result);
184void address_space_stl(AddressSpace *as, hwaddr addr, uint32_t val,
185 MemTxAttrs attrs, MemTxResult *result);
186void address_space_stq(AddressSpace *as, hwaddr addr, uint64_t val,
187 MemTxAttrs attrs, MemTxResult *result);
188#endif
189
190
191
192#define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS)
193#define TARGET_PAGE_MASK ~(TARGET_PAGE_SIZE - 1)
194#define TARGET_PAGE_ALIGN(addr) (((addr) + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK)
195
196
197
198
199extern uintptr_t qemu_real_host_page_size;
200extern intptr_t qemu_real_host_page_mask;
201extern uintptr_t qemu_host_page_size;
202extern intptr_t qemu_host_page_mask;
203
204#define HOST_PAGE_ALIGN(addr) (((addr) + qemu_host_page_size - 1) & qemu_host_page_mask)
205#define REAL_HOST_PAGE_ALIGN(addr) (((addr) + qemu_real_host_page_size - 1) & \
206 qemu_real_host_page_mask)
207
208
209#define PAGE_READ 0x0001
210#define PAGE_WRITE 0x0002
211#define PAGE_EXEC 0x0004
212#define PAGE_BITS (PAGE_READ | PAGE_WRITE | PAGE_EXEC)
213#define PAGE_VALID 0x0008
214
215
216#define PAGE_WRITE_ORG 0x0010
217#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
218
219#define PAGE_RESERVED 0x0020
220#endif
221
222#if defined(CONFIG_USER_ONLY)
223void page_dump(FILE *f);
224
225typedef int (*walk_memory_regions_fn)(void *, target_ulong,
226 target_ulong, unsigned long);
227int walk_memory_regions(void *, walk_memory_regions_fn);
228
229int page_get_flags(target_ulong address);
230void page_set_flags(target_ulong start, target_ulong end, int flags);
231int page_check_range(target_ulong start, target_ulong len, int flags);
232#endif
233
234CPUArchState *cpu_copy(CPUArchState *env);
235
236
237
238
239
240
241
242
243
244
245#define CPU_INTERRUPT_HARD 0x0002
246
247
248
249#define CPU_INTERRUPT_EXITTB 0x0004
250
251
252#define CPU_INTERRUPT_HALT 0x0020
253
254
255#define CPU_INTERRUPT_DEBUG 0x0080
256
257
258#define CPU_INTERRUPT_RESET 0x0400
259
260
261
262#define CPU_INTERRUPT_TGT_EXT_0 0x0008
263#define CPU_INTERRUPT_TGT_EXT_1 0x0010
264#define CPU_INTERRUPT_TGT_EXT_2 0x0040
265#define CPU_INTERRUPT_TGT_EXT_3 0x0200
266#define CPU_INTERRUPT_TGT_EXT_4 0x1000
267
268
269
270
271
272
273#define CPU_INTERRUPT_TGT_INT_0 0x0100
274#define CPU_INTERRUPT_TGT_INT_1 0x0800
275#define CPU_INTERRUPT_TGT_INT_2 0x2000
276
277
278
279
280#define CPU_INTERRUPT_SSTEP_MASK \
281 (CPU_INTERRUPT_HARD \
282 | CPU_INTERRUPT_TGT_EXT_0 \
283 | CPU_INTERRUPT_TGT_EXT_1 \
284 | CPU_INTERRUPT_TGT_EXT_2 \
285 | CPU_INTERRUPT_TGT_EXT_3 \
286 | CPU_INTERRUPT_TGT_EXT_4)
287
288#if !defined(CONFIG_USER_ONLY)
289
290
291
292
293
294
295
296#define TLB_INVALID_MASK (1 << (TARGET_PAGE_BITS - 1))
297
298
299#define TLB_NOTDIRTY (1 << (TARGET_PAGE_BITS - 2))
300
301#define TLB_MMIO (1 << (TARGET_PAGE_BITS - 3))
302
303
304
305
306#define TLB_FLAGS_MASK (TLB_INVALID_MASK | TLB_NOTDIRTY | TLB_MMIO)
307
308void dump_exec_info(FILE *f, fprintf_function cpu_fprintf);
309void dump_opcount_info(FILE *f, fprintf_function cpu_fprintf);
310#endif
311
312int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
313 uint8_t *buf, int len, int is_write);
314
315int cpu_exec(CPUState *cpu);
316
317#endif
318