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
44
45
46
47
48#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
49#define BSWAP_NEEDED
50#endif
51
52#ifdef BSWAP_NEEDED
53
54static inline uint16_t tswap16(uint16_t s)
55{
56 return bswap16(s);
57}
58
59static inline uint32_t tswap32(uint32_t s)
60{
61 return bswap32(s);
62}
63
64static inline uint64_t tswap64(uint64_t s)
65{
66 return bswap64(s);
67}
68
69static inline void tswap16s(uint16_t *s)
70{
71 *s = bswap16(*s);
72}
73
74static inline void tswap32s(uint32_t *s)
75{
76 *s = bswap32(*s);
77}
78
79static inline void tswap64s(uint64_t *s)
80{
81 *s = bswap64(*s);
82}
83
84#else
85
86static inline uint16_t tswap16(uint16_t s)
87{
88 return s;
89}
90
91static inline uint32_t tswap32(uint32_t s)
92{
93 return s;
94}
95
96static inline uint64_t tswap64(uint64_t s)
97{
98 return s;
99}
100
101static inline void tswap16s(uint16_t *s)
102{
103}
104
105static inline void tswap32s(uint32_t *s)
106{
107}
108
109static inline void tswap64s(uint64_t *s)
110{
111}
112
113#endif
114
115#if TARGET_LONG_SIZE == 4
116#define tswapl(s) tswap32(s)
117#define tswapls(s) tswap32s((uint32_t *)(s))
118#define bswaptls(s) bswap32s(s)
119#else
120#define tswapl(s) tswap64(s)
121#define tswapls(s) tswap64s((uint64_t *)(s))
122#define bswaptls(s) bswap64s(s)
123#endif
124
125
126
127
128#if defined(TARGET_WORDS_BIGENDIAN)
129#define lduw_p(p) lduw_be_p(p)
130#define ldsw_p(p) ldsw_be_p(p)
131#define ldl_p(p) ldl_be_p(p)
132#define ldq_p(p) ldq_be_p(p)
133#define ldfl_p(p) ldfl_be_p(p)
134#define ldfq_p(p) ldfq_be_p(p)
135#define stw_p(p, v) stw_be_p(p, v)
136#define stl_p(p, v) stl_be_p(p, v)
137#define stq_p(p, v) stq_be_p(p, v)
138#define stfl_p(p, v) stfl_be_p(p, v)
139#define stfq_p(p, v) stfq_be_p(p, v)
140#else
141#define lduw_p(p) lduw_le_p(p)
142#define ldsw_p(p) ldsw_le_p(p)
143#define ldl_p(p) ldl_le_p(p)
144#define ldq_p(p) ldq_le_p(p)
145#define ldfl_p(p) ldfl_le_p(p)
146#define ldfq_p(p) ldfq_le_p(p)
147#define stw_p(p, v) stw_le_p(p, v)
148#define stl_p(p, v) stl_le_p(p, v)
149#define stq_p(p, v) stq_le_p(p, v)
150#define stfl_p(p, v) stfl_le_p(p, v)
151#define stfq_p(p, v) stfq_le_p(p, 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#define GUEST_ADDR_MAX (reserved_va ? reserved_va : \
167 (1ul << TARGET_VIRT_ADDR_SPACE_BITS) - 1)
168#endif
169
170
171
172#define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS)
173#define TARGET_PAGE_MASK ~(TARGET_PAGE_SIZE - 1)
174#define TARGET_PAGE_ALIGN(addr) (((addr) + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK)
175
176
177
178
179extern uintptr_t qemu_real_host_page_size;
180extern intptr_t qemu_real_host_page_mask;
181extern uintptr_t qemu_host_page_size;
182extern intptr_t qemu_host_page_mask;
183
184#define HOST_PAGE_ALIGN(addr) (((addr) + qemu_host_page_size - 1) & qemu_host_page_mask)
185#define REAL_HOST_PAGE_ALIGN(addr) (((addr) + qemu_real_host_page_size - 1) & \
186 qemu_real_host_page_mask)
187
188
189#define PAGE_READ 0x0001
190#define PAGE_WRITE 0x0002
191#define PAGE_EXEC 0x0004
192#define PAGE_BITS (PAGE_READ | PAGE_WRITE | PAGE_EXEC)
193#define PAGE_VALID 0x0008
194
195
196#define PAGE_WRITE_ORG 0x0010
197#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
198
199#define PAGE_RESERVED 0x0020
200#endif
201
202#if defined(CONFIG_USER_ONLY)
203void page_dump(FILE *f);
204
205typedef int (*walk_memory_regions_fn)(void *, target_ulong,
206 target_ulong, unsigned long);
207int walk_memory_regions(void *, walk_memory_regions_fn);
208
209int page_get_flags(target_ulong address);
210void page_set_flags(target_ulong start, target_ulong end, int flags);
211int page_check_range(target_ulong start, target_ulong len, int flags);
212#endif
213
214CPUArchState *cpu_copy(CPUArchState *env);
215
216
217
218
219
220
221
222
223
224
225#define CPU_INTERRUPT_HARD 0x0002
226
227
228
229#define CPU_INTERRUPT_EXITTB 0x0004
230
231
232#define CPU_INTERRUPT_HALT 0x0020
233
234
235#define CPU_INTERRUPT_DEBUG 0x0080
236
237
238#define CPU_INTERRUPT_RESET 0x0400
239
240
241
242#define CPU_INTERRUPT_TGT_EXT_0 0x0008
243#define CPU_INTERRUPT_TGT_EXT_1 0x0010
244#define CPU_INTERRUPT_TGT_EXT_2 0x0040
245#define CPU_INTERRUPT_TGT_EXT_3 0x0200
246#define CPU_INTERRUPT_TGT_EXT_4 0x1000
247
248
249
250
251
252
253#define CPU_INTERRUPT_TGT_INT_0 0x0100
254#define CPU_INTERRUPT_TGT_INT_1 0x0800
255#define CPU_INTERRUPT_TGT_INT_2 0x2000
256
257
258
259
260#define CPU_INTERRUPT_SSTEP_MASK \
261 (CPU_INTERRUPT_HARD \
262 | CPU_INTERRUPT_TGT_EXT_0 \
263 | CPU_INTERRUPT_TGT_EXT_1 \
264 | CPU_INTERRUPT_TGT_EXT_2 \
265 | CPU_INTERRUPT_TGT_EXT_3 \
266 | CPU_INTERRUPT_TGT_EXT_4)
267
268#if !defined(CONFIG_USER_ONLY)
269
270
271
272
273#define TLB_INVALID_MASK (1 << 3)
274
275
276#define TLB_NOTDIRTY (1 << 4)
277
278#define TLB_MMIO (1 << 5)
279
280void dump_exec_info(FILE *f, fprintf_function cpu_fprintf);
281void dump_opcount_info(FILE *f, fprintf_function cpu_fprintf);
282#endif
283
284int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
285 uint8_t *buf, int len, int is_write);
286
287#endif
288