From: Chen Gang <cheng...@emindsoft.com.cn> This fix does not consider about the lock feature which may cause another issues, but excuse me, I don't know how to fix it. At present, the fix runs OK for my case in windows oledb32.dll in wine.
Welcome anyone to fix it, thanks. Signed-off-by: Chen Gang <cheng...@emindsoft.com.cn> --- target/i386/mem_helper.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/target/i386/mem_helper.c b/target/i386/mem_helper.c index d50d4b0c40..8c37b05fae 100644 --- a/target/i386/mem_helper.c +++ b/target/i386/mem_helper.c @@ -68,7 +68,13 @@ void helper_cmpxchg8b(CPUX86State *env, target_ulong a0) uint64_t *haddr = g2h(a0); cmpv = cpu_to_le64(cmpv); newv = cpu_to_le64(newv); - oldv = atomic_cmpxchg__nocheck(haddr, cmpv, newv); + if ((unsigned long)haddr % 8) { + volatile uint64_t tmp = *haddr; /* avoid compiler optimization */ + oldv = atomic_cmpxchg__nocheck(&tmp, cmpv, newv); + *haddr = tmp; + } else { + oldv = atomic_cmpxchg__nocheck(haddr, cmpv, newv); + } oldv = le64_to_cpu(oldv); } #else -- 2.24.0.308.g228f53135a