diff options
| -rw-r--r-- | MAINTAINERS | 1 | ||||
| -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 | ||||
| -rw-r--r-- | drivers/parisc/superio.c | 13 | ||||
| -rw-r--r-- | lib/mpi/longlong.h | 5 |
12 files changed, 62 insertions, 71 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index b645a3d5fd30..fd3a495a0005 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -6084,6 +6084,7 @@ L: linux-parisc@vger.kernel.org | |||
| 6084 | W: http://www.parisc-linux.org/ | 6084 | W: http://www.parisc-linux.org/ |
| 6085 | Q: http://patchwork.kernel.org/project/linux-parisc/list/ | 6085 | Q: http://patchwork.kernel.org/project/linux-parisc/list/ |
| 6086 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/parisc-2.6.git | 6086 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/parisc-2.6.git |
| 6087 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux.git | ||
| 6087 | S: Maintained | 6088 | S: Maintained |
| 6088 | F: arch/parisc/ | 6089 | F: arch/parisc/ |
| 6089 | F: drivers/parisc/ | 6090 | F: drivers/parisc/ |
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) { |
diff --git a/drivers/parisc/superio.c b/drivers/parisc/superio.c index ac6e8e7a02df..a042d065a0c7 100644 --- a/drivers/parisc/superio.c +++ b/drivers/parisc/superio.c | |||
| @@ -494,15 +494,4 @@ static struct pci_driver superio_driver = { | |||
| 494 | .probe = superio_probe, | 494 | .probe = superio_probe, |
| 495 | }; | 495 | }; |
| 496 | 496 | ||
| 497 | static int __init superio_modinit(void) | 497 | module_pci_driver(superio_driver); |
| 498 | { | ||
| 499 | return pci_register_driver(&superio_driver); | ||
| 500 | } | ||
| 501 | |||
| 502 | static void __exit superio_exit(void) | ||
| 503 | { | ||
| 504 | pci_unregister_driver(&superio_driver); | ||
| 505 | } | ||
| 506 | |||
| 507 | module_init(superio_modinit); | ||
| 508 | module_exit(superio_exit); | ||
diff --git a/lib/mpi/longlong.h b/lib/mpi/longlong.h index 095ab157a521..d411355f238e 100644 --- a/lib/mpi/longlong.h +++ b/lib/mpi/longlong.h | |||
| @@ -318,7 +318,8 @@ extern UDItype __udiv_qrnnd(); | |||
| 318 | "rM" ((USItype)(bh)), \ | 318 | "rM" ((USItype)(bh)), \ |
| 319 | "rM" ((USItype)(al)), \ | 319 | "rM" ((USItype)(al)), \ |
| 320 | "rM" ((USItype)(bl))) | 320 | "rM" ((USItype)(bl))) |
| 321 | #if defined(_PA_RISC1_1) | 321 | #if 0 && defined(_PA_RISC1_1) |
| 322 | /* xmpyu uses floating point register which is not allowed in Linux kernel. */ | ||
| 322 | #define umul_ppmm(wh, wl, u, v) \ | 323 | #define umul_ppmm(wh, wl, u, v) \ |
| 323 | do { \ | 324 | do { \ |
| 324 | union {UDItype __ll; \ | 325 | union {UDItype __ll; \ |
| @@ -337,7 +338,7 @@ do { \ | |||
| 337 | #define UMUL_TIME 40 | 338 | #define UMUL_TIME 40 |
| 338 | #define UDIV_TIME 80 | 339 | #define UDIV_TIME 80 |
| 339 | #endif | 340 | #endif |
| 340 | #ifndef LONGLONG_STANDALONE | 341 | #if 0 /* #ifndef LONGLONG_STANDALONE */ |
| 341 | #define udiv_qrnnd(q, r, n1, n0, d) \ | 342 | #define udiv_qrnnd(q, r, n1, n0, d) \ |
| 342 | do { USItype __r; \ | 343 | do { USItype __r; \ |
| 343 | (q) = __udiv_qrnnd(&__r, (n1), (n0), (d)); \ | 344 | (q) = __udiv_qrnnd(&__r, (n1), (n0), (d)); \ |
