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 "qemu/tls.h"
24#include "exec/cpu-common.h"
25#include "qemu/thread.h"
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
41#define BSWAP_NEEDED
42#endif
43
44#ifdef BSWAP_NEEDED
45
46static inline uint16_t tswap16(uint16_t s)
47{
48 return bswap16(s);
49}
50
51static inline uint32_t tswap32(uint32_t s)
52{
53 return bswap32(s);
54}
55
56static inline uint64_t tswap64(uint64_t s)
57{
58 return bswap64(s);
59}
60
61static inline void tswap16s(uint16_t *s)
62{
63 *s = bswap16(*s);
64}
65
66static inline void tswap32s(uint32_t *s)
67{
68 *s = bswap32(*s);
69}
70
71static inline void tswap64s(uint64_t *s)
72{
73 *s = bswap64(*s);
74}
75
76#else
77
78static inline uint16_t tswap16(uint16_t s)
79{
80 return s;
81}
82
83static inline uint32_t tswap32(uint32_t s)
84{
85 return s;
86}
87
88static inline uint64_t tswap64(uint64_t s)
89{
90 return s;
91}
92
93static inline void tswap16s(uint16_t *s)
94{
95}
96
97static inline void tswap32s(uint32_t *s)
98{
99}
100
101static inline void tswap64s(uint64_t *s)
102{
103}
104
105#endif
106
107#if TARGET_LONG_SIZE == 4
108#define tswapl(s) tswap32(s)
109#define tswapls(s) tswap32s((uint32_t *)(s))
110#define bswaptls(s) bswap32s(s)
111#else
112#define tswapl(s) tswap64(s)
113#define tswapls(s) tswap64s((uint64_t *)(s))
114#define bswaptls(s) bswap64s(s)
115#endif
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154#if defined(TARGET_WORDS_BIGENDIAN)
155#define lduw_p(p) lduw_be_p(p)
156#define ldsw_p(p) ldsw_be_p(p)
157#define ldl_p(p) ldl_be_p(p)
158#define ldq_p(p) ldq_be_p(p)
159#define ldfl_p(p) ldfl_be_p(p)
160#define ldfq_p(p) ldfq_be_p(p)
161#define stw_p(p, v) stw_be_p(p, v)
162#define stl_p(p, v) stl_be_p(p, v)
163#define stq_p(p, v) stq_be_p(p, v)
164#define stfl_p(p, v) stfl_be_p(p, v)
165#define stfq_p(p, v) stfq_be_p(p, v)
166#else
167#define lduw_p(p) lduw_le_p(p)
168#define ldsw_p(p) ldsw_le_p(p)
169#define ldl_p(p) ldl_le_p(p)
170#define ldq_p(p) ldq_le_p(p)
171#define ldfl_p(p) ldfl_le_p(p)
172#define ldfq_p(p) ldfq_le_p(p)
173#define stw_p(p, v) stw_le_p(p, v)
174#define stl_p(p, v) stl_le_p(p, v)
175#define stq_p(p, v) stq_le_p(p, v)
176#define stfl_p(p, v) stfl_le_p(p, v)
177#define stfq_p(p, v) stfq_le_p(p, v)
178#endif
179
180
181
182#if defined(CONFIG_USER_ONLY)
183#include <assert.h>
184#include "exec/user/abitypes.h"
185
186
187
188
189#if defined(CONFIG_USE_GUEST_BASE)
190extern unsigned long guest_base;
191extern int have_guest_base;
192extern unsigned long reserved_va;
193#define GUEST_BASE guest_base
194#define RESERVED_VA reserved_va
195#else
196#define GUEST_BASE 0ul
197#define RESERVED_VA 0ul
198#endif
199
200
201#define g2h(x) ((void *)((unsigned long)(target_ulong)(x) + GUEST_BASE))
202
203#if HOST_LONG_BITS <= TARGET_VIRT_ADDR_SPACE_BITS
204#define h2g_valid(x) 1
205#else
206#define h2g_valid(x) ({ \
207 unsigned long __guest = (unsigned long)(x) - GUEST_BASE; \
208 (__guest < (1ul << TARGET_VIRT_ADDR_SPACE_BITS)) && \
209 (!RESERVED_VA || (__guest < RESERVED_VA)); \
210})
211#endif
212
213#define h2g(x) ({ \
214 unsigned long __ret = (unsigned long)(x) - GUEST_BASE; \
215 \
216 assert(h2g_valid(x)); \
217 (abi_ulong)__ret; \
218})
219
220#define saddr(x) g2h(x)
221#define laddr(x) g2h(x)
222
223#else
224
225
226#define saddr(x) (uint8_t *)(intptr_t)(x)
227#define laddr(x) (uint8_t *)(intptr_t)(x)
228#endif
229
230#define ldub_raw(p) ldub_p(laddr((p)))
231#define ldsb_raw(p) ldsb_p(laddr((p)))
232#define lduw_raw(p) lduw_p(laddr((p)))
233#define ldsw_raw(p) ldsw_p(laddr((p)))
234#define ldl_raw(p) ldl_p(laddr((p)))
235#define ldq_raw(p) ldq_p(laddr((p)))
236#define ldfl_raw(p) ldfl_p(laddr((p)))
237#define ldfq_raw(p) ldfq_p(laddr((p)))
238#define stb_raw(p, v) stb_p(saddr((p)), v)
239#define stw_raw(p, v) stw_p(saddr((p)), v)
240#define stl_raw(p, v) stl_p(saddr((p)), v)
241#define stq_raw(p, v) stq_p(saddr((p)), v)
242#define stfl_raw(p, v) stfl_p(saddr((p)), v)
243#define stfq_raw(p, v) stfq_p(saddr((p)), v)
244
245
246#if defined(CONFIG_USER_ONLY)
247
248
249#define ldub(p) ldub_raw(p)
250#define ldsb(p) ldsb_raw(p)
251#define lduw(p) lduw_raw(p)
252#define ldsw(p) ldsw_raw(p)
253#define ldl(p) ldl_raw(p)
254#define ldq(p) ldq_raw(p)
255#define ldfl(p) ldfl_raw(p)
256#define ldfq(p) ldfq_raw(p)
257#define stb(p, v) stb_raw(p, v)
258#define stw(p, v) stw_raw(p, v)
259#define stl(p, v) stl_raw(p, v)
260#define stq(p, v) stq_raw(p, v)
261#define stfl(p, v) stfl_raw(p, v)
262#define stfq(p, v) stfq_raw(p, v)
263
264#define cpu_ldub_code(env1, p) ldub_raw(p)
265#define cpu_ldsb_code(env1, p) ldsb_raw(p)
266#define cpu_lduw_code(env1, p) lduw_raw(p)
267#define cpu_ldsw_code(env1, p) ldsw_raw(p)
268#define cpu_ldl_code(env1, p) ldl_raw(p)
269#define cpu_ldq_code(env1, p) ldq_raw(p)
270
271#define cpu_ldub_data(env, addr) ldub_raw(addr)
272#define cpu_lduw_data(env, addr) lduw_raw(addr)
273#define cpu_ldsw_data(env, addr) ldsw_raw(addr)
274#define cpu_ldl_data(env, addr) ldl_raw(addr)
275#define cpu_ldq_data(env, addr) ldq_raw(addr)
276
277#define cpu_stb_data(env, addr, data) stb_raw(addr, data)
278#define cpu_stw_data(env, addr, data) stw_raw(addr, data)
279#define cpu_stl_data(env, addr, data) stl_raw(addr, data)
280#define cpu_stq_data(env, addr, data) stq_raw(addr, data)
281
282#define cpu_ldub_kernel(env, addr) ldub_raw(addr)
283#define cpu_lduw_kernel(env, addr) lduw_raw(addr)
284#define cpu_ldsw_kernel(env, addr) ldsw_raw(addr)
285#define cpu_ldl_kernel(env, addr) ldl_raw(addr)
286#define cpu_ldq_kernel(env, addr) ldq_raw(addr)
287
288#define cpu_stb_kernel(env, addr, data) stb_raw(addr, data)
289#define cpu_stw_kernel(env, addr, data) stw_raw(addr, data)
290#define cpu_stl_kernel(env, addr, data) stl_raw(addr, data)
291#define cpu_stq_kernel(env, addr, data) stq_raw(addr, data)
292
293#define ldub_kernel(p) ldub_raw(p)
294#define ldsb_kernel(p) ldsb_raw(p)
295#define lduw_kernel(p) lduw_raw(p)
296#define ldsw_kernel(p) ldsw_raw(p)
297#define ldl_kernel(p) ldl_raw(p)
298#define ldq_kernel(p) ldq_raw(p)
299#define ldfl_kernel(p) ldfl_raw(p)
300#define ldfq_kernel(p) ldfq_raw(p)
301#define stb_kernel(p, v) stb_raw(p, v)
302#define stw_kernel(p, v) stw_raw(p, v)
303#define stl_kernel(p, v) stl_raw(p, v)
304#define stq_kernel(p, v) stq_raw(p, v)
305#define stfl_kernel(p, v) stfl_raw(p, v)
306#define stfq_kernel(p, vt) stfq_raw(p, v)
307
308#define cpu_ldub_data(env, addr) ldub_raw(addr)
309#define cpu_lduw_data(env, addr) lduw_raw(addr)
310#define cpu_ldl_data(env, addr) ldl_raw(addr)
311
312#define cpu_stb_data(env, addr, data) stb_raw(addr, data)
313#define cpu_stw_data(env, addr, data) stw_raw(addr, data)
314#define cpu_stl_data(env, addr, data) stl_raw(addr, data)
315#endif
316
317
318
319#define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS)
320#define TARGET_PAGE_MASK ~(TARGET_PAGE_SIZE - 1)
321#define TARGET_PAGE_ALIGN(addr) (((addr) + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK)
322
323
324extern uintptr_t qemu_real_host_page_size;
325extern uintptr_t qemu_host_page_size;
326extern uintptr_t qemu_host_page_mask;
327
328#define HOST_PAGE_ALIGN(addr) (((addr) + qemu_host_page_size - 1) & qemu_host_page_mask)
329
330
331#define PAGE_READ 0x0001
332#define PAGE_WRITE 0x0002
333#define PAGE_EXEC 0x0004
334#define PAGE_BITS (PAGE_READ | PAGE_WRITE | PAGE_EXEC)
335#define PAGE_VALID 0x0008
336
337
338#define PAGE_WRITE_ORG 0x0010
339#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
340
341#define PAGE_RESERVED 0x0020
342#endif
343
344#if defined(CONFIG_USER_ONLY)
345void page_dump(FILE *f);
346
347typedef int (*walk_memory_regions_fn)(void *, abi_ulong,
348 abi_ulong, unsigned long);
349int walk_memory_regions(void *, walk_memory_regions_fn);
350
351int page_get_flags(target_ulong address);
352void page_set_flags(target_ulong start, target_ulong end, int flags);
353int page_check_range(target_ulong start, target_ulong len, int flags);
354#endif
355
356CPUArchState *cpu_copy(CPUArchState *env);
357
358#define CPU_DUMP_CODE 0x00010000
359#define CPU_DUMP_FPU 0x00020000
360
361#define CPU_DUMP_CCOP 0x00040000
362
363void cpu_dump_state(CPUArchState *env, FILE *f, fprintf_function cpu_fprintf,
364 int flags);
365void cpu_dump_statistics(CPUArchState *env, FILE *f, fprintf_function cpu_fprintf,
366 int flags);
367
368void QEMU_NORETURN cpu_abort(CPUArchState *env, const char *fmt, ...)
369 GCC_FMT_ATTR(2, 3);
370extern CPUArchState *first_cpu;
371DECLARE_TLS(CPUArchState *,cpu_single_env);
372#define cpu_single_env tls_var(cpu_single_env)
373
374
375
376
377
378
379
380
381
382
383#define CPU_INTERRUPT_HARD 0x0002
384
385
386
387#define CPU_INTERRUPT_EXITTB 0x0004
388
389
390#define CPU_INTERRUPT_HALT 0x0020
391
392
393#define CPU_INTERRUPT_DEBUG 0x0080
394
395
396
397#define CPU_INTERRUPT_TGT_EXT_0 0x0008
398#define CPU_INTERRUPT_TGT_EXT_1 0x0010
399#define CPU_INTERRUPT_TGT_EXT_2 0x0040
400#define CPU_INTERRUPT_TGT_EXT_3 0x0200
401#define CPU_INTERRUPT_TGT_EXT_4 0x1000
402
403
404
405
406
407
408#define CPU_INTERRUPT_TGT_INT_0 0x0100
409#define CPU_INTERRUPT_TGT_INT_1 0x0400
410#define CPU_INTERRUPT_TGT_INT_2 0x0800
411#define CPU_INTERRUPT_TGT_INT_3 0x2000
412
413
414
415
416#define CPU_INTERRUPT_SSTEP_MASK \
417 (CPU_INTERRUPT_HARD \
418 | CPU_INTERRUPT_TGT_EXT_0 \
419 | CPU_INTERRUPT_TGT_EXT_1 \
420 | CPU_INTERRUPT_TGT_EXT_2 \
421 | CPU_INTERRUPT_TGT_EXT_3 \
422 | CPU_INTERRUPT_TGT_EXT_4)
423
424void cpu_exit(CPUArchState *s);
425
426
427#define BP_MEM_READ 0x01
428#define BP_MEM_WRITE 0x02
429#define BP_MEM_ACCESS (BP_MEM_READ | BP_MEM_WRITE)
430#define BP_STOP_BEFORE_ACCESS 0x04
431#define BP_WATCHPOINT_HIT 0x08
432#define BP_GDB 0x10
433#define BP_CPU 0x20
434
435int cpu_breakpoint_insert(CPUArchState *env, target_ulong pc, int flags,
436 CPUBreakpoint **breakpoint);
437int cpu_breakpoint_remove(CPUArchState *env, target_ulong pc, int flags);
438void cpu_breakpoint_remove_by_ref(CPUArchState *env, CPUBreakpoint *breakpoint);
439void cpu_breakpoint_remove_all(CPUArchState *env, int mask);
440int cpu_watchpoint_insert(CPUArchState *env, target_ulong addr, target_ulong len,
441 int flags, CPUWatchpoint **watchpoint);
442int cpu_watchpoint_remove(CPUArchState *env, target_ulong addr,
443 target_ulong len, int flags);
444void cpu_watchpoint_remove_by_ref(CPUArchState *env, CPUWatchpoint *watchpoint);
445void cpu_watchpoint_remove_all(CPUArchState *env, int mask);
446
447#define SSTEP_ENABLE 0x1
448#define SSTEP_NOIRQ 0x2
449#define SSTEP_NOTIMER 0x4
450
451void cpu_single_step(CPUArchState *env, int enabled);
452
453#if !defined(CONFIG_USER_ONLY)
454
455
456
457
458hwaddr cpu_get_phys_page_debug(CPUArchState *env, target_ulong addr);
459
460
461
462extern int phys_ram_fd;
463extern ram_addr_t ram_size;
464
465
466#define RAM_PREALLOC_MASK (1 << 0)
467
468typedef struct RAMBlock {
469 struct MemoryRegion *mr;
470 uint8_t *host;
471 ram_addr_t offset;
472 ram_addr_t length;
473 uint32_t flags;
474 char idstr[256];
475
476
477
478 QTAILQ_ENTRY(RAMBlock) next;
479#if defined(__linux__) && !defined(TARGET_S390X)
480 int fd;
481#endif
482} RAMBlock;
483
484typedef struct RAMList {
485 QemuMutex mutex;
486
487 uint8_t *phys_dirty;
488 RAMBlock *mru_block;
489
490 QTAILQ_HEAD(, RAMBlock) blocks;
491 uint32_t version;
492} RAMList;
493extern RAMList ram_list;
494
495extern const char *mem_path;
496extern int mem_prealloc;
497
498
499
500
501#define TLB_INVALID_MASK (1 << 3)
502
503
504#define TLB_NOTDIRTY (1 << 4)
505
506#define TLB_MMIO (1 << 5)
507
508void dump_exec_info(FILE *f, fprintf_function cpu_fprintf);
509ram_addr_t last_ram_offset(void);
510void qemu_mutex_lock_ramlist(void);
511void qemu_mutex_unlock_ramlist(void);
512#endif
513
514int cpu_memory_rw_debug(CPUArchState *env, target_ulong addr,
515 uint8_t *buf, int len, int is_write);
516
517#endif
518