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 "cpu-common.h"
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38#include "softfloat.h"
39
40#if defined(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
117typedef union {
118 float32 f;
119 uint32_t l;
120} CPU_FloatU;
121
122
123
124typedef union {
125 float64 d;
126#if defined(WORDS_BIGENDIAN) \
127 || (defined(__arm__) && !defined(__VFP_FP__) && !defined(CONFIG_SOFTFLOAT))
128 struct {
129 uint32_t upper;
130 uint32_t lower;
131 } l;
132#else
133 struct {
134 uint32_t lower;
135 uint32_t upper;
136 } l;
137#endif
138 uint64_t ll;
139} CPU_DoubleU;
140
141#ifdef TARGET_SPARC
142typedef union {
143 float128 q;
144#if defined(WORDS_BIGENDIAN) \
145 || (defined(__arm__) && !defined(__VFP_FP__) && !defined(CONFIG_SOFTFLOAT))
146 struct {
147 uint32_t upmost;
148 uint32_t upper;
149 uint32_t lower;
150 uint32_t lowest;
151 } l;
152 struct {
153 uint64_t upper;
154 uint64_t lower;
155 } ll;
156#else
157 struct {
158 uint32_t lowest;
159 uint32_t lower;
160 uint32_t upper;
161 uint32_t upmost;
162 } l;
163 struct {
164 uint64_t lower;
165 uint64_t upper;
166 } ll;
167#endif
168} CPU_QuadU;
169#endif
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206static inline int ldub_p(const void *ptr)
207{
208 return *(uint8_t *)ptr;
209}
210
211static inline int ldsb_p(const void *ptr)
212{
213 return *(int8_t *)ptr;
214}
215
216static inline void stb_p(void *ptr, int v)
217{
218 *(uint8_t *)ptr = v;
219}
220
221
222
223
224#if defined(WORDS_BIGENDIAN) || defined(WORDS_ALIGNED)
225
226
227static inline int lduw_le_p(const void *ptr)
228{
229#ifdef _ARCH_PPC
230 int val;
231 __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (ptr));
232 return val;
233#else
234 const uint8_t *p = ptr;
235 return p[0] | (p[1] << 8);
236#endif
237}
238
239static inline int ldsw_le_p(const void *ptr)
240{
241#ifdef _ARCH_PPC
242 int val;
243 __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (ptr));
244 return (int16_t)val;
245#else
246 const uint8_t *p = ptr;
247 return (int16_t)(p[0] | (p[1] << 8));
248#endif
249}
250
251static inline int ldl_le_p(const void *ptr)
252{
253#ifdef _ARCH_PPC
254 int val;
255 __asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" (ptr));
256 return val;
257#else
258 const uint8_t *p = ptr;
259 return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
260#endif
261}
262
263static inline uint64_t ldq_le_p(const void *ptr)
264{
265 const uint8_t *p = ptr;
266 uint32_t v1, v2;
267 v1 = ldl_le_p(p);
268 v2 = ldl_le_p(p + 4);
269 return v1 | ((uint64_t)v2 << 32);
270}
271
272static inline void stw_le_p(void *ptr, int v)
273{
274#ifdef _ARCH_PPC
275 __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*(uint16_t *)ptr) : "r" (v), "r" (ptr));
276#else
277 uint8_t *p = ptr;
278 p[0] = v;
279 p[1] = v >> 8;
280#endif
281}
282
283static inline void stl_le_p(void *ptr, int v)
284{
285#ifdef _ARCH_PPC
286 __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*(uint32_t *)ptr) : "r" (v), "r" (ptr));
287#else
288 uint8_t *p = ptr;
289 p[0] = v;
290 p[1] = v >> 8;
291 p[2] = v >> 16;
292 p[3] = v >> 24;
293#endif
294}
295
296static inline void stq_le_p(void *ptr, uint64_t v)
297{
298 uint8_t *p = ptr;
299 stl_le_p(p, (uint32_t)v);
300 stl_le_p(p + 4, v >> 32);
301}
302
303
304
305static inline float32 ldfl_le_p(const void *ptr)
306{
307 union {
308 float32 f;
309 uint32_t i;
310 } u;
311 u.i = ldl_le_p(ptr);
312 return u.f;
313}
314
315static inline void stfl_le_p(void *ptr, float32 v)
316{
317 union {
318 float32 f;
319 uint32_t i;
320 } u;
321 u.f = v;
322 stl_le_p(ptr, u.i);
323}
324
325static inline float64 ldfq_le_p(const void *ptr)
326{
327 CPU_DoubleU u;
328 u.l.lower = ldl_le_p(ptr);
329 u.l.upper = ldl_le_p(ptr + 4);
330 return u.d;
331}
332
333static inline void stfq_le_p(void *ptr, float64 v)
334{
335 CPU_DoubleU u;
336 u.d = v;
337 stl_le_p(ptr, u.l.lower);
338 stl_le_p(ptr + 4, u.l.upper);
339}
340
341#else
342
343static inline int lduw_le_p(const void *ptr)
344{
345 return *(uint16_t *)ptr;
346}
347
348static inline int ldsw_le_p(const void *ptr)
349{
350 return *(int16_t *)ptr;
351}
352
353static inline int ldl_le_p(const void *ptr)
354{
355 return *(uint32_t *)ptr;
356}
357
358static inline uint64_t ldq_le_p(const void *ptr)
359{
360 return *(uint64_t *)ptr;
361}
362
363static inline void stw_le_p(void *ptr, int v)
364{
365 *(uint16_t *)ptr = v;
366}
367
368static inline void stl_le_p(void *ptr, int v)
369{
370 *(uint32_t *)ptr = v;
371}
372
373static inline void stq_le_p(void *ptr, uint64_t v)
374{
375 *(uint64_t *)ptr = v;
376}
377
378
379
380static inline float32 ldfl_le_p(const void *ptr)
381{
382 return *(float32 *)ptr;
383}
384
385static inline float64 ldfq_le_p(const void *ptr)
386{
387 return *(float64 *)ptr;
388}
389
390static inline void stfl_le_p(void *ptr, float32 v)
391{
392 *(float32 *)ptr = v;
393}
394
395static inline void stfq_le_p(void *ptr, float64 v)
396{
397 *(float64 *)ptr = v;
398}
399#endif
400
401#if !defined(WORDS_BIGENDIAN) || defined(WORDS_ALIGNED)
402
403static inline int lduw_be_p(const void *ptr)
404{
405#if defined(__i386__)
406 int val;
407 asm volatile ("movzwl %1, %0\n"
408 "xchgb %b0, %h0\n"
409 : "=q" (val)
410 : "m" (*(uint16_t *)ptr));
411 return val;
412#else
413 const uint8_t *b = ptr;
414 return ((b[0] << 8) | b[1]);
415#endif
416}
417
418static inline int ldsw_be_p(const void *ptr)
419{
420#if defined(__i386__)
421 int val;
422 asm volatile ("movzwl %1, %0\n"
423 "xchgb %b0, %h0\n"
424 : "=q" (val)
425 : "m" (*(uint16_t *)ptr));
426 return (int16_t)val;
427#else
428 const uint8_t *b = ptr;
429 return (int16_t)((b[0] << 8) | b[1]);
430#endif
431}
432
433static inline int ldl_be_p(const void *ptr)
434{
435#if defined(__i386__) || defined(__x86_64__)
436 int val;
437 asm volatile ("movl %1, %0\n"
438 "bswap %0\n"
439 : "=r" (val)
440 : "m" (*(uint32_t *)ptr));
441 return val;
442#else
443 const uint8_t *b = ptr;
444 return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3];
445#endif
446}
447
448static inline uint64_t ldq_be_p(const void *ptr)
449{
450 uint32_t a,b;
451 a = ldl_be_p(ptr);
452 b = ldl_be_p((uint8_t *)ptr + 4);
453 return (((uint64_t)a<<32)|b);
454}
455
456static inline void stw_be_p(void *ptr, int v)
457{
458#if defined(__i386__)
459 asm volatile ("xchgb %b0, %h0\n"
460 "movw %w0, %1\n"
461 : "=q" (v)
462 : "m" (*(uint16_t *)ptr), "0" (v));
463#else
464 uint8_t *d = (uint8_t *) ptr;
465 d[0] = v >> 8;
466 d[1] = v;
467#endif
468}
469
470static inline void stl_be_p(void *ptr, int v)
471{
472#if defined(__i386__) || defined(__x86_64__)
473 asm volatile ("bswap %0\n"
474 "movl %0, %1\n"
475 : "=r" (v)
476 : "m" (*(uint32_t *)ptr), "0" (v));
477#else
478 uint8_t *d = (uint8_t *) ptr;
479 d[0] = v >> 24;
480 d[1] = v >> 16;
481 d[2] = v >> 8;
482 d[3] = v;
483#endif
484}
485
486static inline void stq_be_p(void *ptr, uint64_t v)
487{
488 stl_be_p(ptr, v >> 32);
489 stl_be_p((uint8_t *)ptr + 4, v);
490}
491
492
493
494static inline float32 ldfl_be_p(const void *ptr)
495{
496 union {
497 float32 f;
498 uint32_t i;
499 } u;
500 u.i = ldl_be_p(ptr);
501 return u.f;
502}
503
504static inline void stfl_be_p(void *ptr, float32 v)
505{
506 union {
507 float32 f;
508 uint32_t i;
509 } u;
510 u.f = v;
511 stl_be_p(ptr, u.i);
512}
513
514static inline float64 ldfq_be_p(const void *ptr)
515{
516 CPU_DoubleU u;
517 u.l.upper = ldl_be_p(ptr);
518 u.l.lower = ldl_be_p((uint8_t *)ptr + 4);
519 return u.d;
520}
521
522static inline void stfq_be_p(void *ptr, float64 v)
523{
524 CPU_DoubleU u;
525 u.d = v;
526 stl_be_p(ptr, u.l.upper);
527 stl_be_p((uint8_t *)ptr + 4, u.l.lower);
528}
529
530#else
531
532static inline int lduw_be_p(const void *ptr)
533{
534 return *(uint16_t *)ptr;
535}
536
537static inline int ldsw_be_p(const void *ptr)
538{
539 return *(int16_t *)ptr;
540}
541
542static inline int ldl_be_p(const void *ptr)
543{
544 return *(uint32_t *)ptr;
545}
546
547static inline uint64_t ldq_be_p(const void *ptr)
548{
549 return *(uint64_t *)ptr;
550}
551
552static inline void stw_be_p(void *ptr, int v)
553{
554 *(uint16_t *)ptr = v;
555}
556
557static inline void stl_be_p(void *ptr, int v)
558{
559 *(uint32_t *)ptr = v;
560}
561
562static inline void stq_be_p(void *ptr, uint64_t v)
563{
564 *(uint64_t *)ptr = v;
565}
566
567
568
569static inline float32 ldfl_be_p(const void *ptr)
570{
571 return *(float32 *)ptr;
572}
573
574static inline float64 ldfq_be_p(const void *ptr)
575{
576 return *(float64 *)ptr;
577}
578
579static inline void stfl_be_p(void *ptr, float32 v)
580{
581 *(float32 *)ptr = v;
582}
583
584static inline void stfq_be_p(void *ptr, float64 v)
585{
586 *(float64 *)ptr = v;
587}
588
589#endif
590
591
592#if defined(TARGET_WORDS_BIGENDIAN)
593#define lduw_p(p) lduw_be_p(p)
594#define ldsw_p(p) ldsw_be_p(p)
595#define ldl_p(p) ldl_be_p(p)
596#define ldq_p(p) ldq_be_p(p)
597#define ldfl_p(p) ldfl_be_p(p)
598#define ldfq_p(p) ldfq_be_p(p)
599#define stw_p(p, v) stw_be_p(p, v)
600#define stl_p(p, v) stl_be_p(p, v)
601#define stq_p(p, v) stq_be_p(p, v)
602#define stfl_p(p, v) stfl_be_p(p, v)
603#define stfq_p(p, v) stfq_be_p(p, v)
604#else
605#define lduw_p(p) lduw_le_p(p)
606#define ldsw_p(p) ldsw_le_p(p)
607#define ldl_p(p) ldl_le_p(p)
608#define ldq_p(p) ldq_le_p(p)
609#define ldfl_p(p) ldfl_le_p(p)
610#define ldfq_p(p) ldfq_le_p(p)
611#define stw_p(p, v) stw_le_p(p, v)
612#define stl_p(p, v) stl_le_p(p, v)
613#define stq_p(p, v) stq_le_p(p, v)
614#define stfl_p(p, v) stfl_le_p(p, v)
615#define stfq_p(p, v) stfq_le_p(p, v)
616#endif
617
618
619
620#if defined(CONFIG_USER_ONLY)
621#include <assert.h>
622#include "qemu-types.h"
623
624
625
626
627
628#define GUEST_BASE 0
629
630
631#define g2h(x) ((void *)((unsigned long)(x) + GUEST_BASE))
632#define h2g(x) ({ \
633 unsigned long __ret = (unsigned long)(x) - GUEST_BASE; \
634 \
635 assert(__ret == (abi_ulong)__ret); \
636 (abi_ulong)__ret; \
637})
638#define h2g_valid(x) ({ \
639 unsigned long __guest = (unsigned long)(x) - GUEST_BASE; \
640 (__guest == (abi_ulong)__guest); \
641})
642
643#define saddr(x) g2h(x)
644#define laddr(x) g2h(x)
645
646#else
647
648
649#define saddr(x) (uint8_t *)(long)(x)
650#define laddr(x) (uint8_t *)(long)(x)
651#endif
652
653#define ldub_raw(p) ldub_p(laddr((p)))
654#define ldsb_raw(p) ldsb_p(laddr((p)))
655#define lduw_raw(p) lduw_p(laddr((p)))
656#define ldsw_raw(p) ldsw_p(laddr((p)))
657#define ldl_raw(p) ldl_p(laddr((p)))
658#define ldq_raw(p) ldq_p(laddr((p)))
659#define ldfl_raw(p) ldfl_p(laddr((p)))
660#define ldfq_raw(p) ldfq_p(laddr((p)))
661#define stb_raw(p, v) stb_p(saddr((p)), v)
662#define stw_raw(p, v) stw_p(saddr((p)), v)
663#define stl_raw(p, v) stl_p(saddr((p)), v)
664#define stq_raw(p, v) stq_p(saddr((p)), v)
665#define stfl_raw(p, v) stfl_p(saddr((p)), v)
666#define stfq_raw(p, v) stfq_p(saddr((p)), v)
667
668
669#if defined(CONFIG_USER_ONLY)
670
671
672#define ldub(p) ldub_raw(p)
673#define ldsb(p) ldsb_raw(p)
674#define lduw(p) lduw_raw(p)
675#define ldsw(p) ldsw_raw(p)
676#define ldl(p) ldl_raw(p)
677#define ldq(p) ldq_raw(p)
678#define ldfl(p) ldfl_raw(p)
679#define ldfq(p) ldfq_raw(p)
680#define stb(p, v) stb_raw(p, v)
681#define stw(p, v) stw_raw(p, v)
682#define stl(p, v) stl_raw(p, v)
683#define stq(p, v) stq_raw(p, v)
684#define stfl(p, v) stfl_raw(p, v)
685#define stfq(p, v) stfq_raw(p, v)
686
687#define ldub_code(p) ldub_raw(p)
688#define ldsb_code(p) ldsb_raw(p)
689#define lduw_code(p) lduw_raw(p)
690#define ldsw_code(p) ldsw_raw(p)
691#define ldl_code(p) ldl_raw(p)
692#define ldq_code(p) ldq_raw(p)
693
694#define ldub_kernel(p) ldub_raw(p)
695#define ldsb_kernel(p) ldsb_raw(p)
696#define lduw_kernel(p) lduw_raw(p)
697#define ldsw_kernel(p) ldsw_raw(p)
698#define ldl_kernel(p) ldl_raw(p)
699#define ldq_kernel(p) ldq_raw(p)
700#define ldfl_kernel(p) ldfl_raw(p)
701#define ldfq_kernel(p) ldfq_raw(p)
702#define stb_kernel(p, v) stb_raw(p, v)
703#define stw_kernel(p, v) stw_raw(p, v)
704#define stl_kernel(p, v) stl_raw(p, v)
705#define stq_kernel(p, v) stq_raw(p, v)
706#define stfl_kernel(p, v) stfl_raw(p, v)
707#define stfq_kernel(p, vt) stfq_raw(p, v)
708
709#endif
710
711
712
713#define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS)
714#define TARGET_PAGE_MASK ~(TARGET_PAGE_SIZE - 1)
715#define TARGET_PAGE_ALIGN(addr) (((addr) + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK)
716
717
718extern unsigned long qemu_real_host_page_size;
719extern unsigned long qemu_host_page_bits;
720extern unsigned long qemu_host_page_size;
721extern unsigned long qemu_host_page_mask;
722
723#define HOST_PAGE_ALIGN(addr) (((addr) + qemu_host_page_size - 1) & qemu_host_page_mask)
724
725
726#define PAGE_READ 0x0001
727#define PAGE_WRITE 0x0002
728#define PAGE_EXEC 0x0004
729#define PAGE_BITS (PAGE_READ | PAGE_WRITE | PAGE_EXEC)
730#define PAGE_VALID 0x0008
731
732
733#define PAGE_WRITE_ORG 0x0010
734#define PAGE_RESERVED 0x0020
735
736void page_dump(FILE *f);
737int walk_memory_regions(void *,
738 int (*fn)(void *, unsigned long, unsigned long, unsigned long));
739int page_get_flags(target_ulong address);
740void page_set_flags(target_ulong start, target_ulong end, int flags);
741int page_check_range(target_ulong start, target_ulong len, int flags);
742
743void cpu_exec_init_all(unsigned long tb_size);
744CPUState *cpu_copy(CPUState *env);
745CPUState *qemu_get_cpu(int cpu);
746
747void cpu_dump_state(CPUState *env, FILE *f,
748 int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
749 int flags);
750void cpu_dump_statistics (CPUState *env, FILE *f,
751 int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
752 int flags);
753
754void QEMU_NORETURN cpu_abort(CPUState *env, const char *fmt, ...)
755 __attribute__ ((__format__ (__printf__, 2, 3)));
756extern CPUState *first_cpu;
757extern CPUState *cpu_single_env;
758extern int64_t qemu_icount;
759extern int use_icount;
760
761#define CPU_INTERRUPT_HARD 0x02
762#define CPU_INTERRUPT_EXITTB 0x04
763#define CPU_INTERRUPT_TIMER 0x08
764#define CPU_INTERRUPT_FIQ 0x10
765#define CPU_INTERRUPT_HALT 0x20
766#define CPU_INTERRUPT_SMI 0x40
767#define CPU_INTERRUPT_DEBUG 0x80
768#define CPU_INTERRUPT_VIRQ 0x100
769#define CPU_INTERRUPT_NMI 0x200
770#define CPU_INTERRUPT_INIT 0x400
771#define CPU_INTERRUPT_SIPI 0x800
772#define CPU_INTERRUPT_MCE 0x1000
773
774void cpu_interrupt(CPUState *s, int mask);
775void cpu_reset_interrupt(CPUState *env, int mask);
776
777void cpu_exit(CPUState *s);
778
779int qemu_cpu_has_work(CPUState *env);
780
781
782#define BP_MEM_READ 0x01
783#define BP_MEM_WRITE 0x02
784#define BP_MEM_ACCESS (BP_MEM_READ | BP_MEM_WRITE)
785#define BP_STOP_BEFORE_ACCESS 0x04
786#define BP_WATCHPOINT_HIT 0x08
787#define BP_GDB 0x10
788#define BP_CPU 0x20
789
790int cpu_breakpoint_insert(CPUState *env, target_ulong pc, int flags,
791 CPUBreakpoint **breakpoint);
792int cpu_breakpoint_remove(CPUState *env, target_ulong pc, int flags);
793void cpu_breakpoint_remove_by_ref(CPUState *env, CPUBreakpoint *breakpoint);
794void cpu_breakpoint_remove_all(CPUState *env, int mask);
795int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len,
796 int flags, CPUWatchpoint **watchpoint);
797int cpu_watchpoint_remove(CPUState *env, target_ulong addr,
798 target_ulong len, int flags);
799void cpu_watchpoint_remove_by_ref(CPUState *env, CPUWatchpoint *watchpoint);
800void cpu_watchpoint_remove_all(CPUState *env, int mask);
801
802#define SSTEP_ENABLE 0x1
803#define SSTEP_NOIRQ 0x2
804#define SSTEP_NOTIMER 0x4
805
806void cpu_single_step(CPUState *env, int enabled);
807void cpu_reset(CPUState *s);
808
809
810
811
812target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr);
813
814#define CPU_LOG_TB_OUT_ASM (1 << 0)
815#define CPU_LOG_TB_IN_ASM (1 << 1)
816#define CPU_LOG_TB_OP (1 << 2)
817#define CPU_LOG_TB_OP_OPT (1 << 3)
818#define CPU_LOG_INT (1 << 4)
819#define CPU_LOG_EXEC (1 << 5)
820#define CPU_LOG_PCALL (1 << 6)
821#define CPU_LOG_IOPORT (1 << 7)
822#define CPU_LOG_TB_CPU (1 << 8)
823#define CPU_LOG_RESET (1 << 9)
824
825
826typedef struct CPULogItem {
827 int mask;
828 const char *name;
829 const char *help;
830} CPULogItem;
831
832extern const CPULogItem cpu_log_items[];
833
834void cpu_set_log(int log_flags);
835void cpu_set_log_filename(const char *filename);
836int cpu_str_to_log_mask(const char *str);
837
838
839#include "ioport.h"
840
841
842
843extern int phys_ram_fd;
844extern uint8_t *phys_ram_dirty;
845extern ram_addr_t ram_size;
846extern ram_addr_t last_ram_offset;
847
848
849
850
851
852
853
854#define IO_MEM_NB_ENTRIES (1 << (TARGET_PAGE_BITS - IO_MEM_SHIFT))
855
856
857
858
859#define TLB_INVALID_MASK (1 << 3)
860
861
862#define TLB_NOTDIRTY (1 << 4)
863
864#define TLB_MMIO (1 << 5)
865
866int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
867 uint8_t *buf, int len, int is_write);
868
869#define VGA_DIRTY_FLAG 0x01
870#define CODE_DIRTY_FLAG 0x02
871#define KQEMU_DIRTY_FLAG 0x04
872#define MIGRATION_DIRTY_FLAG 0x08
873
874
875static inline int cpu_physical_memory_is_dirty(ram_addr_t addr)
876{
877 return phys_ram_dirty[addr >> TARGET_PAGE_BITS] == 0xff;
878}
879
880static inline int cpu_physical_memory_get_dirty(ram_addr_t addr,
881 int dirty_flags)
882{
883 return phys_ram_dirty[addr >> TARGET_PAGE_BITS] & dirty_flags;
884}
885
886static inline void cpu_physical_memory_set_dirty(ram_addr_t addr)
887{
888 phys_ram_dirty[addr >> TARGET_PAGE_BITS] = 0xff;
889}
890
891void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
892 int dirty_flags);
893void cpu_tlb_update_dirty(CPUState *env);
894
895int cpu_physical_memory_set_dirty_tracking(int enable);
896
897int cpu_physical_memory_get_dirty_tracking(void);
898
899int cpu_physical_sync_dirty_bitmap(target_phys_addr_t start_addr,
900 target_phys_addr_t end_addr);
901
902void dump_exec_info(FILE *f,
903 int (*cpu_fprintf)(FILE *f, const char *fmt, ...));
904
905
906
907
908
909
910void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
911
912void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
913
914
915
916
917#if defined(_ARCH_PPC)
918
919static inline int64_t cpu_get_real_ticks(void)
920{
921 int64_t retval;
922#ifdef _ARCH_PPC64
923
924
925
926 __asm__ __volatile__ (
927 "mftb %0\n\t"
928 "cmpwi %0,0\n\t"
929 "beq- $-8"
930 : "=r" (retval));
931#else
932
933 unsigned long junk;
934 __asm__ __volatile__ (
935 "mftbu %1\n\t"
936 "mftb %L0\n\t"
937 "mftbu %0\n\t"
938 "cmpw %0,%1\n\t"
939 "bne $-16"
940 : "=r" (retval), "=r" (junk));
941#endif
942 return retval;
943}
944
945#elif defined(__i386__)
946
947static inline int64_t cpu_get_real_ticks(void)
948{
949 int64_t val;
950 asm volatile ("rdtsc" : "=A" (val));
951 return val;
952}
953
954#elif defined(__x86_64__)
955
956static inline int64_t cpu_get_real_ticks(void)
957{
958 uint32_t low,high;
959 int64_t val;
960 asm volatile("rdtsc" : "=a" (low), "=d" (high));
961 val = high;
962 val <<= 32;
963 val |= low;
964 return val;
965}
966
967#elif defined(__hppa__)
968
969static inline int64_t cpu_get_real_ticks(void)
970{
971 int val;
972 asm volatile ("mfctl %%cr16, %0" : "=r"(val));
973 return val;
974}
975
976#elif defined(__ia64)
977
978static inline int64_t cpu_get_real_ticks(void)
979{
980 int64_t val;
981 asm volatile ("mov %0 = ar.itc" : "=r"(val) :: "memory");
982 return val;
983}
984
985#elif defined(__s390__)
986
987static inline int64_t cpu_get_real_ticks(void)
988{
989 int64_t val;
990 asm volatile("stck 0(%1)" : "=m" (val) : "a" (&val) : "cc");
991 return val;
992}
993
994#elif defined(__sparc_v8plus__) || defined(__sparc_v8plusa__) || defined(__sparc_v9__)
995
996static inline int64_t cpu_get_real_ticks (void)
997{
998#if defined(_LP64)
999 uint64_t rval;
1000 asm volatile("rd %%tick,%0" : "=r"(rval));
1001 return rval;
1002#else
1003 union {
1004 uint64_t i64;
1005 struct {
1006 uint32_t high;
1007 uint32_t low;
1008 } i32;
1009 } rval;
1010 asm volatile("rd %%tick,%1; srlx %1,32,%0"
1011 : "=r"(rval.i32.high), "=r"(rval.i32.low));
1012 return rval.i64;
1013#endif
1014}
1015
1016#elif defined(__mips__)
1017
1018static inline int64_t cpu_get_real_ticks(void)
1019{
1020#if __mips_isa_rev >= 2
1021 uint32_t count;
1022 static uint32_t cyc_per_count = 0;
1023
1024 if (!cyc_per_count)
1025 __asm__ __volatile__("rdhwr %0, $3" : "=r" (cyc_per_count));
1026
1027 __asm__ __volatile__("rdhwr %1, $2" : "=r" (count));
1028 return (int64_t)(count * cyc_per_count);
1029#else
1030
1031 static int64_t ticks = 0;
1032 return ticks++;
1033#endif
1034}
1035
1036#else
1037
1038
1039
1040static inline int64_t cpu_get_real_ticks (void)
1041{
1042 static int64_t ticks = 0;
1043 return ticks++;
1044}
1045#endif
1046
1047
1048#ifdef CONFIG_PROFILER
1049static inline int64_t profile_getclock(void)
1050{
1051 return cpu_get_real_ticks();
1052}
1053
1054extern int64_t kqemu_time, kqemu_time_start;
1055extern int64_t qemu_time, qemu_time_start;
1056extern int64_t tlb_flush_time;
1057extern int64_t kqemu_exec_count;
1058extern int64_t dev_time;
1059extern int64_t kqemu_ret_int_count;
1060extern int64_t kqemu_ret_excp_count;
1061extern int64_t kqemu_ret_intr_count;
1062#endif
1063
1064void cpu_inject_x86_mce(CPUState *cenv, int bank, uint64_t status,
1065 uint64_t mcg_status, uint64_t addr, uint64_t misc);
1066
1067#endif
1068