[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC 10/30] cpu_ldst: add cpu_atomic helpers
From: |
Emilio G. Cota |
Subject: |
[Qemu-devel] [RFC 10/30] cpu_ldst: add cpu_atomic helpers |
Date: |
Mon, 27 Jun 2016 15:01:56 -0400 |
Signed-off-by: Emilio G. Cota <address@hidden>
---
include/exec/cpu_atomic_template.h | 41 +++++++++++++++++++++++++++++
include/exec/cpu_atomic_useronly_template.h | 25 ++++++++++++++++++
2 files changed, 66 insertions(+)
diff --git a/include/exec/cpu_atomic_template.h
b/include/exec/cpu_atomic_template.h
index 13f4ffd..36c9593 100644
--- a/include/exec/cpu_atomic_template.h
+++ b/include/exec/cpu_atomic_template.h
@@ -54,3 +54,44 @@ glue(glue(cpu_cmpxchgo, MEMSUFFIX), _ra)(CPUArchState *env,
target_ulong ptr,
return ret;
}
#endif
+
+#define GEN_ATOMIC_HELPER(NAME) \
+static inline DATA_TYPE \
+glue(glue(glue(glue(cpu_atomic_, NAME), SUFFIX), MEMSUFFIX), \
+ _ra)(CPUArchState *env, target_ulong ptr, DATA_TYPE val, uintptr_t ra) \
+{ \
+ int page_index; \
+ target_ulong addr; \
+ int mmu_idx; \
+ TCGMemOpIdx oi; \
+ \
+ addr = ptr; \
+ page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); \
+ mmu_idx = CPU_MMU_INDEX; \
+ if (unlikely(env->tlb_table[mmu_idx][page_index].addr_write != \
+ (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) { \
+ oi = make_memop_idx(SHIFT, mmu_idx); \
+ return glue(glue(glue(helper_atomic_, NAME), SUFFIX), \
+ MMUSUFFIX)(env, addr, val, oi, ra); \
+ } else { \
+ uintptr_t hostaddr = addr + \
+ env->tlb_table[mmu_idx][page_index].addend; \
+ \
+ return glue(atomic_, NAME)((DATA_TYPE *)hostaddr, val); \
+ } \
+}
+
+GEN_ATOMIC_HELPER(fetch_add)
+GEN_ATOMIC_HELPER(fetch_sub)
+GEN_ATOMIC_HELPER(fetch_and)
+GEN_ATOMIC_HELPER(fetch_or)
+GEN_ATOMIC_HELPER(fetch_xor)
+
+GEN_ATOMIC_HELPER(add_fetch)
+GEN_ATOMIC_HELPER(sub_fetch)
+GEN_ATOMIC_HELPER(and_fetch)
+GEN_ATOMIC_HELPER(or_fetch)
+GEN_ATOMIC_HELPER(xor_fetch)
+
+GEN_ATOMIC_HELPER(xchg)
+#undef GEN_ATOMIC_HELPER
diff --git a/include/exec/cpu_atomic_useronly_template.h
b/include/exec/cpu_atomic_useronly_template.h
index c7c0a3e..c4b447e 100644
--- a/include/exec/cpu_atomic_useronly_template.h
+++ b/include/exec/cpu_atomic_useronly_template.h
@@ -37,3 +37,28 @@ glue(glue(cpu_cmpxchgo, MEMSUFFIX),
return ret;
}
#endif
+
+#define GEN_ATOMIC_HELPER(NAME) \
+static inline DATA_TYPE \
+glue(glue(glue(glue(cpu_atomic_, NAME), SUFFIX), MEMSUFFIX), \
+ _ra)(CPUArchState *env, target_ulong ptr, DATA_TYPE val, uintptr_t ra) \
+{ \
+ DATA_TYPE *hostaddr = g2h(ptr); \
+ \
+ return glue(atomic_, NAME)(hostaddr, val); \
+}
+
+GEN_ATOMIC_HELPER(fetch_add)
+GEN_ATOMIC_HELPER(fetch_sub)
+GEN_ATOMIC_HELPER(fetch_and)
+GEN_ATOMIC_HELPER(fetch_or)
+GEN_ATOMIC_HELPER(fetch_xor)
+
+GEN_ATOMIC_HELPER(add_fetch)
+GEN_ATOMIC_HELPER(sub_fetch)
+GEN_ATOMIC_HELPER(and_fetch)
+GEN_ATOMIC_HELPER(or_fetch)
+GEN_ATOMIC_HELPER(xor_fetch)
+
+GEN_ATOMIC_HELPER(xchg)
+#undef GEN_ATOMIC_HELPER
--
2.5.0
- [Qemu-devel] [RFC 03/30] cpu_ldst: add cpu_cmpxchg helpers, (continued)
- [Qemu-devel] [RFC 12/30] target-i386: emulate LOCK'ed OP instructions using atomic helpers, Emilio G. Cota, 2016/06/27
- [Qemu-devel] [RFC 09/30] softmmu: add atomic helpers, Emilio G. Cota, 2016/06/27
- [Qemu-devel] [RFC 07/30] atomics: add atomic_xor, Emilio G. Cota, 2016/06/27
- [Qemu-devel] [RFC 08/30] atomics: add atomic_op_fetch variants, Emilio G. Cota, 2016/06/27
- [Qemu-devel] [RFC 14/30] target-i386: emulate LOCK'ed NOT using atomic helper, Emilio G. Cota, 2016/06/27
- [Qemu-devel] [RFC 10/30] cpu_ldst: add cpu_atomic helpers,
Emilio G. Cota <=
- [Qemu-devel] [RFC 11/30] target-i386: add atomic helpers, Emilio G. Cota, 2016/06/27
- [Qemu-devel] [RFC 06/30] target-i386: emulate LOCK'ed cmpxchg8b/16b using cmpxchg helpers, Emilio G. Cota, 2016/06/27
- [Qemu-devel] [RFC 05/30] target-i386: emulate LOCK'ed cmpxchg using cmpxchg helpers, Emilio G. Cota, 2016/06/27
- [Qemu-devel] [RFC 13/30] target-i386: emulate LOCK'ed INC using atomic helper, Emilio G. Cota, 2016/06/27
- [Qemu-devel] [RFC 15/30] target-i386: emulate LOCK'ed NEG using cmpxchg helper, Emilio G. Cota, 2016/06/27
- [Qemu-devel] [RFC 27/30] target-arm: emulate aarch64's LL/SC using cmpxchg helpers, Emilio G. Cota, 2016/06/27
- [Qemu-devel] [RFC 25/30] helper: add DEF_HELPER_6, Emilio G. Cota, 2016/06/27
- [Qemu-devel] [RFC 16/30] target-i386: emulate LOCK'ed XADD using atomic helper, Emilio G. Cota, 2016/06/27