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