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, ®_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) {
|