diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-26 12:36:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-26 12:36:31 -0400 |
commit | 95f4838e21945b9d9718f55afeb7edc8c39858b9 (patch) | |
tree | 1efa4bd9fca0b525664c336da4dd515b7e49ddb4 /arch | |
parent | 088d812fe97a4cc8edaed69f91511ea063b14cef (diff) | |
parent | d96b51ec14650b490ab98e738bcc02309396e5bc (diff) |
Merge branch 'parisc-for-3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux
Pull parisc fixes from Helge Deller:
"This time we made the kernel- and interruption stack allocation
reentrant which fixed some strange kernel crashes (specifically
protection ID traps).
Furthemore this patchset fixes the interrupt stack in UP and SMP
configurations by using native locking instructions. And finally
usage of floating point calculations on parisc were disabled in the
MPILIB."
* 'parisc-for-3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux:
parisc: fix irq stack on UP and SMP
parisc/superio: Use module_pci_driver to register driver
parisc: make interrupt and interruption stack allocation reentrant
parisc: show number of FPE and unaligned access handler calls in /proc/interrupts
parisc: add additional parisc git tree to MAINTAINERS file
parisc: use PAGE_SHIFT instead of hardcoded value 12 in pacache.S
parisc: add rp5470 entry to machine database
MPILIB: disable usage of floating point registers on parisc
Diffstat (limited to 'arch')
-rw-r--r-- | arch/parisc/include/asm/assembly.h | 1 | ||||
-rw-r--r-- | arch/parisc/include/asm/hardirq.h | 7 | ||||
-rw-r--r-- | arch/parisc/include/asm/processor.h | 21 | ||||
-rw-r--r-- | arch/parisc/kernel/entry.S | 19 | ||||
-rw-r--r-- | arch/parisc/kernel/hardware.c | 1 | ||||
-rw-r--r-- | arch/parisc/kernel/irq.c | 49 | ||||
-rw-r--r-- | arch/parisc/kernel/pacache.S | 12 | ||||
-rw-r--r-- | arch/parisc/kernel/traps.c | 1 | ||||
-rw-r--r-- | arch/parisc/kernel/unaligned.c | 3 |
9 files changed, 57 insertions, 57 deletions
diff --git a/arch/parisc/include/asm/assembly.h b/arch/parisc/include/asm/assembly.h index 89fb40005e3f..0da848232344 100644 --- a/arch/parisc/include/asm/assembly.h +++ b/arch/parisc/include/asm/assembly.h | |||
@@ -438,7 +438,6 @@ | |||
438 | SAVE_SP (%sr4, PT_SR4 (\regs)) | 438 | SAVE_SP (%sr4, PT_SR4 (\regs)) |
439 | SAVE_SP (%sr5, PT_SR5 (\regs)) | 439 | SAVE_SP (%sr5, PT_SR5 (\regs)) |
440 | SAVE_SP (%sr6, PT_SR6 (\regs)) | 440 | SAVE_SP (%sr6, PT_SR6 (\regs)) |
441 | SAVE_SP (%sr7, PT_SR7 (\regs)) | ||
442 | 441 | ||
443 | SAVE_CR (%cr17, PT_IASQ0(\regs)) | 442 | SAVE_CR (%cr17, PT_IASQ0(\regs)) |
444 | mtctl %r0, %cr17 | 443 | mtctl %r0, %cr17 |
diff --git a/arch/parisc/include/asm/hardirq.h b/arch/parisc/include/asm/hardirq.h index c19f7138ba48..241c34518465 100644 --- a/arch/parisc/include/asm/hardirq.h +++ b/arch/parisc/include/asm/hardirq.h | |||
@@ -17,17 +17,14 @@ | |||
17 | 17 | ||
18 | typedef struct { | 18 | typedef struct { |
19 | unsigned int __softirq_pending; | 19 | unsigned int __softirq_pending; |
20 | #ifdef CONFIG_DEBUG_STACKOVERFLOW | ||
21 | unsigned int kernel_stack_usage; | 20 | unsigned int kernel_stack_usage; |
22 | #ifdef CONFIG_IRQSTACKS | ||
23 | unsigned int irq_stack_usage; | 21 | unsigned int irq_stack_usage; |
24 | unsigned int irq_stack_counter; | ||
25 | #endif | ||
26 | #endif | ||
27 | #ifdef CONFIG_SMP | 22 | #ifdef CONFIG_SMP |
28 | unsigned int irq_resched_count; | 23 | unsigned int irq_resched_count; |
29 | unsigned int irq_call_count; | 24 | unsigned int irq_call_count; |
30 | #endif | 25 | #endif |
26 | unsigned int irq_unaligned_count; | ||
27 | unsigned int irq_fpassist_count; | ||
31 | unsigned int irq_tlb_count; | 28 | unsigned int irq_tlb_count; |
32 | } ____cacheline_aligned irq_cpustat_t; | 29 | } ____cacheline_aligned irq_cpustat_t; |
33 | 30 | ||
diff --git a/arch/parisc/include/asm/processor.h b/arch/parisc/include/asm/processor.h index cfbc43929cf6..cc2290a3cace 100644 --- a/arch/parisc/include/asm/processor.h +++ b/arch/parisc/include/asm/processor.h | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <asm/ptrace.h> | 17 | #include <asm/ptrace.h> |
18 | #include <asm/types.h> | 18 | #include <asm/types.h> |
19 | #include <asm/percpu.h> | 19 | #include <asm/percpu.h> |
20 | |||
21 | #endif /* __ASSEMBLY__ */ | 20 | #endif /* __ASSEMBLY__ */ |
22 | 21 | ||
23 | /* | 22 | /* |
@@ -59,26 +58,6 @@ | |||
59 | #ifndef __ASSEMBLY__ | 58 | #ifndef __ASSEMBLY__ |
60 | 59 | ||
61 | /* | 60 | /* |
62 | * IRQ STACK - used for irq handler | ||
63 | */ | ||
64 | #ifdef __KERNEL__ | ||
65 | |||
66 | #include <linux/spinlock_types.h> | ||
67 | |||
68 | #define IRQ_STACK_SIZE (4096 << 2) /* 16k irq stack size */ | ||
69 | |||
70 | union irq_stack_union { | ||
71 | unsigned long stack[IRQ_STACK_SIZE/sizeof(unsigned long)]; | ||
72 | raw_spinlock_t lock; | ||
73 | }; | ||
74 | |||
75 | DECLARE_PER_CPU(union irq_stack_union, irq_stack_union); | ||
76 | |||
77 | void call_on_stack(unsigned long p1, void *func, unsigned long new_stack); | ||
78 | |||
79 | #endif /* __KERNEL__ */ | ||
80 | |||
81 | /* | ||
82 | * Data detected about CPUs at boot time which is the same for all CPU's. | 61 | * Data detected about CPUs at boot time which is the same for all CPU's. |
83 | * HP boxes are SMP - ie identical processors. | 62 | * HP boxes are SMP - ie identical processors. |
84 | * | 63 | * |
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index ae27cb6ce19a..e8f07dd28401 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
@@ -65,15 +65,11 @@ | |||
65 | rsm PSW_SM_I, %r0 /* barrier for "Relied upon Translation */ | 65 | rsm PSW_SM_I, %r0 /* barrier for "Relied upon Translation */ |
66 | mtsp %r0, %sr4 | 66 | mtsp %r0, %sr4 |
67 | mtsp %r0, %sr5 | 67 | mtsp %r0, %sr5 |
68 | mfsp %sr7, %r1 | 68 | mtsp %r0, %sr6 |
69 | or,= %r0,%r1,%r0 /* Only save sr7 in sr3 if sr7 != 0 */ | ||
70 | mtsp %r1, %sr3 | ||
71 | tovirt_r1 %r29 | 69 | tovirt_r1 %r29 |
72 | load32 KERNEL_PSW, %r1 | 70 | load32 KERNEL_PSW, %r1 |
73 | 71 | ||
74 | rsm PSW_SM_QUIET,%r0 /* second "heavy weight" ctl op */ | 72 | rsm PSW_SM_QUIET,%r0 /* second "heavy weight" ctl op */ |
75 | mtsp %r0, %sr6 | ||
76 | mtsp %r0, %sr7 | ||
77 | mtctl %r0, %cr17 /* Clear IIASQ tail */ | 73 | mtctl %r0, %cr17 /* Clear IIASQ tail */ |
78 | mtctl %r0, %cr17 /* Clear IIASQ head */ | 74 | mtctl %r0, %cr17 /* Clear IIASQ head */ |
79 | mtctl %r1, %ipsw | 75 | mtctl %r1, %ipsw |
@@ -119,17 +115,20 @@ | |||
119 | 115 | ||
120 | /* we save the registers in the task struct */ | 116 | /* we save the registers in the task struct */ |
121 | 117 | ||
118 | copy %r30, %r17 | ||
122 | mfctl %cr30, %r1 | 119 | mfctl %cr30, %r1 |
120 | ldo THREAD_SZ_ALGN(%r1), %r30 | ||
121 | mtsp %r0,%sr7 | ||
122 | mtsp %r16,%sr3 | ||
123 | tophys %r1,%r9 | 123 | tophys %r1,%r9 |
124 | LDREG TI_TASK(%r9), %r1 /* thread_info -> task_struct */ | 124 | LDREG TI_TASK(%r9), %r1 /* thread_info -> task_struct */ |
125 | tophys %r1,%r9 | 125 | tophys %r1,%r9 |
126 | ldo TASK_REGS(%r9),%r9 | 126 | ldo TASK_REGS(%r9),%r9 |
127 | STREG %r30, PT_GR30(%r9) | 127 | STREG %r17,PT_GR30(%r9) |
128 | STREG %r29,PT_GR29(%r9) | 128 | STREG %r29,PT_GR29(%r9) |
129 | STREG %r26,PT_GR26(%r9) | 129 | STREG %r26,PT_GR26(%r9) |
130 | STREG %r16,PT_SR7(%r9) | ||
130 | copy %r9,%r29 | 131 | copy %r9,%r29 |
131 | mfctl %cr30, %r1 | ||
132 | ldo THREAD_SZ_ALGN(%r1), %r30 | ||
133 | .endm | 132 | .endm |
134 | 133 | ||
135 | .macro get_stack_use_r30 | 134 | .macro get_stack_use_r30 |
@@ -137,10 +136,12 @@ | |||
137 | /* we put a struct pt_regs on the stack and save the registers there */ | 136 | /* we put a struct pt_regs on the stack and save the registers there */ |
138 | 137 | ||
139 | tophys %r30,%r9 | 138 | tophys %r30,%r9 |
140 | STREG %r30,PT_GR30(%r9) | 139 | copy %r30,%r1 |
141 | ldo PT_SZ_ALGN(%r30),%r30 | 140 | ldo PT_SZ_ALGN(%r30),%r30 |
141 | STREG %r1,PT_GR30(%r9) | ||
142 | STREG %r29,PT_GR29(%r9) | 142 | STREG %r29,PT_GR29(%r9) |
143 | STREG %r26,PT_GR26(%r9) | 143 | STREG %r26,PT_GR26(%r9) |
144 | STREG %r16,PT_SR7(%r9) | ||
144 | copy %r9,%r29 | 145 | copy %r9,%r29 |
145 | .endm | 146 | .endm |
146 | 147 | ||
diff --git a/arch/parisc/kernel/hardware.c b/arch/parisc/kernel/hardware.c index f7752f6af29e..9e2d2e408529 100644 --- a/arch/parisc/kernel/hardware.c +++ b/arch/parisc/kernel/hardware.c | |||
@@ -222,6 +222,7 @@ static struct hp_hardware hp_hardware_list[] = { | |||
222 | {HPHW_NPROC,0x5DD,0x4,0x81,"Duet W2"}, | 222 | {HPHW_NPROC,0x5DD,0x4,0x81,"Duet W2"}, |
223 | {HPHW_NPROC,0x5DE,0x4,0x81,"Piccolo W+"}, | 223 | {HPHW_NPROC,0x5DE,0x4,0x81,"Piccolo W+"}, |
224 | {HPHW_NPROC,0x5DF,0x4,0x81,"Cantata W2"}, | 224 | {HPHW_NPROC,0x5DF,0x4,0x81,"Cantata W2"}, |
225 | {HPHW_NPROC,0x5DF,0x0,0x00,"Marcato W+? (rp5470)"}, | ||
225 | {HPHW_NPROC,0x5E0,0x4,0x91,"Cantata DC- W2"}, | 226 | {HPHW_NPROC,0x5E0,0x4,0x91,"Cantata DC- W2"}, |
226 | {HPHW_NPROC,0x5E1,0x4,0x91,"Crescendo DC- W2"}, | 227 | {HPHW_NPROC,0x5E1,0x4,0x91,"Crescendo DC- W2"}, |
227 | {HPHW_NPROC,0x5E2,0x4,0x91,"Crescendo 650 W2"}, | 228 | {HPHW_NPROC,0x5E2,0x4,0x91,"Crescendo 650 W2"}, |
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index 55237a70e197..2e6443b1e922 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
@@ -27,11 +27,11 @@ | |||
27 | #include <linux/interrupt.h> | 27 | #include <linux/interrupt.h> |
28 | #include <linux/kernel_stat.h> | 28 | #include <linux/kernel_stat.h> |
29 | #include <linux/seq_file.h> | 29 | #include <linux/seq_file.h> |
30 | #include <linux/spinlock.h> | ||
31 | #include <linux/types.h> | 30 | #include <linux/types.h> |
32 | #include <asm/io.h> | 31 | #include <asm/io.h> |
33 | 32 | ||
34 | #include <asm/smp.h> | 33 | #include <asm/smp.h> |
34 | #include <asm/ldcw.h> | ||
35 | 35 | ||
36 | #undef PARISC_IRQ_CR16_COUNTS | 36 | #undef PARISC_IRQ_CR16_COUNTS |
37 | 37 | ||
@@ -172,10 +172,6 @@ int arch_show_interrupts(struct seq_file *p, int prec) | |||
172 | for_each_online_cpu(j) | 172 | for_each_online_cpu(j) |
173 | seq_printf(p, "%10u ", irq_stats(j)->irq_stack_usage); | 173 | seq_printf(p, "%10u ", irq_stats(j)->irq_stack_usage); |
174 | seq_puts(p, " Interrupt stack usage\n"); | 174 | seq_puts(p, " Interrupt stack usage\n"); |
175 | seq_printf(p, "%*s: ", prec, "ISC"); | ||
176 | for_each_online_cpu(j) | ||
177 | seq_printf(p, "%10u ", irq_stats(j)->irq_stack_counter); | ||
178 | seq_puts(p, " Interrupt stack usage counter\n"); | ||
179 | # endif | 175 | # endif |
180 | #endif | 176 | #endif |
181 | #ifdef CONFIG_SMP | 177 | #ifdef CONFIG_SMP |
@@ -188,6 +184,14 @@ int arch_show_interrupts(struct seq_file *p, int prec) | |||
188 | seq_printf(p, "%10u ", irq_stats(j)->irq_call_count); | 184 | seq_printf(p, "%10u ", irq_stats(j)->irq_call_count); |
189 | seq_puts(p, " Function call interrupts\n"); | 185 | seq_puts(p, " Function call interrupts\n"); |
190 | #endif | 186 | #endif |
187 | seq_printf(p, "%*s: ", prec, "UAH"); | ||
188 | for_each_online_cpu(j) | ||
189 | seq_printf(p, "%10u ", irq_stats(j)->irq_unaligned_count); | ||
190 | seq_puts(p, " Unaligned access handler traps\n"); | ||
191 | seq_printf(p, "%*s: ", prec, "FPA"); | ||
192 | for_each_online_cpu(j) | ||
193 | seq_printf(p, "%10u ", irq_stats(j)->irq_fpassist_count); | ||
194 | seq_puts(p, " Floating point assist traps\n"); | ||
191 | seq_printf(p, "%*s: ", prec, "TLB"); | 195 | seq_printf(p, "%*s: ", prec, "TLB"); |
192 | for_each_online_cpu(j) | 196 | for_each_online_cpu(j) |
193 | seq_printf(p, "%10u ", irq_stats(j)->irq_tlb_count); | 197 | seq_printf(p, "%10u ", irq_stats(j)->irq_tlb_count); |
@@ -376,6 +380,24 @@ static inline int eirr_to_irq(unsigned long eirr) | |||
376 | return (BITS_PER_LONG - bit) + TIMER_IRQ; | 380 | return (BITS_PER_LONG - bit) + TIMER_IRQ; |
377 | } | 381 | } |
378 | 382 | ||
383 | #ifdef CONFIG_IRQSTACKS | ||
384 | /* | ||
385 | * IRQ STACK - used for irq handler | ||
386 | */ | ||
387 | #define IRQ_STACK_SIZE (4096 << 2) /* 16k irq stack size */ | ||
388 | |||
389 | union irq_stack_union { | ||
390 | unsigned long stack[IRQ_STACK_SIZE/sizeof(unsigned long)]; | ||
391 | volatile unsigned int slock[4]; | ||
392 | volatile unsigned int lock[1]; | ||
393 | }; | ||
394 | |||
395 | DEFINE_PER_CPU(union irq_stack_union, irq_stack_union) = { | ||
396 | .slock = { 1,1,1,1 }, | ||
397 | }; | ||
398 | #endif | ||
399 | |||
400 | |||
379 | int sysctl_panic_on_stackoverflow = 1; | 401 | int sysctl_panic_on_stackoverflow = 1; |
380 | 402 | ||
381 | static inline void stack_overflow_check(struct pt_regs *regs) | 403 | static inline void stack_overflow_check(struct pt_regs *regs) |
@@ -442,27 +464,26 @@ panic_check: | |||
442 | } | 464 | } |
443 | 465 | ||
444 | #ifdef CONFIG_IRQSTACKS | 466 | #ifdef CONFIG_IRQSTACKS |
445 | DEFINE_PER_CPU(union irq_stack_union, irq_stack_union) = { | 467 | /* in entry.S: */ |
446 | .lock = __RAW_SPIN_LOCK_UNLOCKED((irq_stack_union).lock) | 468 | void call_on_stack(unsigned long p1, void *func, unsigned long new_stack); |
447 | }; | ||
448 | 469 | ||
449 | static void execute_on_irq_stack(void *func, unsigned long param1) | 470 | static void execute_on_irq_stack(void *func, unsigned long param1) |
450 | { | 471 | { |
451 | union irq_stack_union *union_ptr; | 472 | union irq_stack_union *union_ptr; |
452 | unsigned long irq_stack; | 473 | unsigned long irq_stack; |
453 | raw_spinlock_t *irq_stack_in_use; | 474 | volatile unsigned int *irq_stack_in_use; |
454 | 475 | ||
455 | union_ptr = &per_cpu(irq_stack_union, smp_processor_id()); | 476 | union_ptr = &per_cpu(irq_stack_union, smp_processor_id()); |
456 | irq_stack = (unsigned long) &union_ptr->stack; | 477 | irq_stack = (unsigned long) &union_ptr->stack; |
457 | irq_stack = ALIGN(irq_stack + sizeof(irq_stack_union.lock), | 478 | irq_stack = ALIGN(irq_stack + sizeof(irq_stack_union.slock), |
458 | 64); /* align for stack frame usage */ | 479 | 64); /* align for stack frame usage */ |
459 | 480 | ||
460 | /* We may be called recursive. If we are already using the irq stack, | 481 | /* We may be called recursive. If we are already using the irq stack, |
461 | * just continue to use it. Use spinlocks to serialize | 482 | * just continue to use it. Use spinlocks to serialize |
462 | * the irq stack usage. | 483 | * the irq stack usage. |
463 | */ | 484 | */ |
464 | irq_stack_in_use = &union_ptr->lock; | 485 | irq_stack_in_use = (volatile unsigned int *)__ldcw_align(union_ptr); |
465 | if (!raw_spin_trylock(irq_stack_in_use)) { | 486 | if (!__ldcw(irq_stack_in_use)) { |
466 | void (*direct_call)(unsigned long p1) = func; | 487 | void (*direct_call)(unsigned long p1) = func; |
467 | 488 | ||
468 | /* We are using the IRQ stack already. | 489 | /* We are using the IRQ stack already. |
@@ -474,10 +495,8 @@ static void execute_on_irq_stack(void *func, unsigned long param1) | |||
474 | /* This is where we switch to the IRQ stack. */ | 495 | /* This is where we switch to the IRQ stack. */ |
475 | call_on_stack(param1, func, irq_stack); | 496 | call_on_stack(param1, func, irq_stack); |
476 | 497 | ||
477 | __inc_irq_stat(irq_stack_counter); | ||
478 | |||
479 | /* free up irq stack usage. */ | 498 | /* free up irq stack usage. */ |
480 | do_raw_spin_unlock(irq_stack_in_use); | 499 | *irq_stack_in_use = 1; |
481 | } | 500 | } |
482 | 501 | ||
483 | asmlinkage void do_softirq(void) | 502 | asmlinkage void do_softirq(void) |
diff --git a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S index 5e1de6072be5..36d7f402e48e 100644 --- a/arch/parisc/kernel/pacache.S +++ b/arch/parisc/kernel/pacache.S | |||
@@ -605,14 +605,14 @@ ENTRY(copy_user_page_asm) | |||
605 | convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */ | 605 | convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */ |
606 | convert_phys_for_tlb_insert20 %r23 /* convert phys addr to tlb insert format */ | 606 | convert_phys_for_tlb_insert20 %r23 /* convert phys addr to tlb insert format */ |
607 | depd %r24,63,22, %r28 /* Form aliased virtual address 'to' */ | 607 | depd %r24,63,22, %r28 /* Form aliased virtual address 'to' */ |
608 | depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */ | 608 | depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */ |
609 | copy %r28, %r29 | 609 | copy %r28, %r29 |
610 | depdi 1, 41,1, %r29 /* Form aliased virtual address 'from' */ | 610 | depdi 1, 41,1, %r29 /* Form aliased virtual address 'from' */ |
611 | #else | 611 | #else |
612 | extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ | 612 | extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ |
613 | extrw,u %r23, 24,25, %r23 /* convert phys addr to tlb insert format */ | 613 | extrw,u %r23, 24,25, %r23 /* convert phys addr to tlb insert format */ |
614 | depw %r24, 31,22, %r28 /* Form aliased virtual address 'to' */ | 614 | depw %r24, 31,22, %r28 /* Form aliased virtual address 'to' */ |
615 | depwi 0, 31,12, %r28 /* Clear any offset bits */ | 615 | depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */ |
616 | copy %r28, %r29 | 616 | copy %r28, %r29 |
617 | depwi 1, 9,1, %r29 /* Form aliased virtual address 'from' */ | 617 | depwi 1, 9,1, %r29 /* Form aliased virtual address 'from' */ |
618 | #endif | 618 | #endif |
@@ -762,7 +762,7 @@ ENTRY(clear_user_page_asm) | |||
762 | #else | 762 | #else |
763 | extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ | 763 | extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ |
764 | depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ | 764 | depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ |
765 | depwi 0, 31,12, %r28 /* Clear any offset bits */ | 765 | depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */ |
766 | #endif | 766 | #endif |
767 | 767 | ||
768 | /* Purge any old translation */ | 768 | /* Purge any old translation */ |
@@ -846,7 +846,7 @@ ENTRY(flush_dcache_page_asm) | |||
846 | #else | 846 | #else |
847 | extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ | 847 | extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ |
848 | depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ | 848 | depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ |
849 | depwi 0, 31,12, %r28 /* Clear any offset bits */ | 849 | depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */ |
850 | #endif | 850 | #endif |
851 | 851 | ||
852 | /* Purge any old translation */ | 852 | /* Purge any old translation */ |
@@ -918,11 +918,11 @@ ENTRY(flush_icache_page_asm) | |||
918 | #endif | 918 | #endif |
919 | convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */ | 919 | convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */ |
920 | depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */ | 920 | depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */ |
921 | depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */ | 921 | depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */ |
922 | #else | 922 | #else |
923 | extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ | 923 | extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ |
924 | depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ | 924 | depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ |
925 | depwi 0, 31,12, %r28 /* Clear any offset bits */ | 925 | depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */ |
926 | #endif | 926 | #endif |
927 | 927 | ||
928 | /* Purge any old translation */ | 928 | /* Purge any old translation */ |
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index fe41a98043bb..04e47c6a4562 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
@@ -646,6 +646,7 @@ void notrace handle_interruption(int code, struct pt_regs *regs) | |||
646 | case 14: | 646 | case 14: |
647 | /* Assist Exception Trap, i.e. floating point exception. */ | 647 | /* Assist Exception Trap, i.e. floating point exception. */ |
648 | die_if_kernel("Floating point exception", regs, 0); /* quiet */ | 648 | die_if_kernel("Floating point exception", regs, 0); /* quiet */ |
649 | __inc_irq_stat(irq_fpassist_count); | ||
649 | handle_fpe(regs); | 650 | handle_fpe(regs); |
650 | return; | 651 | return; |
651 | 652 | ||
diff --git a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c index 234e3682cf09..d7c0acb35ec2 100644 --- a/arch/parisc/kernel/unaligned.c +++ b/arch/parisc/kernel/unaligned.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/signal.h> | 27 | #include <linux/signal.h> |
28 | #include <linux/ratelimit.h> | 28 | #include <linux/ratelimit.h> |
29 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
30 | #include <asm/hardirq.h> | ||
30 | 31 | ||
31 | /* #define DEBUG_UNALIGNED 1 */ | 32 | /* #define DEBUG_UNALIGNED 1 */ |
32 | 33 | ||
@@ -454,6 +455,8 @@ void handle_unaligned(struct pt_regs *regs) | |||
454 | struct siginfo si; | 455 | struct siginfo si; |
455 | register int flop=0; /* true if this is a flop */ | 456 | register int flop=0; /* true if this is a flop */ |
456 | 457 | ||
458 | __inc_irq_stat(irq_unaligned_count); | ||
459 | |||
457 | /* log a message with pacing */ | 460 | /* log a message with pacing */ |
458 | if (user_mode(regs)) { | 461 | if (user_mode(regs)) { |
459 | if (current->thread.flags & PARISC_UAC_SIGBUS) { | 462 | if (current->thread.flags & PARISC_UAC_SIGBUS) { |