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#define EXCP_ATOMIC 0x10005
35
36
37
38
39
40
41
42
43
44#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
45#define BSWAP_NEEDED
46#endif
47
48#ifdef BSWAP_NEEDED
49
50static inline uint16_t tswap16(uint16_t s)
51{
52 return bswap16(s);
53}
54
55static inline uint32_t tswap32(uint32_t s)
56{
57 return bswap32(s);
58}
59
60static inline uint64_t tswap64(uint64_t s)
61{
62 return bswap64(s);
63}
64
65static inline void tswap16s(uint16_t *s)
66{
67 *s = bswap16(*s);
68}
69
70static inline void tswap32s(uint32_t *s)
71{
72 *s = bswap32(*s);
73}
74
75static inline void tswap64s(uint64_t *s)
76{
77 *s = bswap64(*s);
78}
79
80#else
81
82static inline uint16_t tswap16(uint16_t s)
83{
84 return s;
85}
86
87static inline uint32_t tswap32(uint32_t s)
88{
89 return s;
90}
91
92static inline uint64_t tswap64(uint64_t s)
93{
94 return s;
95}
96
97static inline void tswap16s(uint16_t *s)
98{
99}
100
101static inline void tswap32s(uint32_t *s)
102{
103}
104
105static inline void tswap64s(uint64_t *s)
106{
107}
108
109#endif
110
111#if TARGET_LONG_SIZE == 4
112#define tswapl(s) tswap32(s)
113#define tswapls(s) tswap32s((uint32_t *)(s))
114#define bswaptls(s) bswap32s(s)
115#else
116#define tswapl(s) tswap64(s)
117#define tswapls(s) tswap64s((uint64_t *)(s))
118#define bswaptls(s) bswap64s(s)
119#endif
120
121
122
123
124#if defined(TARGET_WORDS_BIGENDIAN)
125#define lduw_p(p) lduw_be_p(p)
126#define ldsw_p(p) ldsw_be_p(p)
127#define ldl_p(p) ldl_be_p(p)
128#define ldq_p(p) ldq_be_p(p)
129#define ldfl_p(p) ldfl_be_p(p)
130#define ldfq_p(p) ldfq_be_p(p)
131#define stw_p(p, v) stw_be_p(p, v)
132#define stl_p(p, v) stl_be_p(p, v)
133#define stq_p(p, v) stq_be_p(p, v)
134#define stfl_p(p, v) stfl_be_p(p, v)
135#define stfq_p(p, v) stfq_be_p(p, v)
136#define ldn_p(p, sz) ldn_be_p(p, sz)
137#define stn_p(p, sz, v) stn_be_p(p, sz, v)
138#else
139#define lduw_p(p) lduw_le_p(p)
140#define ldsw_p(p) ldsw_le_p(p)
141#define ldl_p(p) ldl_le_p(p)
142#define ldq_p(p) ldq_le_p(p)
143#define ldfl_p(p) ldfl_le_p(p)
144#define ldfq_p(p) ldfq_le_p(p)
145#define stw_p(p, v) stw_le_p(p, v)
146#define stl_p(p, v) stl_le_p(p, v)
147#define stq_p(p, v) stq_le_p(p, v)
148#define stfl_p(p, v) stfl_le_p(p, v)
149#define stfq_p(p, v) stfq_le_p(p, v)
150#define ldn_p(p, sz) ldn_le_p(p, sz)
151#define stn_p(p, sz, v) stn_le_p(p, sz, v)
152#endif
153
154
155
156#if defined(CONFIG_USER_ONLY)
157#include "exec/user/abitypes.h"
158
159
160
161
162extern unsigned long guest_base;
163extern int have_guest_base;
164extern unsigned long reserved_va;
165
166#if HOST_LONG_BITS <= TARGET_VIRT_ADDR_SPACE_BITS
167#define GUEST_ADDR_MAX (~0ul)
168#else
169#define GUEST_ADDR_MAX (reserved_va ? reserved_va - 1 : \
170 (1ul << TARGET_VIRT_ADDR_SPACE_BITS) - 1)
171#endif
172#else
173
174#include "exec/hwaddr.h"
175
176#define SUFFIX
177#define ARG1 as
178#define ARG1_DECL AddressSpace *as
179#define TARGET_ENDIANNESS
180#include "exec/memory_ldst.inc.h"
181
182#define SUFFIX _cached_slow
183#define ARG1 cache
184#define ARG1_DECL MemoryRegionCache *cache
185#define TARGET_ENDIANNESS
186#include "exec/memory_ldst.inc.h"
187
188static inline void stl_phys_notdirty(AddressSpace *as, hwaddr addr, uint32_t val)
189{
190 address_space_stl_notdirty(as, addr, val,
191 MEMTXATTRS_UNSPECIFIED, NULL);
192}
193
194#define SUFFIX
195#define ARG1 as
196#define ARG1_DECL AddressSpace *as
197#define TARGET_ENDIANNESS
198#include "exec/memory_ldst_phys.inc.h"
199
200
201#define ENDIANNESS
202#include "exec/memory_ldst_cached.inc.h"
203
204#define SUFFIX _cached
205#define ARG1 cache
206#define ARG1_DECL MemoryRegionCache *cache
207#define TARGET_ENDIANNESS
208#include "exec/memory_ldst_phys.inc.h"
209#endif
210
211
212
213#ifdef TARGET_PAGE_BITS_VARY
214extern bool target_page_bits_decided;
215extern int target_page_bits;
216#define TARGET_PAGE_BITS ({ assert(target_page_bits_decided); \
217 target_page_bits; })
218#else
219#define TARGET_PAGE_BITS_MIN TARGET_PAGE_BITS
220#endif
221
222#define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS)
223#define TARGET_PAGE_MASK ~(TARGET_PAGE_SIZE - 1)
224#define TARGET_PAGE_ALIGN(addr) (((addr) + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK)
225
226
227
228
229extern uintptr_t qemu_host_page_size;
230extern intptr_t qemu_host_page_mask;
231
232#define HOST_PAGE_ALIGN(addr) (((addr) + qemu_host_page_size - 1) & qemu_host_page_mask)
233#define REAL_HOST_PAGE_ALIGN(addr) (((addr) + qemu_real_host_page_size - 1) & \
234 qemu_real_host_page_mask)
235
236
237#define PAGE_READ 0x0001
238#define PAGE_WRITE 0x0002
239#define PAGE_EXEC 0x0004
240#define PAGE_BITS (PAGE_READ | PAGE_WRITE | PAGE_EXEC)
241#define PAGE_VALID 0x0008
242
243
244#define PAGE_WRITE_ORG 0x0010
245
246
247#define PAGE_WRITE_INV 0x0040
248#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
249
250#define PAGE_RESERVED 0x0020
251#endif
252
253#if defined(CONFIG_USER_ONLY)
254void page_dump(FILE *f);
255
256typedef int (*walk_memory_regions_fn)(void *, target_ulong,
257 target_ulong, unsigned long);
258int walk_memory_regions(void *, walk_memory_regions_fn);
259
260int page_get_flags(target_ulong address);
261void page_set_flags(target_ulong start, target_ulong end, int flags);
262int page_check_range(target_ulong start, target_ulong len, int flags);
263#endif
264
265CPUArchState *cpu_copy(CPUArchState *env);
266
267
268
269
270
271
272
273
274
275
276#define CPU_INTERRUPT_HARD 0x0002
277
278
279
280#define CPU_INTERRUPT_EXITTB 0x0004
281
282
283#define CPU_INTERRUPT_HALT 0x0020
284
285
286#define CPU_INTERRUPT_DEBUG 0x0080
287
288
289#define CPU_INTERRUPT_RESET 0x0400
290
291
292
293#define CPU_INTERRUPT_TGT_EXT_0 0x0008
294#define CPU_INTERRUPT_TGT_EXT_1 0x0010
295#define CPU_INTERRUPT_TGT_EXT_2 0x0040
296#define CPU_INTERRUPT_TGT_EXT_3 0x0200
297#define CPU_INTERRUPT_TGT_EXT_4 0x1000
298
299
300
301
302
303
304#define CPU_INTERRUPT_TGT_INT_0 0x0100
305#define CPU_INTERRUPT_TGT_INT_1 0x0800
306#define CPU_INTERRUPT_TGT_INT_2 0x2000
307
308
309
310
311#define CPU_INTERRUPT_SSTEP_MASK \
312 (CPU_INTERRUPT_HARD \
313 | CPU_INTERRUPT_TGT_EXT_0 \
314 | CPU_INTERRUPT_TGT_EXT_1 \
315 | CPU_INTERRUPT_TGT_EXT_2 \
316 | CPU_INTERRUPT_TGT_EXT_3 \
317 | CPU_INTERRUPT_TGT_EXT_4)
318
319#if !defined(CONFIG_USER_ONLY)
320
321
322
323
324
325
326
327#define TLB_INVALID_MASK (1 << (TARGET_PAGE_BITS - 1))
328
329
330#define TLB_NOTDIRTY (1 << (TARGET_PAGE_BITS - 2))
331
332#define TLB_MMIO (1 << (TARGET_PAGE_BITS - 3))
333
334#define TLB_RECHECK (1 << (TARGET_PAGE_BITS - 4))
335
336
337
338
339#define TLB_FLAGS_MASK (TLB_INVALID_MASK | TLB_NOTDIRTY | TLB_MMIO \
340 | TLB_RECHECK)
341
342
343
344
345
346
347
348
349static inline bool tlb_hit_page(target_ulong tlb_addr, target_ulong addr)
350{
351 return addr == (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK));
352}
353
354
355
356
357
358
359
360static inline bool tlb_hit(target_ulong tlb_addr, target_ulong addr)
361{
362 return tlb_hit_page(tlb_addr, addr & TARGET_PAGE_MASK);
363}
364
365void dump_exec_info(FILE *f, fprintf_function cpu_fprintf);
366void dump_opcount_info(FILE *f, fprintf_function cpu_fprintf);
367#endif
368
369int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
370 uint8_t *buf, target_ulong len, int is_write);
371
372int cpu_exec(CPUState *cpu);
373
374#endif
375