On 23/08/2015 17:23, Emilio G. Cota wrote: > This will be used by the atomic instruction emulation code.
Is this a fast path? If not, we can use the existing addend field and convert the host address to a ram_addr_t easily. Paolo > Signed-off-by: Emilio G. Cota <c...@braap.org> > --- > softmmu_template.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ > tcg/tcg.h | 5 +++++ > 2 files changed, 53 insertions(+) > > diff --git a/softmmu_template.h b/softmmu_template.h > index b66eaf8..6496a8a 100644 > --- a/softmmu_template.h > +++ b/softmmu_template.h > @@ -480,6 +480,54 @@ void helper_le_st_name(CPUArchState *env, target_ulong > addr, DATA_TYPE val, > #endif > } > > +#if DATA_SIZE == 1 > + > +/* get a load's physical address */ > +hwaddr helper_ret_get_ld_phys(CPUArchState *env, target_ulong addr, > + int mmu_idx, uintptr_t retaddr) > +{ > + int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); > + CPUTLBEntry *te = &env->tlb_table[mmu_idx][index]; > + target_ulong taddr; > + target_ulong phys_addr; > + > + retaddr -= GETPC_ADJ; > + taddr = te->addr_read & (TARGET_PAGE_MASK | TLB_INVALID_MASK); > + if (taddr != (addr & TARGET_PAGE_MASK)) { > + if (!VICTIM_TLB_HIT(addr_read)) { > + CPUState *cs = ENV_GET_CPU(env); > + > + tlb_fill(cs, addr, MMU_DATA_LOAD, mmu_idx, retaddr); > + } > + } > + phys_addr = te->addr_phys; > + return phys_addr | (addr & ~TARGET_PAGE_MASK); > +} > + > +/* get a store's physical address */ > +hwaddr helper_ret_get_st_phys(CPUArchState *env, target_ulong addr, > + int mmu_idx, uintptr_t retaddr) > +{ > + int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); > + CPUTLBEntry *te = &env->tlb_table[mmu_idx][index]; > + target_ulong taddr; > + target_ulong phys_addr; > + > + retaddr -= GETPC_ADJ; > + taddr = te->addr_write & (TARGET_PAGE_MASK | TLB_INVALID_MASK); > + if (taddr != (addr & TARGET_PAGE_MASK)) { > + if (!VICTIM_TLB_HIT(addr_write)) { > + CPUState *cs = ENV_GET_CPU(env); > + > + tlb_fill(cs, addr, MMU_DATA_STORE, mmu_idx, retaddr); > + } > + } > + phys_addr = te->addr_phys; > + return phys_addr | (addr & ~TARGET_PAGE_MASK); > +} > + > +#endif /* DATA_SIZE == 1 */ > + > #if DATA_SIZE > 1 > void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val, > TCGMemOpIdx oi, uintptr_t retaddr) > diff --git a/tcg/tcg.h b/tcg/tcg.h > index 66b36f2..8d30d61 100644 > --- a/tcg/tcg.h > +++ b/tcg/tcg.h > @@ -992,6 +992,11 @@ void helper_be_stl_mmu(CPUArchState *env, target_ulong > addr, uint32_t val, > void helper_be_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val, > TCGMemOpIdx oi, uintptr_t retaddr); > > +hwaddr helper_ret_get_ld_phys(CPUArchState *env, target_ulong addr, > + int mmu_idx, uintptr_t retaddr); > +hwaddr helper_ret_get_st_phys(CPUArchState *env, target_ulong addr, > + int mmu_idx, uintptr_t retaddr); > + > /* Temporary aliases until backends are converted. */ > #ifdef TARGET_WORDS_BIGENDIAN > # define helper_ret_ldsw_mmu helper_be_ldsw_mmu >