Received: by 2002:a05:6a10:a841:0:0:0:0 with SMTP id d1csp4314749pxy; Tue, 27 Apr 2021 01:56:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzauaPoreHpxd+xR7gac32u9GpQAEBM9lzwJSehCHknyG048Q3op8kETHoH6Fs+tIisWT8R X-Received: by 2002:a17:90a:bb93:: with SMTP id v19mr3762404pjr.127.1619513763446; Tue, 27 Apr 2021 01:56:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619513763; cv=none; d=google.com; s=arc-20160816; b=dnkE3P7pKRK0sZRarPaaPyLShvtnrNHSIFxHYzq/TzvqTR01UKR6Qa+76nxMY1PiH5 q6aPiqVRKOd+IPDceC0oz++u+vi5zQQ4/isFUFQx+Puwlp/vDiKxwrIZxEyTjLH5oceR MLgymVsVa/yorCvJxG/CZixRBfDzbbAukvGHlZExuaAUJMeDVOSxTvwOndFIrAEm49wa IJ1ija5XqNSewdnLcGjDV+AoRQ0b20upp6rj6R3OHsuBZBZ1Rh9vi1cxMnVO8muM8Eu3 0rFkKYLBY2yHo98apopNkTEr36Zw910p+tVLe+l2aSThPqXsq6PyNjLkx7vz3M0RV0Q8 oW3w== 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=OADY8rhy9wlX4GWPe0A2iQ0iiHfi3rxFGD9C3CUDGdo=; b=gAxBQrjsBnzrbsy298mFxyUzQSCB6mcuLBNk1qBSIzNqHS+h9nIJ3X+7lFq8B+uQXM EuvyxqAgJUrlJW8Y/qu8zqot80w8WnkHdqRr0wZDmi4QJSGPpaE8UiJOg2kSPucYAXoN h5D3xBLT9SO+UUmtwvZaO4xnHVhJDwO9Z/k9HMBno9zkOAqznJEp5ForuU0gCFbKZ6Er KrQkmYMnwLESmjL+GXWfK9N1PX4CJiU8U2A/w/YS72K0pHBsL4UP5Yn5qowHLVWYepjj 2RS1A2R6rFtBb2hX8ArJdrVPNvxh1Tvgh2K1gZ8DbKS4K6MEQ0ir1WwSfYPia3uv0r7m uHyQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=iO+kCnWE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w20si22474467plq.11.2021.04.27.01.55.51; Tue, 27 Apr 2021 01:56:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=iO+kCnWE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235172AbhD0Izy (ORCPT + 99 others); Tue, 27 Apr 2021 04:55:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37006 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235062AbhD0Izx (ORCPT ); Tue, 27 Apr 2021 04:55:53 -0400 Received: from mail-pj1-x102d.google.com (mail-pj1-x102d.google.com [IPv6:2607:f8b0:4864:20::102d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5A67EC061574 for ; Tue, 27 Apr 2021 01:55:08 -0700 (PDT) Received: by mail-pj1-x102d.google.com with SMTP id t13so4463185pji.4 for ; Tue, 27 Apr 2021 01:55:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=OADY8rhy9wlX4GWPe0A2iQ0iiHfi3rxFGD9C3CUDGdo=; b=iO+kCnWE4DuF/PsrSO+M63zX9k6jotFhqAy9LpNiR+i0HII9pAUiEG4BvcQKr0uI/q XwjFymtdOOA0BB84p+mtd3Lx0dV1LMxgndKWGCirgXcN/u3HA03JriDhLXwdK+uOHAGv c2uum1AVuJ0zPtkAgJzUDWwB/q1HuFG/B195kgdzHz0QW8nd9XXUKIlXyGvh5N+9AIrd QYOx5MKrPYO8q3ZnM9Na616iHuTtfSb3IVpYJpaf97A5kUiah4JqvsSkvNZe3Uq4XNvS rZrG7hhFMj80SOgHY3qEEmPAVGKjGrBRhIWu9E/4NaN39J+N4PTcqUcysxzcBHoFrtc7 BJsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=OADY8rhy9wlX4GWPe0A2iQ0iiHfi3rxFGD9C3CUDGdo=; b=r+OUEw2WhC0Fw82DsXWJXLI9ubFxcADyoilyL1YtvAAsJzuXbYBAEYKseQK5Uefz3x 9iNiPFlAe6wAVsdFhKlxlrn9gY9XfoCYpSlSxgYIsUstTYnzMVvCAy6anTvtKI8BUrma P5EdGykZyA5qBsUNFArD1vAt3UDeIt4jQDO09YSDAYJEVnMh+FAo84HpQTDR3YwaN9vx /QXwO+ThwuLbU00uE7iEK4t9ENdLoLtK+4Akhk7IsrC4e8Zl1tMd4v9uz/nZdqCZ6dcV Pcn8Qa2h7GoPhkEOdWnwtPN/Jv66JdlWN9NOez3D0v/aHymcMqYQSsol2aBLCrVmc9A/ HQ8w== X-Gm-Message-State: AOAM533UuDvhjM9kUD3Tpzrj8wa6d5qeaVpP38cyaXPOzcfivCSH5naQ Lw9Q43/FQXWLvc70VGYbAzSJXkm3K7Q= X-Received: by 2002:a17:90b:b05:: with SMTP id bf5mr6216041pjb.123.1619513707739; Tue, 27 Apr 2021 01:55:07 -0700 (PDT) Received: from localhost ([47.251.4.198]) by smtp.gmail.com with ESMTPSA id l10sm1945784pfc.125.2021.04.27.01.55.06 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 27 Apr 2021 01:55:07 -0700 (PDT) From: Lai Jiangshan To: linux-kernel@vger.kernel.org Cc: Lai Jiangshan , Thomas Gleixner , Paolo Bonzini , Sean Christopherson , Steven Rostedt , Andi Kleen , Andy Lutomirski , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , Josh Poimboeuf , Uros Bizjak , Maxim Levitsky , Ingo Molnar , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Peter Zijlstra , Alexandre Chartre , Juergen Gross , Joerg Roedel , Jian Cai Subject: [PATCH 2/4] x86/entry: Use asm_noist_exc_nmi() for NMI in early booting stage Date: Tue, 27 Apr 2021 07:09:47 +0800 Message-Id: <20210426230949.3561-3-jiangshanlai@gmail.com> X-Mailer: git-send-email 2.19.1.6.gb485710b In-Reply-To: <20210426230949.3561-1-jiangshanlai@gmail.com> References: <20210426230949.3561-1-jiangshanlai@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Lai Jiangshan While the other entries for the exceptions which use Interrupt stacks can be also used on the kernel stack, asm_exc_nmi() can not be used on the kernel stack for it relies on the RSP-located "NMI executing" variable which expects to on a fixed location in the NMI IST stack. When it is unexpectedly called from the kernel stack, the RSP-located "NMI executing" variable is also on the kernel stack and is "uninitialized" and can cause the NMI entry to run in the wrong way. Cc: Thomas Gleixner Cc: Paolo Bonzini Cc: Sean Christopherson Cc: Steven Rostedt Cc: Andi Kleen Cc: Andy Lutomirski Cc: Vitaly Kuznetsov Cc: Wanpeng Li Cc: Jim Mattson Cc: Joerg Roedel Cc: Josh Poimboeuf Cc: Uros Bizjak Cc: Maxim Levitsky Signed-off-by: Lai Jiangshan --- arch/x86/include/asm/idtentry.h | 2 -- arch/x86/kernel/idt.c | 8 +++++++- arch/x86/kernel/nmi.c | 7 ++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h index 5b11d2ddbb5c..0831c0da5957 100644 --- a/arch/x86/include/asm/idtentry.h +++ b/arch/x86/include/asm/idtentry.h @@ -589,9 +589,7 @@ DECLARE_IDTENTRY_RAW(X86_TRAP_MC, xenpv_exc_machine_check); /* NMI */ DECLARE_IDTENTRY_NMI(X86_TRAP_NMI, exc_nmi); -#ifdef CONFIG_XEN_PV DECLARE_IDTENTRY_RAW(X86_TRAP_NMI, noist_exc_nmi); -#endif /* #DB */ #ifdef CONFIG_X86_64 diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c index d552f177eca0..c75409633f16 100644 --- a/arch/x86/kernel/idt.c +++ b/arch/x86/kernel/idt.c @@ -71,10 +71,16 @@ static const __initconst struct idt_data early_idts[] = { * cpu_init() is invoked. Interrupt stacks cannot be used at that point and * the traps which use them are reinitialized with IST after cpu_init() has * set up TSS. + * + * While the other entries for the exceptions which use Interrupt stacks can + * be also used on the kernel stack, asm_exc_nmi() can not be used on the + * kernel stack for it relies on the RSP-located "NMI executing" variable + * which expects to on a fixed location in the NMI IST stack. For early + * booting stage, asm_noist_exc_nmi() is used for NMI. */ static const __initconst struct idt_data def_idts[] = { INTG(X86_TRAP_DE, asm_exc_divide_error), - INTG(X86_TRAP_NMI, asm_exc_nmi), + INTG(X86_TRAP_NMI, asm_noist_exc_nmi), INTG(X86_TRAP_BR, asm_exc_bounds), INTG(X86_TRAP_UD, asm_exc_invalid_op), INTG(X86_TRAP_NM, asm_exc_device_not_available), diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index 2b907a76d0a1..2fb1fd59d714 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c @@ -524,13 +524,14 @@ DEFINE_IDTENTRY_RAW(exc_nmi) mds_user_clear_cpu_buffers(); } -#ifdef CONFIG_XEN_PV DEFINE_IDTENTRY_RAW(noist_exc_nmi) { - /* On Xen PV, NMI doesn't use IST. The C part is the same as native. */ + /* + * On Xen PV and early booting stage, NMI doesn't use IST. + * The C part is the same as native. + */ exc_nmi(regs); } -#endif void stop_nmi(void) { -- 2.19.1.6.gb485710b