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