Received: by 2002:ac0:aed5:0:0:0:0:0 with SMTP id t21csp909664imb; Fri, 1 Mar 2019 18:54:00 -0800 (PST) X-Google-Smtp-Source: APXvYqwQZwf6zgz+1rovQpTQV9AYxcNKFk5PcJYlNQ2nk3attmu6mSH/RmgysS+A0+gN7w0a7O7I X-Received: by 2002:a63:2bc6:: with SMTP id r189mr7877332pgr.201.1551495240276; Fri, 01 Mar 2019 18:54:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551495240; cv=none; d=google.com; s=arc-20160816; b=JwU0H56jNOMe/BP8klRNsQi2ESo2csPrn+rZvQRXN/5TJ5E+XLjvTJMSbuStyKI5QQ ULwDHxxqmVZxq8+rkZM3keUpNWVcV+YZQgTmvgubIFXiTnKEMk039zCkK0IvsX8Vk0qK sCiQjYrAkIfeO51tMedB5gTuDJendWWoz6Sp2aChOdxOKN8b5Du+sU/v/IB7ZZKhW8sV Zm8zqg82gQHXwuo/Y55ASWqdFHxJFt7pVcAO3jLbr9yS2XogFbDdu2B1AKbUumgLmDjR dTaxK/yp50Gt/0HDaKx/Kj2b3fRn9IKK4Udqusjbhc2eIn0yfn8PTkGIW8SybAHbsuhe RE/A== 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; bh=tcmKGMLDQY902uLyHo2IHEpGzYD/eoNDA83WSxkRz1k=; b=JByVF8CqVSUogOI9Yxd8E0oMzDQO2IOI+B7fhbsL4F5Sd9AKiChxa5Hc3hwq3owPwN IhYd60e7SsHvaZ5XJZbNvmHnFHskdCOUYlbwGQ3zOhukYT1b+O4lfXfRIxdQi+hWmku5 eKqaiuDV8gJn9FD2NsxcrUsH9zl6gWS3yo/y/cj1DeQJ9NoFhRWy0d2BEwxoK+HbCcI2 M3daJdG9zJyrgaPl0V7K+a6Kpup5N3YoXwTKUwIETBTcQXe0m1zy0xt2EG/ql7mgWOen 5NPh9msUi1qxAcO0jzv7ImFF4CMCuc4j0lqlx4+QaBR8iaVUOESZtqI7E63FsrxtZLze qX7g== 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 q6si21999348pgq.442.2019.03.01.18.53.38; Fri, 01 Mar 2019 18:54:00 -0800 (PST) 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 S1728129AbfCBCw7 (ORCPT + 99 others); Fri, 1 Mar 2019 21:52:59 -0500 Received: from mga04.intel.com ([192.55.52.120]:49764 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727896AbfCBCwd (ORCPT ); Fri, 1 Mar 2019 21:52:33 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Mar 2019 18:52:29 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,430,1544515200"; d="scan'208";a="148572625" Received: from romley-ivt3.sc.intel.com ([172.25.110.60]) by fmsmga004.fm.intel.com with ESMTP; 01 Mar 2019 18:52:29 -0800 From: Fenghua Yu To: "Thomas Gleixner" , "Ingo Molnar" , "Borislav Petkov" , "H Peter Anvin" , "Paolo Bonzini" , "Dave Hansen" , "Ashok Raj" , "Peter Zijlstra" , "Ravi V Shankar" , "Xiaoyao Li " Cc: "linux-kernel" , "x86" , kvm@vger.kernel.org, Fenghua Yu Subject: [PATCH v4 13/17] x86/split_lock: Handle #AC exception for split lock Date: Fri, 1 Mar 2019 18:45:07 -0800 Message-Id: <1551494711-213533-14-git-send-email-fenghua.yu@intel.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1551494711-213533-1-git-send-email-fenghua.yu@intel.com> References: <1551494711-213533-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 There may be different considerations on how to handle #AC for split lock, e.g. how to handle system hang caused by split lock issue in firmware, how to emulate faulting instruction, etc. We use a simple method to handle user and kernel split lock and may extend the method in the future. When #AC exception for split lock is triggered from user process, the process is killed by SIGBUS. To execute the process properly, user application developer needs to fix the split lock issue. When #AC exception for split lock is triggered from a kernel instruction, disable #AC for split lock on local CPU and warn the split lock issue. After the exception, the faulting instruction will be executed and kernel execution continues. #AC for split lock is only disabled on the local CPU not globally. It will be re-enabled if the CPU is offline and then online. Kernel developer should check the warning, which contains helpful faulting address, context, and callstack info, and fix the split lock issue one by one. Then further split lock may be captured and fixed. After bit 29 in MSR_TEST_CTL is set as one in kernel, firmware inherits the setting when firmware is executed in S4, S5, run time services, SMI, etc. Split lock issue in firmware triggers #AC and may hang the system depending on how firmware handles the #AC. It's up to firmware developer to fix the split lock issues in firmware. Signed-off-by: Fenghua Yu --- arch/x86/include/asm/msr-index.h | 4 ++++ arch/x86/kernel/traps.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index 549e73dcca15..d2d43ebcb8ab 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 TEST_CTL_ENABLE_SPLIT_LOCK_DETECT_SHIFT 29 +#define TEST_CTL_ENABLE_SPLIT_LOCK_DETECT BIT(29) + #define MSR_IA32_SPEC_CTRL 0x00000048 /* Speculation Control */ #define SPEC_CTRL_IBRS (1 << 0) /* Indirect Branch Restricted Speculation */ #define SPEC_CTRL_STIBP_SHIFT 1 /* Single Thread Indirect Branch Predictor (STIBP) bit */ diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index c43c2608332e..63a4dc985340 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -61,6 +61,7 @@ #include #include #include +#include #ifdef CONFIG_X86_64 #include @@ -292,7 +293,37 @@ DO_ERROR(X86_TRAP_OLD_MF, SIGFPE, 0, NULL, "coprocessor segment overru DO_ERROR(X86_TRAP_TS, SIGSEGV, 0, NULL, "invalid TSS", invalid_TSS) DO_ERROR(X86_TRAP_NP, SIGBUS, 0, NULL, "segment not present", segment_not_present) DO_ERROR(X86_TRAP_SS, SIGBUS, 0, NULL, "stack segment", stack_segment) +#ifndef CONFIG_CPU_SUP_INTEL DO_ERROR(X86_TRAP_AC, SIGBUS, BUS_ADRALN, NULL, "alignment check", alignment_check) +#else +dotraplinkage void do_alignment_check(struct pt_regs *regs, long error_code) +{ + unsigned int trapnr = X86_TRAP_AC; + char str[] = "alignment check"; + int signr = SIGBUS; + + RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); + + if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) != + NOTIFY_STOP) { + cond_local_irq_enable(regs); + if (!user_mode(regs)) { + /* + * Only split lock can generate #AC from kernel. Warn + * and disable #AC for split lock on current CPU. + */ + msr_clear_bit(MSR_TEST_CTL, + TEST_CTL_ENABLE_SPLIT_LOCK_DETECT_SHIFT); + WARN_ONCE(1, "A split lock issue is detected.\n"); + + return; + } + /* Handle #AC generated from user code. */ + do_trap(X86_TRAP_AC, SIGBUS, "alignment check", regs, + error_code, BUS_ADRALN, NULL); + } +} +#endif #undef IP #ifdef CONFIG_VMAP_STACK -- 2.7.4