From patchwork Mon Nov 14 20:06:16 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pawan Gupta X-Patchwork-Id: 20023 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp2342794wru; Mon, 14 Nov 2022 12:13:08 -0800 (PST) X-Google-Smtp-Source: AA0mqf59PRWqpE4zP8AwY5Zfh7cVEeAdFdXui67eK5LLuNq9vh+6vjDK9o5YAbPns2umlb9AxQQd X-Received: by 2002:a17:907:1398:b0:78b:a8d:e76a with SMTP id vs24-20020a170907139800b0078b0a8de76amr11530120ejb.725.1668456788708; Mon, 14 Nov 2022 12:13:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668456788; cv=none; d=google.com; s=arc-20160816; b=vUq7jQIAOL2GZjgJRL4gpwA+UVeyMtNYWyL9c8uDazt+Ibq1gQXwYHQdbOKcDtv2b9 dJm5q+UF4WoSUAI7Xampzy3lLIvgCkLLLTF0PRhtKJZ00daTuw+dUGwgY1sOu4Q2Vcjy phE2hbY/9fw+Eim8EnmFIZli5/9UAt2FHcbjZxFoxHAz7Zy2zID7QUFdtIJ8cKK/qmRb +BowmIWPop0kizBkM9zXuweZAOSgFnrgxn3x2G1xxe+fuJN+7Dmf9m+XLMcHQOG2ssKZ QUKxPX93cPWAL91juJtW96aQrpleXYoMc+ARwRBM0cazouCkoWyd1kkfblA3yFIeI0ow CXzA== 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=gqNBLDPgN++x2M0iVi7XngvsnPrceik6A9WsU0KdAuY=; b=ZIEaf9DCS2OoeqoRk8vS6vSR1IwmU/kWFQ6kKVoCvG+juD62440YQ3+QG6w++q3nJk 7ai8muvtoWs625csTUVFozLptUFjzOE2DUpLq6BgHhwGhUlna23KTFxV6AXfjQ2yma4H FKvXRtWabreBTlQLejmxEogfjj0mhjH+VHZgLs22kko32T7nGtm0RwPhBWL2pMuiyPly B+XYDD44ECViIQcvuY+djsT84xwdtGsHeqhF0JAk0qsy1QhwcEFq686rA7rxxHnmkyND UWARe1iHIHG3NOXe4Zxy5RDP3cXOOgkdDpSYcsIeb7/hF4rvqt9QjfyXpDiRHciFPLVV Wf9w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=bHTj4Ll0; 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 w10-20020a056402070a00b0045cf3759408si9026118edx.49.2022.11.14.12.12.44; Mon, 14 Nov 2022 12:13:08 -0800 (PST) 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=bHTj4Ll0; 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 S237448AbiKNUGf (ORCPT + 99 others); Mon, 14 Nov 2022 15:06:35 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34048 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236970AbiKNUGY (ORCPT ); Mon, 14 Nov 2022 15:06:24 -0500 Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CD0FAEAC; Mon, 14 Nov 2022 12:06:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1668456383; x=1699992383; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=EoZdGGK1L5qyZWve7P1IZ9ifkLXTCDDXv1VoITm9IvI=; b=bHTj4Ll0uPeZFYmtLnKb6J1F2XzdW5+wtvAaH+lQ8WpJwfm5/xQWWLho S0b1j6DpwCPlAxIeVFK9PpbiQPECtucNu+vU6i+QH6WUGzHWvWDJW/05w UGESvsnyB+p7/4mIJmh9rWEGiMuedtYZJnnM4dEp5th/hA5455DccMG5K 4mZP+DfjKaxAYS3gVZGNBz5NeT7QpoacpAmmZIW7XjduPW1w+cit24czo E5j1VZ56ODgPsximjByoXUJV0PeWKMNOBoroeLqyQu7xcgNPWtmM7XOjk T/QxtpGYjQCokTN+k83jz/C0Syx/B1hMQJYQT5lsKGTTixAe98hyh5Dfz Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10531"; a="310779577" X-IronPort-AV: E=Sophos;i="5.96,164,1665471600"; d="scan'208";a="310779577" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Nov 2022 12:06:23 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10531"; a="589508117" X-IronPort-AV: E=Sophos;i="5.96,164,1665471600"; d="scan'208";a="589508117" Received: from parandri-mobl.amr.corp.intel.com (HELO guptapa-desk.intel.com) ([10.209.117.50]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Nov 2022 12:06:22 -0800 From: Pawan Gupta To: "H. Peter Anvin" , Thomas Gleixner , David.Kaplan@amd.com, thomas.lendacky@amd.com, Borislav Petkov , x86@kernel.org, hdegoede@redhat.com, Dave Hansen , Andrew Cooper , Pavel Machek , Ingo Molnar , "Rafael J. Wysocki" Cc: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Daniel Sneddon , antonio.gomez.iglesias@linux.intel.com Subject: [PATCH v2 2/2] x86/pm: Add enumeration check before spec MSRs save/restore setup Date: Mon, 14 Nov 2022 12:06:16 -0800 Message-Id: X-Mailer: git-send-email 2.37.3 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_NONE autolearn=ham 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?1749503745566839275?= X-GMAIL-MSGID: =?utf-8?q?1749503745566839275?= pm_save_spec_msr() keeps a list of all the MSRs which _might_ need to be saved and restored at hibernate?? and resume??. However, it has zero awareness of CPU support for these MSRs. It mostly works by unconditionally attempting to manipulate these MSRs and relying on rdmsrl_safe() being able to handle a #GP on CPUs where the support is unavailable. However, it's possible for reads (RDMSR) to be supported for a given MSR while writes (WRMSR) are not. In this case, msr_build_context() sees a successful read (RDMSR) and marks the MSR as 'valid'. Then, later, a write (WRMSR) fails, producing a nasty (but harmless) error message. This causes restore_processor_state() to try and restore it, but writing this MSR is not allowed on the Intel Atom N2600 leading to: unchecked MSR access error: WRMSR to 0x122 (tried to write 0x0000000000000002) \ at rIP: 0xffffffff8b07a574 (native_write_msr+0x4/0x20) Call Trace: restore_processor_state x86_acpi_suspend_lowlevel acpi_suspend_enter suspend_devices_and_enter pm_suspend.cold state_store kernfs_fop_write_iter vfs_write ksys_write do_syscall_64 ? do_syscall_64 ? up_read ? lock_is_held_type ? asm_exc_page_fault ? lockdep_hardirqs_on entry_SYSCALL_64_after_hwframe To fix this, add the corresponding X86_FEATURE bit for each MSR. Avoid trying to manipulate the MSR when the feature bit is clear. This required adding a X86_FEATURE bit for MSRs that do not have one already, but it's a small price to pay. Fixes: 73924ec4d560 ("x86/pm: Save the MSR validity status at context setup") Reported-by: Hans de Goede Signed-off-by: Pawan Gupta --- arch/x86/power/cpu.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c index bb176c72891c..0d97c25551f0 100644 --- a/arch/x86/power/cpu.c +++ b/arch/x86/power/cpu.c @@ -511,17 +511,26 @@ static int pm_cpu_check(const struct x86_cpu_id *c) return ret; } +struct msr_enumeration { + u32 msr_no; + u32 feature; +}; + static void pm_save_spec_msr(void) { - u32 spec_msr_id[] = { - MSR_IA32_SPEC_CTRL, - MSR_IA32_TSX_CTRL, - MSR_TSX_FORCE_ABORT, - MSR_IA32_MCU_OPT_CTRL, - MSR_AMD64_LS_CFG, + struct msr_enumeration msr_enum[] = { + {MSR_IA32_SPEC_CTRL, X86_FEATURE_MSR_SPEC_CTRL}, + {MSR_IA32_TSX_CTRL, X86_FEATURE_MSR_TSX_CTRL}, + {MSR_TSX_FORCE_ABORT, X86_FEATURE_TSX_FORCE_ABORT}, + {MSR_IA32_MCU_OPT_CTRL, X86_FEATURE_SRBDS_CTRL}, + {MSR_AMD64_LS_CFG, X86_FEATURE_LS_CFG_SSBD}, }; + int i; - msr_build_context(spec_msr_id, ARRAY_SIZE(spec_msr_id)); + for (i = 0; i < ARRAY_SIZE(msr_enum); i++) { + if (boot_cpu_has(msr_enum[i].feature)) + msr_build_context(&msr_enum[i].msr_no, 1); + } } static int pm_check_save_msr(void)