This will be used by the atomic instruction emulation code.
Signed-off-by: Emilio G. Cota <[email protected]>
---
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