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