mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 23:03:54 -06:00
Refactor translation block CPU state handling (Jan Kiszka)
This patch refactors the way the CPU state is handled that is associated with a TB. The basic motivation is to move more arch specific code out of generic files. Specifically the long #ifdef clutter in tb_find_fast() has to be overcome in order to avoid duplicating it for the gdb watchpoint fixes (patch "Restore pc on watchpoint hits"). Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5736 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
622ed3605b
commit
6b9175478e
11 changed files with 115 additions and 95 deletions
63
cpu-exec.c
63
cpu-exec.c
|
@ -169,71 +169,12 @@ static inline TranslationBlock *tb_find_fast(void)
|
|||
{
|
||||
TranslationBlock *tb;
|
||||
target_ulong cs_base, pc;
|
||||
uint64_t flags;
|
||||
int flags;
|
||||
|
||||
/* we record a subset of the CPU state. It will
|
||||
always be the same before a given translated block
|
||||
is executed. */
|
||||
#if defined(TARGET_I386)
|
||||
flags = env->hflags;
|
||||
flags |= (env->eflags & (IOPL_MASK | TF_MASK | VM_MASK));
|
||||
cs_base = env->segs[R_CS].base;
|
||||
pc = cs_base + env->eip;
|
||||
#elif defined(TARGET_ARM)
|
||||
flags = env->thumb | (env->vfp.vec_len << 1)
|
||||
| (env->vfp.vec_stride << 4);
|
||||
if ((env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR)
|
||||
flags |= (1 << 6);
|
||||
if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30))
|
||||
flags |= (1 << 7);
|
||||
flags |= (env->condexec_bits << 8);
|
||||
cs_base = 0;
|
||||
pc = env->regs[15];
|
||||
#elif defined(TARGET_SPARC)
|
||||
#ifdef TARGET_SPARC64
|
||||
// AM . Combined FPU enable bits . PRIV . DMMU enabled . IMMU enabled
|
||||
flags = ((env->pstate & PS_AM) << 2)
|
||||
| (((env->pstate & PS_PEF) >> 1) | ((env->fprs & FPRS_FEF) << 2))
|
||||
| (env->pstate & PS_PRIV) | ((env->lsu & (DMMU_E | IMMU_E)) >> 2);
|
||||
#else
|
||||
// FPU enable . Supervisor
|
||||
flags = (env->psref << 4) | env->psrs;
|
||||
#endif
|
||||
cs_base = env->npc;
|
||||
pc = env->pc;
|
||||
#elif defined(TARGET_PPC)
|
||||
flags = env->hflags;
|
||||
cs_base = 0;
|
||||
pc = env->nip;
|
||||
#elif defined(TARGET_MIPS)
|
||||
flags = env->hflags & (MIPS_HFLAG_TMASK | MIPS_HFLAG_BMASK);
|
||||
cs_base = 0;
|
||||
pc = env->active_tc.PC;
|
||||
#elif defined(TARGET_M68K)
|
||||
flags = (env->fpcr & M68K_FPCR_PREC) /* Bit 6 */
|
||||
| (env->sr & SR_S) /* Bit 13 */
|
||||
| ((env->macsr >> 4) & 0xf); /* Bits 0-3 */
|
||||
cs_base = 0;
|
||||
pc = env->pc;
|
||||
#elif defined(TARGET_SH4)
|
||||
flags = (env->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL
|
||||
| DELAY_SLOT_TRUE | DELAY_SLOT_CLEARME)) /* Bits 0- 3 */
|
||||
| (env->fpscr & (FPSCR_FR | FPSCR_SZ | FPSCR_PR)) /* Bits 19-21 */
|
||||
| (env->sr & (SR_MD | SR_RB)); /* Bits 29-30 */
|
||||
cs_base = 0;
|
||||
pc = env->pc;
|
||||
#elif defined(TARGET_ALPHA)
|
||||
flags = env->ps;
|
||||
cs_base = 0;
|
||||
pc = env->pc;
|
||||
#elif defined(TARGET_CRIS)
|
||||
flags = env->pregs[PR_CCS] & (S_FLAG | P_FLAG | U_FLAG | X_FLAG);
|
||||
flags |= env->dslot;
|
||||
cs_base = 0;
|
||||
pc = env->pc;
|
||||
#else
|
||||
#error unsupported CPU
|
||||
#endif
|
||||
cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags);
|
||||
tb = env->tb_jmp_cache[tb_jmp_cache_hash_func(pc)];
|
||||
if (unlikely(!tb || tb->pc != pc || tb->cs_base != cs_base ||
|
||||
tb->flags != flags)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue