diff options
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/.gitignore | 1 | ||||
-rw-r--r-- | arch/mips/kernel/cpu-probe.c | 16 | ||||
-rw-r--r-- | arch/mips/kernel/genex.S | 37 | ||||
-rw-r--r-- | arch/mips/kernel/kgdb.c | 10 | ||||
-rw-r--r-- | arch/mips/kernel/process.c | 2 | ||||
-rw-r--r-- | arch/mips/kernel/scall32-o32.S | 6 | ||||
-rw-r--r-- | arch/mips/kernel/scall64-64.S | 6 | ||||
-rw-r--r-- | arch/mips/kernel/scall64-n32.S | 6 | ||||
-rw-r--r-- | arch/mips/kernel/scall64-o32.S | 6 | ||||
-rw-r--r-- | arch/mips/kernel/setup.c | 75 | ||||
-rw-r--r-- | arch/mips/kernel/traps.c | 40 | ||||
-rw-r--r-- | arch/mips/kernel/vmlinux.lds.S | 1 |
12 files changed, 135 insertions, 71 deletions
diff --git a/arch/mips/kernel/.gitignore b/arch/mips/kernel/.gitignore new file mode 100644 index 000000000000..c5f676c3c224 --- /dev/null +++ b/arch/mips/kernel/.gitignore | |||
@@ -0,0 +1 @@ | |||
vmlinux.lds | |||
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index 335a6ae3d594..11c92dc53791 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
@@ -45,18 +45,7 @@ static void r39xx_wait(void) | |||
45 | local_irq_enable(); | 45 | local_irq_enable(); |
46 | } | 46 | } |
47 | 47 | ||
48 | /* | 48 | extern void r4k_wait(void); |
49 | * There is a race when WAIT instruction executed with interrupt | ||
50 | * enabled. | ||
51 | * But it is implementation-dependent wheter the pipelie restarts when | ||
52 | * a non-enabled interrupt is requested. | ||
53 | */ | ||
54 | static void r4k_wait(void) | ||
55 | { | ||
56 | __asm__(" .set mips3 \n" | ||
57 | " wait \n" | ||
58 | " .set mips0 \n"); | ||
59 | } | ||
60 | 49 | ||
61 | /* | 50 | /* |
62 | * This variant is preferable as it allows testing need_resched and going to | 51 | * This variant is preferable as it allows testing need_resched and going to |
@@ -128,7 +117,7 @@ static int __init wait_disable(char *s) | |||
128 | 117 | ||
129 | __setup("nowait", wait_disable); | 118 | __setup("nowait", wait_disable); |
130 | 119 | ||
131 | static inline void check_wait(void) | 120 | void __init check_wait(void) |
132 | { | 121 | { |
133 | struct cpuinfo_mips *c = ¤t_cpu_data; | 122 | struct cpuinfo_mips *c = ¤t_cpu_data; |
134 | 123 | ||
@@ -242,7 +231,6 @@ static inline void check_errata(void) | |||
242 | 231 | ||
243 | void __init check_bugs32(void) | 232 | void __init check_bugs32(void) |
244 | { | 233 | { |
245 | check_wait(); | ||
246 | check_errata(); | 234 | check_errata(); |
247 | } | 235 | } |
248 | 236 | ||
diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index c6ada98ee042..f886dd7f708e 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <asm/stackframe.h> | 20 | #include <asm/stackframe.h> |
21 | #include <asm/war.h> | 21 | #include <asm/war.h> |
22 | #include <asm/page.h> | 22 | #include <asm/page.h> |
23 | #include <asm/thread_info.h> | ||
23 | 24 | ||
24 | #define PANIC_PIC(msg) \ | 25 | #define PANIC_PIC(msg) \ |
25 | .set push; \ | 26 | .set push; \ |
@@ -126,7 +127,42 @@ handle_vcei: | |||
126 | 127 | ||
127 | __FINIT | 128 | __FINIT |
128 | 129 | ||
130 | .align 5 /* 32 byte rollback region */ | ||
131 | LEAF(r4k_wait) | ||
132 | .set push | ||
133 | .set noreorder | ||
134 | /* start of rollback region */ | ||
135 | LONG_L t0, TI_FLAGS($28) | ||
136 | nop | ||
137 | andi t0, _TIF_NEED_RESCHED | ||
138 | bnez t0, 1f | ||
139 | nop | ||
140 | nop | ||
141 | nop | ||
142 | .set mips3 | ||
143 | wait | ||
144 | /* end of rollback region (the region size must be power of two) */ | ||
145 | .set pop | ||
146 | 1: | ||
147 | jr ra | ||
148 | END(r4k_wait) | ||
149 | |||
150 | .macro BUILD_ROLLBACK_PROLOGUE handler | ||
151 | FEXPORT(rollback_\handler) | ||
152 | .set push | ||
153 | .set noat | ||
154 | MFC0 k0, CP0_EPC | ||
155 | PTR_LA k1, r4k_wait | ||
156 | ori k0, 0x1f /* 32 byte rollback region */ | ||
157 | xori k0, 0x1f | ||
158 | bne k0, k1, 9f | ||
159 | MTC0 k0, CP0_EPC | ||
160 | 9: | ||
161 | .set pop | ||
162 | .endm | ||
163 | |||
129 | .align 5 | 164 | .align 5 |
165 | BUILD_ROLLBACK_PROLOGUE handle_int | ||
130 | NESTED(handle_int, PT_SIZE, sp) | 166 | NESTED(handle_int, PT_SIZE, sp) |
131 | #ifdef CONFIG_TRACE_IRQFLAGS | 167 | #ifdef CONFIG_TRACE_IRQFLAGS |
132 | /* | 168 | /* |
@@ -201,6 +237,7 @@ NESTED(except_vec_ejtag_debug, 0, sp) | |||
201 | * This prototype is copied to ebase + n*IntCtl.VS and patched | 237 | * This prototype is copied to ebase + n*IntCtl.VS and patched |
202 | * to invoke the handler | 238 | * to invoke the handler |
203 | */ | 239 | */ |
240 | BUILD_ROLLBACK_PROLOGUE except_vec_vi | ||
204 | NESTED(except_vec_vi, 0, sp) | 241 | NESTED(except_vec_vi, 0, sp) |
205 | SAVE_SOME | 242 | SAVE_SOME |
206 | SAVE_AT | 243 | SAVE_AT |
diff --git a/arch/mips/kernel/kgdb.c b/arch/mips/kernel/kgdb.c index c5a8b2d21ca4..6e152c80cd4a 100644 --- a/arch/mips/kernel/kgdb.c +++ b/arch/mips/kernel/kgdb.c | |||
@@ -62,13 +62,13 @@ void arch_kgdb_breakpoint(void) | |||
62 | 62 | ||
63 | static void kgdb_call_nmi_hook(void *ignored) | 63 | static void kgdb_call_nmi_hook(void *ignored) |
64 | { | 64 | { |
65 | kgdb_nmicallback(raw_smp_processor_id(), (void *)0); | 65 | kgdb_nmicallback(raw_smp_processor_id(), NULL); |
66 | } | 66 | } |
67 | 67 | ||
68 | void kgdb_roundup_cpus(unsigned long flags) | 68 | void kgdb_roundup_cpus(unsigned long flags) |
69 | { | 69 | { |
70 | local_irq_enable(); | 70 | local_irq_enable(); |
71 | smp_call_function(kgdb_call_nmi_hook, NULL, NULL); | 71 | smp_call_function(kgdb_call_nmi_hook, NULL, 0); |
72 | local_irq_disable(); | 72 | local_irq_disable(); |
73 | } | 73 | } |
74 | 74 | ||
@@ -190,9 +190,6 @@ static int kgdb_mips_notify(struct notifier_block *self, unsigned long cmd, | |||
190 | struct pt_regs *regs = args->regs; | 190 | struct pt_regs *regs = args->regs; |
191 | int trap = (regs->cp0_cause & 0x7c) >> 2; | 191 | int trap = (regs->cp0_cause & 0x7c) >> 2; |
192 | 192 | ||
193 | if (fixup_exception(regs)) | ||
194 | return NOTIFY_DONE; | ||
195 | |||
196 | /* Userpace events, ignore. */ | 193 | /* Userpace events, ignore. */ |
197 | if (user_mode(regs)) | 194 | if (user_mode(regs)) |
198 | return NOTIFY_DONE; | 195 | return NOTIFY_DONE; |
@@ -239,8 +236,7 @@ int kgdb_arch_handle_exception(int vector, int signo, int err_code, | |||
239 | 236 | ||
240 | atomic_set(&kgdb_cpu_doing_single_step, -1); | 237 | atomic_set(&kgdb_cpu_doing_single_step, -1); |
241 | if (remcom_in_buffer[0] == 's') | 238 | if (remcom_in_buffer[0] == 's') |
242 | if (kgdb_contthread) | 239 | atomic_set(&kgdb_cpu_doing_single_step, cpu); |
243 | atomic_set(&kgdb_cpu_doing_single_step, cpu); | ||
244 | 240 | ||
245 | return 0; | 241 | return 0; |
246 | } | 242 | } |
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index b16facd9ea8e..ce7684335a41 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c | |||
@@ -148,6 +148,8 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp, | |||
148 | clear_tsk_thread_flag(p, TIF_USEDFPU); | 148 | clear_tsk_thread_flag(p, TIF_USEDFPU); |
149 | 149 | ||
150 | #ifdef CONFIG_MIPS_MT_FPAFF | 150 | #ifdef CONFIG_MIPS_MT_FPAFF |
151 | clear_tsk_thread_flag(p, TIF_FPUBOUND); | ||
152 | |||
151 | /* | 153 | /* |
152 | * FPU affinity support is cleaner if we track the | 154 | * FPU affinity support is cleaner if we track the |
153 | * user-visible CPU affinity from the very beginning. | 155 | * user-visible CPU affinity from the very beginning. |
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index fc4fd4d705e2..5e75a316f6b1 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S | |||
@@ -647,6 +647,12 @@ einval: li v0, -EINVAL | |||
647 | sys sys_timerfd_create 2 | 647 | sys sys_timerfd_create 2 |
648 | sys sys_timerfd_gettime 2 | 648 | sys sys_timerfd_gettime 2 |
649 | sys sys_timerfd_settime 4 | 649 | sys sys_timerfd_settime 4 |
650 | sys sys_signalfd4 4 | ||
651 | sys sys_eventfd2 2 /* 4325 */ | ||
652 | sys sys_epoll_create1 1 | ||
653 | sys sys_dup3 3 | ||
654 | sys sys_pipe2 2 | ||
655 | sys sys_inotify_init1 1 | ||
650 | .endm | 656 | .endm |
651 | 657 | ||
652 | /* We pre-compute the number of _instruction_ bytes needed to | 658 | /* We pre-compute the number of _instruction_ bytes needed to |
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 2b73fd1e4528..3d58204c9d44 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S | |||
@@ -481,4 +481,10 @@ sys_call_table: | |||
481 | PTR sys_timerfd_create /* 5280 */ | 481 | PTR sys_timerfd_create /* 5280 */ |
482 | PTR sys_timerfd_gettime | 482 | PTR sys_timerfd_gettime |
483 | PTR sys_timerfd_settime | 483 | PTR sys_timerfd_settime |
484 | PTR sys_signalfd4 | ||
485 | PTR sys_eventfd2 | ||
486 | PTR sys_epoll_create1 /* 5285 */ | ||
487 | PTR sys_dup3 | ||
488 | PTR sys_pipe2 | ||
489 | PTR sys_inotify_init1 | ||
484 | .size sys_call_table,.-sys_call_table | 490 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 2654e75d2fef..da7f1b6ea0fb 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
@@ -407,4 +407,10 @@ EXPORT(sysn32_call_table) | |||
407 | PTR sys_timerfd_create | 407 | PTR sys_timerfd_create |
408 | PTR sys_timerfd_gettime /* 5285 */ | 408 | PTR sys_timerfd_gettime /* 5285 */ |
409 | PTR sys_timerfd_settime | 409 | PTR sys_timerfd_settime |
410 | PTR sys_signalfd4 | ||
411 | PTR sys_eventfd2 | ||
412 | PTR sys_epoll_create1 | ||
413 | PTR sys_dup3 /* 5290 */ | ||
414 | PTR sys_pipe2 | ||
415 | PTR sys_inotify_init1 | ||
410 | .size sysn32_call_table,.-sysn32_call_table | 416 | .size sysn32_call_table,.-sysn32_call_table |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index 76167bea5a70..d7cd1aac9ada 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
@@ -529,4 +529,10 @@ sys_call_table: | |||
529 | PTR sys_timerfd_create | 529 | PTR sys_timerfd_create |
530 | PTR sys_timerfd_gettime | 530 | PTR sys_timerfd_gettime |
531 | PTR sys_timerfd_settime | 531 | PTR sys_timerfd_settime |
532 | PTR compat_sys_signalfd4 | ||
533 | PTR sys_eventfd2 /* 4325 */ | ||
534 | PTR sys_epoll_create1 | ||
535 | PTR sys_dup3 | ||
536 | PTR sys_pipe2 | ||
537 | PTR sys_inotify_init1 | ||
532 | .size sys_call_table,.-sys_call_table | 538 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 8af84867e74d..16f8edfe5cdc 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
@@ -78,7 +78,7 @@ void __init add_memory_region(phys_t start, phys_t size, long type) | |||
78 | 78 | ||
79 | /* Sanity check */ | 79 | /* Sanity check */ |
80 | if (start + size < start) { | 80 | if (start + size < start) { |
81 | printk("Trying to add an invalid memory region, skipped\n"); | 81 | pr_warning("Trying to add an invalid memory region, skipped\n"); |
82 | return; | 82 | return; |
83 | } | 83 | } |
84 | 84 | ||
@@ -92,7 +92,7 @@ void __init add_memory_region(phys_t start, phys_t size, long type) | |||
92 | } | 92 | } |
93 | 93 | ||
94 | if (x == BOOT_MEM_MAP_MAX) { | 94 | if (x == BOOT_MEM_MAP_MAX) { |
95 | printk("Ooops! Too many entries in the memory map!\n"); | 95 | pr_err("Ooops! Too many entries in the memory map!\n"); |
96 | return; | 96 | return; |
97 | } | 97 | } |
98 | 98 | ||
@@ -108,22 +108,22 @@ static void __init print_memory_map(void) | |||
108 | const int field = 2 * sizeof(unsigned long); | 108 | const int field = 2 * sizeof(unsigned long); |
109 | 109 | ||
110 | for (i = 0; i < boot_mem_map.nr_map; i++) { | 110 | for (i = 0; i < boot_mem_map.nr_map; i++) { |
111 | printk(" memory: %0*Lx @ %0*Lx ", | 111 | printk(KERN_INFO " memory: %0*Lx @ %0*Lx ", |
112 | field, (unsigned long long) boot_mem_map.map[i].size, | 112 | field, (unsigned long long) boot_mem_map.map[i].size, |
113 | field, (unsigned long long) boot_mem_map.map[i].addr); | 113 | field, (unsigned long long) boot_mem_map.map[i].addr); |
114 | 114 | ||
115 | switch (boot_mem_map.map[i].type) { | 115 | switch (boot_mem_map.map[i].type) { |
116 | case BOOT_MEM_RAM: | 116 | case BOOT_MEM_RAM: |
117 | printk("(usable)\n"); | 117 | printk(KERN_CONT "(usable)\n"); |
118 | break; | 118 | break; |
119 | case BOOT_MEM_ROM_DATA: | 119 | case BOOT_MEM_ROM_DATA: |
120 | printk("(ROM data)\n"); | 120 | printk(KERN_CONT "(ROM data)\n"); |
121 | break; | 121 | break; |
122 | case BOOT_MEM_RESERVED: | 122 | case BOOT_MEM_RESERVED: |
123 | printk("(reserved)\n"); | 123 | printk(KERN_CONT "(reserved)\n"); |
124 | break; | 124 | break; |
125 | default: | 125 | default: |
126 | printk("type %lu\n", boot_mem_map.map[i].type); | 126 | printk(KERN_CONT "type %lu\n", boot_mem_map.map[i].type); |
127 | break; | 127 | break; |
128 | } | 128 | } |
129 | } | 129 | } |
@@ -160,36 +160,39 @@ early_param("rd_size", rd_size_early); | |||
160 | static unsigned long __init init_initrd(void) | 160 | static unsigned long __init init_initrd(void) |
161 | { | 161 | { |
162 | unsigned long end; | 162 | unsigned long end; |
163 | u32 *initrd_header; | ||
164 | 163 | ||
165 | /* | 164 | /* |
166 | * Board specific code or command line parser should have | 165 | * Board specific code or command line parser should have |
167 | * already set up initrd_start and initrd_end. In these cases | 166 | * already set up initrd_start and initrd_end. In these cases |
168 | * perfom sanity checks and use them if all looks good. | 167 | * perfom sanity checks and use them if all looks good. |
169 | */ | 168 | */ |
170 | if (initrd_start && initrd_end > initrd_start) | 169 | if (!initrd_start || initrd_end <= initrd_start) { |
171 | goto sanitize; | 170 | #ifdef CONFIG_PROBE_INITRD_HEADER |
171 | u32 *initrd_header; | ||
172 | 172 | ||
173 | /* | 173 | /* |
174 | * See if initrd has been added to the kernel image by | 174 | * See if initrd has been added to the kernel image by |
175 | * arch/mips/boot/addinitrd.c. In that case a header is | 175 | * arch/mips/boot/addinitrd.c. In that case a header is |
176 | * prepended to initrd and is made up by 8 bytes. The fisrt | 176 | * prepended to initrd and is made up by 8 bytes. The first |
177 | * word is a magic number and the second one is the size of | 177 | * word is a magic number and the second one is the size of |
178 | * initrd. Initrd start must be page aligned in any cases. | 178 | * initrd. Initrd start must be page aligned in any cases. |
179 | */ | 179 | */ |
180 | initrd_header = __va(PAGE_ALIGN(__pa_symbol(&_end) + 8)) - 8; | 180 | initrd_header = __va(PAGE_ALIGN(__pa_symbol(&_end) + 8)) - 8; |
181 | if (initrd_header[0] != 0x494E5244) | 181 | if (initrd_header[0] != 0x494E5244) |
182 | goto disable; | ||
183 | initrd_start = (unsigned long)(initrd_header + 2); | ||
184 | initrd_end = initrd_start + initrd_header[1]; | ||
185 | #else | ||
182 | goto disable; | 186 | goto disable; |
183 | initrd_start = (unsigned long)(initrd_header + 2); | 187 | #endif |
184 | initrd_end = initrd_start + initrd_header[1]; | 188 | } |
185 | 189 | ||
186 | sanitize: | ||
187 | if (initrd_start & ~PAGE_MASK) { | 190 | if (initrd_start & ~PAGE_MASK) { |
188 | printk(KERN_ERR "initrd start must be page aligned\n"); | 191 | pr_err("initrd start must be page aligned\n"); |
189 | goto disable; | 192 | goto disable; |
190 | } | 193 | } |
191 | if (initrd_start < PAGE_OFFSET) { | 194 | if (initrd_start < PAGE_OFFSET) { |
192 | printk(KERN_ERR "initrd start < PAGE_OFFSET\n"); | 195 | pr_err("initrd start < PAGE_OFFSET\n"); |
193 | goto disable; | 196 | goto disable; |
194 | } | 197 | } |
195 | 198 | ||
@@ -221,18 +224,18 @@ static void __init finalize_initrd(void) | |||
221 | goto disable; | 224 | goto disable; |
222 | } | 225 | } |
223 | if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { | 226 | if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { |
224 | printk("Initrd extends beyond end of memory"); | 227 | printk(KERN_ERR "Initrd extends beyond end of memory"); |
225 | goto disable; | 228 | goto disable; |
226 | } | 229 | } |
227 | 230 | ||
228 | reserve_bootmem(__pa(initrd_start), size, BOOTMEM_DEFAULT); | 231 | reserve_bootmem(__pa(initrd_start), size, BOOTMEM_DEFAULT); |
229 | initrd_below_start_ok = 1; | 232 | initrd_below_start_ok = 1; |
230 | 233 | ||
231 | printk(KERN_INFO "Initial ramdisk at: 0x%lx (%lu bytes)\n", | 234 | pr_info("Initial ramdisk at: 0x%lx (%lu bytes)\n", |
232 | initrd_start, size); | 235 | initrd_start, size); |
233 | return; | 236 | return; |
234 | disable: | 237 | disable: |
235 | printk(" - disabling initrd\n"); | 238 | printk(KERN_CONT " - disabling initrd\n"); |
236 | initrd_start = 0; | 239 | initrd_start = 0; |
237 | initrd_end = 0; | 240 | initrd_end = 0; |
238 | } | 241 | } |
@@ -310,14 +313,12 @@ static void __init bootmem_init(void) | |||
310 | if (min_low_pfn >= max_low_pfn) | 313 | if (min_low_pfn >= max_low_pfn) |
311 | panic("Incorrect memory mapping !!!"); | 314 | panic("Incorrect memory mapping !!!"); |
312 | if (min_low_pfn > ARCH_PFN_OFFSET) { | 315 | if (min_low_pfn > ARCH_PFN_OFFSET) { |
313 | printk(KERN_INFO | 316 | pr_info("Wasting %lu bytes for tracking %lu unused pages\n", |
314 | "Wasting %lu bytes for tracking %lu unused pages\n", | 317 | (min_low_pfn - ARCH_PFN_OFFSET) * sizeof(struct page), |
315 | (min_low_pfn - ARCH_PFN_OFFSET) * sizeof(struct page), | 318 | min_low_pfn - ARCH_PFN_OFFSET); |
316 | min_low_pfn - ARCH_PFN_OFFSET); | ||
317 | } else if (min_low_pfn < ARCH_PFN_OFFSET) { | 319 | } else if (min_low_pfn < ARCH_PFN_OFFSET) { |
318 | printk(KERN_INFO | 320 | pr_info("%lu free pages won't be used\n", |
319 | "%lu free pages won't be used\n", | 321 | ARCH_PFN_OFFSET - min_low_pfn); |
320 | ARCH_PFN_OFFSET - min_low_pfn); | ||
321 | } | 322 | } |
322 | min_low_pfn = ARCH_PFN_OFFSET; | 323 | min_low_pfn = ARCH_PFN_OFFSET; |
323 | 324 | ||
@@ -471,7 +472,7 @@ static void __init arch_mem_init(char **cmdline_p) | |||
471 | /* call board setup routine */ | 472 | /* call board setup routine */ |
472 | plat_mem_setup(); | 473 | plat_mem_setup(); |
473 | 474 | ||
474 | printk("Determined physical RAM map:\n"); | 475 | pr_info("Determined physical RAM map:\n"); |
475 | print_memory_map(); | 476 | print_memory_map(); |
476 | 477 | ||
477 | strlcpy(command_line, arcs_cmdline, sizeof(command_line)); | 478 | strlcpy(command_line, arcs_cmdline, sizeof(command_line)); |
@@ -482,7 +483,7 @@ static void __init arch_mem_init(char **cmdline_p) | |||
482 | parse_early_param(); | 483 | parse_early_param(); |
483 | 484 | ||
484 | if (usermem) { | 485 | if (usermem) { |
485 | printk("User-defined physical RAM map:\n"); | 486 | pr_info("User-defined physical RAM map:\n"); |
486 | print_memory_map(); | 487 | print_memory_map(); |
487 | } | 488 | } |
488 | 489 | ||
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 426cced1e9dc..5fd0cd020af5 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -46,6 +46,9 @@ | |||
46 | #include <asm/types.h> | 46 | #include <asm/types.h> |
47 | #include <asm/stacktrace.h> | 47 | #include <asm/stacktrace.h> |
48 | 48 | ||
49 | extern void check_wait(void); | ||
50 | extern asmlinkage void r4k_wait(void); | ||
51 | extern asmlinkage void rollback_handle_int(void); | ||
49 | extern asmlinkage void handle_int(void); | 52 | extern asmlinkage void handle_int(void); |
50 | extern asmlinkage void handle_tlbm(void); | 53 | extern asmlinkage void handle_tlbm(void); |
51 | extern asmlinkage void handle_tlbl(void); | 54 | extern asmlinkage void handle_tlbl(void); |
@@ -373,8 +376,8 @@ void __noreturn die(const char * str, const struct pt_regs * regs) | |||
373 | do_exit(SIGSEGV); | 376 | do_exit(SIGSEGV); |
374 | } | 377 | } |
375 | 378 | ||
376 | extern const struct exception_table_entry __start___dbe_table[]; | 379 | extern struct exception_table_entry __start___dbe_table[]; |
377 | extern const struct exception_table_entry __stop___dbe_table[]; | 380 | extern struct exception_table_entry __stop___dbe_table[]; |
378 | 381 | ||
379 | __asm__( | 382 | __asm__( |
380 | " .section __dbe_table, \"a\"\n" | 383 | " .section __dbe_table, \"a\"\n" |
@@ -1200,7 +1203,7 @@ void *set_except_vector(int n, void *addr) | |||
1200 | if (n == 0 && cpu_has_divec) { | 1203 | if (n == 0 && cpu_has_divec) { |
1201 | *(u32 *)(ebase + 0x200) = 0x08000000 | | 1204 | *(u32 *)(ebase + 0x200) = 0x08000000 | |
1202 | (0x03ffffff & (handler >> 2)); | 1205 | (0x03ffffff & (handler >> 2)); |
1203 | flush_icache_range(ebase + 0x200, ebase + 0x204); | 1206 | local_flush_icache_range(ebase + 0x200, ebase + 0x204); |
1204 | } | 1207 | } |
1205 | return (void *)old_handler; | 1208 | return (void *)old_handler; |
1206 | } | 1209 | } |
@@ -1251,6 +1254,9 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) | |||
1251 | 1254 | ||
1252 | extern char except_vec_vi, except_vec_vi_lui; | 1255 | extern char except_vec_vi, except_vec_vi_lui; |
1253 | extern char except_vec_vi_ori, except_vec_vi_end; | 1256 | extern char except_vec_vi_ori, except_vec_vi_end; |
1257 | extern char rollback_except_vec_vi; | ||
1258 | char *vec_start = (cpu_wait == r4k_wait) ? | ||
1259 | &rollback_except_vec_vi : &except_vec_vi; | ||
1254 | #ifdef CONFIG_MIPS_MT_SMTC | 1260 | #ifdef CONFIG_MIPS_MT_SMTC |
1255 | /* | 1261 | /* |
1256 | * We need to provide the SMTC vectored interrupt handler | 1262 | * We need to provide the SMTC vectored interrupt handler |
@@ -1258,11 +1264,11 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) | |||
1258 | * Status.IM bit to be masked before going there. | 1264 | * Status.IM bit to be masked before going there. |
1259 | */ | 1265 | */ |
1260 | extern char except_vec_vi_mori; | 1266 | extern char except_vec_vi_mori; |
1261 | const int mori_offset = &except_vec_vi_mori - &except_vec_vi; | 1267 | const int mori_offset = &except_vec_vi_mori - vec_start; |
1262 | #endif /* CONFIG_MIPS_MT_SMTC */ | 1268 | #endif /* CONFIG_MIPS_MT_SMTC */ |
1263 | const int handler_len = &except_vec_vi_end - &except_vec_vi; | 1269 | const int handler_len = &except_vec_vi_end - vec_start; |
1264 | const int lui_offset = &except_vec_vi_lui - &except_vec_vi; | 1270 | const int lui_offset = &except_vec_vi_lui - vec_start; |
1265 | const int ori_offset = &except_vec_vi_ori - &except_vec_vi; | 1271 | const int ori_offset = &except_vec_vi_ori - vec_start; |
1266 | 1272 | ||
1267 | if (handler_len > VECTORSPACING) { | 1273 | if (handler_len > VECTORSPACING) { |
1268 | /* | 1274 | /* |
@@ -1272,7 +1278,7 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) | |||
1272 | panic("VECTORSPACING too small"); | 1278 | panic("VECTORSPACING too small"); |
1273 | } | 1279 | } |
1274 | 1280 | ||
1275 | memcpy(b, &except_vec_vi, handler_len); | 1281 | memcpy(b, vec_start, handler_len); |
1276 | #ifdef CONFIG_MIPS_MT_SMTC | 1282 | #ifdef CONFIG_MIPS_MT_SMTC |
1277 | BUG_ON(n > 7); /* Vector index %d exceeds SMTC maximum. */ | 1283 | BUG_ON(n > 7); /* Vector index %d exceeds SMTC maximum. */ |
1278 | 1284 | ||
@@ -1283,7 +1289,8 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) | |||
1283 | *w = (*w & 0xffff0000) | (((u32)handler >> 16) & 0xffff); | 1289 | *w = (*w & 0xffff0000) | (((u32)handler >> 16) & 0xffff); |
1284 | w = (u32 *)(b + ori_offset); | 1290 | w = (u32 *)(b + ori_offset); |
1285 | *w = (*w & 0xffff0000) | ((u32)handler & 0xffff); | 1291 | *w = (*w & 0xffff0000) | ((u32)handler & 0xffff); |
1286 | flush_icache_range((unsigned long)b, (unsigned long)(b+handler_len)); | 1292 | local_flush_icache_range((unsigned long)b, |
1293 | (unsigned long)(b+handler_len)); | ||
1287 | } | 1294 | } |
1288 | else { | 1295 | else { |
1289 | /* | 1296 | /* |
@@ -1295,7 +1302,8 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) | |||
1295 | w = (u32 *)b; | 1302 | w = (u32 *)b; |
1296 | *w++ = 0x08000000 | (((u32)handler >> 2) & 0x03fffff); /* j handler */ | 1303 | *w++ = 0x08000000 | (((u32)handler >> 2) & 0x03fffff); /* j handler */ |
1297 | *w = 0; | 1304 | *w = 0; |
1298 | flush_icache_range((unsigned long)b, (unsigned long)(b+8)); | 1305 | local_flush_icache_range((unsigned long)b, |
1306 | (unsigned long)(b+8)); | ||
1299 | } | 1307 | } |
1300 | 1308 | ||
1301 | return (void *)old_handler; | 1309 | return (void *)old_handler; |
@@ -1515,7 +1523,7 @@ void __cpuinit per_cpu_trap_init(void) | |||
1515 | void __init set_handler(unsigned long offset, void *addr, unsigned long size) | 1523 | void __init set_handler(unsigned long offset, void *addr, unsigned long size) |
1516 | { | 1524 | { |
1517 | memcpy((void *)(ebase + offset), addr, size); | 1525 | memcpy((void *)(ebase + offset), addr, size); |
1518 | flush_icache_range(ebase + offset, ebase + offset + size); | 1526 | local_flush_icache_range(ebase + offset, ebase + offset + size); |
1519 | } | 1527 | } |
1520 | 1528 | ||
1521 | static char panic_null_cerr[] __cpuinitdata = | 1529 | static char panic_null_cerr[] __cpuinitdata = |
@@ -1552,6 +1560,10 @@ void __init trap_init(void) | |||
1552 | extern char except_vec3_generic, except_vec3_r4000; | 1560 | extern char except_vec3_generic, except_vec3_r4000; |
1553 | extern char except_vec4; | 1561 | extern char except_vec4; |
1554 | unsigned long i; | 1562 | unsigned long i; |
1563 | int rollback; | ||
1564 | |||
1565 | check_wait(); | ||
1566 | rollback = (cpu_wait == r4k_wait); | ||
1555 | 1567 | ||
1556 | #if defined(CONFIG_KGDB) | 1568 | #if defined(CONFIG_KGDB) |
1557 | if (kgdb_early_setup) | 1569 | if (kgdb_early_setup) |
@@ -1616,7 +1628,7 @@ void __init trap_init(void) | |||
1616 | if (board_be_init) | 1628 | if (board_be_init) |
1617 | board_be_init(); | 1629 | board_be_init(); |
1618 | 1630 | ||
1619 | set_except_vector(0, handle_int); | 1631 | set_except_vector(0, rollback ? rollback_handle_int : handle_int); |
1620 | set_except_vector(1, handle_tlbm); | 1632 | set_except_vector(1, handle_tlbm); |
1621 | set_except_vector(2, handle_tlbl); | 1633 | set_except_vector(2, handle_tlbl); |
1622 | set_except_vector(3, handle_tlbs); | 1634 | set_except_vector(3, handle_tlbs); |
@@ -1680,6 +1692,8 @@ void __init trap_init(void) | |||
1680 | signal32_init(); | 1692 | signal32_init(); |
1681 | #endif | 1693 | #endif |
1682 | 1694 | ||
1683 | flush_icache_range(ebase, ebase + 0x400); | 1695 | local_flush_icache_range(ebase, ebase + 0x400); |
1684 | flush_tlb_handlers(); | 1696 | flush_tlb_handlers(); |
1697 | |||
1698 | sort_extable(__start___dbe_table, __stop___dbe_table); | ||
1685 | } | 1699 | } |
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index b5470ceb418b..afb119f35682 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S | |||
@@ -36,6 +36,7 @@ SECTIONS | |||
36 | SCHED_TEXT | 36 | SCHED_TEXT |
37 | LOCK_TEXT | 37 | LOCK_TEXT |
38 | KPROBES_TEXT | 38 | KPROBES_TEXT |
39 | *(.text.*) | ||
39 | *(.fixup) | 40 | *(.fixup) |
40 | *(.gnu.warning) | 41 | *(.gnu.warning) |
41 | } :text = 0 | 42 | } :text = 0 |