]> rtime.felk.cvut.cz Git - lisovros/qemu_apohw.git/blob - translate-all.c
Merge remote-tracking branch 'remotes/awilliam/tags/vfio-pci-for-qemu-20140128.0...
[lisovros/qemu_apohw.git] / translate-all.c
1 /*
2  *  Host code generation
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 #ifdef _WIN32
20 #include <windows.h>
21 #else
22 #include <sys/types.h>
23 #include <sys/mman.h>
24 #endif
25 #include <stdarg.h>
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <string.h>
29 #include <inttypes.h>
30
31 #include "config.h"
32
33 #include "qemu-common.h"
34 #define NO_CPU_IO_DEFS
35 #include "cpu.h"
36 #include "disas/disas.h"
37 #include "tcg.h"
38 #if defined(CONFIG_USER_ONLY)
39 #include "qemu.h"
40 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
41 #include <sys/param.h>
42 #if __FreeBSD_version >= 700104
43 #define HAVE_KINFO_GETVMMAP
44 #define sigqueue sigqueue_freebsd  /* avoid redefinition */
45 #include <sys/time.h>
46 #include <sys/proc.h>
47 #include <machine/profile.h>
48 #define _KERNEL
49 #include <sys/user.h>
50 #undef _KERNEL
51 #undef sigqueue
52 #include <libutil.h>
53 #endif
54 #endif
55 #else
56 #include "exec/address-spaces.h"
57 #endif
58
59 #include "exec/cputlb.h"
60 #include "translate-all.h"
61 #include "qemu/timer.h"
62
63 //#define DEBUG_TB_INVALIDATE
64 //#define DEBUG_FLUSH
65 /* make various TB consistency checks */
66 //#define DEBUG_TB_CHECK
67
68 #if !defined(CONFIG_USER_ONLY)
69 /* TB consistency checks only implemented for usermode emulation.  */
70 #undef DEBUG_TB_CHECK
71 #endif
72
73 #define SMC_BITMAP_USE_THRESHOLD 10
74
75 typedef struct PageDesc {
76     /* list of TBs intersecting this ram page */
77     TranslationBlock *first_tb;
78     /* in order to optimize self modifying code, we count the number
79        of lookups we do to a given page to use a bitmap */
80     unsigned int code_write_count;
81     uint8_t *code_bitmap;
82 #if defined(CONFIG_USER_ONLY)
83     unsigned long flags;
84 #endif
85 } PageDesc;
86
87 /* In system mode we want L1_MAP to be based on ram offsets,
88    while in user mode we want it to be based on virtual addresses.  */
89 #if !defined(CONFIG_USER_ONLY)
90 #if HOST_LONG_BITS < TARGET_PHYS_ADDR_SPACE_BITS
91 # define L1_MAP_ADDR_SPACE_BITS  HOST_LONG_BITS
92 #else
93 # define L1_MAP_ADDR_SPACE_BITS  TARGET_PHYS_ADDR_SPACE_BITS
94 #endif
95 #else
96 # define L1_MAP_ADDR_SPACE_BITS  TARGET_VIRT_ADDR_SPACE_BITS
97 #endif
98
99 /* Size of the L2 (and L3, etc) page tables.  */
100 #define V_L2_BITS 10
101 #define V_L2_SIZE (1 << V_L2_BITS)
102
103 /* The bits remaining after N lower levels of page tables.  */
104 #define V_L1_BITS_REM \
105     ((L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % V_L2_BITS)
106
107 #if V_L1_BITS_REM < 4
108 #define V_L1_BITS  (V_L1_BITS_REM + V_L2_BITS)
109 #else
110 #define V_L1_BITS  V_L1_BITS_REM
111 #endif
112
113 #define V_L1_SIZE  ((target_ulong)1 << V_L1_BITS)
114
115 #define V_L1_SHIFT (L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS - V_L1_BITS)
116
117 uintptr_t qemu_real_host_page_size;
118 uintptr_t qemu_host_page_size;
119 uintptr_t qemu_host_page_mask;
120
121 /* This is a multi-level map on the virtual address space.
122    The bottom level has pointers to PageDesc.  */
123 static void *l1_map[V_L1_SIZE];
124
125 /* code generation context */
126 TCGContext tcg_ctx;
127
128 static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc,
129                          tb_page_addr_t phys_page2);
130 static TranslationBlock *tb_find_pc(uintptr_t tc_ptr);
131
132 void cpu_gen_init(void)
133 {
134     tcg_context_init(&tcg_ctx); 
135 }
136
137 /* return non zero if the very first instruction is invalid so that
138    the virtual CPU can trigger an exception.
139
140    '*gen_code_size_ptr' contains the size of the generated code (host
141    code).
142 */
143 int cpu_gen_code(CPUArchState *env, TranslationBlock *tb, int *gen_code_size_ptr)
144 {
145     TCGContext *s = &tcg_ctx;
146     uint8_t *gen_code_buf;
147     int gen_code_size;
148 #ifdef CONFIG_PROFILER
149     int64_t ti;
150 #endif
151
152 #ifdef CONFIG_PROFILER
153     s->tb_count1++; /* includes aborted translations because of
154                        exceptions */
155     ti = profile_getclock();
156 #endif
157     tcg_func_start(s);
158
159     gen_intermediate_code(env, tb);
160
161     /* generate machine code */
162     gen_code_buf = tb->tc_ptr;
163     tb->tb_next_offset[0] = 0xffff;
164     tb->tb_next_offset[1] = 0xffff;
165     s->tb_next_offset = tb->tb_next_offset;
166 #ifdef USE_DIRECT_JUMP
167     s->tb_jmp_offset = tb->tb_jmp_offset;
168     s->tb_next = NULL;
169 #else
170     s->tb_jmp_offset = NULL;
171     s->tb_next = tb->tb_next;
172 #endif
173
174 #ifdef CONFIG_PROFILER
175     s->tb_count++;
176     s->interm_time += profile_getclock() - ti;
177     s->code_time -= profile_getclock();
178 #endif
179     gen_code_size = tcg_gen_code(s, gen_code_buf);
180     *gen_code_size_ptr = gen_code_size;
181 #ifdef CONFIG_PROFILER
182     s->code_time += profile_getclock();
183     s->code_in_len += tb->size;
184     s->code_out_len += gen_code_size;
185 #endif
186
187 #ifdef DEBUG_DISAS
188     if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) {
189         qemu_log("OUT: [size=%d]\n", *gen_code_size_ptr);
190         log_disas(tb->tc_ptr, *gen_code_size_ptr);
191         qemu_log("\n");
192         qemu_log_flush();
193     }
194 #endif
195     return 0;
196 }
197
198 /* The cpu state corresponding to 'searched_pc' is restored.
199  */
200 static int cpu_restore_state_from_tb(TranslationBlock *tb, CPUArchState *env,
201                                      uintptr_t searched_pc)
202 {
203     TCGContext *s = &tcg_ctx;
204     int j;
205     uintptr_t tc_ptr;
206 #ifdef CONFIG_PROFILER
207     int64_t ti;
208 #endif
209
210 #ifdef CONFIG_PROFILER
211     ti = profile_getclock();
212 #endif
213     tcg_func_start(s);
214
215     gen_intermediate_code_pc(env, tb);
216
217     if (use_icount) {
218         /* Reset the cycle counter to the start of the block.  */
219         env->icount_decr.u16.low += tb->icount;
220         /* Clear the IO flag.  */
221         env->can_do_io = 0;
222     }
223
224     /* find opc index corresponding to search_pc */
225     tc_ptr = (uintptr_t)tb->tc_ptr;
226     if (searched_pc < tc_ptr)
227         return -1;
228
229     s->tb_next_offset = tb->tb_next_offset;
230 #ifdef USE_DIRECT_JUMP
231     s->tb_jmp_offset = tb->tb_jmp_offset;
232     s->tb_next = NULL;
233 #else
234     s->tb_jmp_offset = NULL;
235     s->tb_next = tb->tb_next;
236 #endif
237     j = tcg_gen_code_search_pc(s, (uint8_t *)tc_ptr, searched_pc - tc_ptr);
238     if (j < 0)
239         return -1;
240     /* now find start of instruction before */
241     while (s->gen_opc_instr_start[j] == 0) {
242         j--;
243     }
244     env->icount_decr.u16.low -= s->gen_opc_icount[j];
245
246     restore_state_to_opc(env, tb, j);
247
248 #ifdef CONFIG_PROFILER
249     s->restore_time += profile_getclock() - ti;
250     s->restore_count++;
251 #endif
252     return 0;
253 }
254
255 bool cpu_restore_state(CPUArchState *env, uintptr_t retaddr)
256 {
257     TranslationBlock *tb;
258
259     tb = tb_find_pc(retaddr);
260     if (tb) {
261         cpu_restore_state_from_tb(tb, env, retaddr);
262         return true;
263     }
264     return false;
265 }
266
267 #ifdef _WIN32
268 static inline void map_exec(void *addr, long size)
269 {
270     DWORD old_protect;
271     VirtualProtect(addr, size,
272                    PAGE_EXECUTE_READWRITE, &old_protect);
273 }
274 #else
275 static inline void map_exec(void *addr, long size)
276 {
277     unsigned long start, end, page_size;
278
279     page_size = getpagesize();
280     start = (unsigned long)addr;
281     start &= ~(page_size - 1);
282
283     end = (unsigned long)addr + size;
284     end += page_size - 1;
285     end &= ~(page_size - 1);
286
287     mprotect((void *)start, end - start,
288              PROT_READ | PROT_WRITE | PROT_EXEC);
289 }
290 #endif
291
292 void page_size_init(void)
293 {
294     /* NOTE: we can always suppose that qemu_host_page_size >=
295        TARGET_PAGE_SIZE */
296 #ifdef _WIN32
297     SYSTEM_INFO system_info;
298
299     GetSystemInfo(&system_info);
300     qemu_real_host_page_size = system_info.dwPageSize;
301 #else
302     qemu_real_host_page_size = getpagesize();
303 #endif
304     if (qemu_host_page_size == 0) {
305         qemu_host_page_size = qemu_real_host_page_size;
306     }
307     if (qemu_host_page_size < TARGET_PAGE_SIZE) {
308         qemu_host_page_size = TARGET_PAGE_SIZE;
309     }
310     qemu_host_page_mask = ~(qemu_host_page_size - 1);
311 }
312
313 static void page_init(void)
314 {
315     page_size_init();
316 #if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
317     {
318 #ifdef HAVE_KINFO_GETVMMAP
319         struct kinfo_vmentry *freep;
320         int i, cnt;
321
322         freep = kinfo_getvmmap(getpid(), &cnt);
323         if (freep) {
324             mmap_lock();
325             for (i = 0; i < cnt; i++) {
326                 unsigned long startaddr, endaddr;
327
328                 startaddr = freep[i].kve_start;
329                 endaddr = freep[i].kve_end;
330                 if (h2g_valid(startaddr)) {
331                     startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
332
333                     if (h2g_valid(endaddr)) {
334                         endaddr = h2g(endaddr);
335                         page_set_flags(startaddr, endaddr, PAGE_RESERVED);
336                     } else {
337 #if TARGET_ABI_BITS <= L1_MAP_ADDR_SPACE_BITS
338                         endaddr = ~0ul;
339                         page_set_flags(startaddr, endaddr, PAGE_RESERVED);
340 #endif
341                     }
342                 }
343             }
344             free(freep);
345             mmap_unlock();
346         }
347 #else
348         FILE *f;
349
350         last_brk = (unsigned long)sbrk(0);
351
352         f = fopen("/compat/linux/proc/self/maps", "r");
353         if (f) {
354             mmap_lock();
355
356             do {
357                 unsigned long startaddr, endaddr;
358                 int n;
359
360                 n = fscanf(f, "%lx-%lx %*[^\n]\n", &startaddr, &endaddr);
361
362                 if (n == 2 && h2g_valid(startaddr)) {
363                     startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
364
365                     if (h2g_valid(endaddr)) {
366                         endaddr = h2g(endaddr);
367                     } else {
368                         endaddr = ~0ul;
369                     }
370                     page_set_flags(startaddr, endaddr, PAGE_RESERVED);
371                 }
372             } while (!feof(f));
373
374             fclose(f);
375             mmap_unlock();
376         }
377 #endif
378     }
379 #endif
380 }
381
382 static PageDesc *page_find_alloc(tb_page_addr_t index, int alloc)
383 {
384     PageDesc *pd;
385     void **lp;
386     int i;
387
388 #if defined(CONFIG_USER_ONLY)
389     /* We can't use g_malloc because it may recurse into a locked mutex. */
390 # define ALLOC(P, SIZE)                                 \
391     do {                                                \
392         P = mmap(NULL, SIZE, PROT_READ | PROT_WRITE,    \
393                  MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);   \
394     } while (0)
395 #else
396 # define ALLOC(P, SIZE) \
397     do { P = g_malloc0(SIZE); } while (0)
398 #endif
399
400     /* Level 1.  Always allocated.  */
401     lp = l1_map + ((index >> V_L1_SHIFT) & (V_L1_SIZE - 1));
402
403     /* Level 2..N-1.  */
404     for (i = V_L1_SHIFT / V_L2_BITS - 1; i > 0; i--) {
405         void **p = *lp;
406
407         if (p == NULL) {
408             if (!alloc) {
409                 return NULL;
410             }
411             ALLOC(p, sizeof(void *) * V_L2_SIZE);
412             *lp = p;
413         }
414
415         lp = p + ((index >> (i * V_L2_BITS)) & (V_L2_SIZE - 1));
416     }
417
418     pd = *lp;
419     if (pd == NULL) {
420         if (!alloc) {
421             return NULL;
422         }
423         ALLOC(pd, sizeof(PageDesc) * V_L2_SIZE);
424         *lp = pd;
425     }
426
427 #undef ALLOC
428
429     return pd + (index & (V_L2_SIZE - 1));
430 }
431
432 static inline PageDesc *page_find(tb_page_addr_t index)
433 {
434     return page_find_alloc(index, 0);
435 }
436
437 #if !defined(CONFIG_USER_ONLY)
438 #define mmap_lock() do { } while (0)
439 #define mmap_unlock() do { } while (0)
440 #endif
441
442 #if defined(CONFIG_USER_ONLY)
443 /* Currently it is not recommended to allocate big chunks of data in
444    user mode. It will change when a dedicated libc will be used.  */
445 /* ??? 64-bit hosts ought to have no problem mmaping data outside the
446    region in which the guest needs to run.  Revisit this.  */
447 #define USE_STATIC_CODE_GEN_BUFFER
448 #endif
449
450 /* ??? Should configure for this, not list operating systems here.  */
451 #if (defined(__linux__) \
452     || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \
453     || defined(__DragonFly__) || defined(__OpenBSD__) \
454     || defined(__NetBSD__))
455 # define USE_MMAP
456 #endif
457
458 /* Minimum size of the code gen buffer.  This number is randomly chosen,
459    but not so small that we can't have a fair number of TB's live.  */
460 #define MIN_CODE_GEN_BUFFER_SIZE     (1024u * 1024)
461
462 /* Maximum size of the code gen buffer we'd like to use.  Unless otherwise
463    indicated, this is constrained by the range of direct branches on the
464    host cpu, as used by the TCG implementation of goto_tb.  */
465 #if defined(__x86_64__)
466 # define MAX_CODE_GEN_BUFFER_SIZE  (2ul * 1024 * 1024 * 1024)
467 #elif defined(__sparc__)
468 # define MAX_CODE_GEN_BUFFER_SIZE  (2ul * 1024 * 1024 * 1024)
469 #elif defined(__aarch64__)
470 # define MAX_CODE_GEN_BUFFER_SIZE  (128ul * 1024 * 1024)
471 #elif defined(__arm__)
472 # define MAX_CODE_GEN_BUFFER_SIZE  (16u * 1024 * 1024)
473 #elif defined(__s390x__)
474   /* We have a +- 4GB range on the branches; leave some slop.  */
475 # define MAX_CODE_GEN_BUFFER_SIZE  (3ul * 1024 * 1024 * 1024)
476 #else
477 # define MAX_CODE_GEN_BUFFER_SIZE  ((size_t)-1)
478 #endif
479
480 #define DEFAULT_CODE_GEN_BUFFER_SIZE_1 (32u * 1024 * 1024)
481
482 #define DEFAULT_CODE_GEN_BUFFER_SIZE \
483   (DEFAULT_CODE_GEN_BUFFER_SIZE_1 < MAX_CODE_GEN_BUFFER_SIZE \
484    ? DEFAULT_CODE_GEN_BUFFER_SIZE_1 : MAX_CODE_GEN_BUFFER_SIZE)
485
486 static inline size_t size_code_gen_buffer(size_t tb_size)
487 {
488     /* Size the buffer.  */
489     if (tb_size == 0) {
490 #ifdef USE_STATIC_CODE_GEN_BUFFER
491         tb_size = DEFAULT_CODE_GEN_BUFFER_SIZE;
492 #else
493         /* ??? Needs adjustments.  */
494         /* ??? If we relax the requirement that CONFIG_USER_ONLY use the
495            static buffer, we could size this on RESERVED_VA, on the text
496            segment size of the executable, or continue to use the default.  */
497         tb_size = (unsigned long)(ram_size / 4);
498 #endif
499     }
500     if (tb_size < MIN_CODE_GEN_BUFFER_SIZE) {
501         tb_size = MIN_CODE_GEN_BUFFER_SIZE;
502     }
503     if (tb_size > MAX_CODE_GEN_BUFFER_SIZE) {
504         tb_size = MAX_CODE_GEN_BUFFER_SIZE;
505     }
506     tcg_ctx.code_gen_buffer_size = tb_size;
507     return tb_size;
508 }
509
510 #ifdef USE_STATIC_CODE_GEN_BUFFER
511 static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE]
512     __attribute__((aligned(CODE_GEN_ALIGN)));
513
514 static inline void *alloc_code_gen_buffer(void)
515 {
516     map_exec(static_code_gen_buffer, tcg_ctx.code_gen_buffer_size);
517     return static_code_gen_buffer;
518 }
519 #elif defined(USE_MMAP)
520 static inline void *alloc_code_gen_buffer(void)
521 {
522     int flags = MAP_PRIVATE | MAP_ANONYMOUS;
523     uintptr_t start = 0;
524     void *buf;
525
526     /* Constrain the position of the buffer based on the host cpu.
527        Note that these addresses are chosen in concert with the
528        addresses assigned in the relevant linker script file.  */
529 # if defined(__PIE__) || defined(__PIC__)
530     /* Don't bother setting a preferred location if we're building
531        a position-independent executable.  We're more likely to get
532        an address near the main executable if we let the kernel
533        choose the address.  */
534 # elif defined(__x86_64__) && defined(MAP_32BIT)
535     /* Force the memory down into low memory with the executable.
536        Leave the choice of exact location with the kernel.  */
537     flags |= MAP_32BIT;
538     /* Cannot expect to map more than 800MB in low memory.  */
539     if (tcg_ctx.code_gen_buffer_size > 800u * 1024 * 1024) {
540         tcg_ctx.code_gen_buffer_size = 800u * 1024 * 1024;
541     }
542 # elif defined(__sparc__)
543     start = 0x40000000ul;
544 # elif defined(__s390x__)
545     start = 0x90000000ul;
546 # endif
547
548     buf = mmap((void *)start, tcg_ctx.code_gen_buffer_size,
549                PROT_WRITE | PROT_READ | PROT_EXEC, flags, -1, 0);
550     return buf == MAP_FAILED ? NULL : buf;
551 }
552 #else
553 static inline void *alloc_code_gen_buffer(void)
554 {
555     void *buf = g_malloc(tcg_ctx.code_gen_buffer_size);
556
557     if (buf) {
558         map_exec(buf, tcg_ctx.code_gen_buffer_size);
559     }
560     return buf;
561 }
562 #endif /* USE_STATIC_CODE_GEN_BUFFER, USE_MMAP */
563
564 static inline void code_gen_alloc(size_t tb_size)
565 {
566     tcg_ctx.code_gen_buffer_size = size_code_gen_buffer(tb_size);
567     tcg_ctx.code_gen_buffer = alloc_code_gen_buffer();
568     if (tcg_ctx.code_gen_buffer == NULL) {
569         fprintf(stderr, "Could not allocate dynamic translator buffer\n");
570         exit(1);
571     }
572
573     qemu_madvise(tcg_ctx.code_gen_buffer, tcg_ctx.code_gen_buffer_size,
574             QEMU_MADV_HUGEPAGE);
575
576     /* Steal room for the prologue at the end of the buffer.  This ensures
577        (via the MAX_CODE_GEN_BUFFER_SIZE limits above) that direct branches
578        from TB's to the prologue are going to be in range.  It also means
579        that we don't need to mark (additional) portions of the data segment
580        as executable.  */
581     tcg_ctx.code_gen_prologue = tcg_ctx.code_gen_buffer +
582             tcg_ctx.code_gen_buffer_size - 1024;
583     tcg_ctx.code_gen_buffer_size -= 1024;
584
585     tcg_ctx.code_gen_buffer_max_size = tcg_ctx.code_gen_buffer_size -
586         (TCG_MAX_OP_SIZE * OPC_BUF_SIZE);
587     tcg_ctx.code_gen_max_blocks = tcg_ctx.code_gen_buffer_size /
588             CODE_GEN_AVG_BLOCK_SIZE;
589     tcg_ctx.tb_ctx.tbs =
590             g_malloc(tcg_ctx.code_gen_max_blocks * sizeof(TranslationBlock));
591 }
592
593 /* Must be called before using the QEMU cpus. 'tb_size' is the size
594    (in bytes) allocated to the translation buffer. Zero means default
595    size. */
596 void tcg_exec_init(unsigned long tb_size)
597 {
598     cpu_gen_init();
599     code_gen_alloc(tb_size);
600     tcg_ctx.code_gen_ptr = tcg_ctx.code_gen_buffer;
601     tcg_register_jit(tcg_ctx.code_gen_buffer, tcg_ctx.code_gen_buffer_size);
602     page_init();
603 #if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE)
604     /* There's no guest base to take into account, so go ahead and
605        initialize the prologue now.  */
606     tcg_prologue_init(&tcg_ctx);
607 #endif
608 }
609
610 bool tcg_enabled(void)
611 {
612     return tcg_ctx.code_gen_buffer != NULL;
613 }
614
615 /* Allocate a new translation block. Flush the translation buffer if
616    too many translation blocks or too much generated code. */
617 static TranslationBlock *tb_alloc(target_ulong pc)
618 {
619     TranslationBlock *tb;
620
621     if (tcg_ctx.tb_ctx.nb_tbs >= tcg_ctx.code_gen_max_blocks ||
622         (tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer) >=
623          tcg_ctx.code_gen_buffer_max_size) {
624         return NULL;
625     }
626     tb = &tcg_ctx.tb_ctx.tbs[tcg_ctx.tb_ctx.nb_tbs++];
627     tb->pc = pc;
628     tb->cflags = 0;
629     return tb;
630 }
631
632 void tb_free(TranslationBlock *tb)
633 {
634     /* In practice this is mostly used for single use temporary TB
635        Ignore the hard cases and just back up if this TB happens to
636        be the last one generated.  */
637     if (tcg_ctx.tb_ctx.nb_tbs > 0 &&
638             tb == &tcg_ctx.tb_ctx.tbs[tcg_ctx.tb_ctx.nb_tbs - 1]) {
639         tcg_ctx.code_gen_ptr = tb->tc_ptr;
640         tcg_ctx.tb_ctx.nb_tbs--;
641     }
642 }
643
644 static inline void invalidate_page_bitmap(PageDesc *p)
645 {
646     if (p->code_bitmap) {
647         g_free(p->code_bitmap);
648         p->code_bitmap = NULL;
649     }
650     p->code_write_count = 0;
651 }
652
653 /* Set to NULL all the 'first_tb' fields in all PageDescs. */
654 static void page_flush_tb_1(int level, void **lp)
655 {
656     int i;
657
658     if (*lp == NULL) {
659         return;
660     }
661     if (level == 0) {
662         PageDesc *pd = *lp;
663
664         for (i = 0; i < V_L2_SIZE; ++i) {
665             pd[i].first_tb = NULL;
666             invalidate_page_bitmap(pd + i);
667         }
668     } else {
669         void **pp = *lp;
670
671         for (i = 0; i < V_L2_SIZE; ++i) {
672             page_flush_tb_1(level - 1, pp + i);
673         }
674     }
675 }
676
677 static void page_flush_tb(void)
678 {
679     int i;
680
681     for (i = 0; i < V_L1_SIZE; i++) {
682         page_flush_tb_1(V_L1_SHIFT / V_L2_BITS - 1, l1_map + i);
683     }
684 }
685
686 /* flush all the translation blocks */
687 /* XXX: tb_flush is currently not thread safe */
688 void tb_flush(CPUArchState *env1)
689 {
690     CPUState *cpu;
691
692 #if defined(DEBUG_FLUSH)
693     printf("qemu: flush code_size=%ld nb_tbs=%d avg_tb_size=%ld\n",
694            (unsigned long)(tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer),
695            tcg_ctx.tb_ctx.nb_tbs, tcg_ctx.tb_ctx.nb_tbs > 0 ?
696            ((unsigned long)(tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer)) /
697            tcg_ctx.tb_ctx.nb_tbs : 0);
698 #endif
699     if ((unsigned long)(tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer)
700         > tcg_ctx.code_gen_buffer_size) {
701         cpu_abort(env1, "Internal error: code buffer overflow\n");
702     }
703     tcg_ctx.tb_ctx.nb_tbs = 0;
704
705     CPU_FOREACH(cpu) {
706         CPUArchState *env = cpu->env_ptr;
707
708         memset(env->tb_jmp_cache, 0, sizeof(env->tb_jmp_cache));
709     }
710
711     memset(tcg_ctx.tb_ctx.tb_phys_hash, 0, sizeof(tcg_ctx.tb_ctx.tb_phys_hash));
712     page_flush_tb();
713
714     tcg_ctx.code_gen_ptr = tcg_ctx.code_gen_buffer;
715     /* XXX: flush processor icache at this point if cache flush is
716        expensive */
717     tcg_ctx.tb_ctx.tb_flush_count++;
718 }
719
720 #ifdef DEBUG_TB_CHECK
721
722 static void tb_invalidate_check(target_ulong address)
723 {
724     TranslationBlock *tb;
725     int i;
726
727     address &= TARGET_PAGE_MASK;
728     for (i = 0; i < CODE_GEN_PHYS_HASH_SIZE; i++) {
729         for (tb = tb_ctx.tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) {
730             if (!(address + TARGET_PAGE_SIZE <= tb->pc ||
731                   address >= tb->pc + tb->size)) {
732                 printf("ERROR invalidate: address=" TARGET_FMT_lx
733                        " PC=%08lx size=%04x\n",
734                        address, (long)tb->pc, tb->size);
735             }
736         }
737     }
738 }
739
740 /* verify that all the pages have correct rights for code */
741 static void tb_page_check(void)
742 {
743     TranslationBlock *tb;
744     int i, flags1, flags2;
745
746     for (i = 0; i < CODE_GEN_PHYS_HASH_SIZE; i++) {
747         for (tb = tcg_ctx.tb_ctx.tb_phys_hash[i]; tb != NULL;
748                 tb = tb->phys_hash_next) {
749             flags1 = page_get_flags(tb->pc);
750             flags2 = page_get_flags(tb->pc + tb->size - 1);
751             if ((flags1 & PAGE_WRITE) || (flags2 & PAGE_WRITE)) {
752                 printf("ERROR page flags: PC=%08lx size=%04x f1=%x f2=%x\n",
753                        (long)tb->pc, tb->size, flags1, flags2);
754             }
755         }
756     }
757 }
758
759 #endif
760
761 static inline void tb_hash_remove(TranslationBlock **ptb, TranslationBlock *tb)
762 {
763     TranslationBlock *tb1;
764
765     for (;;) {
766         tb1 = *ptb;
767         if (tb1 == tb) {
768             *ptb = tb1->phys_hash_next;
769             break;
770         }
771         ptb = &tb1->phys_hash_next;
772     }
773 }
774
775 static inline void tb_page_remove(TranslationBlock **ptb, TranslationBlock *tb)
776 {
777     TranslationBlock *tb1;
778     unsigned int n1;
779
780     for (;;) {
781         tb1 = *ptb;
782         n1 = (uintptr_t)tb1 & 3;
783         tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3);
784         if (tb1 == tb) {
785             *ptb = tb1->page_next[n1];
786             break;
787         }
788         ptb = &tb1->page_next[n1];
789     }
790 }
791
792 static inline void tb_jmp_remove(TranslationBlock *tb, int n)
793 {
794     TranslationBlock *tb1, **ptb;
795     unsigned int n1;
796
797     ptb = &tb->jmp_next[n];
798     tb1 = *ptb;
799     if (tb1) {
800         /* find tb(n) in circular list */
801         for (;;) {
802             tb1 = *ptb;
803             n1 = (uintptr_t)tb1 & 3;
804             tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3);
805             if (n1 == n && tb1 == tb) {
806                 break;
807             }
808             if (n1 == 2) {
809                 ptb = &tb1->jmp_first;
810             } else {
811                 ptb = &tb1->jmp_next[n1];
812             }
813         }
814         /* now we can suppress tb(n) from the list */
815         *ptb = tb->jmp_next[n];
816
817         tb->jmp_next[n] = NULL;
818     }
819 }
820
821 /* reset the jump entry 'n' of a TB so that it is not chained to
822    another TB */
823 static inline void tb_reset_jump(TranslationBlock *tb, int n)
824 {
825     tb_set_jmp_target(tb, n, (uintptr_t)(tb->tc_ptr + tb->tb_next_offset[n]));
826 }
827
828 /* invalidate one TB */
829 void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr)
830 {
831     CPUState *cpu;
832     PageDesc *p;
833     unsigned int h, n1;
834     tb_page_addr_t phys_pc;
835     TranslationBlock *tb1, *tb2;
836
837     /* remove the TB from the hash list */
838     phys_pc = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
839     h = tb_phys_hash_func(phys_pc);
840     tb_hash_remove(&tcg_ctx.tb_ctx.tb_phys_hash[h], tb);
841
842     /* remove the TB from the page list */
843     if (tb->page_addr[0] != page_addr) {
844         p = page_find(tb->page_addr[0] >> TARGET_PAGE_BITS);
845         tb_page_remove(&p->first_tb, tb);
846         invalidate_page_bitmap(p);
847     }
848     if (tb->page_addr[1] != -1 && tb->page_addr[1] != page_addr) {
849         p = page_find(tb->page_addr[1] >> TARGET_PAGE_BITS);
850         tb_page_remove(&p->first_tb, tb);
851         invalidate_page_bitmap(p);
852     }
853
854     tcg_ctx.tb_ctx.tb_invalidated_flag = 1;
855
856     /* remove the TB from the hash list */
857     h = tb_jmp_cache_hash_func(tb->pc);
858     CPU_FOREACH(cpu) {
859         CPUArchState *env = cpu->env_ptr;
860
861         if (env->tb_jmp_cache[h] == tb) {
862             env->tb_jmp_cache[h] = NULL;
863         }
864     }
865
866     /* suppress this TB from the two jump lists */
867     tb_jmp_remove(tb, 0);
868     tb_jmp_remove(tb, 1);
869
870     /* suppress any remaining jumps to this TB */
871     tb1 = tb->jmp_first;
872     for (;;) {
873         n1 = (uintptr_t)tb1 & 3;
874         if (n1 == 2) {
875             break;
876         }
877         tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3);
878         tb2 = tb1->jmp_next[n1];
879         tb_reset_jump(tb1, n1);
880         tb1->jmp_next[n1] = NULL;
881         tb1 = tb2;
882     }
883     tb->jmp_first = (TranslationBlock *)((uintptr_t)tb | 2); /* fail safe */
884
885     tcg_ctx.tb_ctx.tb_phys_invalidate_count++;
886 }
887
888 static inline void set_bits(uint8_t *tab, int start, int len)
889 {
890     int end, mask, end1;
891
892     end = start + len;
893     tab += start >> 3;
894     mask = 0xff << (start & 7);
895     if ((start & ~7) == (end & ~7)) {
896         if (start < end) {
897             mask &= ~(0xff << (end & 7));
898             *tab |= mask;
899         }
900     } else {
901         *tab++ |= mask;
902         start = (start + 8) & ~7;
903         end1 = end & ~7;
904         while (start < end1) {
905             *tab++ = 0xff;
906             start += 8;
907         }
908         if (start < end) {
909             mask = ~(0xff << (end & 7));
910             *tab |= mask;
911         }
912     }
913 }
914
915 static void build_page_bitmap(PageDesc *p)
916 {
917     int n, tb_start, tb_end;
918     TranslationBlock *tb;
919
920     p->code_bitmap = g_malloc0(TARGET_PAGE_SIZE / 8);
921
922     tb = p->first_tb;
923     while (tb != NULL) {
924         n = (uintptr_t)tb & 3;
925         tb = (TranslationBlock *)((uintptr_t)tb & ~3);
926         /* NOTE: this is subtle as a TB may span two physical pages */
927         if (n == 0) {
928             /* NOTE: tb_end may be after the end of the page, but
929                it is not a problem */
930             tb_start = tb->pc & ~TARGET_PAGE_MASK;
931             tb_end = tb_start + tb->size;
932             if (tb_end > TARGET_PAGE_SIZE) {
933                 tb_end = TARGET_PAGE_SIZE;
934             }
935         } else {
936             tb_start = 0;
937             tb_end = ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
938         }
939         set_bits(p->code_bitmap, tb_start, tb_end - tb_start);
940         tb = tb->page_next[n];
941     }
942 }
943
944 TranslationBlock *tb_gen_code(CPUArchState *env,
945                               target_ulong pc, target_ulong cs_base,
946                               int flags, int cflags)
947 {
948     TranslationBlock *tb;
949     uint8_t *tc_ptr;
950     tb_page_addr_t phys_pc, phys_page2;
951     target_ulong virt_page2;
952     int code_gen_size;
953
954     phys_pc = get_page_addr_code(env, pc);
955     tb = tb_alloc(pc);
956     if (!tb) {
957         /* flush must be done */
958         tb_flush(env);
959         /* cannot fail at this point */
960         tb = tb_alloc(pc);
961         /* Don't forget to invalidate previous TB info.  */
962         tcg_ctx.tb_ctx.tb_invalidated_flag = 1;
963     }
964     tc_ptr = tcg_ctx.code_gen_ptr;
965     tb->tc_ptr = tc_ptr;
966     tb->cs_base = cs_base;
967     tb->flags = flags;
968     tb->cflags = cflags;
969     cpu_gen_code(env, tb, &code_gen_size);
970     tcg_ctx.code_gen_ptr = (void *)(((uintptr_t)tcg_ctx.code_gen_ptr +
971             code_gen_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
972
973     /* check next page if needed */
974     virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
975     phys_page2 = -1;
976     if ((pc & TARGET_PAGE_MASK) != virt_page2) {
977         phys_page2 = get_page_addr_code(env, virt_page2);
978     }
979     tb_link_page(tb, phys_pc, phys_page2);
980     return tb;
981 }
982
983 /*
984  * Invalidate all TBs which intersect with the target physical address range
985  * [start;end[. NOTE: start and end may refer to *different* physical pages.
986  * 'is_cpu_write_access' should be true if called from a real cpu write
987  * access: the virtual CPU will exit the current TB if code is modified inside
988  * this TB.
989  */
990 void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t end,
991                               int is_cpu_write_access)
992 {
993     while (start < end) {
994         tb_invalidate_phys_page_range(start, end, is_cpu_write_access);
995         start &= TARGET_PAGE_MASK;
996         start += TARGET_PAGE_SIZE;
997     }
998 }
999
1000 /*
1001  * Invalidate all TBs which intersect with the target physical address range
1002  * [start;end[. NOTE: start and end must refer to the *same* physical page.
1003  * 'is_cpu_write_access' should be true if called from a real cpu write
1004  * access: the virtual CPU will exit the current TB if code is modified inside
1005  * this TB.
1006  */
1007 void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
1008                                    int is_cpu_write_access)
1009 {
1010     TranslationBlock *tb, *tb_next, *saved_tb;
1011     CPUState *cpu = current_cpu;
1012 #if defined(TARGET_HAS_PRECISE_SMC) || !defined(CONFIG_USER_ONLY)
1013     CPUArchState *env = NULL;
1014 #endif
1015     tb_page_addr_t tb_start, tb_end;
1016     PageDesc *p;
1017     int n;
1018 #ifdef TARGET_HAS_PRECISE_SMC
1019     int current_tb_not_found = is_cpu_write_access;
1020     TranslationBlock *current_tb = NULL;
1021     int current_tb_modified = 0;
1022     target_ulong current_pc = 0;
1023     target_ulong current_cs_base = 0;
1024     int current_flags = 0;
1025 #endif /* TARGET_HAS_PRECISE_SMC */
1026
1027     p = page_find(start >> TARGET_PAGE_BITS);
1028     if (!p) {
1029         return;
1030     }
1031     if (!p->code_bitmap &&
1032         ++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD &&
1033         is_cpu_write_access) {
1034         /* build code bitmap */
1035         build_page_bitmap(p);
1036     }
1037 #if defined(TARGET_HAS_PRECISE_SMC) || !defined(CONFIG_USER_ONLY)
1038     if (cpu != NULL) {
1039         env = cpu->env_ptr;
1040     }
1041 #endif
1042
1043     /* we remove all the TBs in the range [start, end[ */
1044     /* XXX: see if in some cases it could be faster to invalidate all
1045        the code */
1046     tb = p->first_tb;
1047     while (tb != NULL) {
1048         n = (uintptr_t)tb & 3;
1049         tb = (TranslationBlock *)((uintptr_t)tb & ~3);
1050         tb_next = tb->page_next[n];
1051         /* NOTE: this is subtle as a TB may span two physical pages */
1052         if (n == 0) {
1053             /* NOTE: tb_end may be after the end of the page, but
1054                it is not a problem */
1055             tb_start = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
1056             tb_end = tb_start + tb->size;
1057         } else {
1058             tb_start = tb->page_addr[1];
1059             tb_end = tb_start + ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
1060         }
1061         if (!(tb_end <= start || tb_start >= end)) {
1062 #ifdef TARGET_HAS_PRECISE_SMC
1063             if (current_tb_not_found) {
1064                 current_tb_not_found = 0;
1065                 current_tb = NULL;
1066                 if (env->mem_io_pc) {
1067                     /* now we have a real cpu fault */
1068                     current_tb = tb_find_pc(env->mem_io_pc);
1069                 }
1070             }
1071             if (current_tb == tb &&
1072                 (current_tb->cflags & CF_COUNT_MASK) != 1) {
1073                 /* If we are modifying the current TB, we must stop
1074                 its execution. We could be more precise by checking
1075                 that the modification is after the current PC, but it
1076                 would require a specialized function to partially
1077                 restore the CPU state */
1078
1079                 current_tb_modified = 1;
1080                 cpu_restore_state_from_tb(current_tb, env, env->mem_io_pc);
1081                 cpu_get_tb_cpu_state(env, &current_pc, &current_cs_base,
1082                                      &current_flags);
1083             }
1084 #endif /* TARGET_HAS_PRECISE_SMC */
1085             /* we need to do that to handle the case where a signal
1086                occurs while doing tb_phys_invalidate() */
1087             saved_tb = NULL;
1088             if (cpu != NULL) {
1089                 saved_tb = cpu->current_tb;
1090                 cpu->current_tb = NULL;
1091             }
1092             tb_phys_invalidate(tb, -1);
1093             if (cpu != NULL) {
1094                 cpu->current_tb = saved_tb;
1095                 if (cpu->interrupt_request && cpu->current_tb) {
1096                     cpu_interrupt(cpu, cpu->interrupt_request);
1097                 }
1098             }
1099         }
1100         tb = tb_next;
1101     }
1102 #if !defined(CONFIG_USER_ONLY)
1103     /* if no code remaining, no need to continue to use slow writes */
1104     if (!p->first_tb) {
1105         invalidate_page_bitmap(p);
1106         if (is_cpu_write_access) {
1107             tlb_unprotect_code_phys(env, start, env->mem_io_vaddr);
1108         }
1109     }
1110 #endif
1111 #ifdef TARGET_HAS_PRECISE_SMC
1112     if (current_tb_modified) {
1113         /* we generate a block containing just the instruction
1114            modifying the memory. It will ensure that it cannot modify
1115            itself */
1116         cpu->current_tb = NULL;
1117         tb_gen_code(env, current_pc, current_cs_base, current_flags, 1);
1118         cpu_resume_from_signal(env, NULL);
1119     }
1120 #endif
1121 }
1122
1123 /* len must be <= 8 and start must be a multiple of len */
1124 void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len)
1125 {
1126     PageDesc *p;
1127     int offset, b;
1128
1129 #if 0
1130     if (1) {
1131         qemu_log("modifying code at 0x%x size=%d EIP=%x PC=%08x\n",
1132                   cpu_single_env->mem_io_vaddr, len,
1133                   cpu_single_env->eip,
1134                   cpu_single_env->eip +
1135                   (intptr_t)cpu_single_env->segs[R_CS].base);
1136     }
1137 #endif
1138     p = page_find(start >> TARGET_PAGE_BITS);
1139     if (!p) {
1140         return;
1141     }
1142     if (p->code_bitmap) {
1143         offset = start & ~TARGET_PAGE_MASK;
1144         b = p->code_bitmap[offset >> 3] >> (offset & 7);
1145         if (b & ((1 << len) - 1)) {
1146             goto do_invalidate;
1147         }
1148     } else {
1149     do_invalidate:
1150         tb_invalidate_phys_page_range(start, start + len, 1);
1151     }
1152 }
1153
1154 #if !defined(CONFIG_SOFTMMU)
1155 static void tb_invalidate_phys_page(tb_page_addr_t addr,
1156                                     uintptr_t pc, void *puc,
1157                                     bool locked)
1158 {
1159     TranslationBlock *tb;
1160     PageDesc *p;
1161     int n;
1162 #ifdef TARGET_HAS_PRECISE_SMC
1163     TranslationBlock *current_tb = NULL;
1164     CPUState *cpu = current_cpu;
1165     CPUArchState *env = NULL;
1166     int current_tb_modified = 0;
1167     target_ulong current_pc = 0;
1168     target_ulong current_cs_base = 0;
1169     int current_flags = 0;
1170 #endif
1171
1172     addr &= TARGET_PAGE_MASK;
1173     p = page_find(addr >> TARGET_PAGE_BITS);
1174     if (!p) {
1175         return;
1176     }
1177     tb = p->first_tb;
1178 #ifdef TARGET_HAS_PRECISE_SMC
1179     if (tb && pc != 0) {
1180         current_tb = tb_find_pc(pc);
1181     }
1182     if (cpu != NULL) {
1183         env = cpu->env_ptr;
1184     }
1185 #endif
1186     while (tb != NULL) {
1187         n = (uintptr_t)tb & 3;
1188         tb = (TranslationBlock *)((uintptr_t)tb & ~3);
1189 #ifdef TARGET_HAS_PRECISE_SMC
1190         if (current_tb == tb &&
1191             (current_tb->cflags & CF_COUNT_MASK) != 1) {
1192                 /* If we are modifying the current TB, we must stop
1193                    its execution. We could be more precise by checking
1194                    that the modification is after the current PC, but it
1195                    would require a specialized function to partially
1196                    restore the CPU state */
1197
1198             current_tb_modified = 1;
1199             cpu_restore_state_from_tb(current_tb, env, pc);
1200             cpu_get_tb_cpu_state(env, &current_pc, &current_cs_base,
1201                                  &current_flags);
1202         }
1203 #endif /* TARGET_HAS_PRECISE_SMC */
1204         tb_phys_invalidate(tb, addr);
1205         tb = tb->page_next[n];
1206     }
1207     p->first_tb = NULL;
1208 #ifdef TARGET_HAS_PRECISE_SMC
1209     if (current_tb_modified) {
1210         /* we generate a block containing just the instruction
1211            modifying the memory. It will ensure that it cannot modify
1212            itself */
1213         cpu->current_tb = NULL;
1214         tb_gen_code(env, current_pc, current_cs_base, current_flags, 1);
1215         if (locked) {
1216             mmap_unlock();
1217         }
1218         cpu_resume_from_signal(env, puc);
1219     }
1220 #endif
1221 }
1222 #endif
1223
1224 /* add the tb in the target page and protect it if necessary */
1225 static inline void tb_alloc_page(TranslationBlock *tb,
1226                                  unsigned int n, tb_page_addr_t page_addr)
1227 {
1228     PageDesc *p;
1229 #ifndef CONFIG_USER_ONLY
1230     bool page_already_protected;
1231 #endif
1232
1233     tb->page_addr[n] = page_addr;
1234     p = page_find_alloc(page_addr >> TARGET_PAGE_BITS, 1);
1235     tb->page_next[n] = p->first_tb;
1236 #ifndef CONFIG_USER_ONLY
1237     page_already_protected = p->first_tb != NULL;
1238 #endif
1239     p->first_tb = (TranslationBlock *)((uintptr_t)tb | n);
1240     invalidate_page_bitmap(p);
1241
1242 #if defined(TARGET_HAS_SMC) || 1
1243
1244 #if defined(CONFIG_USER_ONLY)
1245     if (p->flags & PAGE_WRITE) {
1246         target_ulong addr;
1247         PageDesc *p2;
1248         int prot;
1249
1250         /* force the host page as non writable (writes will have a
1251            page fault + mprotect overhead) */
1252         page_addr &= qemu_host_page_mask;
1253         prot = 0;
1254         for (addr = page_addr; addr < page_addr + qemu_host_page_size;
1255             addr += TARGET_PAGE_SIZE) {
1256
1257             p2 = page_find(addr >> TARGET_PAGE_BITS);
1258             if (!p2) {
1259                 continue;
1260             }
1261             prot |= p2->flags;
1262             p2->flags &= ~PAGE_WRITE;
1263           }
1264         mprotect(g2h(page_addr), qemu_host_page_size,
1265                  (prot & PAGE_BITS) & ~PAGE_WRITE);
1266 #ifdef DEBUG_TB_INVALIDATE
1267         printf("protecting code page: 0x" TARGET_FMT_lx "\n",
1268                page_addr);
1269 #endif
1270     }
1271 #else
1272     /* if some code is already present, then the pages are already
1273        protected. So we handle the case where only the first TB is
1274        allocated in a physical page */
1275     if (!page_already_protected) {
1276         tlb_protect_code(page_addr);
1277     }
1278 #endif
1279
1280 #endif /* TARGET_HAS_SMC */
1281 }
1282
1283 /* add a new TB and link it to the physical page tables. phys_page2 is
1284    (-1) to indicate that only one page contains the TB. */
1285 static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc,
1286                          tb_page_addr_t phys_page2)
1287 {
1288     unsigned int h;
1289     TranslationBlock **ptb;
1290
1291     /* Grab the mmap lock to stop another thread invalidating this TB
1292        before we are done.  */
1293     mmap_lock();
1294     /* add in the physical hash table */
1295     h = tb_phys_hash_func(phys_pc);
1296     ptb = &tcg_ctx.tb_ctx.tb_phys_hash[h];
1297     tb->phys_hash_next = *ptb;
1298     *ptb = tb;
1299
1300     /* add in the page list */
1301     tb_alloc_page(tb, 0, phys_pc & TARGET_PAGE_MASK);
1302     if (phys_page2 != -1) {
1303         tb_alloc_page(tb, 1, phys_page2);
1304     } else {
1305         tb->page_addr[1] = -1;
1306     }
1307
1308     tb->jmp_first = (TranslationBlock *)((uintptr_t)tb | 2);
1309     tb->jmp_next[0] = NULL;
1310     tb->jmp_next[1] = NULL;
1311
1312     /* init original jump addresses */
1313     if (tb->tb_next_offset[0] != 0xffff) {
1314         tb_reset_jump(tb, 0);
1315     }
1316     if (tb->tb_next_offset[1] != 0xffff) {
1317         tb_reset_jump(tb, 1);
1318     }
1319
1320 #ifdef DEBUG_TB_CHECK
1321     tb_page_check();
1322 #endif
1323     mmap_unlock();
1324 }
1325
1326 /* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr <
1327    tb[1].tc_ptr. Return NULL if not found */
1328 static TranslationBlock *tb_find_pc(uintptr_t tc_ptr)
1329 {
1330     int m_min, m_max, m;
1331     uintptr_t v;
1332     TranslationBlock *tb;
1333
1334     if (tcg_ctx.tb_ctx.nb_tbs <= 0) {
1335         return NULL;
1336     }
1337     if (tc_ptr < (uintptr_t)tcg_ctx.code_gen_buffer ||
1338         tc_ptr >= (uintptr_t)tcg_ctx.code_gen_ptr) {
1339         return NULL;
1340     }
1341     /* binary search (cf Knuth) */
1342     m_min = 0;
1343     m_max = tcg_ctx.tb_ctx.nb_tbs - 1;
1344     while (m_min <= m_max) {
1345         m = (m_min + m_max) >> 1;
1346         tb = &tcg_ctx.tb_ctx.tbs[m];
1347         v = (uintptr_t)tb->tc_ptr;
1348         if (v == tc_ptr) {
1349             return tb;
1350         } else if (tc_ptr < v) {
1351             m_max = m - 1;
1352         } else {
1353             m_min = m + 1;
1354         }
1355     }
1356     return &tcg_ctx.tb_ctx.tbs[m_max];
1357 }
1358
1359 #if defined(TARGET_HAS_ICE) && !defined(CONFIG_USER_ONLY)
1360 void tb_invalidate_phys_addr(hwaddr addr)
1361 {
1362     ram_addr_t ram_addr;
1363     MemoryRegion *mr;
1364     hwaddr l = 1;
1365
1366     mr = address_space_translate(&address_space_memory, addr, &addr, &l, false);
1367     if (!(memory_region_is_ram(mr)
1368           || memory_region_is_romd(mr))) {
1369         return;
1370     }
1371     ram_addr = (memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK)
1372         + addr;
1373     tb_invalidate_phys_page_range(ram_addr, ram_addr + 1, 0);
1374 }
1375 #endif /* TARGET_HAS_ICE && !defined(CONFIG_USER_ONLY) */
1376
1377 void tb_check_watchpoint(CPUArchState *env)
1378 {
1379     TranslationBlock *tb;
1380
1381     tb = tb_find_pc(env->mem_io_pc);
1382     if (!tb) {
1383         cpu_abort(env, "check_watchpoint: could not find TB for pc=%p",
1384                   (void *)env->mem_io_pc);
1385     }
1386     cpu_restore_state_from_tb(tb, env, env->mem_io_pc);
1387     tb_phys_invalidate(tb, -1);
1388 }
1389
1390 #ifndef CONFIG_USER_ONLY
1391 /* mask must never be zero, except for A20 change call */
1392 static void tcg_handle_interrupt(CPUState *cpu, int mask)
1393 {
1394     CPUArchState *env = cpu->env_ptr;
1395     int old_mask;
1396
1397     old_mask = cpu->interrupt_request;
1398     cpu->interrupt_request |= mask;
1399
1400     /*
1401      * If called from iothread context, wake the target cpu in
1402      * case its halted.
1403      */
1404     if (!qemu_cpu_is_self(cpu)) {
1405         qemu_cpu_kick(cpu);
1406         return;
1407     }
1408
1409     if (use_icount) {
1410         env->icount_decr.u16.high = 0xffff;
1411         if (!can_do_io(env)
1412             && (mask & ~old_mask) != 0) {
1413             cpu_abort(env, "Raised interrupt while not in I/O function");
1414         }
1415     } else {
1416         cpu->tcg_exit_req = 1;
1417     }
1418 }
1419
1420 CPUInterruptHandler cpu_interrupt_handler = tcg_handle_interrupt;
1421
1422 /* in deterministic execution mode, instructions doing device I/Os
1423    must be at the end of the TB */
1424 void cpu_io_recompile(CPUArchState *env, uintptr_t retaddr)
1425 {
1426     TranslationBlock *tb;
1427     uint32_t n, cflags;
1428     target_ulong pc, cs_base;
1429     uint64_t flags;
1430
1431     tb = tb_find_pc(retaddr);
1432     if (!tb) {
1433         cpu_abort(env, "cpu_io_recompile: could not find TB for pc=%p",
1434                   (void *)retaddr);
1435     }
1436     n = env->icount_decr.u16.low + tb->icount;
1437     cpu_restore_state_from_tb(tb, env, retaddr);
1438     /* Calculate how many instructions had been executed before the fault
1439        occurred.  */
1440     n = n - env->icount_decr.u16.low;
1441     /* Generate a new TB ending on the I/O insn.  */
1442     n++;
1443     /* On MIPS and SH, delay slot instructions can only be restarted if
1444        they were already the first instruction in the TB.  If this is not
1445        the first instruction in a TB then re-execute the preceding
1446        branch.  */
1447 #if defined(TARGET_MIPS)
1448     if ((env->hflags & MIPS_HFLAG_BMASK) != 0 && n > 1) {
1449         env->active_tc.PC -= 4;
1450         env->icount_decr.u16.low++;
1451         env->hflags &= ~MIPS_HFLAG_BMASK;
1452     }
1453 #elif defined(TARGET_SH4)
1454     if ((env->flags & ((DELAY_SLOT | DELAY_SLOT_CONDITIONAL))) != 0
1455             && n > 1) {
1456         env->pc -= 2;
1457         env->icount_decr.u16.low++;
1458         env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
1459     }
1460 #endif
1461     /* This should never happen.  */
1462     if (n > CF_COUNT_MASK) {
1463         cpu_abort(env, "TB too big during recompile");
1464     }
1465
1466     cflags = n | CF_LAST_IO;
1467     pc = tb->pc;
1468     cs_base = tb->cs_base;
1469     flags = tb->flags;
1470     tb_phys_invalidate(tb, -1);
1471     /* FIXME: In theory this could raise an exception.  In practice
1472        we have already translated the block once so it's probably ok.  */
1473     tb_gen_code(env, pc, cs_base, flags, cflags);
1474     /* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not
1475        the first in the TB) then we end up generating a whole new TB and
1476        repeating the fault, which is horribly inefficient.
1477        Better would be to execute just this insn uncached, or generate a
1478        second new TB.  */
1479     cpu_resume_from_signal(env, NULL);
1480 }
1481
1482 void tb_flush_jmp_cache(CPUArchState *env, target_ulong addr)
1483 {
1484     unsigned int i;
1485
1486     /* Discard jump cache entries for any tb which might potentially
1487        overlap the flushed page.  */
1488     i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE);
1489     memset(&env->tb_jmp_cache[i], 0,
1490            TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
1491
1492     i = tb_jmp_cache_hash_page(addr);
1493     memset(&env->tb_jmp_cache[i], 0,
1494            TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
1495 }
1496
1497 void dump_exec_info(FILE *f, fprintf_function cpu_fprintf)
1498 {
1499     int i, target_code_size, max_target_code_size;
1500     int direct_jmp_count, direct_jmp2_count, cross_page;
1501     TranslationBlock *tb;
1502
1503     target_code_size = 0;
1504     max_target_code_size = 0;
1505     cross_page = 0;
1506     direct_jmp_count = 0;
1507     direct_jmp2_count = 0;
1508     for (i = 0; i < tcg_ctx.tb_ctx.nb_tbs; i++) {
1509         tb = &tcg_ctx.tb_ctx.tbs[i];
1510         target_code_size += tb->size;
1511         if (tb->size > max_target_code_size) {
1512             max_target_code_size = tb->size;
1513         }
1514         if (tb->page_addr[1] != -1) {
1515             cross_page++;
1516         }
1517         if (tb->tb_next_offset[0] != 0xffff) {
1518             direct_jmp_count++;
1519             if (tb->tb_next_offset[1] != 0xffff) {
1520                 direct_jmp2_count++;
1521             }
1522         }
1523     }
1524     /* XXX: avoid using doubles ? */
1525     cpu_fprintf(f, "Translation buffer state:\n");
1526     cpu_fprintf(f, "gen code size       %td/%zd\n",
1527                 tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer,
1528                 tcg_ctx.code_gen_buffer_max_size);
1529     cpu_fprintf(f, "TB count            %d/%d\n",
1530             tcg_ctx.tb_ctx.nb_tbs, tcg_ctx.code_gen_max_blocks);
1531     cpu_fprintf(f, "TB avg target size  %d max=%d bytes\n",
1532             tcg_ctx.tb_ctx.nb_tbs ? target_code_size /
1533                     tcg_ctx.tb_ctx.nb_tbs : 0,
1534             max_target_code_size);
1535     cpu_fprintf(f, "TB avg host size    %td bytes (expansion ratio: %0.1f)\n",
1536             tcg_ctx.tb_ctx.nb_tbs ? (tcg_ctx.code_gen_ptr -
1537                                      tcg_ctx.code_gen_buffer) /
1538                                      tcg_ctx.tb_ctx.nb_tbs : 0,
1539                 target_code_size ? (double) (tcg_ctx.code_gen_ptr -
1540                                              tcg_ctx.code_gen_buffer) /
1541                                              target_code_size : 0);
1542     cpu_fprintf(f, "cross page TB count %d (%d%%)\n", cross_page,
1543             tcg_ctx.tb_ctx.nb_tbs ? (cross_page * 100) /
1544                                     tcg_ctx.tb_ctx.nb_tbs : 0);
1545     cpu_fprintf(f, "direct jump count   %d (%d%%) (2 jumps=%d %d%%)\n",
1546                 direct_jmp_count,
1547                 tcg_ctx.tb_ctx.nb_tbs ? (direct_jmp_count * 100) /
1548                         tcg_ctx.tb_ctx.nb_tbs : 0,
1549                 direct_jmp2_count,
1550                 tcg_ctx.tb_ctx.nb_tbs ? (direct_jmp2_count * 100) /
1551                         tcg_ctx.tb_ctx.nb_tbs : 0);
1552     cpu_fprintf(f, "\nStatistics:\n");
1553     cpu_fprintf(f, "TB flush count      %d\n", tcg_ctx.tb_ctx.tb_flush_count);
1554     cpu_fprintf(f, "TB invalidate count %d\n",
1555             tcg_ctx.tb_ctx.tb_phys_invalidate_count);
1556     cpu_fprintf(f, "TLB flush count     %d\n", tlb_flush_count);
1557     tcg_dump_info(f, cpu_fprintf);
1558 }
1559
1560 #else /* CONFIG_USER_ONLY */
1561
1562 void cpu_interrupt(CPUState *cpu, int mask)
1563 {
1564     cpu->interrupt_request |= mask;
1565     cpu->tcg_exit_req = 1;
1566 }
1567
1568 /*
1569  * Walks guest process memory "regions" one by one
1570  * and calls callback function 'fn' for each region.
1571  */
1572 struct walk_memory_regions_data {
1573     walk_memory_regions_fn fn;
1574     void *priv;
1575     uintptr_t start;
1576     int prot;
1577 };
1578
1579 static int walk_memory_regions_end(struct walk_memory_regions_data *data,
1580                                    abi_ulong end, int new_prot)
1581 {
1582     if (data->start != -1ul) {
1583         int rc = data->fn(data->priv, data->start, end, data->prot);
1584         if (rc != 0) {
1585             return rc;
1586         }
1587     }
1588
1589     data->start = (new_prot ? end : -1ul);
1590     data->prot = new_prot;
1591
1592     return 0;
1593 }
1594
1595 static int walk_memory_regions_1(struct walk_memory_regions_data *data,
1596                                  abi_ulong base, int level, void **lp)
1597 {
1598     abi_ulong pa;
1599     int i, rc;
1600
1601     if (*lp == NULL) {
1602         return walk_memory_regions_end(data, base, 0);
1603     }
1604
1605     if (level == 0) {
1606         PageDesc *pd = *lp;
1607
1608         for (i = 0; i < V_L2_SIZE; ++i) {
1609             int prot = pd[i].flags;
1610
1611             pa = base | (i << TARGET_PAGE_BITS);
1612             if (prot != data->prot) {
1613                 rc = walk_memory_regions_end(data, pa, prot);
1614                 if (rc != 0) {
1615                     return rc;
1616                 }
1617             }
1618         }
1619     } else {
1620         void **pp = *lp;
1621
1622         for (i = 0; i < V_L2_SIZE; ++i) {
1623             pa = base | ((abi_ulong)i <<
1624                 (TARGET_PAGE_BITS + V_L2_BITS * level));
1625             rc = walk_memory_regions_1(data, pa, level - 1, pp + i);
1626             if (rc != 0) {
1627                 return rc;
1628             }
1629         }
1630     }
1631
1632     return 0;
1633 }
1634
1635 int walk_memory_regions(void *priv, walk_memory_regions_fn fn)
1636 {
1637     struct walk_memory_regions_data data;
1638     uintptr_t i;
1639
1640     data.fn = fn;
1641     data.priv = priv;
1642     data.start = -1ul;
1643     data.prot = 0;
1644
1645     for (i = 0; i < V_L1_SIZE; i++) {
1646         int rc = walk_memory_regions_1(&data, (abi_ulong)i << V_L1_SHIFT,
1647                                        V_L1_SHIFT / V_L2_BITS - 1, l1_map + i);
1648
1649         if (rc != 0) {
1650             return rc;
1651         }
1652     }
1653
1654     return walk_memory_regions_end(&data, 0, 0);
1655 }
1656
1657 static int dump_region(void *priv, abi_ulong start,
1658     abi_ulong end, unsigned long prot)
1659 {
1660     FILE *f = (FILE *)priv;
1661
1662     (void) fprintf(f, TARGET_ABI_FMT_lx"-"TARGET_ABI_FMT_lx
1663         " "TARGET_ABI_FMT_lx" %c%c%c\n",
1664         start, end, end - start,
1665         ((prot & PAGE_READ) ? 'r' : '-'),
1666         ((prot & PAGE_WRITE) ? 'w' : '-'),
1667         ((prot & PAGE_EXEC) ? 'x' : '-'));
1668
1669     return 0;
1670 }
1671
1672 /* dump memory mappings */
1673 void page_dump(FILE *f)
1674 {
1675     const int length = sizeof(abi_ulong) * 2;
1676     (void) fprintf(f, "%-*s %-*s %-*s %s\n",
1677             length, "start", length, "end", length, "size", "prot");
1678     walk_memory_regions(f, dump_region);
1679 }
1680
1681 int page_get_flags(target_ulong address)
1682 {
1683     PageDesc *p;
1684
1685     p = page_find(address >> TARGET_PAGE_BITS);
1686     if (!p) {
1687         return 0;
1688     }
1689     return p->flags;
1690 }
1691
1692 /* Modify the flags of a page and invalidate the code if necessary.
1693    The flag PAGE_WRITE_ORG is positioned automatically depending
1694    on PAGE_WRITE.  The mmap_lock should already be held.  */
1695 void page_set_flags(target_ulong start, target_ulong end, int flags)
1696 {
1697     target_ulong addr, len;
1698
1699     /* This function should never be called with addresses outside the
1700        guest address space.  If this assert fires, it probably indicates
1701        a missing call to h2g_valid.  */
1702 #if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
1703     assert(end < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
1704 #endif
1705     assert(start < end);
1706
1707     start = start & TARGET_PAGE_MASK;
1708     end = TARGET_PAGE_ALIGN(end);
1709
1710     if (flags & PAGE_WRITE) {
1711         flags |= PAGE_WRITE_ORG;
1712     }
1713
1714     for (addr = start, len = end - start;
1715          len != 0;
1716          len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
1717         PageDesc *p = page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
1718
1719         /* If the write protection bit is set, then we invalidate
1720            the code inside.  */
1721         if (!(p->flags & PAGE_WRITE) &&
1722             (flags & PAGE_WRITE) &&
1723             p->first_tb) {
1724             tb_invalidate_phys_page(addr, 0, NULL, false);
1725         }
1726         p->flags = flags;
1727     }
1728 }
1729
1730 int page_check_range(target_ulong start, target_ulong len, int flags)
1731 {
1732     PageDesc *p;
1733     target_ulong end;
1734     target_ulong addr;
1735
1736     /* This function should never be called with addresses outside the
1737        guest address space.  If this assert fires, it probably indicates
1738        a missing call to h2g_valid.  */
1739 #if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
1740     assert(start < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
1741 #endif
1742
1743     if (len == 0) {
1744         return 0;
1745     }
1746     if (start + len - 1 < start) {
1747         /* We've wrapped around.  */
1748         return -1;
1749     }
1750
1751     /* must do before we loose bits in the next step */
1752     end = TARGET_PAGE_ALIGN(start + len);
1753     start = start & TARGET_PAGE_MASK;
1754
1755     for (addr = start, len = end - start;
1756          len != 0;
1757          len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
1758         p = page_find(addr >> TARGET_PAGE_BITS);
1759         if (!p) {
1760             return -1;
1761         }
1762         if (!(p->flags & PAGE_VALID)) {
1763             return -1;
1764         }
1765
1766         if ((flags & PAGE_READ) && !(p->flags & PAGE_READ)) {
1767             return -1;
1768         }
1769         if (flags & PAGE_WRITE) {
1770             if (!(p->flags & PAGE_WRITE_ORG)) {
1771                 return -1;
1772             }
1773             /* unprotect the page if it was put read-only because it
1774                contains translated code */
1775             if (!(p->flags & PAGE_WRITE)) {
1776                 if (!page_unprotect(addr, 0, NULL)) {
1777                     return -1;
1778                 }
1779             }
1780             return 0;
1781         }
1782     }
1783     return 0;
1784 }
1785
1786 /* called from signal handler: invalidate the code and unprotect the
1787    page. Return TRUE if the fault was successfully handled. */
1788 int page_unprotect(target_ulong address, uintptr_t pc, void *puc)
1789 {
1790     unsigned int prot;
1791     PageDesc *p;
1792     target_ulong host_start, host_end, addr;
1793
1794     /* Technically this isn't safe inside a signal handler.  However we
1795        know this only ever happens in a synchronous SEGV handler, so in
1796        practice it seems to be ok.  */
1797     mmap_lock();
1798
1799     p = page_find(address >> TARGET_PAGE_BITS);
1800     if (!p) {
1801         mmap_unlock();
1802         return 0;
1803     }
1804
1805     /* if the page was really writable, then we change its
1806        protection back to writable */
1807     if ((p->flags & PAGE_WRITE_ORG) && !(p->flags & PAGE_WRITE)) {
1808         host_start = address & qemu_host_page_mask;
1809         host_end = host_start + qemu_host_page_size;
1810
1811         prot = 0;
1812         for (addr = host_start ; addr < host_end ; addr += TARGET_PAGE_SIZE) {
1813             p = page_find(addr >> TARGET_PAGE_BITS);
1814             p->flags |= PAGE_WRITE;
1815             prot |= p->flags;
1816
1817             /* and since the content will be modified, we must invalidate
1818                the corresponding translated code. */
1819             tb_invalidate_phys_page(addr, pc, puc, true);
1820 #ifdef DEBUG_TB_CHECK
1821             tb_invalidate_check(addr);
1822 #endif
1823         }
1824         mprotect((void *)g2h(host_start), qemu_host_page_size,
1825                  prot & PAGE_BITS);
1826
1827         mmap_unlock();
1828         return 1;
1829     }
1830     mmap_unlock();
1831     return 0;
1832 }
1833 #endif /* CONFIG_USER_ONLY */