diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-08-08 22:59:21 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-08-08 22:59:21 -0400 |
commit | 3fbdc379567aef1c43b4be110179b541d68afdf6 (patch) | |
tree | 9b5b964487bc6a2afd20da2c3b442a3cd82fe917 | |
parent | af0b3152bbfebd3f8291fd61988c12ece4f60f57 (diff) | |
parent | 46011e6ea39235e4aca656673c500eac81a07a17 (diff) |
Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
Pull MIPS fixes from Ralf Baechle:
"Another round of MIPS fixes for 4.2. No area does particularly stand
out but we have a two unpleasant ones:
- Kernel ptes are marked with a global bit which allows the kernel to
share kernel TLB entries between all processes. For this to work
both entries of an adjacent even/odd pte pair need to have the
global bit set. There has been a subtle race in setting the other
entry's global bit since ~ 2000 but it take particularly
pathological workloads that essentially do mostly vmalloc/vfree to
trigger this.
This pull request fixes the 64-bit case but leaves the case of 32
bit CPUs with 64 bit ptes unsolved for now. The unfixed cases
affect hardware that is not available in the field yet.
- Instruction emulation requires loading instructions from user space
but the current fast but simplistic approach will fail on pages
that are PROT_EXEC but !PROT_READ. For this reason we temporarily
do not permit this permission and will map pages with PROT_EXEC |
PROT_READ.
The remainder of this pull request is more or less across the field
and the short log explains them well"
* 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus:
MIPS: Make set_pte() SMP safe.
MIPS: Replace add and sub instructions in relocate_kernel.S with addiu
MIPS: Flush RPS on kernel entry with EVA
Revert "MIPS: BCM63xx: Provide a plat_post_dma_flush hook"
MIPS: BMIPS: Delete unused Kconfig symbol
MIPS: Export get_c0_perfcount_int()
MIPS: show_stack: Fix stack trace with EVA
MIPS: do_mcheck: Fix kernel code dump with EVA
MIPS: SMP: Don't increment irq_count multiple times for call function IPIs
MIPS: Partially disable RIXI support.
MIPS: Handle page faults of executable but unreadable pages correctly.
MIPS: Malta: Don't reinitialise RTC
MIPS: unaligned: Fix build error on big endian R6 kernels
MIPS: Fix sched_getaffinity with MT FPAFF enabled
MIPS: Fix build with CONFIG_OF=y for non OF-enabled targets
CPUFREQ: Loongson2: Fix broken build due to incorrect include.
31 files changed, 130 insertions, 62 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index cee5f93e5712..199a8357838c 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -151,7 +151,6 @@ config BMIPS_GENERIC | |||
151 | select BCM7120_L2_IRQ | 151 | select BCM7120_L2_IRQ |
152 | select BRCMSTB_L2_IRQ | 152 | select BRCMSTB_L2_IRQ |
153 | select IRQ_MIPS_CPU | 153 | select IRQ_MIPS_CPU |
154 | select RAW_IRQ_ACCESSORS | ||
155 | select DMA_NONCOHERENT | 154 | select DMA_NONCOHERENT |
156 | select SYS_SUPPORTS_32BIT_KERNEL | 155 | select SYS_SUPPORTS_32BIT_KERNEL |
157 | select SYS_SUPPORTS_LITTLE_ENDIAN | 156 | select SYS_SUPPORTS_LITTLE_ENDIAN |
diff --git a/arch/mips/ath79/setup.c b/arch/mips/ath79/setup.c index 01a644f174dd..1ba21204ebe0 100644 --- a/arch/mips/ath79/setup.c +++ b/arch/mips/ath79/setup.c | |||
@@ -190,6 +190,7 @@ int get_c0_perfcount_int(void) | |||
190 | { | 190 | { |
191 | return ATH79_MISC_IRQ(5); | 191 | return ATH79_MISC_IRQ(5); |
192 | } | 192 | } |
193 | EXPORT_SYMBOL_GPL(get_c0_perfcount_int); | ||
193 | 194 | ||
194 | unsigned int get_c0_compare_int(void) | 195 | unsigned int get_c0_compare_int(void) |
195 | { | 196 | { |
diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c index 56f5d080ef9d..b7fa9ae28c36 100644 --- a/arch/mips/cavium-octeon/smp.c +++ b/arch/mips/cavium-octeon/smp.c | |||
@@ -42,7 +42,7 @@ static irqreturn_t mailbox_interrupt(int irq, void *dev_id) | |||
42 | cvmx_write_csr(CVMX_CIU_MBOX_CLRX(coreid), action); | 42 | cvmx_write_csr(CVMX_CIU_MBOX_CLRX(coreid), action); |
43 | 43 | ||
44 | if (action & SMP_CALL_FUNCTION) | 44 | if (action & SMP_CALL_FUNCTION) |
45 | smp_call_function_interrupt(); | 45 | generic_smp_call_function_interrupt(); |
46 | if (action & SMP_RESCHEDULE_YOURSELF) | 46 | if (action & SMP_RESCHEDULE_YOURSELF) |
47 | scheduler_ipi(); | 47 | scheduler_ipi(); |
48 | 48 | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/dma-coherence.h b/arch/mips/include/asm/mach-bcm63xx/dma-coherence.h deleted file mode 100644 index 11d3b572b1b3..000000000000 --- a/arch/mips/include/asm/mach-bcm63xx/dma-coherence.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | #ifndef __ASM_MACH_BCM63XX_DMA_COHERENCE_H | ||
2 | #define __ASM_MACH_BCM63XX_DMA_COHERENCE_H | ||
3 | |||
4 | #include <asm/bmips.h> | ||
5 | |||
6 | #define plat_post_dma_flush bmips_post_dma_flush | ||
7 | |||
8 | #include <asm/mach-generic/dma-coherence.h> | ||
9 | |||
10 | #endif /* __ASM_MACH_BCM63XX_DMA_COHERENCE_H */ | ||
diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h index 9d8106758142..ae8569475264 100644 --- a/arch/mips/include/asm/pgtable.h +++ b/arch/mips/include/asm/pgtable.h | |||
@@ -182,8 +182,39 @@ static inline void set_pte(pte_t *ptep, pte_t pteval) | |||
182 | * Make sure the buddy is global too (if it's !none, | 182 | * Make sure the buddy is global too (if it's !none, |
183 | * it better already be global) | 183 | * it better already be global) |
184 | */ | 184 | */ |
185 | #ifdef CONFIG_SMP | ||
186 | /* | ||
187 | * For SMP, multiple CPUs can race, so we need to do | ||
188 | * this atomically. | ||
189 | */ | ||
190 | #ifdef CONFIG_64BIT | ||
191 | #define LL_INSN "lld" | ||
192 | #define SC_INSN "scd" | ||
193 | #else /* CONFIG_32BIT */ | ||
194 | #define LL_INSN "ll" | ||
195 | #define SC_INSN "sc" | ||
196 | #endif | ||
197 | unsigned long page_global = _PAGE_GLOBAL; | ||
198 | unsigned long tmp; | ||
199 | |||
200 | __asm__ __volatile__ ( | ||
201 | " .set push\n" | ||
202 | " .set noreorder\n" | ||
203 | "1: " LL_INSN " %[tmp], %[buddy]\n" | ||
204 | " bnez %[tmp], 2f\n" | ||
205 | " or %[tmp], %[tmp], %[global]\n" | ||
206 | " " SC_INSN " %[tmp], %[buddy]\n" | ||
207 | " beqz %[tmp], 1b\n" | ||
208 | " nop\n" | ||
209 | "2:\n" | ||
210 | " .set pop" | ||
211 | : [buddy] "+m" (buddy->pte), | ||
212 | [tmp] "=&r" (tmp) | ||
213 | : [global] "r" (page_global)); | ||
214 | #else /* !CONFIG_SMP */ | ||
185 | if (pte_none(*buddy)) | 215 | if (pte_none(*buddy)) |
186 | pte_val(*buddy) = pte_val(*buddy) | _PAGE_GLOBAL; | 216 | pte_val(*buddy) = pte_val(*buddy) | _PAGE_GLOBAL; |
217 | #endif /* CONFIG_SMP */ | ||
187 | } | 218 | } |
188 | #endif | 219 | #endif |
189 | } | 220 | } |
diff --git a/arch/mips/include/asm/smp.h b/arch/mips/include/asm/smp.h index 16f1ea9ab191..03722d4326a1 100644 --- a/arch/mips/include/asm/smp.h +++ b/arch/mips/include/asm/smp.h | |||
@@ -83,8 +83,6 @@ static inline void __cpu_die(unsigned int cpu) | |||
83 | extern void play_dead(void); | 83 | extern void play_dead(void); |
84 | #endif | 84 | #endif |
85 | 85 | ||
86 | extern asmlinkage void smp_call_function_interrupt(void); | ||
87 | |||
88 | static inline void arch_send_call_function_single_ipi(int cpu) | 86 | static inline void arch_send_call_function_single_ipi(int cpu) |
89 | { | 87 | { |
90 | extern struct plat_smp_ops *mp_ops; /* private */ | 88 | extern struct plat_smp_ops *mp_ops; /* private */ |
diff --git a/arch/mips/include/asm/stackframe.h b/arch/mips/include/asm/stackframe.h index 28d6d9364bd1..a71da576883c 100644 --- a/arch/mips/include/asm/stackframe.h +++ b/arch/mips/include/asm/stackframe.h | |||
@@ -152,6 +152,31 @@ | |||
152 | .set noreorder | 152 | .set noreorder |
153 | bltz k0, 8f | 153 | bltz k0, 8f |
154 | move k1, sp | 154 | move k1, sp |
155 | #ifdef CONFIG_EVA | ||
156 | /* | ||
157 | * Flush interAptiv's Return Prediction Stack (RPS) by writing | ||
158 | * EntryHi. Toggling Config7.RPS is slower and less portable. | ||
159 | * | ||
160 | * The RPS isn't automatically flushed when exceptions are | ||
161 | * taken, which can result in kernel mode speculative accesses | ||
162 | * to user addresses if the RPS mispredicts. That's harmless | ||
163 | * when user and kernel share the same address space, but with | ||
164 | * EVA the same user segments may be unmapped to kernel mode, | ||
165 | * even containing sensitive MMIO regions or invalid memory. | ||
166 | * | ||
167 | * This can happen when the kernel sets the return address to | ||
168 | * ret_from_* and jr's to the exception handler, which looks | ||
169 | * more like a tail call than a function call. If nested calls | ||
170 | * don't evict the last user address in the RPS, it will | ||
171 | * mispredict the return and fetch from a user controlled | ||
172 | * address into the icache. | ||
173 | * | ||
174 | * More recent EVA-capable cores with MAAR to restrict | ||
175 | * speculative accesses aren't affected. | ||
176 | */ | ||
177 | MFC0 k0, CP0_ENTRYHI | ||
178 | MTC0 k0, CP0_ENTRYHI | ||
179 | #endif | ||
155 | .set reorder | 180 | .set reorder |
156 | /* Called from user mode, new stack. */ | 181 | /* Called from user mode, new stack. */ |
157 | get_saved_sp | 182 | get_saved_sp |
diff --git a/arch/mips/kernel/mips-mt-fpaff.c b/arch/mips/kernel/mips-mt-fpaff.c index 3e4491aa6d6b..789d7bf4fef3 100644 --- a/arch/mips/kernel/mips-mt-fpaff.c +++ b/arch/mips/kernel/mips-mt-fpaff.c | |||
@@ -154,7 +154,7 @@ asmlinkage long mipsmt_sys_sched_getaffinity(pid_t pid, unsigned int len, | |||
154 | unsigned long __user *user_mask_ptr) | 154 | unsigned long __user *user_mask_ptr) |
155 | { | 155 | { |
156 | unsigned int real_len; | 156 | unsigned int real_len; |
157 | cpumask_t mask; | 157 | cpumask_t allowed, mask; |
158 | int retval; | 158 | int retval; |
159 | struct task_struct *p; | 159 | struct task_struct *p; |
160 | 160 | ||
@@ -173,7 +173,8 @@ asmlinkage long mipsmt_sys_sched_getaffinity(pid_t pid, unsigned int len, | |||
173 | if (retval) | 173 | if (retval) |
174 | goto out_unlock; | 174 | goto out_unlock; |
175 | 175 | ||
176 | cpumask_and(&mask, &p->thread.user_cpus_allowed, cpu_possible_mask); | 176 | cpumask_or(&allowed, &p->thread.user_cpus_allowed, &p->cpus_allowed); |
177 | cpumask_and(&mask, &allowed, cpu_active_mask); | ||
177 | 178 | ||
178 | out_unlock: | 179 | out_unlock: |
179 | read_unlock(&tasklist_lock); | 180 | read_unlock(&tasklist_lock); |
diff --git a/arch/mips/kernel/prom.c b/arch/mips/kernel/prom.c index b130033838ba..5fcec3032f38 100644 --- a/arch/mips/kernel/prom.c +++ b/arch/mips/kernel/prom.c | |||
@@ -38,7 +38,7 @@ char *mips_get_machine_name(void) | |||
38 | return mips_machine_name; | 38 | return mips_machine_name; |
39 | } | 39 | } |
40 | 40 | ||
41 | #ifdef CONFIG_OF | 41 | #ifdef CONFIG_USE_OF |
42 | void __init early_init_dt_add_memory_arch(u64 base, u64 size) | 42 | void __init early_init_dt_add_memory_arch(u64 base, u64 size) |
43 | { | 43 | { |
44 | return add_memory_region(base, size, BOOT_MEM_RAM); | 44 | return add_memory_region(base, size, BOOT_MEM_RAM); |
diff --git a/arch/mips/kernel/relocate_kernel.S b/arch/mips/kernel/relocate_kernel.S index 74bab9ddd0e1..c6bbf2165051 100644 --- a/arch/mips/kernel/relocate_kernel.S +++ b/arch/mips/kernel/relocate_kernel.S | |||
@@ -24,7 +24,7 @@ LEAF(relocate_new_kernel) | |||
24 | 24 | ||
25 | process_entry: | 25 | process_entry: |
26 | PTR_L s2, (s0) | 26 | PTR_L s2, (s0) |
27 | PTR_ADD s0, s0, SZREG | 27 | PTR_ADDIU s0, s0, SZREG |
28 | 28 | ||
29 | /* | 29 | /* |
30 | * In case of a kdump/crash kernel, the indirection page is not | 30 | * In case of a kdump/crash kernel, the indirection page is not |
@@ -61,9 +61,9 @@ copy_word: | |||
61 | /* copy page word by word */ | 61 | /* copy page word by word */ |
62 | REG_L s5, (s2) | 62 | REG_L s5, (s2) |
63 | REG_S s5, (s4) | 63 | REG_S s5, (s4) |
64 | PTR_ADD s4, s4, SZREG | 64 | PTR_ADDIU s4, s4, SZREG |
65 | PTR_ADD s2, s2, SZREG | 65 | PTR_ADDIU s2, s2, SZREG |
66 | LONG_SUB s6, s6, 1 | 66 | LONG_ADDIU s6, s6, -1 |
67 | beq s6, zero, process_entry | 67 | beq s6, zero, process_entry |
68 | b copy_word | 68 | b copy_word |
69 | b process_entry | 69 | b process_entry |
diff --git a/arch/mips/kernel/smp-bmips.c b/arch/mips/kernel/smp-bmips.c index 336708ae5c5b..78cf8c2f1de0 100644 --- a/arch/mips/kernel/smp-bmips.c +++ b/arch/mips/kernel/smp-bmips.c | |||
@@ -284,7 +284,7 @@ static irqreturn_t bmips5000_ipi_interrupt(int irq, void *dev_id) | |||
284 | if (action == 0) | 284 | if (action == 0) |
285 | scheduler_ipi(); | 285 | scheduler_ipi(); |
286 | else | 286 | else |
287 | smp_call_function_interrupt(); | 287 | generic_smp_call_function_interrupt(); |
288 | 288 | ||
289 | return IRQ_HANDLED; | 289 | return IRQ_HANDLED; |
290 | } | 290 | } |
@@ -336,7 +336,7 @@ static irqreturn_t bmips43xx_ipi_interrupt(int irq, void *dev_id) | |||
336 | if (action & SMP_RESCHEDULE_YOURSELF) | 336 | if (action & SMP_RESCHEDULE_YOURSELF) |
337 | scheduler_ipi(); | 337 | scheduler_ipi(); |
338 | if (action & SMP_CALL_FUNCTION) | 338 | if (action & SMP_CALL_FUNCTION) |
339 | smp_call_function_interrupt(); | 339 | generic_smp_call_function_interrupt(); |
340 | 340 | ||
341 | return IRQ_HANDLED; | 341 | return IRQ_HANDLED; |
342 | } | 342 | } |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index d0744cc77ea7..a31896c33716 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
@@ -192,16 +192,6 @@ asmlinkage void start_secondary(void) | |||
192 | cpu_startup_entry(CPUHP_ONLINE); | 192 | cpu_startup_entry(CPUHP_ONLINE); |
193 | } | 193 | } |
194 | 194 | ||
195 | /* | ||
196 | * Call into both interrupt handlers, as we share the IPI for them | ||
197 | */ | ||
198 | void __irq_entry smp_call_function_interrupt(void) | ||
199 | { | ||
200 | irq_enter(); | ||
201 | generic_smp_call_function_interrupt(); | ||
202 | irq_exit(); | ||
203 | } | ||
204 | |||
205 | static void stop_this_cpu(void *dummy) | 195 | static void stop_this_cpu(void *dummy) |
206 | { | 196 | { |
207 | /* | 197 | /* |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index e207a43b5f8f..8ea28e6ab37d 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -192,6 +192,7 @@ static void show_stacktrace(struct task_struct *task, | |||
192 | void show_stack(struct task_struct *task, unsigned long *sp) | 192 | void show_stack(struct task_struct *task, unsigned long *sp) |
193 | { | 193 | { |
194 | struct pt_regs regs; | 194 | struct pt_regs regs; |
195 | mm_segment_t old_fs = get_fs(); | ||
195 | if (sp) { | 196 | if (sp) { |
196 | regs.regs[29] = (unsigned long)sp; | 197 | regs.regs[29] = (unsigned long)sp; |
197 | regs.regs[31] = 0; | 198 | regs.regs[31] = 0; |
@@ -210,7 +211,13 @@ void show_stack(struct task_struct *task, unsigned long *sp) | |||
210 | prepare_frametrace(®s); | 211 | prepare_frametrace(®s); |
211 | } | 212 | } |
212 | } | 213 | } |
214 | /* | ||
215 | * show_stack() deals exclusively with kernel mode, so be sure to access | ||
216 | * the stack in the kernel (not user) address space. | ||
217 | */ | ||
218 | set_fs(KERNEL_DS); | ||
213 | show_stacktrace(task, ®s); | 219 | show_stacktrace(task, ®s); |
220 | set_fs(old_fs); | ||
214 | } | 221 | } |
215 | 222 | ||
216 | static void show_code(unsigned int __user *pc) | 223 | static void show_code(unsigned int __user *pc) |
@@ -1519,6 +1526,7 @@ asmlinkage void do_mcheck(struct pt_regs *regs) | |||
1519 | const int field = 2 * sizeof(unsigned long); | 1526 | const int field = 2 * sizeof(unsigned long); |
1520 | int multi_match = regs->cp0_status & ST0_TS; | 1527 | int multi_match = regs->cp0_status & ST0_TS; |
1521 | enum ctx_state prev_state; | 1528 | enum ctx_state prev_state; |
1529 | mm_segment_t old_fs = get_fs(); | ||
1522 | 1530 | ||
1523 | prev_state = exception_enter(); | 1531 | prev_state = exception_enter(); |
1524 | show_regs(regs); | 1532 | show_regs(regs); |
@@ -1540,8 +1548,13 @@ asmlinkage void do_mcheck(struct pt_regs *regs) | |||
1540 | dump_tlb_all(); | 1548 | dump_tlb_all(); |
1541 | } | 1549 | } |
1542 | 1550 | ||
1551 | if (!user_mode(regs)) | ||
1552 | set_fs(KERNEL_DS); | ||
1553 | |||
1543 | show_code((unsigned int __user *) regs->cp0_epc); | 1554 | show_code((unsigned int __user *) regs->cp0_epc); |
1544 | 1555 | ||
1556 | set_fs(old_fs); | ||
1557 | |||
1545 | /* | 1558 | /* |
1546 | * Some chips may have other causes of machine check (e.g. SB1 | 1559 | * Some chips may have other causes of machine check (e.g. SB1 |
1547 | * graduation timer) | 1560 | * graduation timer) |
diff --git a/arch/mips/kernel/unaligned.c b/arch/mips/kernel/unaligned.c index af84bef0c90d..eb3efd137fd1 100644 --- a/arch/mips/kernel/unaligned.c +++ b/arch/mips/kernel/unaligned.c | |||
@@ -438,7 +438,7 @@ do { \ | |||
438 | : "memory"); \ | 438 | : "memory"); \ |
439 | } while(0) | 439 | } while(0) |
440 | 440 | ||
441 | #define StoreDW(addr, value, res) \ | 441 | #define _StoreDW(addr, value, res) \ |
442 | do { \ | 442 | do { \ |
443 | __asm__ __volatile__ ( \ | 443 | __asm__ __volatile__ ( \ |
444 | ".set\tpush\n\t" \ | 444 | ".set\tpush\n\t" \ |
diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c index 6ab10573490d..2c218c3bbca5 100644 --- a/arch/mips/lantiq/irq.c +++ b/arch/mips/lantiq/irq.c | |||
@@ -293,7 +293,7 @@ static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id) | |||
293 | 293 | ||
294 | static irqreturn_t ipi_call_interrupt(int irq, void *dev_id) | 294 | static irqreturn_t ipi_call_interrupt(int irq, void *dev_id) |
295 | { | 295 | { |
296 | smp_call_function_interrupt(); | 296 | generic_smp_call_function_interrupt(); |
297 | return IRQ_HANDLED; | 297 | return IRQ_HANDLED; |
298 | } | 298 | } |
299 | 299 | ||
@@ -466,6 +466,7 @@ int get_c0_perfcount_int(void) | |||
466 | { | 466 | { |
467 | return ltq_perfcount_irq; | 467 | return ltq_perfcount_irq; |
468 | } | 468 | } |
469 | EXPORT_SYMBOL_GPL(get_c0_perfcount_int); | ||
469 | 470 | ||
470 | unsigned int get_c0_compare_int(void) | 471 | unsigned int get_c0_compare_int(void) |
471 | { | 472 | { |
diff --git a/arch/mips/loongson64/loongson-3/smp.c b/arch/mips/loongson64/loongson-3/smp.c index 509877c6e9d9..1a4738a8f2d3 100644 --- a/arch/mips/loongson64/loongson-3/smp.c +++ b/arch/mips/loongson64/loongson-3/smp.c | |||
@@ -266,8 +266,11 @@ void loongson3_ipi_interrupt(struct pt_regs *regs) | |||
266 | if (action & SMP_RESCHEDULE_YOURSELF) | 266 | if (action & SMP_RESCHEDULE_YOURSELF) |
267 | scheduler_ipi(); | 267 | scheduler_ipi(); |
268 | 268 | ||
269 | if (action & SMP_CALL_FUNCTION) | 269 | if (action & SMP_CALL_FUNCTION) { |
270 | smp_call_function_interrupt(); | 270 | irq_enter(); |
271 | generic_smp_call_function_interrupt(); | ||
272 | irq_exit(); | ||
273 | } | ||
271 | 274 | ||
272 | if (action & SMP_ASK_C0COUNT) { | 275 | if (action & SMP_ASK_C0COUNT) { |
273 | BUG_ON(cpu != 0); | 276 | BUG_ON(cpu != 0); |
diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c index 77d96db8253c..aab218c36e0d 100644 --- a/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c | |||
@@ -160,18 +160,18 @@ static inline void setup_protection_map(void) | |||
160 | protection_map[1] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC); | 160 | protection_map[1] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC); |
161 | protection_map[2] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ); | 161 | protection_map[2] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ); |
162 | protection_map[3] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC); | 162 | protection_map[3] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC); |
163 | protection_map[4] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_READ); | 163 | protection_map[4] = __pgprot(_page_cachable_default | _PAGE_PRESENT); |
164 | protection_map[5] = __pgprot(_page_cachable_default | _PAGE_PRESENT); | 164 | protection_map[5] = __pgprot(_page_cachable_default | _PAGE_PRESENT); |
165 | protection_map[6] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_READ); | 165 | protection_map[6] = __pgprot(_page_cachable_default | _PAGE_PRESENT); |
166 | protection_map[7] = __pgprot(_page_cachable_default | _PAGE_PRESENT); | 166 | protection_map[7] = __pgprot(_page_cachable_default | _PAGE_PRESENT); |
167 | 167 | ||
168 | protection_map[8] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ); | 168 | protection_map[8] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ); |
169 | protection_map[9] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC); | 169 | protection_map[9] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC); |
170 | protection_map[10] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE | _PAGE_NO_READ); | 170 | protection_map[10] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE | _PAGE_NO_READ); |
171 | protection_map[11] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE); | 171 | protection_map[11] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE); |
172 | protection_map[12] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_READ); | 172 | protection_map[12] = __pgprot(_page_cachable_default | _PAGE_PRESENT); |
173 | protection_map[13] = __pgprot(_page_cachable_default | _PAGE_PRESENT); | 173 | protection_map[13] = __pgprot(_page_cachable_default | _PAGE_PRESENT); |
174 | protection_map[14] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_WRITE | _PAGE_NO_READ); | 174 | protection_map[14] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_WRITE); |
175 | protection_map[15] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_WRITE); | 175 | protection_map[15] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_WRITE); |
176 | 176 | ||
177 | } else { | 177 | } else { |
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c index 36c0f26fac6b..852a41c6da45 100644 --- a/arch/mips/mm/fault.c +++ b/arch/mips/mm/fault.c | |||
@@ -133,7 +133,8 @@ good_area: | |||
133 | #endif | 133 | #endif |
134 | goto bad_area; | 134 | goto bad_area; |
135 | } | 135 | } |
136 | if (!(vma->vm_flags & VM_READ)) { | 136 | if (!(vma->vm_flags & VM_READ) && |
137 | exception_epc(regs) != address) { | ||
137 | #if 0 | 138 | #if 0 |
138 | pr_notice("Cpu%d[%s:%d:%0*lx:%ld:%0*lx] RI violation\n", | 139 | pr_notice("Cpu%d[%s:%d:%0*lx:%ld:%0*lx] RI violation\n", |
139 | raw_smp_processor_id(), | 140 | raw_smp_processor_id(), |
diff --git a/arch/mips/mti-malta/malta-int.c b/arch/mips/mti-malta/malta-int.c index d1392f8f5811..fa8f591f3713 100644 --- a/arch/mips/mti-malta/malta-int.c +++ b/arch/mips/mti-malta/malta-int.c | |||
@@ -222,7 +222,7 @@ static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id) | |||
222 | 222 | ||
223 | static irqreturn_t ipi_call_interrupt(int irq, void *dev_id) | 223 | static irqreturn_t ipi_call_interrupt(int irq, void *dev_id) |
224 | { | 224 | { |
225 | smp_call_function_interrupt(); | 225 | generic_smp_call_function_interrupt(); |
226 | 226 | ||
227 | return IRQ_HANDLED; | 227 | return IRQ_HANDLED; |
228 | } | 228 | } |
diff --git a/arch/mips/mti-malta/malta-time.c b/arch/mips/mti-malta/malta-time.c index 5625b190edc0..b7bf721eabf5 100644 --- a/arch/mips/mti-malta/malta-time.c +++ b/arch/mips/mti-malta/malta-time.c | |||
@@ -154,6 +154,7 @@ int get_c0_perfcount_int(void) | |||
154 | 154 | ||
155 | return mips_cpu_perf_irq; | 155 | return mips_cpu_perf_irq; |
156 | } | 156 | } |
157 | EXPORT_SYMBOL_GPL(get_c0_perfcount_int); | ||
157 | 158 | ||
158 | unsigned int get_c0_compare_int(void) | 159 | unsigned int get_c0_compare_int(void) |
159 | { | 160 | { |
@@ -171,14 +172,17 @@ unsigned int get_c0_compare_int(void) | |||
171 | 172 | ||
172 | static void __init init_rtc(void) | 173 | static void __init init_rtc(void) |
173 | { | 174 | { |
174 | /* stop the clock whilst setting it up */ | 175 | unsigned char freq, ctrl; |
175 | CMOS_WRITE(RTC_SET | RTC_24H, RTC_CONTROL); | ||
176 | 176 | ||
177 | /* 32KHz time base */ | 177 | /* Set 32KHz time base if not already set */ |
178 | CMOS_WRITE(RTC_REF_CLCK_32KHZ, RTC_FREQ_SELECT); | 178 | freq = CMOS_READ(RTC_FREQ_SELECT); |
179 | if ((freq & RTC_DIV_CTL) != RTC_REF_CLCK_32KHZ) | ||
180 | CMOS_WRITE(RTC_REF_CLCK_32KHZ, RTC_FREQ_SELECT); | ||
179 | 181 | ||
180 | /* start the clock */ | 182 | /* Ensure SET bit is clear so RTC can run */ |
181 | CMOS_WRITE(RTC_24H, RTC_CONTROL); | 183 | ctrl = CMOS_READ(RTC_CONTROL); |
184 | if (ctrl & RTC_SET) | ||
185 | CMOS_WRITE(ctrl & ~RTC_SET, RTC_CONTROL); | ||
182 | } | 186 | } |
183 | 187 | ||
184 | void __init plat_time_init(void) | 188 | void __init plat_time_init(void) |
diff --git a/arch/mips/mti-sead3/sead3-time.c b/arch/mips/mti-sead3/sead3-time.c index e1d69895fb1d..a120b7a5a8fe 100644 --- a/arch/mips/mti-sead3/sead3-time.c +++ b/arch/mips/mti-sead3/sead3-time.c | |||
@@ -77,6 +77,7 @@ int get_c0_perfcount_int(void) | |||
77 | return MIPS_CPU_IRQ_BASE + cp0_perfcount_irq; | 77 | return MIPS_CPU_IRQ_BASE + cp0_perfcount_irq; |
78 | return -1; | 78 | return -1; |
79 | } | 79 | } |
80 | EXPORT_SYMBOL_GPL(get_c0_perfcount_int); | ||
80 | 81 | ||
81 | unsigned int get_c0_compare_int(void) | 82 | unsigned int get_c0_compare_int(void) |
82 | { | 83 | { |
diff --git a/arch/mips/netlogic/common/smp.c b/arch/mips/netlogic/common/smp.c index dc3e327fbbac..f5fff228b347 100644 --- a/arch/mips/netlogic/common/smp.c +++ b/arch/mips/netlogic/common/smp.c | |||
@@ -86,7 +86,7 @@ void nlm_smp_function_ipi_handler(unsigned int irq, struct irq_desc *desc) | |||
86 | { | 86 | { |
87 | clear_c0_eimr(irq); | 87 | clear_c0_eimr(irq); |
88 | ack_c0_eirr(irq); | 88 | ack_c0_eirr(irq); |
89 | smp_call_function_interrupt(); | 89 | generic_smp_call_function_interrupt(); |
90 | set_c0_eimr(irq); | 90 | set_c0_eimr(irq); |
91 | } | 91 | } |
92 | 92 | ||
diff --git a/arch/mips/paravirt/paravirt-smp.c b/arch/mips/paravirt/paravirt-smp.c index 42181c7105df..f8d3e081b2eb 100644 --- a/arch/mips/paravirt/paravirt-smp.c +++ b/arch/mips/paravirt/paravirt-smp.c | |||
@@ -114,7 +114,7 @@ static irqreturn_t paravirt_reched_interrupt(int irq, void *dev_id) | |||
114 | 114 | ||
115 | static irqreturn_t paravirt_function_interrupt(int irq, void *dev_id) | 115 | static irqreturn_t paravirt_function_interrupt(int irq, void *dev_id) |
116 | { | 116 | { |
117 | smp_call_function_interrupt(); | 117 | generic_smp_call_function_interrupt(); |
118 | return IRQ_HANDLED; | 118 | return IRQ_HANDLED; |
119 | } | 119 | } |
120 | 120 | ||
diff --git a/arch/mips/pistachio/time.c b/arch/mips/pistachio/time.c index 7c73fcb92a10..8a377346f0ca 100644 --- a/arch/mips/pistachio/time.c +++ b/arch/mips/pistachio/time.c | |||
@@ -26,6 +26,7 @@ int get_c0_perfcount_int(void) | |||
26 | { | 26 | { |
27 | return gic_get_c0_perfcount_int(); | 27 | return gic_get_c0_perfcount_int(); |
28 | } | 28 | } |
29 | EXPORT_SYMBOL_GPL(get_c0_perfcount_int); | ||
29 | 30 | ||
30 | int get_c0_fdc_int(void) | 31 | int get_c0_fdc_int(void) |
31 | { | 32 | { |
diff --git a/arch/mips/pmcs-msp71xx/msp_smp.c b/arch/mips/pmcs-msp71xx/msp_smp.c index 10170580a2de..ffa0f7101a97 100644 --- a/arch/mips/pmcs-msp71xx/msp_smp.c +++ b/arch/mips/pmcs-msp71xx/msp_smp.c | |||
@@ -44,7 +44,7 @@ static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id) | |||
44 | 44 | ||
45 | static irqreturn_t ipi_call_interrupt(int irq, void *dev_id) | 45 | static irqreturn_t ipi_call_interrupt(int irq, void *dev_id) |
46 | { | 46 | { |
47 | smp_call_function_interrupt(); | 47 | generic_smp_call_function_interrupt(); |
48 | 48 | ||
49 | return IRQ_HANDLED; | 49 | return IRQ_HANDLED; |
50 | } | 50 | } |
diff --git a/arch/mips/ralink/irq.c b/arch/mips/ralink/irq.c index 53707aacc0f8..8c624a8b9ea2 100644 --- a/arch/mips/ralink/irq.c +++ b/arch/mips/ralink/irq.c | |||
@@ -89,6 +89,7 @@ int get_c0_perfcount_int(void) | |||
89 | { | 89 | { |
90 | return rt_perfcount_irq; | 90 | return rt_perfcount_irq; |
91 | } | 91 | } |
92 | EXPORT_SYMBOL_GPL(get_c0_perfcount_int); | ||
92 | 93 | ||
93 | unsigned int get_c0_compare_int(void) | 94 | unsigned int get_c0_compare_int(void) |
94 | { | 95 | { |
diff --git a/arch/mips/sgi-ip27/ip27-irq.c b/arch/mips/sgi-ip27/ip27-irq.c index 3fbaef97a1b8..16ec4e12daa3 100644 --- a/arch/mips/sgi-ip27/ip27-irq.c +++ b/arch/mips/sgi-ip27/ip27-irq.c | |||
@@ -107,10 +107,14 @@ static void ip27_do_irq_mask0(void) | |||
107 | scheduler_ipi(); | 107 | scheduler_ipi(); |
108 | } else if (pend0 & (1UL << CPU_CALL_A_IRQ)) { | 108 | } else if (pend0 & (1UL << CPU_CALL_A_IRQ)) { |
109 | LOCAL_HUB_CLR_INTR(CPU_CALL_A_IRQ); | 109 | LOCAL_HUB_CLR_INTR(CPU_CALL_A_IRQ); |
110 | smp_call_function_interrupt(); | 110 | irq_enter(); |
111 | generic_smp_call_function_interrupt(); | ||
112 | irq_exit(); | ||
111 | } else if (pend0 & (1UL << CPU_CALL_B_IRQ)) { | 113 | } else if (pend0 & (1UL << CPU_CALL_B_IRQ)) { |
112 | LOCAL_HUB_CLR_INTR(CPU_CALL_B_IRQ); | 114 | LOCAL_HUB_CLR_INTR(CPU_CALL_B_IRQ); |
113 | smp_call_function_interrupt(); | 115 | irq_enter(); |
116 | generic_smp_call_function_interrupt(); | ||
117 | irq_exit(); | ||
114 | } else | 118 | } else |
115 | #endif | 119 | #endif |
116 | { | 120 | { |
diff --git a/arch/mips/sibyte/bcm1480/smp.c b/arch/mips/sibyte/bcm1480/smp.c index af7d44edd9a8..4c71aea25663 100644 --- a/arch/mips/sibyte/bcm1480/smp.c +++ b/arch/mips/sibyte/bcm1480/smp.c | |||
@@ -29,8 +29,6 @@ | |||
29 | #include <asm/sibyte/bcm1480_regs.h> | 29 | #include <asm/sibyte/bcm1480_regs.h> |
30 | #include <asm/sibyte/bcm1480_int.h> | 30 | #include <asm/sibyte/bcm1480_int.h> |
31 | 31 | ||
32 | extern void smp_call_function_interrupt(void); | ||
33 | |||
34 | /* | 32 | /* |
35 | * These are routines for dealing with the bcm1480 smp capabilities | 33 | * These are routines for dealing with the bcm1480 smp capabilities |
36 | * independent of board/firmware | 34 | * independent of board/firmware |
@@ -184,6 +182,9 @@ void bcm1480_mailbox_interrupt(void) | |||
184 | if (action & SMP_RESCHEDULE_YOURSELF) | 182 | if (action & SMP_RESCHEDULE_YOURSELF) |
185 | scheduler_ipi(); | 183 | scheduler_ipi(); |
186 | 184 | ||
187 | if (action & SMP_CALL_FUNCTION) | 185 | if (action & SMP_CALL_FUNCTION) { |
188 | smp_call_function_interrupt(); | 186 | irq_enter(); |
187 | generic_smp_call_function_interrupt(); | ||
188 | irq_exit(); | ||
189 | } | ||
189 | } | 190 | } |
diff --git a/arch/mips/sibyte/sb1250/smp.c b/arch/mips/sibyte/sb1250/smp.c index c0c4b3f88a08..1cf66f5ff23d 100644 --- a/arch/mips/sibyte/sb1250/smp.c +++ b/arch/mips/sibyte/sb1250/smp.c | |||
@@ -172,6 +172,9 @@ void sb1250_mailbox_interrupt(void) | |||
172 | if (action & SMP_RESCHEDULE_YOURSELF) | 172 | if (action & SMP_RESCHEDULE_YOURSELF) |
173 | scheduler_ipi(); | 173 | scheduler_ipi(); |
174 | 174 | ||
175 | if (action & SMP_CALL_FUNCTION) | 175 | if (action & SMP_CALL_FUNCTION) { |
176 | smp_call_function_interrupt(); | 176 | irq_enter(); |
177 | generic_smp_call_function_interrupt(); | ||
178 | irq_exit(); | ||
179 | } | ||
177 | } | 180 | } |
diff --git a/drivers/cpufreq/loongson2_cpufreq.c b/drivers/cpufreq/loongson2_cpufreq.c index e362860c2b50..cd593c1f66dc 100644 --- a/drivers/cpufreq/loongson2_cpufreq.c +++ b/drivers/cpufreq/loongson2_cpufreq.c | |||
@@ -20,7 +20,7 @@ | |||
20 | #include <asm/clock.h> | 20 | #include <asm/clock.h> |
21 | #include <asm/idle.h> | 21 | #include <asm/idle.h> |
22 | 22 | ||
23 | #include <asm/mach-loongson/loongson.h> | 23 | #include <asm/mach-loongson64/loongson.h> |
24 | 24 | ||
25 | static uint nowait; | 25 | static uint nowait; |
26 | 26 | ||
diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c index b7d54d428b5e..ff4be0515a0d 100644 --- a/drivers/irqchip/irq-mips-gic.c +++ b/drivers/irqchip/irq-mips-gic.c | |||
@@ -538,7 +538,7 @@ static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id) | |||
538 | 538 | ||
539 | static irqreturn_t ipi_call_interrupt(int irq, void *dev_id) | 539 | static irqreturn_t ipi_call_interrupt(int irq, void *dev_id) |
540 | { | 540 | { |
541 | smp_call_function_interrupt(); | 541 | generic_smp_call_function_interrupt(); |
542 | 542 | ||
543 | return IRQ_HANDLED; | 543 | return IRQ_HANDLED; |
544 | } | 544 | } |