From 690e7f2cad271595ff68cace1c45fb10779bde41 Mon Sep 17 00:00:00 2001 From: Alexey Brodkin Date: Fri, 15 Jan 2016 00:34:01 +0300 Subject: [PATCH 2/2] 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(-) --- a/arch/arc/kernel/head.S +++ b/arch/arc/kernel/head.S @@ -59,6 +59,16 @@ #endif .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 ;---------------------------------------------------------------- --- a/arch/arc/kernel/setup.c +++ b/arch/arc/kernel/setup.c @@ -366,6 +366,8 @@ static inline int is_kernel(unsigned lon return 0; } +extern struct boot_param_header __image_dtb; + void __init setup_arch(char **cmdline_p) { #ifdef CONFIG_ARC_UBOOT_SUPPORT @@ -379,7 +381,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"); --- 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)