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