From patchwork Tue Oct 29 11:54:10 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Borislav Petkov X-Patchwork-Id: 3107691 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 14E2CBF924 for ; Tue, 29 Oct 2013 11:54:34 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id EE5F62015B for ; Tue, 29 Oct 2013 11:54:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CDB7520149 for ; Tue, 29 Oct 2013 11:54:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754744Ab3J2LyR (ORCPT ); Tue, 29 Oct 2013 07:54:17 -0400 Received: from mail.skyhub.de ([78.46.96.112]:35513 "EHLO mail.skyhub.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754583Ab3J2LyP (ORCPT ); Tue, 29 Oct 2013 07:54:15 -0400 X-Virus-Scanned: Nedap ESD1 at mail.skyhub.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alien8.de; s=alien8; t=1383047654; bh=ZofmOJLspLeWIeGXYmRlBImGXKusoUREpgm3c48E82w=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:In-Reply-To; b=qNeoo032gepWGM5/jhmjTx13DNtgz32yrRXmiV YsZHfZpZHDlIoVNpRzsg3P56kA3jEw+1zFwHqxjsrvc46qR9smBsun25LF8oi7NvXp4 3R1i1jQKNjjDxhxBE3IjVV6VnRMh+RnqE3UFKIdPpENpFv2N8t2GfmDCY6JojzUav0= Received: from mail.skyhub.de ([127.0.0.1]) by localhost (door.skyhub.de [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id Rq7FEIS3lbQg; Tue, 29 Oct 2013 12:54:14 +0100 (CET) Received: from liondog.tnic (p54B7E639.dip0.t-ipconnect.de [84.183.230.57]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.skyhub.de (SuperMail on ZX Spectrum 128k) with ESMTPSA id 0AF001DA24E; Tue, 29 Oct 2013 12:54:14 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alien8.de; s=alien8; t=1383047654; bh=ZofmOJLspLeWIeGXYmRlBImGXKusoUREpgm3c48E82w=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:In-Reply-To; b=qNeoo032gepWGM5/jhmjTx13DNtgz32yrRXmiV YsZHfZpZHDlIoVNpRzsg3P56kA3jEw+1zFwHqxjsrvc46qR9smBsun25LF8oi7NvXp4 3R1i1jQKNjjDxhxBE3IjVV6VnRMh+RnqE3UFKIdPpENpFv2N8t2GfmDCY6JojzUav0= Received: by liondog.tnic (Postfix, from userid 1000) id 13729102468; Tue, 29 Oct 2013 12:54:10 +0100 (CET) Date: Tue, 29 Oct 2013 12:54:10 +0100 From: Borislav Petkov To: Gleb Natapov Cc: LKML , Borislav Petkov , "H. Peter Anvin" , Paolo Bonzini , Andre Przywara , Joerg Roedel , X86 ML , KVM Subject: [PATCH 4/5 -v3.1] kvm, emulator: Add initial three-byte insns support Message-ID: <20131029115409.GF10972@pd.tnic> References: <1379861095-628-1-git-send-email-bp@alien8.de> <20131029095300.GW15657@redhat.com> <20131029103003.GA10977@pd.tnic> <20131029103524.GZ15657@redhat.com> <20131029112824.GD10972@pd.tnic> <20131029113603.GC15657@redhat.com> <20131029115303.GE10972@pd.tnic> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20131029115303.GE10972@pd.tnic> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Spam-Status: No, score=-7.3 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Borislav Petkov Add initial support for handling three-byte instructions in the emulator. Signed-off-by: Borislav Petkov --- 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 541801527225..6c5cfe962b28 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -3892,6 +3892,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 three_byte_0f_38_f0 = { + N, N, N, N +}; + +static const struct gprefix three_byte_0f_38_f1 = { + N, N, N, N +}; + +/* + * 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 @@ -4212,6 +4231,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; @@ -4543,6 +4569,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 */ @@ -4727,6 +4755,8 @@ twobyte_insn: goto cannot_emulate; } +threebyte_insn: + if (rc != X86EMUL_CONTINUE) goto done;