From abd1d56d7fab8fff8e124d220b37ddd289ac1f34 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 27 May 2024 14:57:05 +0200 Subject: Correct hadnlign of upper 32bits value of mask for xsave/xrstor --- src/emu/x87emu_private.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') 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 -- cgit 1.4.1