From patchwork Mon Feb 15 11:23:28 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 8313811 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 35ED99F6E4 for ; Mon, 15 Feb 2016 11:34:42 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 637F12041D for ; Mon, 15 Feb 2016 11:34:41 +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 8941A203FB for ; Mon, 15 Feb 2016 11:34:40 +0000 (UTC) Received: from localhost ([::1]:59341 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aVHQN-00077o-RI for patchwork-qemu-devel@patchwork.kernel.org; Mon, 15 Feb 2016 06:34:39 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40478) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aVHGn-0000c9-AV for qemu-devel@nongnu.org; Mon, 15 Feb 2016 06:24:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aVHGm-00032r-0T for qemu-devel@nongnu.org; Mon, 15 Feb 2016 06:24:45 -0500 Received: from mail-qg0-x22f.google.com ([2607:f8b0:400d:c04::22f]:34260) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aVHGl-00032O-Qm for qemu-devel@nongnu.org; Mon, 15 Feb 2016 06:24:43 -0500 Received: by mail-qg0-x22f.google.com with SMTP id b67so108018524qgb.1 for ; Mon, 15 Feb 2016 03:24:43 -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=dfh/P4kc3kFjFJLF1sb4+mP5RWMD7oufDf9BcvXwMUs=; b=dE9cRGV064RudYRVdk21VMFnkz7scRGs7YG8mamAZw14glor1X5T0aDgd2pLX0mNm8 +TNk/zRUQ39CL1twtbeYI+T4Oy3YHzjbZIVip0R1DQEPI7dNCiosF3rG3ZXgaL/Yl8E8 f4pOavp4/k55vizsxgtIqcEECElpgX6xC/8c34w3EPx1P9UkpH1yYwU49j1fg5eTWkiM zJgjoBFgpM0wQFyJivz4fY4NFIr8NA+hmD9rME2+e/jiBOeu5y7VsLa2vDCe0eMuJw9Q VgmX8MQZnq73jZ2KKlg5u7kHRWElra4pmeDaTipoW+RYY/lgX4GEi6srMvr63jWQ5Tv0 /I7Q== 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=dfh/P4kc3kFjFJLF1sb4+mP5RWMD7oufDf9BcvXwMUs=; b=eYb3vp1Zi9plDT07sa0nUjgPZjlw55ILfxTa1LkzFNYTXQAOrwxTlNeqo0FcWH9oky LaRHbqQX6zECXU+is+dD3w/ieW6vbrAe6VT1yjhdLuv4OrzQCJrkq4kVsP41th7egL3o CkBBkP2/2cy6ZUDc5uEJcN2mCdw8AeJ3AciGyWkf5hdIpvU2SjcfFgS/vm4ZhePs10Qu xJyNnQc5qX+/NWvvIyZs1Cl/ggnszQMeeyzpWkoANbFXmdClo9lQ3vg21j2lVRqWhmKa exUpYSevmXrGFf3rFIN5dfKc2J6xtxOOd5GtxXfWI/s70lNAjRPlhE93D1Ow9q2N71U5 txaQ== X-Gm-Message-State: AG10YOTjkuFaCVSXNAlwty+xNnFlk+Z8XlFdpM34p8Q4SidEedzahSYq5AsQdbxXwUu7Bg== X-Received: by 10.140.105.195 with SMTP id c61mr19296334qgf.40.1455535483462; Mon, 15 Feb 2016 03:24:43 -0800 (PST) Received: from bigtime.com ([103.226.32.154]) by smtp.gmail.com with ESMTPSA id 191sm10824296qhq.17.2016.02.15.03.24.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Feb 2016 03:24:43 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 15 Feb 2016 22:23:28 +1100 Message-Id: <1455535408-26566-17-git-send-email-rth@twiddle.net> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1455535408-26566-1-git-send-email-rth@twiddle.net> References: <1455535408-26566-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:400d:c04::22f Cc: peter.maydell@linaro.org, pbonzini@redhat.com Subject: [Qemu-devel] [PULL 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 ad7053e..9171929 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -7902,6 +7902,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 */