about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-06-03 13:45:55 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-06-03 13:45:55 +0200
commit001e77952e5b55c340b222edba53f7581cde505e (patch)
treecb76893fc8edf62bb6624b9d427842c4726eb460
parentac6a45383387789e94337cbf8f336d4c62b13262 (diff)
downloadbox64-001e77952e5b55c340b222edba53f7581cde505e.tar.gz
box64-001e77952e5b55c340b222edba53f7581cde505e.zip
[COSIM] Added more helpers to avoid segfault on rare cases
-rw-r--r--src/emu/modrm.h6
-rw-r--r--src/emu/x64run_private.c7
-rw-r--r--src/emu/x64run_private.h2
-rw-r--r--src/emu/x64runavxf30f.c4
4 files changed, 11 insertions, 8 deletions
diff --git a/src/emu/modrm.h b/src/emu/modrm.h
index fbb3545c..d4817833 100644
--- a/src/emu/modrm.h
+++ b/src/emu/modrm.h
@@ -39,7 +39,9 @@
 #define GETEW_OFFS(D, O)    oped=TestEdO(test, &addr, rex, nextop, D, O)

 #define GETEW_OFFS_16(O)    oped=TestEw16off(test, &addr, rex, nextop, O)

 #define GETGW               opgd=GetGw(test->emu, &addr, rex, nextop)

-#define GETEX(D)            opex=TestEx(test, &addr, rex, nextop, D)

+#define GETEX(D)            opex=TestEx(test, &addr, rex, nextop, D, 16)

+#define GETEX4(D)           opex=TestEx(test, &addr, rex, nextop, D, 4)

+#define GETEX8(D)           opex=TestEx(test, &addr, rex, nextop, D, 8)

 #define GETEX32(D)          opex=TestEx32O(test, &addr, rex, nextop, D, 0)

 #define GETEX_OFFS(D, O)    opex=TestExO(test, &addr, rex, nextop, D, O)

 #define GETGX               opgx=GetGx(test->emu, &addr, rex, nextop)

@@ -71,6 +73,8 @@
 #define GETEW_OFFS_16(O)    oped=GetEw16off(emu, &addr, rex, nextop, O)

 #define GETGW               opgd=GetGw(emu, &addr, rex, nextop)

 #define GETEX(D)            opex=GetEx(emu, &addr, rex, nextop, D)

+#define GETEX4(D)           GETEX(D)

+#define GETEX8(D)           GETEX(D)

 #define GETEX32(D)          opex=GetEx32O(emu, &addr, rex, nextop, D, 0)

 #define GETEX_OFFS(D, O)    opex=GetExO(emu, &addr, rex, nextop, D, O)

 #define GETGX               opgx=GetGx(emu, &addr, rex, nextop)

diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 79d1df04..c5a2716c 100644
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -1891,7 +1891,7 @@ sse_regs_t* GetEx(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t
     } else return (sse_regs_t*)GetECommon(emu, addr, rex, m, delta);
 }
 
-sse_regs_t* TestEx(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta)
+sse_regs_t* TestEx(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta, int sz)
 {
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
@@ -1899,9 +1899,8 @@ sse_regs_t* TestEx(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8
         return &test->emu->xmm[(m&0x07)+(rex.b<<3)];
     } else {
         sse_regs_t* ret = (sse_regs_t*)GetECommon(test->emu, addr, rex, m, delta);
-        test->memsize = 16;
-        ((uint64_t*)test->mem)[0] = ret->q[0];
-        ((uint64_t*)test->mem)[1] = ret->q[1];
+        test->memsize = sz;
+        memcpy(test->mem, ret, sz);
         test->memaddr = (uintptr_t)ret;
         return (sse_regs_t*)test->mem;
     }
diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h
index 8ebfbbe7..45a68659 100644
--- a/src/emu/x64run_private.h
+++ b/src/emu/x64run_private.h
@@ -126,7 +126,7 @@ reg64_t* TestEd16off(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uin
 mmx87_regs_t* GetEm(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
 mmx87_regs_t* TestEm(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
 sse_regs_t* GetEx(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
-sse_regs_t* TestEx(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
+sse_regs_t* TestEx(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta, int sz);
 sse_regs_t* TestEy(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v);
 sse_regs_t* GetExO(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta, uintptr_t offset);
 sse_regs_t* TestExO(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta, uintptr_t offset);
diff --git a/src/emu/x64runavxf30f.c b/src/emu/x64runavxf30f.c
index a6cd93d5..dda2b0f6 100644
--- a/src/emu/x64runavxf30f.c
+++ b/src/emu/x64runavxf30f.c
@@ -65,7 +65,7 @@ uintptr_t RunAVX_F30F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
 
         case 0x10:  /* VMOVSS Gx, [Vx,] Ex */
             nextop = F8;
-            GETEX(0);
+            GETEX4(0);
             GETGX;
             GX->ud[0] = EX->ud[0];
             if(MODREG) {
@@ -80,7 +80,7 @@ uintptr_t RunAVX_F30F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             break;
         case 0x11:  /* VMOVSS Ex, [Vx,] Gx */
             nextop = F8;
-            GETEX(0);
+            GETEX4(0);
             GETGX;
             EX->ud[0] = GX->ud[0];
             if(MODREG) {