lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Tue, 29 Oct 2013 11:50:43 +0200 From: Gleb Natapov <gleb@...hat.com> To: Borislav Petkov <bp@...en8.de> Cc: LKML <linux-kernel@...r.kernel.org>, Borislav Petkov <bp@...e.de>, "H. Peter Anvin" <hpa@...or.com>, Paolo Bonzini <pbonzini@...hat.com>, Andre Przywara <andre@...rep.de>, Joerg Roedel <joro@...tes.org>, X86 ML <x86@...nel.org>, KVM <kvm@...r.kernel.org> Subject: Re: [PATCH 4/6] kvm, emulator: Add initial three-byte insns support On Sun, Sep 22, 2013 at 04:44:53PM +0200, Borislav Petkov wrote: > From: Borislav Petkov <bp@...e.de> > > Add initial support for handling three-byte instructions in the > emulator. > > Signed-off-by: Borislav Petkov <bp@...e.de> > --- > 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 linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists