@ -24,6 +24,7 @@
# include "qemu/bitops.h"
# include "exec/cpu_ldst.h"
# include "translate-all.h"
# include "exec/helper-proto.h"
# undef EAX
# undef ECX
@ -573,3 +574,54 @@ int cpu_signal_handler(int host_signum, void *pinfo,
# error host CPU specific signal handler needed
# endif
/* The softmmu versions of these helpers are in cputlb.c. */
/* Do not allow unaligned operations to proceed. Return the host address. */
static void * atomic_mmu_lookup ( CPUArchState * env , target_ulong addr ,
int size , uintptr_t retaddr )
{
/* Enforce qemu required alignment. */
if ( unlikely ( addr & ( size - 1 ) ) ) {
cpu_loop_exit_atomic ( ENV_GET_CPU ( env ) , retaddr ) ;
}
return g2h ( addr ) ;
}
/* Macro to call the above, with local variables from the use context. */
# define ATOMIC_MMU_LOOKUP atomic_mmu_lookup(env, addr, DATA_SIZE, GETPC())
# define ATOMIC_NAME(X) HELPER(glue(glue(atomic_ ## X, SUFFIX), END))
# define EXTRA_ARGS
# define DATA_SIZE 1
# include "atomic_template.h"
# define DATA_SIZE 2
# include "atomic_template.h"
# define DATA_SIZE 4
# include "atomic_template.h"
# ifdef CONFIG_ATOMIC64
# define DATA_SIZE 8
# include "atomic_template.h"
# endif
/* 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 */