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