Use the standrd modrm decoder instead of special casing these instructions. This fixes mov %rX, %crY with X >= 8 or Y >= 8.
The fix only applies to AMD SVM, as Intel vmx decodes the instruction for us. It cures the FC5 installer crashing when loading the xor module. Signed-off-by: Avi Kivity <[EMAIL PROTECTED]> Index: linux-2.6/drivers/kvm/x86_emulate.c =================================================================== --- linux-2.6.orig/drivers/kvm/x86_emulate.c +++ linux-2.6/drivers/kvm/x86_emulate.c @@ -155,7 +155,8 @@ static u8 twobyte_table[256] = { /* 0x10 - 0x1F */ 0, 0, 0, 0, 0, 0, 0, 0, ImplicitOps | ModRM, 0, 0, 0, 0, 0, 0, 0, /* 0x20 - 0x2F */ - ImplicitOps, ModRM, ImplicitOps, ModRM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ModRM | ImplicitOps, ModRM, ModRM | ImplicitOps, ModRM, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 - 0x3F */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 - 0x47 */ @@ -1295,17 +1296,14 @@ twobyte_special_insn: emulate_clts(ctxt->vcpu); break; case 0x20: /* mov cr, reg */ - b = insn_fetch(u8, 1, _eip); - if ((b & 0xc0) != 0xc0) + if (modrm_mod != 3) goto cannot_emulate; - _regs[b & 7] = realmode_get_cr(ctxt->vcpu, (b >> 3) & 7); + _regs[modrm_rm] = realmode_get_cr(ctxt->vcpu, modrm_reg); break; case 0x22: /* mov reg, cr */ - b = insn_fetch(u8, 1, _eip); - if ((b & 0xc0) != 0xc0) + if (modrm_mod != 3) goto cannot_emulate; - realmode_set_cr(ctxt->vcpu, (b >> 3) & 7, _regs[b & 7] & -1u, - &_eflags); + realmode_set_cr(ctxt->vcpu, modrm_reg, modrm_val, &_eflags); break; case 0xc7: /* Grp9 (cmpxchg8b) */ #if defined(__i386__) - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/