diff options
author | Tejun Heo <tj@kernel.org> | 2009-08-14 01:41:02 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2009-08-14 01:45:31 -0400 |
commit | 384be2b18a5f9475eab9ca2bdfa95cc1a04ef59c (patch) | |
tree | 04c93f391a1b65c8bf8d7ba8643c07d26c26590a /arch/parisc | |
parent | a76761b621bcd8336065c4fe3a74f046858bc34c (diff) | |
parent | 142d44b0dd6741a64a7bdbe029110e7c1dcf1d23 (diff) |
Merge branch 'percpu-for-linus' into percpu-for-next
Conflicts:
arch/sparc/kernel/smp_64.c
arch/x86/kernel/cpu/perf_counter.c
arch/x86/kernel/setup_percpu.c
drivers/cpufreq/cpufreq_ondemand.c
mm/percpu.c
Conflicts in core and arch percpu codes are mostly from commit
ed78e1e078dd44249f88b1dd8c76dafb39567161 which substituted many
num_possible_cpus() with nr_cpu_ids. As for-next branch has moved all
the first chunk allocators into mm/percpu.c, the changes are moved
from arch code to mm/percpu.c.
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'arch/parisc')
29 files changed, 233 insertions, 208 deletions
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 9038f39d9d73..06f8d5b5b0f9 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig | |||
@@ -16,6 +16,8 @@ config PARISC | |||
16 | select RTC_DRV_GENERIC | 16 | select RTC_DRV_GENERIC |
17 | select INIT_ALL_POSSIBLE | 17 | select INIT_ALL_POSSIBLE |
18 | select BUG | 18 | select BUG |
19 | select HAVE_PERF_COUNTERS | ||
20 | select GENERIC_ATOMIC64 if !64BIT | ||
19 | help | 21 | help |
20 | The PA-RISC microprocessor is designed by Hewlett-Packard and used | 22 | The PA-RISC microprocessor is designed by Hewlett-Packard and used |
21 | in many of their workstations & servers (HP9000 700 and 800 series, | 23 | in many of their workstations & servers (HP9000 700 and 800 series, |
diff --git a/arch/parisc/include/asm/atomic.h b/arch/parisc/include/asm/atomic.h index 7eeaff944360..8bc9e96699b2 100644 --- a/arch/parisc/include/asm/atomic.h +++ b/arch/parisc/include/asm/atomic.h | |||
@@ -222,13 +222,13 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) | |||
222 | 222 | ||
223 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | 223 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) |
224 | 224 | ||
225 | #define atomic_add(i,v) ((void)(__atomic_add_return( ((int)(i)),(v)))) | 225 | #define atomic_add(i,v) ((void)(__atomic_add_return( (i),(v)))) |
226 | #define atomic_sub(i,v) ((void)(__atomic_add_return(-((int)(i)),(v)))) | 226 | #define atomic_sub(i,v) ((void)(__atomic_add_return(-(i),(v)))) |
227 | #define atomic_inc(v) ((void)(__atomic_add_return( 1,(v)))) | 227 | #define atomic_inc(v) ((void)(__atomic_add_return( 1,(v)))) |
228 | #define atomic_dec(v) ((void)(__atomic_add_return( -1,(v)))) | 228 | #define atomic_dec(v) ((void)(__atomic_add_return( -1,(v)))) |
229 | 229 | ||
230 | #define atomic_add_return(i,v) (__atomic_add_return( ((int)(i)),(v))) | 230 | #define atomic_add_return(i,v) (__atomic_add_return( (i),(v))) |
231 | #define atomic_sub_return(i,v) (__atomic_add_return(-((int)(i)),(v))) | 231 | #define atomic_sub_return(i,v) (__atomic_add_return(-(i),(v))) |
232 | #define atomic_inc_return(v) (__atomic_add_return( 1,(v))) | 232 | #define atomic_inc_return(v) (__atomic_add_return( 1,(v))) |
233 | #define atomic_dec_return(v) (__atomic_add_return( -1,(v))) | 233 | #define atomic_dec_return(v) (__atomic_add_return( -1,(v))) |
234 | 234 | ||
@@ -336,7 +336,11 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) | |||
336 | 336 | ||
337 | #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) | 337 | #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) |
338 | 338 | ||
339 | #endif /* CONFIG_64BIT */ | 339 | #else /* CONFIG_64BIT */ |
340 | |||
341 | #include <asm-generic/atomic64.h> | ||
342 | |||
343 | #endif /* !CONFIG_64BIT */ | ||
340 | 344 | ||
341 | #include <asm-generic/atomic-long.h> | 345 | #include <asm-generic/atomic-long.h> |
342 | 346 | ||
diff --git a/arch/parisc/include/asm/dma.h b/arch/parisc/include/asm/dma.h index 31ad0f05af3d..f7a18f968703 100644 --- a/arch/parisc/include/asm/dma.h +++ b/arch/parisc/include/asm/dma.h | |||
@@ -1,5 +1,4 @@ | |||
1 | /* $Id: dma.h,v 1.2 1999/04/27 00:46:18 deller Exp $ | 1 | /* asm/dma.h: Defines for using and allocating dma channels. |
2 | * linux/include/asm/dma.h: Defines for using and allocating dma channels. | ||
3 | * Written by Hennus Bergman, 1992. | 2 | * Written by Hennus Bergman, 1992. |
4 | * High DMA channel support & info by Hannu Savolainen | 3 | * High DMA channel support & info by Hannu Savolainen |
5 | * and John Boyd, Nov. 1992. | 4 | * and John Boyd, Nov. 1992. |
diff --git a/arch/parisc/include/asm/perf_counter.h b/arch/parisc/include/asm/perf_counter.h new file mode 100644 index 000000000000..dc9e829f7013 --- /dev/null +++ b/arch/parisc/include/asm/perf_counter.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef __ASM_PARISC_PERF_COUNTER_H | ||
2 | #define __ASM_PARISC_PERF_COUNTER_H | ||
3 | |||
4 | /* parisc only supports software counters through this interface. */ | ||
5 | static inline void set_perf_counter_pending(void) { } | ||
6 | |||
7 | #endif /* __ASM_PARISC_PERF_COUNTER_H */ | ||
diff --git a/arch/parisc/include/asm/processor.h b/arch/parisc/include/asm/processor.h index 9d64df8754ba..9ce66e9d1c2b 100644 --- a/arch/parisc/include/asm/processor.h +++ b/arch/parisc/include/asm/processor.h | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <asm/types.h> | 18 | #include <asm/types.h> |
19 | #include <asm/system.h> | 19 | #include <asm/system.h> |
20 | #include <asm/percpu.h> | 20 | #include <asm/percpu.h> |
21 | |||
21 | #endif /* __ASSEMBLY__ */ | 22 | #endif /* __ASSEMBLY__ */ |
22 | 23 | ||
23 | #define KERNEL_STACK_SIZE (4*PAGE_SIZE) | 24 | #define KERNEL_STACK_SIZE (4*PAGE_SIZE) |
@@ -127,6 +128,8 @@ struct thread_struct { | |||
127 | unsigned long flags; | 128 | unsigned long flags; |
128 | }; | 129 | }; |
129 | 130 | ||
131 | #define task_pt_regs(tsk) ((struct pt_regs *)&((tsk)->thread.regs)) | ||
132 | |||
130 | /* Thread struct flags. */ | 133 | /* Thread struct flags. */ |
131 | #define PARISC_UAC_NOPRINT (1UL << 0) /* see prctl and unaligned.c */ | 134 | #define PARISC_UAC_NOPRINT (1UL << 0) /* see prctl and unaligned.c */ |
132 | #define PARISC_UAC_SIGBUS (1UL << 1) | 135 | #define PARISC_UAC_SIGBUS (1UL << 1) |
diff --git a/arch/parisc/include/asm/system.h b/arch/parisc/include/asm/system.h index ee80c920b464..d91357bca5b4 100644 --- a/arch/parisc/include/asm/system.h +++ b/arch/parisc/include/asm/system.h | |||
@@ -168,8 +168,8 @@ static inline void set_eiem(unsigned long val) | |||
168 | /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */ | 168 | /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */ |
169 | #define __ldcw(a) ({ \ | 169 | #define __ldcw(a) ({ \ |
170 | unsigned __ret; \ | 170 | unsigned __ret; \ |
171 | __asm__ __volatile__(__LDCW " 0(%1),%0" \ | 171 | __asm__ __volatile__(__LDCW " 0(%2),%0" \ |
172 | : "=r" (__ret) : "r" (a)); \ | 172 | : "=r" (__ret), "+m" (*(a)) : "r" (a)); \ |
173 | __ret; \ | 173 | __ret; \ |
174 | }) | 174 | }) |
175 | 175 | ||
diff --git a/arch/parisc/include/asm/thread_info.h b/arch/parisc/include/asm/thread_info.h index 0407959da489..4ce0edfbe969 100644 --- a/arch/parisc/include/asm/thread_info.h +++ b/arch/parisc/include/asm/thread_info.h | |||
@@ -23,7 +23,7 @@ struct thread_info { | |||
23 | .flags = 0, \ | 23 | .flags = 0, \ |
24 | .cpu = 0, \ | 24 | .cpu = 0, \ |
25 | .addr_limit = KERNEL_DS, \ | 25 | .addr_limit = KERNEL_DS, \ |
26 | .preempt_count = 1, \ | 26 | .preempt_count = INIT_PREEMPT_COUNT, \ |
27 | .restart_block = { \ | 27 | .restart_block = { \ |
28 | .fn = do_no_restart_syscall \ | 28 | .fn = do_no_restart_syscall \ |
29 | } \ | 29 | } \ |
diff --git a/arch/parisc/include/asm/tlb.h b/arch/parisc/include/asm/tlb.h index 383b1db310ee..07924903989e 100644 --- a/arch/parisc/include/asm/tlb.h +++ b/arch/parisc/include/asm/tlb.h | |||
@@ -21,7 +21,7 @@ do { if (!(tlb)->fullmm) \ | |||
21 | 21 | ||
22 | #include <asm-generic/tlb.h> | 22 | #include <asm-generic/tlb.h> |
23 | 23 | ||
24 | #define __pmd_free_tlb(tlb, pmd) pmd_free((tlb)->mm, pmd) | 24 | #define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tlb)->mm, pmd) |
25 | #define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, pte) | 25 | #define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte) |
26 | 26 | ||
27 | #endif | 27 | #endif |
diff --git a/arch/parisc/include/asm/tlbflush.h b/arch/parisc/include/asm/tlbflush.h index 1f6fd4fc05b9..8f1a8100bf2d 100644 --- a/arch/parisc/include/asm/tlbflush.h +++ b/arch/parisc/include/asm/tlbflush.h | |||
@@ -12,14 +12,12 @@ | |||
12 | * N class systems, only one PxTLB inter processor broadcast can be | 12 | * N class systems, only one PxTLB inter processor broadcast can be |
13 | * active at any one time on the Merced bus. This tlb purge | 13 | * active at any one time on the Merced bus. This tlb purge |
14 | * synchronisation is fairly lightweight and harmless so we activate | 14 | * synchronisation is fairly lightweight and harmless so we activate |
15 | * it on all SMP systems not just the N class. We also need to have | 15 | * it on all systems not just the N class. |
16 | * preemption disabled on uniprocessor machines, and spin_lock does that | ||
17 | * nicely. | ||
18 | */ | 16 | */ |
19 | extern spinlock_t pa_tlb_lock; | 17 | extern spinlock_t pa_tlb_lock; |
20 | 18 | ||
21 | #define purge_tlb_start(x) spin_lock(&pa_tlb_lock) | 19 | #define purge_tlb_start(flags) spin_lock_irqsave(&pa_tlb_lock, flags) |
22 | #define purge_tlb_end(x) spin_unlock(&pa_tlb_lock) | 20 | #define purge_tlb_end(flags) spin_unlock_irqrestore(&pa_tlb_lock, flags) |
23 | 21 | ||
24 | extern void flush_tlb_all(void); | 22 | extern void flush_tlb_all(void); |
25 | extern void flush_tlb_all_local(void *); | 23 | extern void flush_tlb_all_local(void *); |
@@ -63,14 +61,16 @@ static inline void flush_tlb_mm(struct mm_struct *mm) | |||
63 | static inline void flush_tlb_page(struct vm_area_struct *vma, | 61 | static inline void flush_tlb_page(struct vm_area_struct *vma, |
64 | unsigned long addr) | 62 | unsigned long addr) |
65 | { | 63 | { |
64 | unsigned long flags; | ||
65 | |||
66 | /* For one page, it's not worth testing the split_tlb variable */ | 66 | /* For one page, it's not worth testing the split_tlb variable */ |
67 | 67 | ||
68 | mb(); | 68 | mb(); |
69 | mtsp(vma->vm_mm->context,1); | 69 | mtsp(vma->vm_mm->context,1); |
70 | purge_tlb_start(); | 70 | purge_tlb_start(flags); |
71 | pdtlb(addr); | 71 | pdtlb(addr); |
72 | pitlb(addr); | 72 | pitlb(addr); |
73 | purge_tlb_end(); | 73 | purge_tlb_end(flags); |
74 | } | 74 | } |
75 | 75 | ||
76 | void __flush_tlb_range(unsigned long sid, | 76 | void __flush_tlb_range(unsigned long sid, |
diff --git a/arch/parisc/include/asm/unistd.h b/arch/parisc/include/asm/unistd.h index ef26b009dc5d..f3d3b8b012c4 100644 --- a/arch/parisc/include/asm/unistd.h +++ b/arch/parisc/include/asm/unistd.h | |||
@@ -807,8 +807,12 @@ | |||
807 | #define __NR_dup3 (__NR_Linux + 312) | 807 | #define __NR_dup3 (__NR_Linux + 312) |
808 | #define __NR_pipe2 (__NR_Linux + 313) | 808 | #define __NR_pipe2 (__NR_Linux + 313) |
809 | #define __NR_inotify_init1 (__NR_Linux + 314) | 809 | #define __NR_inotify_init1 (__NR_Linux + 314) |
810 | #define __NR_preadv (__NR_Linux + 315) | ||
811 | #define __NR_pwritev (__NR_Linux + 316) | ||
812 | #define __NR_rt_tgsigqueueinfo (__NR_Linux + 317) | ||
813 | #define __NR_perf_counter_open (__NR_Linux + 318) | ||
810 | 814 | ||
811 | #define __NR_Linux_syscalls (__NR_inotify_init1 + 1) | 815 | #define __NR_Linux_syscalls (__NR_perf_counter_open + 1) |
812 | 816 | ||
813 | 817 | ||
814 | #define __IGNORE_select /* newselect */ | 818 | #define __IGNORE_select /* newselect */ |
diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index 837530ea32e7..b6ed34de14e1 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* $Id: cache.c,v 1.4 2000/01/25 00:11:38 prumpf Exp $ | 1 | /* |
2 | * | ||
3 | * This file is subject to the terms and conditions of the GNU General Public | 2 | * This file is subject to the terms and conditions of the GNU General Public |
4 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
5 | * for more details. | 4 | * for more details. |
@@ -398,12 +397,13 @@ EXPORT_SYMBOL(flush_kernel_icache_range_asm); | |||
398 | 397 | ||
399 | void clear_user_page_asm(void *page, unsigned long vaddr) | 398 | void clear_user_page_asm(void *page, unsigned long vaddr) |
400 | { | 399 | { |
400 | unsigned long flags; | ||
401 | /* This function is implemented in assembly in pacache.S */ | 401 | /* This function is implemented in assembly in pacache.S */ |
402 | extern void __clear_user_page_asm(void *page, unsigned long vaddr); | 402 | extern void __clear_user_page_asm(void *page, unsigned long vaddr); |
403 | 403 | ||
404 | purge_tlb_start(); | 404 | purge_tlb_start(flags); |
405 | __clear_user_page_asm(page, vaddr); | 405 | __clear_user_page_asm(page, vaddr); |
406 | purge_tlb_end(); | 406 | purge_tlb_end(flags); |
407 | } | 407 | } |
408 | 408 | ||
409 | #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */ | 409 | #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */ |
@@ -444,20 +444,24 @@ extern void clear_user_page_asm(void *page, unsigned long vaddr); | |||
444 | 444 | ||
445 | void clear_user_page(void *page, unsigned long vaddr, struct page *pg) | 445 | void clear_user_page(void *page, unsigned long vaddr, struct page *pg) |
446 | { | 446 | { |
447 | unsigned long flags; | ||
448 | |||
447 | purge_kernel_dcache_page((unsigned long)page); | 449 | purge_kernel_dcache_page((unsigned long)page); |
448 | purge_tlb_start(); | 450 | purge_tlb_start(flags); |
449 | pdtlb_kernel(page); | 451 | pdtlb_kernel(page); |
450 | purge_tlb_end(); | 452 | purge_tlb_end(flags); |
451 | clear_user_page_asm(page, vaddr); | 453 | clear_user_page_asm(page, vaddr); |
452 | } | 454 | } |
453 | EXPORT_SYMBOL(clear_user_page); | 455 | EXPORT_SYMBOL(clear_user_page); |
454 | 456 | ||
455 | void flush_kernel_dcache_page_addr(void *addr) | 457 | void flush_kernel_dcache_page_addr(void *addr) |
456 | { | 458 | { |
459 | unsigned long flags; | ||
460 | |||
457 | flush_kernel_dcache_page_asm(addr); | 461 | flush_kernel_dcache_page_asm(addr); |
458 | purge_tlb_start(); | 462 | purge_tlb_start(flags); |
459 | pdtlb_kernel(addr); | 463 | pdtlb_kernel(addr); |
460 | purge_tlb_end(); | 464 | purge_tlb_end(flags); |
461 | } | 465 | } |
462 | EXPORT_SYMBOL(flush_kernel_dcache_page_addr); | 466 | EXPORT_SYMBOL(flush_kernel_dcache_page_addr); |
463 | 467 | ||
@@ -490,8 +494,10 @@ void __flush_tlb_range(unsigned long sid, unsigned long start, | |||
490 | if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */ | 494 | if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */ |
491 | flush_tlb_all(); | 495 | flush_tlb_all(); |
492 | else { | 496 | else { |
497 | unsigned long flags; | ||
498 | |||
493 | mtsp(sid, 1); | 499 | mtsp(sid, 1); |
494 | purge_tlb_start(); | 500 | purge_tlb_start(flags); |
495 | if (split_tlb) { | 501 | if (split_tlb) { |
496 | while (npages--) { | 502 | while (npages--) { |
497 | pdtlb(start); | 503 | pdtlb(start); |
@@ -504,7 +510,7 @@ void __flush_tlb_range(unsigned long sid, unsigned long start, | |||
504 | start += PAGE_SIZE; | 510 | start += PAGE_SIZE; |
505 | } | 511 | } |
506 | } | 512 | } |
507 | purge_tlb_end(); | 513 | purge_tlb_end(flags); |
508 | } | 514 | } |
509 | } | 515 | } |
510 | 516 | ||
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index ae3e70cd1e14..e552e547cb93 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
@@ -553,7 +553,7 @@ | |||
553 | * on most of those machines only handles cache transactions. | 553 | * on most of those machines only handles cache transactions. |
554 | */ | 554 | */ |
555 | extrd,u,*= \pte,_PAGE_NO_CACHE_BIT+32,1,%r0 | 555 | extrd,u,*= \pte,_PAGE_NO_CACHE_BIT+32,1,%r0 |
556 | depi 1,12,1,\prot | 556 | depdi 1,12,1,\prot |
557 | 557 | ||
558 | /* Drop prot bits and convert to page addr for iitlbt and idtlbt */ | 558 | /* Drop prot bits and convert to page addr for iitlbt and idtlbt */ |
559 | convert_for_tlb_insert20 \pte | 559 | convert_for_tlb_insert20 \pte |
diff --git a/arch/parisc/kernel/inventory.c b/arch/parisc/kernel/inventory.c index bd1f7f1ff74e..d228d8237879 100644 --- a/arch/parisc/kernel/inventory.c +++ b/arch/parisc/kernel/inventory.c | |||
@@ -170,23 +170,27 @@ static void __init pagezero_memconfig(void) | |||
170 | static int __init | 170 | static int __init |
171 | pat_query_module(ulong pcell_loc, ulong mod_index) | 171 | pat_query_module(ulong pcell_loc, ulong mod_index) |
172 | { | 172 | { |
173 | pdc_pat_cell_mod_maddr_block_t pa_pdc_cell; | 173 | pdc_pat_cell_mod_maddr_block_t *pa_pdc_cell; |
174 | unsigned long bytecnt; | 174 | unsigned long bytecnt; |
175 | unsigned long temp; /* 64-bit scratch value */ | 175 | unsigned long temp; /* 64-bit scratch value */ |
176 | long status; /* PDC return value status */ | 176 | long status; /* PDC return value status */ |
177 | struct parisc_device *dev; | 177 | struct parisc_device *dev; |
178 | 178 | ||
179 | pa_pdc_cell = kmalloc(sizeof (*pa_pdc_cell), GFP_KERNEL); | ||
180 | if (!pa_pdc_cell) | ||
181 | panic("couldn't allocate memory for PDC_PAT_CELL!"); | ||
182 | |||
179 | /* return cell module (PA or Processor view) */ | 183 | /* return cell module (PA or Processor view) */ |
180 | status = pdc_pat_cell_module(&bytecnt, pcell_loc, mod_index, | 184 | status = pdc_pat_cell_module(&bytecnt, pcell_loc, mod_index, |
181 | PA_VIEW, &pa_pdc_cell); | 185 | PA_VIEW, pa_pdc_cell); |
182 | 186 | ||
183 | if (status != PDC_OK) { | 187 | if (status != PDC_OK) { |
184 | /* no more cell modules or error */ | 188 | /* no more cell modules or error */ |
185 | return status; | 189 | return status; |
186 | } | 190 | } |
187 | 191 | ||
188 | temp = pa_pdc_cell.cba; | 192 | temp = pa_pdc_cell->cba; |
189 | dev = alloc_pa_dev(PAT_GET_CBA(temp), &pa_pdc_cell.mod_path); | 193 | dev = alloc_pa_dev(PAT_GET_CBA(temp), &(pa_pdc_cell->mod_path)); |
190 | if (!dev) { | 194 | if (!dev) { |
191 | return PDC_OK; | 195 | return PDC_OK; |
192 | } | 196 | } |
@@ -203,8 +207,8 @@ pat_query_module(ulong pcell_loc, ulong mod_index) | |||
203 | 207 | ||
204 | /* save generic info returned from the call */ | 208 | /* save generic info returned from the call */ |
205 | /* REVISIT: who is the consumer of this? not sure yet... */ | 209 | /* REVISIT: who is the consumer of this? not sure yet... */ |
206 | dev->mod_info = pa_pdc_cell.mod_info; /* pass to PAT_GET_ENTITY() */ | 210 | dev->mod_info = pa_pdc_cell->mod_info; /* pass to PAT_GET_ENTITY() */ |
207 | dev->pmod_loc = pa_pdc_cell.mod_location; | 211 | dev->pmod_loc = pa_pdc_cell->mod_location; |
208 | 212 | ||
209 | register_parisc_device(dev); /* advertise device */ | 213 | register_parisc_device(dev); /* advertise device */ |
210 | 214 | ||
@@ -216,14 +220,14 @@ pat_query_module(ulong pcell_loc, ulong mod_index) | |||
216 | 220 | ||
217 | case PAT_ENTITY_PROC: | 221 | case PAT_ENTITY_PROC: |
218 | printk(KERN_DEBUG "PAT_ENTITY_PROC: id_eid 0x%lx\n", | 222 | printk(KERN_DEBUG "PAT_ENTITY_PROC: id_eid 0x%lx\n", |
219 | pa_pdc_cell.mod[0]); | 223 | pa_pdc_cell->mod[0]); |
220 | break; | 224 | break; |
221 | 225 | ||
222 | case PAT_ENTITY_MEM: | 226 | case PAT_ENTITY_MEM: |
223 | printk(KERN_DEBUG | 227 | printk(KERN_DEBUG |
224 | "PAT_ENTITY_MEM: amount 0x%lx min_gni_base 0x%lx min_gni_len 0x%lx\n", | 228 | "PAT_ENTITY_MEM: amount 0x%lx min_gni_base 0x%lx min_gni_len 0x%lx\n", |
225 | pa_pdc_cell.mod[0], pa_pdc_cell.mod[1], | 229 | pa_pdc_cell->mod[0], pa_pdc_cell->mod[1], |
226 | pa_pdc_cell.mod[2]); | 230 | pa_pdc_cell->mod[2]); |
227 | break; | 231 | break; |
228 | case PAT_ENTITY_CA: | 232 | case PAT_ENTITY_CA: |
229 | printk(KERN_DEBUG "PAT_ENTITY_CA: %ld\n", pcell_loc); | 233 | printk(KERN_DEBUG "PAT_ENTITY_CA: %ld\n", pcell_loc); |
@@ -243,23 +247,26 @@ pat_query_module(ulong pcell_loc, ulong mod_index) | |||
243 | print_ranges: | 247 | print_ranges: |
244 | pdc_pat_cell_module(&bytecnt, pcell_loc, mod_index, | 248 | pdc_pat_cell_module(&bytecnt, pcell_loc, mod_index, |
245 | IO_VIEW, &io_pdc_cell); | 249 | IO_VIEW, &io_pdc_cell); |
246 | printk(KERN_DEBUG "ranges %ld\n", pa_pdc_cell.mod[1]); | 250 | printk(KERN_DEBUG "ranges %ld\n", pa_pdc_cell->mod[1]); |
247 | for (i = 0; i < pa_pdc_cell.mod[1]; i++) { | 251 | for (i = 0; i < pa_pdc_cell->mod[1]; i++) { |
248 | printk(KERN_DEBUG | 252 | printk(KERN_DEBUG |
249 | " PA_VIEW %ld: 0x%016lx 0x%016lx 0x%016lx\n", | 253 | " PA_VIEW %ld: 0x%016lx 0x%016lx 0x%016lx\n", |
250 | i, pa_pdc_cell.mod[2 + i * 3], /* type */ | 254 | i, pa_pdc_cell->mod[2 + i * 3], /* type */ |
251 | pa_pdc_cell.mod[3 + i * 3], /* start */ | 255 | pa_pdc_cell->mod[3 + i * 3], /* start */ |
252 | pa_pdc_cell.mod[4 + i * 3]); /* finish (ie end) */ | 256 | pa_pdc_cell->mod[4 + i * 3]); /* finish (ie end) */ |
253 | printk(KERN_DEBUG | 257 | printk(KERN_DEBUG |
254 | " IO_VIEW %ld: 0x%016lx 0x%016lx 0x%016lx\n", | 258 | " IO_VIEW %ld: 0x%016lx 0x%016lx 0x%016lx\n", |
255 | i, io_pdc_cell.mod[2 + i * 3], /* type */ | 259 | i, io_pdc_cell->mod[2 + i * 3], /* type */ |
256 | io_pdc_cell.mod[3 + i * 3], /* start */ | 260 | io_pdc_cell->mod[3 + i * 3], /* start */ |
257 | io_pdc_cell.mod[4 + i * 3]); /* finish (ie end) */ | 261 | io_pdc_cell->mod[4 + i * 3]); /* finish (ie end) */ |
258 | } | 262 | } |
259 | printk(KERN_DEBUG "\n"); | 263 | printk(KERN_DEBUG "\n"); |
260 | break; | 264 | break; |
261 | } | 265 | } |
262 | #endif /* DEBUG_PAT */ | 266 | #endif /* DEBUG_PAT */ |
267 | |||
268 | kfree(pa_pdc_cell); | ||
269 | |||
263 | return PDC_OK; | 270 | return PDC_OK; |
264 | } | 271 | } |
265 | 272 | ||
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index 8007f1e65729..330f536a9324 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
@@ -120,7 +120,7 @@ int cpu_check_affinity(unsigned int irq, const struct cpumask *dest) | |||
120 | if (CHECK_IRQ_PER_CPU(irq)) { | 120 | if (CHECK_IRQ_PER_CPU(irq)) { |
121 | /* Bad linux design decision. The mask has already | 121 | /* Bad linux design decision. The mask has already |
122 | * been set; we must reset it */ | 122 | * been set; we must reset it */ |
123 | cpumask_setall(&irq_desc[irq].affinity); | 123 | cpumask_setall(irq_desc[irq].affinity); |
124 | return -EINVAL; | 124 | return -EINVAL; |
125 | } | 125 | } |
126 | 126 | ||
@@ -138,13 +138,13 @@ static int cpu_set_affinity_irq(unsigned int irq, const struct cpumask *dest) | |||
138 | if (cpu_dest < 0) | 138 | if (cpu_dest < 0) |
139 | return -1; | 139 | return -1; |
140 | 140 | ||
141 | cpumask_copy(&irq_desc[irq].affinity, dest); | 141 | cpumask_copy(irq_desc[irq].affinity, dest); |
142 | 142 | ||
143 | return 0; | 143 | return 0; |
144 | } | 144 | } |
145 | #endif | 145 | #endif |
146 | 146 | ||
147 | static struct hw_interrupt_type cpu_interrupt_type = { | 147 | static struct irq_chip cpu_interrupt_type = { |
148 | .typename = "CPU", | 148 | .typename = "CPU", |
149 | .startup = cpu_startup_irq, | 149 | .startup = cpu_startup_irq, |
150 | .shutdown = cpu_disable_irq, | 150 | .shutdown = cpu_disable_irq, |
@@ -299,7 +299,7 @@ int txn_alloc_irq(unsigned int bits_wide) | |||
299 | unsigned long txn_affinity_addr(unsigned int irq, int cpu) | 299 | unsigned long txn_affinity_addr(unsigned int irq, int cpu) |
300 | { | 300 | { |
301 | #ifdef CONFIG_SMP | 301 | #ifdef CONFIG_SMP |
302 | cpumask_copy(&irq_desc[irq].affinity, cpumask_of(cpu)); | 302 | cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); |
303 | #endif | 303 | #endif |
304 | 304 | ||
305 | return per_cpu(cpu_data, cpu).txn_addr; | 305 | return per_cpu(cpu_data, cpu).txn_addr; |
@@ -356,7 +356,7 @@ void do_cpu_irq_mask(struct pt_regs *regs) | |||
356 | irq = eirr_to_irq(eirr_val); | 356 | irq = eirr_to_irq(eirr_val); |
357 | 357 | ||
358 | #ifdef CONFIG_SMP | 358 | #ifdef CONFIG_SMP |
359 | cpumask_copy(&dest, &irq_desc[irq].affinity); | 359 | cpumask_copy(&dest, irq_desc[irq].affinity); |
360 | if (CHECK_IRQ_PER_CPU(irq_desc[irq].status) && | 360 | if (CHECK_IRQ_PER_CPU(irq_desc[irq].status) && |
361 | !cpu_isset(smp_processor_id(), dest)) { | 361 | !cpu_isset(smp_processor_id(), dest)) { |
362 | int cpu = first_cpu(dest); | 362 | int cpu = first_cpu(dest); |
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c index ef5caf2e6ed0..61ee0eec4e69 100644 --- a/arch/parisc/kernel/module.c +++ b/arch/parisc/kernel/module.c | |||
@@ -86,8 +86,12 @@ | |||
86 | * the bottom of the table, which has a maximum signed displacement of | 86 | * the bottom of the table, which has a maximum signed displacement of |
87 | * 0x3fff; however, since we're only going forward, this becomes | 87 | * 0x3fff; however, since we're only going forward, this becomes |
88 | * 0x1fff, and thus, since each GOT entry is 8 bytes long we can have | 88 | * 0x1fff, and thus, since each GOT entry is 8 bytes long we can have |
89 | * at most 1023 entries */ | 89 | * at most 1023 entries. |
90 | #define MAX_GOTS 1023 | 90 | * To overcome this 14bit displacement with some kernel modules, we'll |
91 | * use instead the unusal 16bit displacement method (see reassemble_16a) | ||
92 | * which gives us a maximum positive displacement of 0x7fff, and as such | ||
93 | * allows us to allocate up to 4095 GOT entries. */ | ||
94 | #define MAX_GOTS 4095 | ||
91 | 95 | ||
92 | /* three functions to determine where in the module core | 96 | /* three functions to determine where in the module core |
93 | * or init pieces the location is */ | 97 | * or init pieces the location is */ |
@@ -145,12 +149,40 @@ struct stub_entry { | |||
145 | /* The reassemble_* functions prepare an immediate value for | 149 | /* The reassemble_* functions prepare an immediate value for |
146 | insertion into an opcode. pa-risc uses all sorts of weird bitfields | 150 | insertion into an opcode. pa-risc uses all sorts of weird bitfields |
147 | in the instruction to hold the value. */ | 151 | in the instruction to hold the value. */ |
152 | static inline int sign_unext(int x, int len) | ||
153 | { | ||
154 | int len_ones; | ||
155 | |||
156 | len_ones = (1 << len) - 1; | ||
157 | return x & len_ones; | ||
158 | } | ||
159 | |||
160 | static inline int low_sign_unext(int x, int len) | ||
161 | { | ||
162 | int sign, temp; | ||
163 | |||
164 | sign = (x >> (len-1)) & 1; | ||
165 | temp = sign_unext(x, len-1); | ||
166 | return (temp << 1) | sign; | ||
167 | } | ||
168 | |||
148 | static inline int reassemble_14(int as14) | 169 | static inline int reassemble_14(int as14) |
149 | { | 170 | { |
150 | return (((as14 & 0x1fff) << 1) | | 171 | return (((as14 & 0x1fff) << 1) | |
151 | ((as14 & 0x2000) >> 13)); | 172 | ((as14 & 0x2000) >> 13)); |
152 | } | 173 | } |
153 | 174 | ||
175 | static inline int reassemble_16a(int as16) | ||
176 | { | ||
177 | int s, t; | ||
178 | |||
179 | /* Unusual 16-bit encoding, for wide mode only. */ | ||
180 | t = (as16 << 1) & 0xffff; | ||
181 | s = (as16 & 0x8000); | ||
182 | return (t ^ s ^ (s >> 1)) | (s >> 15); | ||
183 | } | ||
184 | |||
185 | |||
154 | static inline int reassemble_17(int as17) | 186 | static inline int reassemble_17(int as17) |
155 | { | 187 | { |
156 | return (((as17 & 0x10000) >> 16) | | 188 | return (((as17 & 0x10000) >> 16) | |
@@ -407,6 +439,7 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend, | |||
407 | enum elf_stub_type stub_type, Elf_Addr loc0, unsigned int targetsec) | 439 | enum elf_stub_type stub_type, Elf_Addr loc0, unsigned int targetsec) |
408 | { | 440 | { |
409 | struct stub_entry *stub; | 441 | struct stub_entry *stub; |
442 | int __maybe_unused d; | ||
410 | 443 | ||
411 | /* initialize stub_offset to point in front of the section */ | 444 | /* initialize stub_offset to point in front of the section */ |
412 | if (!me->arch.section[targetsec].stub_offset) { | 445 | if (!me->arch.section[targetsec].stub_offset) { |
@@ -460,12 +493,19 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend, | |||
460 | */ | 493 | */ |
461 | switch (stub_type) { | 494 | switch (stub_type) { |
462 | case ELF_STUB_GOT: | 495 | case ELF_STUB_GOT: |
463 | stub->insns[0] = 0x537b0000; /* ldd 0(%dp),%dp */ | 496 | d = get_got(me, value, addend); |
497 | if (d <= 15) { | ||
498 | /* Format 5 */ | ||
499 | stub->insns[0] = 0x0f6010db; /* ldd 0(%dp),%dp */ | ||
500 | stub->insns[0] |= low_sign_unext(d, 5) << 16; | ||
501 | } else { | ||
502 | /* Format 3 */ | ||
503 | stub->insns[0] = 0x537b0000; /* ldd 0(%dp),%dp */ | ||
504 | stub->insns[0] |= reassemble_16a(d); | ||
505 | } | ||
464 | stub->insns[1] = 0x53610020; /* ldd 10(%dp),%r1 */ | 506 | stub->insns[1] = 0x53610020; /* ldd 10(%dp),%r1 */ |
465 | stub->insns[2] = 0xe820d000; /* bve (%r1) */ | 507 | stub->insns[2] = 0xe820d000; /* bve (%r1) */ |
466 | stub->insns[3] = 0x537b0030; /* ldd 18(%dp),%dp */ | 508 | stub->insns[3] = 0x537b0030; /* ldd 18(%dp),%dp */ |
467 | |||
468 | stub->insns[0] |= reassemble_14(get_got(me, value, addend) & 0x3fff); | ||
469 | break; | 509 | break; |
470 | case ELF_STUB_MILLI: | 510 | case ELF_STUB_MILLI: |
471 | stub->insns[0] = 0x20200000; /* ldil 0,%r1 */ | 511 | stub->insns[0] = 0x20200000; /* ldil 0,%r1 */ |
diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c index 7d927eac932b..c07f618ff7da 100644 --- a/arch/parisc/kernel/pci-dma.c +++ b/arch/parisc/kernel/pci-dma.c | |||
@@ -90,12 +90,14 @@ static inline int map_pte_uncached(pte_t * pte, | |||
90 | if (end > PMD_SIZE) | 90 | if (end > PMD_SIZE) |
91 | end = PMD_SIZE; | 91 | end = PMD_SIZE; |
92 | do { | 92 | do { |
93 | unsigned long flags; | ||
94 | |||
93 | if (!pte_none(*pte)) | 95 | if (!pte_none(*pte)) |
94 | printk(KERN_ERR "map_pte_uncached: page already exists\n"); | 96 | printk(KERN_ERR "map_pte_uncached: page already exists\n"); |
95 | set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC)); | 97 | set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC)); |
96 | purge_tlb_start(); | 98 | purge_tlb_start(flags); |
97 | pdtlb_kernel(orig_vaddr); | 99 | pdtlb_kernel(orig_vaddr); |
98 | purge_tlb_end(); | 100 | purge_tlb_end(flags); |
99 | vaddr += PAGE_SIZE; | 101 | vaddr += PAGE_SIZE; |
100 | orig_vaddr += PAGE_SIZE; | 102 | orig_vaddr += PAGE_SIZE; |
101 | (*paddr_ptr) += PAGE_SIZE; | 103 | (*paddr_ptr) += PAGE_SIZE; |
@@ -168,11 +170,13 @@ static inline void unmap_uncached_pte(pmd_t * pmd, unsigned long vaddr, | |||
168 | if (end > PMD_SIZE) | 170 | if (end > PMD_SIZE) |
169 | end = PMD_SIZE; | 171 | end = PMD_SIZE; |
170 | do { | 172 | do { |
173 | unsigned long flags; | ||
171 | pte_t page = *pte; | 174 | pte_t page = *pte; |
175 | |||
172 | pte_clear(&init_mm, vaddr, pte); | 176 | pte_clear(&init_mm, vaddr, pte); |
173 | purge_tlb_start(); | 177 | purge_tlb_start(flags); |
174 | pdtlb_kernel(orig_vaddr); | 178 | pdtlb_kernel(orig_vaddr); |
175 | purge_tlb_end(); | 179 | purge_tlb_end(flags); |
176 | vaddr += PAGE_SIZE; | 180 | vaddr += PAGE_SIZE; |
177 | orig_vaddr += PAGE_SIZE; | 181 | orig_vaddr += PAGE_SIZE; |
178 | pte++; | 182 | pte++; |
diff --git a/arch/parisc/kernel/pci.c b/arch/parisc/kernel/pci.c index 6936386c9861..f7064abc3bb6 100644 --- a/arch/parisc/kernel/pci.c +++ b/arch/parisc/kernel/pci.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* $Id: pci.c,v 1.6 2000/01/29 00:12:05 grundler Exp $ | 1 | /* |
2 | * | ||
3 | * This file is subject to the terms and conditions of the GNU General Public | 2 | * This file is subject to the terms and conditions of the GNU General Public |
4 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
5 | * for more details. | 4 | * for more details. |
diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c index 61c07078c072..1f3aa8db0203 100644 --- a/arch/parisc/kernel/process.c +++ b/arch/parisc/kernel/process.c | |||
@@ -156,7 +156,7 @@ void machine_power_off(void) | |||
156 | * software. The user has to press the button himself. */ | 156 | * software. The user has to press the button himself. */ |
157 | 157 | ||
158 | printk(KERN_EMERG "System shut down completed.\n" | 158 | printk(KERN_EMERG "System shut down completed.\n" |
159 | KERN_EMERG "Please power this system off now."); | 159 | "Please power this system off now."); |
160 | } | 160 | } |
161 | 161 | ||
162 | void (*pm_power_off)(void) = machine_power_off; | 162 | void (*pm_power_off)(void) = machine_power_off; |
diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c index e09d0f7fb6b0..c8fb61ed32f4 100644 --- a/arch/parisc/kernel/processor.c +++ b/arch/parisc/kernel/processor.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* $Id: processor.c,v 1.1 2002/07/20 16:27:06 rhirst Exp $ | 1 | /* |
2 | * | ||
3 | * Initial setup-routines for HP 9000 based hardware. | 2 | * Initial setup-routines for HP 9000 based hardware. |
4 | * | 3 | * |
5 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds | 4 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds |
@@ -121,22 +120,28 @@ static int __cpuinit processor_probe(struct parisc_device *dev) | |||
121 | if (is_pdc_pat()) { | 120 | if (is_pdc_pat()) { |
122 | ulong status; | 121 | ulong status; |
123 | unsigned long bytecnt; | 122 | unsigned long bytecnt; |
124 | pdc_pat_cell_mod_maddr_block_t pa_pdc_cell; | 123 | pdc_pat_cell_mod_maddr_block_t *pa_pdc_cell; |
125 | #undef USE_PAT_CPUID | 124 | #undef USE_PAT_CPUID |
126 | #ifdef USE_PAT_CPUID | 125 | #ifdef USE_PAT_CPUID |
127 | struct pdc_pat_cpu_num cpu_info; | 126 | struct pdc_pat_cpu_num cpu_info; |
128 | #endif | 127 | #endif |
129 | 128 | ||
129 | pa_pdc_cell = kmalloc(sizeof (*pa_pdc_cell), GFP_KERNEL); | ||
130 | if (!pa_pdc_cell) | ||
131 | panic("couldn't allocate memory for PDC_PAT_CELL!"); | ||
132 | |||
130 | status = pdc_pat_cell_module(&bytecnt, dev->pcell_loc, | 133 | status = pdc_pat_cell_module(&bytecnt, dev->pcell_loc, |
131 | dev->mod_index, PA_VIEW, &pa_pdc_cell); | 134 | dev->mod_index, PA_VIEW, pa_pdc_cell); |
132 | 135 | ||
133 | BUG_ON(PDC_OK != status); | 136 | BUG_ON(PDC_OK != status); |
134 | 137 | ||
135 | /* verify it's the same as what do_pat_inventory() found */ | 138 | /* verify it's the same as what do_pat_inventory() found */ |
136 | BUG_ON(dev->mod_info != pa_pdc_cell.mod_info); | 139 | BUG_ON(dev->mod_info != pa_pdc_cell->mod_info); |
137 | BUG_ON(dev->pmod_loc != pa_pdc_cell.mod_location); | 140 | BUG_ON(dev->pmod_loc != pa_pdc_cell->mod_location); |
141 | |||
142 | txn_addr = pa_pdc_cell->mod[0]; /* id_eid for IO sapic */ | ||
138 | 143 | ||
139 | txn_addr = pa_pdc_cell.mod[0]; /* id_eid for IO sapic */ | 144 | kfree(pa_pdc_cell); |
140 | 145 | ||
141 | #ifdef USE_PAT_CPUID | 146 | #ifdef USE_PAT_CPUID |
142 | /* We need contiguous numbers for cpuid. Firmware's notion | 147 | /* We need contiguous numbers for cpuid. Firmware's notion |
diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c index 82131ca8e05c..cb71f3dac995 100644 --- a/arch/parisc/kernel/setup.c +++ b/arch/parisc/kernel/setup.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* $Id: setup.c,v 1.8 2000/02/02 04:42:38 prumpf Exp $ | 1 | /* |
2 | * | ||
3 | * Initial setup-routines for HP 9000 based hardware. | 2 | * Initial setup-routines for HP 9000 based hardware. |
4 | * | 3 | * |
5 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds | 4 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds |
diff --git a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c index 1adb40c81669..92a0acaa0d12 100644 --- a/arch/parisc/kernel/sys_parisc32.c +++ b/arch/parisc/kernel/sys_parisc32.c | |||
@@ -174,68 +174,6 @@ asmlinkage long sys32_sched_rr_get_interval(pid_t pid, | |||
174 | return ret; | 174 | return ret; |
175 | } | 175 | } |
176 | 176 | ||
177 | /*** copied from mips64 ***/ | ||
178 | /* | ||
179 | * Ooo, nasty. We need here to frob 32-bit unsigned longs to | ||
180 | * 64-bit unsigned longs. | ||
181 | */ | ||
182 | |||
183 | static inline int | ||
184 | get_fd_set32(unsigned long n, u32 *ufdset, unsigned long *fdset) | ||
185 | { | ||
186 | n = (n + 8*sizeof(u32) - 1) / (8*sizeof(u32)); | ||
187 | if (ufdset) { | ||
188 | unsigned long odd; | ||
189 | |||
190 | if (!access_ok(VERIFY_WRITE, ufdset, n*sizeof(u32))) | ||
191 | return -EFAULT; | ||
192 | |||
193 | odd = n & 1UL; | ||
194 | n &= ~1UL; | ||
195 | while (n) { | ||
196 | unsigned long h, l; | ||
197 | __get_user(l, ufdset); | ||
198 | __get_user(h, ufdset+1); | ||
199 | ufdset += 2; | ||
200 | *fdset++ = h << 32 | l; | ||
201 | n -= 2; | ||
202 | } | ||
203 | if (odd) | ||
204 | __get_user(*fdset, ufdset); | ||
205 | } else { | ||
206 | /* Tricky, must clear full unsigned long in the | ||
207 | * kernel fdset at the end, this makes sure that | ||
208 | * actually happens. | ||
209 | */ | ||
210 | memset(fdset, 0, ((n + 1) & ~1)*sizeof(u32)); | ||
211 | } | ||
212 | return 0; | ||
213 | } | ||
214 | |||
215 | static inline void | ||
216 | set_fd_set32(unsigned long n, u32 *ufdset, unsigned long *fdset) | ||
217 | { | ||
218 | unsigned long odd; | ||
219 | n = (n + 8*sizeof(u32) - 1) / (8*sizeof(u32)); | ||
220 | |||
221 | if (!ufdset) | ||
222 | return; | ||
223 | |||
224 | odd = n & 1UL; | ||
225 | n &= ~1UL; | ||
226 | while (n) { | ||
227 | unsigned long h, l; | ||
228 | l = *fdset++; | ||
229 | h = l >> 32; | ||
230 | __put_user(l, ufdset); | ||
231 | __put_user(h, ufdset+1); | ||
232 | ufdset += 2; | ||
233 | n -= 2; | ||
234 | } | ||
235 | if (odd) | ||
236 | __put_user(*fdset, ufdset); | ||
237 | } | ||
238 | |||
239 | struct msgbuf32 { | 177 | struct msgbuf32 { |
240 | int mtype; | 178 | int mtype; |
241 | char mtext[1]; | 179 | char mtext[1]; |
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index 03b9a01bc16c..cf145eb026b3 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
@@ -413,6 +413,10 @@ | |||
413 | ENTRY_SAME(dup3) | 413 | ENTRY_SAME(dup3) |
414 | ENTRY_SAME(pipe2) | 414 | ENTRY_SAME(pipe2) |
415 | ENTRY_SAME(inotify_init1) | 415 | ENTRY_SAME(inotify_init1) |
416 | ENTRY_COMP(preadv) /* 315 */ | ||
417 | ENTRY_COMP(pwritev) | ||
418 | ENTRY_COMP(rt_tgsigqueueinfo) | ||
419 | ENTRY_SAME(perf_counter_open) | ||
416 | 420 | ||
417 | /* Nothing yet */ | 421 | /* Nothing yet */ |
418 | 422 | ||
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index d4dd05674c62..a79c6f9e7e2c 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c | |||
@@ -56,9 +56,9 @@ static unsigned long clocktick __read_mostly; /* timer cycles per tick */ | |||
56 | */ | 56 | */ |
57 | irqreturn_t __irq_entry timer_interrupt(int irq, void *dev_id) | 57 | irqreturn_t __irq_entry timer_interrupt(int irq, void *dev_id) |
58 | { | 58 | { |
59 | unsigned long now; | 59 | unsigned long now, now2; |
60 | unsigned long next_tick; | 60 | unsigned long next_tick; |
61 | unsigned long cycles_elapsed, ticks_elapsed; | 61 | unsigned long cycles_elapsed, ticks_elapsed = 1; |
62 | unsigned long cycles_remainder; | 62 | unsigned long cycles_remainder; |
63 | unsigned int cpu = smp_processor_id(); | 63 | unsigned int cpu = smp_processor_id(); |
64 | struct cpuinfo_parisc *cpuinfo = &per_cpu(cpu_data, cpu); | 64 | struct cpuinfo_parisc *cpuinfo = &per_cpu(cpu_data, cpu); |
@@ -71,44 +71,24 @@ irqreturn_t __irq_entry timer_interrupt(int irq, void *dev_id) | |||
71 | /* Initialize next_tick to the expected tick time. */ | 71 | /* Initialize next_tick to the expected tick time. */ |
72 | next_tick = cpuinfo->it_value; | 72 | next_tick = cpuinfo->it_value; |
73 | 73 | ||
74 | /* Get current interval timer. | 74 | /* Get current cycle counter (Control Register 16). */ |
75 | * CR16 reads as 64 bits in CPU wide mode. | ||
76 | * CR16 reads as 32 bits in CPU narrow mode. | ||
77 | */ | ||
78 | now = mfctl(16); | 75 | now = mfctl(16); |
79 | 76 | ||
80 | cycles_elapsed = now - next_tick; | 77 | cycles_elapsed = now - next_tick; |
81 | 78 | ||
82 | if ((cycles_elapsed >> 5) < cpt) { | 79 | if ((cycles_elapsed >> 6) < cpt) { |
83 | /* use "cheap" math (add/subtract) instead | 80 | /* use "cheap" math (add/subtract) instead |
84 | * of the more expensive div/mul method | 81 | * of the more expensive div/mul method |
85 | */ | 82 | */ |
86 | cycles_remainder = cycles_elapsed; | 83 | cycles_remainder = cycles_elapsed; |
87 | ticks_elapsed = 1; | ||
88 | while (cycles_remainder > cpt) { | 84 | while (cycles_remainder > cpt) { |
89 | cycles_remainder -= cpt; | 85 | cycles_remainder -= cpt; |
90 | ticks_elapsed++; | 86 | ticks_elapsed++; |
91 | } | 87 | } |
92 | } else { | 88 | } else { |
89 | /* TODO: Reduce this to one fdiv op */ | ||
93 | cycles_remainder = cycles_elapsed % cpt; | 90 | cycles_remainder = cycles_elapsed % cpt; |
94 | ticks_elapsed = 1 + cycles_elapsed / cpt; | 91 | ticks_elapsed += cycles_elapsed / cpt; |
95 | } | ||
96 | |||
97 | /* Can we differentiate between "early CR16" (aka Scenario 1) and | ||
98 | * "long delay" (aka Scenario 3)? I don't think so. | ||
99 | * | ||
100 | * We expected timer_interrupt to be delivered at least a few hundred | ||
101 | * cycles after the IT fires. But it's arbitrary how much time passes | ||
102 | * before we call it "late". I've picked one second. | ||
103 | */ | ||
104 | if (unlikely(ticks_elapsed > HZ)) { | ||
105 | /* Scenario 3: very long delay? bad in any case */ | ||
106 | printk (KERN_CRIT "timer_interrupt(CPU %d): delayed!" | ||
107 | " cycles %lX rem %lX " | ||
108 | " next/now %lX/%lX\n", | ||
109 | cpu, | ||
110 | cycles_elapsed, cycles_remainder, | ||
111 | next_tick, now ); | ||
112 | } | 92 | } |
113 | 93 | ||
114 | /* convert from "division remainder" to "remainder of clock tick" */ | 94 | /* convert from "division remainder" to "remainder of clock tick" */ |
@@ -122,18 +102,56 @@ irqreturn_t __irq_entry timer_interrupt(int irq, void *dev_id) | |||
122 | 102 | ||
123 | cpuinfo->it_value = next_tick; | 103 | cpuinfo->it_value = next_tick; |
124 | 104 | ||
125 | /* Skip one clocktick on purpose if we are likely to miss next_tick. | 105 | /* Program the IT when to deliver the next interrupt. |
126 | * We want to avoid the new next_tick being less than CR16. | 106 | * Only bottom 32-bits of next_tick are writable in CR16! |
127 | * If that happened, itimer wouldn't fire until CR16 wrapped. | ||
128 | * We'll catch the tick we missed on the tick after that. | ||
129 | */ | 107 | */ |
130 | if (!(cycles_remainder >> 13)) | ||
131 | next_tick += cpt; | ||
132 | |||
133 | /* Program the IT when to deliver the next interrupt. */ | ||
134 | /* Only bottom 32-bits of next_tick are written to cr16. */ | ||
135 | mtctl(next_tick, 16); | 108 | mtctl(next_tick, 16); |
136 | 109 | ||
110 | /* Skip one clocktick on purpose if we missed next_tick. | ||
111 | * The new CR16 must be "later" than current CR16 otherwise | ||
112 | * itimer would not fire until CR16 wrapped - e.g 4 seconds | ||
113 | * later on a 1Ghz processor. We'll account for the missed | ||
114 | * tick on the next timer interrupt. | ||
115 | * | ||
116 | * "next_tick - now" will always give the difference regardless | ||
117 | * if one or the other wrapped. If "now" is "bigger" we'll end up | ||
118 | * with a very large unsigned number. | ||
119 | */ | ||
120 | now2 = mfctl(16); | ||
121 | if (next_tick - now2 > cpt) | ||
122 | mtctl(next_tick+cpt, 16); | ||
123 | |||
124 | #if 1 | ||
125 | /* | ||
126 | * GGG: DEBUG code for how many cycles programming CR16 used. | ||
127 | */ | ||
128 | if (unlikely(now2 - now > 0x3000)) /* 12K cycles */ | ||
129 | printk (KERN_CRIT "timer_interrupt(CPU %d): SLOW! 0x%lx cycles!" | ||
130 | " cyc %lX rem %lX " | ||
131 | " next/now %lX/%lX\n", | ||
132 | cpu, now2 - now, cycles_elapsed, cycles_remainder, | ||
133 | next_tick, now ); | ||
134 | #endif | ||
135 | |||
136 | /* Can we differentiate between "early CR16" (aka Scenario 1) and | ||
137 | * "long delay" (aka Scenario 3)? I don't think so. | ||
138 | * | ||
139 | * Timer_interrupt will be delivered at least a few hundred cycles | ||
140 | * after the IT fires. But it's arbitrary how much time passes | ||
141 | * before we call it "late". I've picked one second. | ||
142 | * | ||
143 | * It's important NO printk's are between reading CR16 and | ||
144 | * setting up the next value. May introduce huge variance. | ||
145 | */ | ||
146 | if (unlikely(ticks_elapsed > HZ)) { | ||
147 | /* Scenario 3: very long delay? bad in any case */ | ||
148 | printk (KERN_CRIT "timer_interrupt(CPU %d): delayed!" | ||
149 | " cycles %lX rem %lX " | ||
150 | " next/now %lX/%lX\n", | ||
151 | cpu, | ||
152 | cycles_elapsed, cycles_remainder, | ||
153 | next_tick, now ); | ||
154 | } | ||
137 | 155 | ||
138 | /* Done mucking with unreliable delivery of interrupts. | 156 | /* Done mucking with unreliable delivery of interrupts. |
139 | * Go do system house keeping. | 157 | * Go do system house keeping. |
@@ -173,7 +191,7 @@ EXPORT_SYMBOL(profile_pc); | |||
173 | 191 | ||
174 | /* clock source code */ | 192 | /* clock source code */ |
175 | 193 | ||
176 | static cycle_t read_cr16(void) | 194 | static cycle_t read_cr16(struct clocksource *cs) |
177 | { | 195 | { |
178 | return get_cycles(); | 196 | return get_cycles(); |
179 | } | 197 | } |
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index c32f5d6d778e..528f0ff9b273 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
@@ -250,15 +250,14 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err) | |||
250 | oops_enter(); | 250 | oops_enter(); |
251 | 251 | ||
252 | /* Amuse the user in a SPARC fashion */ | 252 | /* Amuse the user in a SPARC fashion */ |
253 | if (err) printk( | 253 | if (err) printk(KERN_CRIT |
254 | KERN_CRIT " _______________________________ \n" | 254 | " _______________________________ \n" |
255 | KERN_CRIT " < Your System ate a SPARC! Gah! >\n" | 255 | " < Your System ate a SPARC! Gah! >\n" |
256 | KERN_CRIT " ------------------------------- \n" | 256 | " ------------------------------- \n" |
257 | KERN_CRIT " \\ ^__^\n" | 257 | " \\ ^__^\n" |
258 | KERN_CRIT " \\ (xx)\\_______\n" | 258 | " (__)\\ )\\/\\\n" |
259 | KERN_CRIT " (__)\\ )\\/\\\n" | 259 | " U ||----w |\n" |
260 | KERN_CRIT " U ||----w |\n" | 260 | " || ||\n"); |
261 | KERN_CRIT " || ||\n"); | ||
262 | 261 | ||
263 | /* unlock the pdc lock if necessary */ | 262 | /* unlock the pdc lock if necessary */ |
264 | pdc_emergency_unlock(); | 263 | pdc_emergency_unlock(); |
@@ -797,7 +796,8 @@ void notrace handle_interruption(int code, struct pt_regs *regs) | |||
797 | else | 796 | else |
798 | printk(KERN_DEBUG "User Fault (long pointer) (fault %d) ", | 797 | printk(KERN_DEBUG "User Fault (long pointer) (fault %d) ", |
799 | code); | 798 | code); |
800 | printk("pid=%d command='%s'\n", task_pid_nr(current), current->comm); | 799 | printk(KERN_CONT "pid=%d command='%s'\n", |
800 | task_pid_nr(current), current->comm); | ||
801 | show_regs(regs); | 801 | show_regs(regs); |
802 | #endif | 802 | #endif |
803 | si.si_signo = SIGSEGV; | 803 | si.si_signo = SIGSEGV; |
diff --git a/arch/parisc/lib/checksum.c b/arch/parisc/lib/checksum.c index 462696d30d3b..ae66d31f9ecf 100644 --- a/arch/parisc/lib/checksum.c +++ b/arch/parisc/lib/checksum.c | |||
@@ -13,8 +13,6 @@ | |||
13 | * modify it under the terms of the GNU General Public License | 13 | * modify it under the terms of the GNU General Public License |
14 | * as published by the Free Software Foundation; either version | 14 | * as published by the Free Software Foundation; either version |
15 | * 2 of the License, or (at your option) any later version. | 15 | * 2 of the License, or (at your option) any later version. |
16 | * | ||
17 | * $Id: checksum.c,v 1.3 1997/12/01 17:57:34 ralf Exp $ | ||
18 | */ | 16 | */ |
19 | #include <linux/module.h> | 17 | #include <linux/module.h> |
20 | #include <linux/types.h> | 18 | #include <linux/types.h> |
diff --git a/arch/parisc/lib/memcpy.c b/arch/parisc/lib/memcpy.c index bbda909c866e..abf41f4632a9 100644 --- a/arch/parisc/lib/memcpy.c +++ b/arch/parisc/lib/memcpy.c | |||
@@ -405,7 +405,7 @@ byte_copy: | |||
405 | 405 | ||
406 | unaligned_copy: | 406 | unaligned_copy: |
407 | /* possibly we are aligned on a word, but not on a double... */ | 407 | /* possibly we are aligned on a word, but not on a double... */ |
408 | if (likely(t1 & (sizeof(unsigned int)-1)) == 0) { | 408 | if (likely((t1 & (sizeof(unsigned int)-1)) == 0)) { |
409 | t2 = src & (sizeof(unsigned int) - 1); | 409 | t2 = src & (sizeof(unsigned int) - 1); |
410 | 410 | ||
411 | if (unlikely(t2 != 0)) { | 411 | if (unlikely(t2 != 0)) { |
diff --git a/arch/parisc/math-emu/decode_exc.c b/arch/parisc/math-emu/decode_exc.c index 66c8a9f6a27e..3ca1c6149218 100644 --- a/arch/parisc/math-emu/decode_exc.c +++ b/arch/parisc/math-emu/decode_exc.c | |||
@@ -40,7 +40,7 @@ | |||
40 | * END_DESC | 40 | * END_DESC |
41 | */ | 41 | */ |
42 | 42 | ||
43 | 43 | #include <linux/kernel.h> | |
44 | #include "float.h" | 44 | #include "float.h" |
45 | #include "sgl_float.h" | 45 | #include "sgl_float.h" |
46 | #include "dbl_float.h" | 46 | #include "dbl_float.h" |
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c index bfb6dd6ab380..c6afbfc95770 100644 --- a/arch/parisc/mm/fault.c +++ b/arch/parisc/mm/fault.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* $Id: fault.c,v 1.5 2000/01/26 16:20:29 jsm Exp $ | 1 | /* |
2 | * | ||
3 | * This file is subject to the terms and conditions of the GNU General Public | 2 | * This file is subject to the terms and conditions of the GNU General Public |
4 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
5 | * for more details. | 4 | * for more details. |
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index 4356ceb1e366..b0831d9e35cb 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c | |||
@@ -370,34 +370,22 @@ static void __init setup_bootmem(void) | |||
370 | 370 | ||
371 | void free_initmem(void) | 371 | void free_initmem(void) |
372 | { | 372 | { |
373 | unsigned long addr, init_begin, init_end; | 373 | unsigned long addr; |
374 | 374 | unsigned long init_begin = (unsigned long)__init_begin; | |
375 | printk(KERN_INFO "Freeing unused kernel memory: "); | 375 | unsigned long init_end = (unsigned long)__init_end; |
376 | 376 | ||
377 | #ifdef CONFIG_DEBUG_KERNEL | 377 | #ifdef CONFIG_DEBUG_KERNEL |
378 | /* Attempt to catch anyone trying to execute code here | 378 | /* Attempt to catch anyone trying to execute code here |
379 | * by filling the page with BRK insns. | 379 | * by filling the page with BRK insns. |
380 | * | ||
381 | * If we disable interrupts for all CPUs, then IPI stops working. | ||
382 | * Kinda breaks the global cache flushing. | ||
383 | */ | 380 | */ |
384 | local_irq_disable(); | 381 | memset((void *)init_begin, 0x00, init_end - init_begin); |
385 | 382 | flush_icache_range(init_begin, init_end); | |
386 | memset(__init_begin, 0x00, | ||
387 | (unsigned long)__init_end - (unsigned long)__init_begin); | ||
388 | |||
389 | flush_data_cache(); | ||
390 | asm volatile("sync" : : ); | ||
391 | flush_icache_range((unsigned long)__init_begin, (unsigned long)__init_end); | ||
392 | asm volatile("sync" : : ); | ||
393 | |||
394 | local_irq_enable(); | ||
395 | #endif | 383 | #endif |
396 | 384 | ||
397 | /* align __init_begin and __init_end to page size, | 385 | /* align __init_begin and __init_end to page size, |
398 | ignoring linker script where we might have tried to save RAM */ | 386 | ignoring linker script where we might have tried to save RAM */ |
399 | init_begin = PAGE_ALIGN((unsigned long)(__init_begin)); | 387 | init_begin = PAGE_ALIGN(init_begin); |
400 | init_end = PAGE_ALIGN((unsigned long)(__init_end)); | 388 | init_end = PAGE_ALIGN(init_end); |
401 | for (addr = init_begin; addr < init_end; addr += PAGE_SIZE) { | 389 | for (addr = init_begin; addr < init_end; addr += PAGE_SIZE) { |
402 | ClearPageReserved(virt_to_page(addr)); | 390 | ClearPageReserved(virt_to_page(addr)); |
403 | init_page_count(virt_to_page(addr)); | 391 | init_page_count(virt_to_page(addr)); |
@@ -409,7 +397,8 @@ void free_initmem(void) | |||
409 | /* set up a new led state on systems shipped LED State panel */ | 397 | /* set up a new led state on systems shipped LED State panel */ |
410 | pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BCOMPLETE); | 398 | pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BCOMPLETE); |
411 | 399 | ||
412 | printk("%luk freed\n", (init_end - init_begin) >> 10); | 400 | printk(KERN_INFO "Freeing unused kernel memory: %luk freed\n", |
401 | (init_end - init_begin) >> 10); | ||
413 | } | 402 | } |
414 | 403 | ||
415 | 404 | ||