translate-all.c revision f645f7d6fd841e39524e5df8c1a7fd8347f92ac1
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Host code generation 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#include <stdarg.h> 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdlib.h> 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdio.h> 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h> 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <inttypes.h> 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "config.h" 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define NO_CPU_IO_DEFS 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "cpu.h" 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "exec-all.h" 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "disas.h" 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "tcg.h" 326a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#include "qemu-timer.h" 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* code generation context */ 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectTCGContext tcg_ctx; 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint16_t gen_opc_buf[OPC_BUF_SIZE]; 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectTCGArg gen_opparam_buf[OPPARAM_BUF_SIZE]; 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttarget_ulong gen_opc_pc[OPC_BUF_SIZE]; 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint16_t gen_opc_icount[OPC_BUF_SIZE]; 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint8_t gen_opc_instr_start[OPC_BUF_SIZE]; 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(TARGET_I386) 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint8_t gen_opc_cc_op[OPC_BUF_SIZE]; 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_SPARC) 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttarget_ulong gen_opc_npc[OPC_BUF_SIZE]; 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttarget_ulong gen_opc_jump_pc[2]; 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_MIPS) || defined(TARGET_SH4) 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint32_t gen_opc_hflags[OPC_BUF_SIZE]; 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 525389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK 535389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine/* 545389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine * Memchecker code in this module copies TB PC <-> Guest PC map to the TB 555389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine * descriptor after guest code has been translated in cpu_gen_init routine. 565389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine */ 575389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#include "memcheck/memcheck_api.h" 585389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 595389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine/* Array of (tb_pc, guest_pc) pairs, big enough for all translations. This 605389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine * array is used to obtain guest PC address from a translated PC address. 615389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine * tcg_gen_code_common will fill it up when memchecker is enabled. */ 62d9b6cb97a8a9e93f1bbe5351874b03f7faa81783David 'Digit' Turnerstatic void* gen_opc_tpc2gpc[OPC_BUF_SIZE * 2]; 63d9b6cb97a8a9e93f1bbe5351874b03f7faa81783David 'Digit' Turnervoid** gen_opc_tpc2gpc_ptr = &gen_opc_tpc2gpc[0]; 645389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine/* Number of (tb_pc, guest_pc) pairs stored in gen_opc_tpc2gpc array. */ 655389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkineunsigned int gen_opc_tpc2gpc_pairs; 665389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif // CONFIG_MEMCHECK 675389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* XXX: suppress that */ 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned long code_gen_max_block_size(void) 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static unsigned long max; 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (max == 0) { 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project max = TCG_MAX_OP_SIZE; 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DEF(s, n, copy_size) max = copy_size > max? copy_size : max; 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "tcg-opc.h" 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef DEF 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project max *= OPC_MAX_SIZE; 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return max; 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_gen_init(void) 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 865389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine tcg_context_init(&tcg_ctx); 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_set_frame(&tcg_ctx, TCG_AREG0, offsetof(CPUState, temp_buf), 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CPU_TEMP_BUF_NLONGS * sizeof(long)); 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return non zero if the very first instruction is invalid so that 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project the virtual CPU can trigger an exception. 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project '*gen_code_size_ptr' contains the size of the generated code (host 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project code). 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/ 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint cpu_gen_code(CPUState *env, TranslationBlock *tb, int *gen_code_size_ptr) 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TCGContext *s = &tcg_ctx; 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t *gen_code_buf; 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int gen_code_size; 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t ti; 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->tb_count1++; /* includes aborted translations because of 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exceptions */ 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ti = profile_getclock(); 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_func_start(s); 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gen_intermediate_code(env, tb); 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* generate machine code */ 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gen_code_buf = tb->tc_ptr; 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tb->tb_next_offset[0] = 0xffff; 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tb->tb_next_offset[1] = 0xffff; 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->tb_next_offset = tb->tb_next_offset; 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_DIRECT_JUMP 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->tb_jmp_offset = tb->tb_jmp_offset; 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->tb_next = NULL; 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the following two entries are optional (only used for string ops) */ 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* XXX: not used ? */ 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tb->tb_jmp_offset[2] = 0xffff; 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tb->tb_jmp_offset[3] = 0xffff; 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->tb_jmp_offset = NULL; 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->tb_next = tb->tb_next; 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->tb_count++; 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->interm_time += profile_getclock() - ti; 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->code_time -= profile_getclock(); 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner gen_code_size = tcg_gen_code(s, gen_code_buf); 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *gen_code_size_ptr = gen_code_size; 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->code_time += profile_getclock(); 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->code_in_len += tb->size; 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->code_out_len += gen_code_size; 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1455389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK 1465389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine /* Save translated PC -> guest PC map into TB. */ 1475389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled && gen_opc_tpc2gpc_pairs && is_cpu_user(env)) { 1485389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine tb->tpc2gpc = 1495389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine qemu_malloc(gen_opc_tpc2gpc_pairs * 2 * sizeof(target_ulong)); 1505389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (tb->tpc2gpc != NULL) { 1515389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine memcpy(tb->tpc2gpc, gen_opc_tpc2gpc_ptr, 1525389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine gen_opc_tpc2gpc_pairs * 2 * sizeof(target_ulong)); 1535389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine tb->tpc2gpc_pairs = gen_opc_tpc2gpc_pairs; 1545389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 1555389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 1565389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif // CONFIG_MEMCHECK 1575389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef DEBUG_DISAS 1595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) { 1605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_log("OUT: [size=%d]\n", *gen_code_size_ptr); 1615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner log_disas(tb->tc_ptr, *gen_code_size_ptr); 1625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_log("\n"); 1635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_log_flush(); 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* The cpu state corresponding to 'searched_pc' is restored. 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint cpu_restore_state(TranslationBlock *tb, 172f645f7d6fd841e39524e5df8c1a7fd8347f92ac1David 'Digit' Turner CPUState *env, unsigned long searched_pc) 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TCGContext *s = &tcg_ctx; 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int j; 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned long tc_ptr; 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t ti; 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ti = profile_getclock(); 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_func_start(s); 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gen_intermediate_code_pc(env, tb); 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (use_icount) { 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Reset the cycle counter to the start of the block. */ 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project env->icount_decr.u16.low += tb->icount; 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Clear the IO flag. */ 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project env->can_do_io = 0; 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* find opc index corresponding to search_pc */ 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tc_ptr = (unsigned long)tb->tc_ptr; 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (searched_pc < tc_ptr) 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->tb_next_offset = tb->tb_next_offset; 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_DIRECT_JUMP 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->tb_jmp_offset = tb->tb_jmp_offset; 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->tb_next = NULL; 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->tb_jmp_offset = NULL; 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->tb_next = tb->tb_next; 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner j = tcg_gen_code_search_pc(s, (uint8_t *)tc_ptr, searched_pc - tc_ptr); 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (j < 0) 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* now find start of instruction before */ 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (gen_opc_instr_start[j] == 0) 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project j--; 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project env->icount_decr.u16.low -= gen_opc_icount[j]; 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 216d3d4468189618e89f74d8f51b8470f277e000938David 'Digit' Turner restore_state_to_opc(env, tb, j); 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->restore_time += profile_getclock() - ti; 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->restore_count++; 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 224