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

chengang@emindsoft.com.cn posted 1 patch 3 years, 9 months ago
Test checkpatch passed
Test docker-mingw@fedora passed
Test FreeBSD passed
Test docker-quick@centos7 passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20200712014717.10858-1-chengang@emindsoft.com.cn
Maintainers: Eduardo Habkost <ehabkost@redhat.com>, Richard Henderson <rth@twiddle.net>, Paolo Bonzini <pbonzini@redhat.com>
target/i386/mem_helper.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
[PATCH] target: i386: mem_helper: Fix ldaxr instruction 64 bit alignment issue temporarily for stable-4.1
Posted by chengang@emindsoft.com.cn 3 years, 9 months ago
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