diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-07-28 11:13:59 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-07-28 11:13:59 +0200 |
| commit | 58b5c6ded9792a1e79a1b3bc2a6e82a1d3108cc7 (patch) | |
| tree | aa3ceae38996f60db0433f86ec40d46741aefbb7 /src | |
| parent | ecc07a235cc4c106af81ed1f99f306351305c36c (diff) | |
| download | box64-58b5c6ded9792a1e79a1b3bc2a6e82a1d3108cc7.tar.gz box64-58b5c6ded9792a1e79a1b3bc2a6e82a1d3108cc7.zip | |
Handled privilieged instruction (as handled by wine64) as privilegde and generate a SIGSEGV (should help #27 and some other Wine64 games/programs)
Diffstat (limited to 'src')
| -rwxr-xr-x | src/emu/x64run.c | 36 | ||||
| -rw-r--r-- | src/emu/x64run0f.c | 17 |
2 files changed, 51 insertions, 2 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c index 1c14d1c0..34384d68 100755 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -307,6 +307,15 @@ x64emurun: else GD->q[0] = imul32(emu, ED->dword[0], (uint32_t)tmp64s); break; + case 0x6C: /* INSB DX */ + case 0x6D: /* INSL DX */ + case 0x6E: /* OUTSB DX */ + case 0x6F: /* OUTSL DX */ + // this is a privilege opcode... + --R_RIP; + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + STEP; + break; GOCOND(0x70 , tmp8s = F8S; CHECK_FLAGS(emu); @@ -1066,6 +1075,13 @@ x64emurun: x64Int3(emu); if(emu->quit) goto fini; break; + case 0xCD: /* INT n */ + // this is a privilege opcode... + --R_RIP; + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + STEP; + break; + case 0xCF: /* IRET */ R_RIP = Pop(emu); @@ -1233,7 +1249,15 @@ x64emurun: R_RIP += tmp8s; STEP break; - + case 0xE4: /* IN AL, XX */ + case 0xE5: /* IN EAX, XX */ + case 0xE6: /* OUT XX, AL */ + case 0xE7: /* OUT XX, EAX */ + // this is a privilege opcode... + --R_RIP; + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + STEP; + break; case 0xE8: /* CALL Id */ tmp32s = F32S; // call is relative Push(emu, R_RIP); @@ -1251,7 +1275,15 @@ x64emurun: R_RIP += tmp32s; STEP break; - + case 0xEC: /* IN AL, DX */ + case 0xED: /* IN EAX, DX */ + case 0xEE: /* OUT DX, AL */ + case 0xEF: /* OUT DX, EAX */ + // this is a privilege opcode... + --R_RIP; + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + STEP; + break; case 0xF0: /* LOCK prefix */ if(RunF0(emu, rex)) { unimp = 1; diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c index 0e430904..977e6c73 100644 --- a/src/emu/x64run0f.c +++ b/src/emu/x64run0f.c @@ -48,8 +48,17 @@ int Run0F(x64emu_t *emu, rex_t rex) case 0x05: /* SYSCALL */ x64Syscall(emu); break; + case 0x06: /* CLTS */ + // this is a privilege opcode... + R_RIP-=2; + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + break; + case 0x08: /* INVD */ case 0x09: /* WBINVD */ + // this is a privilege opcode... + R_RIP-=2; + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); break; case 0x0B: /* UD2 */ @@ -145,6 +154,14 @@ int Run0F(x64emu_t *emu, rex_t rex) nextop = F8; GETED(0); break; + case 0x20: /* MOV REG, crX */ + case 0x21: /* MOV REG, drX */ + case 0x22: /* MOV cxR, REG */ + case 0x23: /* MOV drX, REG */ + // this is a privilege opcode... + R_RIP-=2; + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + break; case 0x28: /* MOVAPS Gx,Ex */ nextop = F8; |