Received: by 10.213.65.68 with SMTP id h4csp711191imn; Fri, 6 Apr 2018 07:40:15 -0700 (PDT) X-Google-Smtp-Source: AIpwx48zIFhMK3ZHhh4uLe5rO9Wu2UkzTlYJ3dwawqt7Z/2m00vmOC+AF3vd/J8pMddltQ2cxIY0 X-Received: by 2002:a17:902:d03:: with SMTP id 3-v6mr27734141plu.245.1523025615905; Fri, 06 Apr 2018 07:40:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523025615; cv=none; d=google.com; s=arc-20160816; b=rW+1y3Mxr3NnoVizxSA/WZcSgCN9W2bJ6hcmzJL8I0zivuSQVouhHVugR70wq9iq1J VOVdlZV+3pa+UeRMHqF3IMD7ciuZyW/HGa1l47L3tIsAKZrI6jLIevNPrKaRz/XPwL6G LePwx6OHosq+joklvSGQit1lodj+/kHjq1zyyWLKNwCySf9AG0hUhqKSnXMu+n15iLwh MxoXt9wkjb19lulPMVGg5ltnDoM4YGHs5eBD6iIJGnxAqf5Y55dSBLg96La/1OG/ML2z gSNBk79JDLn6SUHjHTmdaFxE3HSnBGht8wbVlASWzozsL+5vbTp/ot907D6Uj1uzo3+o vzJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=lSraJohI5wQCRbV8LH1JtziLZXV40zo7Oh87UdoqmDc=; b=qTLHmowJdOe3rlOloVAWbYwWGdGvmVNWHmLCfICQTLLAevKHHTvsHdZRwK1TH3rMfI 5jF8gXURcSfY/awpJ1p18iEyUFA0XJdcK01FNfW9S0nLwjijKu9JgQ3Xme7r3mskttaR XvNDHLage6yQcIuzBkxxkUBdEkMAWS3F1umFp5ZnXFjis1RDLTXAmUtsUlkJMIeJ7GYr yl+lN09zHV5v2R8zIfqBiBG7fq4boNhFaUfnmA4NbEjdZeOxgjFvtIv2UwJQQgNdt8Vw coabQIpnEzuThvwmWqr78gNT8IMDMD68Wle6FgvlDwxPKUIgksz3cXhKkwf1H3bXfze/ RH/Q== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 31-v6si8349096plz.467.2018.04.06.07.40.02; Fri, 06 Apr 2018 07:40:15 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756020AbeDFNfS (ORCPT + 99 others); Fri, 6 Apr 2018 09:35:18 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:58702 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755685AbeDFNfP (ORCPT ); Fri, 6 Apr 2018 09:35:15 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id CC66CDC5; Fri, 6 Apr 2018 13:35:14 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Greg Kroah-Hartman , Ard Biesheuvel , Laura Abbott , Shanker Donthineni , Will Deacon , Greg Hackmann , Alex Shi , Mark Rutland Subject: [PATCH 4.9 063/102] arm64: kaslr: Put kernel vectors address in separate data page Date: Fri, 6 Apr 2018 15:23:44 +0200 Message-Id: <20180406084340.398994234@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180406084331.507038179@linuxfoundation.org> References: <20180406084331.507038179@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.9-stable review patch. If anyone has any objections, please let me know. ------------------ From: Will Deacon commit 6c27c4082f4f upstream. The literal pool entry for identifying the vectors base is the only piece of information in the trampoline page that identifies the true location of the kernel. This patch moves it into a page-aligned region of the .rodata section and maps this adjacent to the trampoline text via an additional fixmap entry, which protects against any accidental leakage of the trampoline contents. Suggested-by: Ard Biesheuvel Tested-by: Laura Abbott Tested-by: Shanker Donthineni Signed-off-by: Will Deacon [Alex: avoid ARM64_WORKAROUND_QCOM_FALKOR_E1003 dependency] Signed-off-by: Alex Shi [v4.9 backport] Signed-off-by: Mark Rutland [v4.9 backport] Tested-by: Will Deacon Tested-by: Greg Hackmann Signed-off-by: Greg Kroah-Hartman --- arch/arm64/include/asm/fixmap.h | 1 + arch/arm64/kernel/entry.S | 14 ++++++++++++++ arch/arm64/kernel/vmlinux.lds.S | 5 ++++- arch/arm64/mm/mmu.c | 10 +++++++++- 4 files changed, 28 insertions(+), 2 deletions(-) --- a/arch/arm64/include/asm/fixmap.h +++ b/arch/arm64/include/asm/fixmap.h @@ -53,6 +53,7 @@ enum fixed_addresses { FIX_TEXT_POKE0, #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 + FIX_ENTRY_TRAMP_DATA, FIX_ENTRY_TRAMP_TEXT, #define TRAMP_VALIAS (__fix_to_virt(FIX_ENTRY_TRAMP_TEXT)) #endif /* CONFIG_UNMAP_KERNEL_AT_EL0 */ --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -881,7 +881,13 @@ __ni_sys_trace: msr tpidrro_el0, x30 // Restored in kernel_ventry .endif tramp_map_kernel x30 +#ifdef CONFIG_RANDOMIZE_BASE + adr x30, tramp_vectors + PAGE_SIZE + isb + ldr x30, [x30] +#else ldr x30, =vectors +#endif prfm plil1strm, [x30, #(1b - tramp_vectors)] msr vbar_el1, x30 add x30, x30, #(1b - tramp_vectors) @@ -924,6 +930,14 @@ END(tramp_exit_compat) .ltorg .popsection // .entry.tramp.text +#ifdef CONFIG_RANDOMIZE_BASE + .pushsection ".rodata", "a" + .align PAGE_SHIFT + .globl __entry_tramp_data_start +__entry_tramp_data_start: + .quad vectors + .popsection // .rodata +#endif /* CONFIG_RANDOMIZE_BASE */ #endif /* CONFIG_UNMAP_KERNEL_AT_EL0 */ /* --- a/arch/arm64/kernel/vmlinux.lds.S +++ b/arch/arm64/kernel/vmlinux.lds.S @@ -252,7 +252,10 @@ ASSERT(__idmap_text_end - (__idmap_text_ ASSERT(__hibernate_exit_text_end - (__hibernate_exit_text_start & ~(SZ_4K - 1)) <= SZ_4K, "Hibernate exit text too big or misaligned") #endif - +#ifdef CONFIG_UNMAP_KERNEL_AT_EL0 +ASSERT((__entry_tramp_text_end - __entry_tramp_text_start) == PAGE_SIZE, + "Entry trampoline text too big") +#endif /* * If padding is applied before .head.text, virt<->phys conversions will fail. */ --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -435,8 +435,16 @@ static int __init map_entry_trampoline(v __create_pgd_mapping(tramp_pg_dir, pa_start, TRAMP_VALIAS, PAGE_SIZE, prot, pgd_pgtable_alloc, 0); - /* ...as well as the kernel page table */ + /* Map both the text and data into the kernel page table */ __set_fixmap(FIX_ENTRY_TRAMP_TEXT, pa_start, prot); + if (IS_ENABLED(CONFIG_RANDOMIZE_BASE)) { + extern char __entry_tramp_data_start[]; + + __set_fixmap(FIX_ENTRY_TRAMP_DATA, + __pa_symbol(__entry_tramp_data_start), + PAGE_KERNEL_RO); + } + return 0; } core_initcall(map_entry_trampoline);