From patchwork Tue Apr 4 10:27:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Li, Xin3" X-Patchwork-Id: 79014 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp2949716vqo; Tue, 4 Apr 2023 04:28:48 -0700 (PDT) X-Google-Smtp-Source: AKy350bGUz/kXx3yVVufgOn2MxN3/ydYcft4Tm2TEtClIv58VRenwF0+ZuyKNei2JbdHhJW/IGhx X-Received: by 2002:a05:6a20:29a0:b0:d8:f061:abab with SMTP id f32-20020a056a2029a000b000d8f061ababmr2014192pzh.5.1680607728658; Tue, 04 Apr 2023 04:28:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680607728; cv=none; d=google.com; s=arc-20160816; b=TSlLCA9CIC23jCHNaYLIv6B00M6NwvyJP8F4TgMX6PDUrbD8rVZGlGfyT3PIznq7UP /VSIn5y9z0lXliakjUxwQrMvpB/PlsIW44Lungd89Ymu8n/VSavM5OcyYkKFRtt1+ftk cNdxRVLRuiJQuc6sM0JIf1doR/m2jEu0OZC58rvipeAiwleNe5hth8v8fZImGTl6D4Nw A9gP7DxdpqBNhbhewuKr7xV5w4930IRwUlokokzLRMwKPzaYw4R1SupSD6cyuTZ+348Y rfrUjIEIxGrVjxhfamEz0BW+5qurMawQmQOxevo2j8jWdFbj71C+7Rv37Beabp/im+3K BU1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=FujSQUqHBZl8iLTALotlYQnjAeVJMmty12OH3VL/Yzw=; b=IpHD+C3TInB4Ky7l3tLsNdeToLjqsZ+g+YsJtEGvu1eF0JPx4dgdJUYMkdnEzIXspX wbVc0IRoviqU8r67eijRr6j2Mlk2tMq1L9AcmZEodWPrX1fHC0/viKZdAmRGJSM3LfKg yF/fOnGNjqwzFtQszOVnndEF1XmAUMCWtKYuuQMrWXdbhfkiBQOkuUUhMXeeUdF48EL3 HqO1YjGLZf7cVFyzqUJGUROLGO/Tkc8j4wuDjMYBbMiGovyW2ilLksF+UT6IfDKJL00H 86bnk1TjaadWUUPPlzzw8TW5SLOw/V3rKJjG6SzoJB04FqK+rhzKjY2fsJjSrXQBD2jc EhxA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=cPMrKTd6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h189-20020a6383c6000000b0050be68e217esi10045070pge.477.2023.04.04.04.28.35; Tue, 04 Apr 2023 04:28:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=cPMrKTd6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233741AbjDDKzT (ORCPT + 99 others); Tue, 4 Apr 2023 06:55:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39208 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234816AbjDDKyV (ORCPT ); Tue, 4 Apr 2023 06:54:21 -0400 Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DA2C130DA; Tue, 4 Apr 2023 03:53:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1680605615; x=1712141615; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=8g9fYneHGWezeTK24y61/oxUFG9XbGt0W4kIun9/SEQ=; b=cPMrKTd6DG1w8kdIqrV6UxP5PwQv2LeZaedgAUFgYFezdNUe/A7onH3B mfbwt9ggmeEew4rzOG1ltd7HcSU2Hl9BRjzMYg3//dxBZgdtoh74k0P2m eSkz2DkGXsDkM45Vaq2UppYWtN2OU7HADQ9lAcjASsu2VUKVXnYImavui en4z4Fm04Z0E/YE1JS+CvA+34FgmoKRygL0dwVBZDFBxgUvjAhr96IpUY /LwztCyiEVntlceuGV5Ec8Lle07F+OhJauCbKIBtZXeeaz4dWk+yWQD3H r1CWNxrXLBmAWrjp+N7ljTmOzzQ1OsfvRsdypJbDt+HRsQrsYWGXMiTRo A==; X-IronPort-AV: E=McAfee;i="6600,9927,10669"; a="330734108" X-IronPort-AV: E=Sophos;i="5.98,317,1673942400"; d="scan'208";a="330734108" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Apr 2023 03:53:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10669"; a="775597832" X-IronPort-AV: E=Sophos;i="5.98,317,1673942400"; d="scan'208";a="775597832" Received: from unknown (HELO fred..) ([172.25.112.68]) by FMSMGA003.fm.intel.com with ESMTP; 04 Apr 2023 03:53:04 -0700 From: Xin Li To: linux-kernel@vger.kernel.org, x86@kernel.org, kvm@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, hpa@zytor.com, peterz@infradead.org, andrew.cooper3@citrix.com, seanjc@google.com, pbonzini@redhat.com, ravi.v.shankar@intel.com, jiangshanlai@gmail.com, shan.kang@intel.com Subject: [PATCH v7 18/33] x86/fred: add a NMI entry stub for FRED Date: Tue, 4 Apr 2023 03:27:01 -0700 Message-Id: <20230404102716.1795-19-xin3.li@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230404102716.1795-1-xin3.li@intel.com> References: <20230404102716.1795-1-xin3.li@intel.com> MIME-Version: 1.0 X-Spam-Status: No, score=-2.5 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1762244929598838783?= X-GMAIL-MSGID: =?utf-8?q?1762244929598838783?= From: "H. Peter Anvin (Intel)" On a FRED system, NMIs nest both with themselves and faults, transient information is saved into the stack frame, and NMI unblocking only happens when the stack frame indicates that so should happen. Thus, the NMI entry stub for FRED is really quite small... Signed-off-by: H. Peter Anvin (Intel) Tested-by: Shan Kang Signed-off-by: Xin Li --- arch/x86/include/asm/fred.h | 1 + arch/x86/kernel/nmi.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/arch/x86/include/asm/fred.h b/arch/x86/include/asm/fred.h index f670430aaa54..9ce2a6439091 100644 --- a/arch/x86/include/asm/fred.h +++ b/arch/x86/include/asm/fred.h @@ -99,6 +99,7 @@ static __always_inline unsigned long fred_event_data(struct pt_regs *regs) #define DEFINE_FRED_HANDLER(f) noinstr DECLARE_FRED_HANDLER(f) typedef DECLARE_FRED_HANDLER((*fred_handler)); +DECLARE_FRED_HANDLER(fred_exc_nmi); DECLARE_FRED_HANDLER(fred_exc_debug); DECLARE_FRED_HANDLER(fred_exc_page_fault); diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index 776f4b1e395b..e7b2abe42583 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c @@ -34,6 +34,7 @@ #include #include #include +#include #define CREATE_TRACE_POINTS #include @@ -643,6 +644,24 @@ void nmi_backtrace_stall_check(const struct cpumask *btp) #endif +#ifdef CONFIG_X86_FRED +DEFINE_FRED_HANDLER(fred_exc_nmi) +{ + /* + * With FRED, CR2 and DR6 are pushed atomically on faults, + * so we don't have to worry about saving and restoring them. + * Breakpoint faults nest, so assume it is OK to leave DR7 + * enabled. + */ + irqentry_state_t irq_state = irqentry_nmi_enter(regs); + + inc_irq_stat(__nmi_count); + default_do_nmi(regs); + + irqentry_nmi_exit(regs, irq_state); +} +#endif + void stop_nmi(void) { ignore_nmis++;