diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-06-03 13:45:55 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-06-03 13:45:55 +0200 |
| commit | 001e77952e5b55c340b222edba53f7581cde505e (patch) | |
| tree | cb76893fc8edf62bb6624b9d427842c4726eb460 | |
| parent | ac6a45383387789e94337cbf8f336d4c62b13262 (diff) | |
| download | box64-001e77952e5b55c340b222edba53f7581cde505e.tar.gz box64-001e77952e5b55c340b222edba53f7581cde505e.zip | |
[COSIM] Added more helpers to avoid segfault on rare cases
| -rw-r--r-- | src/emu/modrm.h | 6 | ||||
| -rw-r--r-- | src/emu/x64run_private.c | 7 | ||||
| -rw-r--r-- | src/emu/x64run_private.h | 2 | ||||
| -rw-r--r-- | src/emu/x64runavxf30f.c | 4 |
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) { |