From 142abc9f7b8860638e39cf3850cf7ba328c26b42 Mon Sep 17 00:00:00 2001 From: Alexey Brodkin Date: Sat, 31 Oct 2015 15:58:20 +0300 Subject: [PATCH] openwrt: arc - add OWRTDTB section This change allows OpenWRT to patch resulting kernel binary with external .dtb. That allows us to re-use exactky the same vmlinux on different boards given its ARC core configurations match (at least cache line sizes etc). ""patch-dtb" searches for ASCII "OWRTDTB:" strign and copies external .dtb right after it, keeping the string in place. Signed-off-by: Alexey Brodkin --- arch/arc/kernel/head.S | 10 ++++++++++ arch/arc/kernel/setup.c | 4 +++- arch/arc/kernel/vmlinux.lds.S | 13 +++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/arch/arc/kernel/head.S b/arch/arc/kernel/head.S index 689dd86..51154ae 100644 --- a/arch/arc/kernel/head.S +++ b/arch/arc/kernel/head.S @@ -49,6 +49,16 @@ 1: .endm +; Here "patch-dtb" will embed external .dtb +; Note "patch-dtb" searches for ASCII "OWRTDTB:" string +; and pastes .dtb right after it, hense the string precedes +; __image_dtb symbol. + .section .owrt, "aw",@progbits + .ascii "OWRTDTB:" +ENTRY(__image_dtb) + .fill 0x4000 +END(__image_dtb) + .section .init.text, "ax",@progbits ;---------------------------------------------------------------- diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c index c33e77c..96fbfd0 100644 --- a/arch/arc/kernel/setup.c +++ b/arch/arc/kernel/setup.c @@ -370,6 +370,8 @@ static inline int is_kernel(unsigned long addr) return 0; } +extern struct boot_param_header __image_dtb; + void __init setup_arch(char **cmdline_p) { #ifdef CONFIG_ARC_UBOOT_SUPPORT @@ -383,7 +385,7 @@ void __init setup_arch(char **cmdline_p) #endif { /* No, so try the embedded one */ - machine_desc = setup_machine_fdt(__dtb_start); + machine_desc = setup_machine_fdt(&__image_dtb); if (!machine_desc) panic("Embedded DT invalid\n"); diff --git a/arch/arc/kernel/vmlinux.lds.S b/arch/arc/kernel/vmlinux.lds.S index dd35bde..f309104 100644 --- a/arch/arc/kernel/vmlinux.lds.S +++ b/arch/arc/kernel/vmlinux.lds.S @@ -30,6 +30,19 @@ SECTIONS . = CONFIG_LINUX_LINK_BASE; + /* + * In OpenWRT we want to patch built binary embedding .dtb of choice. + * This is implemented with "patch-dtb" utility which searches for + * "OWRTDTB:" string in first 16k of image and if it is found + * copies .dtb right after mentioned string. + * + * Note: "OWRTDTB:" won't be overwritten with .dtb, .dtb will follow it. + */ + .owrt : { + *(.owrt) + . = ALIGN(PAGE_SIZE); + } + _int_vec_base_lds = .; .vector : { *(.vector) -- 2.4.3