From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:32886) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZTfZ3-0006v8-TO for qemu-devel@nongnu.org; Sun, 23 Aug 2015 20:24:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZTfZ1-0000go-Kf for qemu-devel@nongnu.org; Sun, 23 Aug 2015 20:24:41 -0400 Received: from out4-smtp.messagingengine.com ([66.111.4.28]:57183) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZTfZ1-0000gj-Gh for qemu-devel@nongnu.org; Sun, 23 Aug 2015 20:24:39 -0400 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.nyi.internal (Postfix) with ESMTP id 53FAA20247 for ; Sun, 23 Aug 2015 20:24:39 -0400 (EDT) From: "Emilio G. Cota" Date: Sun, 23 Aug 2015 20:23:43 -0400 Message-Id: <1440375847-17603-15-git-send-email-cota@braap.org> In-Reply-To: <1440375847-17603-1-git-send-email-cota@braap.org> References: <1440375847-17603-1-git-send-email-cota@braap.org> Subject: [Qemu-devel] [RFC 14/38] softmmu: add helpers to get ld/st physical addresses List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, mttcg@listserver.greensocs.com Cc: mark.burton@greensocs.com, a.rigo@virtualopensystems.com, guillaume.delbergue@greensocs.com, pbonzini@redhat.com, alex.bennee@linaro.org, Frederic Konrad This will be used by the atomic instruction emulation code. Signed-off-by: Emilio G. Cota --- 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