about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-05-27 14:57:05 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-05-27 14:57:05 +0200
commitabd1d56d7fab8fff8e124d220b37ddd289ac1f34 (patch)
tree44e765806dc39e6327caa42e4186d9f2f0a882bc /src
parent22b9c16351f6193f1b8d842438d8bbe61b2b8730 (diff)
downloadbox64-abd1d56d7fab8fff8e124d220b37ddd289ac1f34.tar.gz
box64-abd1d56d7fab8fff8e124d220b37ddd289ac1f34.zip
Correct hadnlign of upper 32bits value of mask for xsave/xrstor
Diffstat (limited to 'src')
-rw-r--r--src/emu/x87emu_private.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/emu/x87emu_private.c b/src/emu/x87emu_private.c
index 089971ee..da480e6a 100644
--- a/src/emu/x87emu_private.c
+++ b/src/emu/x87emu_private.c
@@ -485,7 +485,8 @@ void fpu_xsave_mask(x64emu_t* emu, void* ed, int is32bits, uint64_t mask)
 
 void fpu_xsave(x64emu_t* emu, void* ed, int is32bits)
 {
-    fpu_xsave_mask(emu, ed, is32bits, R_RAX);
+    uint64_t mask = R_EAX | (((uint64_t)R_EDX)<<32);
+    fpu_xsave_mask(emu, ed, is32bits, mask);
 }
 
 void fpu_xrstor(x64emu_t* emu, void* ed, int is32bits)
@@ -493,7 +494,8 @@ void fpu_xrstor(x64emu_t* emu, void* ed, int is32bits)
     xsave64_t *p = (xsave64_t*)ed;
     xsaveheader_t *h = (xsaveheader_t*)(p+1);
     int compressed = (h->xcomp_bv>>63);
-    uint32_t rfbm = (0b111&R_EAX);
+    uint64_t mask = R_EAX | (((uint64_t)R_EDX)<<32);
+    uint32_t rfbm = (0b111&mask);
     uint32_t to_restore = rfbm & h->xstate_bv;
     uint32_t to_init = rfbm & ~h->xstate_bv;
     // check componant to restore