diff mbox series

target: i386: mem_helper: Fix ldaxr instruction 64 bit alignment issue temporarily for stable-4.1

Message ID 20200712014717.10858-1-chengang@emindsoft.com.cn (mailing list archive)
State New, archived
Headers show
Series target: i386: mem_helper: Fix ldaxr instruction 64 bit alignment issue temporarily for stable-4.1 | expand

Commit Message

Chen Gang July 12, 2020, 1:47 a.m. UTC
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 mbox series

Patch

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