render / rpms / qemu

Forked from rpms/qemu 9 months ago
Clone

Blame qemu-0.8.2-mb-nops.diff

Hans de Goede 019db4
===================================================================
Hans de Goede 019db4
RCS file: /sources/qemu/qemu/target-i386/translate.c,v
Hans de Goede 019db4
retrieving revision 1.59
Hans de Goede 019db4
retrieving revision 1.60
Hans de Goede 019db4
diff -u -r1.59 -r1.60
Hans de Goede 019db4
--- qemu/target-i386/translate.c	2006/07/10 19:53:04	1.59
Hans de Goede 019db4
+++ qemu/target-i386/translate.c	2006/09/03 17:09:02	1.60
Hans de Goede 019db4
@@ -1615,6 +1615,56 @@
Hans de Goede 019db4
     *offset_ptr = disp;
Hans de Goede 019db4
 }
Hans de Goede 019db4
 
Hans de Goede 019db4
+static void gen_nop_modrm(DisasContext *s, int modrm)
Hans de Goede 019db4
+{
Hans de Goede 019db4
+    int mod, rm, base, code;
Hans de Goede 019db4
+
Hans de Goede 019db4
+    mod = (modrm >> 6) & 3;
Hans de Goede 019db4
+    if (mod == 3)
Hans de Goede 019db4
+        return;
Hans de Goede 019db4
+    rm = modrm & 7;
Hans de Goede 019db4
+
Hans de Goede 019db4
+    if (s->aflag) {
Hans de Goede 019db4
+
Hans de Goede 019db4
+        base = rm;
Hans de Goede 019db4
+        
Hans de Goede 019db4
+        if (base == 4) {
Hans de Goede 019db4
+            code = ldub_code(s->pc++);
Hans de Goede 019db4
+            base = (code & 7);
Hans de Goede 019db4
+        }
Hans de Goede 019db4
+        
Hans de Goede 019db4
+        switch (mod) {
Hans de Goede 019db4
+        case 0:
Hans de Goede 019db4
+            if (base == 5) {
Hans de Goede 019db4
+                s->pc += 4;
Hans de Goede 019db4
+            }
Hans de Goede 019db4
+            break;
Hans de Goede 019db4
+        case 1:
Hans de Goede 019db4
+            s->pc++;
Hans de Goede 019db4
+            break;
Hans de Goede 019db4
+        default:
Hans de Goede 019db4
+        case 2:
Hans de Goede 019db4
+            s->pc += 4;
Hans de Goede 019db4
+            break;
Hans de Goede 019db4
+        }
Hans de Goede 019db4
+    } else {
Hans de Goede 019db4
+        switch (mod) {
Hans de Goede 019db4
+        case 0:
Hans de Goede 019db4
+            if (rm == 6) {
Hans de Goede 019db4
+                s->pc += 2;
Hans de Goede 019db4
+            }
Hans de Goede 019db4
+            break;
Hans de Goede 019db4
+        case 1:
Hans de Goede 019db4
+            s->pc++;
Hans de Goede 019db4
+            break;
Hans de Goede 019db4
+        default:
Hans de Goede 019db4
+        case 2:
Hans de Goede 019db4
+            s->pc += 2;
Hans de Goede 019db4
+            break;
Hans de Goede 019db4
+        }
Hans de Goede 019db4
+    }
Hans de Goede 019db4
+}
Hans de Goede 019db4
+
Hans de Goede 019db4
 /* used for LEA and MOV AX, mem */
Hans de Goede 019db4
 static void gen_add_A0_ds_seg(DisasContext *s)
Hans de Goede 019db4
 {
Hans de Goede 019db4
@@ -5791,10 +5841,15 @@
Hans de Goede 019db4
             gen_lea_modrm(s, modrm, &reg_addr, &offset_addr);
Hans de Goede 019db4
             /* nothing more to do */
Hans de Goede 019db4
             break;
Hans de Goede 019db4
-        default:
Hans de Goede 019db4
-            goto illegal_op;
Hans de Goede 019db4
+        default: /* nop (multi byte) */
Hans de Goede 019db4
+            gen_nop_modrm(s, modrm);
Hans de Goede 019db4
+            break;
Hans de Goede 019db4
         }
Hans de Goede 019db4
         break;
Hans de Goede 019db4
+    case 0x119 ... 0x11f: /* nop (multi byte) */
Hans de Goede 019db4
+        modrm = ldub_code(s->pc++);
Hans de Goede 019db4
+        gen_nop_modrm(s, modrm);
Hans de Goede 019db4
+        break;
Hans de Goede 019db4
     case 0x120: /* mov reg, crN */
Hans de Goede 019db4
     case 0x122: /* mov crN, reg */
Hans de Goede 019db4
         if (s->cpl != 0) {