|
|
|
@ -90,6 +90,31 @@ void arm_cpu_synchronize_from_tb(CPUState *cs, |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void arm_restore_state_to_opc(CPUState *cs, |
|
|
|
const TranslationBlock *tb, |
|
|
|
const uint64_t *data) |
|
|
|
{ |
|
|
|
CPUARMState *env = cs->env_ptr; |
|
|
|
|
|
|
|
if (is_a64(env)) { |
|
|
|
if (TARGET_TB_PCREL) { |
|
|
|
env->pc = (env->pc & TARGET_PAGE_MASK) | data[0]; |
|
|
|
} else { |
|
|
|
env->pc = data[0]; |
|
|
|
} |
|
|
|
env->condexec_bits = 0; |
|
|
|
env->exception.syndrome = data[2] << ARM_INSN_START_WORD2_SHIFT; |
|
|
|
} else { |
|
|
|
if (TARGET_TB_PCREL) { |
|
|
|
env->regs[15] = (env->regs[15] & TARGET_PAGE_MASK) | data[0]; |
|
|
|
} else { |
|
|
|
env->regs[15] = data[0]; |
|
|
|
} |
|
|
|
env->condexec_bits = data[1]; |
|
|
|
env->exception.syndrome = data[2] << ARM_INSN_START_WORD2_SHIFT; |
|
|
|
} |
|
|
|
} |
|
|
|
#endif /* CONFIG_TCG */ |
|
|
|
|
|
|
|
static bool arm_cpu_has_work(CPUState *cs) |
|
|
|
@ -2152,6 +2177,7 @@ static const struct TCGCPUOps arm_tcg_ops = { |
|
|
|
.initialize = arm_translate_init, |
|
|
|
.synchronize_from_tb = arm_cpu_synchronize_from_tb, |
|
|
|
.debug_excp_handler = arm_debug_excp_handler, |
|
|
|
.restore_state_to_opc = arm_restore_state_to_opc, |
|
|
|
|
|
|
|
#ifdef CONFIG_USER_ONLY |
|
|
|
.record_sigsegv = arm_cpu_record_sigsegv, |
|
|
|
|