Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934172AbcCPI0j (ORCPT ); Wed, 16 Mar 2016 04:26:39 -0400 Received: from [198.137.202.12] ([198.137.202.12]:46746 "EHLO terminus.zytor.com" rhost-flags-FAIL-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S965976AbcCPILA (ORCPT ); Wed, 16 Mar 2016 04:11:00 -0400 Date: Wed, 16 Mar 2016 01:03:37 -0700 From: tip-bot for Matt Fleming Message-ID: Cc: hertzog@debian.org, scott.ashcroft@talk21.com, bp@alien8.de, maarten.lankhorst@linux.intel.com, ard.biesheuvel@linaro.org, ben@decadent.org.uk, rogershimizu@gmail.com, matt@codeblueprint.co.uk, dvlasenk@redhat.com, brgerst@gmail.com, bp@suse.de, peterz@infradead.org, luto@amacapital.net, hpa@zytor.com, torvalds@linux-foundation.org, mingo@kernel.org, tglx@linutronix.de, mjg59@srcf.ucam.org, linux-kernel@vger.kernel.org Reply-To: bp@suse.de, brgerst@gmail.com, luto@amacapital.net, hpa@zytor.com, peterz@infradead.org, torvalds@linux-foundation.org, mingo@kernel.org, tglx@linutronix.de, linux-kernel@vger.kernel.org, mjg59@srcf.ucam.org, bp@alien8.de, scott.ashcroft@talk21.com, hertzog@debian.org, maarten.lankhorst@linux.intel.com, matt@codeblueprint.co.uk, rogershimizu@gmail.com, ben@decadent.org.uk, ard.biesheuvel@linaro.org, dvlasenk@redhat.com In-Reply-To: <1457951581-27353-2-git-send-email-matt@codeblueprint.co.uk> References: <1457951581-27353-2-git-send-email-matt@codeblueprint.co.uk> To: linux-tip-commits@vger.kernel.org Subject: [tip:efi/core] x86/mm/pat: Fix boot crash when 1GB pages are not supported by the CPU Git-Commit-ID: d367cef0a7f0c6ee86e997c0cb455b21b3c6b9ba X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2886 Lines: 68 Commit-ID: d367cef0a7f0c6ee86e997c0cb455b21b3c6b9ba Gitweb: http://git.kernel.org/tip/d367cef0a7f0c6ee86e997c0cb455b21b3c6b9ba Author: Matt Fleming AuthorDate: Mon, 14 Mar 2016 10:33:01 +0000 Committer: Ingo Molnar CommitDate: Wed, 16 Mar 2016 09:00:49 +0100 x86/mm/pat: Fix boot crash when 1GB pages are not supported by the CPU Scott reports that with the new separate EFI page tables he's seeing the following error on boot, caused by setting reserved bits in the page table structures (fault code is PF_RSVD | PF_PROT), swapper/0: Corrupted page table at address 17b102020 PGD 17b0e5063 PUD 1400000e3 Bad pagetable: 0009 [#1] SMP On first inspection the PUD is using a 1GB page size (_PAGE_PSE) and looks fine but that's only true if support for 1GB PUD pages ("pdpe1gb") is present in the CPU. Scott's Intel Celeron N2820 does not have that feature and so the _PAGE_PSE bit is reserved. Fix this issue by making the 1GB mapping code in conditional on "cpu_has_gbpages". This issue didn't come up in the past because the required mapping for the faulting address (0x17b102020) will already have been setup by the kernel in early boot before we got to efi_map_regions(), but we no longer use the standard kernel page tables during EFI calls. Reported-by: Scott Ashcroft Tested-by: Scott Ashcroft Signed-off-by: Matt Fleming Acked-by: Borislav Petkov Cc: Andy Lutomirski Cc: Ard Biesheuvel Cc: Ben Hutchings Cc: Borislav Petkov Cc: Brian Gerst Cc: Denys Vlasenko Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Maarten Lankhorst Cc: Matthew Garrett Cc: Peter Zijlstra Cc: Raphael Hertzog Cc: Roger Shimizu Cc: Thomas Gleixner Cc: linux-efi@vger.kernel.org Link: http://lkml.kernel.org/r/1457951581-27353-2-git-send-email-matt@codeblueprint.co.uk Signed-off-by: Ingo Molnar --- arch/x86/mm/pageattr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 14c38ae..fcf8e29 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c @@ -1055,7 +1055,7 @@ static int populate_pud(struct cpa_data *cpa, unsigned long start, pgd_t *pgd, /* * Map everything starting from the Gb boundary, possibly with 1G pages */ - while (end - start >= PUD_SIZE) { + while (cpu_has_gbpages && end - start >= PUD_SIZE) { set_pud(pud, __pud(cpa->pfn << PAGE_SHIFT | _PAGE_PSE | massage_pgprot(pud_pgprot)));