This will be used by the atomic instruction emulation code. 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 -- 1.9.1