From 588baeac38829304390b690142376d2c71ac5c9f Mon Sep 17 00:00:00 2001 From: Lennart Sorensen Date: Fri, 18 Sep 2009 13:49:36 -0400 Subject: m68knommu: add uboot commandline argument passing support This patch adds m68knommu support for getting the kernel command line arguments from uboot, including the passing of an initrd image from uboot. We use this on a 5270/5271 based board, and have used it on the 5271evb development board. It is based on a patch found in the linux-2.6-denx git tree, although that tree seems to have had lots of other changes since which are not in the main Linus kernel. I believe this will work on all coldfires, although other m68knommu might be missing the _init_sp stuff in head.S as far as I can tell. I only have the coldfire to test on. Signed-off-by: Lennart Sorensen Signed-off-by: Greg Ungerer --- arch/m68knommu/kernel/setup.c | 92 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 2 deletions(-) (limited to 'arch/m68knommu/kernel') diff --git a/arch/m68knommu/kernel/setup.c b/arch/m68knommu/kernel/setup.c index 5c2bb3eeaaa2..ba92b90d5fbc 100644 --- a/arch/m68knommu/kernel/setup.c +++ b/arch/m68knommu/kernel/setup.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #include @@ -52,7 +54,6 @@ void (*mach_reset)(void); void (*mach_halt)(void); void (*mach_power_off)(void); - #ifdef CONFIG_M68000 #define CPU "MC68000" #endif @@ -111,6 +112,69 @@ void (*mach_power_off)(void); extern int _stext, _etext, _sdata, _edata, _sbss, _ebss, _end; extern int _ramstart, _ramend; +#if defined(CONFIG_UBOOT) +/* + * parse_uboot_commandline + * + * Copies u-boot commandline arguments and store them in the proper linux + * variables. + * + * Assumes: + * _init_sp global contains the address in the stack pointer when the + * kernel starts (see head.S::_start) + * + * U-Boot calling convention: + * (*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end); + * + * _init_sp can be parsed as such + * + * _init_sp+00 = u-boot cmd after jsr into kernel (skip) + * _init_sp+04 = &kernel board_info (residual data) + * _init_sp+08 = &initrd_start + * _init_sp+12 = &initrd_end + * _init_sp+16 = &cmd_start + * _init_sp+20 = &cmd_end + * + * This also assumes that the memory locations pointed to are still + * unmodified. U-boot places them near the end of external SDRAM. + * + * Argument(s): + * commandp = the linux commandline arg container to fill. + * size = the sizeof commandp. + * + * Returns: + */ +void parse_uboot_commandline(char *commandp, int size) +{ + extern unsigned long _init_sp; + unsigned long *sp; + unsigned long uboot_kbd; + unsigned long uboot_initrd_start, uboot_initrd_end; + unsigned long uboot_cmd_start, uboot_cmd_end; + + + sp = (unsigned long *)_init_sp; + uboot_kbd = sp[1]; + uboot_initrd_start = sp[2]; + uboot_initrd_end = sp[3]; + uboot_cmd_start = sp[4]; + uboot_cmd_end = sp[5]; + + if (uboot_cmd_start && uboot_cmd_end) + strncpy(commandp, (const char *)uboot_cmd_start, size); +#if defined(CONFIG_BLK_DEV_INITRD) + if (uboot_initrd_start && uboot_initrd_end && + (uboot_initrd_end > uboot_initrd_start)) { + initrd_start = uboot_initrd_start; + initrd_end = uboot_initrd_end; + ROOT_DEV = Root_RAM0; + printk(KERN_INFO "initrd at 0x%lx:0x%lx\n", + initrd_start, initrd_end); + } +#endif /* if defined(CONFIG_BLK_DEV_INITRD) */ +} +#endif /* #if defined(CONFIG_UBOOT) */ + void __init setup_arch(char **cmdline_p) { int bootmap_size; @@ -128,7 +192,24 @@ void __init setup_arch(char **cmdline_p) #if defined(CONFIG_BOOTPARAM) strncpy(&command_line[0], CONFIG_BOOTPARAM_STRING, sizeof(command_line)); command_line[sizeof(command_line) - 1] = 0; -#endif +#endif /* CONFIG_BOOTPARAM */ + +#if defined(CONFIG_UBOOT) + /* CONFIG_UBOOT and CONFIG_BOOTPARAM defined, concatenate cmdline */ + #if defined(CONFIG_BOOTPARAM) + /* Add the whitespace separator */ + command_line[strlen(CONFIG_BOOTPARAM_STRING)] = ' '; + /* Parse uboot command line into the rest of the buffer */ + parse_uboot_commandline( + &command_line[(strlen(CONFIG_BOOTPARAM_STRING)+1)], + (sizeof(command_line) - + (strlen(CONFIG_BOOTPARAM_STRING)+1))); + /* Only CONFIG_UBOOT defined, create cmdline */ + #else + parse_uboot_commandline(&command_line[0], sizeof(command_line)); + #endif /* CONFIG_BOOTPARAM */ + command_line[sizeof(command_line) - 1] = 0; +#endif /* CONFIG_UBOOT */ printk(KERN_INFO "\x0F\r\n\nuClinux/" CPU "\n"); @@ -204,6 +285,13 @@ void __init setup_arch(char **cmdline_p) free_bootmem(memory_start, memory_end - memory_start); reserve_bootmem(memory_start, bootmap_size, BOOTMEM_DEFAULT); +#if defined(CONFIG_UBOOT) && defined(CONFIG_BLK_DEV_INITRD) + if ((initrd_start > 0) && (initrd_start < initrd_end) && + (initrd_end < memory_end)) + reserve_bootmem(initrd_start, initrd_end - initrd_start, + BOOTMEM_DEFAULT); +#endif /* if defined(CONFIG_BLK_DEV_INITRD) */ + /* * Get kmalloc into gear. */ -- cgit v1.2.1 From 193f087d492c566a211d01942c0f6b395f34f2ab Mon Sep 17 00:00:00 2001 From: Greg Ungerer Date: Tue, 7 Jul 2009 15:54:54 +1000 Subject: m68knommu: define arch_has_single_step() and friends Towards adding CONFIG_UTRACE support for non-mmu m68k add arch_has_single_step, and its support functions user_enable_single_step() and user_disable_single_step(). Signed-off-by: Greg Ungerer --- arch/m68knommu/kernel/ptrace.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'arch/m68knommu/kernel') diff --git a/arch/m68knommu/kernel/ptrace.c b/arch/m68knommu/kernel/ptrace.c index ef70ca070ce2..4d3828959fb0 100644 --- a/arch/m68knommu/kernel/ptrace.c +++ b/arch/m68knommu/kernel/ptrace.c @@ -86,6 +86,20 @@ static inline int put_reg(struct task_struct *task, int regno, return 0; } +void user_enable_single_step(struct task_struct *task) +{ + unsigned long srflags; + srflags = get_reg(task, PT_SR) | (TRACE_BITS << 16); + put_reg(task, PT_SR, srflags); +} + +void user_disable_single_step(struct task_struct *task) +{ + unsigned long srflags; + srflags = get_reg(task, PT_SR) & ~(TRACE_BITS << 16); + put_reg(task, PT_SR, srflags); +} + /* * Called by kernel/ptrace.c when detaching.. * @@ -93,10 +107,8 @@ static inline int put_reg(struct task_struct *task, int regno, */ void ptrace_disable(struct task_struct *child) { - unsigned long tmp; /* make sure the single step bit is not set. */ - tmp = get_reg(child, PT_SR) & ~(TRACE_BITS << 16); - put_reg(child, PT_SR, tmp); + user_disable_single_step(child); } long arch_ptrace(struct task_struct *child, long request, long addr, long data) -- cgit v1.2.1 From 10f204e5ad4e0c72aa007c00cb76c1d5a577032d Mon Sep 17 00:00:00 2001 From: Greg Ungerer Date: Fri, 30 Oct 2009 14:58:58 +1000 Subject: m68knommu: rename BSS define in linker script The "BSS" define name now used in asm-generic/vmlinux.lds.h (introduced in commit ef53dae8658cf0e93d380983824a661067948d87) clashes with the internal "BSS" define in the m68knommu vmlinux.lds.S linker script. So rename it. Signed-off-by: Greg Ungerer --- arch/m68knommu/kernel/vmlinux.lds.S | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'arch/m68knommu/kernel') diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S index 2736a5e309c0..6e10d25f872d 100644 --- a/arch/m68knommu/kernel/vmlinux.lds.S +++ b/arch/m68knommu/kernel/vmlinux.lds.S @@ -15,7 +15,7 @@ #define TEXT ram #define DATA ram #define INIT ram -#define BSS ram +#define BSSS ram #endif #if defined(CONFIG_ROMKERNEL) || defined(CONFIG_HIMEMKERNEL) #define RAM_START CONFIG_RAMBASE @@ -27,7 +27,7 @@ #define TEXT rom #define DATA ram #define INIT ram -#define BSS ram +#define BSSS ram #endif #ifndef DATA_ADDR @@ -192,7 +192,7 @@ SECTIONS { . = ALIGN(4) ; _ebss = . ; _end = . ; - } > BSS + } > BSSS DISCARDS } -- cgit v1.2.1 From f4bed4fb17417085d00e4fd1dc285db0330e5945 Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Sun, 18 Oct 2009 13:23:49 -0400 Subject: m68knommu: Don't hardcode the value of PAGE_SIZE in the linker script. Signed-off-by: Tim Abbott Signed-off-by: Greg Ungerer --- arch/m68knommu/kernel/vmlinux.lds.S | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'arch/m68knommu/kernel') diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S index 6e10d25f872d..a0108fd6d341 100644 --- a/arch/m68knommu/kernel/vmlinux.lds.S +++ b/arch/m68knommu/kernel/vmlinux.lds.S @@ -8,6 +8,7 @@ */ #include +#include #if defined(CONFIG_RAMKERNEL) #define RAM_START CONFIG_KERNELBASE @@ -155,7 +156,7 @@ SECTIONS { } > DATA .init : { - . = ALIGN(4096); + . = ALIGN(PAGE_SIZE); __init_begin = .; _sinittext = .; INIT_TEXT @@ -180,7 +181,7 @@ SECTIONS { *(.init.ramfs) __initramfs_end = .; #endif - . = ALIGN(4096); + . = ALIGN(PAGE_SIZE); __init_end = .; } > INIT -- cgit v1.2.1 From 49612a5fa574227db9eb14b0dd4befcf4e273a73 Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Sun, 18 Oct 2009 13:23:51 -0400 Subject: m68knommu: Use INIT_TASK_DATA and CACHELINE_ALIGNED_DATA. Signed-off-by: Tim Abbott Signed-off-by: Greg Ungerer --- arch/m68knommu/kernel/vmlinux.lds.S | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'arch/m68knommu/kernel') diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S index a0108fd6d341..d6c814e4055b 100644 --- a/arch/m68knommu/kernel/vmlinux.lds.S +++ b/arch/m68knommu/kernel/vmlinux.lds.S @@ -9,6 +9,7 @@ #include #include +#include #if defined(CONFIG_RAMKERNEL) #define RAM_START CONFIG_KERNELBASE @@ -148,10 +149,8 @@ SECTIONS { . = ALIGN(4); _sdata = . ; DATA_DATA - . = ALIGN(32); - *(.data.cacheline_aligned) - . = ALIGN(8192) ; - *(.data.init_task) + CACHELINE_ALIGNED_DATA(32) + INIT_TASK_DATA(THREAD_SIZE) _edata = . ; } > DATA -- cgit v1.2.1 From 84bd75715509c862eb9f536c4181dfa2b6d408dc Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Sun, 18 Oct 2009 13:23:52 -0400 Subject: m68knommu: Use more macros inside the .init section. Signed-off-by: Tim Abbott Signed-off-by: Greg Ungerer --- arch/m68knommu/kernel/vmlinux.lds.S | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) (limited to 'arch/m68knommu/kernel') diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S index d6c814e4055b..f20de3a6c687 100644 --- a/arch/m68knommu/kernel/vmlinux.lds.S +++ b/arch/m68knommu/kernel/vmlinux.lds.S @@ -161,25 +161,11 @@ SECTIONS { INIT_TEXT _einittext = .; INIT_DATA - . = ALIGN(16); - __setup_start = .; - *(.init.setup) - __setup_end = .; - __initcall_start = .; - INITCALLS - __initcall_end = .; - __con_initcall_start = .; - *(.con_initcall.init) - __con_initcall_end = .; - __security_initcall_start = .; - *(.security_initcall.init) - __security_initcall_end = .; -#ifdef CONFIG_BLK_DEV_INITRD - . = ALIGN(4); - __initramfs_start = .; - *(.init.ramfs) - __initramfs_end = .; -#endif + INIT_SETUP(16) + INIT_CALLS + CON_INITCALL + SECURITY_INITCALL + INIT_RAM_FS . = ALIGN(PAGE_SIZE); __init_end = .; } > INIT -- cgit v1.2.1 From a90a44ee901a1892473864d1a6c267dd04f2c96d Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Sun, 18 Oct 2009 13:23:53 -0400 Subject: m68knommu: Move __init_begin out of the .init section. Signed-off-by: Tim Abbott Signed-off-by: Greg Ungerer --- arch/m68knommu/kernel/vmlinux.lds.S | 2 ++ 1 file changed, 2 insertions(+) (limited to 'arch/m68knommu/kernel') diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S index f20de3a6c687..19468d0a1f89 100644 --- a/arch/m68knommu/kernel/vmlinux.lds.S +++ b/arch/m68knommu/kernel/vmlinux.lds.S @@ -157,6 +157,8 @@ SECTIONS { .init : { . = ALIGN(PAGE_SIZE); __init_begin = .; + } > INIT + .init : { _sinittext = .; INIT_TEXT _einittext = .; -- cgit v1.2.1 From 995bcd3dc1924095ddda45d0f8ece6bf6124d74e Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Sun, 18 Oct 2009 13:23:54 -0400 Subject: m68knommu: Move __init_end out of the .init section. Signed-off-by: Tim Abbott Signed-off-by: Greg Ungerer --- arch/m68knommu/kernel/vmlinux.lds.S | 2 ++ 1 file changed, 2 insertions(+) (limited to 'arch/m68knommu/kernel') diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S index 19468d0a1f89..884924982dd9 100644 --- a/arch/m68knommu/kernel/vmlinux.lds.S +++ b/arch/m68knommu/kernel/vmlinux.lds.S @@ -168,6 +168,8 @@ SECTIONS { CON_INITCALL SECURITY_INITCALL INIT_RAM_FS + } > INIT + .init : { . = ALIGN(PAGE_SIZE); __init_end = .; } > INIT -- cgit v1.2.1 From 53749f735a5b79156b56e75ee379be9e299b5e4b Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Sun, 18 Oct 2009 13:23:55 -0400 Subject: m68knommu: Split the .init section into INIT_TEXT_SECTION and INIT_DATA_SECTION. Signed-off-by: Tim Abbott Signed-off-by: Greg Ungerer --- arch/m68knommu/kernel/vmlinux.lds.S | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) (limited to 'arch/m68knommu/kernel') diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S index 884924982dd9..9f1784f586b9 100644 --- a/arch/m68knommu/kernel/vmlinux.lds.S +++ b/arch/m68knommu/kernel/vmlinux.lds.S @@ -154,22 +154,13 @@ SECTIONS { _edata = . ; } > DATA - .init : { + .init.text : { . = ALIGN(PAGE_SIZE); __init_begin = .; } > INIT - .init : { - _sinittext = .; - INIT_TEXT - _einittext = .; - INIT_DATA - INIT_SETUP(16) - INIT_CALLS - CON_INITCALL - SECURITY_INITCALL - INIT_RAM_FS - } > INIT - .init : { + INIT_TEXT_SECTION(PAGE_SIZE) > INIT + INIT_DATA_SECTION(16) > INIT + .init.data : { . = ALIGN(PAGE_SIZE); __init_end = .; } > INIT -- cgit v1.2.1