From ec54842bfce8240815a9ce7a1db0935851fe9ea8 Mon Sep 17 00:00:00 2001 From: Evgeniy Didin Date: Fri, 15 Mar 2019 18:53:38 +0300 Subject: [PATCH 42/96] 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: Eugeniy Paltsev Signed-off-by: Alexey Brodkin Signed-off-by: Evgeniy Didin --- 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 9152782444b5..167d81ce6ab7 100644 --- a/arch/arc/kernel/head.S +++ b/arch/arc/kernel/head.S @@ -88,6 +88,16 @@ DSP_EARLY_INIT .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 41f07b3e594e..d0c3e7817022 100644 --- a/arch/arc/kernel/setup.c +++ b/arch/arc/kernel/setup.c @@ -495,6 +495,8 @@ static inline bool uboot_arg_invalid(unsigned long addr) /* We always pass 0 as magic from U-boot */ #define UBOOT_MAGIC_VALUE 0 +extern struct boot_param_header __image_dtb; + void __init handle_uboot_args(void) { bool use_embedded_dtb = true; @@ -533,7 +535,7 @@ void __init handle_uboot_args(void) ignore_uboot_args: if (use_embedded_dtb) { - 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 529ae50f9fe2..ecdcd6842c0d 100644 --- a/arch/arc/kernel/vmlinux.lds.S +++ b/arch/arc/kernel/vmlinux.lds.S @@ -27,6 +27,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.37.2