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