From da01e53757a22c21dcb86ad40b2bdcd7346646e7 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 27 Feb 2018 21:20:25 -0500 Subject: [PATCH] tcg: Add atomic128 helpers Force the use of cmpxchg16b on x86_64. Wikipedia suggests that only very old AMD64 (circa 2004) did not have this instruction. Further, it's required by Windows 8 so no new cpus will ever omit it. If we truely care about these, then we could check this at startup time and then avoid executing paths that use it. Backports commit 7ebee43ee3e2fcd7b5063058b7ef74bc43216733 from qemu --- qemu/aarch64.h | 12 ++++++++++++ qemu/aarch64eb.h | 12 ++++++++++++ qemu/arm.h | 12 ++++++++++++ qemu/armeb.h | 12 ++++++++++++ qemu/atomic_template.h | 40 +++++++++++++++++++++++++++++++++++++- qemu/configure | 29 ++++++++++++++++++++++++++- qemu/cputlb.c | 5 +++++ qemu/header_gen.py | 12 ++++++++++++ qemu/include/qemu/int128.h | 6 ++++++ qemu/m68k.h | 12 ++++++++++++ qemu/mips.h | 12 ++++++++++++ qemu/mips64.h | 12 ++++++++++++ qemu/mips64el.h | 12 ++++++++++++ qemu/mipsel.h | 12 ++++++++++++ qemu/powerpc.h | 12 ++++++++++++ qemu/sparc.h | 12 ++++++++++++ qemu/sparc64.h | 12 ++++++++++++ qemu/tcg-runtime.c | 18 +++++++++++++++++ qemu/tcg/tcg.h | 23 ++++++++++++++++++++++ qemu/x86_64.h | 12 ++++++++++++ 20 files changed, 287 insertions(+), 2 deletions(-) diff --git a/qemu/aarch64.h b/qemu/aarch64.h index 19bd2902..172e750f 100644 --- a/qemu/aarch64.h +++ b/qemu/aarch64.h @@ -1408,6 +1408,10 @@ #define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_aarch64 #define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_aarch64 #define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_aarch64 +#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_aarch64 +#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_aarch64 +#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_aarch64 +#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_aarch64 #define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_aarch64 #define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_aarch64 #define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_aarch64 @@ -1472,6 +1476,10 @@ #define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_aarch64 #define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_aarch64 #define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_aarch64 +#define helper_atomic_ldo_be helper_atomic_ldo_be_aarch64 +#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_aarch64 +#define helper_atomic_ldo_le helper_atomic_ldo_le_aarch64 +#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_aarch64 #define helper_atomic_or_fetchb helper_atomic_or_fetchb_aarch64 #define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_aarch64 #define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_aarch64 @@ -1486,6 +1494,10 @@ #define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_aarch64 #define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_aarch64 #define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_aarch64 +#define helper_atomic_sto_be helper_atomic_sto_be_aarch64 +#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_aarch64 +#define helper_atomic_sto_le helper_atomic_sto_le_aarch64 +#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_aarch64 #define helper_atomic_xchgb helper_atomic_xchgb_aarch64 #define helper_atomic_xchgb helper_atomic_xchgb_aarch64 #define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_aarch64 diff --git a/qemu/aarch64eb.h b/qemu/aarch64eb.h index 87a2f4c2..6ec1e479 100644 --- a/qemu/aarch64eb.h +++ b/qemu/aarch64eb.h @@ -1408,6 +1408,10 @@ #define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_aarch64eb #define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_aarch64eb #define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_aarch64eb +#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_aarch64eb +#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_aarch64eb +#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_aarch64eb +#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_aarch64eb #define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_aarch64eb #define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_aarch64eb #define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_aarch64eb @@ -1472,6 +1476,10 @@ #define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_aarch64eb #define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_aarch64eb #define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_aarch64eb +#define helper_atomic_ldo_be helper_atomic_ldo_be_aarch64eb +#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_aarch64eb +#define helper_atomic_ldo_le helper_atomic_ldo_le_aarch64eb +#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_aarch64eb #define helper_atomic_or_fetchb helper_atomic_or_fetchb_aarch64eb #define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_aarch64eb #define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_aarch64eb @@ -1486,6 +1494,10 @@ #define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_aarch64eb #define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_aarch64eb #define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_aarch64eb +#define helper_atomic_sto_be helper_atomic_sto_be_aarch64eb +#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_aarch64eb +#define helper_atomic_sto_le helper_atomic_sto_le_aarch64eb +#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_aarch64eb #define helper_atomic_xchgb helper_atomic_xchgb_aarch64eb #define helper_atomic_xchgb helper_atomic_xchgb_aarch64eb #define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_aarch64eb diff --git a/qemu/arm.h b/qemu/arm.h index 283f9fa0..7338a521 100644 --- a/qemu/arm.h +++ b/qemu/arm.h @@ -1408,6 +1408,10 @@ #define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_arm #define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_arm #define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_arm +#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_arm +#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_arm +#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_arm +#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_arm #define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_arm #define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_arm #define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_arm @@ -1472,6 +1476,10 @@ #define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_arm #define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_arm #define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_arm +#define helper_atomic_ldo_be helper_atomic_ldo_be_arm +#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_arm +#define helper_atomic_ldo_le helper_atomic_ldo_le_arm +#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_arm #define helper_atomic_or_fetchb helper_atomic_or_fetchb_arm #define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_arm #define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_arm @@ -1486,6 +1494,10 @@ #define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_arm #define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_arm #define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_arm +#define helper_atomic_sto_be helper_atomic_sto_be_arm +#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_arm +#define helper_atomic_sto_le helper_atomic_sto_le_arm +#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_arm #define helper_atomic_xchgb helper_atomic_xchgb_arm #define helper_atomic_xchgb helper_atomic_xchgb_arm #define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_arm diff --git a/qemu/armeb.h b/qemu/armeb.h index a8c726d3..4dd1ef65 100644 --- a/qemu/armeb.h +++ b/qemu/armeb.h @@ -1408,6 +1408,10 @@ #define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_armeb #define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_armeb #define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_armeb +#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_armeb +#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_armeb +#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_armeb +#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_armeb #define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_armeb #define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_armeb #define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_armeb @@ -1472,6 +1476,10 @@ #define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_armeb #define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_armeb #define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_armeb +#define helper_atomic_ldo_be helper_atomic_ldo_be_armeb +#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_armeb +#define helper_atomic_ldo_le helper_atomic_ldo_le_armeb +#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_armeb #define helper_atomic_or_fetchb helper_atomic_or_fetchb_armeb #define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_armeb #define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_armeb @@ -1486,6 +1494,10 @@ #define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_armeb #define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_armeb #define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_armeb +#define helper_atomic_sto_be helper_atomic_sto_be_armeb +#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_armeb +#define helper_atomic_sto_le helper_atomic_sto_le_armeb +#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_armeb #define helper_atomic_xchgb helper_atomic_xchgb_armeb #define helper_atomic_xchgb helper_atomic_xchgb_armeb #define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_armeb diff --git a/qemu/atomic_template.h b/qemu/atomic_template.h index cf837254..b400b2a3 100644 --- a/qemu/atomic_template.h +++ b/qemu/atomic_template.h @@ -18,7 +18,11 @@ * License along with this library; if not, see . */ -#if DATA_SIZE == 8 +#if DATA_SIZE == 16 +# define SUFFIX o +# define DATA_TYPE Int128 +# define BSWAP bswap128 +#elif DATA_SIZE == 8 # define SUFFIX q # define DATA_TYPE uint64_t # define BSWAP bswap64 @@ -61,6 +65,21 @@ ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, target_ulong addr, return atomic_cmpxchg__nocheck(haddr, cmpv, newv); } +#if DATA_SIZE >= 16 +ABI_TYPE ATOMIC_NAME(ld)(CPUArchState *env, target_ulong addr EXTRA_ARGS) +{ + DATA_TYPE val, *haddr = ATOMIC_MMU_LOOKUP; + __atomic_load(haddr, &val, __ATOMIC_RELAXED); + return val; +} + +void ATOMIC_NAME(st)(CPUArchState *env, target_ulong addr, + ABI_TYPE val EXTRA_ARGS) +{ + DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; + __atomic_store(haddr, &val, __ATOMIC_RELAXED); +} +#else ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr, ABI_TYPE val EXTRA_ARGS) { @@ -86,6 +105,8 @@ GEN_ATOMIC_HELPER(or_fetch) GEN_ATOMIC_HELPER(xor_fetch) #undef GEN_ATOMIC_HELPER +#endif /* DATA SIZE >= 16 */ + #undef END #if DATA_SIZE > 1 @@ -105,6 +126,22 @@ ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, target_ulong addr, return BSWAP(atomic_cmpxchg__nocheck(haddr, BSWAP(cmpv), BSWAP(newv))); } +#if DATA_SIZE >= 16 +ABI_TYPE ATOMIC_NAME(ld)(CPUArchState *env, target_ulong addr EXTRA_ARGS) +{ + DATA_TYPE val, *haddr = ATOMIC_MMU_LOOKUP; + __atomic_load(haddr, &val, __ATOMIC_RELAXED); + return BSWAP(val); +} + +void ATOMIC_NAME(st)(CPUArchState *env, target_ulong addr, + ABI_TYPE val EXTRA_ARGS) +{ + DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; + val = BSWAP(val); + __atomic_store(haddr, &val, __ATOMIC_RELAXED); +} +#else ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr, ABI_TYPE val EXTRA_ARGS) { @@ -166,6 +203,7 @@ ABI_TYPE ATOMIC_NAME(add_fetch)(CPUArchState *env, target_ulong addr, ldo = ldn; } } +#endif /* DATA_SIZE >= 16 */ #undef END #endif /* DATA_SIZE > 1 */ diff --git a/qemu/configure b/qemu/configure index fbea58a5..bad699cc 100755 --- a/qemu/configure +++ b/qemu/configure @@ -602,7 +602,10 @@ case "$cpu" in cc_i386='$(CC) -m32' ;; x86_64) - CPU_CFLAGS="-m64" + # ??? Only extremely old AMD cpus do not have cmpxchg16b. + # If we truly care, we should simply detect this case at + # runtime and generate the fallback to serial emulation. + CPU_CFLAGS="-m64 -mcx16" LDFLAGS="-m64 $LDFLAGS" cc_i386='$(CC) -m32' ;; @@ -1068,6 +1071,26 @@ if compile_prog "" "" ; then int128=yes fi +######################################### +# See if 128-bit atomic operations are supported. + +atomic128=no +if test "$int128" = "yes"; then + cat > $TMPC << EOF +int main(void) +{ + unsigned __int128 x = 0, y = 0; + y = __atomic_load_16(&x, 0); + __atomic_store_16(&x, y, 0); + __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0); + return 0; +} +EOF + if compile_prog "" "" ; then + atomic128=yes + fi +fi + # Now we've finished running tests it's OK to add -Werror to the compiler flags if test "$werror" = "yes"; then QEMU_CFLAGS="-Werror $QEMU_CFLAGS" @@ -1189,6 +1212,10 @@ if test "$int128" = "yes" ; then echo "CONFIG_INT128=y" >> $config_host_mak fi +if test "$atomic128" = "yes" ; then + echo "CONFIG_ATOMIC128=y" >> $config_host_mak +fi + if test "$tcg_interpreter" = "yes"; then QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/tci $QEMU_INCLUDES" elif test "$ARCH" = "sparc64" ; then diff --git a/qemu/cputlb.c b/qemu/cputlb.c index 985c2f42..ec6755ab 100644 --- a/qemu/cputlb.c +++ b/qemu/cputlb.c @@ -679,6 +679,11 @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr, #define DATA_SIZE 8 #include "atomic_template.h" +#ifdef CONFIG_ATOMIC128 +#define DATA_SIZE 16 +#include "atomic_template.h" +#endif + /* Second set of helpers are directly callable from TCG as helpers. */ #undef EXTRA_ARGS diff --git a/qemu/header_gen.py b/qemu/header_gen.py index 91f79f77..e5ea1f7c 100644 --- a/qemu/header_gen.py +++ b/qemu/header_gen.py @@ -1414,6 +1414,10 @@ symbols = ( 'helper_atomic_cmpxchgl_be_mmu', 'helper_atomic_cmpxchgl_le', 'helper_atomic_cmpxchgl_le_mmu', + 'helper_atomic_cmpxchgo_be', + 'helper_atomic_cmpxchgo_be_mmu', + 'helper_atomic_cmpxchgo_le', + 'helper_atomic_cmpxchgo_le_mmu', 'helper_atomic_cmpxchgq_be', 'helper_atomic_cmpxchgq_be_mmu', 'helper_atomic_cmpxchgq_le', @@ -1478,6 +1482,10 @@ symbols = ( 'helper_atomic_fetch_xorw_be_mmu', 'helper_atomic_fetch_xorw_le', 'helper_atomic_fetch_xorw_le_mmu', + 'helper_atomic_ldo_be', + 'helper_atomic_ldo_be_mmu', + 'helper_atomic_ldo_le', + 'helper_atomic_ldo_le_mmu', 'helper_atomic_or_fetchb', 'helper_atomic_or_fetchb_mmu', 'helper_atomic_or_fetchl_be', @@ -1492,6 +1500,10 @@ symbols = ( 'helper_atomic_or_fetchw_be_mmu', 'helper_atomic_or_fetchw_le', 'helper_atomic_or_fetchw_le_mmu', + 'helper_atomic_sto_be', + 'helper_atomic_sto_be_mmu', + 'helper_atomic_sto_le', + 'helper_atomic_sto_le_mmu', 'helper_atomic_xchgb', 'helper_atomic_xchgb', 'helper_atomic_xchgb_mmu', diff --git a/qemu/include/qemu/int128.h b/qemu/include/qemu/int128.h index 70ffa9b2..fce4be74 100644 --- a/qemu/include/qemu/int128.h +++ b/qemu/include/qemu/int128.h @@ -4,6 +4,7 @@ #include "unicorn/platform.h" #ifdef CONFIG_INT128 +#include "qemu/bswap.h" typedef __int128_t Int128; @@ -139,6 +140,11 @@ static inline void int128_subfrom(Int128 *a, Int128 b) *a -= b; } +static inline Int128 bswap128(Int128 a) +{ + return int128_make128(bswap64(int128_gethi(a)), bswap64(int128_getlo(a))); +} + #else /* !CONFIG_INT128 */ typedef struct Int128 Int128; diff --git a/qemu/m68k.h b/qemu/m68k.h index c9058ee6..08bbf0a9 100644 --- a/qemu/m68k.h +++ b/qemu/m68k.h @@ -1408,6 +1408,10 @@ #define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_m68k #define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_m68k #define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_m68k +#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_m68k +#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_m68k +#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_m68k +#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_m68k #define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_m68k #define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_m68k #define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_m68k @@ -1472,6 +1476,10 @@ #define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_m68k #define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_m68k #define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_m68k +#define helper_atomic_ldo_be helper_atomic_ldo_be_m68k +#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_m68k +#define helper_atomic_ldo_le helper_atomic_ldo_le_m68k +#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_m68k #define helper_atomic_or_fetchb helper_atomic_or_fetchb_m68k #define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_m68k #define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_m68k @@ -1486,6 +1494,10 @@ #define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_m68k #define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_m68k #define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_m68k +#define helper_atomic_sto_be helper_atomic_sto_be_m68k +#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_m68k +#define helper_atomic_sto_le helper_atomic_sto_le_m68k +#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_m68k #define helper_atomic_xchgb helper_atomic_xchgb_m68k #define helper_atomic_xchgb helper_atomic_xchgb_m68k #define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_m68k diff --git a/qemu/mips.h b/qemu/mips.h index 2906ed0c..d9a8d201 100644 --- a/qemu/mips.h +++ b/qemu/mips.h @@ -1408,6 +1408,10 @@ #define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_mips #define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_mips #define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_mips +#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_mips +#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_mips +#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_mips +#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_mips #define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_mips #define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_mips #define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_mips @@ -1472,6 +1476,10 @@ #define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_mips #define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_mips #define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_mips +#define helper_atomic_ldo_be helper_atomic_ldo_be_mips +#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_mips +#define helper_atomic_ldo_le helper_atomic_ldo_le_mips +#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_mips #define helper_atomic_or_fetchb helper_atomic_or_fetchb_mips #define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_mips #define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_mips @@ -1486,6 +1494,10 @@ #define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_mips #define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_mips #define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_mips +#define helper_atomic_sto_be helper_atomic_sto_be_mips +#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_mips +#define helper_atomic_sto_le helper_atomic_sto_le_mips +#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_mips #define helper_atomic_xchgb helper_atomic_xchgb_mips #define helper_atomic_xchgb helper_atomic_xchgb_mips #define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_mips diff --git a/qemu/mips64.h b/qemu/mips64.h index 0a8bca94..6180aead 100644 --- a/qemu/mips64.h +++ b/qemu/mips64.h @@ -1408,6 +1408,10 @@ #define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_mips64 #define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_mips64 #define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_mips64 +#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_mips64 +#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_mips64 +#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_mips64 +#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_mips64 #define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_mips64 #define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_mips64 #define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_mips64 @@ -1472,6 +1476,10 @@ #define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_mips64 #define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_mips64 #define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_mips64 +#define helper_atomic_ldo_be helper_atomic_ldo_be_mips64 +#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_mips64 +#define helper_atomic_ldo_le helper_atomic_ldo_le_mips64 +#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_mips64 #define helper_atomic_or_fetchb helper_atomic_or_fetchb_mips64 #define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_mips64 #define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_mips64 @@ -1486,6 +1494,10 @@ #define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_mips64 #define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_mips64 #define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_mips64 +#define helper_atomic_sto_be helper_atomic_sto_be_mips64 +#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_mips64 +#define helper_atomic_sto_le helper_atomic_sto_le_mips64 +#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_mips64 #define helper_atomic_xchgb helper_atomic_xchgb_mips64 #define helper_atomic_xchgb helper_atomic_xchgb_mips64 #define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_mips64 diff --git a/qemu/mips64el.h b/qemu/mips64el.h index 6727cf22..a4997a1f 100644 --- a/qemu/mips64el.h +++ b/qemu/mips64el.h @@ -1408,6 +1408,10 @@ #define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_mips64el #define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_mips64el #define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_mips64el +#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_mips64el +#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_mips64el +#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_mips64el +#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_mips64el #define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_mips64el #define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_mips64el #define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_mips64el @@ -1472,6 +1476,10 @@ #define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_mips64el #define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_mips64el #define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_mips64el +#define helper_atomic_ldo_be helper_atomic_ldo_be_mips64el +#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_mips64el +#define helper_atomic_ldo_le helper_atomic_ldo_le_mips64el +#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_mips64el #define helper_atomic_or_fetchb helper_atomic_or_fetchb_mips64el #define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_mips64el #define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_mips64el @@ -1486,6 +1494,10 @@ #define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_mips64el #define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_mips64el #define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_mips64el +#define helper_atomic_sto_be helper_atomic_sto_be_mips64el +#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_mips64el +#define helper_atomic_sto_le helper_atomic_sto_le_mips64el +#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_mips64el #define helper_atomic_xchgb helper_atomic_xchgb_mips64el #define helper_atomic_xchgb helper_atomic_xchgb_mips64el #define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_mips64el diff --git a/qemu/mipsel.h b/qemu/mipsel.h index 78d3b8fa..c6638771 100644 --- a/qemu/mipsel.h +++ b/qemu/mipsel.h @@ -1408,6 +1408,10 @@ #define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_mipsel #define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_mipsel #define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_mipsel +#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_mipsel +#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_mipsel +#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_mipsel +#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_mipsel #define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_mipsel #define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_mipsel #define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_mipsel @@ -1472,6 +1476,10 @@ #define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_mipsel #define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_mipsel #define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_mipsel +#define helper_atomic_ldo_be helper_atomic_ldo_be_mipsel +#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_mipsel +#define helper_atomic_ldo_le helper_atomic_ldo_le_mipsel +#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_mipsel #define helper_atomic_or_fetchb helper_atomic_or_fetchb_mipsel #define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_mipsel #define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_mipsel @@ -1486,6 +1494,10 @@ #define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_mipsel #define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_mipsel #define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_mipsel +#define helper_atomic_sto_be helper_atomic_sto_be_mipsel +#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_mipsel +#define helper_atomic_sto_le helper_atomic_sto_le_mipsel +#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_mipsel #define helper_atomic_xchgb helper_atomic_xchgb_mipsel #define helper_atomic_xchgb helper_atomic_xchgb_mipsel #define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_mipsel diff --git a/qemu/powerpc.h b/qemu/powerpc.h index 6a28751a..60c05e20 100644 --- a/qemu/powerpc.h +++ b/qemu/powerpc.h @@ -1408,6 +1408,10 @@ #define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_powerpc #define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_powerpc #define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_powerpc +#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_powerpc +#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_powerpc +#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_powerpc +#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_powerpc #define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_powerpc #define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_powerpc #define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_powerpc @@ -1472,6 +1476,10 @@ #define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_powerpc #define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_powerpc #define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_powerpc +#define helper_atomic_ldo_be helper_atomic_ldo_be_powerpc +#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_powerpc +#define helper_atomic_ldo_le helper_atomic_ldo_le_powerpc +#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_powerpc #define helper_atomic_or_fetchb helper_atomic_or_fetchb_powerpc #define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_powerpc #define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_powerpc @@ -1486,6 +1494,10 @@ #define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_powerpc #define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_powerpc #define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_powerpc +#define helper_atomic_sto_be helper_atomic_sto_be_powerpc +#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_powerpc +#define helper_atomic_sto_le helper_atomic_sto_le_powerpc +#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_powerpc #define helper_atomic_xchgb helper_atomic_xchgb_powerpc #define helper_atomic_xchgb helper_atomic_xchgb_powerpc #define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_powerpc diff --git a/qemu/sparc.h b/qemu/sparc.h index f8bec480..7d9d5c74 100644 --- a/qemu/sparc.h +++ b/qemu/sparc.h @@ -1408,6 +1408,10 @@ #define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_sparc #define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_sparc #define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_sparc +#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_sparc +#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_sparc +#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_sparc +#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_sparc #define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_sparc #define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_sparc #define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_sparc @@ -1472,6 +1476,10 @@ #define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_sparc #define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_sparc #define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_sparc +#define helper_atomic_ldo_be helper_atomic_ldo_be_sparc +#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_sparc +#define helper_atomic_ldo_le helper_atomic_ldo_le_sparc +#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_sparc #define helper_atomic_or_fetchb helper_atomic_or_fetchb_sparc #define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_sparc #define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_sparc @@ -1486,6 +1494,10 @@ #define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_sparc #define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_sparc #define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_sparc +#define helper_atomic_sto_be helper_atomic_sto_be_sparc +#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_sparc +#define helper_atomic_sto_le helper_atomic_sto_le_sparc +#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_sparc #define helper_atomic_xchgb helper_atomic_xchgb_sparc #define helper_atomic_xchgb helper_atomic_xchgb_sparc #define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_sparc diff --git a/qemu/sparc64.h b/qemu/sparc64.h index 882d3241..8633c780 100644 --- a/qemu/sparc64.h +++ b/qemu/sparc64.h @@ -1408,6 +1408,10 @@ #define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_sparc64 #define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_sparc64 #define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_sparc64 +#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_sparc64 +#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_sparc64 +#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_sparc64 +#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_sparc64 #define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_sparc64 #define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_sparc64 #define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_sparc64 @@ -1472,6 +1476,10 @@ #define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_sparc64 #define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_sparc64 #define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_sparc64 +#define helper_atomic_ldo_be helper_atomic_ldo_be_sparc64 +#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_sparc64 +#define helper_atomic_ldo_le helper_atomic_ldo_le_sparc64 +#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_sparc64 #define helper_atomic_or_fetchb helper_atomic_or_fetchb_sparc64 #define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_sparc64 #define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_sparc64 @@ -1486,6 +1494,10 @@ #define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_sparc64 #define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_sparc64 #define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_sparc64 +#define helper_atomic_sto_be helper_atomic_sto_be_sparc64 +#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_sparc64 +#define helper_atomic_sto_le helper_atomic_sto_le_sparc64 +#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_sparc64 #define helper_atomic_xchgb helper_atomic_xchgb_sparc64 #define helper_atomic_xchgb helper_atomic_xchgb_sparc64 #define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_sparc64 diff --git a/qemu/tcg-runtime.c b/qemu/tcg-runtime.c index 7e53897a..c7cbb7e5 100644 --- a/qemu/tcg-runtime.c +++ b/qemu/tcg-runtime.c @@ -134,5 +134,23 @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr, #define DATA_SIZE 8 #include "atomic_template.h" +/* The following is only callable from other helpers, and matches up + with the softmmu version. */ + +#ifdef CONFIG_ATOMIC128 + +#undef EXTRA_ARGS +#undef ATOMIC_NAME +#undef ATOMIC_MMU_LOOKUP + +#define EXTRA_ARGS , TCGMemOpIdx oi, uintptr_t retaddr +#define ATOMIC_NAME(X) \ + HELPER(glue(glue(glue(atomic_ ## X, SUFFIX), END), _mmu)) +#define ATOMIC_MMU_LOOKUP atomic_mmu_lookup(env, addr, DATA_SIZE, retaddr) + +#define DATA_SIZE 16 +#include "atomic_template.h" +#endif /* CONFIG_ATOMIC128 */ + #endif /* !CONFIG_SOFTMMU */ diff --git a/qemu/tcg/tcg.h b/qemu/tcg/tcg.h index c4ae06a9..13a7fdc4 100644 --- a/qemu/tcg/tcg.h +++ b/qemu/tcg/tcg.h @@ -1365,4 +1365,27 @@ GEN_ATOMIC_HELPER_ALL(xchg) #endif /* CONFIG_SOFTMMU */ +#ifdef CONFIG_ATOMIC128 +#include "qemu/int128.h" + +/* These aren't really a "proper" helpers because TCG cannot manage Int128. + However, use the same format as the others, for use by the backends. */ +Int128 helper_atomic_cmpxchgo_le_mmu(CPUArchState *env, target_ulong addr, + Int128 cmpv, Int128 newv, + TCGMemOpIdx oi, uintptr_t retaddr); +Int128 helper_atomic_cmpxchgo_be_mmu(CPUArchState *env, target_ulong addr, + Int128 cmpv, Int128 newv, + TCGMemOpIdx oi, uintptr_t retaddr); + +Int128 helper_atomic_ldo_le_mmu(CPUArchState *env, target_ulong addr, + TCGMemOpIdx oi, uintptr_t retaddr); +Int128 helper_atomic_ldo_be_mmu(CPUArchState *env, target_ulong addr, + TCGMemOpIdx oi, uintptr_t retaddr); +void helper_atomic_sto_le_mmu(CPUArchState *env, target_ulong addr, Int128 val, + TCGMemOpIdx oi, uintptr_t retaddr); +void helper_atomic_sto_be_mmu(CPUArchState *env, target_ulong addr, Int128 val, + TCGMemOpIdx oi, uintptr_t retaddr); + +#endif /* CONFIG_ATOMIC128 */ + #endif /* TCG_H */ diff --git a/qemu/x86_64.h b/qemu/x86_64.h index 1465b1da..b9fef23a 100644 --- a/qemu/x86_64.h +++ b/qemu/x86_64.h @@ -1408,6 +1408,10 @@ #define helper_atomic_cmpxchgl_be_mmu helper_atomic_cmpxchgl_be_mmu_x86_64 #define helper_atomic_cmpxchgl_le helper_atomic_cmpxchgl_le_x86_64 #define helper_atomic_cmpxchgl_le_mmu helper_atomic_cmpxchgl_le_mmu_x86_64 +#define helper_atomic_cmpxchgo_be helper_atomic_cmpxchgo_be_x86_64 +#define helper_atomic_cmpxchgo_be_mmu helper_atomic_cmpxchgo_be_mmu_x86_64 +#define helper_atomic_cmpxchgo_le helper_atomic_cmpxchgo_le_x86_64 +#define helper_atomic_cmpxchgo_le_mmu helper_atomic_cmpxchgo_le_mmu_x86_64 #define helper_atomic_cmpxchgq_be helper_atomic_cmpxchgq_be_x86_64 #define helper_atomic_cmpxchgq_be_mmu helper_atomic_cmpxchgq_be_mmu_x86_64 #define helper_atomic_cmpxchgq_le helper_atomic_cmpxchgq_le_x86_64 @@ -1472,6 +1476,10 @@ #define helper_atomic_fetch_xorw_be_mmu helper_atomic_fetch_xorw_be_mmu_x86_64 #define helper_atomic_fetch_xorw_le helper_atomic_fetch_xorw_le_x86_64 #define helper_atomic_fetch_xorw_le_mmu helper_atomic_fetch_xorw_le_mmu_x86_64 +#define helper_atomic_ldo_be helper_atomic_ldo_be_x86_64 +#define helper_atomic_ldo_be_mmu helper_atomic_ldo_be_mmu_x86_64 +#define helper_atomic_ldo_le helper_atomic_ldo_le_x86_64 +#define helper_atomic_ldo_le_mmu helper_atomic_ldo_le_mmu_x86_64 #define helper_atomic_or_fetchb helper_atomic_or_fetchb_x86_64 #define helper_atomic_or_fetchb_mmu helper_atomic_or_fetchb_mmu_x86_64 #define helper_atomic_or_fetchl_be helper_atomic_or_fetchl_be_x86_64 @@ -1486,6 +1494,10 @@ #define helper_atomic_or_fetchw_be_mmu helper_atomic_or_fetchw_be_mmu_x86_64 #define helper_atomic_or_fetchw_le helper_atomic_or_fetchw_le_x86_64 #define helper_atomic_or_fetchw_le_mmu helper_atomic_or_fetchw_le_mmu_x86_64 +#define helper_atomic_sto_be helper_atomic_sto_be_x86_64 +#define helper_atomic_sto_be_mmu helper_atomic_sto_be_mmu_x86_64 +#define helper_atomic_sto_le helper_atomic_sto_le_x86_64 +#define helper_atomic_sto_le_mmu helper_atomic_sto_le_mmu_x86_64 #define helper_atomic_xchgb helper_atomic_xchgb_x86_64 #define helper_atomic_xchgb helper_atomic_xchgb_x86_64 #define helper_atomic_xchgb_mmu helper_atomic_xchgb_mmu_x86_64