[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC 2/8] softmmu: add helpers to get ld/st physical addres
From: |
Emilio G. Cota |
Subject: |
[Qemu-devel] [RFC 2/8] softmmu: add helpers to get ld/st physical addresses |
Date: |
Fri, 8 May 2015 17:02:08 -0400 |
This will be used by the atomic instruction emulation code.
Signed-off-by: Emilio G. Cota <address@hidden>
---
softmmu_template.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
tcg/tcg.h | 5 +++++
2 files changed, 53 insertions(+)
diff --git a/softmmu_template.h b/softmmu_template.h
index 16b0852..cf33d77 100644
--- a/softmmu_template.h
+++ b/softmmu_template.h
@@ -465,6 +465,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,
int mmu_idx, uintptr_t retaddr)
diff --git a/tcg/tcg.h b/tcg/tcg.h
index fbb3daf..e84cf45 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -930,6 +930,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,
int mmu_idx, 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.8.3
- [Qemu-devel] [RFC 0/8] Helper-based Atomic Instruction Emulation (AIE), Emilio G. Cota, 2015/05/08
- [Qemu-devel] [RFC 1/8] cputlb: add physical address to CPUTLBEntry, Emilio G. Cota, 2015/05/08
- [Qemu-devel] [RFC 3/8] tiny_set: add module to test for membership in a tiny set of pointers, Emilio G. Cota, 2015/05/08
- [Qemu-devel] [RFC 2/8] softmmu: add helpers to get ld/st physical addresses,
Emilio G. Cota <=
- [Qemu-devel] [RFC 4/8] radix-tree: add generic lockless radix tree module, Emilio G. Cota, 2015/05/08
- [Qemu-devel] [RFC 5/8] aie: add module for Atomic Instruction Emulation, Emilio G. Cota, 2015/05/08
- [Qemu-devel] [RFC 6/8] aie: add target helpers, Emilio G. Cota, 2015/05/08
- [Qemu-devel] [RFC 7/8] target-arm: emulate atomic instructions using AIE, Emilio G. Cota, 2015/05/08
- [Qemu-devel] [RFC 8/8] target-i386: emulate atomic instructions using AIE, Emilio G. Cota, 2015/05/08
- Re: [Qemu-devel] [RFC 0/8] Helper-based Atomic Instruction Emulation (AIE), Frederic Konrad, 2015/05/11