diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-10-04 16:19:03 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-10-04 16:19:03 +0200 |
| commit | 25599b91b23e8919686a21123939d6deaac44cba (patch) | |
| tree | e9e10c70aca1fe5d3d1ef6d62ab5cfb13bf7b184 /src | |
| parent | 18305a19946416f93115dba33069b6cce8aa02fb (diff) | |
| download | box64-25599b91b23e8919686a21123939d6deaac44cba.tar.gz box64-25599b91b23e8919686a21123939d6deaac44cba.zip | |
[INTERPRETER] Worked on CF IRET opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c index 276dd91f..aa28c070 100644 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -1544,14 +1544,16 @@ x64emurun: #endif break; case 0xCF: /* IRET */ - addr = rex.is32bits?Pop32(emu):Pop64(emu); - emu->segs[_CS] = (rex.is32bits?Pop32(emu):Pop64(emu))&0xffff; + addr = (!rex.w)?Pop32(emu):Pop64(emu); + emu->segs[_CS] = ((!rex.w)?Pop32(emu):Pop64(emu))&0xffff; emu->segs_serial[_CS] = 0; - emu->eflags.x64 = (((rex.is32bits?Pop32(emu):Pop64(emu)) & 0x3F7FD7)/* & (0xffff-40)*/ ) | 0x2; // mask off res2 and res3 and on res1 - tmp64u = rex.is32bits?Pop32(emu):Pop64(emu); //RSP - emu->segs[_SS] = (rex.is32bits?Pop32(emu):Pop64(emu))&0xffff; - emu->segs_serial[_SS] = 0; - R_RSP = tmp64u; + emu->eflags.x64 = ((((!rex.w)?Pop32(emu):Pop64(emu)) & 0x3F7FD7)/* & (0xffff-40)*/ ) | 0x2; // mask off res2 and res3 and on res1 + if(!is32bits || (is32bits && emu->segs[_CS]!=0x23)) { + tmp64u = (!rex.w)?Pop32(emu):Pop64(emu); //RSP + emu->segs[_SS] = ((!rex.w)?Pop32(emu):Pop64(emu))&0xffff; + emu->segs_serial[_SS] = 0; + R_RSP = tmp64u; + } RESET_FLAGS(emu); R_RIP = addr; STEP; |