From patchwork Tue Feb 9 17:43:52 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 8264531 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 9A7939F3CD for ; Tue, 9 Feb 2016 17:52:55 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D4E25201B4 for ; Tue, 9 Feb 2016 17:52:54 +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 0DBE620160 for ; Tue, 9 Feb 2016 17:52:54 +0000 (UTC) Received: from localhost ([::1]:58931 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aTCT7-0003xq-Ff for patchwork-qemu-devel@patchwork.kernel.org; Tue, 09 Feb 2016 12:52:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33910) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aTCLq-0008Da-8g for qemu-devel@nongnu.org; Tue, 09 Feb 2016 12:45:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aTCLp-0000vj-3W for qemu-devel@nongnu.org; Tue, 09 Feb 2016 12:45:22 -0500 Received: from mail-pa0-x243.google.com ([2607:f8b0:400e:c03::243]:33984) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aTCLo-0000vY-P0 for qemu-devel@nongnu.org; Tue, 09 Feb 2016 12:45:21 -0500 Received: by mail-pa0-x243.google.com with SMTP id yy13so7258916pab.1 for ; Tue, 09 Feb 2016 09:45:20 -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=pgZEm2L0Y6cr6Pj3Bt8xMsov9IUItgeHQbS1F9x1Y7g=; b=GxNfzyV8hMOlJ5XGby/bnnU9mQMPRsRs7tmbRc5UCTNomJWZunVAOGhYUx9pvkX0FJ h/8+VYv3pfLUquTa4FWEEszjWnUIIqAi5HzRDgRfxZxRKYLDZICBJo+aNwzO3wT5HKwV q39AVIZGUEWFtN5PRZ5aSIgPZ+m3A4Q9cRuIZHt5x/fLExKQeSw6K27nz6xqagU75Z1R ufSHFzDD1HnTXQA/1qBbssLBCCioqlkr/Bh+QULfEjU60g6zHxAgHhPx2RUH8lfL7V5H e2Ddue1tpLzSKpapnhJqIyEPQCfTTh6wF6uuXo7wstV9Kzrkt42qjPHBBNYW81XMPG9u mK0g== 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=pgZEm2L0Y6cr6Pj3Bt8xMsov9IUItgeHQbS1F9x1Y7g=; b=KXrRwe/Pb/j4Xjl0XJUbE/gPI8HNOvSHWW07SmWlHVOQ7SafJaLDLUHCPG3cRNOcBf JT/f0NDyjI3ib8TWUt/TF5pzqz75uPwIgBA8qVjPK7Nu47zjzTdt/m+FUqdYs/LSs73S DKNICiI8Dx5ir0/hrFORSzfzh3V8h5O6mfwqn1g8pWzd0Vl3z4Gf2axs1mOio+1CkEog NIsc4ZHFDbekdr9E/7ptQjDOQET/1KZ7P0PG3JT+aysTw5KTy0NCPzs8ByP1X+VgyTA+ 4PQH0k/BCh5KNsrKFJpLM/as9BtQZgrdFJfJ7p9vaqhPkWTeWuNfDcbPo09U/gyCvdOo vxjg== X-Gm-Message-State: AG10YOTFk4Msi+ZzO7lTI4xO/5JkEAw1GgriFqekr7GyLOAXap8A/tqev4ACF/PmxVQA5A== X-Received: by 10.66.141.142 with SMTP id ro14mr51414985pab.112.1455039920131; Tue, 09 Feb 2016 09:45:20 -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.45.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 09 Feb 2016 09:45:19 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Wed, 10 Feb 2016 04:43:52 +1100 Message-Id: <1455039832-9133-17-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::243 Cc: pbonzini@redhat.com Subject: [Qemu-devel] [PATCH 16/16] target-i386: Implement FSGSBASE 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/cpu.c | 7 +++++-- target-i386/helper.h | 1 + target-i386/int_helper.c | 10 ++++++++++ target-i386/translate.c | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 063c8fb..0af43a3 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -358,9 +358,9 @@ static const char *cpuid_6_feature_name[] = { #define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \ CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \ CPUID_7_0_EBX_PCOMMIT | CPUID_7_0_EBX_CLFLUSHOPT | \ - CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX) + CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE) /* missing: - CPUID_7_0_EBX_FSGSBASE, CPUID_7_0_EBX_HLE, CPUID_7_0_EBX_AVX2, + CPUID_7_0_EBX_HLE, CPUID_7_0_EBX_AVX2, CPUID_7_0_EBX_ERMS, CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM, CPUID_7_0_EBX_RDSEED */ #define TCG_7_0_ECX_FEATURES 0 @@ -2730,6 +2730,9 @@ static void x86_cpu_reset(CPUState *s) if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) { cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK; } + if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) { + cr4 |= CR4_FSGSBASE_MASK; + } #endif env->xcr0 = xcr0; diff --git a/target-i386/helper.h b/target-i386/helper.h index 60a615f..e33451a 100644 --- a/target-i386/helper.h +++ b/target-i386/helper.h @@ -15,6 +15,7 @@ DEF_HELPER_2(idivl_EAX, void, env, tl) DEF_HELPER_2(divq_EAX, void, env, tl) DEF_HELPER_2(idivq_EAX, void, env, tl) #endif +DEF_HELPER_FLAGS_2(cr4_testbit, TCG_CALL_NO_WG, void, env, i32) DEF_HELPER_FLAGS_2(bndck, TCG_CALL_NO_WG, void, env, i32) DEF_HELPER_FLAGS_3(bndldx32, TCG_CALL_NO_WG, i64, env, tl, tl) diff --git a/target-i386/int_helper.c b/target-i386/int_helper.c index 9d0d21e..cf5bbb0 100644 --- a/target-i386/int_helper.c +++ b/target-i386/int_helper.c @@ -470,3 +470,13 @@ target_ulong helper_pext(target_ulong src, target_ulong mask) #include "shift_helper_template.h" #undef SHIFT #endif + +/* Test that BIT is enabled in CR4. If not, raise an illegal opcode + exception. This reduces the requirements for rare CR4 bits being + mapped into HFLAGS. */ +void helper_cr4_testbit(CPUX86State *env, uint32_t bit) +{ + if (unlikely((env->cr[4] & bit) == 0)) { + raise_exception_ra(env, EXCP06_ILLOP, GETPC()); + } +} diff --git a/target-i386/translate.c b/target-i386/translate.c index 59470f7..027c2fc 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -7898,6 +7898,40 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_nop_modrm(env, s, modrm); break; + case 0xc0 ... 0xc7: /* rdfsbase (f3 0f ae /0) */ + case 0xc8 ... 0xc8: /* rdgsbase (f3 0f ae /1) */ + case 0xd0 ... 0xd7: /* wrfsbase (f3 0f ae /2) */ + case 0xd8 ... 0xd8: /* wrgsbase (f3 0f ae /3) */ + if (CODE64(s) + && (prefixes & PREFIX_REPZ) + && !(prefixes & PREFIX_LOCK) + && (s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_FSGSBASE)) { + TCGv base, treg, src, dst; + + /* Preserve hflags bits by testing CR4 at runtime. */ + tcg_gen_movi_i32(cpu_tmp2_i32, CR4_FSGSBASE_MASK); + gen_helper_cr4_testbit(cpu_env, cpu_tmp2_i32); + + base = cpu_seg_base[modrm & 8 ? R_GS : R_FS]; + treg = cpu_regs[(modrm & 7) | REX_B(s)]; + + if (modrm & 0x10) { + /* wr*base */ + dst = base, src = treg; + } else { + /* rd*base */ + dst = treg, src = base; + } + + if (s->dflag == MO_32) { + tcg_gen_ext32u_tl(dst, src); + } else { + tcg_gen_mov_tl(dst, src); + } + break; + } + goto illegal_op; + case 0xf8: /* sfence / pcommit */ if (prefixes & PREFIX_DATA) { /* pcommit */