Received: by 10.192.165.148 with SMTP id m20csp4506397imm; Tue, 8 May 2018 09:29:05 -0700 (PDT) X-Google-Smtp-Source: AB8JxZo15Z6kmoXtVd4a7ZNj47X4fr+ZQFSFF1Vur+E8ZLJNj0X6uUisUFIk3w6ojq6MJmmiNsUk X-Received: by 10.98.174.19 with SMTP id q19mr40659746pff.155.1525796945749; Tue, 08 May 2018 09:29:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525796945; cv=none; d=google.com; s=arc-20160816; b=qabJiHd0fh5+FgFfuQFFJH9F/ssIreOYKrHLi9tTMoFNBvT40Opz6/OgkjZURp+UmS lCcfL8i5nn7MWfSLm9VInSwQXI8A4hiYvmsrH4nuWxekK+DbVHu40f3M+hIaKgVTAyzo HHGpU9xrphzbYyTbHUz8C7Mfv4gRMkz5tazj7CVf6sfWfz9nZStuy3rsgZ8HbEhhHhYP DfW+w8oFVMG1Qmwu1dVLU2msvoy6Z1obyamiI95U7EY0Ht5l60G9QQImviYwd9Xx8aYF e7r+iWOaCcFhkNCe8Q45hqjUgj287gPkHTH0StthM4/WvScAdp2oJJEiPjBoUS7DF3CJ IqsQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=XnklfenQzdkQsT7Izc5J7n6R7CxYJMUUGlir+jYOgos=; b=Yj/Tyitob4S76KtSNssBWgIabyfJYMEtgcpPjTqiHEipBT1tiA19WGdsbe0Xg+A238 DelvW0YhWxjWqqdTcX8a5lEo9XiGchE0M8sTx+Zy26+xtBc3WwotpwYSrQ1sUImEyXzb MRaBJU2g8R6M0kkiUeBwmErLpZOEqEwKtUZBftY81J8dQZpz0uS0JwLF5+2rY0ZlMEEO fa2TQ+CUbDF0NwArBlwtp/dvJQKaTH7reBsh7/UOpoxkIigLyXYoJDNfZ84TRujKHIoV gfmz+qDXs378Cw+KJRnrmBSjlzO1nEWpsO/2rJ3LVeM/VVP5MiRGppzjye314m69Z5xP VWxw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=VTP1aF8P; 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=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h14-v6si25559711plk.535.2018.05.08.09.28.51; Tue, 08 May 2018 09:29:05 -0700 (PDT) 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; dkim=pass header.i=@google.com header.s=20161025 header.b=VTP1aF8P; 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=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755524AbeEHQ2i (ORCPT + 99 others); Tue, 8 May 2018 12:28:38 -0400 Received: from mail-wr0-f196.google.com ([209.85.128.196]:42186 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754736AbeEHQ2f (ORCPT ); Tue, 8 May 2018 12:28:35 -0400 Received: by mail-wr0-f196.google.com with SMTP id v5-v6so32893692wrf.9 for ; Tue, 08 May 2018 09:28:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=XnklfenQzdkQsT7Izc5J7n6R7CxYJMUUGlir+jYOgos=; b=VTP1aF8PyZqHuOQYPO2NwjBdMrKdFXEGQWEwQAEITvNV7uhtdpkILZ8Qs7YgL6jM7F afqWTkolYjHkelofhliFmxf8ZEUdtu+eg+9bt/SjSTtgDD/Bo3lnXm8nEapyG/JaZL9T 0UB3kw69XJWDi5oWrCS6jM67/Cxct36Ri/N5f5PdGzq9Kc2oJ9bFrfSzWqm8n4c6b2G7 XKEzLleUtlwQZe1duGYMnLKE8lHc4yJPTgxu8XS1NDY+RqgiIT2lJ9283tHO9iqmqAhB Ai47h0OXISF3vhWIctNFL3vMtJsDq6lZ7Ce4K8L12dMLCEpqu3ukzc5VcU7KlwNr+Nzi mX0g== 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; bh=XnklfenQzdkQsT7Izc5J7n6R7CxYJMUUGlir+jYOgos=; b=ajsgOgxPwH9/4M5eoXOeljaac6A1FyDL7hDz0GnLMsKvN6WRKecfBl2pfOGaSaDw2M +ur2YRl9NwiTPnfUYX2c4wz5dkFh6EN696NpKIvNy1YwsfUGPr5WtSc8fM2KFU1ofVZq BvbcwKJU8b29TrtT6bGQNrpXRlXhJJQUSwKKmDfHZP9tz4Ow4ixQ6JkN+sU4v276XN0k ACg7mcg1xaOvUJRj++3pAbkXFFOQF2mFVm8YYyaVCpoX9SINxay+ku1s/aMXAawgmh09 Sl3gYQAJi0gcuE5xw6+l169CA5gQhhhBYjnbL0xGCh80KTlAKWlUiPBfD7avZxc+wyRN Y9SQ== X-Gm-Message-State: ALQs6tCF61W7mV0ZG7ws5XU6UoIUbaxX1cvm2oM8Ed/wr+eD8sgqn19d F7HL3oocCVk9PK5dlkkqF+ApFw== X-Received: by 2002:adf:b3d7:: with SMTP id x23-v6mr26199271wrd.142.1525796913440; Tue, 08 May 2018 09:28:33 -0700 (PDT) Received: from glider0.muc.corp.google.com ([2a00:79e0:15:10:e0c7:92b9:c022:f69b]) by smtp.gmail.com with ESMTPSA id n71-v6sm10642780wmi.14.2018.05.08.09.28.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 08 May 2018 09:28:32 -0700 (PDT) From: Alexander Potapenko To: dave.hansen@linux.intel.com, mingo@kernel.org, kirill.shutemov@linux.intel.com Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, mka@chromium.org, dvyukov@google.com, md@google.com Subject: [PATCH v2] x86/boot/64/clang: Use fixup_pointer() to access '__supported_pte_mask' Date: Tue, 8 May 2018 18:28:29 +0200 Message-Id: <20180508162829.7729-1-glider@google.com> X-Mailer: git-send-email 2.17.0.441.gb46fe60e1d-goog Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Clang builds with defconfig started crashing after commit fb43d6cb91ef ("x86/mm: Do not auto-massage page protections") This was caused by introducing a new global access in __startup_64(). Code in __startup_64() can be relocated during execution, but the compiler doesn't have to generate PC-relative relocations when accessing globals from that function. Clang actually does not generate them, which leads to boot-time crashes. To work around this problem, every global pointer must be adjusted using fixup_pointer(). Signed-off-by: Alexander Potapenko Fixes: fb43d6cb91ef ("x86/mm: Do not auto-massage page protections") --- v2: better patch description, added a comment to __startup_64() --- arch/x86/kernel/head64.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index 0c408f8c4ed4..9223792f6d0e 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c @@ -104,6 +104,13 @@ static bool __head check_la57_support(unsigned long physaddr) } #endif + +/* Code in __startup_64() can be relocated during execution, but the compiler + * doesn't have to generate PC-relative relocations when accessing globals from + * that function. Clang actually does not generate them, which leads to + * boot-time crashes. To work around this problem, every global pointer must + * be adjusted using fixup_pointer(). + */ unsigned long __head __startup_64(unsigned long physaddr, struct boot_params *bp) { @@ -113,6 +120,7 @@ unsigned long __head __startup_64(unsigned long physaddr, p4dval_t *p4d; pudval_t *pud; pmdval_t *pmd, pmd_entry; + pteval_t *mask_ptr; bool la57; int i; unsigned int *next_pgt_ptr; @@ -196,7 +204,8 @@ unsigned long __head __startup_64(unsigned long physaddr, pmd_entry = __PAGE_KERNEL_LARGE_EXEC & ~_PAGE_GLOBAL; /* Filter out unsupported __PAGE_KERNEL_* bits: */ - pmd_entry &= __supported_pte_mask; + mask_ptr = (pteval_t *)fixup_pointer(&__supported_pte_mask, physaddr); + pmd_entry &= *mask_ptr; pmd_entry += sme_get_me_mask(); pmd_entry += physaddr; -- 2.17.0.441.gb46fe60e1d-goog