Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp867348imm; Fri, 29 Jun 2018 07:41:11 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcnsMRhAJMsClc8y1G8oQPpJvrJqSWDgokbtFWFzdinEotQACmrEyhl52fthnQjn9m5MTB2 X-Received: by 2002:a62:675b:: with SMTP id b88-v6mr10571115pfc.24.1530283271513; Fri, 29 Jun 2018 07:41:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530283271; cv=none; d=google.com; s=arc-20160816; b=B0UCXqO2RQmwkDk04ebUlPzt6mT1PSAXEKwpOoNLRoaCgdn8JXexjJjoj29f0H3mX2 4Iaj3sMcHrJI4L8uULdtPcOjw3yfIUq43CGJweoDk4MXEreYlLojvXWAD81M+Iec427Q SxWQU4kd1tmTycTKF0JKOWrXHx7+AYNrOU4xM29wIEVQZsSPk2GvrYS2UtDOCXcICREz 3JRTy8tZFZmvmPMOcQRbyLOOHhq/75So8skrZfZ4mHJfm5lXZK9nHKJr1Buz5hnkf7x+ l5Utu++N+f9hkEjjiHLRopRJ1lQmLZEznvRY23ZC3uq3lcO1jWLhkDtUU/9Ra4LIwohc qNCg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=5ioJSWVoJinDz1trASvuyTCu/aRts8oBaS/CaqXu5jw=; b=cvaY+1cckWJpaT/3VpnnssXfcyioRtz09TWIn3ehnImP4M/4tMzhryEMUQhBBThgeO OM83w3pDrB/FRgf6qJ8grJoJ5+sGcqfV/KYJipatz+OtxnAfqQCTuSqJYtuimD14kK24 GJok9mSzi74Mo1VqU0s7AOAlFTYYTtXFGXo4ga44DQV4hr7T6LTfMXhBjMg/ZWnyrR4k 5C5Fs+sV21MqarsVLvOh+eL/ysOiz3I6+bWCvsreQw+3/vqkmiozTR5+rL+7Sxhx/rGX xcPRv0eNRFIYgCQknOttRbikLz15dgXh1+S+oHA0S9n3GP3daH9yHpUGMK5LZBoqo9zV jlhw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c15-v6si8043526pgv.62.2018.06.29.07.40.57; Fri, 29 Jun 2018 07:41:11 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965296AbeF2Ofv (ORCPT + 99 others); Fri, 29 Jun 2018 10:35:51 -0400 Received: from mga17.intel.com ([192.55.52.151]:9673 "EHLO mga17.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754928AbeF2Oeq (ORCPT ); Fri, 29 Jun 2018 10:34:46 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Jun 2018 07:34:45 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,285,1526367600"; d="scan'208";a="51490712" Received: from romley-ivt3.sc.intel.com ([172.25.110.60]) by fmsmga008.fm.intel.com with ESMTP; 29 Jun 2018 07:34:45 -0700 From: Fenghua Yu To: "Thomas Gleixner" , "Ingo Molnar" , "H Peter Anvin" Cc: "Ashok Raj" , "Alan Cox" , "Dave Hansen" , "Peter Zijlstra" , "Rafael Wysocki" , "Tony Luck" , "Ravi V Shankar" , "linux-kernel" , "x86" , Fenghua Yu Subject: [PATCH v2 1/4] x86/split_lock: Enumerate #AC exception for split locked access feature Date: Fri, 29 Jun 2018 07:33:24 -0700 Message-Id: <1530282807-66555-2-git-send-email-fenghua.yu@intel.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1530282807-66555-1-git-send-email-fenghua.yu@intel.com> References: <1530282807-66555-1-git-send-email-fenghua.yu@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Alignment Check (#AC) exception for split lock is supported on Tremont and future processors. We need to enumerate the feature on processors. Bit 29 in MSR TEST_CTL 0x33 can only be set on processors that support the feature. On processors not supporting the feature, the bit is reserved (i.e. cannot be set as one) or the MSR doesn't exist. To detect the feature, attempt to set the bit in the MSR. If the writing succeeds, the feature is available. Otherwise, the feature is not supported on this platform. test_ctl.c is created to contain majority of split lock code. Hopefully more features related to MSR_TEST_CTL will be added to the file and share some code with split lock in future. More information on the bit 29 and MSR TEST_CTL can be found in the latest Intel Architecture Instruction Set Extensions and Future Features Programming Reference. Signed-off-by: Fenghua Yu --- arch/x86/include/asm/cpu.h | 1 + arch/x86/include/asm/cpufeatures.h | 1 + arch/x86/include/asm/msr-index.h | 4 ++++ arch/x86/kernel/cpu/Makefile | 1 + arch/x86/kernel/cpu/test_ctl.c | 46 ++++++++++++++++++++++++++++++++++++++ arch/x86/kernel/setup.c | 2 ++ 6 files changed, 55 insertions(+) create mode 100644 arch/x86/kernel/cpu/test_ctl.c diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h index adc6cc86b062..bd64380d598b 100644 --- a/arch/x86/include/asm/cpu.h +++ b/arch/x86/include/asm/cpu.h @@ -40,4 +40,5 @@ int mwait_usable(const struct cpuinfo_x86 *); unsigned int x86_family(unsigned int sig); unsigned int x86_model(unsigned int sig); unsigned int x86_stepping(unsigned int sig); +void detect_ac_split_lock(void); #endif /* _ASM_X86_CPU_H */ diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h index 5701f5cecd31..c1bc06542e78 100644 --- a/arch/x86/include/asm/cpufeatures.h +++ b/arch/x86/include/asm/cpufeatures.h @@ -219,6 +219,7 @@ #define X86_FEATURE_IBPB ( 7*32+26) /* Indirect Branch Prediction Barrier */ #define X86_FEATURE_STIBP ( 7*32+27) /* Single Thread Indirect Branch Predictors */ #define X86_FEATURE_ZEN ( 7*32+28) /* "" CPU is AMD family 0x17 (Zen) */ +#define X86_FEATURE_AC_SPLIT_LOCK ( 7*32+29) /* #AC exception for split locked access */ /* Virtualization flags: Linux defined, word 8 */ #define X86_FEATURE_TPR_SHADOW ( 8*32+ 0) /* Intel TPR Shadow */ diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index 68b2c3150de1..7b9496850370 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h @@ -39,6 +39,10 @@ /* Intel MSRs. Some also available on other CPUs */ +#define MSR_TEST_CTL 0x00000033 +#define MSR_TEST_CTL_ENABLE_AC_SPLIT_LOCK_SHIFT 29 +#define MSR_TEST_CTL_ENABLE_AC_SPLIT_LOCK BIT(29) + #define MSR_IA32_SPEC_CTRL 0x00000048 /* Speculation Control */ #define SPEC_CTRL_IBRS (1 << 0) /* Indirect Branch Restricted Speculation */ #define SPEC_CTRL_STIBP (1 << 1) /* Single Thread Indirect Branch Predictors */ diff --git a/arch/x86/kernel/cpu/Makefile b/arch/x86/kernel/cpu/Makefile index 347137e80bf5..22a3fa26bfd4 100644 --- a/arch/x86/kernel/cpu/Makefile +++ b/arch/x86/kernel/cpu/Makefile @@ -46,6 +46,7 @@ obj-$(CONFIG_MICROCODE) += microcode/ obj-$(CONFIG_X86_LOCAL_APIC) += perfctr-watchdog.o obj-$(CONFIG_HYPERVISOR_GUEST) += vmware.o hypervisor.o mshyperv.o +obj-y += test_ctl.o ifdef CONFIG_X86_FEATURE_NAMES quiet_cmd_mkcapflags = MKCAP $@ diff --git a/arch/x86/kernel/cpu/test_ctl.c b/arch/x86/kernel/cpu/test_ctl.c new file mode 100644 index 000000000000..af1822469c94 --- /dev/null +++ b/arch/x86/kernel/cpu/test_ctl.c @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Enable #AC exception for split locked accesses in TEST_CTL MSR + * + * Copyright (C) 2018 Intel Corporation + * + * Author: + * Fenghua Yu + */ +#include +#include +#include + +/* Detect feature of #AC for split lock by probing bit 29 in MSR_TEST_CTL. */ +void detect_ac_split_lock(void) +{ + u64 val, orig_val; + int ret; + + /* Attempt to read the MSR. If the MSR doesn't exist, reading fails. */ + ret = rdmsrl_safe(MSR_TEST_CTL, &val); + if (ret) + return; + + orig_val = val; + + /* Turn on the split lock bit */ + val |= MSR_TEST_CTL_ENABLE_AC_SPLIT_LOCK; + + /* + * Attempt to set bit 29 in the MSR. The bit is set successfully + * only on processors that support #AC for split lock. + */ + ret = wrmsrl_safe(MSR_TEST_CTL, val); + if (ret) + return; + + /* The feature is supported on CPU. */ + setup_force_cpu_cap(X86_FEATURE_AC_SPLIT_LOCK); + + /* + * Need to restore split lock setting to original firmware setting + * before leaving. + */ + wrmsrl(MSR_TEST_CTL, orig_val); +} diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 2f86d883dd95..18de4e35a4e5 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -953,6 +953,8 @@ void __init setup_arch(char **cmdline_p) parse_early_param(); + detect_ac_split_lock(); + if (efi_enabled(EFI_BOOT)) efi_memblock_x86_reserve_range(); #ifdef CONFIG_MEMORY_HOTPLUG -- 2.5.0