diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-24 14:37:37 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-24 14:37:37 +0200 |
| commit | 52e125e35a8c6831d628bb30c40221650d976044 (patch) | |
| tree | d48f7ddc91f340e231d492a2dafcc9180b91254a /src | |
| parent | 57bea35004fcd5d0a453964ce61b5807223ab66d (diff) | |
| download | box64-52e125e35a8c6831d628bb30c40221650d976044.tar.gz box64-52e125e35a8c6831d628bb30c40221650d976044.zip | |
Added 66 F0 83 opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run66.c | 3 | ||||
| -rw-r--r-- | src/emu/x64run66f0.c | 131 | ||||
| -rwxr-xr-x | src/emu/x64run_private.h | 1 |
3 files changed, 135 insertions, 0 deletions
diff --git a/src/emu/x64run66.c b/src/emu/x64run66.c index 689897ce..0e1f4bac 100644 --- a/src/emu/x64run66.c +++ b/src/emu/x64run66.c @@ -557,6 +557,9 @@ int Run66(x64emu_t *emu, rex_t rex, int rep) R_RIP += tmp32s; break; + case 0xF0: /* LOCK: */ + return Run66F0(emu, rex); + case 0xF7: /* GRP3 Ew(,Iw) */ nextop = F8; tmp8u = (nextop>>3)&7; diff --git a/src/emu/x64run66f0.c b/src/emu/x64run66f0.c new file mode 100644 index 00000000..f583bee8 --- /dev/null +++ b/src/emu/x64run66f0.c @@ -0,0 +1,131 @@ +#define _GNU_SOURCE +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <string.h> +#include <signal.h> +#include <sys/types.h> +#include <unistd.h> + +#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" + +int Run66F0(x64emu_t *emu, rex_t rex) +{ + uint8_t opcode; + uint8_t nextop; + uint16_t tmp16u, tmp16u2; + int64_t tmp64s; + uint64_t tmp64u, tmp64u2; + reg64_t *oped, *opgd; + uintptr_t tlsdata = GetFSBaseEmu(emu); + + opcode = F8; + // REX prefix before the F0 are ignored + rex.rex = 0; + while(opcode>=0x40 && opcode<=0x4f) { + rex.rex = opcode; + opcode = F8; + } + + switch(opcode) { + + case 0x83: /* GRP Ed,Ib */ + nextop = F8; + GETED(1); + tmp64s = F8S; + tmp64u = (uint64_t)tmp64s; +#ifdef DYNAREC + if(rex.w) { + switch((nextop>>3)&7) { + case 0: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 = add64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break; + case 1: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 = or64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break; + case 2: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 = adc64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break; + case 3: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 = sbb64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break; + case 4: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 = and64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break; + case 5: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 = sub64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break; + case 6: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 = xor64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break; + case 7: cmp64(emu, ED->q[0], tmp64u); break; + } + } else { + if(MODREG) + switch((nextop>>3)&7) { + case 0: ED->word[0] = add16(emu, ED->word[0], tmp64u); break; + case 1: ED->word[0] = or16(emu, ED->word[0], tmp64u); break; + case 2: ED->word[0] = adc16(emu, ED->word[0], tmp64u); break; + case 3: ED->word[0] = sbb16(emu, ED->word[0], tmp64u); break; + case 4: ED->word[0] = and16(emu, ED->word[0], tmp64u); break; + case 5: ED->word[0] = sub16(emu, ED->word[0], tmp64u); break; + case 6: ED->word[0] = xor16(emu, ED->word[0], tmp64u); break; + case 7: cmp16(emu, ED->word[0], tmp64u); break; + } + else + switch((nextop>>3)&7) { + case 0: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 = add16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break; + case 1: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 = or16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break; + case 2: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 = adc16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break; + case 3: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 = sbb16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break; + case 4: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 = and16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break; + case 5: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 = sub16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break; + case 6: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 = xor16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break; + case 7: cmp16(emu, ED->word[0], tmp64u); break; + } + } +#else + pthread_mutex_lock(&emu->context->mutex_lock); + if(rex.w) { + switch((nextop>>3)&7) { + case 0: ED->q[0] = add64(emu, ED->q[0], tmp64u); break; + case 1: ED->q[0] = or64(emu, ED->q[0], tmp64u); break; + case 2: ED->q[0] = adc64(emu, ED->q[0], tmp64u); break; + case 3: ED->q[0] = sbb64(emu, ED->q[0], tmp64u); break; + case 4: ED->q[0] = and64(emu, ED->q[0], tmp64u); break; + case 5: ED->q[0] = sub64(emu, ED->q[0], tmp64u); break; + case 6: ED->q[0] = xor64(emu, ED->q[0], tmp64u); break; + case 7: cmp64(emu, ED->q[0], tmp64u); break; + } + } else { + if((nextop&0xC0)==0xC0) + switch((nextop>>3)&7) { + case 0: ED->word[0] = add16(emu, ED->word[0], tmp64u); break; + case 1: ED->word[0] = or16(emu, ED->word[0], tmp64u); break; + case 2: ED->word[0] = adc16(emu, ED->word[0], tmp64u); break; + case 3: ED->word[0] = sbb16(emu, ED->word[0], tmp64u); break; + case 4: ED->word[0] = and16(emu, ED->word[0], tmp64u); break; + case 5: ED->word[0] = sub16(emu, ED->word[0], tmp64u); break; + case 6: ED->word[0] = xor16(emu, ED->word[0], tmp64u); break; + case 7: cmp16(emu, ED->word[0], tmp64u); break; + } + else + switch((nextop>>3)&7) { + case 0: ED->word[0] = add16(emu, ED->word[0], tmp64u); break; + case 1: ED->word[0] = or16(emu, ED->word[0], tmp64u); break; + case 2: ED->word[0] = adc16(emu, ED->word[0], tmp64u); break; + case 3: ED->word[0] = sbb16(emu, ED->word[0], tmp64u); break; + case 4: ED->word[0] = and16(emu, ED->word[0], tmp64u); break; + case 5: ED->word[0] = sub16(emu, ED->word[0], tmp64u); break; + case 6: ED->word[0] = xor16(emu, ED->word[0], tmp64u); break; + case 7: cmp16(emu, ED->word[0], tmp64u); break; + } + } + pthread_mutex_unlock(&emu->context->mutex_lock); +#endif + break; + + default: + return 1; + } + return 0; +} \ No newline at end of file diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h index 525771f2..7f4089fc 100755 --- a/src/emu/x64run_private.h +++ b/src/emu/x64run_private.h @@ -108,6 +108,7 @@ int Run660F(x64emu_t *emu, rex_t rex); int Run6664(x64emu_t *emu, rex_t rex); int Run66D9(x64emu_t *emu, rex_t rex); int Run66DD(x64emu_t *emu, rex_t rex); +int Run66F0(x64emu_t *emu, rex_t rex); int Run67(x64emu_t *emu, rex_t rex, int rep); int Run670F(x64emu_t *emu, rex_t rex, int rep); int Run6766(x64emu_t *emu, rex_t rex, int rep); |