Hi, found something while merging the patches. see below ...
On 10/02/2015 13:10, Yousong Zhou wrote: > - Allow --command-line parameters of kexec-tools be parsed and used by > the kernel. > - For malta machine, mark kernel code and kernel data segments as > "System RAM" instead of "reserved" in /proc/iomem, otherwise > kexec-tools will complain that program segments in ELF kernel file > are invalid. > > Signed-off-by: Yousong Zhou <[email protected]> [...] > diff --git > a/target/linux/generic/patches-3.19/330-MIPS-Malta-Mark-kernel-code-and-kernel-data-segments.patch > > b/target/linux/generic/patches-3.19/330-MIPS-Malta-Mark-kernel-code-and-kernel-data-segments.patch > new file mode 100644 > index 0000000..4457d75 > --- /dev/null > +++ > b/target/linux/generic/patches-3.19/330-MIPS-Malta-Mark-kernel-code-and-kernel-data-segments.patch > @@ -0,0 +1,39 @@ > +From 79c7301c922f5023f85805a4ba969ce55f51d0ca Mon Sep 17 00:00:00 2001 > +From: Yousong Zhou <[email protected]> > +Date: Sat, 31 Jan 2015 15:13:12 +0800 > +Subject: [PATCH 330/331] MIPS: Malta: Mark kernel code and kernel data > + segments as BOOT_MEM_RAM. > + > +Kexec-tools requires those segments listed as "System RAM" in > +/proc/iomem, otherwise, an error message of "Invalid memory segment" > +will be emitted when trying to load the ELF kernel image. > + > +Signed-off-by: Yousong Zhou <[email protected]> > +--- > + arch/mips/mti-malta/malta-memory.c | 9 ++------- > + 1 file changed, 2 insertions(+), 7 deletions(-) > + > +diff --git a/arch/mips/mti-malta/malta-memory.c > b/arch/mips/mti-malta/malta-memory.c > +index 8fddd2cd..1d562f0 100644 > +--- a/arch/mips/mti-malta/malta-memory.c > ++++ b/arch/mips/mti-malta/malta-memory.c > +@@ -106,14 +106,9 @@ fw_memblock_t * __init fw_getmdesc(int eva) > + mdesc[2].base = mdesc[0].base + 0x000f0000UL; > + mdesc[2].size = 0x00010000; > + > +- mdesc[3].type = fw_dontuse; > ++ mdesc[3].type = fw_free; > + mdesc[3].base = mdesc[0].base + 0x00100000UL; > +- mdesc[3].size = CPHYSADDR(PFN_ALIGN((unsigned long)&_end)) - > +- 0x00100000UL; > +- > +- mdesc[4].type = fw_free; > +- mdesc[4].base = mdesc[0].base + CPHYSADDR(PFN_ALIGN(&_end)); > +- mdesc[4].size = memsize - CPHYSADDR(mdesc[4].base); > ++ mdesc[3].size = memsize - CPHYSADDR(mdesc[3].base); > + will the CPHYSADDR() call work on 64bit systems ? 64bit userland is currenty broken and disbaled in openwrt, we should however try to fix this before we send the patch upstream to ralf John > + return &mdesc[0]; > + } > +-- > +1.7.10.4 > + > diff --git > a/target/linux/generic/patches-3.19/331-MIPS-kexec-Accept-command-line-parameters-from-users.patch > > b/target/linux/generic/patches-3.19/331-MIPS-kexec-Accept-command-line-parameters-from-users.patch > new file mode 100644 > index 0000000..457b0bd > --- /dev/null > +++ > b/target/linux/generic/patches-3.19/331-MIPS-kexec-Accept-command-line-parameters-from-users.patch > @@ -0,0 +1,308 @@ > +From 734dd58ef3a2161e1aaeb02d47e8b86c74379161 Mon Sep 17 00:00:00 2001 > +From: Yousong Zhou <[email protected]> > +Date: Sat, 31 Jan 2015 22:26:03 +0800 > +Subject: [PATCH 331/331] MIPS: kexec: Accept command line parameters from > + userspace. > + > +Signed-off-by: Yousong Zhou <[email protected]> > +--- > + arch/mips/kernel/machine_kexec.c | 153 > +++++++++++++++++++++++++++++++----- > + arch/mips/kernel/machine_kexec.h | 20 +++++ > + arch/mips/kernel/relocate_kernel.S | 21 +++-- > + 3 files changed, 167 insertions(+), 27 deletions(-) > + create mode 100644 arch/mips/kernel/machine_kexec.h > + > +diff --git a/arch/mips/kernel/machine_kexec.c > b/arch/mips/kernel/machine_kexec.c > +index 50980bf3..b9c0f75 100644 > +--- a/arch/mips/kernel/machine_kexec.c > ++++ b/arch/mips/kernel/machine_kexec.c > +@@ -10,45 +10,145 @@ > + #include <linux/mm.h> > + #include <linux/delay.h> > + > ++#include <asm/bootinfo.h> > + #include <asm/cacheflush.h> > + #include <asm/page.h> > +- > +-extern const unsigned char relocate_new_kernel[]; > +-extern const size_t relocate_new_kernel_size; > +- > +-extern unsigned long kexec_start_address; > +-extern unsigned long kexec_indirection_page; > ++#include <asm/uaccess.h> > ++#include "machine_kexec.h" > + > + int (*_machine_kexec_prepare)(struct kimage *) = NULL; > + void (*_machine_kexec_shutdown)(void) = NULL; > + void (*_machine_crash_shutdown)(struct pt_regs *regs) = NULL; > ++ > + #ifdef CONFIG_SMP > + void (*relocated_kexec_smp_wait) (void *); > + atomic_t kexec_ready_to_reboot = ATOMIC_INIT(0); > + #endif > + > +-int > +-machine_kexec_prepare(struct kimage *kimage) > ++static void machine_kexec_print_args(void) > + { > ++ unsigned long argc = (int)kexec_args[0]; > ++ int i; > ++ > ++ pr_info("kexec_args[0] (argc): %lu\n", argc); > ++ pr_info("kexec_args[1] (argv): %p\n", (void *)kexec_args[1]); > ++ pr_info("kexec_args[2] (env ): %p\n", (void *)kexec_args[2]); > ++ pr_info("kexec_args[3] (desc): %p\n", (void *)kexec_args[3]); > ++ > ++ for (i = 0; i < argc; i++) { > ++ pr_info("kexec_argv[%d] = %p, %s\n", > ++ i, kexec_argv[i], kexec_argv[i]); > ++ } > ++} > ++ > ++static void machine_kexec_init_argv(struct kimage *image) > ++{ > ++ void __user *buf = NULL; > ++ size_t bufsz; > ++ size_t size; > ++ int i; > ++ > ++ bufsz = 0; > ++ for (i = 0; i < image->nr_segments; i++) { > ++ struct kexec_segment *seg; > ++ > ++ seg = &image->segment[i]; > ++ if (seg->bufsz < 6) > ++ continue; > ++ > ++ if (strncmp((char *) seg->buf, "kexec ", 6)) > ++ continue; > ++ > ++ buf = seg->buf; > ++ bufsz = seg->bufsz; > ++ break; > ++ } > ++ > ++ if (!buf) > ++ return; > ++ > ++ size = KEXEC_COMMAND_LINE_SIZE; > ++ size = min(size, bufsz); > ++ if (size < bufsz) > ++ pr_warn("kexec command line truncated to %zd bytes\n", size); > ++ > ++ /* Copy to kernel space */ > ++ copy_from_user(kexec_argv_buf, buf, size); > ++ kexec_argv_buf[size - 1] = 0; > ++} > ++ > ++static void machine_kexec_parse_argv(struct kimage *image) > ++{ > ++ char *reboot_code_buffer; > ++ int reloc_delta; > ++ char *ptr; > ++ int argc; > ++ int i; > ++ > ++ ptr = kexec_argv_buf; > ++ argc = 0; > ++ > ++ /* > ++ * convert command line string to array of parameters > ++ * (as bootloader does). > ++ */ > ++ while (ptr && *ptr && (KEXEC_MAX_ARGC > argc)) { > ++ if (*ptr == ' ') { > ++ *ptr++ = '\0'; > ++ continue; > ++ } > ++ > ++ kexec_argv[argc++] = ptr; > ++ ptr = strchr(ptr, ' '); > ++ } > ++ > ++ if (!argc) > ++ return; > ++ > ++ kexec_args[0] = argc; > ++ kexec_args[1] = (unsigned long)kexec_argv; > ++ kexec_args[2] = 0; > ++ kexec_args[3] = 0; > ++ > ++ reboot_code_buffer = page_address(image->control_code_page); > ++ reloc_delta = reboot_code_buffer - (char *)kexec_relocate_new_kernel; > ++ > ++ kexec_args[1] += reloc_delta; > ++ for (i = 0; i < argc; i++) > ++ kexec_argv[i] += reloc_delta; > ++} > ++ > ++int machine_kexec_prepare(struct kimage *kimage) > ++{ > ++ /* > ++ * Whenever arguments passed from kexec-tools, Init the arguments as > ++ * the original ones to try avoiding booting failure. > ++ */ > ++ > ++ kexec_args[0] = fw_arg0; > ++ kexec_args[1] = fw_arg1; > ++ kexec_args[2] = fw_arg2; > ++ kexec_args[3] = fw_arg3; > ++ > ++ machine_kexec_init_argv(kimage); > ++ machine_kexec_parse_argv(kimage); > ++ > + if (_machine_kexec_prepare) > + return _machine_kexec_prepare(kimage); > + return 0; > + } > + > +-void > +-machine_kexec_cleanup(struct kimage *kimage) > ++void machine_kexec_cleanup(struct kimage *kimage) > + { > + } > + > +-void > +-machine_shutdown(void) > ++void machine_shutdown(void) > + { > + if (_machine_kexec_shutdown) > + _machine_kexec_shutdown(); > + } > + > +-void > +-machine_crash_shutdown(struct pt_regs *regs) > ++void machine_crash_shutdown(struct pt_regs *regs) > + { > + if (_machine_crash_shutdown) > + _machine_crash_shutdown(regs); > +@@ -66,10 +166,12 @@ machine_kexec(struct kimage *image) > + unsigned long *ptr; > + > + reboot_code_buffer = > +- (unsigned long)page_address(image->control_code_page); > ++ (unsigned long)page_address(image->control_code_page); > ++ pr_info("reboot_code_buffer = %p\n", (void *)reboot_code_buffer); > + > + kexec_start_address = > + (unsigned long) phys_to_virt(image->start); > ++ pr_info("kexec_start_address = %p\n", (void *)kexec_start_address); > + > + if (image->type == KEXEC_TYPE_DEFAULT) { > + kexec_indirection_page = > +@@ -77,9 +179,19 @@ machine_kexec(struct kimage *image) > + } else { > + kexec_indirection_page = (unsigned long)&image->head; > + } > ++ pr_info("kexec_indirection_page = %p\n", (void > *)kexec_indirection_page); > ++ > ++ pr_info("Where is memcpy: %p\n", memcpy); > ++ pr_info("kexec_relocate_new_kernel = %p, kexec_relocate_new_kernel_end > = %p\n", > ++ (void *)kexec_relocate_new_kernel, > &kexec_relocate_new_kernel_end); > ++ pr_info("Copy %lu bytes from %p to %p\n", > KEXEC_RELOCATE_NEW_KERNEL_SIZE, > ++ (void *)kexec_relocate_new_kernel, (void *)reboot_code_buffer); > ++ memcpy((void*)reboot_code_buffer, kexec_relocate_new_kernel, > ++ KEXEC_RELOCATE_NEW_KERNEL_SIZE); > + > +- memcpy((void*)reboot_code_buffer, relocate_new_kernel, > +- relocate_new_kernel_size); > ++ pr_info("Before _print_args().\n"); > ++ machine_kexec_print_args(); > ++ pr_info("Before eval loop.\n"); > + > + /* > + * The generic kexec code builds a page list with physical > +@@ -98,15 +210,16 @@ machine_kexec(struct kimage *image) > + /* > + * we do not want to be bothered. > + */ > ++ pr_info("Before irq_disable.\n"); > + local_irq_disable(); > + > +- printk("Will call new kernel at %08lx\n", image->start); > +- printk("Bye ...\n"); > ++ pr_info("Will call new kernel at %08lx\n", image->start); > ++ pr_info("Bye ...\n"); > + __flush_cache_all(); > + #ifdef CONFIG_SMP > + /* All secondary cpus now may jump to kexec_wait cycle */ > + relocated_kexec_smp_wait = reboot_code_buffer + > +- (void *)(kexec_smp_wait - relocate_new_kernel); > ++ (void *)(kexec_smp_wait - kexec_relocate_new_kernel); > + smp_wmb(); > + atomic_set(&kexec_ready_to_reboot, 1); > + #endif > +diff --git a/arch/mips/kernel/machine_kexec.h > b/arch/mips/kernel/machine_kexec.h > +new file mode 100644 > +index 0000000..ae0961e > +--- /dev/null > ++++ b/arch/mips/kernel/machine_kexec.h > +@@ -0,0 +1,20 @@ > ++#ifndef _MACHINE_KEXEC_H > ++#define _MACHINE_KEXEC_H > ++ > ++#ifndef __ASSEMBLY__ > ++extern const unsigned char kexec_relocate_new_kernel[]; > ++extern unsigned long kexec_relocate_new_kernel_end; > ++extern unsigned long kexec_start_address; > ++extern unsigned long kexec_indirection_page; > ++ > ++extern char kexec_argv_buf[]; > ++extern char *kexec_argv[]; > ++ > ++#define KEXEC_RELOCATE_NEW_KERNEL_SIZE ((unsigned > long)&kexec_relocate_new_kernel_end - (unsigned > long)kexec_relocate_new_kernel) > ++#endif /* !__ASSEMBLY__ */ > ++ > ++#define KEXEC_COMMAND_LINE_SIZE 256 > ++#define KEXEC_ARGV_SIZE (KEXEC_COMMAND_LINE_SIZE / 16) > ++#define KEXEC_MAX_ARGC (KEXEC_ARGV_SIZE / sizeof(long)) > ++ > ++#endif > +diff --git a/arch/mips/kernel/relocate_kernel.S > b/arch/mips/kernel/relocate_kernel.S > +index 74bab9d..2c92c50 100644 > +--- a/arch/mips/kernel/relocate_kernel.S > ++++ b/arch/mips/kernel/relocate_kernel.S > +@@ -12,8 +12,9 @@ > + #include <asm/mipsregs.h> > + #include <asm/stackframe.h> > + #include <asm/addrspace.h> > ++#include "machine_kexec.h" > + > +-LEAF(relocate_new_kernel) > ++LEAF(kexec_relocate_new_kernel) > + PTR_L a0, arg0 > + PTR_L a1, arg1 > + PTR_L a2, arg2 > +@@ -98,7 +99,7 @@ done: > + #endif > + /* jump to kexec_start_address */ > + j s1 > +- END(relocate_new_kernel) > ++ END(kexec_relocate_new_kernel) > + > + #ifdef CONFIG_SMP > + /* > +@@ -184,9 +185,15 @@ kexec_indirection_page: > + PTR 0 > + .size kexec_indirection_page, PTRSIZE > + > +-relocate_new_kernel_end: > ++kexec_argv_buf: > ++ EXPORT(kexec_argv_buf) > ++ .skip KEXEC_COMMAND_LINE_SIZE > ++ .size kexec_argv_buf, KEXEC_COMMAND_LINE_SIZE > + > +-relocate_new_kernel_size: > +- EXPORT(relocate_new_kernel_size) > +- PTR relocate_new_kernel_end - relocate_new_kernel > +- .size relocate_new_kernel_size, PTRSIZE > ++kexec_argv: > ++ EXPORT(kexec_argv) > ++ .skip KEXEC_ARGV_SIZE > ++ .size kexec_argv, KEXEC_ARGV_SIZE > ++ > ++kexec_relocate_new_kernel_end: > ++ EXPORT(kexec_relocate_new_kernel_end) > +-- > +1.7.10.4 > + > _______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
