On Sun, Sep 22, 2013 at 04:44:53PM +0200, Borislav Petkov wrote: > From: Borislav Petkov <bp@xxxxxxx> > > Add initial support for handling three-byte instructions in the > emulator. > > Signed-off-by: Borislav Petkov <bp@xxxxxxx> > --- > arch/x86/kvm/emulate.c | 30 ++++++++++++++++++++++++++++++ > 1 file changed, 30 insertions(+) > > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c > index 67277bcb377a..72093d76c769 100644 > --- a/arch/x86/kvm/emulate.c > +++ b/arch/x86/kvm/emulate.c > @@ -3880,6 +3880,25 @@ static const struct opcode twobyte_table[256] = { > N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N > }; > > +static const struct gprefix third_opcode_byte_0xf0 = { > + N, N, N, N > +}; > + > +static const struct gprefix third_opcode_byte_0xf1 = { > + N, N, N, N > +}; There are two three opcode tables, so third_opcode_byte is ambiguous. What about pfx_0f_38_f0 and pfx_0f_38_f1? > + > +/* > + * Insns below are selected by the prefix which indexed by the third opcode > + * byte. > + */ > +static const struct opcode opcode_map_0f_38[256] = { > + /* 0x00 - 0x7f */ > + X16(N), X16(N), X16(N), X16(N), X16(N), X16(N), X16(N), X16(N), > + /* 0x80 - 0xff */ > + X16(N), X16(N), X16(N), X16(N), X16(N), X16(N), X16(N), X16(N) > +}; > + > #undef D > #undef N > #undef G > @@ -4200,6 +4219,13 @@ done_prefixes: > ctxt->opcode_len = 2; > ctxt->b = insn_fetch(u8, ctxt); > opcode = twobyte_table[ctxt->b]; > + > + /* 0F_38 opcode map */ > + if (ctxt->b == 0x38) { > + ctxt->opcode_len = 3; > + ctxt->b = insn_fetch(u8, ctxt); > + opcode = opcode_map_0f_38[ctxt->b]; > + } > } > ctxt->d = opcode.flags; > > @@ -4531,6 +4557,8 @@ special_insn: > > if (ctxt->opcode_len == 2) > goto twobyte_insn; > + else if (ctxt->opcode_len == 3) > + goto threebyte_insn; > > switch (ctxt->b) { > case 0x63: /* movsxd */ > @@ -4715,6 +4743,8 @@ twobyte_insn: > goto cannot_emulate; > } > > +threebyte_insn: > + > if (rc != X86EMUL_CONTINUE) > goto done; > > -- > 1.8.4 -- Gleb. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html