From patchwork Tue Feb 9 17:43:45 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 8264511 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 286F89F3CD for ; Tue, 9 Feb 2016 17:51:53 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 68EAA201F2 for ; Tue, 9 Feb 2016 17:51:52 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B2081201B4 for ; Tue, 9 Feb 2016 17:51:51 +0000 (UTC) Received: from localhost ([::1]:58918 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aTCS7-00028h-5g for patchwork-qemu-devel@patchwork.kernel.org; Tue, 09 Feb 2016 12:51:51 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33761) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aTCLU-0007Wc-QC for qemu-devel@nongnu.org; Tue, 09 Feb 2016 12:45:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aTCLT-0000n6-OR for qemu-devel@nongnu.org; Tue, 09 Feb 2016 12:45:00 -0500 Received: from mail-pa0-x244.google.com ([2607:f8b0:400e:c03::244]:36735) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aTCLT-0000mz-DC for qemu-devel@nongnu.org; Tue, 09 Feb 2016 12:44:59 -0500 Received: by mail-pa0-x244.google.com with SMTP id sv5so4143424pab.3 for ; Tue, 09 Feb 2016 09:44:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=3NwvJLJcl5B1JnFT7mfU+oaM2mFCuZaNq9KG8drsHT8=; b=eblryuikiDKtzPUERbFjkMmc/XA9rZh31MoFVzdzmCBrCD8cWWSh1jAcbhbxkUVNJ/ cHqoAFl2cn3z2tZ+Kqexe/edU4oD6z9aedaZt5PM6PXtiikJ8oohGo/uLHYemySa5i3w kT65Xte86edjkvwtfUjQLyOkRQZDvGpH9PU6bcDsjY9mRamsdvatO6Vn8Z4oKDnlZ0zH bTmGE5Mt0zBIEvd57ax0Q7NJs3m63GCzf5hyN+4AiYJGckvnbYyAHDHOYcoYnbWaWMYN +jU8QYH+950J8DRrUcffMqC/mDh6sYJNtzBAMykAIE5gINA5SKeaGiOI7w2k8E5vyfE+ 5+Pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=3NwvJLJcl5B1JnFT7mfU+oaM2mFCuZaNq9KG8drsHT8=; b=fNEoddfbTj0gSJXtX0ue/zZb1hboOeYFt9NY27Mhh8xe3m59h64zNK5tu3jMOQwPqP 3XGk/Jqyo16xXsIZElGOSDKboNZEd/nBsdVkJVeKV7QRIwCz778x6XeQwSyFiKmkFCtQ oENHmgjOBfY9nOCRk0Hjsjt6Pe+ISvkjCeTKjxUi0SldtmYQ6D06gGc3LNoxjxP5nnch qOrTg5qg8I1ZuEpQK6w67y/Ss6v98NlLZKZzV+CIvEyPf37olnxawVBlXqhisEVVZoMv LcCn5jAJJhdH3XlQOPs5YX8WuOXEX2SCXL0U2FFQBgV8qYTlLsglBRzlcpt0vnmJSaK7 UQXA== X-Gm-Message-State: AG10YOSEsatzV4KF/bkWvjujdLCCeMNlOvE/S44dhFY96YF+VjA2BwZgerrYa5GWd1aMbQ== X-Received: by 10.66.185.225 with SMTP id ff1mr51434372pac.97.1455039898738; Tue, 09 Feb 2016 09:44:58 -0800 (PST) Received: from bigtime.com (alanje.lnk.telstra.net. [120.151.179.201]) by smtp.gmail.com with ESMTPSA id pu3sm52144740pac.9.2016.02.09.09.44.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 09 Feb 2016 09:44:58 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Wed, 10 Feb 2016 04:43:45 +1100 Message-Id: <1455039832-9133-10-git-send-email-rth@twiddle.net> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1455039832-9133-1-git-send-email-rth@twiddle.net> References: <1455039832-9133-1-git-send-email-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400e:c03::244 Cc: pbonzini@redhat.com Subject: [Qemu-devel] [PATCH 09/16] target-i386: Implement BNDMK X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham 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 Signed-off-by: Richard Henderson --- target-i386/translate.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/target-i386/translate.c b/target-i386/translate.c index 5e7403f..3baf735 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -71,6 +71,8 @@ static TCGv cpu_cc_dst, cpu_cc_src, cpu_cc_src2, cpu_cc_srcT; static TCGv_i32 cpu_cc_op; static TCGv cpu_regs[CPU_NB_REGS]; static TCGv cpu_seg_base[6]; +static TCGv_i64 cpu_bndl[4]; +static TCGv_i64 cpu_bndu[4]; /* local temps */ static TCGv cpu_T0, cpu_T1; /* local register indexes (only used inside old micro ops) */ @@ -7434,7 +7436,44 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, break; } break; - case 0x119 ... 0x11f: /* nop (multi byte) */ + case 0x11b: + modrm = cpu_ldub_code(env, s->pc++); + if (s->flags & HF_MPX_EN_MASK) { + mod = (modrm >> 6) & 3; + reg = ((modrm >> 3) & 7) | rex_r; + if (mod != 3 && (prefixes & PREFIX_REPZ)) { + /* bndmk */ + if (reg >= 4 + || (prefixes & PREFIX_LOCK) + || s->aflag == MO_16) { + goto illegal_op; + } + AddressParts a = gen_lea_modrm_0(env, s, modrm); + if (a.base >= 0) { + tcg_gen_extu_tl_i64(cpu_bndl[reg], cpu_regs[a.base]); + if (!CODE64(s)) { + tcg_gen_ext32u_i64(cpu_bndl[reg], cpu_bndl[reg]); + } + } else if (a.base == -1) { + /* no base register has lower bound of 0 */ + tcg_gen_movi_i64(cpu_bndl[reg], 0); + } else { + /* rip-relative generates #ud */ + goto illegal_op; + } + tcg_gen_not_tl(cpu_A0, gen_lea_modrm_1(a)); + if (!CODE64(s)) { + tcg_gen_ext32u_tl(cpu_A0, cpu_A0); + } + tcg_gen_extu_tl_i64(cpu_bndu[reg], cpu_A0); + /* bnd registers are now in-use */ + gen_set_hflag(s, HF_MPX_IU_MASK); + break; + } + } + gen_nop_modrm(env, s, modrm); + break; + case 0x119: case 0x11a: case 0x11c ... 0x11f: /* nop (multi byte) */ modrm = cpu_ldub_code(env, s->pc++); gen_nop_modrm(env, s, modrm); break; @@ -7799,6 +7838,12 @@ void tcg_x86_init(void) [R_GS] = "gs_base", [R_SS] = "ss_base", }; + static const char bnd_regl_names[4][8] = { + "bnd0_lb", "bnd1_lb", "bnd2_lb", "bnd3_lb" + }; + static const char bnd_regu_names[4][8] = { + "bnd0_ub", "bnd1_ub", "bnd2_ub", "bnd3_ub" + }; int i; cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); @@ -7824,6 +7869,17 @@ void tcg_x86_init(void) seg_base_names[i]); } + for (i = 0; i < 4; ++i) { + cpu_bndl[i] + = tcg_global_mem_new_i64(TCG_AREG0, + offsetof(CPUX86State, bnd_regs[i].lb), + bnd_regl_names[i]); + cpu_bndu[i] + = tcg_global_mem_new_i64(TCG_AREG0, + offsetof(CPUX86State, bnd_regs[i].ub), + bnd_regu_names[i]); + } + helper_lock_init(); }