From b2d37d4ddb227a33ffb00b858b77cdafddc53560 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 16 Jul 2023 10:42:28 +0200 Subject: [32BITS] Added 64 67 8B opcode (for #870) --- src/emu/modrm.h | 2 ++ src/emu/x64run64.c | 5 ++++ src/emu/x64run6764_32.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ src/emu/x64run67_32.c | 15 +++++++++++ src/emu/x64run_private.h | 2 ++ 5 files changed, 91 insertions(+) create mode 100644 src/emu/x64run6764_32.c (limited to 'src') diff --git a/src/emu/modrm.h b/src/emu/modrm.h index 0d76e656..cd967c0e 100644 --- a/src/emu/modrm.h +++ b/src/emu/modrm.h @@ -34,6 +34,7 @@ #define GETEW(D) oped=TestEw(test, &addr, rex, nextop, D) #define GETEW32(D) oped=TestEw32O(test, &addr, rex, nextop, D, 0) #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 GETEX32(D) opex=TestEx32O(test, &addr, rex, nextop, D, 0) @@ -58,6 +59,7 @@ #define GETEW(D) oped=GetEw(emu, &addr, rex, nextop, D) #define GETEW32(D) oped=GetEw32O(emu, &addr, rex, nextop, D, 0) #define GETEW_OFFS(D, O) oped=GetEdO(emu, &addr, rex, nextop, D, O) +#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 GETEX32(D) opex=GetEx32O(emu, &addr, rex, nextop, D, 0) diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c index c8641e91..587cc81e 100644 --- a/src/emu/x64run64.c +++ b/src/emu/x64run64.c @@ -326,6 +326,11 @@ uintptr_t Run64(x64emu_t *emu, rex_t rex, int seg, uintptr_t addr) case 0x66: return Run6664(emu, rex, seg, addr); + case 0x67: + if(rex.is32bits) + return Run6764_32(emu, rex, seg, seg, addr); + else + return 0; case 0x80: /* GRP Eb,Ib */ nextop = F8; diff --git a/src/emu/x64run6764_32.c b/src/emu/x64run6764_32.c new file mode 100644 index 00000000..6f6b0600 --- /dev/null +++ b/src/emu/x64run6764_32.c @@ -0,0 +1,67 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include + +#include "debug.h" +#include "box64stack.h" +#include "x64emu.h" +#include "x64run.h" +#include "x64emu_private.h" +#include "x64run_private.h" +#include "x64primop.h" +#include "x64trace.h" +#include "x87emu_private.h" +#include "box64context.h" +#include "bridge.h" + +#include "modrm.h" + +#ifdef TEST_INTERPRETER +uintptr_t Test6764_32(x64test_t *test, rex_t rex, int rep, int seg, uintptr_t addr) +#else +uintptr_t Run6764_32(x64emu_t *emu, rex_t rex, int rep, int seg, uintptr_t addr) +#endif +{ + uint8_t opcode; + uint8_t nextop; + int8_t tmp8s; + uint8_t tmp8u; + uint32_t tmp32u; + int32_t tmp32s; + uint64_t tmp64u; + reg64_t *oped, *opgd; + #ifdef TEST_INTERPRETER + x64emu_t* emu = test->emu; + #endif + uintptr_t tlsdata = GetSegmentBaseEmu(emu, seg); + opcode = F8; + + while(opcode==0x67) + opcode = F8; + + rex.rex = 0; + while((opcode==0xF2) || (opcode==0xF3)) { + rep = opcode-0xF1; + opcode = F8; + } + + switch(opcode) { + + case 0x8B: /* MOV Gw, FS:Ew */ + nextop = F8; + GETEW_OFFS_16(tlsdata); + GETGW; + GW->word[0] = EW->word[0]; + break; + + default: + return 0; + } + return addr; +} \ No newline at end of file diff --git a/src/emu/x64run67_32.c b/src/emu/x64run67_32.c index f0c704f3..a1df3ba0 100644 --- a/src/emu/x64run67_32.c +++ b/src/emu/x64run67_32.c @@ -52,6 +52,21 @@ uintptr_t Run67_32(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr) switch(opcode) { + case 0x64: /* FS: prefix */ + #ifdef TEST_INTERPRETER + return Test6764_32(test, rex, rep, _FS, addr); + #else + return Run6764_32(emu, rex, rep, _FS, addr); + #endif + break; + case 0x65: /* GS: prefix */ + #ifdef TEST_INTERPRETER + return Test6764_32(test, rex, rep, _GS, addr); + #else + return Run6764_32(emu, rex, rep, _GS, addr); + #endif + break; + case 0xE0: /* LOOPNZ */ CHECK_FLAGS(emu); tmp8s = F8S; diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h index ec91bdcc..dcda399f 100755 --- a/src/emu/x64run_private.h +++ b/src/emu/x64run_private.h @@ -135,6 +135,7 @@ uintptr_t Run66DD(x64emu_t *emu, rex_t rex, uintptr_t addr); uintptr_t Run66F0(x64emu_t *emu, rex_t rex, uintptr_t addr); uintptr_t Run67(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr); uintptr_t Run67_32(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr); +uintptr_t Run6764_32(x64emu_t *emu, rex_t rex, int rep, int seg, uintptr_t addr); uintptr_t Run670F(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr); uintptr_t Run6766(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr); uintptr_t Run67660F(x64emu_t *emu, rex_t rex, uintptr_t addr); @@ -160,6 +161,7 @@ uintptr_t Test66DD(x64test_t *test, rex_t rex, uintptr_t addr); uintptr_t Test66F0(x64test_t *test, rex_t rex, uintptr_t addr); uintptr_t Test67(x64test_t *test, rex_t rex, int rep, uintptr_t addr); uintptr_t Test67_32(x64test_t *test, rex_t rex, int rep, uintptr_t addr); +uintptr_t Test6764_32(x64test_t *test, rex_t rex, int rep, int seg, uintptr_t addr); uintptr_t Test670F(x64test_t *test, rex_t rex, int rep, uintptr_t addr); uintptr_t Test6766(x64test_t *test, rex_t rex, int rep, uintptr_t addr); uintptr_t Test67660F(x64test_t *test, rex_t rex, uintptr_t addr); -- cgit 1.4.1