diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-06-29 13:28:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-06-29 13:28:52 -0400 |
commit | a61aef7fc00bac9068e98bf00aaa38e766f19a57 (patch) | |
tree | 57ff3c0f8a1aef41321954ab1778cc27deb71058 | |
parent | a75930c6332f39bfe05059259e13cdee54933f9f (diff) | |
parent | e3f12a53042e26202993baa3ad4ff8768173653d (diff) |
Merge tag 'for-linus-20130628' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-mn10300
Pull two MN10300 fixes from David Howells:
"The first fixes a problem with passing arrays rather than pointers to
get_user() where __typeof__ then wants to declare and initialise an
array variable which gcc doesn't like.
The second fixes a problem whereby putting mem=xxx into the kernel
command line causes init=xxx to get an incorrect value."
* tag 'for-linus-20130628' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-mn10300:
mn10300: Use early_param() to parse "mem=" parameter
mn10300: Allow to pass array name to get_user()
-rw-r--r-- | arch/mn10300/include/asm/uaccess.h | 2 | ||||
-rw-r--r-- | arch/mn10300/kernel/setup.c | 54 |
2 files changed, 22 insertions, 34 deletions
diff --git a/arch/mn10300/include/asm/uaccess.h b/arch/mn10300/include/asm/uaccess.h index 780560b330d9..d7966e0f7698 100644 --- a/arch/mn10300/include/asm/uaccess.h +++ b/arch/mn10300/include/asm/uaccess.h | |||
@@ -161,7 +161,7 @@ struct __large_struct { unsigned long buf[100]; }; | |||
161 | 161 | ||
162 | #define __get_user_check(x, ptr, size) \ | 162 | #define __get_user_check(x, ptr, size) \ |
163 | ({ \ | 163 | ({ \ |
164 | const __typeof__(ptr) __guc_ptr = (ptr); \ | 164 | const __typeof__(*(ptr))* __guc_ptr = (ptr); \ |
165 | int _e; \ | 165 | int _e; \ |
166 | if (likely(__access_ok((unsigned long) __guc_ptr, (size)))) \ | 166 | if (likely(__access_ok((unsigned long) __guc_ptr, (size)))) \ |
167 | _e = __get_user_nocheck((x), __guc_ptr, (size)); \ | 167 | _e = __get_user_nocheck((x), __guc_ptr, (size)); \ |
diff --git a/arch/mn10300/kernel/setup.c b/arch/mn10300/kernel/setup.c index 33c3bd1e5c6d..ebac9c11f796 100644 --- a/arch/mn10300/kernel/setup.c +++ b/arch/mn10300/kernel/setup.c | |||
@@ -38,6 +38,7 @@ struct mn10300_cpuinfo boot_cpu_data; | |||
38 | /* For PCI or other memory-mapped resources */ | 38 | /* For PCI or other memory-mapped resources */ |
39 | unsigned long pci_mem_start = 0x18000000; | 39 | unsigned long pci_mem_start = 0x18000000; |
40 | 40 | ||
41 | static char __initdata cmd_line[COMMAND_LINE_SIZE]; | ||
41 | char redboot_command_line[COMMAND_LINE_SIZE] = | 42 | char redboot_command_line[COMMAND_LINE_SIZE] = |
42 | "console=ttyS0,115200 root=/dev/mtdblock3 rw"; | 43 | "console=ttyS0,115200 root=/dev/mtdblock3 rw"; |
43 | 44 | ||
@@ -74,45 +75,19 @@ static const char *const mn10300_cputypes[] = { | |||
74 | }; | 75 | }; |
75 | 76 | ||
76 | /* | 77 | /* |
77 | * | 78 | * Pick out the memory size. We look for mem=size, |
79 | * where size is "size[KkMm]" | ||
78 | */ | 80 | */ |
79 | static void __init parse_mem_cmdline(char **cmdline_p) | 81 | static int __init early_mem(char *p) |
80 | { | 82 | { |
81 | char *from, *to, c; | 83 | memory_size = memparse(p, &p); |
82 | |||
83 | /* save unparsed command line copy for /proc/cmdline */ | ||
84 | strcpy(boot_command_line, redboot_command_line); | ||
85 | |||
86 | /* see if there's an explicit memory size option */ | ||
87 | from = redboot_command_line; | ||
88 | to = redboot_command_line; | ||
89 | c = ' '; | ||
90 | |||
91 | for (;;) { | ||
92 | if (c == ' ' && !memcmp(from, "mem=", 4)) { | ||
93 | if (to != redboot_command_line) | ||
94 | to--; | ||
95 | memory_size = memparse(from + 4, &from); | ||
96 | } | ||
97 | |||
98 | c = *(from++); | ||
99 | if (!c) | ||
100 | break; | ||
101 | |||
102 | *(to++) = c; | ||
103 | } | ||
104 | |||
105 | *to = '\0'; | ||
106 | *cmdline_p = redboot_command_line; | ||
107 | 84 | ||
108 | if (memory_size == 0) | 85 | if (memory_size == 0) |
109 | panic("Memory size not known\n"); | 86 | panic("Memory size not known\n"); |
110 | 87 | ||
111 | memory_end = (unsigned long) CONFIG_KERNEL_RAM_BASE_ADDRESS + | 88 | return 0; |
112 | memory_size; | ||
113 | if (memory_end > phys_memory_end) | ||
114 | memory_end = phys_memory_end; | ||
115 | } | 89 | } |
90 | early_param("mem", early_mem); | ||
116 | 91 | ||
117 | /* | 92 | /* |
118 | * architecture specific setup | 93 | * architecture specific setup |
@@ -125,7 +100,20 @@ void __init setup_arch(char **cmdline_p) | |||
125 | cpu_init(); | 100 | cpu_init(); |
126 | unit_setup(); | 101 | unit_setup(); |
127 | smp_init_cpus(); | 102 | smp_init_cpus(); |
128 | parse_mem_cmdline(cmdline_p); | 103 | |
104 | /* save unparsed command line copy for /proc/cmdline */ | ||
105 | strlcpy(boot_command_line, redboot_command_line, COMMAND_LINE_SIZE); | ||
106 | |||
107 | /* populate cmd_line too for later use, preserving boot_command_line */ | ||
108 | strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE); | ||
109 | *cmdline_p = cmd_line; | ||
110 | |||
111 | parse_early_param(); | ||
112 | |||
113 | memory_end = (unsigned long) CONFIG_KERNEL_RAM_BASE_ADDRESS + | ||
114 | memory_size; | ||
115 | if (memory_end > phys_memory_end) | ||
116 | memory_end = phys_memory_end; | ||
129 | 117 | ||
130 | init_mm.start_code = (unsigned long)&_text; | 118 | init_mm.start_code = (unsigned long)&_text; |
131 | init_mm.end_code = (unsigned long) &_etext; | 119 | init_mm.end_code = (unsigned long) &_etext; |