From patchwork Sat Dec 16 06:31:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Li, Xin3" X-Patchwork-Id: 179824 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:24d3:b0:fb:cd0c:d3e with SMTP id r19csp75512dyi; Fri, 15 Dec 2023 23:03:12 -0800 (PST) X-Google-Smtp-Source: AGHT+IHYW+qbvQrcv5WLskAaNyTiDkWvM5FfGIfd0gjPlE55TE1KEOFR/8VaUUZDmqNT/hqQKa9S X-Received: by 2002:a05:620a:1452:b0:77f:364a:9466 with SMTP id i18-20020a05620a145200b0077f364a9466mr13072587qkl.94.1702710192325; Fri, 15 Dec 2023 23:03:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702710192; cv=none; d=google.com; s=arc-20160816; b=yR2agwE1rIi+5Q+s+LK9cAW0axkaU2q7LnuKQ3IP/9IAi2Xaksx9zwWoVN4azXLYUE wisZS8TdRCFugnVrUaacMWFwL3J+rf4F2hOVj2qHmNDpNmNeWvtlei1ZR0+LfcDN4BF5 4QW1fgFn1/67uq31YJvI/krNRpBA/Kiu0pm2fbyd0dA9lLlb97WnG6l7HD1GjlUJxP58 BJJXB+wBsi1zGCbpPzn34V/jDCeWhRhsMMVyf4MYU2RfE0GDvb4MO88YpeLQg73b9RqB zc54AD5kjNbWhXbKiG8YyJ/Rd0VdNjRj5G2aqzH2diMOecL5eEEwLKtVGv3GRNt0Gjaw h4DA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=9Docf9dS1hhUDhKVcdL2IkInviAKlSNJEZ2Xu+ZmTfs=; fh=uCCWEUVpLc/xDP/D3WvGY/BxHU9d0NQYu/T71GEsNmA=; b=V2pvTlSDugAAT2CJ9m+8QwCZXaZR/wxInd7xMZsVxO30eVZ0uEq0q6dxvL7vyI+ArF WHBgod160bBQzcPx4MxknYaG6P9bHOrfq6uJkgsLzIr6jT8aOLzqBHP2ccANGdk1UuFq 4tEi4By6GPD3CqOd58pF64+7vC+dd2oYnBYQeL3CAB0yoMevm1Jt4c+tBwjFHL00MlxR b8pkpw4ib9Lalr0OREY2HRAGiml9uXfBYtbPPuPBiik8X8f5BUH8HfRpTD0NGpO4slVS mkfMe/TTk81feqnovuOZnowuvN8WBJRW66XQLhS3n/4jOhTqAcokN4T9YcWs9aq4aZd4 5Atg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lyoqq0er; spf=pass (google.com: domain of linux-kernel+bounces-2121-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-2121-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id o17-20020a05620a229100b0077a565e3fedsi18140188qkh.118.2023.12.15.23.03.12 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Dec 2023 23:03:12 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-2121-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lyoqq0er; spf=pass (google.com: domain of linux-kernel+bounces-2121-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-2121-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 1CDCF1C24919 for ; Sat, 16 Dec 2023 07:03:12 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 3F9EB1427B; Sat, 16 Dec 2023 07:02:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="lyoqq0er" X-Original-To: linux-kernel@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.151]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5548B134AC; Sat, 16 Dec 2023 07:02:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1702710164; x=1734246164; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=lOQJTvu9nXAtsh+1v9ZBLjUIH0wLI8goSM/VimYjQg0=; b=lyoqq0erprMjal/lc/LfkIREVN2xRaV/rQKtrMyh8Cms+8N04FCuUKVB TZ7u7S4J5eZ4jA66yiVI5YOp16X0MGqRDQsPkY8SANsZhqcfy3GbRX/G7 jEw0VcMppScveAc2OuAm2iWfmNpBNnj1i50TIuJ5AMAY/MotN+KnlG1NG IOL2OjeWrSvzlfTgz8nHqPwPyC/e2QJc9dcl9RVMFejsHEZqbTff7p9ws cIgRF2eGWvyVSKP84XydYhSlbVIl3jw8cwO4L6jx+QsLfYP1VP28gsFU0 xJmyb7Nhb8/1FQprP2pTmFoWqAkj8fzX8TczIkpa5kohAE0smF6lUu3mu A==; X-IronPort-AV: E=McAfee;i="6600,9927,10925"; a="375515993" X-IronPort-AV: E=Sophos;i="6.04,281,1695711600"; d="scan'208";a="375515993" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Dec 2023 23:02:43 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10925"; a="893168964" X-IronPort-AV: E=Sophos;i="6.04,281,1695711600"; d="scan'208";a="893168964" Received: from unknown (HELO fred..) ([172.25.112.68]) by fmsmga002.fm.intel.com with ESMTP; 15 Dec 2023 23:02:42 -0800 From: Xin Li To: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-edac@vger.kernel.org, linux-hyperv@vger.kernel.org, kvm@vger.kernel.org, xen-devel@lists.xenproject.org Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, luto@kernel.org, pbonzini@redhat.com, seanjc@google.com, peterz@infradead.org, jgross@suse.com, ravi.v.shankar@intel.com, mhiramat@kernel.org, andrew.cooper3@citrix.com, jiangshanlai@gmail.com, nik.borisov@suse.com, shan.kang@intel.com Subject: [PATCH v13A 24/35] x86/fred: Add a NMI entry stub for FRED Date: Fri, 15 Dec 2023 22:31:39 -0800 Message-ID: <20231216063139.25567-1-xin3.li@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1784440871286428693 X-GMAIL-MSGID: 1785421042614944952 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 --- Changes since v13: * Save and restore %cr2 upon entering and leaving the FRED NMI handler (H. Peter Anvin). * Remove an unnecessary check "IS_ENABLED(CONFIG_SMP)" (H. Peter Anvin). * Sync a microcode change to the IDT NMI handler from 8f849ff63bcbc to the FRED NMI handler. --- arch/x86/kernel/nmi.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index 17e955ab69fe..1dd8838e5583 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c @@ -35,6 +35,7 @@ #include #include #include +#include #define CREATE_TRACE_POINTS #include @@ -651,6 +652,41 @@ void nmi_backtrace_stall_check(const struct cpumask *btp) #endif +#ifdef CONFIG_X86_FRED +/* + * With FRED, CR2/DR6 is pushed to #PF/#DB stack frame during FRED + * event delivery, i.e., there is no problem of transient states. + * And NMI unblocking only happens when the stack frame indicates + * that so should happen. + * + * Thus, the NMI entry stub for FRED is really straightforward and + * as simple as most exception handlers. As such, #DB is allowed + * during NMI handling. + */ +DEFINE_FREDENTRY_NMI(exc_nmi) +{ + irqentry_state_t irq_state; + + if (arch_cpu_is_offline(smp_processor_id())) { + if (microcode_nmi_handler_enabled()) + microcode_offline_nmi_handler(); + return; + } + + this_cpu_write(nmi_cr2, read_cr2()); + + irq_state = irqentry_nmi_enter(regs); + + inc_irq_stat(__nmi_count); + default_do_nmi(regs); + + irqentry_nmi_exit(regs, irq_state); + + if (unlikely(this_cpu_read(nmi_cr2) != read_cr2())) + write_cr2(this_cpu_read(nmi_cr2)); +} +#endif + void stop_nmi(void) { ignore_nmis++;