2 * Common Atomic Helper Functions
4 * This file should be included before the various instantiations of
5 * the atomic_template.h helpers.
7 * Copyright (c) 2019 Linaro
8 * Written by Alex Bennée <alex.bennee@linaro.org>
10 * SPDX-License-Identifier: GPL-2.0-or-later
12 * This work is licensed under the terms of the GNU GPL, version 2 or later.
13 * See the COPYING file in the top-level directory.
16 static void atomic_trace_rmw_pre(CPUArchState *env, target_ulong addr,
19 CPUState *cpu = env_cpu(env);
20 uint16_t info = trace_mem_get_info(oi, false);
22 trace_guest_mem_before_exec(cpu, addr, info);
23 trace_guest_mem_before_exec(cpu, addr, info | TRACE_MEM_ST);
26 static void atomic_trace_rmw_post(CPUArchState *env, target_ulong addr,
29 qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_RW);
33 static void atomic_trace_ld_pre(CPUArchState *env, target_ulong addr,
36 uint16_t info = trace_mem_get_info(oi, false);
38 trace_guest_mem_before_exec(env_cpu(env), addr, info);
41 static void atomic_trace_ld_post(CPUArchState *env, target_ulong addr,
44 qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_R);
47 static void atomic_trace_st_pre(CPUArchState *env, target_ulong addr,
50 uint16_t info = trace_mem_get_info(oi, true);
52 trace_guest_mem_before_exec(env_cpu(env), addr, info);
55 static void atomic_trace_st_post(CPUArchState *env, target_ulong addr,
58 qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_W);
63 * Atomic helpers callable from TCG.
64 * These have a common interface and all defer to cpu_atomic_*
65 * using the host return address from GETPC().
68 #define CMPXCHG_HELPER(OP, TYPE) \
69 TYPE HELPER(atomic_##OP)(CPUArchState *env, target_ulong addr, \
70 TYPE oldv, TYPE newv, uint32_t oi) \
71 { return cpu_atomic_##OP##_mmu(env, addr, oldv, newv, oi, GETPC()); }
73 CMPXCHG_HELPER(cmpxchgb, uint32_t)
74 CMPXCHG_HELPER(cmpxchgw_be, uint32_t)
75 CMPXCHG_HELPER(cmpxchgw_le, uint32_t)
76 CMPXCHG_HELPER(cmpxchgl_be, uint32_t)
77 CMPXCHG_HELPER(cmpxchgl_le, uint32_t)
79 #ifdef CONFIG_ATOMIC64
80 CMPXCHG_HELPER(cmpxchgq_be, uint64_t)
81 CMPXCHG_HELPER(cmpxchgq_le, uint64_t)
86 #define ATOMIC_HELPER(OP, TYPE) \
87 TYPE HELPER(glue(atomic_,OP))(CPUArchState *env, target_ulong addr, \
88 TYPE val, uint32_t oi) \
89 { return glue(glue(cpu_atomic_,OP),_mmu)(env, addr, val, oi, GETPC()); }
91 #ifdef CONFIG_ATOMIC64
92 #define GEN_ATOMIC_HELPERS(OP) \
93 ATOMIC_HELPER(glue(OP,b), uint32_t) \
94 ATOMIC_HELPER(glue(OP,w_be), uint32_t) \
95 ATOMIC_HELPER(glue(OP,w_le), uint32_t) \
96 ATOMIC_HELPER(glue(OP,l_be), uint32_t) \
97 ATOMIC_HELPER(glue(OP,l_le), uint32_t) \
98 ATOMIC_HELPER(glue(OP,q_be), uint64_t) \
99 ATOMIC_HELPER(glue(OP,q_le), uint64_t)
101 #define GEN_ATOMIC_HELPERS(OP) \
102 ATOMIC_HELPER(glue(OP,b), uint32_t) \
103 ATOMIC_HELPER(glue(OP,w_be), uint32_t) \
104 ATOMIC_HELPER(glue(OP,w_le), uint32_t) \
105 ATOMIC_HELPER(glue(OP,l_be), uint32_t) \
106 ATOMIC_HELPER(glue(OP,l_le), uint32_t)
109 GEN_ATOMIC_HELPERS(fetch_add)
110 GEN_ATOMIC_HELPERS(fetch_and)
111 GEN_ATOMIC_HELPERS(fetch_or)
112 GEN_ATOMIC_HELPERS(fetch_xor)
113 GEN_ATOMIC_HELPERS(fetch_smin)
114 GEN_ATOMIC_HELPERS(fetch_umin)
115 GEN_ATOMIC_HELPERS(fetch_smax)
116 GEN_ATOMIC_HELPERS(fetch_umax)
118 GEN_ATOMIC_HELPERS(add_fetch)
119 GEN_ATOMIC_HELPERS(and_fetch)
120 GEN_ATOMIC_HELPERS(or_fetch)
121 GEN_ATOMIC_HELPERS(xor_fetch)
122 GEN_ATOMIC_HELPERS(smin_fetch)
123 GEN_ATOMIC_HELPERS(umin_fetch)
124 GEN_ATOMIC_HELPERS(smax_fetch)
125 GEN_ATOMIC_HELPERS(umax_fetch)
127 GEN_ATOMIC_HELPERS(xchg)
130 #undef GEN_ATOMIC_HELPERS