qemu-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]