/* * We default to false if we know other options have been enabled * which are currently incompatible with MTTCG. Otherwise when each * guest (target) has been updated to support: * - atomic instructions * - memory ordering primitives (barriers) * they can set the appropriate CONFIG flags in ${target}-softmmu.mak * * Once a guest architecture has been converted to the new primitives * there are two remaining limitations to check. * * - The guest can't be oversized (e.g. 64 bit guest on 32 bit host) * - The host must have a stronger memory order than the guest * * It may be possible in future to support strong guests on weak hosts * but that will require tagging all load/stores in a guest with their * implicit memory order requirements which would likely slow things * down a lot. */ static bool check_tcg_memory_orders_compatible(void) { #if defined(TCG_GUEST_DEFAULT_MO) && defined(TCG_TARGET_DEFAULT_MO) return (TCG_GUEST_DEFAULT_MO & ~TCG_TARGET_DEFAULT_MO) == 0; #else return false; #endif }
That function will return false for x86_64 on ARM64. On tcg/aarch64/tcg-target.h #define TCG_TARGET_DEFAULT_MO (0) On target/i386/cpu.h /* The x86 has a strong memory model with some store-after-load re-ordering */ #define TCG_GUEST_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD) I am asking for clarification because the above code will default x86 on ARM64 to disable MTTCG.