]> Git Repo - qemu.git/blob - translate-all.c
Merge remote-tracking branch 'remotes/xtensa/tags/20170306-xtensa' into staging
[qemu.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 #endif
22 #include "qemu/osdep.h"
23
24
25 #include "qemu-common.h"
26 #define NO_CPU_IO_DEFS
27 #include "cpu.h"
28 #include "trace-root.h"
29 #include "disas/disas.h"
30 #include "exec/exec-all.h"
31 #include "tcg.h"
32 #if defined(CONFIG_USER_ONLY)
33 #include "qemu.h"
34 #include "exec/exec-all.h"
35 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
36 #include <sys/param.h>
37 #if __FreeBSD_version >= 700104
38 #define HAVE_KINFO_GETVMMAP
39 #define sigqueue sigqueue_freebsd  /* avoid redefinition */
40 #include <sys/proc.h>
41 #include <machine/profile.h>
42 #define _KERNEL
43 #include <sys/user.h>
44 #undef _KERNEL
45 #undef sigqueue
46 #include <libutil.h>
47 #endif
48 #endif
49 #else
50 #include "exec/address-spaces.h"
51 #endif
52
53 #include "exec/cputlb.h"
54 #include "exec/tb-hash.h"
55 #include "translate-all.h"
56 #include "qemu/bitmap.h"
57 #include "qemu/timer.h"
58 #include "qemu/main-loop.h"
59 #include "exec/log.h"
60
61 /* #define DEBUG_TB_INVALIDATE */
62 /* #define DEBUG_TB_FLUSH */
63 /* make various TB consistency checks */
64 /* #define DEBUG_TB_CHECK */
65
66 #if !defined(CONFIG_USER_ONLY)
67 /* TB consistency checks only implemented for usermode emulation.  */
68 #undef DEBUG_TB_CHECK
69 #endif
70
71 /* Access to the various translations structures need to be serialised via locks
72  * for consistency. This is automatic for SoftMMU based system
73  * emulation due to its single threaded nature. In user-mode emulation
74  * access to the memory related structures are protected with the
75  * mmap_lock.
76  */
77 #ifdef CONFIG_SOFTMMU
78 #define assert_memory_lock() tcg_debug_assert(have_tb_lock)
79 #else
80 #define assert_memory_lock() tcg_debug_assert(have_mmap_lock())
81 #endif
82
83 #define SMC_BITMAP_USE_THRESHOLD 10
84
85 typedef struct PageDesc {
86     /* list of TBs intersecting this ram page */
87     TranslationBlock *first_tb;
88 #ifdef CONFIG_SOFTMMU
89     /* in order to optimize self modifying code, we count the number
90        of lookups we do to a given page to use a bitmap */
91     unsigned int code_write_count;
92     unsigned long *code_bitmap;
93 #else
94     unsigned long flags;
95 #endif
96 } PageDesc;
97
98 /* In system mode we want L1_MAP to be based on ram offsets,
99    while in user mode we want it to be based on virtual addresses.  */
100 #if !defined(CONFIG_USER_ONLY)
101 #if HOST_LONG_BITS < TARGET_PHYS_ADDR_SPACE_BITS
102 # define L1_MAP_ADDR_SPACE_BITS  HOST_LONG_BITS
103 #else
104 # define L1_MAP_ADDR_SPACE_BITS  TARGET_PHYS_ADDR_SPACE_BITS
105 #endif
106 #else
107 # define L1_MAP_ADDR_SPACE_BITS  TARGET_VIRT_ADDR_SPACE_BITS
108 #endif
109
110 /* Size of the L2 (and L3, etc) page tables.  */
111 #define V_L2_BITS 10
112 #define V_L2_SIZE (1 << V_L2_BITS)
113
114 uintptr_t qemu_host_page_size;
115 intptr_t qemu_host_page_mask;
116
117 /*
118  * L1 Mapping properties
119  */
120 static int v_l1_size;
121 static int v_l1_shift;
122 static int v_l2_levels;
123
124 /* The bottom level has pointers to PageDesc, and is indexed by
125  * anything from 4 to (V_L2_BITS + 3) bits, depending on target page size.
126  */
127 #define V_L1_MIN_BITS 4
128 #define V_L1_MAX_BITS (V_L2_BITS + 3)
129 #define V_L1_MAX_SIZE (1 << V_L1_MAX_BITS)
130
131 static void *l1_map[V_L1_MAX_SIZE];
132
133 /* code generation context */
134 TCGContext tcg_ctx;
135 bool parallel_cpus;
136
137 /* translation block context */
138 __thread int have_tb_lock;
139
140 static void page_table_config_init(void)
141 {
142     uint32_t v_l1_bits;
143
144     assert(TARGET_PAGE_BITS);
145     /* The bits remaining after N lower levels of page tables.  */
146     v_l1_bits = (L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % V_L2_BITS;
147     if (v_l1_bits < V_L1_MIN_BITS) {
148         v_l1_bits += V_L2_BITS;
149     }
150
151     v_l1_size = 1 << v_l1_bits;
152     v_l1_shift = L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS - v_l1_bits;
153     v_l2_levels = v_l1_shift / V_L2_BITS - 1;
154
155     assert(v_l1_bits <= V_L1_MAX_BITS);
156     assert(v_l1_shift % V_L2_BITS == 0);
157     assert(v_l2_levels >= 0);
158 }
159
160 #define assert_tb_locked() tcg_debug_assert(have_tb_lock)
161 #define assert_tb_unlocked() tcg_debug_assert(!have_tb_lock)
162
163 void tb_lock(void)
164 {
165     assert_tb_unlocked();
166     qemu_mutex_lock(&tcg_ctx.tb_ctx.tb_lock);
167     have_tb_lock++;
168 }
169
170 void tb_unlock(void)
171 {
172     assert_tb_locked();
173     have_tb_lock--;
174     qemu_mutex_unlock(&tcg_ctx.tb_ctx.tb_lock);
175 }
176
177 void tb_lock_reset(void)
178 {
179     if (have_tb_lock) {
180         qemu_mutex_unlock(&tcg_ctx.tb_ctx.tb_lock);
181         have_tb_lock = 0;
182     }
183 }
184
185 static TranslationBlock *tb_find_pc(uintptr_t tc_ptr);
186
187 void cpu_gen_init(void)
188 {
189     tcg_context_init(&tcg_ctx); 
190 }
191
192 /* Encode VAL as a signed leb128 sequence at P.
193    Return P incremented past the encoded value.  */
194 static uint8_t *encode_sleb128(uint8_t *p, target_long val)
195 {
196     int more, byte;
197
198     do {
199         byte = val & 0x7f;
200         val >>= 7;
201         more = !((val == 0 && (byte & 0x40) == 0)
202                  || (val == -1 && (byte & 0x40) != 0));
203         if (more) {
204             byte |= 0x80;
205         }
206         *p++ = byte;
207     } while (more);
208
209     return p;
210 }
211
212 /* Decode a signed leb128 sequence at *PP; increment *PP past the
213    decoded value.  Return the decoded value.  */
214 static target_long decode_sleb128(uint8_t **pp)
215 {
216     uint8_t *p = *pp;
217     target_long val = 0;
218     int byte, shift = 0;
219
220     do {
221         byte = *p++;
222         val |= (target_ulong)(byte & 0x7f) << shift;
223         shift += 7;
224     } while (byte & 0x80);
225     if (shift < TARGET_LONG_BITS && (byte & 0x40)) {
226         val |= -(target_ulong)1 << shift;
227     }
228
229     *pp = p;
230     return val;
231 }
232
233 /* Encode the data collected about the instructions while compiling TB.
234    Place the data at BLOCK, and return the number of bytes consumed.
235
236    The logical table consisits of TARGET_INSN_START_WORDS target_ulong's,
237    which come from the target's insn_start data, followed by a uintptr_t
238    which comes from the host pc of the end of the code implementing the insn.
239
240    Each line of the table is encoded as sleb128 deltas from the previous
241    line.  The seed for the first line is { tb->pc, 0..., tb->tc_ptr }.
242    That is, the first column is seeded with the guest pc, the last column
243    with the host pc, and the middle columns with zeros.  */
244
245 static int encode_search(TranslationBlock *tb, uint8_t *block)
246 {
247     uint8_t *highwater = tcg_ctx.code_gen_highwater;
248     uint8_t *p = block;
249     int i, j, n;
250
251     tb->tc_search = block;
252
253     for (i = 0, n = tb->icount; i < n; ++i) {
254         target_ulong prev;
255
256         for (j = 0; j < TARGET_INSN_START_WORDS; ++j) {
257             if (i == 0) {
258                 prev = (j == 0 ? tb->pc : 0);
259             } else {
260                 prev = tcg_ctx.gen_insn_data[i - 1][j];
261             }
262             p = encode_sleb128(p, tcg_ctx.gen_insn_data[i][j] - prev);
263         }
264         prev = (i == 0 ? 0 : tcg_ctx.gen_insn_end_off[i - 1]);
265         p = encode_sleb128(p, tcg_ctx.gen_insn_end_off[i] - prev);
266
267         /* Test for (pending) buffer overflow.  The assumption is that any
268            one row beginning below the high water mark cannot overrun
269            the buffer completely.  Thus we can test for overflow after
270            encoding a row without having to check during encoding.  */
271         if (unlikely(p > highwater)) {
272             return -1;
273         }
274     }
275
276     return p - block;
277 }
278
279 /* The cpu state corresponding to 'searched_pc' is restored.
280  * Called with tb_lock held.
281  */
282 static int cpu_restore_state_from_tb(CPUState *cpu, TranslationBlock *tb,
283                                      uintptr_t searched_pc)
284 {
285     target_ulong data[TARGET_INSN_START_WORDS] = { tb->pc };
286     uintptr_t host_pc = (uintptr_t)tb->tc_ptr;
287     CPUArchState *env = cpu->env_ptr;
288     uint8_t *p = tb->tc_search;
289     int i, j, num_insns = tb->icount;
290 #ifdef CONFIG_PROFILER
291     int64_t ti = profile_getclock();
292 #endif
293
294     searched_pc -= GETPC_ADJ;
295
296     if (searched_pc < host_pc) {
297         return -1;
298     }
299
300     /* Reconstruct the stored insn data while looking for the point at
301        which the end of the insn exceeds the searched_pc.  */
302     for (i = 0; i < num_insns; ++i) {
303         for (j = 0; j < TARGET_INSN_START_WORDS; ++j) {
304             data[j] += decode_sleb128(&p);
305         }
306         host_pc += decode_sleb128(&p);
307         if (host_pc > searched_pc) {
308             goto found;
309         }
310     }
311     return -1;
312
313  found:
314     if (tb->cflags & CF_USE_ICOUNT) {
315         assert(use_icount);
316         /* Reset the cycle counter to the start of the block.  */
317         cpu->icount_decr.u16.low += num_insns;
318         /* Clear the IO flag.  */
319         cpu->can_do_io = 0;
320     }
321     cpu->icount_decr.u16.low -= i;
322     restore_state_to_opc(env, tb, data);
323
324 #ifdef CONFIG_PROFILER
325     tcg_ctx.restore_time += profile_getclock() - ti;
326     tcg_ctx.restore_count++;
327 #endif
328     return 0;
329 }
330
331 bool cpu_restore_state(CPUState *cpu, uintptr_t retaddr)
332 {
333     TranslationBlock *tb;
334     bool r = false;
335
336     tb_lock();
337     tb = tb_find_pc(retaddr);
338     if (tb) {
339         cpu_restore_state_from_tb(cpu, tb, retaddr);
340         if (tb->cflags & CF_NOCACHE) {
341             /* one-shot translation, invalidate it immediately */
342             tb_phys_invalidate(tb, -1);
343             tb_free(tb);
344         }
345         r = true;
346     }
347     tb_unlock();
348
349     return r;
350 }
351
352 void page_size_init(void)
353 {
354     /* NOTE: we can always suppose that qemu_host_page_size >=
355        TARGET_PAGE_SIZE */
356     qemu_real_host_page_size = getpagesize();
357     qemu_real_host_page_mask = -(intptr_t)qemu_real_host_page_size;
358     if (qemu_host_page_size == 0) {
359         qemu_host_page_size = qemu_real_host_page_size;
360     }
361     if (qemu_host_page_size < TARGET_PAGE_SIZE) {
362         qemu_host_page_size = TARGET_PAGE_SIZE;
363     }
364     qemu_host_page_mask = -(intptr_t)qemu_host_page_size;
365 }
366
367 static void page_init(void)
368 {
369     page_size_init();
370     page_table_config_init();
371
372 #if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
373     {
374 #ifdef HAVE_KINFO_GETVMMAP
375         struct kinfo_vmentry *freep;
376         int i, cnt;
377
378         freep = kinfo_getvmmap(getpid(), &cnt);
379         if (freep) {
380             mmap_lock();
381             for (i = 0; i < cnt; i++) {
382                 unsigned long startaddr, endaddr;
383
384                 startaddr = freep[i].kve_start;
385                 endaddr = freep[i].kve_end;
386                 if (h2g_valid(startaddr)) {
387                     startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
388
389                     if (h2g_valid(endaddr)) {
390                         endaddr = h2g(endaddr);
391                         page_set_flags(startaddr, endaddr, PAGE_RESERVED);
392                     } else {
393 #if TARGET_ABI_BITS <= L1_MAP_ADDR_SPACE_BITS
394                         endaddr = ~0ul;
395                         page_set_flags(startaddr, endaddr, PAGE_RESERVED);
396 #endif
397                     }
398                 }
399             }
400             free(freep);
401             mmap_unlock();
402         }
403 #else
404         FILE *f;
405
406         last_brk = (unsigned long)sbrk(0);
407
408         f = fopen("/compat/linux/proc/self/maps", "r");
409         if (f) {
410             mmap_lock();
411
412             do {
413                 unsigned long startaddr, endaddr;
414                 int n;
415
416                 n = fscanf(f, "%lx-%lx %*[^\n]\n", &startaddr, &endaddr);
417
418                 if (n == 2 && h2g_valid(startaddr)) {
419                     startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
420
421                     if (h2g_valid(endaddr)) {
422                         endaddr = h2g(endaddr);
423                     } else {
424                         endaddr = ~0ul;
425                     }
426                     page_set_flags(startaddr, endaddr, PAGE_RESERVED);
427                 }
428             } while (!feof(f));
429
430             fclose(f);
431             mmap_unlock();
432         }
433 #endif
434     }
435 #endif
436 }
437
438 /* If alloc=1:
439  * Called with tb_lock held for system emulation.
440  * Called with mmap_lock held for user-mode emulation.
441  */
442 static PageDesc *page_find_alloc(tb_page_addr_t index, int alloc)
443 {
444     PageDesc *pd;
445     void **lp;
446     int i;
447
448     if (alloc) {
449         assert_memory_lock();
450     }
451
452     /* Level 1.  Always allocated.  */
453     lp = l1_map + ((index >> v_l1_shift) & (v_l1_size - 1));
454
455     /* Level 2..N-1.  */
456     for (i = v_l2_levels; i > 0; i--) {
457         void **p = atomic_rcu_read(lp);
458
459         if (p == NULL) {
460             if (!alloc) {
461                 return NULL;
462             }
463             p = g_new0(void *, V_L2_SIZE);
464             atomic_rcu_set(lp, p);
465         }
466
467         lp = p + ((index >> (i * V_L2_BITS)) & (V_L2_SIZE - 1));
468     }
469
470     pd = atomic_rcu_read(lp);
471     if (pd == NULL) {
472         if (!alloc) {
473             return NULL;
474         }
475         pd = g_new0(PageDesc, V_L2_SIZE);
476         atomic_rcu_set(lp, pd);
477     }
478
479     return pd + (index & (V_L2_SIZE - 1));
480 }
481
482 static inline PageDesc *page_find(tb_page_addr_t index)
483 {
484     return page_find_alloc(index, 0);
485 }
486
487 #if defined(CONFIG_USER_ONLY)
488 /* Currently it is not recommended to allocate big chunks of data in
489    user mode. It will change when a dedicated libc will be used.  */
490 /* ??? 64-bit hosts ought to have no problem mmaping data outside the
491    region in which the guest needs to run.  Revisit this.  */
492 #define USE_STATIC_CODE_GEN_BUFFER
493 #endif
494
495 /* Minimum size of the code gen buffer.  This number is randomly chosen,
496    but not so small that we can't have a fair number of TB's live.  */
497 #define MIN_CODE_GEN_BUFFER_SIZE     (1024u * 1024)
498
499 /* Maximum size of the code gen buffer we'd like to use.  Unless otherwise
500    indicated, this is constrained by the range of direct branches on the
501    host cpu, as used by the TCG implementation of goto_tb.  */
502 #if defined(__x86_64__)
503 # define MAX_CODE_GEN_BUFFER_SIZE  (2ul * 1024 * 1024 * 1024)
504 #elif defined(__sparc__)
505 # define MAX_CODE_GEN_BUFFER_SIZE  (2ul * 1024 * 1024 * 1024)
506 #elif defined(__powerpc64__)
507 # define MAX_CODE_GEN_BUFFER_SIZE  (2ul * 1024 * 1024 * 1024)
508 #elif defined(__powerpc__)
509 # define MAX_CODE_GEN_BUFFER_SIZE  (32u * 1024 * 1024)
510 #elif defined(__aarch64__)
511 # define MAX_CODE_GEN_BUFFER_SIZE  (128ul * 1024 * 1024)
512 #elif defined(__arm__)
513 # define MAX_CODE_GEN_BUFFER_SIZE  (16u * 1024 * 1024)
514 #elif defined(__s390x__)
515   /* We have a +- 4GB range on the branches; leave some slop.  */
516 # define MAX_CODE_GEN_BUFFER_SIZE  (3ul * 1024 * 1024 * 1024)
517 #elif defined(__mips__)
518   /* We have a 256MB branch region, but leave room to make sure the
519      main executable is also within that region.  */
520 # define MAX_CODE_GEN_BUFFER_SIZE  (128ul * 1024 * 1024)
521 #else
522 # define MAX_CODE_GEN_BUFFER_SIZE  ((size_t)-1)
523 #endif
524
525 #define DEFAULT_CODE_GEN_BUFFER_SIZE_1 (32u * 1024 * 1024)
526
527 #define DEFAULT_CODE_GEN_BUFFER_SIZE \
528   (DEFAULT_CODE_GEN_BUFFER_SIZE_1 < MAX_CODE_GEN_BUFFER_SIZE \
529    ? DEFAULT_CODE_GEN_BUFFER_SIZE_1 : MAX_CODE_GEN_BUFFER_SIZE)
530
531 static inline size_t size_code_gen_buffer(size_t tb_size)
532 {
533     /* Size the buffer.  */
534     if (tb_size == 0) {
535 #ifdef USE_STATIC_CODE_GEN_BUFFER
536         tb_size = DEFAULT_CODE_GEN_BUFFER_SIZE;
537 #else
538         /* ??? Needs adjustments.  */
539         /* ??? If we relax the requirement that CONFIG_USER_ONLY use the
540            static buffer, we could size this on RESERVED_VA, on the text
541            segment size of the executable, or continue to use the default.  */
542         tb_size = (unsigned long)(ram_size / 4);
543 #endif
544     }
545     if (tb_size < MIN_CODE_GEN_BUFFER_SIZE) {
546         tb_size = MIN_CODE_GEN_BUFFER_SIZE;
547     }
548     if (tb_size > MAX_CODE_GEN_BUFFER_SIZE) {
549         tb_size = MAX_CODE_GEN_BUFFER_SIZE;
550     }
551     return tb_size;
552 }
553
554 #ifdef __mips__
555 /* In order to use J and JAL within the code_gen_buffer, we require
556    that the buffer not cross a 256MB boundary.  */
557 static inline bool cross_256mb(void *addr, size_t size)
558 {
559     return ((uintptr_t)addr ^ ((uintptr_t)addr + size)) & ~0x0ffffffful;
560 }
561
562 /* We weren't able to allocate a buffer without crossing that boundary,
563    so make do with the larger portion of the buffer that doesn't cross.
564    Returns the new base of the buffer, and adjusts code_gen_buffer_size.  */
565 static inline void *split_cross_256mb(void *buf1, size_t size1)
566 {
567     void *buf2 = (void *)(((uintptr_t)buf1 + size1) & ~0x0ffffffful);
568     size_t size2 = buf1 + size1 - buf2;
569
570     size1 = buf2 - buf1;
571     if (size1 < size2) {
572         size1 = size2;
573         buf1 = buf2;
574     }
575
576     tcg_ctx.code_gen_buffer_size = size1;
577     return buf1;
578 }
579 #endif
580
581 #ifdef USE_STATIC_CODE_GEN_BUFFER
582 static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE]
583     __attribute__((aligned(CODE_GEN_ALIGN)));
584
585 # ifdef _WIN32
586 static inline void do_protect(void *addr, long size, int prot)
587 {
588     DWORD old_protect;
589     VirtualProtect(addr, size, prot, &old_protect);
590 }
591
592 static inline void map_exec(void *addr, long size)
593 {
594     do_protect(addr, size, PAGE_EXECUTE_READWRITE);
595 }
596
597 static inline void map_none(void *addr, long size)
598 {
599     do_protect(addr, size, PAGE_NOACCESS);
600 }
601 # else
602 static inline void do_protect(void *addr, long size, int prot)
603 {
604     uintptr_t start, end;
605
606     start = (uintptr_t)addr;
607     start &= qemu_real_host_page_mask;
608
609     end = (uintptr_t)addr + size;
610     end = ROUND_UP(end, qemu_real_host_page_size);
611
612     mprotect((void *)start, end - start, prot);
613 }
614
615 static inline void map_exec(void *addr, long size)
616 {
617     do_protect(addr, size, PROT_READ | PROT_WRITE | PROT_EXEC);
618 }
619
620 static inline void map_none(void *addr, long size)
621 {
622     do_protect(addr, size, PROT_NONE);
623 }
624 # endif /* WIN32 */
625
626 static inline void *alloc_code_gen_buffer(void)
627 {
628     void *buf = static_code_gen_buffer;
629     size_t full_size, size;
630
631     /* The size of the buffer, rounded down to end on a page boundary.  */
632     full_size = (((uintptr_t)buf + sizeof(static_code_gen_buffer))
633                  & qemu_real_host_page_mask) - (uintptr_t)buf;
634
635     /* Reserve a guard page.  */
636     size = full_size - qemu_real_host_page_size;
637
638     /* Honor a command-line option limiting the size of the buffer.  */
639     if (size > tcg_ctx.code_gen_buffer_size) {
640         size = (((uintptr_t)buf + tcg_ctx.code_gen_buffer_size)
641                 & qemu_real_host_page_mask) - (uintptr_t)buf;
642     }
643     tcg_ctx.code_gen_buffer_size = size;
644
645 #ifdef __mips__
646     if (cross_256mb(buf, size)) {
647         buf = split_cross_256mb(buf, size);
648         size = tcg_ctx.code_gen_buffer_size;
649     }
650 #endif
651
652     map_exec(buf, size);
653     map_none(buf + size, qemu_real_host_page_size);
654     qemu_madvise(buf, size, QEMU_MADV_HUGEPAGE);
655
656     return buf;
657 }
658 #elif defined(_WIN32)
659 static inline void *alloc_code_gen_buffer(void)
660 {
661     size_t size = tcg_ctx.code_gen_buffer_size;
662     void *buf1, *buf2;
663
664     /* Perform the allocation in two steps, so that the guard page
665        is reserved but uncommitted.  */
666     buf1 = VirtualAlloc(NULL, size + qemu_real_host_page_size,
667                         MEM_RESERVE, PAGE_NOACCESS);
668     if (buf1 != NULL) {
669         buf2 = VirtualAlloc(buf1, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
670         assert(buf1 == buf2);
671     }
672
673     return buf1;
674 }
675 #else
676 static inline void *alloc_code_gen_buffer(void)
677 {
678     int flags = MAP_PRIVATE | MAP_ANONYMOUS;
679     uintptr_t start = 0;
680     size_t size = tcg_ctx.code_gen_buffer_size;
681     void *buf;
682
683     /* Constrain the position of the buffer based on the host cpu.
684        Note that these addresses are chosen in concert with the
685        addresses assigned in the relevant linker script file.  */
686 # if defined(__PIE__) || defined(__PIC__)
687     /* Don't bother setting a preferred location if we're building
688        a position-independent executable.  We're more likely to get
689        an address near the main executable if we let the kernel
690        choose the address.  */
691 # elif defined(__x86_64__) && defined(MAP_32BIT)
692     /* Force the memory down into low memory with the executable.
693        Leave the choice of exact location with the kernel.  */
694     flags |= MAP_32BIT;
695     /* Cannot expect to map more than 800MB in low memory.  */
696     if (size > 800u * 1024 * 1024) {
697         tcg_ctx.code_gen_buffer_size = size = 800u * 1024 * 1024;
698     }
699 # elif defined(__sparc__)
700     start = 0x40000000ul;
701 # elif defined(__s390x__)
702     start = 0x90000000ul;
703 # elif defined(__mips__)
704 #  if _MIPS_SIM == _ABI64
705     start = 0x128000000ul;
706 #  else
707     start = 0x08000000ul;
708 #  endif
709 # endif
710
711     buf = mmap((void *)start, size + qemu_real_host_page_size,
712                PROT_NONE, flags, -1, 0);
713     if (buf == MAP_FAILED) {
714         return NULL;
715     }
716
717 #ifdef __mips__
718     if (cross_256mb(buf, size)) {
719         /* Try again, with the original still mapped, to avoid re-acquiring
720            that 256mb crossing.  This time don't specify an address.  */
721         size_t size2;
722         void *buf2 = mmap(NULL, size + qemu_real_host_page_size,
723                           PROT_NONE, flags, -1, 0);
724         switch ((int)(buf2 != MAP_FAILED)) {
725         case 1:
726             if (!cross_256mb(buf2, size)) {
727                 /* Success!  Use the new buffer.  */
728                 munmap(buf, size + qemu_real_host_page_size);
729                 break;
730             }
731             /* Failure.  Work with what we had.  */
732             munmap(buf2, size + qemu_real_host_page_size);
733             /* fallthru */
734         default:
735             /* Split the original buffer.  Free the smaller half.  */
736             buf2 = split_cross_256mb(buf, size);
737             size2 = tcg_ctx.code_gen_buffer_size;
738             if (buf == buf2) {
739                 munmap(buf + size2 + qemu_real_host_page_size, size - size2);
740             } else {
741                 munmap(buf, size - size2);
742             }
743             size = size2;
744             break;
745         }
746         buf = buf2;
747     }
748 #endif
749
750     /* Make the final buffer accessible.  The guard page at the end
751        will remain inaccessible with PROT_NONE.  */
752     mprotect(buf, size, PROT_WRITE | PROT_READ | PROT_EXEC);
753
754     /* Request large pages for the buffer.  */
755     qemu_madvise(buf, size, QEMU_MADV_HUGEPAGE);
756
757     return buf;
758 }
759 #endif /* USE_STATIC_CODE_GEN_BUFFER, WIN32, POSIX */
760
761 static inline void code_gen_alloc(size_t tb_size)
762 {
763     tcg_ctx.code_gen_buffer_size = size_code_gen_buffer(tb_size);
764     tcg_ctx.code_gen_buffer = alloc_code_gen_buffer();
765     if (tcg_ctx.code_gen_buffer == NULL) {
766         fprintf(stderr, "Could not allocate dynamic translator buffer\n");
767         exit(1);
768     }
769
770     /* Estimate a good size for the number of TBs we can support.  We
771        still haven't deducted the prologue from the buffer size here,
772        but that's minimal and won't affect the estimate much.  */
773     tcg_ctx.code_gen_max_blocks
774         = tcg_ctx.code_gen_buffer_size / CODE_GEN_AVG_BLOCK_SIZE;
775     tcg_ctx.tb_ctx.tbs = g_new(TranslationBlock, tcg_ctx.code_gen_max_blocks);
776
777     qemu_mutex_init(&tcg_ctx.tb_ctx.tb_lock);
778 }
779
780 static void tb_htable_init(void)
781 {
782     unsigned int mode = QHT_MODE_AUTO_RESIZE;
783
784     qht_init(&tcg_ctx.tb_ctx.htable, CODE_GEN_HTABLE_SIZE, mode);
785 }
786
787 /* Must be called before using the QEMU cpus. 'tb_size' is the size
788    (in bytes) allocated to the translation buffer. Zero means default
789    size. */
790 void tcg_exec_init(unsigned long tb_size)
791 {
792     cpu_gen_init();
793     page_init();
794     tb_htable_init();
795     code_gen_alloc(tb_size);
796 #if defined(CONFIG_SOFTMMU)
797     /* There's no guest base to take into account, so go ahead and
798        initialize the prologue now.  */
799     tcg_prologue_init(&tcg_ctx);
800 #endif
801 }
802
803 bool tcg_enabled(void)
804 {
805     return tcg_ctx.code_gen_buffer != NULL;
806 }
807
808 /*
809  * Allocate a new translation block. Flush the translation buffer if
810  * too many translation blocks or too much generated code.
811  *
812  * Called with tb_lock held.
813  */
814 static TranslationBlock *tb_alloc(target_ulong pc)
815 {
816     TranslationBlock *tb;
817
818     assert_tb_locked();
819
820     if (tcg_ctx.tb_ctx.nb_tbs >= tcg_ctx.code_gen_max_blocks) {
821         return NULL;
822     }
823     tb = &tcg_ctx.tb_ctx.tbs[tcg_ctx.tb_ctx.nb_tbs++];
824     tb->pc = pc;
825     tb->cflags = 0;
826     tb->invalid = false;
827     return tb;
828 }
829
830 /* Called with tb_lock held.  */
831 void tb_free(TranslationBlock *tb)
832 {
833     assert_tb_locked();
834
835     /* In practice this is mostly used for single use temporary TB
836        Ignore the hard cases and just back up if this TB happens to
837        be the last one generated.  */
838     if (tcg_ctx.tb_ctx.nb_tbs > 0 &&
839             tb == &tcg_ctx.tb_ctx.tbs[tcg_ctx.tb_ctx.nb_tbs - 1]) {
840         tcg_ctx.code_gen_ptr = tb->tc_ptr;
841         tcg_ctx.tb_ctx.nb_tbs--;
842     }
843 }
844
845 static inline void invalidate_page_bitmap(PageDesc *p)
846 {
847 #ifdef CONFIG_SOFTMMU
848     g_free(p->code_bitmap);
849     p->code_bitmap = NULL;
850     p->code_write_count = 0;
851 #endif
852 }
853
854 /* Set to NULL all the 'first_tb' fields in all PageDescs. */
855 static void page_flush_tb_1(int level, void **lp)
856 {
857     int i;
858
859     if (*lp == NULL) {
860         return;
861     }
862     if (level == 0) {
863         PageDesc *pd = *lp;
864
865         for (i = 0; i < V_L2_SIZE; ++i) {
866             pd[i].first_tb = NULL;
867             invalidate_page_bitmap(pd + i);
868         }
869     } else {
870         void **pp = *lp;
871
872         for (i = 0; i < V_L2_SIZE; ++i) {
873             page_flush_tb_1(level - 1, pp + i);
874         }
875     }
876 }
877
878 static void page_flush_tb(void)
879 {
880     int i, l1_sz = v_l1_size;
881
882     for (i = 0; i < l1_sz; i++) {
883         page_flush_tb_1(v_l2_levels, l1_map + i);
884     }
885 }
886
887 /* flush all the translation blocks */
888 static void do_tb_flush(CPUState *cpu, run_on_cpu_data tb_flush_count)
889 {
890     tb_lock();
891
892     /* If it is already been done on request of another CPU,
893      * just retry.
894      */
895     if (tcg_ctx.tb_ctx.tb_flush_count != tb_flush_count.host_int) {
896         goto done;
897     }
898
899 #if defined(DEBUG_TB_FLUSH)
900     printf("qemu: flush code_size=%ld nb_tbs=%d avg_tb_size=%ld\n",
901            (unsigned long)(tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer),
902            tcg_ctx.tb_ctx.nb_tbs, tcg_ctx.tb_ctx.nb_tbs > 0 ?
903            ((unsigned long)(tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer)) /
904            tcg_ctx.tb_ctx.nb_tbs : 0);
905 #endif
906     if ((unsigned long)(tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer)
907         > tcg_ctx.code_gen_buffer_size) {
908         cpu_abort(cpu, "Internal error: code buffer overflow\n");
909     }
910
911     CPU_FOREACH(cpu) {
912         int i;
913
914         for (i = 0; i < TB_JMP_CACHE_SIZE; ++i) {
915             atomic_set(&cpu->tb_jmp_cache[i], NULL);
916         }
917     }
918
919     tcg_ctx.tb_ctx.nb_tbs = 0;
920     qht_reset_size(&tcg_ctx.tb_ctx.htable, CODE_GEN_HTABLE_SIZE);
921     page_flush_tb();
922
923     tcg_ctx.code_gen_ptr = tcg_ctx.code_gen_buffer;
924     /* XXX: flush processor icache at this point if cache flush is
925        expensive */
926     atomic_mb_set(&tcg_ctx.tb_ctx.tb_flush_count,
927                   tcg_ctx.tb_ctx.tb_flush_count + 1);
928
929 done:
930     tb_unlock();
931 }
932
933 void tb_flush(CPUState *cpu)
934 {
935     if (tcg_enabled()) {
936         unsigned tb_flush_count = atomic_mb_read(&tcg_ctx.tb_ctx.tb_flush_count);
937         async_safe_run_on_cpu(cpu, do_tb_flush,
938                               RUN_ON_CPU_HOST_INT(tb_flush_count));
939     }
940 }
941
942 #ifdef DEBUG_TB_CHECK
943
944 static void
945 do_tb_invalidate_check(struct qht *ht, void *p, uint32_t hash, void *userp)
946 {
947     TranslationBlock *tb = p;
948     target_ulong addr = *(target_ulong *)userp;
949
950     if (!(addr + TARGET_PAGE_SIZE <= tb->pc || addr >= tb->pc + tb->size)) {
951         printf("ERROR invalidate: address=" TARGET_FMT_lx
952                " PC=%08lx size=%04x\n", addr, (long)tb->pc, tb->size);
953     }
954 }
955
956 /* verify that all the pages have correct rights for code
957  *
958  * Called with tb_lock held.
959  */
960 static void tb_invalidate_check(target_ulong address)
961 {
962     address &= TARGET_PAGE_MASK;
963     qht_iter(&tcg_ctx.tb_ctx.htable, do_tb_invalidate_check, &address);
964 }
965
966 static void
967 do_tb_page_check(struct qht *ht, void *p, uint32_t hash, void *userp)
968 {
969     TranslationBlock *tb = p;
970     int flags1, flags2;
971
972     flags1 = page_get_flags(tb->pc);
973     flags2 = page_get_flags(tb->pc + tb->size - 1);
974     if ((flags1 & PAGE_WRITE) || (flags2 & PAGE_WRITE)) {
975         printf("ERROR page flags: PC=%08lx size=%04x f1=%x f2=%x\n",
976                (long)tb->pc, tb->size, flags1, flags2);
977     }
978 }
979
980 /* verify that all the pages have correct rights for code */
981 static void tb_page_check(void)
982 {
983     qht_iter(&tcg_ctx.tb_ctx.htable, do_tb_page_check, NULL);
984 }
985
986 #endif
987
988 static inline void tb_page_remove(TranslationBlock **ptb, TranslationBlock *tb)
989 {
990     TranslationBlock *tb1;
991     unsigned int n1;
992
993     for (;;) {
994         tb1 = *ptb;
995         n1 = (uintptr_t)tb1 & 3;
996         tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3);
997         if (tb1 == tb) {
998             *ptb = tb1->page_next[n1];
999             break;
1000         }
1001         ptb = &tb1->page_next[n1];
1002     }
1003 }
1004
1005 /* remove the TB from a list of TBs jumping to the n-th jump target of the TB */
1006 static inline void tb_remove_from_jmp_list(TranslationBlock *tb, int n)
1007 {
1008     TranslationBlock *tb1;
1009     uintptr_t *ptb, ntb;
1010     unsigned int n1;
1011
1012     ptb = &tb->jmp_list_next[n];
1013     if (*ptb) {
1014         /* find tb(n) in circular list */
1015         for (;;) {
1016             ntb = *ptb;
1017             n1 = ntb & 3;
1018             tb1 = (TranslationBlock *)(ntb & ~3);
1019             if (n1 == n && tb1 == tb) {
1020                 break;
1021             }
1022             if (n1 == 2) {
1023                 ptb = &tb1->jmp_list_first;
1024             } else {
1025                 ptb = &tb1->jmp_list_next[n1];
1026             }
1027         }
1028         /* now we can suppress tb(n) from the list */
1029         *ptb = tb->jmp_list_next[n];
1030
1031         tb->jmp_list_next[n] = (uintptr_t)NULL;
1032     }
1033 }
1034
1035 /* reset the jump entry 'n' of a TB so that it is not chained to
1036    another TB */
1037 static inline void tb_reset_jump(TranslationBlock *tb, int n)
1038 {
1039     uintptr_t addr = (uintptr_t)(tb->tc_ptr + tb->jmp_reset_offset[n]);
1040     tb_set_jmp_target(tb, n, addr);
1041 }
1042
1043 /* remove any jumps to the TB */
1044 static inline void tb_jmp_unlink(TranslationBlock *tb)
1045 {
1046     TranslationBlock *tb1;
1047     uintptr_t *ptb, ntb;
1048     unsigned int n1;
1049
1050     ptb = &tb->jmp_list_first;
1051     for (;;) {
1052         ntb = *ptb;
1053         n1 = ntb & 3;
1054         tb1 = (TranslationBlock *)(ntb & ~3);
1055         if (n1 == 2) {
1056             break;
1057         }
1058         tb_reset_jump(tb1, n1);
1059         *ptb = tb1->jmp_list_next[n1];
1060         tb1->jmp_list_next[n1] = (uintptr_t)NULL;
1061     }
1062 }
1063
1064 /* invalidate one TB
1065  *
1066  * Called with tb_lock held.
1067  */
1068 void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr)
1069 {
1070     CPUState *cpu;
1071     PageDesc *p;
1072     uint32_t h;
1073     tb_page_addr_t phys_pc;
1074
1075     assert_tb_locked();
1076
1077     atomic_set(&tb->invalid, true);
1078
1079     /* remove the TB from the hash list */
1080     phys_pc = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
1081     h = tb_hash_func(phys_pc, tb->pc, tb->flags);
1082     qht_remove(&tcg_ctx.tb_ctx.htable, tb, h);
1083
1084     /* remove the TB from the page list */
1085     if (tb->page_addr[0] != page_addr) {
1086         p = page_find(tb->page_addr[0] >> TARGET_PAGE_BITS);
1087         tb_page_remove(&p->first_tb, tb);
1088         invalidate_page_bitmap(p);
1089     }
1090     if (tb->page_addr[1] != -1 && tb->page_addr[1] != page_addr) {
1091         p = page_find(tb->page_addr[1] >> TARGET_PAGE_BITS);
1092         tb_page_remove(&p->first_tb, tb);
1093         invalidate_page_bitmap(p);
1094     }
1095
1096     /* remove the TB from the hash list */
1097     h = tb_jmp_cache_hash_func(tb->pc);
1098     CPU_FOREACH(cpu) {
1099         if (atomic_read(&cpu->tb_jmp_cache[h]) == tb) {
1100             atomic_set(&cpu->tb_jmp_cache[h], NULL);
1101         }
1102     }
1103
1104     /* suppress this TB from the two jump lists */
1105     tb_remove_from_jmp_list(tb, 0);
1106     tb_remove_from_jmp_list(tb, 1);
1107
1108     /* suppress any remaining jumps to this TB */
1109     tb_jmp_unlink(tb);
1110
1111     tcg_ctx.tb_ctx.tb_phys_invalidate_count++;
1112 }
1113
1114 #ifdef CONFIG_SOFTMMU
1115 static void build_page_bitmap(PageDesc *p)
1116 {
1117     int n, tb_start, tb_end;
1118     TranslationBlock *tb;
1119
1120     p->code_bitmap = bitmap_new(TARGET_PAGE_SIZE);
1121
1122     tb = p->first_tb;
1123     while (tb != NULL) {
1124         n = (uintptr_t)tb & 3;
1125         tb = (TranslationBlock *)((uintptr_t)tb & ~3);
1126         /* NOTE: this is subtle as a TB may span two physical pages */
1127         if (n == 0) {
1128             /* NOTE: tb_end may be after the end of the page, but
1129                it is not a problem */
1130             tb_start = tb->pc & ~TARGET_PAGE_MASK;
1131             tb_end = tb_start + tb->size;
1132             if (tb_end > TARGET_PAGE_SIZE) {
1133                 tb_end = TARGET_PAGE_SIZE;
1134              }
1135         } else {
1136             tb_start = 0;
1137             tb_end = ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
1138         }
1139         bitmap_set(p->code_bitmap, tb_start, tb_end - tb_start);
1140         tb = tb->page_next[n];
1141     }
1142 }
1143 #endif
1144
1145 /* add the tb in the target page and protect it if necessary
1146  *
1147  * Called with mmap_lock held for user-mode emulation.
1148  */
1149 static inline void tb_alloc_page(TranslationBlock *tb,
1150                                  unsigned int n, tb_page_addr_t page_addr)
1151 {
1152     PageDesc *p;
1153 #ifndef CONFIG_USER_ONLY
1154     bool page_already_protected;
1155 #endif
1156
1157     assert_memory_lock();
1158
1159     tb->page_addr[n] = page_addr;
1160     p = page_find_alloc(page_addr >> TARGET_PAGE_BITS, 1);
1161     tb->page_next[n] = p->first_tb;
1162 #ifndef CONFIG_USER_ONLY
1163     page_already_protected = p->first_tb != NULL;
1164 #endif
1165     p->first_tb = (TranslationBlock *)((uintptr_t)tb | n);
1166     invalidate_page_bitmap(p);
1167
1168 #if defined(CONFIG_USER_ONLY)
1169     if (p->flags & PAGE_WRITE) {
1170         target_ulong addr;
1171         PageDesc *p2;
1172         int prot;
1173
1174         /* force the host page as non writable (writes will have a
1175            page fault + mprotect overhead) */
1176         page_addr &= qemu_host_page_mask;
1177         prot = 0;
1178         for (addr = page_addr; addr < page_addr + qemu_host_page_size;
1179             addr += TARGET_PAGE_SIZE) {
1180
1181             p2 = page_find(addr >> TARGET_PAGE_BITS);
1182             if (!p2) {
1183                 continue;
1184             }
1185             prot |= p2->flags;
1186             p2->flags &= ~PAGE_WRITE;
1187           }
1188         mprotect(g2h(page_addr), qemu_host_page_size,
1189                  (prot & PAGE_BITS) & ~PAGE_WRITE);
1190 #ifdef DEBUG_TB_INVALIDATE
1191         printf("protecting code page: 0x" TARGET_FMT_lx "\n",
1192                page_addr);
1193 #endif
1194     }
1195 #else
1196     /* if some code is already present, then the pages are already
1197        protected. So we handle the case where only the first TB is
1198        allocated in a physical page */
1199     if (!page_already_protected) {
1200         tlb_protect_code(page_addr);
1201     }
1202 #endif
1203 }
1204
1205 /* add a new TB and link it to the physical page tables. phys_page2 is
1206  * (-1) to indicate that only one page contains the TB.
1207  *
1208  * Called with mmap_lock held for user-mode emulation.
1209  */
1210 static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc,
1211                          tb_page_addr_t phys_page2)
1212 {
1213     uint32_t h;
1214
1215     assert_memory_lock();
1216
1217     /* add in the page list */
1218     tb_alloc_page(tb, 0, phys_pc & TARGET_PAGE_MASK);
1219     if (phys_page2 != -1) {
1220         tb_alloc_page(tb, 1, phys_page2);
1221     } else {
1222         tb->page_addr[1] = -1;
1223     }
1224
1225     /* add in the hash table */
1226     h = tb_hash_func(phys_pc, tb->pc, tb->flags);
1227     qht_insert(&tcg_ctx.tb_ctx.htable, tb, h);
1228
1229 #ifdef DEBUG_TB_CHECK
1230     tb_page_check();
1231 #endif
1232 }
1233
1234 /* Called with mmap_lock held for user mode emulation.  */
1235 TranslationBlock *tb_gen_code(CPUState *cpu,
1236                               target_ulong pc, target_ulong cs_base,
1237                               uint32_t flags, int cflags)
1238 {
1239     CPUArchState *env = cpu->env_ptr;
1240     TranslationBlock *tb;
1241     tb_page_addr_t phys_pc, phys_page2;
1242     target_ulong virt_page2;
1243     tcg_insn_unit *gen_code_buf;
1244     int gen_code_size, search_size;
1245 #ifdef CONFIG_PROFILER
1246     int64_t ti;
1247 #endif
1248     assert_memory_lock();
1249
1250     phys_pc = get_page_addr_code(env, pc);
1251     if (use_icount && !(cflags & CF_IGNORE_ICOUNT)) {
1252         cflags |= CF_USE_ICOUNT;
1253     }
1254
1255     tb = tb_alloc(pc);
1256     if (unlikely(!tb)) {
1257  buffer_overflow:
1258         /* flush must be done */
1259         tb_flush(cpu);
1260         mmap_unlock();
1261         /* Make the execution loop process the flush as soon as possible.  */
1262         cpu->exception_index = EXCP_INTERRUPT;
1263         cpu_loop_exit(cpu);
1264     }
1265
1266     gen_code_buf = tcg_ctx.code_gen_ptr;
1267     tb->tc_ptr = gen_code_buf;
1268     tb->cs_base = cs_base;
1269     tb->flags = flags;
1270     tb->cflags = cflags;
1271
1272 #ifdef CONFIG_PROFILER
1273     tcg_ctx.tb_count1++; /* includes aborted translations because of
1274                        exceptions */
1275     ti = profile_getclock();
1276 #endif
1277
1278     tcg_func_start(&tcg_ctx);
1279
1280     tcg_ctx.cpu = ENV_GET_CPU(env);
1281     gen_intermediate_code(env, tb);
1282     tcg_ctx.cpu = NULL;
1283
1284     trace_translate_block(tb, tb->pc, tb->tc_ptr);
1285
1286     /* generate machine code */
1287     tb->jmp_reset_offset[0] = TB_JMP_RESET_OFFSET_INVALID;
1288     tb->jmp_reset_offset[1] = TB_JMP_RESET_OFFSET_INVALID;
1289     tcg_ctx.tb_jmp_reset_offset = tb->jmp_reset_offset;
1290 #ifdef USE_DIRECT_JUMP
1291     tcg_ctx.tb_jmp_insn_offset = tb->jmp_insn_offset;
1292     tcg_ctx.tb_jmp_target_addr = NULL;
1293 #else
1294     tcg_ctx.tb_jmp_insn_offset = NULL;
1295     tcg_ctx.tb_jmp_target_addr = tb->jmp_target_addr;
1296 #endif
1297
1298 #ifdef CONFIG_PROFILER
1299     tcg_ctx.tb_count++;
1300     tcg_ctx.interm_time += profile_getclock() - ti;
1301     tcg_ctx.code_time -= profile_getclock();
1302 #endif
1303
1304     /* ??? Overflow could be handled better here.  In particular, we
1305        don't need to re-do gen_intermediate_code, nor should we re-do
1306        the tcg optimization currently hidden inside tcg_gen_code.  All
1307        that should be required is to flush the TBs, allocate a new TB,
1308        re-initialize it per above, and re-do the actual code generation.  */
1309     gen_code_size = tcg_gen_code(&tcg_ctx, tb);
1310     if (unlikely(gen_code_size < 0)) {
1311         goto buffer_overflow;
1312     }
1313     search_size = encode_search(tb, (void *)gen_code_buf + gen_code_size);
1314     if (unlikely(search_size < 0)) {
1315         goto buffer_overflow;
1316     }
1317
1318 #ifdef CONFIG_PROFILER
1319     tcg_ctx.code_time += profile_getclock();
1320     tcg_ctx.code_in_len += tb->size;
1321     tcg_ctx.code_out_len += gen_code_size;
1322     tcg_ctx.search_out_len += search_size;
1323 #endif
1324
1325 #ifdef DEBUG_DISAS
1326     if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM) &&
1327         qemu_log_in_addr_range(tb->pc)) {
1328         qemu_log_lock();
1329         qemu_log("OUT: [size=%d]\n", gen_code_size);
1330         log_disas(tb->tc_ptr, gen_code_size);
1331         qemu_log("\n");
1332         qemu_log_flush();
1333         qemu_log_unlock();
1334     }
1335 #endif
1336
1337     tcg_ctx.code_gen_ptr = (void *)
1338         ROUND_UP((uintptr_t)gen_code_buf + gen_code_size + search_size,
1339                  CODE_GEN_ALIGN);
1340
1341     /* init jump list */
1342     assert(((uintptr_t)tb & 3) == 0);
1343     tb->jmp_list_first = (uintptr_t)tb | 2;
1344     tb->jmp_list_next[0] = (uintptr_t)NULL;
1345     tb->jmp_list_next[1] = (uintptr_t)NULL;
1346
1347     /* init original jump addresses wich has been set during tcg_gen_code() */
1348     if (tb->jmp_reset_offset[0] != TB_JMP_RESET_OFFSET_INVALID) {
1349         tb_reset_jump(tb, 0);
1350     }
1351     if (tb->jmp_reset_offset[1] != TB_JMP_RESET_OFFSET_INVALID) {
1352         tb_reset_jump(tb, 1);
1353     }
1354
1355     /* check next page if needed */
1356     virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
1357     phys_page2 = -1;
1358     if ((pc & TARGET_PAGE_MASK) != virt_page2) {
1359         phys_page2 = get_page_addr_code(env, virt_page2);
1360     }
1361     /* As long as consistency of the TB stuff is provided by tb_lock in user
1362      * mode and is implicit in single-threaded softmmu emulation, no explicit
1363      * memory barrier is required before tb_link_page() makes the TB visible
1364      * through the physical hash table and physical page list.
1365      */
1366     tb_link_page(tb, phys_pc, phys_page2);
1367     return tb;
1368 }
1369
1370 /*
1371  * Invalidate all TBs which intersect with the target physical address range
1372  * [start;end[. NOTE: start and end may refer to *different* physical pages.
1373  * 'is_cpu_write_access' should be true if called from a real cpu write
1374  * access: the virtual CPU will exit the current TB if code is modified inside
1375  * this TB.
1376  *
1377  * Called with mmap_lock held for user-mode emulation, grabs tb_lock
1378  * Called with tb_lock held for system-mode emulation
1379  */
1380 static void tb_invalidate_phys_range_1(tb_page_addr_t start, tb_page_addr_t end)
1381 {
1382     while (start < end) {
1383         tb_invalidate_phys_page_range(start, end, 0);
1384         start &= TARGET_PAGE_MASK;
1385         start += TARGET_PAGE_SIZE;
1386     }
1387 }
1388
1389 #ifdef CONFIG_SOFTMMU
1390 void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t end)
1391 {
1392     assert_tb_locked();
1393     tb_invalidate_phys_range_1(start, end);
1394 }
1395 #else
1396 void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t end)
1397 {
1398     assert_memory_lock();
1399     tb_lock();
1400     tb_invalidate_phys_range_1(start, end);
1401     tb_unlock();
1402 }
1403 #endif
1404 /*
1405  * Invalidate all TBs which intersect with the target physical address range
1406  * [start;end[. NOTE: start and end must refer to the *same* physical page.
1407  * 'is_cpu_write_access' should be true if called from a real cpu write
1408  * access: the virtual CPU will exit the current TB if code is modified inside
1409  * this TB.
1410  *
1411  * Called with tb_lock/mmap_lock held for user-mode emulation
1412  * Called with tb_lock held for system-mode emulation
1413  */
1414 void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
1415                                    int is_cpu_write_access)
1416 {
1417     TranslationBlock *tb, *tb_next;
1418 #if defined(TARGET_HAS_PRECISE_SMC)
1419     CPUState *cpu = current_cpu;
1420     CPUArchState *env = NULL;
1421 #endif
1422     tb_page_addr_t tb_start, tb_end;
1423     PageDesc *p;
1424     int n;
1425 #ifdef TARGET_HAS_PRECISE_SMC
1426     int current_tb_not_found = is_cpu_write_access;
1427     TranslationBlock *current_tb = NULL;
1428     int current_tb_modified = 0;
1429     target_ulong current_pc = 0;
1430     target_ulong current_cs_base = 0;
1431     uint32_t current_flags = 0;
1432 #endif /* TARGET_HAS_PRECISE_SMC */
1433
1434     assert_memory_lock();
1435     assert_tb_locked();
1436
1437     p = page_find(start >> TARGET_PAGE_BITS);
1438     if (!p) {
1439         return;
1440     }
1441 #if defined(TARGET_HAS_PRECISE_SMC)
1442     if (cpu != NULL) {
1443         env = cpu->env_ptr;
1444     }
1445 #endif
1446
1447     /* we remove all the TBs in the range [start, end[ */
1448     /* XXX: see if in some cases it could be faster to invalidate all
1449        the code */
1450     tb = p->first_tb;
1451     while (tb != NULL) {
1452         n = (uintptr_t)tb & 3;
1453         tb = (TranslationBlock *)((uintptr_t)tb & ~3);
1454         tb_next = tb->page_next[n];
1455         /* NOTE: this is subtle as a TB may span two physical pages */
1456         if (n == 0) {
1457             /* NOTE: tb_end may be after the end of the page, but
1458                it is not a problem */
1459             tb_start = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
1460             tb_end = tb_start + tb->size;
1461         } else {
1462             tb_start = tb->page_addr[1];
1463             tb_end = tb_start + ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
1464         }
1465         if (!(tb_end <= start || tb_start >= end)) {
1466 #ifdef TARGET_HAS_PRECISE_SMC
1467             if (current_tb_not_found) {
1468                 current_tb_not_found = 0;
1469                 current_tb = NULL;
1470                 if (cpu->mem_io_pc) {
1471                     /* now we have a real cpu fault */
1472                     current_tb = tb_find_pc(cpu->mem_io_pc);
1473                 }
1474             }
1475             if (current_tb == tb &&
1476                 (current_tb->cflags & CF_COUNT_MASK) != 1) {
1477                 /* If we are modifying the current TB, we must stop
1478                 its execution. We could be more precise by checking
1479                 that the modification is after the current PC, but it
1480                 would require a specialized function to partially
1481                 restore the CPU state */
1482
1483                 current_tb_modified = 1;
1484                 cpu_restore_state_from_tb(cpu, current_tb, cpu->mem_io_pc);
1485                 cpu_get_tb_cpu_state(env, &current_pc, &current_cs_base,
1486                                      &current_flags);
1487             }
1488 #endif /* TARGET_HAS_PRECISE_SMC */
1489             tb_phys_invalidate(tb, -1);
1490         }
1491         tb = tb_next;
1492     }
1493 #if !defined(CONFIG_USER_ONLY)
1494     /* if no code remaining, no need to continue to use slow writes */
1495     if (!p->first_tb) {
1496         invalidate_page_bitmap(p);
1497         tlb_unprotect_code(start);
1498     }
1499 #endif
1500 #ifdef TARGET_HAS_PRECISE_SMC
1501     if (current_tb_modified) {
1502         /* we generate a block containing just the instruction
1503            modifying the memory. It will ensure that it cannot modify
1504            itself */
1505         tb_gen_code(cpu, current_pc, current_cs_base, current_flags, 1);
1506         cpu_loop_exit_noexc(cpu);
1507     }
1508 #endif
1509 }
1510
1511 #ifdef CONFIG_SOFTMMU
1512 /* len must be <= 8 and start must be a multiple of len.
1513  * Called via softmmu_template.h when code areas are written to with
1514  * iothread mutex not held.
1515  */
1516 void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len)
1517 {
1518     PageDesc *p;
1519
1520 #if 0
1521     if (1) {
1522         qemu_log("modifying code at 0x%x size=%d EIP=%x PC=%08x\n",
1523                   cpu_single_env->mem_io_vaddr, len,
1524                   cpu_single_env->eip,
1525                   cpu_single_env->eip +
1526                   (intptr_t)cpu_single_env->segs[R_CS].base);
1527     }
1528 #endif
1529     assert_memory_lock();
1530
1531     p = page_find(start >> TARGET_PAGE_BITS);
1532     if (!p) {
1533         return;
1534     }
1535     if (!p->code_bitmap &&
1536         ++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD) {
1537         /* build code bitmap.  FIXME: writes should be protected by
1538          * tb_lock, reads by tb_lock or RCU.
1539          */
1540         build_page_bitmap(p);
1541     }
1542     if (p->code_bitmap) {
1543         unsigned int nr;
1544         unsigned long b;
1545
1546         nr = start & ~TARGET_PAGE_MASK;
1547         b = p->code_bitmap[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG - 1));
1548         if (b & ((1 << len) - 1)) {
1549             goto do_invalidate;
1550         }
1551     } else {
1552     do_invalidate:
1553         tb_invalidate_phys_page_range(start, start + len, 1);
1554     }
1555 }
1556 #else
1557 /* Called with mmap_lock held. If pc is not 0 then it indicates the
1558  * host PC of the faulting store instruction that caused this invalidate.
1559  * Returns true if the caller needs to abort execution of the current
1560  * TB (because it was modified by this store and the guest CPU has
1561  * precise-SMC semantics).
1562  */
1563 static bool tb_invalidate_phys_page(tb_page_addr_t addr, uintptr_t pc)
1564 {
1565     TranslationBlock *tb;
1566     PageDesc *p;
1567     int n;
1568 #ifdef TARGET_HAS_PRECISE_SMC
1569     TranslationBlock *current_tb = NULL;
1570     CPUState *cpu = current_cpu;
1571     CPUArchState *env = NULL;
1572     int current_tb_modified = 0;
1573     target_ulong current_pc = 0;
1574     target_ulong current_cs_base = 0;
1575     uint32_t current_flags = 0;
1576 #endif
1577
1578     assert_memory_lock();
1579
1580     addr &= TARGET_PAGE_MASK;
1581     p = page_find(addr >> TARGET_PAGE_BITS);
1582     if (!p) {
1583         return false;
1584     }
1585
1586     tb_lock();
1587     tb = p->first_tb;
1588 #ifdef TARGET_HAS_PRECISE_SMC
1589     if (tb && pc != 0) {
1590         current_tb = tb_find_pc(pc);
1591     }
1592     if (cpu != NULL) {
1593         env = cpu->env_ptr;
1594     }
1595 #endif
1596     while (tb != NULL) {
1597         n = (uintptr_t)tb & 3;
1598         tb = (TranslationBlock *)((uintptr_t)tb & ~3);
1599 #ifdef TARGET_HAS_PRECISE_SMC
1600         if (current_tb == tb &&
1601             (current_tb->cflags & CF_COUNT_MASK) != 1) {
1602                 /* If we are modifying the current TB, we must stop
1603                    its execution. We could be more precise by checking
1604                    that the modification is after the current PC, but it
1605                    would require a specialized function to partially
1606                    restore the CPU state */
1607
1608             current_tb_modified = 1;
1609             cpu_restore_state_from_tb(cpu, current_tb, pc);
1610             cpu_get_tb_cpu_state(env, &current_pc, &current_cs_base,
1611                                  &current_flags);
1612         }
1613 #endif /* TARGET_HAS_PRECISE_SMC */
1614         tb_phys_invalidate(tb, addr);
1615         tb = tb->page_next[n];
1616     }
1617     p->first_tb = NULL;
1618 #ifdef TARGET_HAS_PRECISE_SMC
1619     if (current_tb_modified) {
1620         /* we generate a block containing just the instruction
1621            modifying the memory. It will ensure that it cannot modify
1622            itself */
1623         tb_gen_code(cpu, current_pc, current_cs_base, current_flags, 1);
1624         /* tb_lock will be reset after cpu_loop_exit_noexc longjmps
1625          * back into the cpu_exec loop. */
1626         return true;
1627     }
1628 #endif
1629     tb_unlock();
1630
1631     return false;
1632 }
1633 #endif
1634
1635 /* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr <
1636    tb[1].tc_ptr. Return NULL if not found */
1637 static TranslationBlock *tb_find_pc(uintptr_t tc_ptr)
1638 {
1639     int m_min, m_max, m;
1640     uintptr_t v;
1641     TranslationBlock *tb;
1642
1643     if (tcg_ctx.tb_ctx.nb_tbs <= 0) {
1644         return NULL;
1645     }
1646     if (tc_ptr < (uintptr_t)tcg_ctx.code_gen_buffer ||
1647         tc_ptr >= (uintptr_t)tcg_ctx.code_gen_ptr) {
1648         return NULL;
1649     }
1650     /* binary search (cf Knuth) */
1651     m_min = 0;
1652     m_max = tcg_ctx.tb_ctx.nb_tbs - 1;
1653     while (m_min <= m_max) {
1654         m = (m_min + m_max) >> 1;
1655         tb = &tcg_ctx.tb_ctx.tbs[m];
1656         v = (uintptr_t)tb->tc_ptr;
1657         if (v == tc_ptr) {
1658             return tb;
1659         } else if (tc_ptr < v) {
1660             m_max = m - 1;
1661         } else {
1662             m_min = m + 1;
1663         }
1664     }
1665     return &tcg_ctx.tb_ctx.tbs[m_max];
1666 }
1667
1668 #if !defined(CONFIG_USER_ONLY)
1669 void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
1670 {
1671     ram_addr_t ram_addr;
1672     MemoryRegion *mr;
1673     hwaddr l = 1;
1674
1675     rcu_read_lock();
1676     mr = address_space_translate(as, addr, &addr, &l, false);
1677     if (!(memory_region_is_ram(mr)
1678           || memory_region_is_romd(mr))) {
1679         rcu_read_unlock();
1680         return;
1681     }
1682     ram_addr = memory_region_get_ram_addr(mr) + addr;
1683     tb_lock();
1684     tb_invalidate_phys_page_range(ram_addr, ram_addr + 1, 0);
1685     tb_unlock();
1686     rcu_read_unlock();
1687 }
1688 #endif /* !defined(CONFIG_USER_ONLY) */
1689
1690 /* Called with tb_lock held.  */
1691 void tb_check_watchpoint(CPUState *cpu)
1692 {
1693     TranslationBlock *tb;
1694
1695     tb = tb_find_pc(cpu->mem_io_pc);
1696     if (tb) {
1697         /* We can use retranslation to find the PC.  */
1698         cpu_restore_state_from_tb(cpu, tb, cpu->mem_io_pc);
1699         tb_phys_invalidate(tb, -1);
1700     } else {
1701         /* The exception probably happened in a helper.  The CPU state should
1702            have been saved before calling it. Fetch the PC from there.  */
1703         CPUArchState *env = cpu->env_ptr;
1704         target_ulong pc, cs_base;
1705         tb_page_addr_t addr;
1706         uint32_t flags;
1707
1708         cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags);
1709         addr = get_page_addr_code(env, pc);
1710         tb_invalidate_phys_range(addr, addr + 1);
1711     }
1712 }
1713
1714 #ifndef CONFIG_USER_ONLY
1715 /* in deterministic execution mode, instructions doing device I/Os
1716  * must be at the end of the TB.
1717  *
1718  * Called by softmmu_template.h, with iothread mutex not held.
1719  */
1720 void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr)
1721 {
1722 #if defined(TARGET_MIPS) || defined(TARGET_SH4)
1723     CPUArchState *env = cpu->env_ptr;
1724 #endif
1725     TranslationBlock *tb;
1726     uint32_t n, cflags;
1727     target_ulong pc, cs_base;
1728     uint32_t flags;
1729
1730     tb_lock();
1731     tb = tb_find_pc(retaddr);
1732     if (!tb) {
1733         cpu_abort(cpu, "cpu_io_recompile: could not find TB for pc=%p",
1734                   (void *)retaddr);
1735     }
1736     n = cpu->icount_decr.u16.low + tb->icount;
1737     cpu_restore_state_from_tb(cpu, tb, retaddr);
1738     /* Calculate how many instructions had been executed before the fault
1739        occurred.  */
1740     n = n - cpu->icount_decr.u16.low;
1741     /* Generate a new TB ending on the I/O insn.  */
1742     n++;
1743     /* On MIPS and SH, delay slot instructions can only be restarted if
1744        they were already the first instruction in the TB.  If this is not
1745        the first instruction in a TB then re-execute the preceding
1746        branch.  */
1747 #if defined(TARGET_MIPS)
1748     if ((env->hflags & MIPS_HFLAG_BMASK) != 0 && n > 1) {
1749         env->active_tc.PC -= (env->hflags & MIPS_HFLAG_B16 ? 2 : 4);
1750         cpu->icount_decr.u16.low++;
1751         env->hflags &= ~MIPS_HFLAG_BMASK;
1752     }
1753 #elif defined(TARGET_SH4)
1754     if ((env->flags & ((DELAY_SLOT | DELAY_SLOT_CONDITIONAL))) != 0
1755             && n > 1) {
1756         env->pc -= 2;
1757         cpu->icount_decr.u16.low++;
1758         env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
1759     }
1760 #endif
1761     /* This should never happen.  */
1762     if (n > CF_COUNT_MASK) {
1763         cpu_abort(cpu, "TB too big during recompile");
1764     }
1765
1766     cflags = n | CF_LAST_IO;
1767     pc = tb->pc;
1768     cs_base = tb->cs_base;
1769     flags = tb->flags;
1770     tb_phys_invalidate(tb, -1);
1771     if (tb->cflags & CF_NOCACHE) {
1772         if (tb->orig_tb) {
1773             /* Invalidate original TB if this TB was generated in
1774              * cpu_exec_nocache() */
1775             tb_phys_invalidate(tb->orig_tb, -1);
1776         }
1777         tb_free(tb);
1778     }
1779     /* FIXME: In theory this could raise an exception.  In practice
1780        we have already translated the block once so it's probably ok.  */
1781     tb_gen_code(cpu, pc, cs_base, flags, cflags);
1782
1783     /* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not
1784      * the first in the TB) then we end up generating a whole new TB and
1785      *  repeating the fault, which is horribly inefficient.
1786      *  Better would be to execute just this insn uncached, or generate a
1787      *  second new TB.
1788      *
1789      * cpu_loop_exit_noexc will longjmp back to cpu_exec where the
1790      * tb_lock gets reset.
1791      */
1792     cpu_loop_exit_noexc(cpu);
1793 }
1794
1795 void tb_flush_jmp_cache(CPUState *cpu, target_ulong addr)
1796 {
1797     unsigned int i;
1798
1799     /* Discard jump cache entries for any tb which might potentially
1800        overlap the flushed page.  */
1801     i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE);
1802     memset(&cpu->tb_jmp_cache[i], 0,
1803            TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
1804
1805     i = tb_jmp_cache_hash_page(addr);
1806     memset(&cpu->tb_jmp_cache[i], 0,
1807            TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
1808 }
1809
1810 static void print_qht_statistics(FILE *f, fprintf_function cpu_fprintf,
1811                                  struct qht_stats hst)
1812 {
1813     uint32_t hgram_opts;
1814     size_t hgram_bins;
1815     char *hgram;
1816
1817     if (!hst.head_buckets) {
1818         return;
1819     }
1820     cpu_fprintf(f, "TB hash buckets     %zu/%zu (%0.2f%% head buckets used)\n",
1821                 hst.used_head_buckets, hst.head_buckets,
1822                 (double)hst.used_head_buckets / hst.head_buckets * 100);
1823
1824     hgram_opts =  QDIST_PR_BORDER | QDIST_PR_LABELS;
1825     hgram_opts |= QDIST_PR_100X   | QDIST_PR_PERCENT;
1826     if (qdist_xmax(&hst.occupancy) - qdist_xmin(&hst.occupancy) == 1) {
1827         hgram_opts |= QDIST_PR_NODECIMAL;
1828     }
1829     hgram = qdist_pr(&hst.occupancy, 10, hgram_opts);
1830     cpu_fprintf(f, "TB hash occupancy   %0.2f%% avg chain occ. Histogram: %s\n",
1831                 qdist_avg(&hst.occupancy) * 100, hgram);
1832     g_free(hgram);
1833
1834     hgram_opts = QDIST_PR_BORDER | QDIST_PR_LABELS;
1835     hgram_bins = qdist_xmax(&hst.chain) - qdist_xmin(&hst.chain);
1836     if (hgram_bins > 10) {
1837         hgram_bins = 10;
1838     } else {
1839         hgram_bins = 0;
1840         hgram_opts |= QDIST_PR_NODECIMAL | QDIST_PR_NOBINRANGE;
1841     }
1842     hgram = qdist_pr(&hst.chain, hgram_bins, hgram_opts);
1843     cpu_fprintf(f, "TB hash avg chain   %0.3f buckets. Histogram: %s\n",
1844                 qdist_avg(&hst.chain), hgram);
1845     g_free(hgram);
1846 }
1847
1848 void dump_exec_info(FILE *f, fprintf_function cpu_fprintf)
1849 {
1850     int i, target_code_size, max_target_code_size;
1851     int direct_jmp_count, direct_jmp2_count, cross_page;
1852     TranslationBlock *tb;
1853     struct qht_stats hst;
1854
1855     tb_lock();
1856
1857     target_code_size = 0;
1858     max_target_code_size = 0;
1859     cross_page = 0;
1860     direct_jmp_count = 0;
1861     direct_jmp2_count = 0;
1862     for (i = 0; i < tcg_ctx.tb_ctx.nb_tbs; i++) {
1863         tb = &tcg_ctx.tb_ctx.tbs[i];
1864         target_code_size += tb->size;
1865         if (tb->size > max_target_code_size) {
1866             max_target_code_size = tb->size;
1867         }
1868         if (tb->page_addr[1] != -1) {
1869             cross_page++;
1870         }
1871         if (tb->jmp_reset_offset[0] != TB_JMP_RESET_OFFSET_INVALID) {
1872             direct_jmp_count++;
1873             if (tb->jmp_reset_offset[1] != TB_JMP_RESET_OFFSET_INVALID) {
1874                 direct_jmp2_count++;
1875             }
1876         }
1877     }
1878     /* XXX: avoid using doubles ? */
1879     cpu_fprintf(f, "Translation buffer state:\n");
1880     cpu_fprintf(f, "gen code size       %td/%zd\n",
1881                 tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer,
1882                 tcg_ctx.code_gen_highwater - tcg_ctx.code_gen_buffer);
1883     cpu_fprintf(f, "TB count            %d/%d\n",
1884             tcg_ctx.tb_ctx.nb_tbs, tcg_ctx.code_gen_max_blocks);
1885     cpu_fprintf(f, "TB avg target size  %d max=%d bytes\n",
1886             tcg_ctx.tb_ctx.nb_tbs ? target_code_size /
1887                     tcg_ctx.tb_ctx.nb_tbs : 0,
1888             max_target_code_size);
1889     cpu_fprintf(f, "TB avg host size    %td bytes (expansion ratio: %0.1f)\n",
1890             tcg_ctx.tb_ctx.nb_tbs ? (tcg_ctx.code_gen_ptr -
1891                                      tcg_ctx.code_gen_buffer) /
1892                                      tcg_ctx.tb_ctx.nb_tbs : 0,
1893                 target_code_size ? (double) (tcg_ctx.code_gen_ptr -
1894                                              tcg_ctx.code_gen_buffer) /
1895                                              target_code_size : 0);
1896     cpu_fprintf(f, "cross page TB count %d (%d%%)\n", cross_page,
1897             tcg_ctx.tb_ctx.nb_tbs ? (cross_page * 100) /
1898                                     tcg_ctx.tb_ctx.nb_tbs : 0);
1899     cpu_fprintf(f, "direct jump count   %d (%d%%) (2 jumps=%d %d%%)\n",
1900                 direct_jmp_count,
1901                 tcg_ctx.tb_ctx.nb_tbs ? (direct_jmp_count * 100) /
1902                         tcg_ctx.tb_ctx.nb_tbs : 0,
1903                 direct_jmp2_count,
1904                 tcg_ctx.tb_ctx.nb_tbs ? (direct_jmp2_count * 100) /
1905                         tcg_ctx.tb_ctx.nb_tbs : 0);
1906
1907     qht_statistics_init(&tcg_ctx.tb_ctx.htable, &hst);
1908     print_qht_statistics(f, cpu_fprintf, hst);
1909     qht_statistics_destroy(&hst);
1910
1911     cpu_fprintf(f, "\nStatistics:\n");
1912     cpu_fprintf(f, "TB flush count      %u\n",
1913             atomic_read(&tcg_ctx.tb_ctx.tb_flush_count));
1914     cpu_fprintf(f, "TB invalidate count %d\n",
1915             tcg_ctx.tb_ctx.tb_phys_invalidate_count);
1916     cpu_fprintf(f, "TLB flush count     %d\n", tlb_flush_count);
1917     tcg_dump_info(f, cpu_fprintf);
1918
1919     tb_unlock();
1920 }
1921
1922 void dump_opcount_info(FILE *f, fprintf_function cpu_fprintf)
1923 {
1924     tcg_dump_op_count(f, cpu_fprintf);
1925 }
1926
1927 #else /* CONFIG_USER_ONLY */
1928
1929 void cpu_interrupt(CPUState *cpu, int mask)
1930 {
1931     g_assert(qemu_mutex_iothread_locked());
1932     cpu->interrupt_request |= mask;
1933     cpu->icount_decr.u16.high = -1;
1934 }
1935
1936 /*
1937  * Walks guest process memory "regions" one by one
1938  * and calls callback function 'fn' for each region.
1939  */
1940 struct walk_memory_regions_data {
1941     walk_memory_regions_fn fn;
1942     void *priv;
1943     target_ulong start;
1944     int prot;
1945 };
1946
1947 static int walk_memory_regions_end(struct walk_memory_regions_data *data,
1948                                    target_ulong end, int new_prot)
1949 {
1950     if (data->start != -1u) {
1951         int rc = data->fn(data->priv, data->start, end, data->prot);
1952         if (rc != 0) {
1953             return rc;
1954         }
1955     }
1956
1957     data->start = (new_prot ? end : -1u);
1958     data->prot = new_prot;
1959
1960     return 0;
1961 }
1962
1963 static int walk_memory_regions_1(struct walk_memory_regions_data *data,
1964                                  target_ulong base, int level, void **lp)
1965 {
1966     target_ulong pa;
1967     int i, rc;
1968
1969     if (*lp == NULL) {
1970         return walk_memory_regions_end(data, base, 0);
1971     }
1972
1973     if (level == 0) {
1974         PageDesc *pd = *lp;
1975
1976         for (i = 0; i < V_L2_SIZE; ++i) {
1977             int prot = pd[i].flags;
1978
1979             pa = base | (i << TARGET_PAGE_BITS);
1980             if (prot != data->prot) {
1981                 rc = walk_memory_regions_end(data, pa, prot);
1982                 if (rc != 0) {
1983                     return rc;
1984                 }
1985             }
1986         }
1987     } else {
1988         void **pp = *lp;
1989
1990         for (i = 0; i < V_L2_SIZE; ++i) {
1991             pa = base | ((target_ulong)i <<
1992                 (TARGET_PAGE_BITS + V_L2_BITS * level));
1993             rc = walk_memory_regions_1(data, pa, level - 1, pp + i);
1994             if (rc != 0) {
1995                 return rc;
1996             }
1997         }
1998     }
1999
2000     return 0;
2001 }
2002
2003 int walk_memory_regions(void *priv, walk_memory_regions_fn fn)
2004 {
2005     struct walk_memory_regions_data data;
2006     uintptr_t i, l1_sz = v_l1_size;
2007
2008     data.fn = fn;
2009     data.priv = priv;
2010     data.start = -1u;
2011     data.prot = 0;
2012
2013     for (i = 0; i < l1_sz; i++) {
2014         target_ulong base = i << (v_l1_shift + TARGET_PAGE_BITS);
2015         int rc = walk_memory_regions_1(&data, base, v_l2_levels, l1_map + i);
2016         if (rc != 0) {
2017             return rc;
2018         }
2019     }
2020
2021     return walk_memory_regions_end(&data, 0, 0);
2022 }
2023
2024 static int dump_region(void *priv, target_ulong start,
2025     target_ulong end, unsigned long prot)
2026 {
2027     FILE *f = (FILE *)priv;
2028
2029     (void) fprintf(f, TARGET_FMT_lx"-"TARGET_FMT_lx
2030         " "TARGET_FMT_lx" %c%c%c\n",
2031         start, end, end - start,
2032         ((prot & PAGE_READ) ? 'r' : '-'),
2033         ((prot & PAGE_WRITE) ? 'w' : '-'),
2034         ((prot & PAGE_EXEC) ? 'x' : '-'));
2035
2036     return 0;
2037 }
2038
2039 /* dump memory mappings */
2040 void page_dump(FILE *f)
2041 {
2042     const int length = sizeof(target_ulong) * 2;
2043     (void) fprintf(f, "%-*s %-*s %-*s %s\n",
2044             length, "start", length, "end", length, "size", "prot");
2045     walk_memory_regions(f, dump_region);
2046 }
2047
2048 int page_get_flags(target_ulong address)
2049 {
2050     PageDesc *p;
2051
2052     p = page_find(address >> TARGET_PAGE_BITS);
2053     if (!p) {
2054         return 0;
2055     }
2056     return p->flags;
2057 }
2058
2059 /* Modify the flags of a page and invalidate the code if necessary.
2060    The flag PAGE_WRITE_ORG is positioned automatically depending
2061    on PAGE_WRITE.  The mmap_lock should already be held.  */
2062 void page_set_flags(target_ulong start, target_ulong end, int flags)
2063 {
2064     target_ulong addr, len;
2065
2066     /* This function should never be called with addresses outside the
2067        guest address space.  If this assert fires, it probably indicates
2068        a missing call to h2g_valid.  */
2069 #if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
2070     assert(end < ((target_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
2071 #endif
2072     assert(start < end);
2073     assert_memory_lock();
2074
2075     start = start & TARGET_PAGE_MASK;
2076     end = TARGET_PAGE_ALIGN(end);
2077
2078     if (flags & PAGE_WRITE) {
2079         flags |= PAGE_WRITE_ORG;
2080     }
2081
2082     for (addr = start, len = end - start;
2083          len != 0;
2084          len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
2085         PageDesc *p = page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
2086
2087         /* If the write protection bit is set, then we invalidate
2088            the code inside.  */
2089         if (!(p->flags & PAGE_WRITE) &&
2090             (flags & PAGE_WRITE) &&
2091             p->first_tb) {
2092             tb_invalidate_phys_page(addr, 0);
2093         }
2094         p->flags = flags;
2095     }
2096 }
2097
2098 int page_check_range(target_ulong start, target_ulong len, int flags)
2099 {
2100     PageDesc *p;
2101     target_ulong end;
2102     target_ulong addr;
2103
2104     /* This function should never be called with addresses outside the
2105        guest address space.  If this assert fires, it probably indicates
2106        a missing call to h2g_valid.  */
2107 #if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
2108     assert(start < ((target_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
2109 #endif
2110
2111     if (len == 0) {
2112         return 0;
2113     }
2114     if (start + len - 1 < start) {
2115         /* We've wrapped around.  */
2116         return -1;
2117     }
2118
2119     /* must do before we loose bits in the next step */
2120     end = TARGET_PAGE_ALIGN(start + len);
2121     start = start & TARGET_PAGE_MASK;
2122
2123     for (addr = start, len = end - start;
2124          len != 0;
2125          len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
2126         p = page_find(addr >> TARGET_PAGE_BITS);
2127         if (!p) {
2128             return -1;
2129         }
2130         if (!(p->flags & PAGE_VALID)) {
2131             return -1;
2132         }
2133
2134         if ((flags & PAGE_READ) && !(p->flags & PAGE_READ)) {
2135             return -1;
2136         }
2137         if (flags & PAGE_WRITE) {
2138             if (!(p->flags & PAGE_WRITE_ORG)) {
2139                 return -1;
2140             }
2141             /* unprotect the page if it was put read-only because it
2142                contains translated code */
2143             if (!(p->flags & PAGE_WRITE)) {
2144                 if (!page_unprotect(addr, 0)) {
2145                     return -1;
2146                 }
2147             }
2148         }
2149     }
2150     return 0;
2151 }
2152
2153 /* called from signal handler: invalidate the code and unprotect the
2154  * page. Return 0 if the fault was not handled, 1 if it was handled,
2155  * and 2 if it was handled but the caller must cause the TB to be
2156  * immediately exited. (We can only return 2 if the 'pc' argument is
2157  * non-zero.)
2158  */
2159 int page_unprotect(target_ulong address, uintptr_t pc)
2160 {
2161     unsigned int prot;
2162     bool current_tb_invalidated;
2163     PageDesc *p;
2164     target_ulong host_start, host_end, addr;
2165
2166     /* Technically this isn't safe inside a signal handler.  However we
2167        know this only ever happens in a synchronous SEGV handler, so in
2168        practice it seems to be ok.  */
2169     mmap_lock();
2170
2171     p = page_find(address >> TARGET_PAGE_BITS);
2172     if (!p) {
2173         mmap_unlock();
2174         return 0;
2175     }
2176
2177     /* if the page was really writable, then we change its
2178        protection back to writable */
2179     if ((p->flags & PAGE_WRITE_ORG) && !(p->flags & PAGE_WRITE)) {
2180         host_start = address & qemu_host_page_mask;
2181         host_end = host_start + qemu_host_page_size;
2182
2183         prot = 0;
2184         current_tb_invalidated = false;
2185         for (addr = host_start ; addr < host_end ; addr += TARGET_PAGE_SIZE) {
2186             p = page_find(addr >> TARGET_PAGE_BITS);
2187             p->flags |= PAGE_WRITE;
2188             prot |= p->flags;
2189
2190             /* and since the content will be modified, we must invalidate
2191                the corresponding translated code. */
2192             current_tb_invalidated |= tb_invalidate_phys_page(addr, pc);
2193 #ifdef DEBUG_TB_CHECK
2194             tb_invalidate_check(addr);
2195 #endif
2196         }
2197         mprotect((void *)g2h(host_start), qemu_host_page_size,
2198                  prot & PAGE_BITS);
2199
2200         mmap_unlock();
2201         /* If current TB was invalidated return to main loop */
2202         return current_tb_invalidated ? 2 : 1;
2203     }
2204     mmap_unlock();
2205     return 0;
2206 }
2207 #endif /* CONFIG_USER_ONLY */
This page took 0.142521 seconds and 4 git commands to generate.