18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * internal execution defines for qemu 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 2003 Fabrice Bellard 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This library is free software; you can redistribute it and/or 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * modify it under the terms of the GNU Lesser General Public 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * License as published by the Free Software Foundation; either 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * version 2 of the License, or (at your option) any later version. 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This library is distributed in the hope that it will be useful, 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Lesser General Public License for more details. 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * You should have received a copy of the GNU Lesser General Public 172910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * License along with this library; if not, see <http://www.gnu.org/licenses/>. 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifndef _EXEC_ALL_H_ 215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define _EXEC_ALL_H_ 225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qemu-common.h" 240e0515410009c5bdd4d2d77a4a9131081573f040David 'Digit' Turner#include "exec/cpu-common.h" 250e0515410009c5bdd4d2d77a4a9131081573f040David 'Digit' Turner#include "exec/cpu-all.h" 265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* allow to see translation results - the slowdown should be negligible, so we leave it */ 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DEBUG_DISAS 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 30280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner/* Page tracking code uses ram addresses in system mode, and virtual 31280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner addresses in userspace mode. Define tb_page_addr_t to be an appropriate 32280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner type. */ 33280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner#if defined(CONFIG_USER_ONLY) 34280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnertypedef abi_ulong tb_page_addr_t; 35280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner#else 36280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnertypedef ram_addr_t tb_page_addr_t; 37280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner#endif 38280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* is_jmp field values */ 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DISAS_NEXT 0 /* next instruction can be analyzed */ 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DISAS_JUMP 1 /* only pc was modified dynamically */ 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DISAS_UPDATE 2 /* cpu state was modified dynamically */ 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DISAS_TB_JUMP 3 /* only pc was modified statically */ 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 454d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turnerstruct TranslationBlock; 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct TranslationBlock TranslationBlock; 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* XXX: make safe guess about sizes */ 49fb02a555a0a2a34e84389d9e441749cc58428531David 'Digit' Turner#define MAX_OP_PER_INSTR 208 50fb02a555a0a2a34e84389d9e441749cc58428531David 'Digit' Turner 5186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if HOST_LONG_BITS == 32 5286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define MAX_OPC_PARAM_PER_ARG 2 5386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else 5486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define MAX_OPC_PARAM_PER_ARG 1 5586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif 5686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define MAX_OPC_PARAM_IARGS 5 5786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define MAX_OPC_PARAM_OARGS 1 5886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define MAX_OPC_PARAM_ARGS (MAX_OPC_PARAM_IARGS + MAX_OPC_PARAM_OARGS) 5986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 6086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* A Call op needs up to 4 + 2N parameters on 32-bit archs, 6186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * and up to 4 + N parameters on 64-bit archs 6286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner * (N = number of input arguments + output arguments). */ 6386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define MAX_OPC_PARAM (4 + (MAX_OPC_PARAM_PER_ARG * MAX_OPC_PARAM_ARGS)) 64bcc6ae14820ddb24e2403d84b420ce61f371ae94David 'Digit' Turner#define OPC_BUF_SIZE 2048 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define OPC_MAX_SIZE (OPC_BUF_SIZE - MAX_OP_PER_INSTR) 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Maximum size a TCG op can expand to. This is complicated because a 682910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner single op may require several host instructions and register reloads. 692910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner For now take a wild guess at 192 bytes, which should allow at least 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project a couple of fixup instructions per argument. */ 712910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner#define TCG_MAX_OP_SIZE 192 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define OPPARAM_BUF_SIZE (OPC_BUF_SIZE * MAX_OPC_PARAM) 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 75e1e03df288d5a44bfbffbd86588395c7cbbc27dfDavid 'Digit' Turner#include "qemu/log.h" 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 774d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turnervoid gen_intermediate_code(CPUArchState *env, struct TranslationBlock *tb); 784d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turnervoid gen_intermediate_code_pc(CPUArchState *env, struct TranslationBlock *tb); 794d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turnervoid restore_state_to_opc(CPUArchState *env, struct TranslationBlock *tb, 804d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turner int pc_pos); 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned long code_gen_max_block_size(void); 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_gen_init(void); 84ff9a2b851f95dff46171881afcdc65b2e164d36dDavid 'Digit' Turnervoid tcg_exec_init(unsigned long tb_size); 854d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turnerint cpu_gen_code(CPUArchState *env, struct TranslationBlock *tb, 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int *gen_code_size_ptr); 873e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' Turnerbool cpu_restore_state(CPUArchState *env, uintptr_t searched_pc); 883e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' Turner 894d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turnervoid QEMU_NORETURN cpu_resume_from_signal(CPUArchState *env1, void *puc); 9085c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turnervoid QEMU_NORETURN cpu_io_recompile(CPUArchState *env, uintptr_t retaddr); 913e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' TurnerTranslationBlock *tb_gen_code(CPUArchState *env, 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project target_ulong pc, target_ulong cs_base, int flags, 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int cflags); 944d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turnervoid cpu_exec_init(CPUArchState *env); 9585c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turnervoid QEMU_NORETURN cpu_loop_exit(CPUArchState *env1); 9685c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turnerint page_unprotect(target_ulong address, uintptr_t pc, void *puc); 973e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' Turnervoid tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end, 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int is_cpu_write_access); 993e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' Turnervoid tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t end, 1003e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' Turner int is_cpu_write_access); 1011348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner#if !defined(CONFIG_USER_ONLY) 1023e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' Turner/* cputlb.c */ 1034d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turnervoid tlb_flush_page(CPUArchState *env, target_ulong addr); 1044d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turnervoid tlb_flush(CPUArchState *env, int flush_global); 1050d8b235c0c6c02de86a4e7415d574175b4518ff0David 'Digit' Turnervoid tlb_set_page(CPUArchState *env, target_ulong vaddr, 1060d8b235c0c6c02de86a4e7415d574175b4518ff0David 'Digit' Turner hwaddr paddr, int prot, 1070d8b235c0c6c02de86a4e7415d574175b4518ff0David 'Digit' Turner int mmu_idx, target_ulong size); 108ff9a2b851f95dff46171881afcdc65b2e164d36dDavid 'Digit' Turnervoid tb_reset_jump_recursive(TranslationBlock *tb); 1093e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' Turnervoid tb_invalidate_phys_addr(hwaddr addr); 1101348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner#else 1111348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turnerstatic inline void tlb_flush_page(CPUArchState *env, target_ulong addr) 1121348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner{ 1131348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner} 1141348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner 1151348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turnerstatic inline void tlb_flush(CPUArchState *env, int flush_global) 1161348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner{ 1171348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner} 1181348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner#endif 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1203dc53fc5342d24fae977049a40c34cc63ba04ad6David 'Digit' Turnertypedef struct PhysPageDesc { 1213dc53fc5342d24fae977049a40c34cc63ba04ad6David 'Digit' Turner /* offset in host memory of the page + io_index in the low bits */ 1223dc53fc5342d24fae977049a40c34cc63ba04ad6David 'Digit' Turner ram_addr_t phys_offset; 1233dc53fc5342d24fae977049a40c34cc63ba04ad6David 'Digit' Turner ram_addr_t region_offset; 1243dc53fc5342d24fae977049a40c34cc63ba04ad6David 'Digit' Turner} PhysPageDesc; 1253dc53fc5342d24fae977049a40c34cc63ba04ad6David 'Digit' Turner 1263dc53fc5342d24fae977049a40c34cc63ba04ad6David 'Digit' TurnerPhysPageDesc *phys_page_find(hwaddr index); 127ff9a2b851f95dff46171881afcdc65b2e164d36dDavid 'Digit' TurnerPhysPageDesc *phys_page_find_alloc(hwaddr index, int alloc); 1283dc53fc5342d24fae977049a40c34cc63ba04ad6David 'Digit' Turner 1293dc53fc5342d24fae977049a40c34cc63ba04ad6David 'Digit' Turnerint io_mem_watch; 1303dc53fc5342d24fae977049a40c34cc63ba04ad6David 'Digit' Turner 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CODE_GEN_ALIGN 16 /* must be >= of the size of a icache line */ 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CODE_GEN_PHYS_HASH_BITS 15 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CODE_GEN_PHYS_HASH_SIZE (1 << CODE_GEN_PHYS_HASH_BITS) 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* estimated block size for TB allocation */ 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* XXX: use a per code average code fragment size and modulate it 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project according to the host CPU */ 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(CONFIG_SOFTMMU) 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CODE_GEN_AVG_BLOCK_SIZE 128 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CODE_GEN_AVG_BLOCK_SIZE 64 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1454d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turner#if defined(__arm__) || defined(_ARCH_PPC) \ 1464d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turner || defined(__x86_64__) || defined(__i386__) \ 1474d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turner || defined(__sparc__) || defined(__aarch64__) \ 1484d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turner || defined(CONFIG_TCG_INTERPRETER) 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define USE_DIRECT_JUMP 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct TranslationBlock { 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project target_ulong pc; /* simulated PC corresponding to this block (EIP + CS base) */ 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project target_ulong cs_base; /* CS base for this block */ 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t flags; /* flags defining in which context the code was generated */ 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint16_t size; /* size of target code for this block (1 <= 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size <= TARGET_PAGE_SIZE) */ 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint16_t cflags; /* compile flags */ 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CF_COUNT_MASK 0x7fff 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CF_LAST_IO 0x8000 /* Last insn may be an IO access. */ 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t *tc_ptr; /* pointer to the translated code */ 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* next matching tb for physical address. */ 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct TranslationBlock *phys_hash_next; 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* first and second physical page containing code. The lower bit 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project of the pointer tells the index in page_next[] */ 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct TranslationBlock *page_next[2]; 16885c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner tb_page_addr_t page_addr[2]; 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the following data are used to directly call another TB from 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project the code of this one. */ 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint16_t tb_next_offset[2]; /* offset of original jump target */ 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_DIRECT_JUMP 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint16_t tb_jmp_offset[4]; /* offset of jump instruction */ 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 17685c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner uintptr_t tb_next[2]; /* address of jump generated code */ 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* list of TBs jumping to this one. This is a circular list using 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project the two least significant bits of the pointers to tell what is 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project the next pointer: 0 = jmp_next[0], 1 = jmp_next[1], 2 = 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jmp_first */ 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct TranslationBlock *jmp_next[2]; 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct TranslationBlock *jmp_first; 184171dd0bf53f93e64b71d3edc958e15f40c96748dDavid 'Digit' Turner uint32_t icount; 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1871348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner#include "exec/spinlock.h" 1881348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner 1891348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turnertypedef struct TBContext TBContext; 1901348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner 1911348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turnerstruct TBContext { 1921348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner 1931348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner TranslationBlock *tbs; 1941348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner TranslationBlock *tb_phys_hash[CODE_GEN_PHYS_HASH_SIZE]; 1951348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner int nb_tbs; 1961348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner /* any access to the tbs or the page table must use this lock */ 1971348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner spinlock_t tb_lock; 1981348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner 1991348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner /* statistics */ 2001348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner int tb_flush_count; 2011348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner int tb_phys_invalidate_count; 2021348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner 2031348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner int tb_invalidated_flag; 2041348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner}; 2051348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline unsigned int tb_jmp_cache_hash_page(target_ulong pc) 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project target_ulong tmp; 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tmp = pc ^ (pc >> (TARGET_PAGE_BITS - TB_JMP_PAGE_BITS)); 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (tmp >> (TARGET_PAGE_BITS - TB_JMP_PAGE_BITS)) & TB_JMP_PAGE_MASK; 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline unsigned int tb_jmp_cache_hash_func(target_ulong pc) 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project target_ulong tmp; 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tmp = pc ^ (pc >> (TARGET_PAGE_BITS - TB_JMP_PAGE_BITS)); 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (((tmp >> (TARGET_PAGE_BITS - TB_JMP_PAGE_BITS)) & TB_JMP_PAGE_MASK) 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project | (tmp & TB_JMP_ADDR_MASK)); 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22185c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turnerstatic inline unsigned int tb_phys_hash_func(tb_page_addr_t pc) 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 223280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner return (pc >> 2) & (CODE_GEN_PHYS_HASH_SIZE - 1); 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid tb_free(TranslationBlock *tb); 2274d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turnervoid tb_flush(CPUArchState *env); 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid tb_link_phys(TranslationBlock *tb, 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project target_ulong phys_pc, target_ulong phys_page2); 23085c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turnervoid tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr); 231ff9a2b851f95dff46171881afcdc65b2e164d36dDavid 'Digit' Turnervoid tb_invalidate_phys_page_fast0(hwaddr start, int len); 2320e5ff1bd3073e3847ac8400ba46814878beb8605David 'Digit' Turner 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern uint8_t *code_gen_ptr; 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int code_gen_max_blocks; 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(USE_DIRECT_JUMP) 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23885c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner#if defined(CONFIG_TCG_INTERPRETER) 23985c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turnerstatic inline void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr) 24085c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner{ 24185c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner /* patch the branch destination */ 24285c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner *(uint32_t *)jmp_addr = addr - (jmp_addr + 4); 24385c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner /* no need to flush icache explicitly */ 24485c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner} 24585c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner#elif defined(_ARCH_PPC) 24685c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turnervoid ppc_tb_set_jmp_target(unsigned long jmp_addr, unsigned long addr); 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tb_set_jmp_target1 ppc_tb_set_jmp_target 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(__i386__) || defined(__x86_64__) 24985c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turnerstatic inline void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr) 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* patch the branch destination */ 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(uint32_t *)jmp_addr = addr - (jmp_addr + 4); 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* no need to flush icache explicitly */ 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 25585c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner#elif defined(__aarch64__) 25685c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turnervoid aarch64_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr); 25785c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner#define tb_set_jmp_target1 aarch64_tb_set_jmp_target 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(__arm__) 25985c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turnerstatic inline void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr) 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 26185c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner#if !QEMU_GNUC_PREREQ(4, 1) 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project register unsigned long _beg __asm ("a1"); 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project register unsigned long _end __asm ("a2"); 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project register unsigned long _flg __asm ("a3"); 2655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we could use a ldr pc, [pc, #-4] kind of branch and avoid the flush */ 2682910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner *(uint32_t *)jmp_addr = 2692910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner (*(uint32_t *)jmp_addr & ~0xffffff) 2702910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner | (((addr - (jmp_addr + 8)) >> 2) & 0xffffff); 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if QEMU_GNUC_PREREQ(4, 1) 27385c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner __builtin___clear_cache((char *) jmp_addr, (char *) jmp_addr + 4); 2745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#else 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* flush icache */ 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _beg = jmp_addr; 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _end = jmp_addr + 4; 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _flg = 0; 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project __asm __volatile__ ("swi 0x9f0002" : : "r" (_beg), "r" (_end), "r" (_flg)); 2805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 28285c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner#elif defined(__sparc__) 28385c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turnervoid tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr); 28485c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner#else 28585c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner#error tb_set_jmp_target1 is missing 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tb_set_jmp_target(TranslationBlock *tb, 28985c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner int n, uintptr_t addr) 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 29185c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner uint16_t offset = tb->tb_jmp_offset[n]; 29285c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner tb_set_jmp_target1((uintptr_t)(tb->tc_ptr + offset), addr); 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project offset = tb->tb_jmp_offset[n + 2]; 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (offset != 0xffff) 29585c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner tb_set_jmp_target1((uintptr_t)(tb->tc_ptr + offset), addr); 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* set the jump target */ 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tb_set_jmp_target(TranslationBlock *tb, 30285c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner int n, uintptr_t addr) 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tb->tb_next[n] = addr; 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tb_add_jump(TranslationBlock *tb, int n, 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TranslationBlock *tb_next) 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* NOTE: this test is only needed for thread safety */ 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!tb->jmp_next[n]) { 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* patch the native jump address */ 31585c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner tb_set_jmp_target(tb, n, (uintptr_t)tb_next->tc_ptr); 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* add in TB jmp circular list */ 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tb->jmp_next[n] = tb_next->jmp_first; 31985c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner tb_next->jmp_first = (TranslationBlock *)((uintptr_t)(tb) | (n)); 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3231348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner/* GETRA is the true target of the return instruction that we'll execute, 3241348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner defined here for simplicity of defining the follow-up macros. */ 3251348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner#if defined(CONFIG_TCG_INTERPRETER) 3261348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turnerextern uintptr_t tci_tb_ptr; 3271348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner# define GETRA() tci_tb_ptr 3281348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner#else 3291348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner# define GETRA() \ 3301348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner ((uintptr_t)__builtin_extract_return_addr(__builtin_return_address(0))) 3311348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner#endif 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3331348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner/* The true return address will often point to a host insn that is part of 3341348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner the next translated guest insn. Adjust the address backward to point to 3351348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner the middle of the call insn. Subtracting one would do the job except for 3361348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner several compressed mode architectures (arm, mips) which set the low bit 3371348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner to indicate the compressed mode; subtracting two works around that. It 3381348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner is also the case that there are no host isas that contain a call insn 3391348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner smaller than 4 bytes, so we don't worry about special-casing this. */ 3401348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner#if defined(CONFIG_TCG_INTERPRETER) 3411348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner# define GETPC_ADJ 0 3421348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner#else 3431348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner# define GETPC_ADJ 2 3441348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner#endif 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 346eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turner#define GETPC() (GETRA() - GETPC_ADJ) 347eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turner 3481348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turner#if !defined(CONFIG_USER_ONLY) 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3501348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turnervoid phys_mem_set_alloc(void *(*alloc)(size_t)); 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3523e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' TurnerTranslationBlock *tb_find_pc(uintptr_t pc_ptr); 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 354fdec1f1b82ec4e5ce7b62b8120ba5b1218a9c0afDavid 'Digit' Turneruint64_t io_mem_read(int index, hwaddr addr, unsigned size); 355fdec1f1b82ec4e5ce7b62b8120ba5b1218a9c0afDavid 'Digit' Turnervoid io_mem_write(int index, hwaddr addr, uint64_t value, unsigned size); 356fdec1f1b82ec4e5ce7b62b8120ba5b1218a9c0afDavid 'Digit' Turner 357fdec1f1b82ec4e5ce7b62b8120ba5b1218a9c0afDavid 'Digit' Turnerextern CPUWriteMemoryFunc *_io_mem_write[IO_MEM_NB_ENTRIES][4]; 358fdec1f1b82ec4e5ce7b62b8120ba5b1218a9c0afDavid 'Digit' Turnerextern CPUReadMemoryFunc *_io_mem_read[IO_MEM_NB_ENTRIES][4]; 3591348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turnerextern void *io_mem_opaque[IO_MEM_NB_ENTRIES]; 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 361eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turnervoid tlb_fill(CPUArchState *env1, target_ulong addr, int is_write, int mmu_idx, 362eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turner uintptr_t retaddr); 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 36486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turneruint8_t helper_ldb_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx); 36586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turneruint16_t helper_ldw_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx); 36686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turneruint32_t helper_ldl_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx); 36786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turneruint64_t helper_ldq_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx); 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ACCESS_TYPE (NB_MMU_MODES + 1) 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MEMSUFFIX _code 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DATA_SIZE 1 373852088c7e08182c2de563872d558309815cbfa0dDavid 'Digit' Turner#include "exec/softmmu_header.h" 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DATA_SIZE 2 376852088c7e08182c2de563872d558309815cbfa0dDavid 'Digit' Turner#include "exec/softmmu_header.h" 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DATA_SIZE 4 379852088c7e08182c2de563872d558309815cbfa0dDavid 'Digit' Turner#include "exec/softmmu_header.h" 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DATA_SIZE 8 382852088c7e08182c2de563872d558309815cbfa0dDavid 'Digit' Turner#include "exec/softmmu_header.h" 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ACCESS_TYPE 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef MEMSUFFIX 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(CONFIG_USER_ONLY) 3903e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' Turnerstatic inline tb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr) 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return addr; 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 39586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* cputlb.c */ 39601ee5b8ded901c76731bab7a12a87c2002479014David 'Digit' Turnertb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr); 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 3994d6613c972c53178ff9ea39de7fa79d07649fad5David 'Digit' Turnertypedef void (CPUDebugExcpHandler)(CPUArchState *env); 4005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 4011348777d4229cf65ef12d0a4ee531d4502847277David 'Digit' Turnervoid cpu_set_debug_excp_handler(CPUDebugExcpHandler *handler); 4025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 4035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* vl.c */ 4045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerextern int singlestep; 4055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 4063e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' Turner/* cpu-exec.c */ 4073e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' Turnerextern volatile sig_atomic_t exit_request; 4083e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' Turner 4099b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner/* Deterministic execution requires that IO only be performed on the last 4109b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner instruction of a TB so that interrupts take effect immediately. */ 4119b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turnerstatic inline int can_do_io(CPUArchState *env) 4129b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner{ 41385c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner if (!use_icount) { 4149b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner return 1; 41585c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner } 4169b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner /* If not executing code then assume we are ok. */ 4173e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' Turner if (env->current_tb == NULL) { 4189b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner return 1; 41985c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner } 4209b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner return env->can_do_io != 0; 4219b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner} 4229b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner 4235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 424