about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-10-04 16:19:03 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-10-04 16:19:03 +0200
commit25599b91b23e8919686a21123939d6deaac44cba (patch)
treee9e10c70aca1fe5d3d1ef6d62ab5cfb13bf7b184 /src
parent18305a19946416f93115dba33069b6cce8aa02fb (diff)
downloadbox64-25599b91b23e8919686a21123939d6deaac44cba.tar.gz
box64-25599b91b23e8919686a21123939d6deaac44cba.zip
[INTERPRETER] Worked on CF IRET opcode
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run.c16
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;