qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC qom-cpu 40/41] cputlb: Change tlb_flush() argument


From: Jia Liu
Subject: Re: [Qemu-devel] [RFC qom-cpu 40/41] cputlb: Change tlb_flush() argument to CPUState
Date: Wed, 4 Sep 2013 20:50:30 +0800

On Wed, Sep 4, 2013 at 5:05 PM, Andreas Färber <address@hidden> wrote:
> Signed-off-by: Andreas Färber <address@hidden>
> ---
>  cputlb.c                           |  6 +++---
>  exec.c                             |  4 +---
>  hw/sh4/sh7750.c                    |  2 +-
>  include/exec/exec-all.h            |  4 ++--
>  target-alpha/cpu.c                 |  2 +-
>  target-alpha/sys_helper.c          |  2 +-
>  target-arm/cpu.c                   |  2 +-
>  target-arm/helper.c                | 28 +++++++++++++++++-------
>  target-cris/cpu.c                  |  2 +-
>  target-i386/cpu.c                  |  2 +-
>  target-i386/helper.c               | 17 ++++++++++-----
>  target-i386/machine.c              |  2 +-
>  target-i386/svm_helper.c           |  2 +-
>  target-lm32/cpu.c                  |  2 +-
>  target-m68k/cpu.c                  |  2 +-
>  target-microblaze/cpu.c            |  2 +-
>  target-microblaze/mmu.c            |  2 +-
>  target-mips/cpu.c                  |  2 +-
>  target-mips/machine.c              |  3 ++-
>  target-mips/op_helper.c            |  4 +++-
>  target-moxie/cpu.c                 |  2 +-
>  target-openrisc/cpu.c              |  2 +-
>  target-openrisc/interrupt.c        |  2 +-
>  target-openrisc/interrupt_helper.c |  2 +-
>  target-openrisc/sys_helper.c       |  2 +-
>  target-ppc/excp_helper.c           |  4 ++--
>  target-ppc/helper_regs.h           |  2 +-
>  target-ppc/misc_helper.c           |  4 +++-
>  target-ppc/mmu-hash64.c            |  6 ++++--
>  target-ppc/mmu_helper.c            | 44 
> ++++++++++++++++++++++++--------------
>  target-ppc/translate_init.c        |  2 +-
>  target-s390x/cpu.c                 |  5 ++---
>  target-s390x/mem_helper.c          | 13 +++++++----
>  target-sh4/cpu.c                   |  2 +-
>  target-sh4/helper.c                |  2 +-
>  target-sparc/cpu.c                 |  2 +-
>  target-sparc/ldst_helper.c         | 16 ++++++++------
>  target-sparc/machine.c             |  3 ++-
>  target-unicore32/cpu.c             |  2 +-
>  target-unicore32/helper.c          |  4 +++-
>  target-xtensa/op_helper.c          |  4 +++-
>  41 files changed, 132 insertions(+), 85 deletions(-)
>
> diff --git a/cputlb.c b/cputlb.c
> index 817180e..bfa7417 100644
> --- a/cputlb.c
> +++ b/cputlb.c
> @@ -52,9 +52,9 @@ static const CPUTLBEntry s_cputlb_empty_entry = {
>   * entries from the TLB at any time, so flushing more entries than
>   * required is only an efficiency issue, not a correctness issue.
>   */
> -void tlb_flush(CPUArchState *env, int flush_global)
> +void tlb_flush(CPUState *cpu, int flush_global)
>  {
> -    CPUState *cpu = ENV_GET_CPU(env);
> +    CPUArchState *env = cpu->env_ptr;
>      int i;
>
>  #if defined(DEBUG_TLB)
> @@ -107,7 +107,7 @@ void tlb_flush_page(CPUState *cpu, target_ulong addr)
>                 VADDR_PRIx "/%" VADDR_PRIx ")\n",
>                 cpu->tlb_flush_addr, cpu->tlb_flush_mask);
>  #endif
> -        tlb_flush(env, 1);
> +        tlb_flush(cpu, 1);
>          return;
>      }
>      /* must reset current TB so that interrupts cannot modify the
> diff --git a/exec.c b/exec.c
> index 9210834..8e514e8 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -1720,9 +1720,7 @@ static void tcg_commit(MemoryListener *listener)
>         reset the modified entries */
>      /* XXX: slow ! */
>      CPU_FOREACH(cpu) {
> -        CPUArchState *env = cpu->env_ptr;
> -
> -        tlb_flush(env, 1);
> +        tlb_flush(cpu, 1);
>      }
>  }
>
> diff --git a/hw/sh4/sh7750.c b/hw/sh4/sh7750.c
> index 1439ba4..4a39357 100644
> --- a/hw/sh4/sh7750.c
> +++ b/hw/sh4/sh7750.c
> @@ -416,7 +416,7 @@ static void sh7750_mem_writel(void *opaque, hwaddr addr,
>      case SH7750_PTEH_A7:
>          /* If asid changes, clear all registered tlb entries. */
>          if ((s->cpu->env.pteh & 0xff) != (mem_value & 0xff)) {
> -            tlb_flush(&s->cpu->env, 1);
> +            tlb_flush(CPU(s->cpu), 1);
>          }
>          s->cpu->env.pteh = mem_value;
>          return;
> diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
> index 550e58d..f2d1c6c 100644
> --- a/include/exec/exec-all.h
> +++ b/include/exec/exec-all.h
> @@ -97,7 +97,7 @@ void tb_invalidate_phys_range(tb_page_addr_t start, 
> tb_page_addr_t end,
>  #if !defined(CONFIG_USER_ONLY)
>  /* cputlb.c */
>  void tlb_flush_page(CPUState *cpu, target_ulong addr);
> -void tlb_flush(CPUArchState *env, int flush_global);
> +void tlb_flush(CPUState *cpu, int flush_global);
>  void tlb_set_page(CPUState *cpu, target_ulong vaddr,
>                    hwaddr paddr, int prot,
>                    int mmu_idx, target_ulong size);
> @@ -107,7 +107,7 @@ static inline void tlb_flush_page(CPUState *cpu, 
> target_ulong addr)
>  {
>  }
>
> -static inline void tlb_flush(CPUArchState *env, int flush_global)
> +static inline void tlb_flush(CPUState *cpu, int flush_global)
>  {
>  }
>  #endif
> diff --git a/target-alpha/cpu.c b/target-alpha/cpu.c
> index 9931f9f..d839d53 100644
> --- a/target-alpha/cpu.c
> +++ b/target-alpha/cpu.c
> @@ -294,7 +294,7 @@ static void alpha_cpu_initfn(Object *obj)
>
>      cs->env_ptr = env;
>      cpu_exec_init(env);
> -    tlb_flush(env, 1);
> +    tlb_flush(cs, 1);
>
>      alpha_translate_init();
>
> diff --git a/target-alpha/sys_helper.c b/target-alpha/sys_helper.c
> index 5f7d7dd..187ccf7 100644
> --- a/target-alpha/sys_helper.c
> +++ b/target-alpha/sys_helper.c
> @@ -64,7 +64,7 @@ void helper_call_pal(CPUAlphaState *env, uint64_t pc, 
> uint64_t entry_ofs)
>
>  void helper_tbia(CPUAlphaState *env)
>  {
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(alpha_env_get_cpu(env)), 1);
>  }
>
>  void helper_tbis(CPUAlphaState *env, uint64_t p)
> diff --git a/target-arm/cpu.c b/target-arm/cpu.c
> index f9f6930..2a0e891 100644
> --- a/target-arm/cpu.c
> +++ b/target-arm/cpu.c
> @@ -163,7 +163,7 @@ static void arm_cpu_reset(CPUState *s)
>                                &env->vfp.fp_status);
>      set_float_detect_tininess(float_tininess_before_rounding,
>                                &env->vfp.standard_fp_status);
> -    tlb_flush(env, 1);
> +    tlb_flush(s, 1);
>      /* Reset is a state change for some CPUARMState fields which we
>       * bake assumptions about into translated code, so we need to
>       * tb_flush().
> diff --git a/target-arm/helper.c b/target-arm/helper.c
> index 4daf82e..7c87ffa 100644
> --- a/target-arm/helper.c
> +++ b/target-arm/helper.c
> @@ -270,18 +270,22 @@ void init_cpreg_list(ARMCPU *cpu)
>
>  static int dacr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t 
> value)
>  {
> +    ARMCPU *cpu = arm_env_get_cpu(env);
> +
>      env->cp15.c3 = value;
> -    tlb_flush(env, 1); /* Flush TLB as domain not tracked in TLB */
> +    tlb_flush(CPU(cpu), 1); /* Flush TLB as domain not tracked in TLB */
>      return 0;
>  }
>
>  static int fcse_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t 
> value)
>  {
> +    ARMCPU *cpu = arm_env_get_cpu(env);
> +
>      if (env->cp15.c13_fcse != value) {
>          /* Unlike real hardware the qemu TLB uses virtual addresses,
>           * not modified virtual addresses, so this causes a TLB flush.
>           */
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>          env->cp15.c13_fcse = value;
>      }
>      return 0;
> @@ -289,12 +293,14 @@ static int fcse_write(CPUARMState *env, const 
> ARMCPRegInfo *ri, uint64_t value)
>  static int contextidr_write(CPUARMState *env, const ARMCPRegInfo *ri,
>                              uint64_t value)
>  {
> +    ARMCPU *cpu = arm_env_get_cpu(env);
> +
>      if (env->cp15.c13_context != value && !arm_feature(env, 
> ARM_FEATURE_MPU)) {
>          /* For VMSA (when not using the LPAE long descriptor page table
>           * format) this register includes the ASID, so do a TLB flush.
>           * For PMSA it is purely a process ID and no action is needed.
>           */
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>      }
>      env->cp15.c13_context = value;
>      return 0;
> @@ -303,8 +309,10 @@ static int contextidr_write(CPUARMState *env, const 
> ARMCPRegInfo *ri,
>  static int tlbiall_write(CPUARMState *env, const ARMCPRegInfo *ri,
>                           uint64_t value)
>  {
> +    ARMCPU *cpu = arm_env_get_cpu(env);
> +
>      /* Invalidate all (TLBIALL) */
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(cpu), 1);
>      return 0;
>  }
>
> @@ -321,8 +329,10 @@ static int tlbimva_write(CPUARMState *env, const 
> ARMCPRegInfo *ri,
>  static int tlbiasid_write(CPUARMState *env, const ARMCPRegInfo *ri,
>                            uint64_t value)
>  {
> +    ARMCPU *cpu = arm_env_get_cpu(env);
> +
>      /* Invalidate by ASID (TLBIASID) */
> -    tlb_flush(env, value == 0);
> +    tlb_flush(CPU(cpu), value == 0);
>      return 0;
>  }
>
> @@ -1178,11 +1188,13 @@ static int vmsa_ttbcr_raw_write(CPUARMState *env, 
> const ARMCPRegInfo *ri,
>  static int vmsa_ttbcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
>                              uint64_t value)
>  {
> +    ARMCPU *cpu = arm_env_get_cpu(env);
> +
>      if (arm_feature(env, ARM_FEATURE_LPAE)) {
>          /* With LPAE the TTBCR could result in a change of ASID
>           * via the TTBCR.A1 bit, so do a TLB flush.
>           */
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>      }
>      return vmsa_ttbcr_raw_write(env, ri, value);
>  }
> @@ -1444,7 +1456,7 @@ static int ttbr064_write(CPUARMState *env, const 
> ARMCPRegInfo *ri,
>                           uint64_t value)
>  {
>      /* Writes to the 64 bit format TTBRs may change the ASID */
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(arm_env_get_cpu(env)), 1);
>      return ttbr064_raw_write(env, ri, value);
>  }
>
> @@ -1508,7 +1520,7 @@ static int sctlr_write(CPUARMState *env, const 
> ARMCPRegInfo *ri, uint64_t value)
>      env->cp15.c1_sys = value;
>      /* ??? Lots of these bits are not implemented.  */
>      /* This may enable/disable the MMU, so do a TLB flush.  */
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(arm_env_get_cpu(env)), 1);
>      return 0;
>  }
>
> diff --git a/target-cris/cpu.c b/target-cris/cpu.c
> index b229a10..b7dbd08 100644
> --- a/target-cris/cpu.c
> +++ b/target-cris/cpu.c
> @@ -71,7 +71,7 @@ static void cris_cpu_reset(CPUState *s)
>      vr = env->pregs[PR_VR];
>      memset(env, 0, offsetof(CPUCRISState, load_info));
>      env->pregs[PR_VR] = vr;
> -    tlb_flush(env, 1);
> +    tlb_flush(s, 1);
>
>  #if defined(CONFIG_USER_ONLY)
>      /* start in user mode with interrupts enabled.  */
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index 944c3d7..b08c367 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -2330,7 +2330,7 @@ static void x86_cpu_reset(CPUState *s)
>
>      memset(env, 0, offsetof(CPUX86State, pat));
>
> -    tlb_flush(env, 1);
> +    tlb_flush(s, 1);
>
>      env->old_exception = -1;
>
> diff --git a/target-i386/helper.c b/target-i386/helper.c
> index e0df092..ac21cc4 100644
> --- a/target-i386/helper.c
> +++ b/target-i386/helper.c
> @@ -385,22 +385,25 @@ void x86_cpu_set_a20(X86CPU *cpu, int a20_state)
>
>      a20_state = (a20_state != 0);
>      if (a20_state != ((env->a20_mask >> 20) & 1)) {
> +        CPUState *cs = CPU(cpu);
> +
>  #if defined(DEBUG_MMU)
>          printf("A20 update: a20=%d\n", a20_state);
>  #endif
>          /* if the cpu is currently executing code, we must unlink it and
>             all the potentially executing TB */
> -        cpu_interrupt(CPU(cpu), CPU_INTERRUPT_EXITTB);
> +        cpu_interrupt(cs, CPU_INTERRUPT_EXITTB);
>
>          /* when a20 is changed, all the MMU mappings are invalid, so
>             we must flush everything */
> -        tlb_flush(env, 1);
> +        tlb_flush(cs, 1);
>          env->a20_mask = ~(1 << 20) | (a20_state << 20);
>      }
>  }
>
>  void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0)
>  {
> +    X86CPU *cpu = x86_env_get_cpu(env);
>      int pe_state;
>
>  #if defined(DEBUG_MMU)
> @@ -408,7 +411,7 @@ void cpu_x86_update_cr0(CPUX86State *env, uint32_t 
> new_cr0)
>  #endif
>      if ((new_cr0 & (CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK)) !=
>          (env->cr[0] & (CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK))) {
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>      }
>
>  #ifdef TARGET_X86_64
> @@ -444,24 +447,28 @@ void cpu_x86_update_cr0(CPUX86State *env, uint32_t 
> new_cr0)
>     the PDPT */
>  void cpu_x86_update_cr3(CPUX86State *env, target_ulong new_cr3)
>  {
> +    X86CPU *cpu = x86_env_get_cpu(env);
> +
>      env->cr[3] = new_cr3;
>      if (env->cr[0] & CR0_PG_MASK) {
>  #if defined(DEBUG_MMU)
>          printf("CR3 update: CR3=" TARGET_FMT_lx "\n", new_cr3);
>  #endif
> -        tlb_flush(env, 0);
> +        tlb_flush(CPU(cpu), 0);
>      }
>  }
>
>  void cpu_x86_update_cr4(CPUX86State *env, uint32_t new_cr4)
>  {
> +    X86CPU *cpu = x86_env_get_cpu(env);
> +
>  #if defined(DEBUG_MMU)
>      printf("CR4 update: CR4=%08x\n", (uint32_t)env->cr[4]);
>  #endif
>      if ((new_cr4 ^ env->cr[4]) &
>          (CR4_PGE_MASK | CR4_PAE_MASK | CR4_PSE_MASK |
>           CR4_SMEP_MASK | CR4_SMAP_MASK)) {
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>      }
>      /* SSE handling */
>      if (!(env->features[FEAT_1_EDX] & CPUID_SSE)) {
> diff --git a/target-i386/machine.c b/target-i386/machine.c
> index 54dd2ab..371c126 100644
> --- a/target-i386/machine.c
> +++ b/target-i386/machine.c
> @@ -310,7 +310,7 @@ static int cpu_post_load(void *opaque, int version_id)
>      for (i = 0; i < DR7_MAX_BP; i++) {
>          hw_breakpoint_insert(env, i);
>      }
> -    tlb_flush(env, 1);
> +    tlb_flush(cs, 1);
>
>      return 0;
>  }
> diff --git a/target-i386/svm_helper.c b/target-i386/svm_helper.c
> index 197269b..c8dd553 100644
> --- a/target-i386/svm_helper.c
> +++ b/target-i386/svm_helper.c
> @@ -265,7 +265,7 @@ void helper_vmrun(CPUX86State *env, int aflag, int 
> next_eip_addend)
>          break;
>      case TLB_CONTROL_FLUSH_ALL_ASID:
>          /* FIXME: this is not 100% correct but should work for now */
> -        tlb_flush(env, 1);
> +        tlb_flush(cs, 1);
>          break;
>      }
>
> diff --git a/target-lm32/cpu.c b/target-lm32/cpu.c
> index 69bc6bb..2d04bae 100644
> --- a/target-lm32/cpu.c
> +++ b/target-lm32/cpu.c
> @@ -56,7 +56,7 @@ static void lm32_cpu_reset(CPUState *s)
>      /* reset cpu state */
>      memset(env, 0, offsetof(CPULM32State, eba));
>
> -    tlb_flush(env, 1);
> +    tlb_flush(s, 1);
>  }
>
>  static void lm32_cpu_realizefn(DeviceState *dev, Error **errp)
> diff --git a/target-m68k/cpu.c b/target-m68k/cpu.c
> index b24120d..096de44 100644
> --- a/target-m68k/cpu.c
> +++ b/target-m68k/cpu.c
> @@ -78,7 +78,7 @@ static void m68k_cpu_reset(CPUState *s)
>      env->cc_op = CC_OP_FLAGS;
>      /* TODO: We should set PC from the interrupt vector.  */
>      env->pc = 0;
> -    tlb_flush(env, 1);
> +    tlb_flush(s, 1);
>  }
>
>  /* CPU models */
> diff --git a/target-microblaze/cpu.c b/target-microblaze/cpu.c
> index d724b6e..5a5fa5b 100644
> --- a/target-microblaze/cpu.c
> +++ b/target-microblaze/cpu.c
> @@ -75,7 +75,7 @@ static void mb_cpu_reset(CPUState *s)
>
>      memset(env, 0, sizeof(CPUMBState));
>      env->res_addr = RES_ADDR_NONE;
> -    tlb_flush(env, 1);
> +    tlb_flush(s, 1);
>
>      /* Disable stack protector.  */
>      env->shr = ~0;
> diff --git a/target-microblaze/mmu.c b/target-microblaze/mmu.c
> index 5b768f2..d10146e 100644
> --- a/target-microblaze/mmu.c
> +++ b/target-microblaze/mmu.c
> @@ -253,7 +253,7 @@ void mmu_write(CPUMBState *env, uint32_t rn, uint32_t v)
>              /* Changes to the zone protection reg flush the QEMU TLB.
>                 Fortunately, these are very uncommon.  */
>              if (v != env->mmu.regs[rn]) {
> -                tlb_flush(env, 1);
> +                tlb_flush(CPU(cpu), 1);
>              }
>              env->mmu.regs[rn] = v;
>              break;
> diff --git a/target-mips/cpu.c b/target-mips/cpu.c
> index 8f26d11..c322f9b 100644
> --- a/target-mips/cpu.c
> +++ b/target-mips/cpu.c
> @@ -102,7 +102,7 @@ static void mips_cpu_reset(CPUState *s)
>      mcc->parent_reset(s);
>
>      memset(env, 0, offsetof(CPUMIPSState, mvp));
> -    tlb_flush(env, 1);
> +    tlb_flush(s, 1);
>
>      cpu_state_reset(env);
>  }
> diff --git a/target-mips/machine.c b/target-mips/machine.c
> index 23504ba..0a07db8 100644
> --- a/target-mips/machine.c
> +++ b/target-mips/machine.c
> @@ -191,6 +191,7 @@ static void load_fpu(QEMUFile *f, CPUMIPSFPUContext *fpu)
>  int cpu_load(QEMUFile *f, void *opaque, int version_id)
>  {
>      CPUMIPSState *env = opaque;
> +    MIPSCPU *cpu = mips_env_get_cpu(env);
>      int i;
>
>      if (version_id != 3)
> @@ -303,6 +304,6 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id)
>          load_fpu(f, &env->fpus[i]);
>
>      /* XXX: ensure compatibility for halted bit ? */
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(cpu), 1);
>      return 0;
>  }
> diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c
> index 14f727f..04fa7a2 100644
> --- a/target-mips/op_helper.c
> +++ b/target-mips/op_helper.c
> @@ -1775,8 +1775,10 @@ target_ulong helper_yield(CPUMIPSState *env, 
> target_ulong arg)
>  /* TLB management */
>  static void cpu_mips_tlb_flush (CPUMIPSState *env, int flush_global)
>  {
> +    MIPSCPU *cpu = mips_env_get_cpu(env);
> +
>      /* Flush qemu's TLB and discard all shadowed entries.  */
> -    tlb_flush (env, flush_global);
> +    tlb_flush(CPU(cpu), flush_global);
>      env->tlb->tlb_in_use = env->tlb->nb_tlb;
>  }
>
> diff --git a/target-moxie/cpu.c b/target-moxie/cpu.c
> index f7d1e6c..708501e 100644
> --- a/target-moxie/cpu.c
> +++ b/target-moxie/cpu.c
> @@ -55,7 +55,7 @@ static void moxie_cpu_reset(CPUState *s)
>      memset(env, 0, sizeof(CPUMoxieState));
>      env->pc = 0x1000;
>
> -    tlb_flush(env, 1);
> +    tlb_flush(s, 1);
>  }
>
>  static void moxie_cpu_realizefn(DeviceState *dev, Error **errp)
> diff --git a/target-openrisc/cpu.c b/target-openrisc/cpu.c
> index 3eae4e9..04dd8eb 100644
> --- a/target-openrisc/cpu.c
> +++ b/target-openrisc/cpu.c
> @@ -68,7 +68,7 @@ static void openrisc_cpu_reset(CPUState *s)
>      memset(&cpu->env, 0, offsetof(CPUOpenRISCState, irq));
>  #endif
>
> -    tlb_flush(&cpu->env, 1);
> +    tlb_flush(s, 1);
>      /*tb_flush(&cpu->env);    FIXME: Do we need it?  */
>
>      cpu->env.pc = 0x100;
> diff --git a/target-openrisc/interrupt.c b/target-openrisc/interrupt.c
> index 52bcc6e..062e205 100644
> --- a/target-openrisc/interrupt.c
> +++ b/target-openrisc/interrupt.c
> @@ -55,7 +55,7 @@ void openrisc_cpu_do_interrupt(CPUState *cs)
>
>      /* For machine-state changed between user-mode and supervisor mode,
>         we need flush TLB when we enter&exit EXCP.  */
> -    tlb_flush(env, 1);
> +    tlb_flush(cs, 1);
>
>      env->esr = env->sr;
>      env->sr &= ~SR_DME;
> diff --git a/target-openrisc/interrupt_helper.c 
> b/target-openrisc/interrupt_helper.c
> index 844648f..8194057 100644
> --- a/target-openrisc/interrupt_helper.c
> +++ b/target-openrisc/interrupt_helper.c
> @@ -51,7 +51,7 @@ void HELPER(rfe)(CPUOpenRISCState *env)
>      }
>
>      if (need_flush_tlb) {
> -        tlb_flush(&cpu->env, 1);
> +        tlb_flush(cs, 1);
>      }
>  #endif
>      cs->interrupt_request |= CPU_INTERRUPT_EXITTB;
> diff --git a/target-openrisc/sys_helper.c b/target-openrisc/sys_helper.c
> index 8f07f78..677f2d7 100644
> --- a/target-openrisc/sys_helper.c
> +++ b/target-openrisc/sys_helper.c
> @@ -45,7 +45,7 @@ void HELPER(mtspr)(CPUOpenRISCState *env,
>      case TO_SPR(0, 17): /* SR */
>          if ((env->sr & (SR_IME | SR_DME | SR_SM)) ^
>              (rb & (SR_IME | SR_DME | SR_SM))) {
> -            tlb_flush(env, 1);
> +            tlb_flush(cs, 1);
>          }
>          env->sr = rb;
>          env->sr |= SR_FO;      /* FO is const equal to 1 */
> diff --git a/target-ppc/excp_helper.c b/target-ppc/excp_helper.c
> index ef67b0e..449e78a 100644
> --- a/target-ppc/excp_helper.c
> +++ b/target-ppc/excp_helper.c
> @@ -609,7 +609,7 @@ static inline void powerpc_excp(PowerPCCPU *cpu, int 
> excp_model, int excp)
>      }
>      /* If we disactivated any translation, flush TLBs */
>      if (msr & ((1 << MSR_IR) | (1 << MSR_DR))) {
> -        tlb_flush(env, 1);
> +        tlb_flush(cs, 1);
>      }
>
>  #ifdef TARGET_PPC64
> @@ -664,7 +664,7 @@ static inline void powerpc_excp(PowerPCCPU *cpu, int 
> excp_model, int excp)
>          /* XXX: The BookE changes address space when switching modes,
>                  we should probably implement that as different MMU indexes,
>                  but for the moment we do it the slow way and flush all.  */
> -        tlb_flush(env, 1);
> +        tlb_flush(cs, 1);
>      }
>  }
>
> diff --git a/target-ppc/helper_regs.h b/target-ppc/helper_regs.h
> index a6d5e2f..a09bf03 100644
> --- a/target-ppc/helper_regs.h
> +++ b/target-ppc/helper_regs.h
> @@ -83,7 +83,7 @@ static inline int hreg_store_msr(CPUPPCState *env, 
> target_ulong value,
>      if (((value >> MSR_IR) & 1) != msr_ir ||
>          ((value >> MSR_DR) & 1) != msr_dr) {
>          /* Flush all tlb when changing translation mode */
> -        tlb_flush(env, 1);
> +        tlb_flush(cs, 1);
>          excp = POWERPC_EXCP_NONE;
>          cs->interrupt_request |= CPU_INTERRUPT_EXITTB;
>      }
> diff --git a/target-ppc/misc_helper.c b/target-ppc/misc_helper.c
> index 616aab6..d04dafd 100644
> --- a/target-ppc/misc_helper.c
> +++ b/target-ppc/misc_helper.c
> @@ -60,10 +60,12 @@ void helper_store_hid0_601(CPUPPCState *env, target_ulong 
> val)
>
>  void helper_store_403_pbr(CPUPPCState *env, uint32_t num, target_ulong value)
>  {
> +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
> +
>      if (likely(env->pb[num] != value)) {
>          env->pb[num] = value;
>          /* Should be optimized */
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>      }
>  }
>
> diff --git a/target-ppc/mmu-hash64.c b/target-ppc/mmu-hash64.c
> index b060e69..74e8ffb 100644
> --- a/target-ppc/mmu-hash64.c
> +++ b/target-ppc/mmu-hash64.c
> @@ -94,6 +94,7 @@ void dump_slb(FILE *f, fprintf_function cpu_fprintf, 
> CPUPPCState *env)
>
>  void helper_slbia(CPUPPCState *env)
>  {
> +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
>      int n, do_invalidate;
>
>      do_invalidate = 0;
> @@ -111,12 +112,13 @@ void helper_slbia(CPUPPCState *env)
>          }
>      }
>      if (do_invalidate) {
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>      }
>  }
>
>  void helper_slbie(CPUPPCState *env, target_ulong addr)
>  {
> +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
>      ppc_slb_t *slb;
>
>      slb = slb_lookup(env, addr);
> @@ -131,7 +133,7 @@ void helper_slbie(CPUPPCState *env, target_ulong addr)
>           *      and we still don't have a tlb_flush_mask(env, n, mask)
>           *      in QEMU, we just invalidate all TLBs
>           */
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>      }
>  }
>
> diff --git a/target-ppc/mmu_helper.c b/target-ppc/mmu_helper.c
> index cf652b7..b0db1ce 100644
> --- a/target-ppc/mmu_helper.c
> +++ b/target-ppc/mmu_helper.c
> @@ -231,6 +231,7 @@ static inline int ppc6xx_tlb_getnum(CPUPPCState *env, 
> target_ulong eaddr,
>
>  static inline void ppc6xx_tlb_invalidate_all(CPUPPCState *env)
>  {
> +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
>      ppc6xx_tlb_t *tlb;
>      int nr, max;
>
> @@ -244,7 +245,7 @@ static inline void ppc6xx_tlb_invalidate_all(CPUPPCState 
> *env)
>          tlb = &env->tlb.tlb6[nr];
>          pte_invalidate(&tlb->pte0);
>      }
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(cpu), 1);
>  }
>
>  static inline void ppc6xx_tlb_invalidate_virt2(CPUPPCState *env,
> @@ -644,6 +645,7 @@ static int ppcemb_tlb_search(CPUPPCState *env, 
> target_ulong address,
>  /* Helpers specific to PowerPC 40x implementations */
>  static inline void ppc4xx_tlb_invalidate_all(CPUPPCState *env)
>  {
> +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
>      ppcemb_tlb_t *tlb;
>      int i;
>
> @@ -651,7 +653,7 @@ static inline void ppc4xx_tlb_invalidate_all(CPUPPCState 
> *env)
>          tlb = &env->tlb.tlbe[i];
>          tlb->prot &= ~PAGE_VALID;
>      }
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(cpu), 1);
>  }
>
>  static inline void ppc4xx_tlb_invalidate_virt(CPUPPCState *env,
> @@ -862,6 +864,7 @@ static int mmubooke_get_physical_address(CPUPPCState 
> *env, mmu_ctx_t *ctx,
>  static void booke206_flush_tlb(CPUPPCState *env, int flags,
>                                 const int check_iprot)
>  {
> +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
>      int tlb_size;
>      int i, j;
>      ppcmas_tlb_t *tlb = env->tlb.tlbm;
> @@ -878,7 +881,7 @@ static void booke206_flush_tlb(CPUPPCState *env, int 
> flags,
>          tlb += booke206_tlb_size(env, i);
>      }
>
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(cpu), 1);
>  }
>
>  static hwaddr booke206_tlb_to_page_size(CPUPPCState *env,
> @@ -1918,7 +1921,7 @@ void ppc_tlb_invalidate_all(CPUPPCState *env)
>          cpu_abort(CPU(cpu), "MPC8xx MMU model is not implemented\n");
>          break;
>      case POWERPC_MMU_BOOKE:
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>          break;
>      case POWERPC_MMU_BOOKE206:
>          booke206_flush_tlb(env, -1, 0);
> @@ -1931,7 +1934,7 @@ void ppc_tlb_invalidate_all(CPUPPCState *env)
>      case POWERPC_MMU_2_06a:
>      case POWERPC_MMU_2_06d:
>  #endif /* defined(TARGET_PPC64) */
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>          break;
>      default:
>          /* XXX: TODO */
> @@ -2009,7 +2012,7 @@ void ppc_tlb_invalidate_one(CPUPPCState *env, 
> target_ulong addr)
>           *      and we still don't have a tlb_flush_mask(env, n, mask) in 
> QEMU,
>           *      we just invalidate all TLBs
>           */
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>          break;
>  #endif /* defined(TARGET_PPC64) */
>      default:
> @@ -2026,6 +2029,8 @@ void ppc_tlb_invalidate_one(CPUPPCState *env, 
> target_ulong addr)
>  /* Special registers manipulation */
>  void ppc_store_sdr1(CPUPPCState *env, target_ulong value)
>  {
> +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
> +
>      LOG_MMU("%s: " TARGET_FMT_lx "\n", __func__, value);
>      if (env->spr[SPR_SDR1] != value) {
>          env->spr[SPR_SDR1] = value;
> @@ -2047,7 +2052,7 @@ void ppc_store_sdr1(CPUPPCState *env, target_ulong 
> value)
>              env->htab_mask = ((value & SDR_32_HTABMASK) << 16) | 0xFFFF;
>              env->htab_base = value & SDR_32_HTABORG;
>          }
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>      }
>  }
>
> @@ -2065,6 +2070,8 @@ target_ulong helper_load_sr(CPUPPCState *env, 
> target_ulong sr_num)
>
>  void helper_store_sr(CPUPPCState *env, target_ulong srnum, target_ulong 
> value)
>  {
> +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
> +
>      LOG_MMU("%s: reg=%d " TARGET_FMT_lx " " TARGET_FMT_lx "\n", __func__,
>              (int)srnum, value, env->sr[srnum]);
>  #if defined(TARGET_PPC64)
> @@ -2097,11 +2104,11 @@ void helper_store_sr(CPUPPCState *env, target_ulong 
> srnum, target_ulong value)
>              page = (16 << 20) * srnum;
>              end = page + (16 << 20);
>              for (; page != end; page += TARGET_PAGE_SIZE) {
> -                tlb_flush_page(env, page);
> +                tlb_flush_page(CPU(cpu), page);
>              }
>          }
>  #else
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>  #endif
>      }
>  }
> @@ -2423,6 +2430,7 @@ target_ulong helper_4xx_tlbsx(CPUPPCState *env, 
> target_ulong address)
>  void helper_440_tlbwe(CPUPPCState *env, uint32_t word, target_ulong entry,
>                        target_ulong value)
>  {
> +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
>      ppcemb_tlb_t *tlb;
>      target_ulong EPN, RPN, size;
>      int do_flush_tlbs;
> @@ -2458,13 +2466,13 @@ void helper_440_tlbwe(CPUPPCState *env, uint32_t 
> word, target_ulong entry,
>          }
>          tlb->PID = env->spr[SPR_440_MMUCR] & 0x000000FF;
>          if (do_flush_tlbs) {
> -            tlb_flush(env, 1);
> +            tlb_flush(CPU(cpu), 1);
>          }
>          break;
>      case 1:
>          RPN = value & 0xFFFFFC0F;
>          if ((tlb->prot & PAGE_VALID) && tlb->RPN != RPN) {
> -            tlb_flush(env, 1);
> +            tlb_flush(CPU(cpu), 1);
>          }
>          tlb->RPN = RPN;
>          break;
> @@ -2576,9 +2584,11 @@ static ppcmas_tlb_t *booke206_cur_tlb(CPUPPCState *env)
>
>  void helper_booke_setpid(CPUPPCState *env, uint32_t pidn, target_ulong pid)
>  {
> +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
> +
>      env->spr[pidn] = pid;
>      /* changing PIDs mean we're in a different address space now */
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(cpu), 1);
>  }
>
>  void helper_booke206_tlbwe(CPUPPCState *env)
> @@ -2673,7 +2683,7 @@ void helper_booke206_tlbwe(CPUPPCState *env)
>      if (booke206_tlb_to_page_size(env, tlb) == TARGET_PAGE_SIZE) {
>          tlb_flush_page(CPU(cpu), tlb->mas2 & MAS2_EPN_MASK);
>      } else {
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>      }
>  }
>
> @@ -2797,7 +2807,7 @@ void helper_booke206_tlbivax(CPUPPCState *env, 
> target_ulong address)
>      if (address & 0x8) {
>          /* flush TLB1 entries */
>          booke206_invalidate_ea_tlb(env, 1, address);
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>      } else {
>          /* flush TLB0 entries */
>          booke206_invalidate_ea_tlb(env, 0, address);
> @@ -2813,6 +2823,7 @@ void helper_booke206_tlbilx0(CPUPPCState *env, 
> target_ulong address)
>
>  void helper_booke206_tlbilx1(CPUPPCState *env, target_ulong address)
>  {
> +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
>      int i, j;
>      int tid = (env->spr[SPR_BOOKE_MAS6] & MAS6_SPID);
>      ppcmas_tlb_t *tlb = env->tlb.tlbm;
> @@ -2829,11 +2840,12 @@ void helper_booke206_tlbilx1(CPUPPCState *env, 
> target_ulong address)
>          }
>          tlb += booke206_tlb_size(env, i);
>      }
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(cpu), 1);
>  }
>
>  void helper_booke206_tlbilx3(CPUPPCState *env, target_ulong address)
>  {
> +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
>      int i, j;
>      ppcmas_tlb_t *tlb;
>      int tid = (env->spr[SPR_BOOKE_MAS6] & MAS6_SPID);
> @@ -2869,7 +2881,7 @@ void helper_booke206_tlbilx3(CPUPPCState *env, 
> target_ulong address)
>              tlb->mas1 &= ~MAS1_VALID;
>          }
>      }
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(cpu), 1);
>  }
>
>  void helper_booke206_tlbflush(CPUPPCState *env, uint32_t type)
> diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
> index 1df82c5..eb8b7e7 100644
> --- a/target-ppc/translate_init.c
> +++ b/target-ppc/translate_init.c
> @@ -8521,7 +8521,7 @@ static void ppc_cpu_reset(CPUState *s)
>  #endif /* TARGET_PPC64 */
>
>      /* Flush all TLBs */
> -    tlb_flush(env, 1);
> +    tlb_flush(s, 1);
>  }
>
>  static void ppc_cpu_initfn(Object *obj)
> diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c
> index d9b8470..608df5e 100644
> --- a/target-s390x/cpu.c
> +++ b/target-s390x/cpu.c
> @@ -113,14 +113,13 @@ static void s390_cpu_reset(CPUState *s)
>  {
>      S390CPU *cpu = S390_CPU(s);
>      S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
> -    CPUS390XState *env = &cpu->env;
>
>      s390_del_running_cpu(cpu);
>      scc->parent_reset(s);
>  #if !defined(CONFIG_USER_ONLY)
>      s->halted = 1;
>  #endif
> -    tlb_flush(env, 1);
> +    tlb_flush(s, 1);
>  }
>
>  /* S390CPUClass::initial_reset() */
> @@ -161,7 +160,7 @@ static void s390_cpu_full_reset(CPUState *s)
>  #if !defined(CONFIG_USER_ONLY)
>      s->halted = 1;
>  #endif
> -    tlb_flush(env, 1);
> +    tlb_flush(s, 1);
>  }
>
>  #if !defined(CONFIG_USER_ONLY)
> diff --git a/target-s390x/mem_helper.c b/target-s390x/mem_helper.c
> index 6bff6cc..bae6a5b 100644
> --- a/target-s390x/mem_helper.c
> +++ b/target-s390x/mem_helper.c
> @@ -810,6 +810,7 @@ void HELPER(tr)(CPUS390XState *env, uint32_t len, 
> uint64_t array,
>  #if !defined(CONFIG_USER_ONLY)
>  void HELPER(lctlg)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3)
>  {
> +    S390CPU *cpu = s390_env_get_cpu(env);
>      int i;
>      uint64_t src = a2;
>
> @@ -824,11 +825,12 @@ void HELPER(lctlg)(CPUS390XState *env, uint32_t r1, 
> uint64_t a2, uint32_t r3)
>          }
>      }
>
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(cpu), 1);
>  }
>
>  void HELPER(lctl)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3)
>  {
> +    S390CPU *cpu = s390_env_get_cpu(env);
>      int i;
>      uint64_t src = a2;
>
> @@ -842,7 +844,7 @@ void HELPER(lctl)(CPUS390XState *env, uint32_t r1, 
> uint64_t a2, uint32_t r3)
>          }
>      }
>
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(cpu), 1);
>  }
>
>  void HELPER(stctg)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3)
> @@ -935,6 +937,7 @@ uint32_t HELPER(rrbe)(CPUS390XState *env, uint64_t r2)
>  /* compare and swap and purge */
>  uint32_t HELPER(csp)(CPUS390XState *env, uint32_t r1, uint64_t r2)
>  {
> +    S390CPU *cpu = s390_env_get_cpu(env);
>      uint32_t cc;
>      uint32_t o1 = env->regs[r1];
>      uint64_t a2 = r2 & ~3ULL;
> @@ -944,7 +947,7 @@ uint32_t HELPER(csp)(CPUS390XState *env, uint32_t r1, 
> uint64_t r2)
>          cpu_stl_data(env, a2, env->regs[(r1 + 1) & 15]);
>          if (r2 & 0x3) {
>              /* flush TLB / ALB */
> -            tlb_flush(env, 1);
> +            tlb_flush(CPU(cpu), 1);
>          }
>          cc = 0;
>      } else {
> @@ -1039,7 +1042,9 @@ void HELPER(ipte)(CPUS390XState *env, uint64_t 
> pte_addr, uint64_t vaddr)
>  /* flush local tlb */
>  void HELPER(ptlb)(CPUS390XState *env)
>  {
> -    tlb_flush(env, 1);
> +    S390CPU *cpu = s390_env_get_cpu(env);
> +
> +    tlb_flush(CPU(cpu), 1);
>  }
>
>  /* store using real address */
> diff --git a/target-sh4/cpu.c b/target-sh4/cpu.c
> index fb176bf..05720f1 100644
> --- a/target-sh4/cpu.c
> +++ b/target-sh4/cpu.c
> @@ -77,7 +77,7 @@ static void superh_cpu_reset(CPUState *s)
>      scc->parent_reset(s);
>
>      memset(env, 0, offsetof(CPUSH4State, id));
> -    tlb_flush(env, 1);
> +    tlb_flush(s, 1);
>
>      env->pc = 0xA0000000;
>  #if defined(CONFIG_USER_ONLY)
> diff --git a/target-sh4/helper.c b/target-sh4/helper.c
> index c56e543..9ebdd5c 100644
> --- a/target-sh4/helper.c
> +++ b/target-sh4/helper.c
> @@ -585,7 +585,7 @@ void cpu_load_tlb(CPUSH4State * env)
>          entry->v = 0;
>      }
>
> -    tlb_flush(s, 1);
> +    tlb_flush(CPU(sh_env_get_cpu(s)), 1);
>  }
>
>  uint32_t cpu_sh4_read_mmaped_itlb_addr(CPUSH4State *s,
> diff --git a/target-sparc/cpu.c b/target-sparc/cpu.c
> index 6c1ff68..e1f6e61 100644
> --- a/target-sparc/cpu.c
> +++ b/target-sparc/cpu.c
> @@ -33,7 +33,7 @@ static void sparc_cpu_reset(CPUState *s)
>      scc->parent_reset(s);
>
>      memset(env, 0, offsetof(CPUSPARCState, version));
> -    tlb_flush(env, 1);
> +    tlb_flush(s, 1);
>      env->cwp = 0;
>  #ifndef TARGET_SPARC64
>      env->wim = 1;
> diff --git a/target-sparc/ldst_helper.c b/target-sparc/ldst_helper.c
> index 44c54f1..bf75ceb 100644
> --- a/target-sparc/ldst_helper.c
> +++ b/target-sparc/ldst_helper.c
> @@ -865,7 +865,7 @@ void helper_st_asi(CPUSPARCState *env, target_ulong addr, 
> uint64_t val, int asi,
>              case 2: /* flush region (16M) */
>              case 3: /* flush context (4G) */
>              case 4: /* flush entire */
> -                tlb_flush(env, 1);
> +                tlb_flush(CPU(cpu), 1);
>                  break;
>              default:
>                  break;
> @@ -890,7 +890,7 @@ void helper_st_asi(CPUSPARCState *env, target_ulong addr, 
> uint64_t val, int asi,
>                     disabled mode are invalid in normal mode */
>                  if ((oldreg & (MMU_E | MMU_NF | env->def->mmu_bm)) !=
>                      (env->mmuregs[reg] & (MMU_E | MMU_NF | 
> env->def->mmu_bm))) {
> -                    tlb_flush(env, 1);
> +                    tlb_flush(CPU(cpu), 1);
>                  }
>                  break;
>              case 1: /* Context Table Pointer Register */
> @@ -901,7 +901,7 @@ void helper_st_asi(CPUSPARCState *env, target_ulong addr, 
> uint64_t val, int asi,
>                  if (oldreg != env->mmuregs[reg]) {
>                      /* we flush when the MMU context changes because
>                         QEMU has no MMU context support */
> -                    tlb_flush(env, 1);
> +                    tlb_flush(CPU(cpu), 1);
>                  }
>                  break;
>              case 3: /* Synchronous Fault Status Register with Clear */
> @@ -1657,6 +1657,8 @@ uint64_t helper_ld_asi(CPUSPARCState *env, target_ulong 
> addr, int asi, int size,
>  void helper_st_asi(CPUSPARCState *env, target_ulong addr, target_ulong val,
>                     int asi, int size)
>  {
> +    SPARCCPU *cpu = sparc_env_get_cpu(env);
> +
>  #ifdef DEBUG_ASI
>      dump_asi("write", addr, asi, size, val);
>  #endif
> @@ -1865,7 +1867,7 @@ void helper_st_asi(CPUSPARCState *env, target_ulong 
> addr, target_ulong val,
>  #ifdef DEBUG_MMU
>                  dump_mmu(stdout, fprintf, env);
>  #endif
> -                tlb_flush(env, 1);
> +                tlb_flush(CPU(cpu), 1);
>              }
>              return;
>          }
> @@ -1954,13 +1956,13 @@ void helper_st_asi(CPUSPARCState *env, target_ulong 
> addr, target_ulong val,
>                  env->dmmu.mmu_primary_context = val;
>                  /* can be optimized to only flush MMU_USER_IDX
>                     and MMU_KERNEL_IDX entries */
> -                tlb_flush(env, 1);
> +                tlb_flush(CPU(cpu), 1);
>                  break;
>              case 2: /* Secondary context */
>                  env->dmmu.mmu_secondary_context = val;
>                  /* can be optimized to only flush MMU_USER_SECONDARY_IDX
>                     and MMU_KERNEL_SECONDARY_IDX entries */
> -                tlb_flush(env, 1);
> +                tlb_flush(CPU(cpu), 1);
>                  break;
>              case 5: /* TSB access */
>                  DPRINTF_MMU("dmmu TSB write: 0x%016" PRIx64 " -> 0x%016"
> @@ -2389,7 +2391,7 @@ void sparc_cpu_unassigned_access(CPUState *cs, hwaddr 
> addr,
>      /* flush neverland mappings created during no-fault mode,
>         so the sequential MMU faults report proper fault types */
>      if (env->mmuregs[0] & MMU_NF) {
> -        tlb_flush(env, 1);
> +        tlb_flush(cs, 1);
>      }
>  }
>  #else
> diff --git a/target-sparc/machine.c b/target-sparc/machine.c
> index a353dab..3f3de4c 100644
> --- a/target-sparc/machine.c
> +++ b/target-sparc/machine.c
> @@ -112,6 +112,7 @@ void cpu_save(QEMUFile *f, void *opaque)
>  int cpu_load(QEMUFile *f, void *opaque, int version_id)
>  {
>      CPUSPARCState *env = opaque;
> +    SPARCCPU *cpu = sparc_env_get_cpu(env);
>      int i;
>      uint32_t tmp;
>
> @@ -212,6 +213,6 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id)
>      qemu_get_be64s(f, &env->ssr);
>      cpu_get_timer(f, env->hstick);
>  #endif
> -    tlb_flush(env, 1);
> +    tlb_flush(CPU(cpu), 1);
>      return 0;
>  }
> diff --git a/target-unicore32/cpu.c b/target-unicore32/cpu.c
> index dcf3b16..a317217 100644
> --- a/target-unicore32/cpu.c
> +++ b/target-unicore32/cpu.c
> @@ -141,7 +141,7 @@ static void uc32_cpu_initfn(Object *obj)
>      env->regs[31] = 0x03000000;
>  #endif
>
> -    tlb_flush(env, 1);
> +    tlb_flush(cs, 1);
>
>      if (tcg_enabled() && !inited) {
>          inited = true;
> diff --git a/target-unicore32/helper.c b/target-unicore32/helper.c
> index f91ed93..8de6a33 100644
> --- a/target-unicore32/helper.c
> +++ b/target-unicore32/helper.c
> @@ -57,6 +57,8 @@ uint32_t HELPER(clz)(uint32_t x)
>  void helper_cp0_set(CPUUniCore32State *env, uint32_t val, uint32_t creg,
>          uint32_t cop)
>  {
> +    UniCore32CPU *cpu = uc32_env_get_cpu(env);
> +
>      /*
>       * movc pp.nn, rn, #imm9
>       *      rn: UCOP_REG_D
> @@ -125,7 +127,7 @@ void helper_cp0_set(CPUUniCore32State *env, uint32_t val, 
> uint32_t creg,
>      case 6:
>          if ((cop <= 6) && (cop >= 2)) {
>              /* invalid all tlb */
> -            tlb_flush(env, 1);
> +            tlb_flush(CPU(cpu), 1);
>              return;
>          }
>          break;
> diff --git a/target-xtensa/op_helper.c b/target-xtensa/op_helper.c
> index 5771841..70937b6 100644
> --- a/target-xtensa/op_helper.c
> +++ b/target-xtensa/op_helper.c
> @@ -479,10 +479,12 @@ void HELPER(check_atomctl)(CPUXtensaState *env, 
> uint32_t pc, uint32_t vaddr)
>
>  void HELPER(wsr_rasid)(CPUXtensaState *env, uint32_t v)
>  {
> +    XtensaCPU *cpu = xtensa_env_get_cpu(env);
> +
>      v = (v & 0xffffff00) | 0x1;
>      if (v != env->sregs[RASID]) {
>          env->sregs[RASID] = v;
> -        tlb_flush(env, 1);
> +        tlb_flush(CPU(cpu), 1);
>      }
>  }

target-openrisc: Tested-by: Jia Liu <address@hidden>

>
> --
> 1.8.1.4
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]