From: Chen Gang <chengang@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 <chengang@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