]> git.proxmox.com Git - mirror_qemu.git/blob - exec.c
s390: Detect invalid invocations of qemu_ram_free/remap
[mirror_qemu.git] / exec.c
1 /*
2 * virtual page mapping and translated block handling
3 *
4 * Copyright (c) 2003 Fabrice Bellard
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 */
19 #include "config.h"
20 #ifdef _WIN32
21 #include <windows.h>
22 #else
23 #include <sys/types.h>
24 #include <sys/mman.h>
25 #endif
26
27 #include "qemu-common.h"
28 #include "cpu.h"
29 #include "exec-all.h"
30 #include "tcg.h"
31 #include "hw/hw.h"
32 #include "hw/qdev.h"
33 #include "osdep.h"
34 #include "kvm.h"
35 #include "qemu-timer.h"
36 #if defined(CONFIG_USER_ONLY)
37 #include <qemu.h>
38 #include <signal.h>
39 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
40 #include <sys/param.h>
41 #if __FreeBSD_version >= 700104
42 #define HAVE_KINFO_GETVMMAP
43 #define sigqueue sigqueue_freebsd /* avoid redefinition */
44 #include <sys/time.h>
45 #include <sys/proc.h>
46 #include <machine/profile.h>
47 #define _KERNEL
48 #include <sys/user.h>
49 #undef _KERNEL
50 #undef sigqueue
51 #include <libutil.h>
52 #endif
53 #endif
54 #endif
55
56 //#define DEBUG_TB_INVALIDATE
57 //#define DEBUG_FLUSH
58 //#define DEBUG_TLB
59 //#define DEBUG_UNASSIGNED
60
61 /* make various TB consistency checks */
62 //#define DEBUG_TB_CHECK
63 //#define DEBUG_TLB_CHECK
64
65 //#define DEBUG_IOPORT
66 //#define DEBUG_SUBPAGE
67
68 #if !defined(CONFIG_USER_ONLY)
69 /* TB consistency checks only implemented for usermode emulation. */
70 #undef DEBUG_TB_CHECK
71 #endif
72
73 #define SMC_BITMAP_USE_THRESHOLD 10
74
75 static TranslationBlock *tbs;
76 static int code_gen_max_blocks;
77 TranslationBlock *tb_phys_hash[CODE_GEN_PHYS_HASH_SIZE];
78 static int nb_tbs;
79 /* any access to the tbs or the page table must use this lock */
80 spinlock_t tb_lock = SPIN_LOCK_UNLOCKED;
81
82 #if defined(__arm__) || defined(__sparc_v9__)
83 /* The prologue must be reachable with a direct jump. ARM and Sparc64
84 have limited branch ranges (possibly also PPC) so place it in a
85 section close to code segment. */
86 #define code_gen_section \
87 __attribute__((__section__(".gen_code"))) \
88 __attribute__((aligned (32)))
89 #elif defined(_WIN32)
90 /* Maximum alignment for Win32 is 16. */
91 #define code_gen_section \
92 __attribute__((aligned (16)))
93 #else
94 #define code_gen_section \
95 __attribute__((aligned (32)))
96 #endif
97
98 uint8_t code_gen_prologue[1024] code_gen_section;
99 static uint8_t *code_gen_buffer;
100 static unsigned long code_gen_buffer_size;
101 /* threshold to flush the translated code buffer */
102 static unsigned long code_gen_buffer_max_size;
103 static uint8_t *code_gen_ptr;
104
105 #if !defined(CONFIG_USER_ONLY)
106 int phys_ram_fd;
107 static int in_migration;
108
109 RAMList ram_list = { .blocks = QLIST_HEAD_INITIALIZER(ram_list) };
110 #endif
111
112 CPUState *first_cpu;
113 /* current CPU in the current thread. It is only valid inside
114 cpu_exec() */
115 CPUState *cpu_single_env;
116 /* 0 = Do not count executed instructions.
117 1 = Precise instruction counting.
118 2 = Adaptive rate instruction counting. */
119 int use_icount = 0;
120 /* Current instruction counter. While executing translated code this may
121 include some instructions that have not yet been executed. */
122 int64_t qemu_icount;
123
124 typedef struct PageDesc {
125 /* list of TBs intersecting this ram page */
126 TranslationBlock *first_tb;
127 /* in order to optimize self modifying code, we count the number
128 of lookups we do to a given page to use a bitmap */
129 unsigned int code_write_count;
130 uint8_t *code_bitmap;
131 #if defined(CONFIG_USER_ONLY)
132 unsigned long flags;
133 #endif
134 } PageDesc;
135
136 /* In system mode we want L1_MAP to be based on ram offsets,
137 while in user mode we want it to be based on virtual addresses. */
138 #if !defined(CONFIG_USER_ONLY)
139 #if HOST_LONG_BITS < TARGET_PHYS_ADDR_SPACE_BITS
140 # define L1_MAP_ADDR_SPACE_BITS HOST_LONG_BITS
141 #else
142 # define L1_MAP_ADDR_SPACE_BITS TARGET_PHYS_ADDR_SPACE_BITS
143 #endif
144 #else
145 # define L1_MAP_ADDR_SPACE_BITS TARGET_VIRT_ADDR_SPACE_BITS
146 #endif
147
148 /* Size of the L2 (and L3, etc) page tables. */
149 #define L2_BITS 10
150 #define L2_SIZE (1 << L2_BITS)
151
152 /* The bits remaining after N lower levels of page tables. */
153 #define P_L1_BITS_REM \
154 ((TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS)
155 #define V_L1_BITS_REM \
156 ((L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS)
157
158 /* Size of the L1 page table. Avoid silly small sizes. */
159 #if P_L1_BITS_REM < 4
160 #define P_L1_BITS (P_L1_BITS_REM + L2_BITS)
161 #else
162 #define P_L1_BITS P_L1_BITS_REM
163 #endif
164
165 #if V_L1_BITS_REM < 4
166 #define V_L1_BITS (V_L1_BITS_REM + L2_BITS)
167 #else
168 #define V_L1_BITS V_L1_BITS_REM
169 #endif
170
171 #define P_L1_SIZE ((target_phys_addr_t)1 << P_L1_BITS)
172 #define V_L1_SIZE ((target_ulong)1 << V_L1_BITS)
173
174 #define P_L1_SHIFT (TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS - P_L1_BITS)
175 #define V_L1_SHIFT (L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS - V_L1_BITS)
176
177 unsigned long qemu_real_host_page_size;
178 unsigned long qemu_host_page_bits;
179 unsigned long qemu_host_page_size;
180 unsigned long qemu_host_page_mask;
181
182 /* This is a multi-level map on the virtual address space.
183 The bottom level has pointers to PageDesc. */
184 static void *l1_map[V_L1_SIZE];
185
186 #if !defined(CONFIG_USER_ONLY)
187 typedef struct PhysPageDesc {
188 /* offset in host memory of the page + io_index in the low bits */
189 ram_addr_t phys_offset;
190 ram_addr_t region_offset;
191 } PhysPageDesc;
192
193 /* This is a multi-level map on the physical address space.
194 The bottom level has pointers to PhysPageDesc. */
195 static void *l1_phys_map[P_L1_SIZE];
196
197 static void io_mem_init(void);
198
199 /* io memory support */
200 CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4];
201 CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4];
202 void *io_mem_opaque[IO_MEM_NB_ENTRIES];
203 static char io_mem_used[IO_MEM_NB_ENTRIES];
204 static int io_mem_watch;
205 #endif
206
207 /* log support */
208 #ifdef WIN32
209 static const char *logfilename = "qemu.log";
210 #else
211 static const char *logfilename = "/tmp/qemu.log";
212 #endif
213 FILE *logfile;
214 int loglevel;
215 static int log_append = 0;
216
217 /* statistics */
218 #if !defined(CONFIG_USER_ONLY)
219 static int tlb_flush_count;
220 #endif
221 static int tb_flush_count;
222 static int tb_phys_invalidate_count;
223
224 #ifdef _WIN32
225 static void map_exec(void *addr, long size)
226 {
227 DWORD old_protect;
228 VirtualProtect(addr, size,
229 PAGE_EXECUTE_READWRITE, &old_protect);
230
231 }
232 #else
233 static void map_exec(void *addr, long size)
234 {
235 unsigned long start, end, page_size;
236
237 page_size = getpagesize();
238 start = (unsigned long)addr;
239 start &= ~(page_size - 1);
240
241 end = (unsigned long)addr + size;
242 end += page_size - 1;
243 end &= ~(page_size - 1);
244
245 mprotect((void *)start, end - start,
246 PROT_READ | PROT_WRITE | PROT_EXEC);
247 }
248 #endif
249
250 static void page_init(void)
251 {
252 /* NOTE: we can always suppose that qemu_host_page_size >=
253 TARGET_PAGE_SIZE */
254 #ifdef _WIN32
255 {
256 SYSTEM_INFO system_info;
257
258 GetSystemInfo(&system_info);
259 qemu_real_host_page_size = system_info.dwPageSize;
260 }
261 #else
262 qemu_real_host_page_size = getpagesize();
263 #endif
264 if (qemu_host_page_size == 0)
265 qemu_host_page_size = qemu_real_host_page_size;
266 if (qemu_host_page_size < TARGET_PAGE_SIZE)
267 qemu_host_page_size = TARGET_PAGE_SIZE;
268 qemu_host_page_bits = 0;
269 while ((1 << qemu_host_page_bits) < qemu_host_page_size)
270 qemu_host_page_bits++;
271 qemu_host_page_mask = ~(qemu_host_page_size - 1);
272
273 #if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
274 {
275 #ifdef HAVE_KINFO_GETVMMAP
276 struct kinfo_vmentry *freep;
277 int i, cnt;
278
279 freep = kinfo_getvmmap(getpid(), &cnt);
280 if (freep) {
281 mmap_lock();
282 for (i = 0; i < cnt; i++) {
283 unsigned long startaddr, endaddr;
284
285 startaddr = freep[i].kve_start;
286 endaddr = freep[i].kve_end;
287 if (h2g_valid(startaddr)) {
288 startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
289
290 if (h2g_valid(endaddr)) {
291 endaddr = h2g(endaddr);
292 page_set_flags(startaddr, endaddr, PAGE_RESERVED);
293 } else {
294 #if TARGET_ABI_BITS <= L1_MAP_ADDR_SPACE_BITS
295 endaddr = ~0ul;
296 page_set_flags(startaddr, endaddr, PAGE_RESERVED);
297 #endif
298 }
299 }
300 }
301 free(freep);
302 mmap_unlock();
303 }
304 #else
305 FILE *f;
306
307 last_brk = (unsigned long)sbrk(0);
308
309 f = fopen("/compat/linux/proc/self/maps", "r");
310 if (f) {
311 mmap_lock();
312
313 do {
314 unsigned long startaddr, endaddr;
315 int n;
316
317 n = fscanf (f, "%lx-%lx %*[^\n]\n", &startaddr, &endaddr);
318
319 if (n == 2 && h2g_valid(startaddr)) {
320 startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
321
322 if (h2g_valid(endaddr)) {
323 endaddr = h2g(endaddr);
324 } else {
325 endaddr = ~0ul;
326 }
327 page_set_flags(startaddr, endaddr, PAGE_RESERVED);
328 }
329 } while (!feof(f));
330
331 fclose(f);
332 mmap_unlock();
333 }
334 #endif
335 }
336 #endif
337 }
338
339 static PageDesc *page_find_alloc(tb_page_addr_t index, int alloc)
340 {
341 PageDesc *pd;
342 void **lp;
343 int i;
344
345 #if defined(CONFIG_USER_ONLY)
346 /* We can't use qemu_malloc because it may recurse into a locked mutex. */
347 # define ALLOC(P, SIZE) \
348 do { \
349 P = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, \
350 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); \
351 } while (0)
352 #else
353 # define ALLOC(P, SIZE) \
354 do { P = qemu_mallocz(SIZE); } while (0)
355 #endif
356
357 /* Level 1. Always allocated. */
358 lp = l1_map + ((index >> V_L1_SHIFT) & (V_L1_SIZE - 1));
359
360 /* Level 2..N-1. */
361 for (i = V_L1_SHIFT / L2_BITS - 1; i > 0; i--) {
362 void **p = *lp;
363
364 if (p == NULL) {
365 if (!alloc) {
366 return NULL;
367 }
368 ALLOC(p, sizeof(void *) * L2_SIZE);
369 *lp = p;
370 }
371
372 lp = p + ((index >> (i * L2_BITS)) & (L2_SIZE - 1));
373 }
374
375 pd = *lp;
376 if (pd == NULL) {
377 if (!alloc) {
378 return NULL;
379 }
380 ALLOC(pd, sizeof(PageDesc) * L2_SIZE);
381 *lp = pd;
382 }
383
384 #undef ALLOC
385
386 return pd + (index & (L2_SIZE - 1));
387 }
388
389 static inline PageDesc *page_find(tb_page_addr_t index)
390 {
391 return page_find_alloc(index, 0);
392 }
393
394 #if !defined(CONFIG_USER_ONLY)
395 static PhysPageDesc *phys_page_find_alloc(target_phys_addr_t index, int alloc)
396 {
397 PhysPageDesc *pd;
398 void **lp;
399 int i;
400
401 /* Level 1. Always allocated. */
402 lp = l1_phys_map + ((index >> P_L1_SHIFT) & (P_L1_SIZE - 1));
403
404 /* Level 2..N-1. */
405 for (i = P_L1_SHIFT / L2_BITS - 1; i > 0; i--) {
406 void **p = *lp;
407 if (p == NULL) {
408 if (!alloc) {
409 return NULL;
410 }
411 *lp = p = qemu_mallocz(sizeof(void *) * L2_SIZE);
412 }
413 lp = p + ((index >> (i * L2_BITS)) & (L2_SIZE - 1));
414 }
415
416 pd = *lp;
417 if (pd == NULL) {
418 int i;
419
420 if (!alloc) {
421 return NULL;
422 }
423
424 *lp = pd = qemu_malloc(sizeof(PhysPageDesc) * L2_SIZE);
425
426 for (i = 0; i < L2_SIZE; i++) {
427 pd[i].phys_offset = IO_MEM_UNASSIGNED;
428 pd[i].region_offset = (index + i) << TARGET_PAGE_BITS;
429 }
430 }
431
432 return pd + (index & (L2_SIZE - 1));
433 }
434
435 static inline PhysPageDesc *phys_page_find(target_phys_addr_t index)
436 {
437 return phys_page_find_alloc(index, 0);
438 }
439
440 static void tlb_protect_code(ram_addr_t ram_addr);
441 static void tlb_unprotect_code_phys(CPUState *env, ram_addr_t ram_addr,
442 target_ulong vaddr);
443 #define mmap_lock() do { } while(0)
444 #define mmap_unlock() do { } while(0)
445 #endif
446
447 #define DEFAULT_CODE_GEN_BUFFER_SIZE (32 * 1024 * 1024)
448
449 #if defined(CONFIG_USER_ONLY)
450 /* Currently it is not recommended to allocate big chunks of data in
451 user mode. It will change when a dedicated libc will be used */
452 #define USE_STATIC_CODE_GEN_BUFFER
453 #endif
454
455 #ifdef USE_STATIC_CODE_GEN_BUFFER
456 static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE]
457 __attribute__((aligned (CODE_GEN_ALIGN)));
458 #endif
459
460 static void code_gen_alloc(unsigned long tb_size)
461 {
462 #ifdef USE_STATIC_CODE_GEN_BUFFER
463 code_gen_buffer = static_code_gen_buffer;
464 code_gen_buffer_size = DEFAULT_CODE_GEN_BUFFER_SIZE;
465 map_exec(code_gen_buffer, code_gen_buffer_size);
466 #else
467 code_gen_buffer_size = tb_size;
468 if (code_gen_buffer_size == 0) {
469 #if defined(CONFIG_USER_ONLY)
470 /* in user mode, phys_ram_size is not meaningful */
471 code_gen_buffer_size = DEFAULT_CODE_GEN_BUFFER_SIZE;
472 #else
473 /* XXX: needs adjustments */
474 code_gen_buffer_size = (unsigned long)(ram_size / 4);
475 #endif
476 }
477 if (code_gen_buffer_size < MIN_CODE_GEN_BUFFER_SIZE)
478 code_gen_buffer_size = MIN_CODE_GEN_BUFFER_SIZE;
479 /* The code gen buffer location may have constraints depending on
480 the host cpu and OS */
481 #if defined(__linux__)
482 {
483 int flags;
484 void *start = NULL;
485
486 flags = MAP_PRIVATE | MAP_ANONYMOUS;
487 #if defined(__x86_64__)
488 flags |= MAP_32BIT;
489 /* Cannot map more than that */
490 if (code_gen_buffer_size > (800 * 1024 * 1024))
491 code_gen_buffer_size = (800 * 1024 * 1024);
492 #elif defined(__sparc_v9__)
493 // Map the buffer below 2G, so we can use direct calls and branches
494 flags |= MAP_FIXED;
495 start = (void *) 0x60000000UL;
496 if (code_gen_buffer_size > (512 * 1024 * 1024))
497 code_gen_buffer_size = (512 * 1024 * 1024);
498 #elif defined(__arm__)
499 /* Map the buffer below 32M, so we can use direct calls and branches */
500 flags |= MAP_FIXED;
501 start = (void *) 0x01000000UL;
502 if (code_gen_buffer_size > 16 * 1024 * 1024)
503 code_gen_buffer_size = 16 * 1024 * 1024;
504 #elif defined(__s390x__)
505 /* Map the buffer so that we can use direct calls and branches. */
506 /* We have a +- 4GB range on the branches; leave some slop. */
507 if (code_gen_buffer_size > (3ul * 1024 * 1024 * 1024)) {
508 code_gen_buffer_size = 3ul * 1024 * 1024 * 1024;
509 }
510 start = (void *)0x90000000UL;
511 #endif
512 code_gen_buffer = mmap(start, code_gen_buffer_size,
513 PROT_WRITE | PROT_READ | PROT_EXEC,
514 flags, -1, 0);
515 if (code_gen_buffer == MAP_FAILED) {
516 fprintf(stderr, "Could not allocate dynamic translator buffer\n");
517 exit(1);
518 }
519 }
520 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \
521 || defined(__DragonFly__) || defined(__OpenBSD__)
522 {
523 int flags;
524 void *addr = NULL;
525 flags = MAP_PRIVATE | MAP_ANONYMOUS;
526 #if defined(__x86_64__)
527 /* FreeBSD doesn't have MAP_32BIT, use MAP_FIXED and assume
528 * 0x40000000 is free */
529 flags |= MAP_FIXED;
530 addr = (void *)0x40000000;
531 /* Cannot map more than that */
532 if (code_gen_buffer_size > (800 * 1024 * 1024))
533 code_gen_buffer_size = (800 * 1024 * 1024);
534 #elif defined(__sparc_v9__)
535 // Map the buffer below 2G, so we can use direct calls and branches
536 flags |= MAP_FIXED;
537 addr = (void *) 0x60000000UL;
538 if (code_gen_buffer_size > (512 * 1024 * 1024)) {
539 code_gen_buffer_size = (512 * 1024 * 1024);
540 }
541 #endif
542 code_gen_buffer = mmap(addr, code_gen_buffer_size,
543 PROT_WRITE | PROT_READ | PROT_EXEC,
544 flags, -1, 0);
545 if (code_gen_buffer == MAP_FAILED) {
546 fprintf(stderr, "Could not allocate dynamic translator buffer\n");
547 exit(1);
548 }
549 }
550 #else
551 code_gen_buffer = qemu_malloc(code_gen_buffer_size);
552 map_exec(code_gen_buffer, code_gen_buffer_size);
553 #endif
554 #endif /* !USE_STATIC_CODE_GEN_BUFFER */
555 map_exec(code_gen_prologue, sizeof(code_gen_prologue));
556 code_gen_buffer_max_size = code_gen_buffer_size -
557 (TCG_MAX_OP_SIZE * OPC_MAX_SIZE);
558 code_gen_max_blocks = code_gen_buffer_size / CODE_GEN_AVG_BLOCK_SIZE;
559 tbs = qemu_malloc(code_gen_max_blocks * sizeof(TranslationBlock));
560 }
561
562 /* Must be called before using the QEMU cpus. 'tb_size' is the size
563 (in bytes) allocated to the translation buffer. Zero means default
564 size. */
565 void cpu_exec_init_all(unsigned long tb_size)
566 {
567 cpu_gen_init();
568 code_gen_alloc(tb_size);
569 code_gen_ptr = code_gen_buffer;
570 page_init();
571 #if !defined(CONFIG_USER_ONLY)
572 io_mem_init();
573 #endif
574 #if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE)
575 /* There's no guest base to take into account, so go ahead and
576 initialize the prologue now. */
577 tcg_prologue_init(&tcg_ctx);
578 #endif
579 }
580
581 #if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
582
583 static int cpu_common_post_load(void *opaque, int version_id)
584 {
585 CPUState *env = opaque;
586
587 /* 0x01 was CPU_INTERRUPT_EXIT. This line can be removed when the
588 version_id is increased. */
589 env->interrupt_request &= ~0x01;
590 tlb_flush(env, 1);
591
592 return 0;
593 }
594
595 static const VMStateDescription vmstate_cpu_common = {
596 .name = "cpu_common",
597 .version_id = 1,
598 .minimum_version_id = 1,
599 .minimum_version_id_old = 1,
600 .post_load = cpu_common_post_load,
601 .fields = (VMStateField []) {
602 VMSTATE_UINT32(halted, CPUState),
603 VMSTATE_UINT32(interrupt_request, CPUState),
604 VMSTATE_END_OF_LIST()
605 }
606 };
607 #endif
608
609 CPUState *qemu_get_cpu(int cpu)
610 {
611 CPUState *env = first_cpu;
612
613 while (env) {
614 if (env->cpu_index == cpu)
615 break;
616 env = env->next_cpu;
617 }
618
619 return env;
620 }
621
622 void cpu_exec_init(CPUState *env)
623 {
624 CPUState **penv;
625 int cpu_index;
626
627 #if defined(CONFIG_USER_ONLY)
628 cpu_list_lock();
629 #endif
630 env->next_cpu = NULL;
631 penv = &first_cpu;
632 cpu_index = 0;
633 while (*penv != NULL) {
634 penv = &(*penv)->next_cpu;
635 cpu_index++;
636 }
637 env->cpu_index = cpu_index;
638 env->numa_node = 0;
639 QTAILQ_INIT(&env->breakpoints);
640 QTAILQ_INIT(&env->watchpoints);
641 *penv = env;
642 #if defined(CONFIG_USER_ONLY)
643 cpu_list_unlock();
644 #endif
645 #if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
646 vmstate_register(NULL, cpu_index, &vmstate_cpu_common, env);
647 register_savevm(NULL, "cpu", cpu_index, CPU_SAVE_VERSION,
648 cpu_save, cpu_load, env);
649 #endif
650 }
651
652 /* Allocate a new translation block. Flush the translation buffer if
653 too many translation blocks or too much generated code. */
654 static TranslationBlock *tb_alloc(target_ulong pc)
655 {
656 TranslationBlock *tb;
657
658 if (nb_tbs >= code_gen_max_blocks ||
659 (code_gen_ptr - code_gen_buffer) >= code_gen_buffer_max_size)
660 return NULL;
661 tb = &tbs[nb_tbs++];
662 tb->pc = pc;
663 tb->cflags = 0;
664 return tb;
665 }
666
667 void tb_free(TranslationBlock *tb)
668 {
669 /* In practice this is mostly used for single use temporary TB
670 Ignore the hard cases and just back up if this TB happens to
671 be the last one generated. */
672 if (nb_tbs > 0 && tb == &tbs[nb_tbs - 1]) {
673 code_gen_ptr = tb->tc_ptr;
674 nb_tbs--;
675 }
676 }
677
678 static inline void invalidate_page_bitmap(PageDesc *p)
679 {
680 if (p->code_bitmap) {
681 qemu_free(p->code_bitmap);
682 p->code_bitmap = NULL;
683 }
684 p->code_write_count = 0;
685 }
686
687 /* Set to NULL all the 'first_tb' fields in all PageDescs. */
688
689 static void page_flush_tb_1 (int level, void **lp)
690 {
691 int i;
692
693 if (*lp == NULL) {
694 return;
695 }
696 if (level == 0) {
697 PageDesc *pd = *lp;
698 for (i = 0; i < L2_SIZE; ++i) {
699 pd[i].first_tb = NULL;
700 invalidate_page_bitmap(pd + i);
701 }
702 } else {
703 void **pp = *lp;
704 for (i = 0; i < L2_SIZE; ++i) {
705 page_flush_tb_1 (level - 1, pp + i);
706 }
707 }
708 }
709
710 static void page_flush_tb(void)
711 {
712 int i;
713 for (i = 0; i < V_L1_SIZE; i++) {
714 page_flush_tb_1(V_L1_SHIFT / L2_BITS - 1, l1_map + i);
715 }
716 }
717
718 /* flush all the translation blocks */
719 /* XXX: tb_flush is currently not thread safe */
720 void tb_flush(CPUState *env1)
721 {
722 CPUState *env;
723 #if defined(DEBUG_FLUSH)
724 printf("qemu: flush code_size=%ld nb_tbs=%d avg_tb_size=%ld\n",
725 (unsigned long)(code_gen_ptr - code_gen_buffer),
726 nb_tbs, nb_tbs > 0 ?
727 ((unsigned long)(code_gen_ptr - code_gen_buffer)) / nb_tbs : 0);
728 #endif
729 if ((unsigned long)(code_gen_ptr - code_gen_buffer) > code_gen_buffer_size)
730 cpu_abort(env1, "Internal error: code buffer overflow\n");
731
732 nb_tbs = 0;
733
734 for(env = first_cpu; env != NULL; env = env->next_cpu) {
735 memset (env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof (void *));
736 }
737
738 memset (tb_phys_hash, 0, CODE_GEN_PHYS_HASH_SIZE * sizeof (void *));
739 page_flush_tb();
740
741 code_gen_ptr = code_gen_buffer;
742 /* XXX: flush processor icache at this point if cache flush is
743 expensive */
744 tb_flush_count++;
745 }
746
747 #ifdef DEBUG_TB_CHECK
748
749 static void tb_invalidate_check(target_ulong address)
750 {
751 TranslationBlock *tb;
752 int i;
753 address &= TARGET_PAGE_MASK;
754 for(i = 0;i < CODE_GEN_PHYS_HASH_SIZE; i++) {
755 for(tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) {
756 if (!(address + TARGET_PAGE_SIZE <= tb->pc ||
757 address >= tb->pc + tb->size)) {
758 printf("ERROR invalidate: address=" TARGET_FMT_lx
759 " PC=%08lx size=%04x\n",
760 address, (long)tb->pc, tb->size);
761 }
762 }
763 }
764 }
765
766 /* verify that all the pages have correct rights for code */
767 static void tb_page_check(void)
768 {
769 TranslationBlock *tb;
770 int i, flags1, flags2;
771
772 for(i = 0;i < CODE_GEN_PHYS_HASH_SIZE; i++) {
773 for(tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) {
774 flags1 = page_get_flags(tb->pc);
775 flags2 = page_get_flags(tb->pc + tb->size - 1);
776 if ((flags1 & PAGE_WRITE) || (flags2 & PAGE_WRITE)) {
777 printf("ERROR page flags: PC=%08lx size=%04x f1=%x f2=%x\n",
778 (long)tb->pc, tb->size, flags1, flags2);
779 }
780 }
781 }
782 }
783
784 #endif
785
786 /* invalidate one TB */
787 static inline void tb_remove(TranslationBlock **ptb, TranslationBlock *tb,
788 int next_offset)
789 {
790 TranslationBlock *tb1;
791 for(;;) {
792 tb1 = *ptb;
793 if (tb1 == tb) {
794 *ptb = *(TranslationBlock **)((char *)tb1 + next_offset);
795 break;
796 }
797 ptb = (TranslationBlock **)((char *)tb1 + next_offset);
798 }
799 }
800
801 static inline void tb_page_remove(TranslationBlock **ptb, TranslationBlock *tb)
802 {
803 TranslationBlock *tb1;
804 unsigned int n1;
805
806 for(;;) {
807 tb1 = *ptb;
808 n1 = (long)tb1 & 3;
809 tb1 = (TranslationBlock *)((long)tb1 & ~3);
810 if (tb1 == tb) {
811 *ptb = tb1->page_next[n1];
812 break;
813 }
814 ptb = &tb1->page_next[n1];
815 }
816 }
817
818 static inline void tb_jmp_remove(TranslationBlock *tb, int n)
819 {
820 TranslationBlock *tb1, **ptb;
821 unsigned int n1;
822
823 ptb = &tb->jmp_next[n];
824 tb1 = *ptb;
825 if (tb1) {
826 /* find tb(n) in circular list */
827 for(;;) {
828 tb1 = *ptb;
829 n1 = (long)tb1 & 3;
830 tb1 = (TranslationBlock *)((long)tb1 & ~3);
831 if (n1 == n && tb1 == tb)
832 break;
833 if (n1 == 2) {
834 ptb = &tb1->jmp_first;
835 } else {
836 ptb = &tb1->jmp_next[n1];
837 }
838 }
839 /* now we can suppress tb(n) from the list */
840 *ptb = tb->jmp_next[n];
841
842 tb->jmp_next[n] = NULL;
843 }
844 }
845
846 /* reset the jump entry 'n' of a TB so that it is not chained to
847 another TB */
848 static inline void tb_reset_jump(TranslationBlock *tb, int n)
849 {
850 tb_set_jmp_target(tb, n, (unsigned long)(tb->tc_ptr + tb->tb_next_offset[n]));
851 }
852
853 void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr)
854 {
855 CPUState *env;
856 PageDesc *p;
857 unsigned int h, n1;
858 tb_page_addr_t phys_pc;
859 TranslationBlock *tb1, *tb2;
860
861 /* remove the TB from the hash list */
862 phys_pc = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
863 h = tb_phys_hash_func(phys_pc);
864 tb_remove(&tb_phys_hash[h], tb,
865 offsetof(TranslationBlock, phys_hash_next));
866
867 /* remove the TB from the page list */
868 if (tb->page_addr[0] != page_addr) {
869 p = page_find(tb->page_addr[0] >> TARGET_PAGE_BITS);
870 tb_page_remove(&p->first_tb, tb);
871 invalidate_page_bitmap(p);
872 }
873 if (tb->page_addr[1] != -1 && tb->page_addr[1] != page_addr) {
874 p = page_find(tb->page_addr[1] >> TARGET_PAGE_BITS);
875 tb_page_remove(&p->first_tb, tb);
876 invalidate_page_bitmap(p);
877 }
878
879 tb_invalidated_flag = 1;
880
881 /* remove the TB from the hash list */
882 h = tb_jmp_cache_hash_func(tb->pc);
883 for(env = first_cpu; env != NULL; env = env->next_cpu) {
884 if (env->tb_jmp_cache[h] == tb)
885 env->tb_jmp_cache[h] = NULL;
886 }
887
888 /* suppress this TB from the two jump lists */
889 tb_jmp_remove(tb, 0);
890 tb_jmp_remove(tb, 1);
891
892 /* suppress any remaining jumps to this TB */
893 tb1 = tb->jmp_first;
894 for(;;) {
895 n1 = (long)tb1 & 3;
896 if (n1 == 2)
897 break;
898 tb1 = (TranslationBlock *)((long)tb1 & ~3);
899 tb2 = tb1->jmp_next[n1];
900 tb_reset_jump(tb1, n1);
901 tb1->jmp_next[n1] = NULL;
902 tb1 = tb2;
903 }
904 tb->jmp_first = (TranslationBlock *)((long)tb | 2); /* fail safe */
905
906 tb_phys_invalidate_count++;
907 }
908
909 static inline void set_bits(uint8_t *tab, int start, int len)
910 {
911 int end, mask, end1;
912
913 end = start + len;
914 tab += start >> 3;
915 mask = 0xff << (start & 7);
916 if ((start & ~7) == (end & ~7)) {
917 if (start < end) {
918 mask &= ~(0xff << (end & 7));
919 *tab |= mask;
920 }
921 } else {
922 *tab++ |= mask;
923 start = (start + 8) & ~7;
924 end1 = end & ~7;
925 while (start < end1) {
926 *tab++ = 0xff;
927 start += 8;
928 }
929 if (start < end) {
930 mask = ~(0xff << (end & 7));
931 *tab |= mask;
932 }
933 }
934 }
935
936 static void build_page_bitmap(PageDesc *p)
937 {
938 int n, tb_start, tb_end;
939 TranslationBlock *tb;
940
941 p->code_bitmap = qemu_mallocz(TARGET_PAGE_SIZE / 8);
942
943 tb = p->first_tb;
944 while (tb != NULL) {
945 n = (long)tb & 3;
946 tb = (TranslationBlock *)((long)tb & ~3);
947 /* NOTE: this is subtle as a TB may span two physical pages */
948 if (n == 0) {
949 /* NOTE: tb_end may be after the end of the page, but
950 it is not a problem */
951 tb_start = tb->pc & ~TARGET_PAGE_MASK;
952 tb_end = tb_start + tb->size;
953 if (tb_end > TARGET_PAGE_SIZE)
954 tb_end = TARGET_PAGE_SIZE;
955 } else {
956 tb_start = 0;
957 tb_end = ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
958 }
959 set_bits(p->code_bitmap, tb_start, tb_end - tb_start);
960 tb = tb->page_next[n];
961 }
962 }
963
964 TranslationBlock *tb_gen_code(CPUState *env,
965 target_ulong pc, target_ulong cs_base,
966 int flags, int cflags)
967 {
968 TranslationBlock *tb;
969 uint8_t *tc_ptr;
970 tb_page_addr_t phys_pc, phys_page2;
971 target_ulong virt_page2;
972 int code_gen_size;
973
974 phys_pc = get_page_addr_code(env, pc);
975 tb = tb_alloc(pc);
976 if (!tb) {
977 /* flush must be done */
978 tb_flush(env);
979 /* cannot fail at this point */
980 tb = tb_alloc(pc);
981 /* Don't forget to invalidate previous TB info. */
982 tb_invalidated_flag = 1;
983 }
984 tc_ptr = code_gen_ptr;
985 tb->tc_ptr = tc_ptr;
986 tb->cs_base = cs_base;
987 tb->flags = flags;
988 tb->cflags = cflags;
989 cpu_gen_code(env, tb, &code_gen_size);
990 code_gen_ptr = (void *)(((unsigned long)code_gen_ptr + code_gen_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
991
992 /* check next page if needed */
993 virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
994 phys_page2 = -1;
995 if ((pc & TARGET_PAGE_MASK) != virt_page2) {
996 phys_page2 = get_page_addr_code(env, virt_page2);
997 }
998 tb_link_page(tb, phys_pc, phys_page2);
999 return tb;
1000 }
1001
1002 /* invalidate all TBs which intersect with the target physical page
1003 starting in range [start;end[. NOTE: start and end must refer to
1004 the same physical page. 'is_cpu_write_access' should be true if called
1005 from a real cpu write access: the virtual CPU will exit the current
1006 TB if code is modified inside this TB. */
1007 void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
1008 int is_cpu_write_access)
1009 {
1010 TranslationBlock *tb, *tb_next, *saved_tb;
1011 CPUState *env = cpu_single_env;
1012 tb_page_addr_t tb_start, tb_end;
1013 PageDesc *p;
1014 int n;
1015 #ifdef TARGET_HAS_PRECISE_SMC
1016 int current_tb_not_found = is_cpu_write_access;
1017 TranslationBlock *current_tb = NULL;
1018 int current_tb_modified = 0;
1019 target_ulong current_pc = 0;
1020 target_ulong current_cs_base = 0;
1021 int current_flags = 0;
1022 #endif /* TARGET_HAS_PRECISE_SMC */
1023
1024 p = page_find(start >> TARGET_PAGE_BITS);
1025 if (!p)
1026 return;
1027 if (!p->code_bitmap &&
1028 ++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD &&
1029 is_cpu_write_access) {
1030 /* build code bitmap */
1031 build_page_bitmap(p);
1032 }
1033
1034 /* we remove all the TBs in the range [start, end[ */
1035 /* XXX: see if in some cases it could be faster to invalidate all the code */
1036 tb = p->first_tb;
1037 while (tb != NULL) {
1038 n = (long)tb & 3;
1039 tb = (TranslationBlock *)((long)tb & ~3);
1040 tb_next = tb->page_next[n];
1041 /* NOTE: this is subtle as a TB may span two physical pages */
1042 if (n == 0) {
1043 /* NOTE: tb_end may be after the end of the page, but
1044 it is not a problem */
1045 tb_start = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
1046 tb_end = tb_start + tb->size;
1047 } else {
1048 tb_start = tb->page_addr[1];
1049 tb_end = tb_start + ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
1050 }
1051 if (!(tb_end <= start || tb_start >= end)) {
1052 #ifdef TARGET_HAS_PRECISE_SMC
1053 if (current_tb_not_found) {
1054 current_tb_not_found = 0;
1055 current_tb = NULL;
1056 if (env->mem_io_pc) {
1057 /* now we have a real cpu fault */
1058 current_tb = tb_find_pc(env->mem_io_pc);
1059 }
1060 }
1061 if (current_tb == tb &&
1062 (current_tb->cflags & CF_COUNT_MASK) != 1) {
1063 /* If we are modifying the current TB, we must stop
1064 its execution. We could be more precise by checking
1065 that the modification is after the current PC, but it
1066 would require a specialized function to partially
1067 restore the CPU state */
1068
1069 current_tb_modified = 1;
1070 cpu_restore_state(current_tb, env,
1071 env->mem_io_pc, NULL);
1072 cpu_get_tb_cpu_state(env, &current_pc, &current_cs_base,
1073 &current_flags);
1074 }
1075 #endif /* TARGET_HAS_PRECISE_SMC */
1076 /* we need to do that to handle the case where a signal
1077 occurs while doing tb_phys_invalidate() */
1078 saved_tb = NULL;
1079 if (env) {
1080 saved_tb = env->current_tb;
1081 env->current_tb = NULL;
1082 }
1083 tb_phys_invalidate(tb, -1);
1084 if (env) {
1085 env->current_tb = saved_tb;
1086 if (env->interrupt_request && env->current_tb)
1087 cpu_interrupt(env, env->interrupt_request);
1088 }
1089 }
1090 tb = tb_next;
1091 }
1092 #if !defined(CONFIG_USER_ONLY)
1093 /* if no code remaining, no need to continue to use slow writes */
1094 if (!p->first_tb) {
1095 invalidate_page_bitmap(p);
1096 if (is_cpu_write_access) {
1097 tlb_unprotect_code_phys(env, start, env->mem_io_vaddr);
1098 }
1099 }
1100 #endif
1101 #ifdef TARGET_HAS_PRECISE_SMC
1102 if (current_tb_modified) {
1103 /* we generate a block containing just the instruction
1104 modifying the memory. It will ensure that it cannot modify
1105 itself */
1106 env->current_tb = NULL;
1107 tb_gen_code(env, current_pc, current_cs_base, current_flags, 1);
1108 cpu_resume_from_signal(env, NULL);
1109 }
1110 #endif
1111 }
1112
1113 /* len must be <= 8 and start must be a multiple of len */
1114 static inline void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len)
1115 {
1116 PageDesc *p;
1117 int offset, b;
1118 #if 0
1119 if (1) {
1120 qemu_log("modifying code at 0x%x size=%d EIP=%x PC=%08x\n",
1121 cpu_single_env->mem_io_vaddr, len,
1122 cpu_single_env->eip,
1123 cpu_single_env->eip + (long)cpu_single_env->segs[R_CS].base);
1124 }
1125 #endif
1126 p = page_find(start >> TARGET_PAGE_BITS);
1127 if (!p)
1128 return;
1129 if (p->code_bitmap) {
1130 offset = start & ~TARGET_PAGE_MASK;
1131 b = p->code_bitmap[offset >> 3] >> (offset & 7);
1132 if (b & ((1 << len) - 1))
1133 goto do_invalidate;
1134 } else {
1135 do_invalidate:
1136 tb_invalidate_phys_page_range(start, start + len, 1);
1137 }
1138 }
1139
1140 #if !defined(CONFIG_SOFTMMU)
1141 static void tb_invalidate_phys_page(tb_page_addr_t addr,
1142 unsigned long pc, void *puc)
1143 {
1144 TranslationBlock *tb;
1145 PageDesc *p;
1146 int n;
1147 #ifdef TARGET_HAS_PRECISE_SMC
1148 TranslationBlock *current_tb = NULL;
1149 CPUState *env = cpu_single_env;
1150 int current_tb_modified = 0;
1151 target_ulong current_pc = 0;
1152 target_ulong current_cs_base = 0;
1153 int current_flags = 0;
1154 #endif
1155
1156 addr &= TARGET_PAGE_MASK;
1157 p = page_find(addr >> TARGET_PAGE_BITS);
1158 if (!p)
1159 return;
1160 tb = p->first_tb;
1161 #ifdef TARGET_HAS_PRECISE_SMC
1162 if (tb && pc != 0) {
1163 current_tb = tb_find_pc(pc);
1164 }
1165 #endif
1166 while (tb != NULL) {
1167 n = (long)tb & 3;
1168 tb = (TranslationBlock *)((long)tb & ~3);
1169 #ifdef TARGET_HAS_PRECISE_SMC
1170 if (current_tb == tb &&
1171 (current_tb->cflags & CF_COUNT_MASK) != 1) {
1172 /* If we are modifying the current TB, we must stop
1173 its execution. We could be more precise by checking
1174 that the modification is after the current PC, but it
1175 would require a specialized function to partially
1176 restore the CPU state */
1177
1178 current_tb_modified = 1;
1179 cpu_restore_state(current_tb, env, pc, puc);
1180 cpu_get_tb_cpu_state(env, &current_pc, &current_cs_base,
1181 &current_flags);
1182 }
1183 #endif /* TARGET_HAS_PRECISE_SMC */
1184 tb_phys_invalidate(tb, addr);
1185 tb = tb->page_next[n];
1186 }
1187 p->first_tb = NULL;
1188 #ifdef TARGET_HAS_PRECISE_SMC
1189 if (current_tb_modified) {
1190 /* we generate a block containing just the instruction
1191 modifying the memory. It will ensure that it cannot modify
1192 itself */
1193 env->current_tb = NULL;
1194 tb_gen_code(env, current_pc, current_cs_base, current_flags, 1);
1195 cpu_resume_from_signal(env, puc);
1196 }
1197 #endif
1198 }
1199 #endif
1200
1201 /* add the tb in the target page and protect it if necessary */
1202 static inline void tb_alloc_page(TranslationBlock *tb,
1203 unsigned int n, tb_page_addr_t page_addr)
1204 {
1205 PageDesc *p;
1206 TranslationBlock *last_first_tb;
1207
1208 tb->page_addr[n] = page_addr;
1209 p = page_find_alloc(page_addr >> TARGET_PAGE_BITS, 1);
1210 tb->page_next[n] = p->first_tb;
1211 last_first_tb = p->first_tb;
1212 p->first_tb = (TranslationBlock *)((long)tb | n);
1213 invalidate_page_bitmap(p);
1214
1215 #if defined(TARGET_HAS_SMC) || 1
1216
1217 #if defined(CONFIG_USER_ONLY)
1218 if (p->flags & PAGE_WRITE) {
1219 target_ulong addr;
1220 PageDesc *p2;
1221 int prot;
1222
1223 /* force the host page as non writable (writes will have a
1224 page fault + mprotect overhead) */
1225 page_addr &= qemu_host_page_mask;
1226 prot = 0;
1227 for(addr = page_addr; addr < page_addr + qemu_host_page_size;
1228 addr += TARGET_PAGE_SIZE) {
1229
1230 p2 = page_find (addr >> TARGET_PAGE_BITS);
1231 if (!p2)
1232 continue;
1233 prot |= p2->flags;
1234 p2->flags &= ~PAGE_WRITE;
1235 }
1236 mprotect(g2h(page_addr), qemu_host_page_size,
1237 (prot & PAGE_BITS) & ~PAGE_WRITE);
1238 #ifdef DEBUG_TB_INVALIDATE
1239 printf("protecting code page: 0x" TARGET_FMT_lx "\n",
1240 page_addr);
1241 #endif
1242 }
1243 #else
1244 /* if some code is already present, then the pages are already
1245 protected. So we handle the case where only the first TB is
1246 allocated in a physical page */
1247 if (!last_first_tb) {
1248 tlb_protect_code(page_addr);
1249 }
1250 #endif
1251
1252 #endif /* TARGET_HAS_SMC */
1253 }
1254
1255 /* add a new TB and link it to the physical page tables. phys_page2 is
1256 (-1) to indicate that only one page contains the TB. */
1257 void tb_link_page(TranslationBlock *tb,
1258 tb_page_addr_t phys_pc, tb_page_addr_t phys_page2)
1259 {
1260 unsigned int h;
1261 TranslationBlock **ptb;
1262
1263 /* Grab the mmap lock to stop another thread invalidating this TB
1264 before we are done. */
1265 mmap_lock();
1266 /* add in the physical hash table */
1267 h = tb_phys_hash_func(phys_pc);
1268 ptb = &tb_phys_hash[h];
1269 tb->phys_hash_next = *ptb;
1270 *ptb = tb;
1271
1272 /* add in the page list */
1273 tb_alloc_page(tb, 0, phys_pc & TARGET_PAGE_MASK);
1274 if (phys_page2 != -1)
1275 tb_alloc_page(tb, 1, phys_page2);
1276 else
1277 tb->page_addr[1] = -1;
1278
1279 tb->jmp_first = (TranslationBlock *)((long)tb | 2);
1280 tb->jmp_next[0] = NULL;
1281 tb->jmp_next[1] = NULL;
1282
1283 /* init original jump addresses */
1284 if (tb->tb_next_offset[0] != 0xffff)
1285 tb_reset_jump(tb, 0);
1286 if (tb->tb_next_offset[1] != 0xffff)
1287 tb_reset_jump(tb, 1);
1288
1289 #ifdef DEBUG_TB_CHECK
1290 tb_page_check();
1291 #endif
1292 mmap_unlock();
1293 }
1294
1295 /* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr <
1296 tb[1].tc_ptr. Return NULL if not found */
1297 TranslationBlock *tb_find_pc(unsigned long tc_ptr)
1298 {
1299 int m_min, m_max, m;
1300 unsigned long v;
1301 TranslationBlock *tb;
1302
1303 if (nb_tbs <= 0)
1304 return NULL;
1305 if (tc_ptr < (unsigned long)code_gen_buffer ||
1306 tc_ptr >= (unsigned long)code_gen_ptr)
1307 return NULL;
1308 /* binary search (cf Knuth) */
1309 m_min = 0;
1310 m_max = nb_tbs - 1;
1311 while (m_min <= m_max) {
1312 m = (m_min + m_max) >> 1;
1313 tb = &tbs[m];
1314 v = (unsigned long)tb->tc_ptr;
1315 if (v == tc_ptr)
1316 return tb;
1317 else if (tc_ptr < v) {
1318 m_max = m - 1;
1319 } else {
1320 m_min = m + 1;
1321 }
1322 }
1323 return &tbs[m_max];
1324 }
1325
1326 static void tb_reset_jump_recursive(TranslationBlock *tb);
1327
1328 static inline void tb_reset_jump_recursive2(TranslationBlock *tb, int n)
1329 {
1330 TranslationBlock *tb1, *tb_next, **ptb;
1331 unsigned int n1;
1332
1333 tb1 = tb->jmp_next[n];
1334 if (tb1 != NULL) {
1335 /* find head of list */
1336 for(;;) {
1337 n1 = (long)tb1 & 3;
1338 tb1 = (TranslationBlock *)((long)tb1 & ~3);
1339 if (n1 == 2)
1340 break;
1341 tb1 = tb1->jmp_next[n1];
1342 }
1343 /* we are now sure now that tb jumps to tb1 */
1344 tb_next = tb1;
1345
1346 /* remove tb from the jmp_first list */
1347 ptb = &tb_next->jmp_first;
1348 for(;;) {
1349 tb1 = *ptb;
1350 n1 = (long)tb1 & 3;
1351 tb1 = (TranslationBlock *)((long)tb1 & ~3);
1352 if (n1 == n && tb1 == tb)
1353 break;
1354 ptb = &tb1->jmp_next[n1];
1355 }
1356 *ptb = tb->jmp_next[n];
1357 tb->jmp_next[n] = NULL;
1358
1359 /* suppress the jump to next tb in generated code */
1360 tb_reset_jump(tb, n);
1361
1362 /* suppress jumps in the tb on which we could have jumped */
1363 tb_reset_jump_recursive(tb_next);
1364 }
1365 }
1366
1367 static void tb_reset_jump_recursive(TranslationBlock *tb)
1368 {
1369 tb_reset_jump_recursive2(tb, 0);
1370 tb_reset_jump_recursive2(tb, 1);
1371 }
1372
1373 #if defined(TARGET_HAS_ICE)
1374 #if defined(CONFIG_USER_ONLY)
1375 static void breakpoint_invalidate(CPUState *env, target_ulong pc)
1376 {
1377 tb_invalidate_phys_page_range(pc, pc + 1, 0);
1378 }
1379 #else
1380 static void breakpoint_invalidate(CPUState *env, target_ulong pc)
1381 {
1382 target_phys_addr_t addr;
1383 target_ulong pd;
1384 ram_addr_t ram_addr;
1385 PhysPageDesc *p;
1386
1387 addr = cpu_get_phys_page_debug(env, pc);
1388 p = phys_page_find(addr >> TARGET_PAGE_BITS);
1389 if (!p) {
1390 pd = IO_MEM_UNASSIGNED;
1391 } else {
1392 pd = p->phys_offset;
1393 }
1394 ram_addr = (pd & TARGET_PAGE_MASK) | (pc & ~TARGET_PAGE_MASK);
1395 tb_invalidate_phys_page_range(ram_addr, ram_addr + 1, 0);
1396 }
1397 #endif
1398 #endif /* TARGET_HAS_ICE */
1399
1400 #if defined(CONFIG_USER_ONLY)
1401 void cpu_watchpoint_remove_all(CPUState *env, int mask)
1402
1403 {
1404 }
1405
1406 int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len,
1407 int flags, CPUWatchpoint **watchpoint)
1408 {
1409 return -ENOSYS;
1410 }
1411 #else
1412 /* Add a watchpoint. */
1413 int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len,
1414 int flags, CPUWatchpoint **watchpoint)
1415 {
1416 target_ulong len_mask = ~(len - 1);
1417 CPUWatchpoint *wp;
1418
1419 /* sanity checks: allow power-of-2 lengths, deny unaligned watchpoints */
1420 if ((len != 1 && len != 2 && len != 4 && len != 8) || (addr & ~len_mask)) {
1421 fprintf(stderr, "qemu: tried to set invalid watchpoint at "
1422 TARGET_FMT_lx ", len=" TARGET_FMT_lu "\n", addr, len);
1423 return -EINVAL;
1424 }
1425 wp = qemu_malloc(sizeof(*wp));
1426
1427 wp->vaddr = addr;
1428 wp->len_mask = len_mask;
1429 wp->flags = flags;
1430
1431 /* keep all GDB-injected watchpoints in front */
1432 if (flags & BP_GDB)
1433 QTAILQ_INSERT_HEAD(&env->watchpoints, wp, entry);
1434 else
1435 QTAILQ_INSERT_TAIL(&env->watchpoints, wp, entry);
1436
1437 tlb_flush_page(env, addr);
1438
1439 if (watchpoint)
1440 *watchpoint = wp;
1441 return 0;
1442 }
1443
1444 /* Remove a specific watchpoint. */
1445 int cpu_watchpoint_remove(CPUState *env, target_ulong addr, target_ulong len,
1446 int flags)
1447 {
1448 target_ulong len_mask = ~(len - 1);
1449 CPUWatchpoint *wp;
1450
1451 QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
1452 if (addr == wp->vaddr && len_mask == wp->len_mask
1453 && flags == (wp->flags & ~BP_WATCHPOINT_HIT)) {
1454 cpu_watchpoint_remove_by_ref(env, wp);
1455 return 0;
1456 }
1457 }
1458 return -ENOENT;
1459 }
1460
1461 /* Remove a specific watchpoint by reference. */
1462 void cpu_watchpoint_remove_by_ref(CPUState *env, CPUWatchpoint *watchpoint)
1463 {
1464 QTAILQ_REMOVE(&env->watchpoints, watchpoint, entry);
1465
1466 tlb_flush_page(env, watchpoint->vaddr);
1467
1468 qemu_free(watchpoint);
1469 }
1470
1471 /* Remove all matching watchpoints. */
1472 void cpu_watchpoint_remove_all(CPUState *env, int mask)
1473 {
1474 CPUWatchpoint *wp, *next;
1475
1476 QTAILQ_FOREACH_SAFE(wp, &env->watchpoints, entry, next) {
1477 if (wp->flags & mask)
1478 cpu_watchpoint_remove_by_ref(env, wp);
1479 }
1480 }
1481 #endif
1482
1483 /* Add a breakpoint. */
1484 int cpu_breakpoint_insert(CPUState *env, target_ulong pc, int flags,
1485 CPUBreakpoint **breakpoint)
1486 {
1487 #if defined(TARGET_HAS_ICE)
1488 CPUBreakpoint *bp;
1489
1490 bp = qemu_malloc(sizeof(*bp));
1491
1492 bp->pc = pc;
1493 bp->flags = flags;
1494
1495 /* keep all GDB-injected breakpoints in front */
1496 if (flags & BP_GDB)
1497 QTAILQ_INSERT_HEAD(&env->breakpoints, bp, entry);
1498 else
1499 QTAILQ_INSERT_TAIL(&env->breakpoints, bp, entry);
1500
1501 breakpoint_invalidate(env, pc);
1502
1503 if (breakpoint)
1504 *breakpoint = bp;
1505 return 0;
1506 #else
1507 return -ENOSYS;
1508 #endif
1509 }
1510
1511 /* Remove a specific breakpoint. */
1512 int cpu_breakpoint_remove(CPUState *env, target_ulong pc, int flags)
1513 {
1514 #if defined(TARGET_HAS_ICE)
1515 CPUBreakpoint *bp;
1516
1517 QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
1518 if (bp->pc == pc && bp->flags == flags) {
1519 cpu_breakpoint_remove_by_ref(env, bp);
1520 return 0;
1521 }
1522 }
1523 return -ENOENT;
1524 #else
1525 return -ENOSYS;
1526 #endif
1527 }
1528
1529 /* Remove a specific breakpoint by reference. */
1530 void cpu_breakpoint_remove_by_ref(CPUState *env, CPUBreakpoint *breakpoint)
1531 {
1532 #if defined(TARGET_HAS_ICE)
1533 QTAILQ_REMOVE(&env->breakpoints, breakpoint, entry);
1534
1535 breakpoint_invalidate(env, breakpoint->pc);
1536
1537 qemu_free(breakpoint);
1538 #endif
1539 }
1540
1541 /* Remove all matching breakpoints. */
1542 void cpu_breakpoint_remove_all(CPUState *env, int mask)
1543 {
1544 #if defined(TARGET_HAS_ICE)
1545 CPUBreakpoint *bp, *next;
1546
1547 QTAILQ_FOREACH_SAFE(bp, &env->breakpoints, entry, next) {
1548 if (bp->flags & mask)
1549 cpu_breakpoint_remove_by_ref(env, bp);
1550 }
1551 #endif
1552 }
1553
1554 /* enable or disable single step mode. EXCP_DEBUG is returned by the
1555 CPU loop after each instruction */
1556 void cpu_single_step(CPUState *env, int enabled)
1557 {
1558 #if defined(TARGET_HAS_ICE)
1559 if (env->singlestep_enabled != enabled) {
1560 env->singlestep_enabled = enabled;
1561 if (kvm_enabled())
1562 kvm_update_guest_debug(env, 0);
1563 else {
1564 /* must flush all the translated code to avoid inconsistencies */
1565 /* XXX: only flush what is necessary */
1566 tb_flush(env);
1567 }
1568 }
1569 #endif
1570 }
1571
1572 /* enable or disable low levels log */
1573 void cpu_set_log(int log_flags)
1574 {
1575 loglevel = log_flags;
1576 if (loglevel && !logfile) {
1577 logfile = fopen(logfilename, log_append ? "a" : "w");
1578 if (!logfile) {
1579 perror(logfilename);
1580 _exit(1);
1581 }
1582 #if !defined(CONFIG_SOFTMMU)
1583 /* must avoid mmap() usage of glibc by setting a buffer "by hand" */
1584 {
1585 static char logfile_buf[4096];
1586 setvbuf(logfile, logfile_buf, _IOLBF, sizeof(logfile_buf));
1587 }
1588 #elif !defined(_WIN32)
1589 /* Win32 doesn't support line-buffering and requires size >= 2 */
1590 setvbuf(logfile, NULL, _IOLBF, 0);
1591 #endif
1592 log_append = 1;
1593 }
1594 if (!loglevel && logfile) {
1595 fclose(logfile);
1596 logfile = NULL;
1597 }
1598 }
1599
1600 void cpu_set_log_filename(const char *filename)
1601 {
1602 logfilename = strdup(filename);
1603 if (logfile) {
1604 fclose(logfile);
1605 logfile = NULL;
1606 }
1607 cpu_set_log(loglevel);
1608 }
1609
1610 static void cpu_unlink_tb(CPUState *env)
1611 {
1612 /* FIXME: TB unchaining isn't SMP safe. For now just ignore the
1613 problem and hope the cpu will stop of its own accord. For userspace
1614 emulation this often isn't actually as bad as it sounds. Often
1615 signals are used primarily to interrupt blocking syscalls. */
1616 TranslationBlock *tb;
1617 static spinlock_t interrupt_lock = SPIN_LOCK_UNLOCKED;
1618
1619 spin_lock(&interrupt_lock);
1620 tb = env->current_tb;
1621 /* if the cpu is currently executing code, we must unlink it and
1622 all the potentially executing TB */
1623 if (tb) {
1624 env->current_tb = NULL;
1625 tb_reset_jump_recursive(tb);
1626 }
1627 spin_unlock(&interrupt_lock);
1628 }
1629
1630 /* mask must never be zero, except for A20 change call */
1631 void cpu_interrupt(CPUState *env, int mask)
1632 {
1633 int old_mask;
1634
1635 old_mask = env->interrupt_request;
1636 env->interrupt_request |= mask;
1637
1638 #ifndef CONFIG_USER_ONLY
1639 /*
1640 * If called from iothread context, wake the target cpu in
1641 * case its halted.
1642 */
1643 if (!qemu_cpu_is_self(env)) {
1644 qemu_cpu_kick(env);
1645 return;
1646 }
1647 #endif
1648
1649 if (use_icount) {
1650 env->icount_decr.u16.high = 0xffff;
1651 #ifndef CONFIG_USER_ONLY
1652 if (!can_do_io(env)
1653 && (mask & ~old_mask) != 0) {
1654 cpu_abort(env, "Raised interrupt while not in I/O function");
1655 }
1656 #endif
1657 } else {
1658 cpu_unlink_tb(env);
1659 }
1660 }
1661
1662 void cpu_reset_interrupt(CPUState *env, int mask)
1663 {
1664 env->interrupt_request &= ~mask;
1665 }
1666
1667 void cpu_exit(CPUState *env)
1668 {
1669 env->exit_request = 1;
1670 cpu_unlink_tb(env);
1671 }
1672
1673 const CPULogItem cpu_log_items[] = {
1674 { CPU_LOG_TB_OUT_ASM, "out_asm",
1675 "show generated host assembly code for each compiled TB" },
1676 { CPU_LOG_TB_IN_ASM, "in_asm",
1677 "show target assembly code for each compiled TB" },
1678 { CPU_LOG_TB_OP, "op",
1679 "show micro ops for each compiled TB" },
1680 { CPU_LOG_TB_OP_OPT, "op_opt",
1681 "show micro ops "
1682 #ifdef TARGET_I386
1683 "before eflags optimization and "
1684 #endif
1685 "after liveness analysis" },
1686 { CPU_LOG_INT, "int",
1687 "show interrupts/exceptions in short format" },
1688 { CPU_LOG_EXEC, "exec",
1689 "show trace before each executed TB (lots of logs)" },
1690 { CPU_LOG_TB_CPU, "cpu",
1691 "show CPU state before block translation" },
1692 #ifdef TARGET_I386
1693 { CPU_LOG_PCALL, "pcall",
1694 "show protected mode far calls/returns/exceptions" },
1695 { CPU_LOG_RESET, "cpu_reset",
1696 "show CPU state before CPU resets" },
1697 #endif
1698 #ifdef DEBUG_IOPORT
1699 { CPU_LOG_IOPORT, "ioport",
1700 "show all i/o ports accesses" },
1701 #endif
1702 { 0, NULL, NULL },
1703 };
1704
1705 #ifndef CONFIG_USER_ONLY
1706 static QLIST_HEAD(memory_client_list, CPUPhysMemoryClient) memory_client_list
1707 = QLIST_HEAD_INITIALIZER(memory_client_list);
1708
1709 static void cpu_notify_set_memory(target_phys_addr_t start_addr,
1710 ram_addr_t size,
1711 ram_addr_t phys_offset)
1712 {
1713 CPUPhysMemoryClient *client;
1714 QLIST_FOREACH(client, &memory_client_list, list) {
1715 client->set_memory(client, start_addr, size, phys_offset);
1716 }
1717 }
1718
1719 static int cpu_notify_sync_dirty_bitmap(target_phys_addr_t start,
1720 target_phys_addr_t end)
1721 {
1722 CPUPhysMemoryClient *client;
1723 QLIST_FOREACH(client, &memory_client_list, list) {
1724 int r = client->sync_dirty_bitmap(client, start, end);
1725 if (r < 0)
1726 return r;
1727 }
1728 return 0;
1729 }
1730
1731 static int cpu_notify_migration_log(int enable)
1732 {
1733 CPUPhysMemoryClient *client;
1734 QLIST_FOREACH(client, &memory_client_list, list) {
1735 int r = client->migration_log(client, enable);
1736 if (r < 0)
1737 return r;
1738 }
1739 return 0;
1740 }
1741
1742 static void phys_page_for_each_1(CPUPhysMemoryClient *client,
1743 int level, void **lp)
1744 {
1745 int i;
1746
1747 if (*lp == NULL) {
1748 return;
1749 }
1750 if (level == 0) {
1751 PhysPageDesc *pd = *lp;
1752 for (i = 0; i < L2_SIZE; ++i) {
1753 if (pd[i].phys_offset != IO_MEM_UNASSIGNED) {
1754 client->set_memory(client, pd[i].region_offset,
1755 TARGET_PAGE_SIZE, pd[i].phys_offset);
1756 }
1757 }
1758 } else {
1759 void **pp = *lp;
1760 for (i = 0; i < L2_SIZE; ++i) {
1761 phys_page_for_each_1(client, level - 1, pp + i);
1762 }
1763 }
1764 }
1765
1766 static void phys_page_for_each(CPUPhysMemoryClient *client)
1767 {
1768 int i;
1769 for (i = 0; i < P_L1_SIZE; ++i) {
1770 phys_page_for_each_1(client, P_L1_SHIFT / L2_BITS - 1,
1771 l1_phys_map + 1);
1772 }
1773 }
1774
1775 void cpu_register_phys_memory_client(CPUPhysMemoryClient *client)
1776 {
1777 QLIST_INSERT_HEAD(&memory_client_list, client, list);
1778 phys_page_for_each(client);
1779 }
1780
1781 void cpu_unregister_phys_memory_client(CPUPhysMemoryClient *client)
1782 {
1783 QLIST_REMOVE(client, list);
1784 }
1785 #endif
1786
1787 static int cmp1(const char *s1, int n, const char *s2)
1788 {
1789 if (strlen(s2) != n)
1790 return 0;
1791 return memcmp(s1, s2, n) == 0;
1792 }
1793
1794 /* takes a comma separated list of log masks. Return 0 if error. */
1795 int cpu_str_to_log_mask(const char *str)
1796 {
1797 const CPULogItem *item;
1798 int mask;
1799 const char *p, *p1;
1800
1801 p = str;
1802 mask = 0;
1803 for(;;) {
1804 p1 = strchr(p, ',');
1805 if (!p1)
1806 p1 = p + strlen(p);
1807 if(cmp1(p,p1-p,"all")) {
1808 for(item = cpu_log_items; item->mask != 0; item++) {
1809 mask |= item->mask;
1810 }
1811 } else {
1812 for(item = cpu_log_items; item->mask != 0; item++) {
1813 if (cmp1(p, p1 - p, item->name))
1814 goto found;
1815 }
1816 return 0;
1817 }
1818 found:
1819 mask |= item->mask;
1820 if (*p1 != ',')
1821 break;
1822 p = p1 + 1;
1823 }
1824 return mask;
1825 }
1826
1827 void cpu_abort(CPUState *env, const char *fmt, ...)
1828 {
1829 va_list ap;
1830 va_list ap2;
1831
1832 va_start(ap, fmt);
1833 va_copy(ap2, ap);
1834 fprintf(stderr, "qemu: fatal: ");
1835 vfprintf(stderr, fmt, ap);
1836 fprintf(stderr, "\n");
1837 #ifdef TARGET_I386
1838 cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU | X86_DUMP_CCOP);
1839 #else
1840 cpu_dump_state(env, stderr, fprintf, 0);
1841 #endif
1842 if (qemu_log_enabled()) {
1843 qemu_log("qemu: fatal: ");
1844 qemu_log_vprintf(fmt, ap2);
1845 qemu_log("\n");
1846 #ifdef TARGET_I386
1847 log_cpu_state(env, X86_DUMP_FPU | X86_DUMP_CCOP);
1848 #else
1849 log_cpu_state(env, 0);
1850 #endif
1851 qemu_log_flush();
1852 qemu_log_close();
1853 }
1854 va_end(ap2);
1855 va_end(ap);
1856 #if defined(CONFIG_USER_ONLY)
1857 {
1858 struct sigaction act;
1859 sigfillset(&act.sa_mask);
1860 act.sa_handler = SIG_DFL;
1861 sigaction(SIGABRT, &act, NULL);
1862 }
1863 #endif
1864 abort();
1865 }
1866
1867 CPUState *cpu_copy(CPUState *env)
1868 {
1869 CPUState *new_env = cpu_init(env->cpu_model_str);
1870 CPUState *next_cpu = new_env->next_cpu;
1871 int cpu_index = new_env->cpu_index;
1872 #if defined(TARGET_HAS_ICE)
1873 CPUBreakpoint *bp;
1874 CPUWatchpoint *wp;
1875 #endif
1876
1877 memcpy(new_env, env, sizeof(CPUState));
1878
1879 /* Preserve chaining and index. */
1880 new_env->next_cpu = next_cpu;
1881 new_env->cpu_index = cpu_index;
1882
1883 /* Clone all break/watchpoints.
1884 Note: Once we support ptrace with hw-debug register access, make sure
1885 BP_CPU break/watchpoints are handled correctly on clone. */
1886 QTAILQ_INIT(&env->breakpoints);
1887 QTAILQ_INIT(&env->watchpoints);
1888 #if defined(TARGET_HAS_ICE)
1889 QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
1890 cpu_breakpoint_insert(new_env, bp->pc, bp->flags, NULL);
1891 }
1892 QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
1893 cpu_watchpoint_insert(new_env, wp->vaddr, (~wp->len_mask) + 1,
1894 wp->flags, NULL);
1895 }
1896 #endif
1897
1898 return new_env;
1899 }
1900
1901 #if !defined(CONFIG_USER_ONLY)
1902
1903 static inline void tlb_flush_jmp_cache(CPUState *env, target_ulong addr)
1904 {
1905 unsigned int i;
1906
1907 /* Discard jump cache entries for any tb which might potentially
1908 overlap the flushed page. */
1909 i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE);
1910 memset (&env->tb_jmp_cache[i], 0,
1911 TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
1912
1913 i = tb_jmp_cache_hash_page(addr);
1914 memset (&env->tb_jmp_cache[i], 0,
1915 TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
1916 }
1917
1918 static CPUTLBEntry s_cputlb_empty_entry = {
1919 .addr_read = -1,
1920 .addr_write = -1,
1921 .addr_code = -1,
1922 .addend = -1,
1923 };
1924
1925 /* NOTE: if flush_global is true, also flush global entries (not
1926 implemented yet) */
1927 void tlb_flush(CPUState *env, int flush_global)
1928 {
1929 int i;
1930
1931 #if defined(DEBUG_TLB)
1932 printf("tlb_flush:\n");
1933 #endif
1934 /* must reset current TB so that interrupts cannot modify the
1935 links while we are modifying them */
1936 env->current_tb = NULL;
1937
1938 for(i = 0; i < CPU_TLB_SIZE; i++) {
1939 int mmu_idx;
1940 for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
1941 env->tlb_table[mmu_idx][i] = s_cputlb_empty_entry;
1942 }
1943 }
1944
1945 memset (env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof (void *));
1946
1947 env->tlb_flush_addr = -1;
1948 env->tlb_flush_mask = 0;
1949 tlb_flush_count++;
1950 }
1951
1952 static inline void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr)
1953 {
1954 if (addr == (tlb_entry->addr_read &
1955 (TARGET_PAGE_MASK | TLB_INVALID_MASK)) ||
1956 addr == (tlb_entry->addr_write &
1957 (TARGET_PAGE_MASK | TLB_INVALID_MASK)) ||
1958 addr == (tlb_entry->addr_code &
1959 (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
1960 *tlb_entry = s_cputlb_empty_entry;
1961 }
1962 }
1963
1964 void tlb_flush_page(CPUState *env, target_ulong addr)
1965 {
1966 int i;
1967 int mmu_idx;
1968
1969 #if defined(DEBUG_TLB)
1970 printf("tlb_flush_page: " TARGET_FMT_lx "\n", addr);
1971 #endif
1972 /* Check if we need to flush due to large pages. */
1973 if ((addr & env->tlb_flush_mask) == env->tlb_flush_addr) {
1974 #if defined(DEBUG_TLB)
1975 printf("tlb_flush_page: forced full flush ("
1976 TARGET_FMT_lx "/" TARGET_FMT_lx ")\n",
1977 env->tlb_flush_addr, env->tlb_flush_mask);
1978 #endif
1979 tlb_flush(env, 1);
1980 return;
1981 }
1982 /* must reset current TB so that interrupts cannot modify the
1983 links while we are modifying them */
1984 env->current_tb = NULL;
1985
1986 addr &= TARGET_PAGE_MASK;
1987 i = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
1988 for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++)
1989 tlb_flush_entry(&env->tlb_table[mmu_idx][i], addr);
1990
1991 tlb_flush_jmp_cache(env, addr);
1992 }
1993
1994 /* update the TLBs so that writes to code in the virtual page 'addr'
1995 can be detected */
1996 static void tlb_protect_code(ram_addr_t ram_addr)
1997 {
1998 cpu_physical_memory_reset_dirty(ram_addr,
1999 ram_addr + TARGET_PAGE_SIZE,
2000 CODE_DIRTY_FLAG);
2001 }
2002
2003 /* update the TLB so that writes in physical page 'phys_addr' are no longer
2004 tested for self modifying code */
2005 static void tlb_unprotect_code_phys(CPUState *env, ram_addr_t ram_addr,
2006 target_ulong vaddr)
2007 {
2008 cpu_physical_memory_set_dirty_flags(ram_addr, CODE_DIRTY_FLAG);
2009 }
2010
2011 static inline void tlb_reset_dirty_range(CPUTLBEntry *tlb_entry,
2012 unsigned long start, unsigned long length)
2013 {
2014 unsigned long addr;
2015 if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_RAM) {
2016 addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend;
2017 if ((addr - start) < length) {
2018 tlb_entry->addr_write = (tlb_entry->addr_write & TARGET_PAGE_MASK) | TLB_NOTDIRTY;
2019 }
2020 }
2021 }
2022
2023 /* Note: start and end must be within the same ram block. */
2024 void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
2025 int dirty_flags)
2026 {
2027 CPUState *env;
2028 unsigned long length, start1;
2029 int i;
2030
2031 start &= TARGET_PAGE_MASK;
2032 end = TARGET_PAGE_ALIGN(end);
2033
2034 length = end - start;
2035 if (length == 0)
2036 return;
2037 cpu_physical_memory_mask_dirty_range(start, length, dirty_flags);
2038
2039 /* we modify the TLB cache so that the dirty bit will be set again
2040 when accessing the range */
2041 start1 = (unsigned long)qemu_safe_ram_ptr(start);
2042 /* Chek that we don't span multiple blocks - this breaks the
2043 address comparisons below. */
2044 if ((unsigned long)qemu_safe_ram_ptr(end - 1) - start1
2045 != (end - 1) - start) {
2046 abort();
2047 }
2048
2049 for(env = first_cpu; env != NULL; env = env->next_cpu) {
2050 int mmu_idx;
2051 for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
2052 for(i = 0; i < CPU_TLB_SIZE; i++)
2053 tlb_reset_dirty_range(&env->tlb_table[mmu_idx][i],
2054 start1, length);
2055 }
2056 }
2057 }
2058
2059 int cpu_physical_memory_set_dirty_tracking(int enable)
2060 {
2061 int ret = 0;
2062 in_migration = enable;
2063 ret = cpu_notify_migration_log(!!enable);
2064 return ret;
2065 }
2066
2067 int cpu_physical_memory_get_dirty_tracking(void)
2068 {
2069 return in_migration;
2070 }
2071
2072 int cpu_physical_sync_dirty_bitmap(target_phys_addr_t start_addr,
2073 target_phys_addr_t end_addr)
2074 {
2075 int ret;
2076
2077 ret = cpu_notify_sync_dirty_bitmap(start_addr, end_addr);
2078 return ret;
2079 }
2080
2081 int cpu_physical_log_start(target_phys_addr_t start_addr,
2082 ram_addr_t size)
2083 {
2084 CPUPhysMemoryClient *client;
2085 QLIST_FOREACH(client, &memory_client_list, list) {
2086 if (client->log_start) {
2087 int r = client->log_start(client, start_addr, size);
2088 if (r < 0) {
2089 return r;
2090 }
2091 }
2092 }
2093 return 0;
2094 }
2095
2096 int cpu_physical_log_stop(target_phys_addr_t start_addr,
2097 ram_addr_t size)
2098 {
2099 CPUPhysMemoryClient *client;
2100 QLIST_FOREACH(client, &memory_client_list, list) {
2101 if (client->log_stop) {
2102 int r = client->log_stop(client, start_addr, size);
2103 if (r < 0) {
2104 return r;
2105 }
2106 }
2107 }
2108 return 0;
2109 }
2110
2111 static inline void tlb_update_dirty(CPUTLBEntry *tlb_entry)
2112 {
2113 ram_addr_t ram_addr;
2114 void *p;
2115
2116 if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_RAM) {
2117 p = (void *)(unsigned long)((tlb_entry->addr_write & TARGET_PAGE_MASK)
2118 + tlb_entry->addend);
2119 ram_addr = qemu_ram_addr_from_host_nofail(p);
2120 if (!cpu_physical_memory_is_dirty(ram_addr)) {
2121 tlb_entry->addr_write |= TLB_NOTDIRTY;
2122 }
2123 }
2124 }
2125
2126 /* update the TLB according to the current state of the dirty bits */
2127 void cpu_tlb_update_dirty(CPUState *env)
2128 {
2129 int i;
2130 int mmu_idx;
2131 for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
2132 for(i = 0; i < CPU_TLB_SIZE; i++)
2133 tlb_update_dirty(&env->tlb_table[mmu_idx][i]);
2134 }
2135 }
2136
2137 static inline void tlb_set_dirty1(CPUTLBEntry *tlb_entry, target_ulong vaddr)
2138 {
2139 if (tlb_entry->addr_write == (vaddr | TLB_NOTDIRTY))
2140 tlb_entry->addr_write = vaddr;
2141 }
2142
2143 /* update the TLB corresponding to virtual page vaddr
2144 so that it is no longer dirty */
2145 static inline void tlb_set_dirty(CPUState *env, target_ulong vaddr)
2146 {
2147 int i;
2148 int mmu_idx;
2149
2150 vaddr &= TARGET_PAGE_MASK;
2151 i = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
2152 for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++)
2153 tlb_set_dirty1(&env->tlb_table[mmu_idx][i], vaddr);
2154 }
2155
2156 /* Our TLB does not support large pages, so remember the area covered by
2157 large pages and trigger a full TLB flush if these are invalidated. */
2158 static void tlb_add_large_page(CPUState *env, target_ulong vaddr,
2159 target_ulong size)
2160 {
2161 target_ulong mask = ~(size - 1);
2162
2163 if (env->tlb_flush_addr == (target_ulong)-1) {
2164 env->tlb_flush_addr = vaddr & mask;
2165 env->tlb_flush_mask = mask;
2166 return;
2167 }
2168 /* Extend the existing region to include the new page.
2169 This is a compromise between unnecessary flushes and the cost
2170 of maintaining a full variable size TLB. */
2171 mask &= env->tlb_flush_mask;
2172 while (((env->tlb_flush_addr ^ vaddr) & mask) != 0) {
2173 mask <<= 1;
2174 }
2175 env->tlb_flush_addr &= mask;
2176 env->tlb_flush_mask = mask;
2177 }
2178
2179 /* Add a new TLB entry. At most one entry for a given virtual address
2180 is permitted. Only a single TARGET_PAGE_SIZE region is mapped, the
2181 supplied size is only used by tlb_flush_page. */
2182 void tlb_set_page(CPUState *env, target_ulong vaddr,
2183 target_phys_addr_t paddr, int prot,
2184 int mmu_idx, target_ulong size)
2185 {
2186 PhysPageDesc *p;
2187 unsigned long pd;
2188 unsigned int index;
2189 target_ulong address;
2190 target_ulong code_address;
2191 unsigned long addend;
2192 CPUTLBEntry *te;
2193 CPUWatchpoint *wp;
2194 target_phys_addr_t iotlb;
2195
2196 assert(size >= TARGET_PAGE_SIZE);
2197 if (size != TARGET_PAGE_SIZE) {
2198 tlb_add_large_page(env, vaddr, size);
2199 }
2200 p = phys_page_find(paddr >> TARGET_PAGE_BITS);
2201 if (!p) {
2202 pd = IO_MEM_UNASSIGNED;
2203 } else {
2204 pd = p->phys_offset;
2205 }
2206 #if defined(DEBUG_TLB)
2207 printf("tlb_set_page: vaddr=" TARGET_FMT_lx " paddr=0x" TARGET_FMT_plx
2208 " prot=%x idx=%d pd=0x%08lx\n",
2209 vaddr, paddr, prot, mmu_idx, pd);
2210 #endif
2211
2212 address = vaddr;
2213 if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
2214 /* IO memory case (romd handled later) */
2215 address |= TLB_MMIO;
2216 }
2217 addend = (unsigned long)qemu_get_ram_ptr(pd & TARGET_PAGE_MASK);
2218 if ((pd & ~TARGET_PAGE_MASK) <= IO_MEM_ROM) {
2219 /* Normal RAM. */
2220 iotlb = pd & TARGET_PAGE_MASK;
2221 if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_RAM)
2222 iotlb |= IO_MEM_NOTDIRTY;
2223 else
2224 iotlb |= IO_MEM_ROM;
2225 } else {
2226 /* IO handlers are currently passed a physical address.
2227 It would be nice to pass an offset from the base address
2228 of that region. This would avoid having to special case RAM,
2229 and avoid full address decoding in every device.
2230 We can't use the high bits of pd for this because
2231 IO_MEM_ROMD uses these as a ram address. */
2232 iotlb = (pd & ~TARGET_PAGE_MASK);
2233 if (p) {
2234 iotlb += p->region_offset;
2235 } else {
2236 iotlb += paddr;
2237 }
2238 }
2239
2240 code_address = address;
2241 /* Make accesses to pages with watchpoints go via the
2242 watchpoint trap routines. */
2243 QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
2244 if (vaddr == (wp->vaddr & TARGET_PAGE_MASK)) {
2245 /* Avoid trapping reads of pages with a write breakpoint. */
2246 if ((prot & PAGE_WRITE) || (wp->flags & BP_MEM_READ)) {
2247 iotlb = io_mem_watch + paddr;
2248 address |= TLB_MMIO;
2249 break;
2250 }
2251 }
2252 }
2253
2254 index = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
2255 env->iotlb[mmu_idx][index] = iotlb - vaddr;
2256 te = &env->tlb_table[mmu_idx][index];
2257 te->addend = addend - vaddr;
2258 if (prot & PAGE_READ) {
2259 te->addr_read = address;
2260 } else {
2261 te->addr_read = -1;
2262 }
2263
2264 if (prot & PAGE_EXEC) {
2265 te->addr_code = code_address;
2266 } else {
2267 te->addr_code = -1;
2268 }
2269 if (prot & PAGE_WRITE) {
2270 if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_ROM ||
2271 (pd & IO_MEM_ROMD)) {
2272 /* Write access calls the I/O callback. */
2273 te->addr_write = address | TLB_MMIO;
2274 } else if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_RAM &&
2275 !cpu_physical_memory_is_dirty(pd)) {
2276 te->addr_write = address | TLB_NOTDIRTY;
2277 } else {
2278 te->addr_write = address;
2279 }
2280 } else {
2281 te->addr_write = -1;
2282 }
2283 }
2284
2285 #else
2286
2287 void tlb_flush(CPUState *env, int flush_global)
2288 {
2289 }
2290
2291 void tlb_flush_page(CPUState *env, target_ulong addr)
2292 {
2293 }
2294
2295 /*
2296 * Walks guest process memory "regions" one by one
2297 * and calls callback function 'fn' for each region.
2298 */
2299
2300 struct walk_memory_regions_data
2301 {
2302 walk_memory_regions_fn fn;
2303 void *priv;
2304 unsigned long start;
2305 int prot;
2306 };
2307
2308 static int walk_memory_regions_end(struct walk_memory_regions_data *data,
2309 abi_ulong end, int new_prot)
2310 {
2311 if (data->start != -1ul) {
2312 int rc = data->fn(data->priv, data->start, end, data->prot);
2313 if (rc != 0) {
2314 return rc;
2315 }
2316 }
2317
2318 data->start = (new_prot ? end : -1ul);
2319 data->prot = new_prot;
2320
2321 return 0;
2322 }
2323
2324 static int walk_memory_regions_1(struct walk_memory_regions_data *data,
2325 abi_ulong base, int level, void **lp)
2326 {
2327 abi_ulong pa;
2328 int i, rc;
2329
2330 if (*lp == NULL) {
2331 return walk_memory_regions_end(data, base, 0);
2332 }
2333
2334 if (level == 0) {
2335 PageDesc *pd = *lp;
2336 for (i = 0; i < L2_SIZE; ++i) {
2337 int prot = pd[i].flags;
2338
2339 pa = base | (i << TARGET_PAGE_BITS);
2340 if (prot != data->prot) {
2341 rc = walk_memory_regions_end(data, pa, prot);
2342 if (rc != 0) {
2343 return rc;
2344 }
2345 }
2346 }
2347 } else {
2348 void **pp = *lp;
2349 for (i = 0; i < L2_SIZE; ++i) {
2350 pa = base | ((abi_ulong)i <<
2351 (TARGET_PAGE_BITS + L2_BITS * level));
2352 rc = walk_memory_regions_1(data, pa, level - 1, pp + i);
2353 if (rc != 0) {
2354 return rc;
2355 }
2356 }
2357 }
2358
2359 return 0;
2360 }
2361
2362 int walk_memory_regions(void *priv, walk_memory_regions_fn fn)
2363 {
2364 struct walk_memory_regions_data data;
2365 unsigned long i;
2366
2367 data.fn = fn;
2368 data.priv = priv;
2369 data.start = -1ul;
2370 data.prot = 0;
2371
2372 for (i = 0; i < V_L1_SIZE; i++) {
2373 int rc = walk_memory_regions_1(&data, (abi_ulong)i << V_L1_SHIFT,
2374 V_L1_SHIFT / L2_BITS - 1, l1_map + i);
2375 if (rc != 0) {
2376 return rc;
2377 }
2378 }
2379
2380 return walk_memory_regions_end(&data, 0, 0);
2381 }
2382
2383 static int dump_region(void *priv, abi_ulong start,
2384 abi_ulong end, unsigned long prot)
2385 {
2386 FILE *f = (FILE *)priv;
2387
2388 (void) fprintf(f, TARGET_ABI_FMT_lx"-"TARGET_ABI_FMT_lx
2389 " "TARGET_ABI_FMT_lx" %c%c%c\n",
2390 start, end, end - start,
2391 ((prot & PAGE_READ) ? 'r' : '-'),
2392 ((prot & PAGE_WRITE) ? 'w' : '-'),
2393 ((prot & PAGE_EXEC) ? 'x' : '-'));
2394
2395 return (0);
2396 }
2397
2398 /* dump memory mappings */
2399 void page_dump(FILE *f)
2400 {
2401 (void) fprintf(f, "%-8s %-8s %-8s %s\n",
2402 "start", "end", "size", "prot");
2403 walk_memory_regions(f, dump_region);
2404 }
2405
2406 int page_get_flags(target_ulong address)
2407 {
2408 PageDesc *p;
2409
2410 p = page_find(address >> TARGET_PAGE_BITS);
2411 if (!p)
2412 return 0;
2413 return p->flags;
2414 }
2415
2416 /* Modify the flags of a page and invalidate the code if necessary.
2417 The flag PAGE_WRITE_ORG is positioned automatically depending
2418 on PAGE_WRITE. The mmap_lock should already be held. */
2419 void page_set_flags(target_ulong start, target_ulong end, int flags)
2420 {
2421 target_ulong addr, len;
2422
2423 /* This function should never be called with addresses outside the
2424 guest address space. If this assert fires, it probably indicates
2425 a missing call to h2g_valid. */
2426 #if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
2427 assert(end < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
2428 #endif
2429 assert(start < end);
2430
2431 start = start & TARGET_PAGE_MASK;
2432 end = TARGET_PAGE_ALIGN(end);
2433
2434 if (flags & PAGE_WRITE) {
2435 flags |= PAGE_WRITE_ORG;
2436 }
2437
2438 for (addr = start, len = end - start;
2439 len != 0;
2440 len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
2441 PageDesc *p = page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
2442
2443 /* If the write protection bit is set, then we invalidate
2444 the code inside. */
2445 if (!(p->flags & PAGE_WRITE) &&
2446 (flags & PAGE_WRITE) &&
2447 p->first_tb) {
2448 tb_invalidate_phys_page(addr, 0, NULL);
2449 }
2450 p->flags = flags;
2451 }
2452 }
2453
2454 int page_check_range(target_ulong start, target_ulong len, int flags)
2455 {
2456 PageDesc *p;
2457 target_ulong end;
2458 target_ulong addr;
2459
2460 /* This function should never be called with addresses outside the
2461 guest address space. If this assert fires, it probably indicates
2462 a missing call to h2g_valid. */
2463 #if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
2464 assert(start < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
2465 #endif
2466
2467 if (len == 0) {
2468 return 0;
2469 }
2470 if (start + len - 1 < start) {
2471 /* We've wrapped around. */
2472 return -1;
2473 }
2474
2475 end = TARGET_PAGE_ALIGN(start+len); /* must do before we loose bits in the next step */
2476 start = start & TARGET_PAGE_MASK;
2477
2478 for (addr = start, len = end - start;
2479 len != 0;
2480 len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
2481 p = page_find(addr >> TARGET_PAGE_BITS);
2482 if( !p )
2483 return -1;
2484 if( !(p->flags & PAGE_VALID) )
2485 return -1;
2486
2487 if ((flags & PAGE_READ) && !(p->flags & PAGE_READ))
2488 return -1;
2489 if (flags & PAGE_WRITE) {
2490 if (!(p->flags & PAGE_WRITE_ORG))
2491 return -1;
2492 /* unprotect the page if it was put read-only because it
2493 contains translated code */
2494 if (!(p->flags & PAGE_WRITE)) {
2495 if (!page_unprotect(addr, 0, NULL))
2496 return -1;
2497 }
2498 return 0;
2499 }
2500 }
2501 return 0;
2502 }
2503
2504 /* called from signal handler: invalidate the code and unprotect the
2505 page. Return TRUE if the fault was successfully handled. */
2506 int page_unprotect(target_ulong address, unsigned long pc, void *puc)
2507 {
2508 unsigned int prot;
2509 PageDesc *p;
2510 target_ulong host_start, host_end, addr;
2511
2512 /* Technically this isn't safe inside a signal handler. However we
2513 know this only ever happens in a synchronous SEGV handler, so in
2514 practice it seems to be ok. */
2515 mmap_lock();
2516
2517 p = page_find(address >> TARGET_PAGE_BITS);
2518 if (!p) {
2519 mmap_unlock();
2520 return 0;
2521 }
2522
2523 /* if the page was really writable, then we change its
2524 protection back to writable */
2525 if ((p->flags & PAGE_WRITE_ORG) && !(p->flags & PAGE_WRITE)) {
2526 host_start = address & qemu_host_page_mask;
2527 host_end = host_start + qemu_host_page_size;
2528
2529 prot = 0;
2530 for (addr = host_start ; addr < host_end ; addr += TARGET_PAGE_SIZE) {
2531 p = page_find(addr >> TARGET_PAGE_BITS);
2532 p->flags |= PAGE_WRITE;
2533 prot |= p->flags;
2534
2535 /* and since the content will be modified, we must invalidate
2536 the corresponding translated code. */
2537 tb_invalidate_phys_page(addr, pc, puc);
2538 #ifdef DEBUG_TB_CHECK
2539 tb_invalidate_check(addr);
2540 #endif
2541 }
2542 mprotect((void *)g2h(host_start), qemu_host_page_size,
2543 prot & PAGE_BITS);
2544
2545 mmap_unlock();
2546 return 1;
2547 }
2548 mmap_unlock();
2549 return 0;
2550 }
2551
2552 static inline void tlb_set_dirty(CPUState *env,
2553 unsigned long addr, target_ulong vaddr)
2554 {
2555 }
2556 #endif /* defined(CONFIG_USER_ONLY) */
2557
2558 #if !defined(CONFIG_USER_ONLY)
2559
2560 #define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK)
2561 typedef struct subpage_t {
2562 target_phys_addr_t base;
2563 ram_addr_t sub_io_index[TARGET_PAGE_SIZE];
2564 ram_addr_t region_offset[TARGET_PAGE_SIZE];
2565 } subpage_t;
2566
2567 static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
2568 ram_addr_t memory, ram_addr_t region_offset);
2569 static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
2570 ram_addr_t orig_memory,
2571 ram_addr_t region_offset);
2572 #define CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2, \
2573 need_subpage) \
2574 do { \
2575 if (addr > start_addr) \
2576 start_addr2 = 0; \
2577 else { \
2578 start_addr2 = start_addr & ~TARGET_PAGE_MASK; \
2579 if (start_addr2 > 0) \
2580 need_subpage = 1; \
2581 } \
2582 \
2583 if ((start_addr + orig_size) - addr >= TARGET_PAGE_SIZE) \
2584 end_addr2 = TARGET_PAGE_SIZE - 1; \
2585 else { \
2586 end_addr2 = (start_addr + orig_size - 1) & ~TARGET_PAGE_MASK; \
2587 if (end_addr2 < TARGET_PAGE_SIZE - 1) \
2588 need_subpage = 1; \
2589 } \
2590 } while (0)
2591
2592 /* register physical memory.
2593 For RAM, 'size' must be a multiple of the target page size.
2594 If (phys_offset & ~TARGET_PAGE_MASK) != 0, then it is an
2595 io memory page. The address used when calling the IO function is
2596 the offset from the start of the region, plus region_offset. Both
2597 start_addr and region_offset are rounded down to a page boundary
2598 before calculating this offset. This should not be a problem unless
2599 the low bits of start_addr and region_offset differ. */
2600 void cpu_register_physical_memory_offset(target_phys_addr_t start_addr,
2601 ram_addr_t size,
2602 ram_addr_t phys_offset,
2603 ram_addr_t region_offset)
2604 {
2605 target_phys_addr_t addr, end_addr;
2606 PhysPageDesc *p;
2607 CPUState *env;
2608 ram_addr_t orig_size = size;
2609 subpage_t *subpage;
2610
2611 cpu_notify_set_memory(start_addr, size, phys_offset);
2612
2613 if (phys_offset == IO_MEM_UNASSIGNED) {
2614 region_offset = start_addr;
2615 }
2616 region_offset &= TARGET_PAGE_MASK;
2617 size = (size + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
2618 end_addr = start_addr + (target_phys_addr_t)size;
2619 for(addr = start_addr; addr != end_addr; addr += TARGET_PAGE_SIZE) {
2620 p = phys_page_find(addr >> TARGET_PAGE_BITS);
2621 if (p && p->phys_offset != IO_MEM_UNASSIGNED) {
2622 ram_addr_t orig_memory = p->phys_offset;
2623 target_phys_addr_t start_addr2, end_addr2;
2624 int need_subpage = 0;
2625
2626 CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2,
2627 need_subpage);
2628 if (need_subpage) {
2629 if (!(orig_memory & IO_MEM_SUBPAGE)) {
2630 subpage = subpage_init((addr & TARGET_PAGE_MASK),
2631 &p->phys_offset, orig_memory,
2632 p->region_offset);
2633 } else {
2634 subpage = io_mem_opaque[(orig_memory & ~TARGET_PAGE_MASK)
2635 >> IO_MEM_SHIFT];
2636 }
2637 subpage_register(subpage, start_addr2, end_addr2, phys_offset,
2638 region_offset);
2639 p->region_offset = 0;
2640 } else {
2641 p->phys_offset = phys_offset;
2642 if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM ||
2643 (phys_offset & IO_MEM_ROMD))
2644 phys_offset += TARGET_PAGE_SIZE;
2645 }
2646 } else {
2647 p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
2648 p->phys_offset = phys_offset;
2649 p->region_offset = region_offset;
2650 if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM ||
2651 (phys_offset & IO_MEM_ROMD)) {
2652 phys_offset += TARGET_PAGE_SIZE;
2653 } else {
2654 target_phys_addr_t start_addr2, end_addr2;
2655 int need_subpage = 0;
2656
2657 CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr,
2658 end_addr2, need_subpage);
2659
2660 if (need_subpage) {
2661 subpage = subpage_init((addr & TARGET_PAGE_MASK),
2662 &p->phys_offset, IO_MEM_UNASSIGNED,
2663 addr & TARGET_PAGE_MASK);
2664 subpage_register(subpage, start_addr2, end_addr2,
2665 phys_offset, region_offset);
2666 p->region_offset = 0;
2667 }
2668 }
2669 }
2670 region_offset += TARGET_PAGE_SIZE;
2671 }
2672
2673 /* since each CPU stores ram addresses in its TLB cache, we must
2674 reset the modified entries */
2675 /* XXX: slow ! */
2676 for(env = first_cpu; env != NULL; env = env->next_cpu) {
2677 tlb_flush(env, 1);
2678 }
2679 }
2680
2681 /* XXX: temporary until new memory mapping API */
2682 ram_addr_t cpu_get_physical_page_desc(target_phys_addr_t addr)
2683 {
2684 PhysPageDesc *p;
2685
2686 p = phys_page_find(addr >> TARGET_PAGE_BITS);
2687 if (!p)
2688 return IO_MEM_UNASSIGNED;
2689 return p->phys_offset;
2690 }
2691
2692 void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size)
2693 {
2694 if (kvm_enabled())
2695 kvm_coalesce_mmio_region(addr, size);
2696 }
2697
2698 void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size)
2699 {
2700 if (kvm_enabled())
2701 kvm_uncoalesce_mmio_region(addr, size);
2702 }
2703
2704 void qemu_flush_coalesced_mmio_buffer(void)
2705 {
2706 if (kvm_enabled())
2707 kvm_flush_coalesced_mmio_buffer();
2708 }
2709
2710 #if defined(__linux__) && !defined(TARGET_S390X)
2711
2712 #include <sys/vfs.h>
2713
2714 #define HUGETLBFS_MAGIC 0x958458f6
2715
2716 static long gethugepagesize(const char *path)
2717 {
2718 struct statfs fs;
2719 int ret;
2720
2721 do {
2722 ret = statfs(path, &fs);
2723 } while (ret != 0 && errno == EINTR);
2724
2725 if (ret != 0) {
2726 perror(path);
2727 return 0;
2728 }
2729
2730 if (fs.f_type != HUGETLBFS_MAGIC)
2731 fprintf(stderr, "Warning: path not on HugeTLBFS: %s\n", path);
2732
2733 return fs.f_bsize;
2734 }
2735
2736 static void *file_ram_alloc(RAMBlock *block,
2737 ram_addr_t memory,
2738 const char *path)
2739 {
2740 char *filename;
2741 void *area;
2742 int fd;
2743 #ifdef MAP_POPULATE
2744 int flags;
2745 #endif
2746 unsigned long hpagesize;
2747
2748 hpagesize = gethugepagesize(path);
2749 if (!hpagesize) {
2750 return NULL;
2751 }
2752
2753 if (memory < hpagesize) {
2754 return NULL;
2755 }
2756
2757 if (kvm_enabled() && !kvm_has_sync_mmu()) {
2758 fprintf(stderr, "host lacks kvm mmu notifiers, -mem-path unsupported\n");
2759 return NULL;
2760 }
2761
2762 if (asprintf(&filename, "%s/qemu_back_mem.XXXXXX", path) == -1) {
2763 return NULL;
2764 }
2765
2766 fd = mkstemp(filename);
2767 if (fd < 0) {
2768 perror("unable to create backing store for hugepages");
2769 free(filename);
2770 return NULL;
2771 }
2772 unlink(filename);
2773 free(filename);
2774
2775 memory = (memory+hpagesize-1) & ~(hpagesize-1);
2776
2777 /*
2778 * ftruncate is not supported by hugetlbfs in older
2779 * hosts, so don't bother bailing out on errors.
2780 * If anything goes wrong with it under other filesystems,
2781 * mmap will fail.
2782 */
2783 if (ftruncate(fd, memory))
2784 perror("ftruncate");
2785
2786 #ifdef MAP_POPULATE
2787 /* NB: MAP_POPULATE won't exhaustively alloc all phys pages in the case
2788 * MAP_PRIVATE is requested. For mem_prealloc we mmap as MAP_SHARED
2789 * to sidestep this quirk.
2790 */
2791 flags = mem_prealloc ? MAP_POPULATE | MAP_SHARED : MAP_PRIVATE;
2792 area = mmap(0, memory, PROT_READ | PROT_WRITE, flags, fd, 0);
2793 #else
2794 area = mmap(0, memory, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
2795 #endif
2796 if (area == MAP_FAILED) {
2797 perror("file_ram_alloc: can't mmap RAM pages");
2798 close(fd);
2799 return (NULL);
2800 }
2801 block->fd = fd;
2802 return area;
2803 }
2804 #endif
2805
2806 static ram_addr_t find_ram_offset(ram_addr_t size)
2807 {
2808 RAMBlock *block, *next_block;
2809 ram_addr_t offset = 0, mingap = ULONG_MAX;
2810
2811 if (QLIST_EMPTY(&ram_list.blocks))
2812 return 0;
2813
2814 QLIST_FOREACH(block, &ram_list.blocks, next) {
2815 ram_addr_t end, next = ULONG_MAX;
2816
2817 end = block->offset + block->length;
2818
2819 QLIST_FOREACH(next_block, &ram_list.blocks, next) {
2820 if (next_block->offset >= end) {
2821 next = MIN(next, next_block->offset);
2822 }
2823 }
2824 if (next - end >= size && next - end < mingap) {
2825 offset = end;
2826 mingap = next - end;
2827 }
2828 }
2829 return offset;
2830 }
2831
2832 static ram_addr_t last_ram_offset(void)
2833 {
2834 RAMBlock *block;
2835 ram_addr_t last = 0;
2836
2837 QLIST_FOREACH(block, &ram_list.blocks, next)
2838 last = MAX(last, block->offset + block->length);
2839
2840 return last;
2841 }
2842
2843 ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name,
2844 ram_addr_t size, void *host)
2845 {
2846 RAMBlock *new_block, *block;
2847
2848 size = TARGET_PAGE_ALIGN(size);
2849 new_block = qemu_mallocz(sizeof(*new_block));
2850
2851 if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) {
2852 char *id = dev->parent_bus->info->get_dev_path(dev);
2853 if (id) {
2854 snprintf(new_block->idstr, sizeof(new_block->idstr), "%s/", id);
2855 qemu_free(id);
2856 }
2857 }
2858 pstrcat(new_block->idstr, sizeof(new_block->idstr), name);
2859
2860 QLIST_FOREACH(block, &ram_list.blocks, next) {
2861 if (!strcmp(block->idstr, new_block->idstr)) {
2862 fprintf(stderr, "RAMBlock \"%s\" already registered, abort!\n",
2863 new_block->idstr);
2864 abort();
2865 }
2866 }
2867
2868 if (host) {
2869 new_block->host = host;
2870 new_block->flags |= RAM_PREALLOC_MASK;
2871 } else {
2872 if (mem_path) {
2873 #if defined (__linux__) && !defined(TARGET_S390X)
2874 new_block->host = file_ram_alloc(new_block, size, mem_path);
2875 if (!new_block->host) {
2876 new_block->host = qemu_vmalloc(size);
2877 qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE);
2878 }
2879 #else
2880 fprintf(stderr, "-mem-path option unsupported\n");
2881 exit(1);
2882 #endif
2883 } else {
2884 #if defined(TARGET_S390X) && defined(CONFIG_KVM)
2885 /* XXX S390 KVM requires the topmost vma of the RAM to be < 256GB */
2886 new_block->host = mmap((void*)0x1000000, size,
2887 PROT_EXEC|PROT_READ|PROT_WRITE,
2888 MAP_SHARED | MAP_ANONYMOUS, -1, 0);
2889 #else
2890 new_block->host = qemu_vmalloc(size);
2891 #endif
2892 qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE);
2893 }
2894 }
2895
2896 new_block->offset = find_ram_offset(size);
2897 new_block->length = size;
2898
2899 QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next);
2900
2901 ram_list.phys_dirty = qemu_realloc(ram_list.phys_dirty,
2902 last_ram_offset() >> TARGET_PAGE_BITS);
2903 memset(ram_list.phys_dirty + (new_block->offset >> TARGET_PAGE_BITS),
2904 0xff, size >> TARGET_PAGE_BITS);
2905
2906 if (kvm_enabled())
2907 kvm_setup_guest_memory(new_block->host, size);
2908
2909 return new_block->offset;
2910 }
2911
2912 ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size)
2913 {
2914 return qemu_ram_alloc_from_ptr(dev, name, size, NULL);
2915 }
2916
2917 void qemu_ram_free(ram_addr_t addr)
2918 {
2919 RAMBlock *block;
2920
2921 QLIST_FOREACH(block, &ram_list.blocks, next) {
2922 if (addr == block->offset) {
2923 QLIST_REMOVE(block, next);
2924 if (block->flags & RAM_PREALLOC_MASK) {
2925 ;
2926 } else if (mem_path) {
2927 #if defined (__linux__) && !defined(TARGET_S390X)
2928 if (block->fd) {
2929 munmap(block->host, block->length);
2930 close(block->fd);
2931 } else {
2932 qemu_vfree(block->host);
2933 }
2934 #else
2935 abort();
2936 #endif
2937 } else {
2938 #if defined(TARGET_S390X) && defined(CONFIG_KVM)
2939 munmap(block->host, block->length);
2940 #else
2941 qemu_vfree(block->host);
2942 #endif
2943 }
2944 qemu_free(block);
2945 return;
2946 }
2947 }
2948
2949 }
2950
2951 #ifndef _WIN32
2952 void qemu_ram_remap(ram_addr_t addr, ram_addr_t length)
2953 {
2954 RAMBlock *block;
2955 ram_addr_t offset;
2956 int flags;
2957 void *area, *vaddr;
2958
2959 QLIST_FOREACH(block, &ram_list.blocks, next) {
2960 offset = addr - block->offset;
2961 if (offset < block->length) {
2962 vaddr = block->host + offset;
2963 if (block->flags & RAM_PREALLOC_MASK) {
2964 ;
2965 } else {
2966 flags = MAP_FIXED;
2967 munmap(vaddr, length);
2968 if (mem_path) {
2969 #if defined(__linux__) && !defined(TARGET_S390X)
2970 if (block->fd) {
2971 #ifdef MAP_POPULATE
2972 flags |= mem_prealloc ? MAP_POPULATE | MAP_SHARED :
2973 MAP_PRIVATE;
2974 #else
2975 flags |= MAP_PRIVATE;
2976 #endif
2977 area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
2978 flags, block->fd, offset);
2979 } else {
2980 flags |= MAP_PRIVATE | MAP_ANONYMOUS;
2981 area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
2982 flags, -1, 0);
2983 }
2984 #else
2985 abort();
2986 #endif
2987 } else {
2988 #if defined(TARGET_S390X) && defined(CONFIG_KVM)
2989 flags |= MAP_SHARED | MAP_ANONYMOUS;
2990 area = mmap(vaddr, length, PROT_EXEC|PROT_READ|PROT_WRITE,
2991 flags, -1, 0);
2992 #else
2993 flags |= MAP_PRIVATE | MAP_ANONYMOUS;
2994 area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
2995 flags, -1, 0);
2996 #endif
2997 }
2998 if (area != vaddr) {
2999 fprintf(stderr, "Could not remap addr: %lx@%lx\n",
3000 length, addr);
3001 exit(1);
3002 }
3003 qemu_madvise(vaddr, length, QEMU_MADV_MERGEABLE);
3004 }
3005 return;
3006 }
3007 }
3008 }
3009 #endif /* !_WIN32 */
3010
3011 /* Return a host pointer to ram allocated with qemu_ram_alloc.
3012 With the exception of the softmmu code in this file, this should
3013 only be used for local memory (e.g. video ram) that the device owns,
3014 and knows it isn't going to access beyond the end of the block.
3015
3016 It should not be used for general purpose DMA.
3017 Use cpu_physical_memory_map/cpu_physical_memory_rw instead.
3018 */
3019 void *qemu_get_ram_ptr(ram_addr_t addr)
3020 {
3021 RAMBlock *block;
3022
3023 QLIST_FOREACH(block, &ram_list.blocks, next) {
3024 if (addr - block->offset < block->length) {
3025 /* Move this entry to to start of the list. */
3026 if (block != QLIST_FIRST(&ram_list.blocks)) {
3027 QLIST_REMOVE(block, next);
3028 QLIST_INSERT_HEAD(&ram_list.blocks, block, next);
3029 }
3030 return block->host + (addr - block->offset);
3031 }
3032 }
3033
3034 fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
3035 abort();
3036
3037 return NULL;
3038 }
3039
3040 /* Return a host pointer to ram allocated with qemu_ram_alloc.
3041 * Same as qemu_get_ram_ptr but avoid reordering ramblocks.
3042 */
3043 void *qemu_safe_ram_ptr(ram_addr_t addr)
3044 {
3045 RAMBlock *block;
3046
3047 QLIST_FOREACH(block, &ram_list.blocks, next) {
3048 if (addr - block->offset < block->length) {
3049 return block->host + (addr - block->offset);
3050 }
3051 }
3052
3053 fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
3054 abort();
3055
3056 return NULL;
3057 }
3058
3059 int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
3060 {
3061 RAMBlock *block;
3062 uint8_t *host = ptr;
3063
3064 QLIST_FOREACH(block, &ram_list.blocks, next) {
3065 if (host - block->host < block->length) {
3066 *ram_addr = block->offset + (host - block->host);
3067 return 0;
3068 }
3069 }
3070 return -1;
3071 }
3072
3073 /* Some of the softmmu routines need to translate from a host pointer
3074 (typically a TLB entry) back to a ram offset. */
3075 ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr)
3076 {
3077 ram_addr_t ram_addr;
3078
3079 if (qemu_ram_addr_from_host(ptr, &ram_addr)) {
3080 fprintf(stderr, "Bad ram pointer %p\n", ptr);
3081 abort();
3082 }
3083 return ram_addr;
3084 }
3085
3086 static uint32_t unassigned_mem_readb(void *opaque, target_phys_addr_t addr)
3087 {
3088 #ifdef DEBUG_UNASSIGNED
3089 printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
3090 #endif
3091 #if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3092 do_unassigned_access(addr, 0, 0, 0, 1);
3093 #endif
3094 return 0;
3095 }
3096
3097 static uint32_t unassigned_mem_readw(void *opaque, target_phys_addr_t addr)
3098 {
3099 #ifdef DEBUG_UNASSIGNED
3100 printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
3101 #endif
3102 #if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3103 do_unassigned_access(addr, 0, 0, 0, 2);
3104 #endif
3105 return 0;
3106 }
3107
3108 static uint32_t unassigned_mem_readl(void *opaque, target_phys_addr_t addr)
3109 {
3110 #ifdef DEBUG_UNASSIGNED
3111 printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
3112 #endif
3113 #if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3114 do_unassigned_access(addr, 0, 0, 0, 4);
3115 #endif
3116 return 0;
3117 }
3118
3119 static void unassigned_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
3120 {
3121 #ifdef DEBUG_UNASSIGNED
3122 printf("Unassigned mem write " TARGET_FMT_plx " = 0x%x\n", addr, val);
3123 #endif
3124 #if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3125 do_unassigned_access(addr, 1, 0, 0, 1);
3126 #endif
3127 }
3128
3129 static void unassigned_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
3130 {
3131 #ifdef DEBUG_UNASSIGNED
3132 printf("Unassigned mem write " TARGET_FMT_plx " = 0x%x\n", addr, val);
3133 #endif
3134 #if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3135 do_unassigned_access(addr, 1, 0, 0, 2);
3136 #endif
3137 }
3138
3139 static void unassigned_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
3140 {
3141 #ifdef DEBUG_UNASSIGNED
3142 printf("Unassigned mem write " TARGET_FMT_plx " = 0x%x\n", addr, val);
3143 #endif
3144 #if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3145 do_unassigned_access(addr, 1, 0, 0, 4);
3146 #endif
3147 }
3148
3149 static CPUReadMemoryFunc * const unassigned_mem_read[3] = {
3150 unassigned_mem_readb,
3151 unassigned_mem_readw,
3152 unassigned_mem_readl,
3153 };
3154
3155 static CPUWriteMemoryFunc * const unassigned_mem_write[3] = {
3156 unassigned_mem_writeb,
3157 unassigned_mem_writew,
3158 unassigned_mem_writel,
3159 };
3160
3161 static void notdirty_mem_writeb(void *opaque, target_phys_addr_t ram_addr,
3162 uint32_t val)
3163 {
3164 int dirty_flags;
3165 dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3166 if (!(dirty_flags & CODE_DIRTY_FLAG)) {
3167 #if !defined(CONFIG_USER_ONLY)
3168 tb_invalidate_phys_page_fast(ram_addr, 1);
3169 dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3170 #endif
3171 }
3172 stb_p(qemu_get_ram_ptr(ram_addr), val);
3173 dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
3174 cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
3175 /* we remove the notdirty callback only if the code has been
3176 flushed */
3177 if (dirty_flags == 0xff)
3178 tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
3179 }
3180
3181 static void notdirty_mem_writew(void *opaque, target_phys_addr_t ram_addr,
3182 uint32_t val)
3183 {
3184 int dirty_flags;
3185 dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3186 if (!(dirty_flags & CODE_DIRTY_FLAG)) {
3187 #if !defined(CONFIG_USER_ONLY)
3188 tb_invalidate_phys_page_fast(ram_addr, 2);
3189 dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3190 #endif
3191 }
3192 stw_p(qemu_get_ram_ptr(ram_addr), val);
3193 dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
3194 cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
3195 /* we remove the notdirty callback only if the code has been
3196 flushed */
3197 if (dirty_flags == 0xff)
3198 tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
3199 }
3200
3201 static void notdirty_mem_writel(void *opaque, target_phys_addr_t ram_addr,
3202 uint32_t val)
3203 {
3204 int dirty_flags;
3205 dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3206 if (!(dirty_flags & CODE_DIRTY_FLAG)) {
3207 #if !defined(CONFIG_USER_ONLY)
3208 tb_invalidate_phys_page_fast(ram_addr, 4);
3209 dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3210 #endif
3211 }
3212 stl_p(qemu_get_ram_ptr(ram_addr), val);
3213 dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
3214 cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
3215 /* we remove the notdirty callback only if the code has been
3216 flushed */
3217 if (dirty_flags == 0xff)
3218 tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
3219 }
3220
3221 static CPUReadMemoryFunc * const error_mem_read[3] = {
3222 NULL, /* never used */
3223 NULL, /* never used */
3224 NULL, /* never used */
3225 };
3226
3227 static CPUWriteMemoryFunc * const notdirty_mem_write[3] = {
3228 notdirty_mem_writeb,
3229 notdirty_mem_writew,
3230 notdirty_mem_writel,
3231 };
3232
3233 /* Generate a debug exception if a watchpoint has been hit. */
3234 static void check_watchpoint(int offset, int len_mask, int flags)
3235 {
3236 CPUState *env = cpu_single_env;
3237 target_ulong pc, cs_base;
3238 TranslationBlock *tb;
3239 target_ulong vaddr;
3240 CPUWatchpoint *wp;
3241 int cpu_flags;
3242
3243 if (env->watchpoint_hit) {
3244 /* We re-entered the check after replacing the TB. Now raise
3245 * the debug interrupt so that is will trigger after the
3246 * current instruction. */
3247 cpu_interrupt(env, CPU_INTERRUPT_DEBUG);
3248 return;
3249 }
3250 vaddr = (env->mem_io_vaddr & TARGET_PAGE_MASK) + offset;
3251 QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
3252 if ((vaddr == (wp->vaddr & len_mask) ||
3253 (vaddr & wp->len_mask) == wp->vaddr) && (wp->flags & flags)) {
3254 wp->flags |= BP_WATCHPOINT_HIT;
3255 if (!env->watchpoint_hit) {
3256 env->watchpoint_hit = wp;
3257 tb = tb_find_pc(env->mem_io_pc);
3258 if (!tb) {
3259 cpu_abort(env, "check_watchpoint: could not find TB for "
3260 "pc=%p", (void *)env->mem_io_pc);
3261 }
3262 cpu_restore_state(tb, env, env->mem_io_pc, NULL);
3263 tb_phys_invalidate(tb, -1);
3264 if (wp->flags & BP_STOP_BEFORE_ACCESS) {
3265 env->exception_index = EXCP_DEBUG;
3266 } else {
3267 cpu_get_tb_cpu_state(env, &pc, &cs_base, &cpu_flags);
3268 tb_gen_code(env, pc, cs_base, cpu_flags, 1);
3269 }
3270 cpu_resume_from_signal(env, NULL);
3271 }
3272 } else {
3273 wp->flags &= ~BP_WATCHPOINT_HIT;
3274 }
3275 }
3276 }
3277
3278 /* Watchpoint access routines. Watchpoints are inserted using TLB tricks,
3279 so these check for a hit then pass through to the normal out-of-line
3280 phys routines. */
3281 static uint32_t watch_mem_readb(void *opaque, target_phys_addr_t addr)
3282 {
3283 check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x0, BP_MEM_READ);
3284 return ldub_phys(addr);
3285 }
3286
3287 static uint32_t watch_mem_readw(void *opaque, target_phys_addr_t addr)
3288 {
3289 check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x1, BP_MEM_READ);
3290 return lduw_phys(addr);
3291 }
3292
3293 static uint32_t watch_mem_readl(void *opaque, target_phys_addr_t addr)
3294 {
3295 check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x3, BP_MEM_READ);
3296 return ldl_phys(addr);
3297 }
3298
3299 static void watch_mem_writeb(void *opaque, target_phys_addr_t addr,
3300 uint32_t val)
3301 {
3302 check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x0, BP_MEM_WRITE);
3303 stb_phys(addr, val);
3304 }
3305
3306 static void watch_mem_writew(void *opaque, target_phys_addr_t addr,
3307 uint32_t val)
3308 {
3309 check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x1, BP_MEM_WRITE);
3310 stw_phys(addr, val);
3311 }
3312
3313 static void watch_mem_writel(void *opaque, target_phys_addr_t addr,
3314 uint32_t val)
3315 {
3316 check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x3, BP_MEM_WRITE);
3317 stl_phys(addr, val);
3318 }
3319
3320 static CPUReadMemoryFunc * const watch_mem_read[3] = {
3321 watch_mem_readb,
3322 watch_mem_readw,
3323 watch_mem_readl,
3324 };
3325
3326 static CPUWriteMemoryFunc * const watch_mem_write[3] = {
3327 watch_mem_writeb,
3328 watch_mem_writew,
3329 watch_mem_writel,
3330 };
3331
3332 static inline uint32_t subpage_readlen (subpage_t *mmio,
3333 target_phys_addr_t addr,
3334 unsigned int len)
3335 {
3336 unsigned int idx = SUBPAGE_IDX(addr);
3337 #if defined(DEBUG_SUBPAGE)
3338 printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d\n", __func__,
3339 mmio, len, addr, idx);
3340 #endif
3341
3342 addr += mmio->region_offset[idx];
3343 idx = mmio->sub_io_index[idx];
3344 return io_mem_read[idx][len](io_mem_opaque[idx], addr);
3345 }
3346
3347 static inline void subpage_writelen (subpage_t *mmio, target_phys_addr_t addr,
3348 uint32_t value, unsigned int len)
3349 {
3350 unsigned int idx = SUBPAGE_IDX(addr);
3351 #if defined(DEBUG_SUBPAGE)
3352 printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d value %08x\n",
3353 __func__, mmio, len, addr, idx, value);
3354 #endif
3355
3356 addr += mmio->region_offset[idx];
3357 idx = mmio->sub_io_index[idx];
3358 io_mem_write[idx][len](io_mem_opaque[idx], addr, value);
3359 }
3360
3361 static uint32_t subpage_readb (void *opaque, target_phys_addr_t addr)
3362 {
3363 return subpage_readlen(opaque, addr, 0);
3364 }
3365
3366 static void subpage_writeb (void *opaque, target_phys_addr_t addr,
3367 uint32_t value)
3368 {
3369 subpage_writelen(opaque, addr, value, 0);
3370 }
3371
3372 static uint32_t subpage_readw (void *opaque, target_phys_addr_t addr)
3373 {
3374 return subpage_readlen(opaque, addr, 1);
3375 }
3376
3377 static void subpage_writew (void *opaque, target_phys_addr_t addr,
3378 uint32_t value)
3379 {
3380 subpage_writelen(opaque, addr, value, 1);
3381 }
3382
3383 static uint32_t subpage_readl (void *opaque, target_phys_addr_t addr)
3384 {
3385 return subpage_readlen(opaque, addr, 2);
3386 }
3387
3388 static void subpage_writel (void *opaque, target_phys_addr_t addr,
3389 uint32_t value)
3390 {
3391 subpage_writelen(opaque, addr, value, 2);
3392 }
3393
3394 static CPUReadMemoryFunc * const subpage_read[] = {
3395 &subpage_readb,
3396 &subpage_readw,
3397 &subpage_readl,
3398 };
3399
3400 static CPUWriteMemoryFunc * const subpage_write[] = {
3401 &subpage_writeb,
3402 &subpage_writew,
3403 &subpage_writel,
3404 };
3405
3406 static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
3407 ram_addr_t memory, ram_addr_t region_offset)
3408 {
3409 int idx, eidx;
3410
3411 if (start >= TARGET_PAGE_SIZE || end >= TARGET_PAGE_SIZE)
3412 return -1;
3413 idx = SUBPAGE_IDX(start);
3414 eidx = SUBPAGE_IDX(end);
3415 #if defined(DEBUG_SUBPAGE)
3416 printf("%s: %p start %08x end %08x idx %08x eidx %08x mem %ld\n", __func__,
3417 mmio, start, end, idx, eidx, memory);
3418 #endif
3419 if ((memory & ~TARGET_PAGE_MASK) == IO_MEM_RAM)
3420 memory = IO_MEM_UNASSIGNED;
3421 memory = (memory >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
3422 for (; idx <= eidx; idx++) {
3423 mmio->sub_io_index[idx] = memory;
3424 mmio->region_offset[idx] = region_offset;
3425 }
3426
3427 return 0;
3428 }
3429
3430 static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
3431 ram_addr_t orig_memory,
3432 ram_addr_t region_offset)
3433 {
3434 subpage_t *mmio;
3435 int subpage_memory;
3436
3437 mmio = qemu_mallocz(sizeof(subpage_t));
3438
3439 mmio->base = base;
3440 subpage_memory = cpu_register_io_memory(subpage_read, subpage_write, mmio,
3441 DEVICE_NATIVE_ENDIAN);
3442 #if defined(DEBUG_SUBPAGE)
3443 printf("%s: %p base " TARGET_FMT_plx " len %08x %d\n", __func__,
3444 mmio, base, TARGET_PAGE_SIZE, subpage_memory);
3445 #endif
3446 *phys = subpage_memory | IO_MEM_SUBPAGE;
3447 subpage_register(mmio, 0, TARGET_PAGE_SIZE-1, orig_memory, region_offset);
3448
3449 return mmio;
3450 }
3451
3452 static int get_free_io_mem_idx(void)
3453 {
3454 int i;
3455
3456 for (i = 0; i<IO_MEM_NB_ENTRIES; i++)
3457 if (!io_mem_used[i]) {
3458 io_mem_used[i] = 1;
3459 return i;
3460 }
3461 fprintf(stderr, "RAN out out io_mem_idx, max %d !\n", IO_MEM_NB_ENTRIES);
3462 return -1;
3463 }
3464
3465 /*
3466 * Usually, devices operate in little endian mode. There are devices out
3467 * there that operate in big endian too. Each device gets byte swapped
3468 * mmio if plugged onto a CPU that does the other endianness.
3469 *
3470 * CPU Device swap?
3471 *
3472 * little little no
3473 * little big yes
3474 * big little yes
3475 * big big no
3476 */
3477
3478 typedef struct SwapEndianContainer {
3479 CPUReadMemoryFunc *read[3];
3480 CPUWriteMemoryFunc *write[3];
3481 void *opaque;
3482 } SwapEndianContainer;
3483
3484 static uint32_t swapendian_mem_readb (void *opaque, target_phys_addr_t addr)
3485 {
3486 uint32_t val;
3487 SwapEndianContainer *c = opaque;
3488 val = c->read[0](c->opaque, addr);
3489 return val;
3490 }
3491
3492 static uint32_t swapendian_mem_readw(void *opaque, target_phys_addr_t addr)
3493 {
3494 uint32_t val;
3495 SwapEndianContainer *c = opaque;
3496 val = bswap16(c->read[1](c->opaque, addr));
3497 return val;
3498 }
3499
3500 static uint32_t swapendian_mem_readl(void *opaque, target_phys_addr_t addr)
3501 {
3502 uint32_t val;
3503 SwapEndianContainer *c = opaque;
3504 val = bswap32(c->read[2](c->opaque, addr));
3505 return val;
3506 }
3507
3508 static CPUReadMemoryFunc * const swapendian_readfn[3]={
3509 swapendian_mem_readb,
3510 swapendian_mem_readw,
3511 swapendian_mem_readl
3512 };
3513
3514 static void swapendian_mem_writeb(void *opaque, target_phys_addr_t addr,
3515 uint32_t val)
3516 {
3517 SwapEndianContainer *c = opaque;
3518 c->write[0](c->opaque, addr, val);
3519 }
3520
3521 static void swapendian_mem_writew(void *opaque, target_phys_addr_t addr,
3522 uint32_t val)
3523 {
3524 SwapEndianContainer *c = opaque;
3525 c->write[1](c->opaque, addr, bswap16(val));
3526 }
3527
3528 static void swapendian_mem_writel(void *opaque, target_phys_addr_t addr,
3529 uint32_t val)
3530 {
3531 SwapEndianContainer *c = opaque;
3532 c->write[2](c->opaque, addr, bswap32(val));
3533 }
3534
3535 static CPUWriteMemoryFunc * const swapendian_writefn[3]={
3536 swapendian_mem_writeb,
3537 swapendian_mem_writew,
3538 swapendian_mem_writel
3539 };
3540
3541 static void swapendian_init(int io_index)
3542 {
3543 SwapEndianContainer *c = qemu_malloc(sizeof(SwapEndianContainer));
3544 int i;
3545
3546 /* Swap mmio for big endian targets */
3547 c->opaque = io_mem_opaque[io_index];
3548 for (i = 0; i < 3; i++) {
3549 c->read[i] = io_mem_read[io_index][i];
3550 c->write[i] = io_mem_write[io_index][i];
3551
3552 io_mem_read[io_index][i] = swapendian_readfn[i];
3553 io_mem_write[io_index][i] = swapendian_writefn[i];
3554 }
3555 io_mem_opaque[io_index] = c;
3556 }
3557
3558 static void swapendian_del(int io_index)
3559 {
3560 if (io_mem_read[io_index][0] == swapendian_readfn[0]) {
3561 qemu_free(io_mem_opaque[io_index]);
3562 }
3563 }
3564
3565 /* mem_read and mem_write are arrays of functions containing the
3566 function to access byte (index 0), word (index 1) and dword (index
3567 2). Functions can be omitted with a NULL function pointer.
3568 If io_index is non zero, the corresponding io zone is
3569 modified. If it is zero, a new io zone is allocated. The return
3570 value can be used with cpu_register_physical_memory(). (-1) is
3571 returned if error. */
3572 static int cpu_register_io_memory_fixed(int io_index,
3573 CPUReadMemoryFunc * const *mem_read,
3574 CPUWriteMemoryFunc * const *mem_write,
3575 void *opaque, enum device_endian endian)
3576 {
3577 int i;
3578
3579 if (io_index <= 0) {
3580 io_index = get_free_io_mem_idx();
3581 if (io_index == -1)
3582 return io_index;
3583 } else {
3584 io_index >>= IO_MEM_SHIFT;
3585 if (io_index >= IO_MEM_NB_ENTRIES)
3586 return -1;
3587 }
3588
3589 for (i = 0; i < 3; ++i) {
3590 io_mem_read[io_index][i]
3591 = (mem_read[i] ? mem_read[i] : unassigned_mem_read[i]);
3592 }
3593 for (i = 0; i < 3; ++i) {
3594 io_mem_write[io_index][i]
3595 = (mem_write[i] ? mem_write[i] : unassigned_mem_write[i]);
3596 }
3597 io_mem_opaque[io_index] = opaque;
3598
3599 switch (endian) {
3600 case DEVICE_BIG_ENDIAN:
3601 #ifndef TARGET_WORDS_BIGENDIAN
3602 swapendian_init(io_index);
3603 #endif
3604 break;
3605 case DEVICE_LITTLE_ENDIAN:
3606 #ifdef TARGET_WORDS_BIGENDIAN
3607 swapendian_init(io_index);
3608 #endif
3609 break;
3610 case DEVICE_NATIVE_ENDIAN:
3611 default:
3612 break;
3613 }
3614
3615 return (io_index << IO_MEM_SHIFT);
3616 }
3617
3618 int cpu_register_io_memory(CPUReadMemoryFunc * const *mem_read,
3619 CPUWriteMemoryFunc * const *mem_write,
3620 void *opaque, enum device_endian endian)
3621 {
3622 return cpu_register_io_memory_fixed(0, mem_read, mem_write, opaque, endian);
3623 }
3624
3625 void cpu_unregister_io_memory(int io_table_address)
3626 {
3627 int i;
3628 int io_index = io_table_address >> IO_MEM_SHIFT;
3629
3630 swapendian_del(io_index);
3631
3632 for (i=0;i < 3; i++) {
3633 io_mem_read[io_index][i] = unassigned_mem_read[i];
3634 io_mem_write[io_index][i] = unassigned_mem_write[i];
3635 }
3636 io_mem_opaque[io_index] = NULL;
3637 io_mem_used[io_index] = 0;
3638 }
3639
3640 static void io_mem_init(void)
3641 {
3642 int i;
3643
3644 cpu_register_io_memory_fixed(IO_MEM_ROM, error_mem_read,
3645 unassigned_mem_write, NULL,
3646 DEVICE_NATIVE_ENDIAN);
3647 cpu_register_io_memory_fixed(IO_MEM_UNASSIGNED, unassigned_mem_read,
3648 unassigned_mem_write, NULL,
3649 DEVICE_NATIVE_ENDIAN);
3650 cpu_register_io_memory_fixed(IO_MEM_NOTDIRTY, error_mem_read,
3651 notdirty_mem_write, NULL,
3652 DEVICE_NATIVE_ENDIAN);
3653 for (i=0; i<5; i++)
3654 io_mem_used[i] = 1;
3655
3656 io_mem_watch = cpu_register_io_memory(watch_mem_read,
3657 watch_mem_write, NULL,
3658 DEVICE_NATIVE_ENDIAN);
3659 }
3660
3661 #endif /* !defined(CONFIG_USER_ONLY) */
3662
3663 /* physical memory access (slow version, mainly for debug) */
3664 #if defined(CONFIG_USER_ONLY)
3665 int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
3666 uint8_t *buf, int len, int is_write)
3667 {
3668 int l, flags;
3669 target_ulong page;
3670 void * p;
3671
3672 while (len > 0) {
3673 page = addr & TARGET_PAGE_MASK;
3674 l = (page + TARGET_PAGE_SIZE) - addr;
3675 if (l > len)
3676 l = len;
3677 flags = page_get_flags(page);
3678 if (!(flags & PAGE_VALID))
3679 return -1;
3680 if (is_write) {
3681 if (!(flags & PAGE_WRITE))
3682 return -1;
3683 /* XXX: this code should not depend on lock_user */
3684 if (!(p = lock_user(VERIFY_WRITE, addr, l, 0)))
3685 return -1;
3686 memcpy(p, buf, l);
3687 unlock_user(p, addr, l);
3688 } else {
3689 if (!(flags & PAGE_READ))
3690 return -1;
3691 /* XXX: this code should not depend on lock_user */
3692 if (!(p = lock_user(VERIFY_READ, addr, l, 1)))
3693 return -1;
3694 memcpy(buf, p, l);
3695 unlock_user(p, addr, 0);
3696 }
3697 len -= l;
3698 buf += l;
3699 addr += l;
3700 }
3701 return 0;
3702 }
3703
3704 #else
3705 void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
3706 int len, int is_write)
3707 {
3708 int l, io_index;
3709 uint8_t *ptr;
3710 uint32_t val;
3711 target_phys_addr_t page;
3712 unsigned long pd;
3713 PhysPageDesc *p;
3714
3715 while (len > 0) {
3716 page = addr & TARGET_PAGE_MASK;
3717 l = (page + TARGET_PAGE_SIZE) - addr;
3718 if (l > len)
3719 l = len;
3720 p = phys_page_find(page >> TARGET_PAGE_BITS);
3721 if (!p) {
3722 pd = IO_MEM_UNASSIGNED;
3723 } else {
3724 pd = p->phys_offset;
3725 }
3726
3727 if (is_write) {
3728 if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
3729 target_phys_addr_t addr1 = addr;
3730 io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
3731 if (p)
3732 addr1 = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
3733 /* XXX: could force cpu_single_env to NULL to avoid
3734 potential bugs */
3735 if (l >= 4 && ((addr1 & 3) == 0)) {
3736 /* 32 bit write access */
3737 val = ldl_p(buf);
3738 io_mem_write[io_index][2](io_mem_opaque[io_index], addr1, val);
3739 l = 4;
3740 } else if (l >= 2 && ((addr1 & 1) == 0)) {
3741 /* 16 bit write access */
3742 val = lduw_p(buf);
3743 io_mem_write[io_index][1](io_mem_opaque[io_index], addr1, val);
3744 l = 2;
3745 } else {
3746 /* 8 bit write access */
3747 val = ldub_p(buf);
3748 io_mem_write[io_index][0](io_mem_opaque[io_index], addr1, val);
3749 l = 1;
3750 }
3751 } else {
3752 unsigned long addr1;
3753 addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
3754 /* RAM case */
3755 ptr = qemu_get_ram_ptr(addr1);
3756 memcpy(ptr, buf, l);
3757 if (!cpu_physical_memory_is_dirty(addr1)) {
3758 /* invalidate code */
3759 tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
3760 /* set dirty bit */
3761 cpu_physical_memory_set_dirty_flags(
3762 addr1, (0xff & ~CODE_DIRTY_FLAG));
3763 }
3764 }
3765 } else {
3766 if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
3767 !(pd & IO_MEM_ROMD)) {
3768 target_phys_addr_t addr1 = addr;
3769 /* I/O case */
3770 io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
3771 if (p)
3772 addr1 = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
3773 if (l >= 4 && ((addr1 & 3) == 0)) {
3774 /* 32 bit read access */
3775 val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr1);
3776 stl_p(buf, val);
3777 l = 4;
3778 } else if (l >= 2 && ((addr1 & 1) == 0)) {
3779 /* 16 bit read access */
3780 val = io_mem_read[io_index][1](io_mem_opaque[io_index], addr1);
3781 stw_p(buf, val);
3782 l = 2;
3783 } else {
3784 /* 8 bit read access */
3785 val = io_mem_read[io_index][0](io_mem_opaque[io_index], addr1);
3786 stb_p(buf, val);
3787 l = 1;
3788 }
3789 } else {
3790 /* RAM case */
3791 ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
3792 (addr & ~TARGET_PAGE_MASK);
3793 memcpy(buf, ptr, l);
3794 }
3795 }
3796 len -= l;
3797 buf += l;
3798 addr += l;
3799 }
3800 }
3801
3802 /* used for ROM loading : can write in RAM and ROM */
3803 void cpu_physical_memory_write_rom(target_phys_addr_t addr,
3804 const uint8_t *buf, int len)
3805 {
3806 int l;
3807 uint8_t *ptr;
3808 target_phys_addr_t page;
3809 unsigned long pd;
3810 PhysPageDesc *p;
3811
3812 while (len > 0) {
3813 page = addr & TARGET_PAGE_MASK;
3814 l = (page + TARGET_PAGE_SIZE) - addr;
3815 if (l > len)
3816 l = len;
3817 p = phys_page_find(page >> TARGET_PAGE_BITS);
3818 if (!p) {
3819 pd = IO_MEM_UNASSIGNED;
3820 } else {
3821 pd = p->phys_offset;
3822 }
3823
3824 if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM &&
3825 (pd & ~TARGET_PAGE_MASK) != IO_MEM_ROM &&
3826 !(pd & IO_MEM_ROMD)) {
3827 /* do nothing */
3828 } else {
3829 unsigned long addr1;
3830 addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
3831 /* ROM/RAM case */
3832 ptr = qemu_get_ram_ptr(addr1);
3833 memcpy(ptr, buf, l);
3834 }
3835 len -= l;
3836 buf += l;
3837 addr += l;
3838 }
3839 }
3840
3841 typedef struct {
3842 void *buffer;
3843 target_phys_addr_t addr;
3844 target_phys_addr_t len;
3845 } BounceBuffer;
3846
3847 static BounceBuffer bounce;
3848
3849 typedef struct MapClient {
3850 void *opaque;
3851 void (*callback)(void *opaque);
3852 QLIST_ENTRY(MapClient) link;
3853 } MapClient;
3854
3855 static QLIST_HEAD(map_client_list, MapClient) map_client_list
3856 = QLIST_HEAD_INITIALIZER(map_client_list);
3857
3858 void *cpu_register_map_client(void *opaque, void (*callback)(void *opaque))
3859 {
3860 MapClient *client = qemu_malloc(sizeof(*client));
3861
3862 client->opaque = opaque;
3863 client->callback = callback;
3864 QLIST_INSERT_HEAD(&map_client_list, client, link);
3865 return client;
3866 }
3867
3868 void cpu_unregister_map_client(void *_client)
3869 {
3870 MapClient *client = (MapClient *)_client;
3871
3872 QLIST_REMOVE(client, link);
3873 qemu_free(client);
3874 }
3875
3876 static void cpu_notify_map_clients(void)
3877 {
3878 MapClient *client;
3879
3880 while (!QLIST_EMPTY(&map_client_list)) {
3881 client = QLIST_FIRST(&map_client_list);
3882 client->callback(client->opaque);
3883 cpu_unregister_map_client(client);
3884 }
3885 }
3886
3887 /* Map a physical memory region into a host virtual address.
3888 * May map a subset of the requested range, given by and returned in *plen.
3889 * May return NULL if resources needed to perform the mapping are exhausted.
3890 * Use only for reads OR writes - not for read-modify-write operations.
3891 * Use cpu_register_map_client() to know when retrying the map operation is
3892 * likely to succeed.
3893 */
3894 void *cpu_physical_memory_map(target_phys_addr_t addr,
3895 target_phys_addr_t *plen,
3896 int is_write)
3897 {
3898 target_phys_addr_t len = *plen;
3899 target_phys_addr_t done = 0;
3900 int l;
3901 uint8_t *ret = NULL;
3902 uint8_t *ptr;
3903 target_phys_addr_t page;
3904 unsigned long pd;
3905 PhysPageDesc *p;
3906 unsigned long addr1;
3907
3908 while (len > 0) {
3909 page = addr & TARGET_PAGE_MASK;
3910 l = (page + TARGET_PAGE_SIZE) - addr;
3911 if (l > len)
3912 l = len;
3913 p = phys_page_find(page >> TARGET_PAGE_BITS);
3914 if (!p) {
3915 pd = IO_MEM_UNASSIGNED;
3916 } else {
3917 pd = p->phys_offset;
3918 }
3919
3920 if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
3921 if (done || bounce.buffer) {
3922 break;
3923 }
3924 bounce.buffer = qemu_memalign(TARGET_PAGE_SIZE, TARGET_PAGE_SIZE);
3925 bounce.addr = addr;
3926 bounce.len = l;
3927 if (!is_write) {
3928 cpu_physical_memory_rw(addr, bounce.buffer, l, 0);
3929 }
3930 ptr = bounce.buffer;
3931 } else {
3932 addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
3933 ptr = qemu_get_ram_ptr(addr1);
3934 }
3935 if (!done) {
3936 ret = ptr;
3937 } else if (ret + done != ptr) {
3938 break;
3939 }
3940
3941 len -= l;
3942 addr += l;
3943 done += l;
3944 }
3945 *plen = done;
3946 return ret;
3947 }
3948
3949 /* Unmaps a memory region previously mapped by cpu_physical_memory_map().
3950 * Will also mark the memory as dirty if is_write == 1. access_len gives
3951 * the amount of memory that was actually read or written by the caller.
3952 */
3953 void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len,
3954 int is_write, target_phys_addr_t access_len)
3955 {
3956 if (buffer != bounce.buffer) {
3957 if (is_write) {
3958 ram_addr_t addr1 = qemu_ram_addr_from_host_nofail(buffer);
3959 while (access_len) {
3960 unsigned l;
3961 l = TARGET_PAGE_SIZE;
3962 if (l > access_len)
3963 l = access_len;
3964 if (!cpu_physical_memory_is_dirty(addr1)) {
3965 /* invalidate code */
3966 tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
3967 /* set dirty bit */
3968 cpu_physical_memory_set_dirty_flags(
3969 addr1, (0xff & ~CODE_DIRTY_FLAG));
3970 }
3971 addr1 += l;
3972 access_len -= l;
3973 }
3974 }
3975 return;
3976 }
3977 if (is_write) {
3978 cpu_physical_memory_write(bounce.addr, bounce.buffer, access_len);
3979 }
3980 qemu_vfree(bounce.buffer);
3981 bounce.buffer = NULL;
3982 cpu_notify_map_clients();
3983 }
3984
3985 /* warning: addr must be aligned */
3986 uint32_t ldl_phys(target_phys_addr_t addr)
3987 {
3988 int io_index;
3989 uint8_t *ptr;
3990 uint32_t val;
3991 unsigned long pd;
3992 PhysPageDesc *p;
3993
3994 p = phys_page_find(addr >> TARGET_PAGE_BITS);
3995 if (!p) {
3996 pd = IO_MEM_UNASSIGNED;
3997 } else {
3998 pd = p->phys_offset;
3999 }
4000
4001 if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
4002 !(pd & IO_MEM_ROMD)) {
4003 /* I/O case */
4004 io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4005 if (p)
4006 addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4007 val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr);
4008 } else {
4009 /* RAM case */
4010 ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4011 (addr & ~TARGET_PAGE_MASK);
4012 val = ldl_p(ptr);
4013 }
4014 return val;
4015 }
4016
4017 /* warning: addr must be aligned */
4018 uint64_t ldq_phys(target_phys_addr_t addr)
4019 {
4020 int io_index;
4021 uint8_t *ptr;
4022 uint64_t val;
4023 unsigned long pd;
4024 PhysPageDesc *p;
4025
4026 p = phys_page_find(addr >> TARGET_PAGE_BITS);
4027 if (!p) {
4028 pd = IO_MEM_UNASSIGNED;
4029 } else {
4030 pd = p->phys_offset;
4031 }
4032
4033 if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
4034 !(pd & IO_MEM_ROMD)) {
4035 /* I/O case */
4036 io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4037 if (p)
4038 addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4039 #ifdef TARGET_WORDS_BIGENDIAN
4040 val = (uint64_t)io_mem_read[io_index][2](io_mem_opaque[io_index], addr) << 32;
4041 val |= io_mem_read[io_index][2](io_mem_opaque[io_index], addr + 4);
4042 #else
4043 val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr);
4044 val |= (uint64_t)io_mem_read[io_index][2](io_mem_opaque[io_index], addr + 4) << 32;
4045 #endif
4046 } else {
4047 /* RAM case */
4048 ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4049 (addr & ~TARGET_PAGE_MASK);
4050 val = ldq_p(ptr);
4051 }
4052 return val;
4053 }
4054
4055 /* XXX: optimize */
4056 uint32_t ldub_phys(target_phys_addr_t addr)
4057 {
4058 uint8_t val;
4059 cpu_physical_memory_read(addr, &val, 1);
4060 return val;
4061 }
4062
4063 /* warning: addr must be aligned */
4064 uint32_t lduw_phys(target_phys_addr_t addr)
4065 {
4066 int io_index;
4067 uint8_t *ptr;
4068 uint64_t val;
4069 unsigned long pd;
4070 PhysPageDesc *p;
4071
4072 p = phys_page_find(addr >> TARGET_PAGE_BITS);
4073 if (!p) {
4074 pd = IO_MEM_UNASSIGNED;
4075 } else {
4076 pd = p->phys_offset;
4077 }
4078
4079 if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
4080 !(pd & IO_MEM_ROMD)) {
4081 /* I/O case */
4082 io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4083 if (p)
4084 addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4085 val = io_mem_read[io_index][1](io_mem_opaque[io_index], addr);
4086 } else {
4087 /* RAM case */
4088 ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4089 (addr & ~TARGET_PAGE_MASK);
4090 val = lduw_p(ptr);
4091 }
4092 return val;
4093 }
4094
4095 /* warning: addr must be aligned. The ram page is not masked as dirty
4096 and the code inside is not invalidated. It is useful if the dirty
4097 bits are used to track modified PTEs */
4098 void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val)
4099 {
4100 int io_index;
4101 uint8_t *ptr;
4102 unsigned long pd;
4103 PhysPageDesc *p;
4104
4105 p = phys_page_find(addr >> TARGET_PAGE_BITS);
4106 if (!p) {
4107 pd = IO_MEM_UNASSIGNED;
4108 } else {
4109 pd = p->phys_offset;
4110 }
4111
4112 if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4113 io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4114 if (p)
4115 addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4116 io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
4117 } else {
4118 unsigned long addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4119 ptr = qemu_get_ram_ptr(addr1);
4120 stl_p(ptr, val);
4121
4122 if (unlikely(in_migration)) {
4123 if (!cpu_physical_memory_is_dirty(addr1)) {
4124 /* invalidate code */
4125 tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
4126 /* set dirty bit */
4127 cpu_physical_memory_set_dirty_flags(
4128 addr1, (0xff & ~CODE_DIRTY_FLAG));
4129 }
4130 }
4131 }
4132 }
4133
4134 void stq_phys_notdirty(target_phys_addr_t addr, uint64_t val)
4135 {
4136 int io_index;
4137 uint8_t *ptr;
4138 unsigned long pd;
4139 PhysPageDesc *p;
4140
4141 p = phys_page_find(addr >> TARGET_PAGE_BITS);
4142 if (!p) {
4143 pd = IO_MEM_UNASSIGNED;
4144 } else {
4145 pd = p->phys_offset;
4146 }
4147
4148 if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4149 io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4150 if (p)
4151 addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4152 #ifdef TARGET_WORDS_BIGENDIAN
4153 io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val >> 32);
4154 io_mem_write[io_index][2](io_mem_opaque[io_index], addr + 4, val);
4155 #else
4156 io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
4157 io_mem_write[io_index][2](io_mem_opaque[io_index], addr + 4, val >> 32);
4158 #endif
4159 } else {
4160 ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4161 (addr & ~TARGET_PAGE_MASK);
4162 stq_p(ptr, val);
4163 }
4164 }
4165
4166 /* warning: addr must be aligned */
4167 void stl_phys(target_phys_addr_t addr, uint32_t val)
4168 {
4169 int io_index;
4170 uint8_t *ptr;
4171 unsigned long pd;
4172 PhysPageDesc *p;
4173
4174 p = phys_page_find(addr >> TARGET_PAGE_BITS);
4175 if (!p) {
4176 pd = IO_MEM_UNASSIGNED;
4177 } else {
4178 pd = p->phys_offset;
4179 }
4180
4181 if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4182 io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4183 if (p)
4184 addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4185 io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
4186 } else {
4187 unsigned long addr1;
4188 addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4189 /* RAM case */
4190 ptr = qemu_get_ram_ptr(addr1);
4191 stl_p(ptr, val);
4192 if (!cpu_physical_memory_is_dirty(addr1)) {
4193 /* invalidate code */
4194 tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
4195 /* set dirty bit */
4196 cpu_physical_memory_set_dirty_flags(addr1,
4197 (0xff & ~CODE_DIRTY_FLAG));
4198 }
4199 }
4200 }
4201
4202 /* XXX: optimize */
4203 void stb_phys(target_phys_addr_t addr, uint32_t val)
4204 {
4205 uint8_t v = val;
4206 cpu_physical_memory_write(addr, &v, 1);
4207 }
4208
4209 /* warning: addr must be aligned */
4210 void stw_phys(target_phys_addr_t addr, uint32_t val)
4211 {
4212 int io_index;
4213 uint8_t *ptr;
4214 unsigned long pd;
4215 PhysPageDesc *p;
4216
4217 p = phys_page_find(addr >> TARGET_PAGE_BITS);
4218 if (!p) {
4219 pd = IO_MEM_UNASSIGNED;
4220 } else {
4221 pd = p->phys_offset;
4222 }
4223
4224 if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4225 io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4226 if (p)
4227 addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4228 io_mem_write[io_index][1](io_mem_opaque[io_index], addr, val);
4229 } else {
4230 unsigned long addr1;
4231 addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4232 /* RAM case */
4233 ptr = qemu_get_ram_ptr(addr1);
4234 stw_p(ptr, val);
4235 if (!cpu_physical_memory_is_dirty(addr1)) {
4236 /* invalidate code */
4237 tb_invalidate_phys_page_range(addr1, addr1 + 2, 0);
4238 /* set dirty bit */
4239 cpu_physical_memory_set_dirty_flags(addr1,
4240 (0xff & ~CODE_DIRTY_FLAG));
4241 }
4242 }
4243 }
4244
4245 /* XXX: optimize */
4246 void stq_phys(target_phys_addr_t addr, uint64_t val)
4247 {
4248 val = tswap64(val);
4249 cpu_physical_memory_write(addr, (const uint8_t *)&val, 8);
4250 }
4251
4252 /* virtual memory access for debug (includes writing to ROM) */
4253 int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
4254 uint8_t *buf, int len, int is_write)
4255 {
4256 int l;
4257 target_phys_addr_t phys_addr;
4258 target_ulong page;
4259
4260 while (len > 0) {
4261 page = addr & TARGET_PAGE_MASK;
4262 phys_addr = cpu_get_phys_page_debug(env, page);
4263 /* if no physical page mapped, return an error */
4264 if (phys_addr == -1)
4265 return -1;
4266 l = (page + TARGET_PAGE_SIZE) - addr;
4267 if (l > len)
4268 l = len;
4269 phys_addr += (addr & ~TARGET_PAGE_MASK);
4270 if (is_write)
4271 cpu_physical_memory_write_rom(phys_addr, buf, l);
4272 else
4273 cpu_physical_memory_rw(phys_addr, buf, l, is_write);
4274 len -= l;
4275 buf += l;
4276 addr += l;
4277 }
4278 return 0;
4279 }
4280 #endif
4281
4282 /* in deterministic execution mode, instructions doing device I/Os
4283 must be at the end of the TB */
4284 void cpu_io_recompile(CPUState *env, void *retaddr)
4285 {
4286 TranslationBlock *tb;
4287 uint32_t n, cflags;
4288 target_ulong pc, cs_base;
4289 uint64_t flags;
4290
4291 tb = tb_find_pc((unsigned long)retaddr);
4292 if (!tb) {
4293 cpu_abort(env, "cpu_io_recompile: could not find TB for pc=%p",
4294 retaddr);
4295 }
4296 n = env->icount_decr.u16.low + tb->icount;
4297 cpu_restore_state(tb, env, (unsigned long)retaddr, NULL);
4298 /* Calculate how many instructions had been executed before the fault
4299 occurred. */
4300 n = n - env->icount_decr.u16.low;
4301 /* Generate a new TB ending on the I/O insn. */
4302 n++;
4303 /* On MIPS and SH, delay slot instructions can only be restarted if
4304 they were already the first instruction in the TB. If this is not
4305 the first instruction in a TB then re-execute the preceding
4306 branch. */
4307 #if defined(TARGET_MIPS)
4308 if ((env->hflags & MIPS_HFLAG_BMASK) != 0 && n > 1) {
4309 env->active_tc.PC -= 4;
4310 env->icount_decr.u16.low++;
4311 env->hflags &= ~MIPS_HFLAG_BMASK;
4312 }
4313 #elif defined(TARGET_SH4)
4314 if ((env->flags & ((DELAY_SLOT | DELAY_SLOT_CONDITIONAL))) != 0
4315 && n > 1) {
4316 env->pc -= 2;
4317 env->icount_decr.u16.low++;
4318 env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
4319 }
4320 #endif
4321 /* This should never happen. */
4322 if (n > CF_COUNT_MASK)
4323 cpu_abort(env, "TB too big during recompile");
4324
4325 cflags = n | CF_LAST_IO;
4326 pc = tb->pc;
4327 cs_base = tb->cs_base;
4328 flags = tb->flags;
4329 tb_phys_invalidate(tb, -1);
4330 /* FIXME: In theory this could raise an exception. In practice
4331 we have already translated the block once so it's probably ok. */
4332 tb_gen_code(env, pc, cs_base, flags, cflags);
4333 /* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not
4334 the first in the TB) then we end up generating a whole new TB and
4335 repeating the fault, which is horribly inefficient.
4336 Better would be to execute just this insn uncached, or generate a
4337 second new TB. */
4338 cpu_resume_from_signal(env, NULL);
4339 }
4340
4341 #if !defined(CONFIG_USER_ONLY)
4342
4343 void dump_exec_info(FILE *f, fprintf_function cpu_fprintf)
4344 {
4345 int i, target_code_size, max_target_code_size;
4346 int direct_jmp_count, direct_jmp2_count, cross_page;
4347 TranslationBlock *tb;
4348
4349 target_code_size = 0;
4350 max_target_code_size = 0;
4351 cross_page = 0;
4352 direct_jmp_count = 0;
4353 direct_jmp2_count = 0;
4354 for(i = 0; i < nb_tbs; i++) {
4355 tb = &tbs[i];
4356 target_code_size += tb->size;
4357 if (tb->size > max_target_code_size)
4358 max_target_code_size = tb->size;
4359 if (tb->page_addr[1] != -1)
4360 cross_page++;
4361 if (tb->tb_next_offset[0] != 0xffff) {
4362 direct_jmp_count++;
4363 if (tb->tb_next_offset[1] != 0xffff) {
4364 direct_jmp2_count++;
4365 }
4366 }
4367 }
4368 /* XXX: avoid using doubles ? */
4369 cpu_fprintf(f, "Translation buffer state:\n");
4370 cpu_fprintf(f, "gen code size %td/%ld\n",
4371 code_gen_ptr - code_gen_buffer, code_gen_buffer_max_size);
4372 cpu_fprintf(f, "TB count %d/%d\n",
4373 nb_tbs, code_gen_max_blocks);
4374 cpu_fprintf(f, "TB avg target size %d max=%d bytes\n",
4375 nb_tbs ? target_code_size / nb_tbs : 0,
4376 max_target_code_size);
4377 cpu_fprintf(f, "TB avg host size %td bytes (expansion ratio: %0.1f)\n",
4378 nb_tbs ? (code_gen_ptr - code_gen_buffer) / nb_tbs : 0,
4379 target_code_size ? (double) (code_gen_ptr - code_gen_buffer) / target_code_size : 0);
4380 cpu_fprintf(f, "cross page TB count %d (%d%%)\n",
4381 cross_page,
4382 nb_tbs ? (cross_page * 100) / nb_tbs : 0);
4383 cpu_fprintf(f, "direct jump count %d (%d%%) (2 jumps=%d %d%%)\n",
4384 direct_jmp_count,
4385 nb_tbs ? (direct_jmp_count * 100) / nb_tbs : 0,
4386 direct_jmp2_count,
4387 nb_tbs ? (direct_jmp2_count * 100) / nb_tbs : 0);
4388 cpu_fprintf(f, "\nStatistics:\n");
4389 cpu_fprintf(f, "TB flush count %d\n", tb_flush_count);
4390 cpu_fprintf(f, "TB invalidate count %d\n", tb_phys_invalidate_count);
4391 cpu_fprintf(f, "TLB flush count %d\n", tlb_flush_count);
4392 tcg_dump_info(f, cpu_fprintf);
4393 }
4394
4395 #define MMUSUFFIX _cmmu
4396 #define GETPC() NULL
4397 #define env cpu_single_env
4398 #define SOFTMMU_CODE_ACCESS
4399
4400 #define SHIFT 0
4401 #include "softmmu_template.h"
4402
4403 #define SHIFT 1
4404 #include "softmmu_template.h"
4405
4406 #define SHIFT 2
4407 #include "softmmu_template.h"
4408
4409 #define SHIFT 3
4410 #include "softmmu_template.h"
4411
4412 #undef env
4413
4414 #endif