Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932905AbbGGUZF (ORCPT ); Tue, 7 Jul 2015 16:25:05 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:16784 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932777AbbGGUVH (ORCPT ); Tue, 7 Jul 2015 16:21:07 -0400 From: Yinghai Lu To: Kees Cook , "H. Peter Anvin" , Baoquan He Cc: linux-kernel@vger.kernel.org, Yinghai Lu , Rob Herring , David Vrabel Subject: [PATCH 32/42] x86, of: Let add_dtb reserve setup_data locally Date: Tue, 7 Jul 2015 13:20:18 -0700 Message-Id: <1436300428-21163-33-git-send-email-yinghai@kernel.org> X-Mailer: git-send-email 1.8.4.5 In-Reply-To: <1436300428-21163-1-git-send-email-yinghai@kernel.org> References: <1436300428-21163-1-git-send-email-yinghai@kernel.org> X-Source-IP: aserv0022.oracle.com [141.146.126.234] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3744 Lines: 135 We will not reserve setup_data in generic code. Every handler need to reserve and copy setup_data locally. Current dtd handling already have code for copying, just add reserve code. Also simplify code a bit by storing real dtb size. Cc: Rob Herring Cc: David Vrabel Signed-off-by: Yinghai Lu --- arch/x86/include/asm/prom.h | 9 ++++++--- arch/x86/kernel/devicetree.c | 39 +++++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/arch/x86/include/asm/prom.h b/arch/x86/include/asm/prom.h index 1d081ac..fb716eddc 100644 --- a/arch/x86/include/asm/prom.h +++ b/arch/x86/include/asm/prom.h @@ -24,17 +24,20 @@ #ifdef CONFIG_OF extern int of_ioapic; -extern u64 initial_dtb; -extern void add_dtb(u64 data); void x86_of_pci_init(void); void x86_dtb_init(void); #else -static inline void add_dtb(u64 data) { } static inline void x86_of_pci_init(void) { } static inline void x86_dtb_init(void) { } #define of_ioapic 0 #endif +#ifdef CONFIG_OF_FLATTREE +extern void add_dtb(u64 data); +#else +static inline void add_dtb(u64 data) { } +#endif + extern char cmd_line[COMMAND_LINE_SIZE]; #endif /* __ASSEMBLY__ */ diff --git a/arch/x86/kernel/devicetree.c b/arch/x86/kernel/devicetree.c index 1f4acd6..19fb3cf 100644 --- a/arch/x86/kernel/devicetree.c +++ b/arch/x86/kernel/devicetree.c @@ -2,6 +2,7 @@ * Architecture specific OF callbacks. */ #include +#include #include #include #include @@ -23,7 +24,6 @@ #include #include -__initdata u64 initial_dtb; char __initdata cmd_line[COMMAND_LINE_SIZE]; int __initdata of_ioapic; @@ -43,11 +43,23 @@ void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) return __alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS)); } +#ifdef CONFIG_OF_FLATTREE +static u64 initial_dtb __initdata; +static u32 initial_dtb_size __initdata; void __init add_dtb(u64 data) { + u32 map_len; + initial_dtb = data + offsetof(struct setup_data, data); -} + map_len = max(PAGE_SIZE - (initial_dtb & ~PAGE_MASK), (u64)128); + initial_boot_params = early_memremap(initial_dtb, map_len); + initial_dtb_size = of_get_flat_dt_size(); + early_memunmap(initial_boot_params, map_len); + initial_boot_params = NULL; + memblock_reserve(initial_dtb, initial_dtb_size); +} +#endif /* * CE4100 ids. Will be moved to machine_device_initcall() once we have it. */ @@ -265,31 +277,22 @@ static void __init dtb_apic_setup(void) dtb_ioapic_setup(); } -#ifdef CONFIG_OF_FLATTREE static void __init x86_flattree_get_config(void) { - u32 size, map_len; +#ifdef CONFIG_OF_FLATTREE void *dt; if (!initial_dtb) return; - map_len = max(PAGE_SIZE - (initial_dtb & ~PAGE_MASK), (u64)128); - - initial_boot_params = dt = early_memremap(initial_dtb, map_len); - size = of_get_flat_dt_size(); - if (map_len < size) { - early_memunmap(dt, map_len); - initial_boot_params = dt = early_memremap(initial_dtb, size); - map_len = size; - } - + initial_boot_params = dt = early_memremap(initial_dtb, + initial_dtb_size); unflatten_and_copy_device_tree(); - early_memunmap(dt, map_len); -} -#else -static inline void x86_flattree_get_config(void) { } + early_memunmap(dt, initial_dtb_size); + + memblock_free(initial_dtb, initial_dtb_size); #endif +} void __init x86_dtb_init(void) { -- 1.8.4.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/