diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-26 15:48:06 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-26 15:48:06 -0500 |
commit | b0138a6cb7923a997d278b47c176778534d1095b (patch) | |
tree | 4fcb8822a69631baba568e4e1942847747123887 /arch/parisc/kernel | |
parent | 6572d6d7d0f965dda19d02af804ed3ae4b3bf1fc (diff) | |
parent | 1055a8af093fea7490445bd15cd671020e542035 (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6: (78 commits)
[PARISC] Use symbolic last syscall in __NR_Linux_syscalls
[PARISC] Add missing statfs64 and fstatfs64 syscalls
Revert "[PARISC] Optimize TLB flush on SMP systems"
[PARISC] Compat signal fixes for 64-bit parisc
[PARISC] Reorder syscalls to match unistd.h
Revert "[PATCH] make kernel/signal.c:kill_proc_info() static"
[PARISC] fix sys_rt_sigqueueinfo
[PARISC] fix section mismatch warnings in harmony sound driver
[PARISC] do not export get_register/set_register
[PARISC] add ENTRY()/ENDPROC() and simplify assembly of HP/UX emulation code
[PARISC] convert to use CONFIG_64BIT instead of __LP64__
[PARISC] use CONFIG_64BIT instead of __LP64__
[PARISC] add ASM_EXCEPTIONTABLE_ENTRY() macro
[PARISC] more ENTRY(), ENDPROC(), END() conversions
[PARISC] fix ENTRY() and ENDPROC() for 64bit-parisc
[PARISC] Fixes /proc/cpuinfo cache output on B160L
[PARISC] implement standard ENTRY(), END() and ENDPROC()
[PARISC] kill ENTRY_SYS_CPUS
[PARISC] clean up debugging printks in smp.c
[PARISC] factor syscall_restart code out of do_signal
...
Fix conflict in include/linux/sched.h due to kill_proc_info() being made
publicly available to PARISC again.
Diffstat (limited to 'arch/parisc/kernel')
30 files changed, 780 insertions, 945 deletions
diff --git a/arch/parisc/kernel/asm-offsets.c b/arch/parisc/kernel/asm-offsets.c index c11a5bc7c067..54fdb959149c 100644 --- a/arch/parisc/kernel/asm-offsets.c +++ b/arch/parisc/kernel/asm-offsets.c | |||
@@ -44,7 +44,7 @@ | |||
44 | 44 | ||
45 | #define BLANK() asm volatile("\n->" : : ) | 45 | #define BLANK() asm volatile("\n->" : : ) |
46 | 46 | ||
47 | #ifdef __LP64__ | 47 | #ifdef CONFIG_64BIT |
48 | #define FRAME_SIZE 128 | 48 | #define FRAME_SIZE 128 |
49 | #else | 49 | #else |
50 | #define FRAME_SIZE 64 | 50 | #define FRAME_SIZE 64 |
diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index 0be51e92a2fc..0dc924ccceb5 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c | |||
@@ -68,16 +68,6 @@ flush_cache_all_local(void) | |||
68 | } | 68 | } |
69 | EXPORT_SYMBOL(flush_cache_all_local); | 69 | EXPORT_SYMBOL(flush_cache_all_local); |
70 | 70 | ||
71 | /* flushes EVERYTHING (tlb & cache) */ | ||
72 | |||
73 | void | ||
74 | flush_all_caches(void) | ||
75 | { | ||
76 | flush_cache_all(); | ||
77 | flush_tlb_all(); | ||
78 | } | ||
79 | EXPORT_SYMBOL(flush_all_caches); | ||
80 | |||
81 | void | 71 | void |
82 | update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) | 72 | update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) |
83 | { | 73 | { |
@@ -99,7 +89,7 @@ show_cache_info(struct seq_file *m) | |||
99 | 89 | ||
100 | seq_printf(m, "I-cache\t\t: %ld KB\n", | 90 | seq_printf(m, "I-cache\t\t: %ld KB\n", |
101 | cache_info.ic_size/1024 ); | 91 | cache_info.ic_size/1024 ); |
102 | if (cache_info.dc_loop == 1) | 92 | if (cache_info.dc_loop != 1) |
103 | snprintf(buf, 32, "%lu-way associative", cache_info.dc_loop); | 93 | snprintf(buf, 32, "%lu-way associative", cache_info.dc_loop); |
104 | seq_printf(m, "D-cache\t\t: %ld KB (%s%s, %s)\n", | 94 | seq_printf(m, "D-cache\t\t: %ld KB (%s%s, %s)\n", |
105 | cache_info.dc_size/1024, | 95 | cache_info.dc_size/1024, |
@@ -270,6 +260,83 @@ void disable_sr_hashing(void) | |||
270 | panic("SpaceID hashing is still on!\n"); | 260 | panic("SpaceID hashing is still on!\n"); |
271 | } | 261 | } |
272 | 262 | ||
263 | /* Simple function to work out if we have an existing address translation | ||
264 | * for a user space vma. */ | ||
265 | static inline int translation_exists(struct vm_area_struct *vma, | ||
266 | unsigned long addr, unsigned long pfn) | ||
267 | { | ||
268 | pgd_t *pgd = pgd_offset(vma->vm_mm, addr); | ||
269 | pmd_t *pmd; | ||
270 | pte_t pte; | ||
271 | |||
272 | if(pgd_none(*pgd)) | ||
273 | return 0; | ||
274 | |||
275 | pmd = pmd_offset(pgd, addr); | ||
276 | if(pmd_none(*pmd) || pmd_bad(*pmd)) | ||
277 | return 0; | ||
278 | |||
279 | /* We cannot take the pte lock here: flush_cache_page is usually | ||
280 | * called with pte lock already held. Whereas flush_dcache_page | ||
281 | * takes flush_dcache_mmap_lock, which is lower in the hierarchy: | ||
282 | * the vma itself is secure, but the pte might come or go racily. | ||
283 | */ | ||
284 | pte = *pte_offset_map(pmd, addr); | ||
285 | /* But pte_unmap() does nothing on this architecture */ | ||
286 | |||
287 | /* Filter out coincidental file entries and swap entries */ | ||
288 | if (!(pte_val(pte) & (_PAGE_FLUSH|_PAGE_PRESENT))) | ||
289 | return 0; | ||
290 | |||
291 | return pte_pfn(pte) == pfn; | ||
292 | } | ||
293 | |||
294 | /* Private function to flush a page from the cache of a non-current | ||
295 | * process. cr25 contains the Page Directory of the current user | ||
296 | * process; we're going to hijack both it and the user space %sr3 to | ||
297 | * temporarily make the non-current process current. We have to do | ||
298 | * this because cache flushing may cause a non-access tlb miss which | ||
299 | * the handlers have to fill in from the pgd of the non-current | ||
300 | * process. */ | ||
301 | static inline void | ||
302 | flush_user_cache_page_non_current(struct vm_area_struct *vma, | ||
303 | unsigned long vmaddr) | ||
304 | { | ||
305 | /* save the current process space and pgd */ | ||
306 | unsigned long space = mfsp(3), pgd = mfctl(25); | ||
307 | |||
308 | /* we don't mind taking interrups since they may not | ||
309 | * do anything with user space, but we can't | ||
310 | * be preempted here */ | ||
311 | preempt_disable(); | ||
312 | |||
313 | /* make us current */ | ||
314 | mtctl(__pa(vma->vm_mm->pgd), 25); | ||
315 | mtsp(vma->vm_mm->context, 3); | ||
316 | |||
317 | flush_user_dcache_page(vmaddr); | ||
318 | if(vma->vm_flags & VM_EXEC) | ||
319 | flush_user_icache_page(vmaddr); | ||
320 | |||
321 | /* put the old current process back */ | ||
322 | mtsp(space, 3); | ||
323 | mtctl(pgd, 25); | ||
324 | preempt_enable(); | ||
325 | } | ||
326 | |||
327 | |||
328 | static inline void | ||
329 | __flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr) | ||
330 | { | ||
331 | if (likely(vma->vm_mm->context == mfsp(3))) { | ||
332 | flush_user_dcache_page(vmaddr); | ||
333 | if (vma->vm_flags & VM_EXEC) | ||
334 | flush_user_icache_page(vmaddr); | ||
335 | } else { | ||
336 | flush_user_cache_page_non_current(vma, vmaddr); | ||
337 | } | ||
338 | } | ||
339 | |||
273 | void flush_dcache_page(struct page *page) | 340 | void flush_dcache_page(struct page *page) |
274 | { | 341 | { |
275 | struct address_space *mapping = page_mapping(page); | 342 | struct address_space *mapping = page_mapping(page); |
@@ -342,7 +409,7 @@ void clear_user_page_asm(void *page, unsigned long vaddr) | |||
342 | #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */ | 409 | #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */ |
343 | int parisc_cache_flush_threshold __read_mostly = FLUSH_THRESHOLD; | 410 | int parisc_cache_flush_threshold __read_mostly = FLUSH_THRESHOLD; |
344 | 411 | ||
345 | void parisc_setup_cache_timing(void) | 412 | void __init parisc_setup_cache_timing(void) |
346 | { | 413 | { |
347 | unsigned long rangetime, alltime; | 414 | unsigned long rangetime, alltime; |
348 | unsigned long size; | 415 | unsigned long size; |
@@ -366,6 +433,9 @@ void parisc_setup_cache_timing(void) | |||
366 | if (!parisc_cache_flush_threshold) | 433 | if (!parisc_cache_flush_threshold) |
367 | parisc_cache_flush_threshold = FLUSH_THRESHOLD; | 434 | parisc_cache_flush_threshold = FLUSH_THRESHOLD; |
368 | 435 | ||
436 | if (parisc_cache_flush_threshold > cache_info.dc_size) | ||
437 | parisc_cache_flush_threshold = cache_info.dc_size; | ||
438 | |||
369 | printk(KERN_INFO "Setting cache flush threshold to %x (%d CPUs online)\n", parisc_cache_flush_threshold, num_online_cpus()); | 439 | printk(KERN_INFO "Setting cache flush threshold to %x (%d CPUs online)\n", parisc_cache_flush_threshold, num_online_cpus()); |
370 | } | 440 | } |
371 | 441 | ||
@@ -410,3 +480,97 @@ void kunmap_parisc(void *addr) | |||
410 | } | 480 | } |
411 | EXPORT_SYMBOL(kunmap_parisc); | 481 | EXPORT_SYMBOL(kunmap_parisc); |
412 | #endif | 482 | #endif |
483 | |||
484 | void __flush_tlb_range(unsigned long sid, unsigned long start, | ||
485 | unsigned long end) | ||
486 | { | ||
487 | unsigned long npages; | ||
488 | |||
489 | npages = ((end - (start & PAGE_MASK)) + (PAGE_SIZE - 1)) >> PAGE_SHIFT; | ||
490 | if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */ | ||
491 | flush_tlb_all(); | ||
492 | else { | ||
493 | mtsp(sid, 1); | ||
494 | purge_tlb_start(); | ||
495 | if (split_tlb) { | ||
496 | while (npages--) { | ||
497 | pdtlb(start); | ||
498 | pitlb(start); | ||
499 | start += PAGE_SIZE; | ||
500 | } | ||
501 | } else { | ||
502 | while (npages--) { | ||
503 | pdtlb(start); | ||
504 | start += PAGE_SIZE; | ||
505 | } | ||
506 | } | ||
507 | purge_tlb_end(); | ||
508 | } | ||
509 | } | ||
510 | |||
511 | static void cacheflush_h_tmp_function(void *dummy) | ||
512 | { | ||
513 | flush_cache_all_local(); | ||
514 | } | ||
515 | |||
516 | void flush_cache_all(void) | ||
517 | { | ||
518 | on_each_cpu(cacheflush_h_tmp_function, NULL, 1, 1); | ||
519 | } | ||
520 | |||
521 | void flush_cache_mm(struct mm_struct *mm) | ||
522 | { | ||
523 | #ifdef CONFIG_SMP | ||
524 | flush_cache_all(); | ||
525 | #else | ||
526 | flush_cache_all_local(); | ||
527 | #endif | ||
528 | } | ||
529 | |||
530 | void | ||
531 | flush_user_dcache_range(unsigned long start, unsigned long end) | ||
532 | { | ||
533 | if ((end - start) < parisc_cache_flush_threshold) | ||
534 | flush_user_dcache_range_asm(start,end); | ||
535 | else | ||
536 | flush_data_cache(); | ||
537 | } | ||
538 | |||
539 | void | ||
540 | flush_user_icache_range(unsigned long start, unsigned long end) | ||
541 | { | ||
542 | if ((end - start) < parisc_cache_flush_threshold) | ||
543 | flush_user_icache_range_asm(start,end); | ||
544 | else | ||
545 | flush_instruction_cache(); | ||
546 | } | ||
547 | |||
548 | |||
549 | void flush_cache_range(struct vm_area_struct *vma, | ||
550 | unsigned long start, unsigned long end) | ||
551 | { | ||
552 | int sr3; | ||
553 | |||
554 | if (!vma->vm_mm->context) { | ||
555 | BUG(); | ||
556 | return; | ||
557 | } | ||
558 | |||
559 | sr3 = mfsp(3); | ||
560 | if (vma->vm_mm->context == sr3) { | ||
561 | flush_user_dcache_range(start,end); | ||
562 | flush_user_icache_range(start,end); | ||
563 | } else { | ||
564 | flush_cache_all(); | ||
565 | } | ||
566 | } | ||
567 | |||
568 | void | ||
569 | flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long pfn) | ||
570 | { | ||
571 | BUG_ON(!vma->vm_mm->context); | ||
572 | |||
573 | if (likely(translation_exists(vma, vmaddr, pfn))) | ||
574 | __flush_cache_page(vma, vmaddr); | ||
575 | |||
576 | } | ||
diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c index d6c486e9501c..2ca654bd6322 100644 --- a/arch/parisc/kernel/drivers.c +++ b/arch/parisc/kernel/drivers.c | |||
@@ -562,12 +562,23 @@ pa_dev_attr(rev, id.hversion_rev, "0x%x\n"); | |||
562 | pa_dev_attr_id(hversion, "0x%03x\n"); | 562 | pa_dev_attr_id(hversion, "0x%03x\n"); |
563 | pa_dev_attr_id(sversion, "0x%05x\n"); | 563 | pa_dev_attr_id(sversion, "0x%05x\n"); |
564 | 564 | ||
565 | static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf) | ||
566 | { | ||
567 | struct parisc_device *padev = to_parisc_device(dev); | ||
568 | struct parisc_device_id *id = &padev->id; | ||
569 | |||
570 | return sprintf(buf, "parisc:t%02Xhv%04Xrev%02Xsv%08X\n", | ||
571 | (u8)id->hw_type, (u16)id->hversion, (u8)id->hversion_rev, | ||
572 | (u32)id->sversion); | ||
573 | } | ||
574 | |||
565 | static struct device_attribute parisc_device_attrs[] = { | 575 | static struct device_attribute parisc_device_attrs[] = { |
566 | __ATTR_RO(irq), | 576 | __ATTR_RO(irq), |
567 | __ATTR_RO(hw_type), | 577 | __ATTR_RO(hw_type), |
568 | __ATTR_RO(rev), | 578 | __ATTR_RO(rev), |
569 | __ATTR_RO(hversion), | 579 | __ATTR_RO(hversion), |
570 | __ATTR_RO(sversion), | 580 | __ATTR_RO(sversion), |
581 | __ATTR_RO(modalias), | ||
571 | __ATTR_NULL, | 582 | __ATTR_NULL, |
572 | }; | 583 | }; |
573 | 584 | ||
@@ -689,7 +700,9 @@ parse_tree_node(struct device *parent, int index, struct hardware_path *modpath) | |||
689 | .fn = check_parent, | 700 | .fn = check_parent, |
690 | }; | 701 | }; |
691 | 702 | ||
692 | device_for_each_child(parent, &recurse_data, descend_children); | 703 | if (device_for_each_child(parent, &recurse_data, descend_children)) |
704 | /* nothing */; | ||
705 | |||
693 | return d.dev; | 706 | return d.dev; |
694 | } | 707 | } |
695 | 708 | ||
@@ -835,8 +848,8 @@ static void print_parisc_device(struct parisc_device *dev) | |||
835 | static int count; | 848 | static int count; |
836 | 849 | ||
837 | print_pa_hwpath(dev, hw_path); | 850 | print_pa_hwpath(dev, hw_path); |
838 | printk(KERN_INFO "%d. %s at 0x%lx [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", | 851 | printk(KERN_INFO "%d. %s at 0x%p [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", |
839 | ++count, dev->name, dev->hpa.start, hw_path, dev->id.hw_type, | 852 | ++count, dev->name, (void*) dev->hpa.start, hw_path, dev->id.hw_type, |
840 | dev->id.hversion_rev, dev->id.hversion, dev->id.sversion); | 853 | dev->id.hversion_rev, dev->id.hversion, dev->id.sversion); |
841 | 854 | ||
842 | if (dev->num_addrs) { | 855 | if (dev->num_addrs) { |
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index 340b5e8d67ba..8474f9e5ca10 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
@@ -37,6 +37,8 @@ | |||
37 | #include <asm/unistd.h> | 37 | #include <asm/unistd.h> |
38 | #include <asm/thread_info.h> | 38 | #include <asm/thread_info.h> |
39 | 39 | ||
40 | #include <linux/linkage.h> | ||
41 | |||
40 | #ifdef CONFIG_64BIT | 42 | #ifdef CONFIG_64BIT |
41 | #define CMPIB cmpib,* | 43 | #define CMPIB cmpib,* |
42 | #define CMPB cmpb,* | 44 | #define CMPB cmpb,* |
@@ -648,13 +650,11 @@ | |||
648 | * the static part of the kernel address space. | 650 | * the static part of the kernel address space. |
649 | */ | 651 | */ |
650 | 652 | ||
651 | .export fault_vector_20 | ||
652 | |||
653 | .text | 653 | .text |
654 | 654 | ||
655 | .align 4096 | 655 | .align 4096 |
656 | 656 | ||
657 | fault_vector_20: | 657 | ENTRY(fault_vector_20) |
658 | /* First vector is invalid (0) */ | 658 | /* First vector is invalid (0) */ |
659 | .ascii "cows can fly" | 659 | .ascii "cows can fly" |
660 | .byte 0 | 660 | .byte 0 |
@@ -695,14 +695,13 @@ fault_vector_20: | |||
695 | def 29 | 695 | def 29 |
696 | def 30 | 696 | def 30 |
697 | def 31 | 697 | def 31 |
698 | END(fault_vector_20) | ||
698 | 699 | ||
699 | #ifndef CONFIG_64BIT | 700 | #ifndef CONFIG_64BIT |
700 | 701 | ||
701 | .export fault_vector_11 | ||
702 | |||
703 | .align 2048 | 702 | .align 2048 |
704 | 703 | ||
705 | fault_vector_11: | 704 | ENTRY(fault_vector_11) |
706 | /* First vector is invalid (0) */ | 705 | /* First vector is invalid (0) */ |
707 | .ascii "cows can fly" | 706 | .ascii "cows can fly" |
708 | .byte 0 | 707 | .byte 0 |
@@ -743,6 +742,7 @@ fault_vector_11: | |||
743 | def 29 | 742 | def 29 |
744 | def 30 | 743 | def 30 |
745 | def 31 | 744 | def 31 |
745 | END(fault_vector_11) | ||
746 | 746 | ||
747 | #endif | 747 | #endif |
748 | 748 | ||
@@ -762,9 +762,8 @@ fault_vector_11: | |||
762 | #define CLONE_VM 0x100 /* Must agree with <linux/sched.h> */ | 762 | #define CLONE_VM 0x100 /* Must agree with <linux/sched.h> */ |
763 | #define CLONE_UNTRACED 0x00800000 | 763 | #define CLONE_UNTRACED 0x00800000 |
764 | 764 | ||
765 | .export __kernel_thread, code | ||
766 | .import do_fork | 765 | .import do_fork |
767 | __kernel_thread: | 766 | ENTRY(__kernel_thread) |
768 | STREG %r2, -RP_OFFSET(%r30) | 767 | STREG %r2, -RP_OFFSET(%r30) |
769 | 768 | ||
770 | copy %r30, %r1 | 769 | copy %r30, %r1 |
@@ -797,6 +796,7 @@ __kernel_thread: | |||
797 | ldo -PT_SZ_ALGN(%r30), %r30 | 796 | ldo -PT_SZ_ALGN(%r30), %r30 |
798 | bv %r0(%r2) | 797 | bv %r0(%r2) |
799 | nop | 798 | nop |
799 | ENDPROC(__kernel_thread) | ||
800 | 800 | ||
801 | /* | 801 | /* |
802 | * Child Returns here | 802 | * Child Returns here |
@@ -805,8 +805,7 @@ __kernel_thread: | |||
805 | * into task save area. | 805 | * into task save area. |
806 | */ | 806 | */ |
807 | 807 | ||
808 | .export ret_from_kernel_thread | 808 | ENTRY(ret_from_kernel_thread) |
809 | ret_from_kernel_thread: | ||
810 | 809 | ||
811 | /* Call schedule_tail first though */ | 810 | /* Call schedule_tail first though */ |
812 | BL schedule_tail, %r2 | 811 | BL schedule_tail, %r2 |
@@ -833,10 +832,10 @@ ret_from_kernel_thread: | |||
833 | bv %r0(%r1) | 832 | bv %r0(%r1) |
834 | #endif | 833 | #endif |
835 | ldi 0, %r26 | 834 | ldi 0, %r26 |
835 | ENDPROC(ret_from_kernel_thread) | ||
836 | 836 | ||
837 | .import sys_execve, code | 837 | .import sys_execve, code |
838 | .export __execve, code | 838 | ENTRY(__execve) |
839 | __execve: | ||
840 | copy %r2, %r15 | 839 | copy %r2, %r15 |
841 | copy %r30, %r16 | 840 | copy %r30, %r16 |
842 | ldo PT_SZ_ALGN(%r30), %r30 | 841 | ldo PT_SZ_ALGN(%r30), %r30 |
@@ -856,16 +855,15 @@ __execve: | |||
856 | copy %r16, %r30 | 855 | copy %r16, %r30 |
857 | bv %r0(%r2) | 856 | bv %r0(%r2) |
858 | nop | 857 | nop |
858 | ENDPROC(__execve) | ||
859 | 859 | ||
860 | .align 4 | ||
861 | 860 | ||
862 | /* | 861 | /* |
863 | * struct task_struct *_switch_to(struct task_struct *prev, | 862 | * struct task_struct *_switch_to(struct task_struct *prev, |
864 | * struct task_struct *next) | 863 | * struct task_struct *next) |
865 | * | 864 | * |
866 | * switch kernel stacks and return prev */ | 865 | * switch kernel stacks and return prev */ |
867 | .export _switch_to, code | 866 | ENTRY(_switch_to) |
868 | _switch_to: | ||
869 | STREG %r2, -RP_OFFSET(%r30) | 867 | STREG %r2, -RP_OFFSET(%r30) |
870 | 868 | ||
871 | callee_save_float | 869 | callee_save_float |
@@ -890,6 +888,7 @@ _switch_to_ret: | |||
890 | LDREG -RP_OFFSET(%r30), %r2 | 888 | LDREG -RP_OFFSET(%r30), %r2 |
891 | bv %r0(%r2) | 889 | bv %r0(%r2) |
892 | copy %r26, %r28 | 890 | copy %r26, %r28 |
891 | ENDPROC(_switch_to) | ||
893 | 892 | ||
894 | /* | 893 | /* |
895 | * Common rfi return path for interruptions, kernel execve, and | 894 | * Common rfi return path for interruptions, kernel execve, and |
@@ -907,8 +906,7 @@ _switch_to_ret: | |||
907 | 906 | ||
908 | .align 4096 | 907 | .align 4096 |
909 | 908 | ||
910 | .export syscall_exit_rfi | 909 | ENTRY(syscall_exit_rfi) |
911 | syscall_exit_rfi: | ||
912 | mfctl %cr30,%r16 | 910 | mfctl %cr30,%r16 |
913 | LDREG TI_TASK(%r16), %r16 /* thread_info -> task_struct */ | 911 | LDREG TI_TASK(%r16), %r16 /* thread_info -> task_struct */ |
914 | ldo TASK_REGS(%r16),%r16 | 912 | ldo TASK_REGS(%r16),%r16 |
@@ -978,11 +976,36 @@ intr_check_resched: | |||
978 | LDREG TI_FLAGS(%r1),%r19 /* sched.h: TIF_NEED_RESCHED */ | 976 | LDREG TI_FLAGS(%r1),%r19 /* sched.h: TIF_NEED_RESCHED */ |
979 | bb,<,n %r19,31-TIF_NEED_RESCHED,intr_do_resched /* forward */ | 977 | bb,<,n %r19,31-TIF_NEED_RESCHED,intr_do_resched /* forward */ |
980 | 978 | ||
979 | .import do_notify_resume,code | ||
981 | intr_check_sig: | 980 | intr_check_sig: |
982 | /* As above */ | 981 | /* As above */ |
983 | mfctl %cr30,%r1 | 982 | mfctl %cr30,%r1 |
984 | LDREG TI_FLAGS(%r1),%r19 /* sched.h: TIF_SIGPENDING */ | 983 | LDREG TI_FLAGS(%r1),%r19 |
985 | bb,<,n %r19, 31-TIF_SIGPENDING, intr_do_signal /* forward */ | 984 | ldi (_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK), %r20 |
985 | and,COND(<>) %r19, %r20, %r0 | ||
986 | b,n intr_restore /* skip past if we've nothing to do */ | ||
987 | |||
988 | /* This check is critical to having LWS | ||
989 | * working. The IASQ is zero on the gateway | ||
990 | * page and we cannot deliver any signals until | ||
991 | * we get off the gateway page. | ||
992 | * | ||
993 | * Only do signals if we are returning to user space | ||
994 | */ | ||
995 | LDREG PT_IASQ0(%r16), %r20 | ||
996 | CMPIB=,n 0,%r20,intr_restore /* backward */ | ||
997 | LDREG PT_IASQ1(%r16), %r20 | ||
998 | CMPIB=,n 0,%r20,intr_restore /* backward */ | ||
999 | |||
1000 | copy %r0, %r25 /* long in_syscall = 0 */ | ||
1001 | #ifdef CONFIG_64BIT | ||
1002 | ldo -16(%r30),%r29 /* Reference param save area */ | ||
1003 | #endif | ||
1004 | |||
1005 | BL do_notify_resume,%r2 | ||
1006 | copy %r16, %r26 /* struct pt_regs *regs */ | ||
1007 | |||
1008 | b,n intr_check_sig | ||
986 | 1009 | ||
987 | intr_restore: | 1010 | intr_restore: |
988 | copy %r16,%r29 | 1011 | copy %r16,%r29 |
@@ -1072,35 +1095,6 @@ intr_do_preempt: | |||
1072 | b,n intr_restore /* ssm PSW_SM_I done by intr_restore */ | 1095 | b,n intr_restore /* ssm PSW_SM_I done by intr_restore */ |
1073 | #endif /* CONFIG_PREEMPT */ | 1096 | #endif /* CONFIG_PREEMPT */ |
1074 | 1097 | ||
1075 | .import do_signal,code | ||
1076 | intr_do_signal: | ||
1077 | /* | ||
1078 | This check is critical to having LWS | ||
1079 | working. The IASQ is zero on the gateway | ||
1080 | page and we cannot deliver any signals until | ||
1081 | we get off the gateway page. | ||
1082 | |||
1083 | Only do signals if we are returning to user space | ||
1084 | */ | ||
1085 | LDREG PT_IASQ0(%r16), %r20 | ||
1086 | CMPIB= 0,%r20,intr_restore /* backward */ | ||
1087 | nop | ||
1088 | LDREG PT_IASQ1(%r16), %r20 | ||
1089 | CMPIB= 0,%r20,intr_restore /* backward */ | ||
1090 | nop | ||
1091 | |||
1092 | copy %r0, %r24 /* unsigned long in_syscall */ | ||
1093 | copy %r16, %r25 /* struct pt_regs *regs */ | ||
1094 | #ifdef CONFIG_64BIT | ||
1095 | ldo -16(%r30),%r29 /* Reference param save area */ | ||
1096 | #endif | ||
1097 | |||
1098 | BL do_signal,%r2 | ||
1099 | copy %r0, %r26 /* sigset_t *oldset = NULL */ | ||
1100 | |||
1101 | b intr_check_sig | ||
1102 | nop | ||
1103 | |||
1104 | /* | 1098 | /* |
1105 | * External interrupts. | 1099 | * External interrupts. |
1106 | */ | 1100 | */ |
@@ -1115,11 +1109,7 @@ intr_extint: | |||
1115 | mfctl %cr31,%r1 | 1109 | mfctl %cr31,%r1 |
1116 | copy %r30,%r17 | 1110 | copy %r30,%r17 |
1117 | /* FIXME! depi below has hardcoded idea of interrupt stack size (32k)*/ | 1111 | /* FIXME! depi below has hardcoded idea of interrupt stack size (32k)*/ |
1118 | #ifdef CONFIG_64BIT | 1112 | DEPI 0,31,15,%r17 |
1119 | depdi 0,63,15,%r17 | ||
1120 | #else | ||
1121 | depi 0,31,15,%r17 | ||
1122 | #endif | ||
1123 | CMPB=,n %r1,%r17,2f | 1113 | CMPB=,n %r1,%r17,2f |
1124 | get_stack_use_cr31 | 1114 | get_stack_use_cr31 |
1125 | b,n 3f | 1115 | b,n 3f |
@@ -1148,13 +1138,12 @@ intr_extint: | |||
1148 | 1138 | ||
1149 | b do_cpu_irq_mask | 1139 | b do_cpu_irq_mask |
1150 | ldo R%intr_return(%r2), %r2 /* return to intr_return, not here */ | 1140 | ldo R%intr_return(%r2), %r2 /* return to intr_return, not here */ |
1141 | ENDPROC(syscall_exit_rfi) | ||
1151 | 1142 | ||
1152 | 1143 | ||
1153 | /* Generic interruptions (illegal insn, unaligned, page fault, etc) */ | 1144 | /* Generic interruptions (illegal insn, unaligned, page fault, etc) */ |
1154 | 1145 | ||
1155 | .export intr_save, code /* for os_hpmc */ | 1146 | ENTRY(intr_save) /* for os_hpmc */ |
1156 | |||
1157 | intr_save: | ||
1158 | mfsp %sr7,%r16 | 1147 | mfsp %sr7,%r16 |
1159 | CMPIB=,n 0,%r16,1f | 1148 | CMPIB=,n 0,%r16,1f |
1160 | get_stack_use_cr30 | 1149 | get_stack_use_cr30 |
@@ -1229,6 +1218,7 @@ skip_save_ior: | |||
1229 | 1218 | ||
1230 | b handle_interruption | 1219 | b handle_interruption |
1231 | ldo R%intr_check_sig(%r2), %r2 | 1220 | ldo R%intr_check_sig(%r2), %r2 |
1221 | ENDPROC(intr_save) | ||
1232 | 1222 | ||
1233 | 1223 | ||
1234 | /* | 1224 | /* |
@@ -1814,9 +1804,7 @@ dtlb_fault: | |||
1814 | LDREG PT_GR18(\regs),%r18 | 1804 | LDREG PT_GR18(\regs),%r18 |
1815 | .endm | 1805 | .endm |
1816 | 1806 | ||
1817 | .export sys_fork_wrapper | 1807 | ENTRY(sys_fork_wrapper) |
1818 | .export child_return | ||
1819 | sys_fork_wrapper: | ||
1820 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1 | 1808 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1 |
1821 | ldo TASK_REGS(%r1),%r1 | 1809 | ldo TASK_REGS(%r1),%r1 |
1822 | reg_save %r1 | 1810 | reg_save %r1 |
@@ -1853,9 +1841,10 @@ wrapper_exit: | |||
1853 | ldi __NR_fork,%r20 | 1841 | ldi __NR_fork,%r20 |
1854 | bv %r0(%r2) | 1842 | bv %r0(%r2) |
1855 | STREG %r20,PT_GR20(%r1) | 1843 | STREG %r20,PT_GR20(%r1) |
1844 | ENDPROC(sys_fork_wrapper) | ||
1856 | 1845 | ||
1857 | /* Set the return value for the child */ | 1846 | /* Set the return value for the child */ |
1858 | child_return: | 1847 | ENTRY(child_return) |
1859 | BL schedule_tail, %r2 | 1848 | BL schedule_tail, %r2 |
1860 | nop | 1849 | nop |
1861 | 1850 | ||
@@ -1863,10 +1852,10 @@ child_return: | |||
1863 | LDREG TASK_PT_GR19(%r1),%r2 | 1852 | LDREG TASK_PT_GR19(%r1),%r2 |
1864 | b wrapper_exit | 1853 | b wrapper_exit |
1865 | copy %r0,%r28 | 1854 | copy %r0,%r28 |
1855 | ENDPROC(child_return) | ||
1866 | 1856 | ||
1867 | 1857 | ||
1868 | .export sys_clone_wrapper | 1858 | ENTRY(sys_clone_wrapper) |
1869 | sys_clone_wrapper: | ||
1870 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | 1859 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 |
1871 | ldo TASK_REGS(%r1),%r1 /* get pt regs */ | 1860 | ldo TASK_REGS(%r1),%r1 /* get pt regs */ |
1872 | reg_save %r1 | 1861 | reg_save %r1 |
@@ -1887,9 +1876,10 @@ sys_clone_wrapper: | |||
1887 | 1876 | ||
1888 | b wrapper_exit | 1877 | b wrapper_exit |
1889 | LDREG -RP_OFFSET-FRAME_SIZE(%r30),%r2 | 1878 | LDREG -RP_OFFSET-FRAME_SIZE(%r30),%r2 |
1879 | ENDPROC(sys_clone_wrapper) | ||
1880 | |||
1890 | 1881 | ||
1891 | .export sys_vfork_wrapper | 1882 | ENTRY(sys_vfork_wrapper) |
1892 | sys_vfork_wrapper: | ||
1893 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | 1883 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 |
1894 | ldo TASK_REGS(%r1),%r1 /* get pt regs */ | 1884 | ldo TASK_REGS(%r1),%r1 /* get pt regs */ |
1895 | reg_save %r1 | 1885 | reg_save %r1 |
@@ -1910,6 +1900,7 @@ sys_vfork_wrapper: | |||
1910 | 1900 | ||
1911 | b wrapper_exit | 1901 | b wrapper_exit |
1912 | LDREG -RP_OFFSET-FRAME_SIZE(%r30),%r2 | 1902 | LDREG -RP_OFFSET-FRAME_SIZE(%r30),%r2 |
1903 | ENDPROC(sys_vfork_wrapper) | ||
1913 | 1904 | ||
1914 | 1905 | ||
1915 | .macro execve_wrapper execve | 1906 | .macro execve_wrapper execve |
@@ -1946,22 +1937,19 @@ error_\execve: | |||
1946 | nop | 1937 | nop |
1947 | .endm | 1938 | .endm |
1948 | 1939 | ||
1949 | .export sys_execve_wrapper | ||
1950 | .import sys_execve | 1940 | .import sys_execve |
1951 | 1941 | ENTRY(sys_execve_wrapper) | |
1952 | sys_execve_wrapper: | ||
1953 | execve_wrapper sys_execve | 1942 | execve_wrapper sys_execve |
1943 | ENDPROC(sys_execve_wrapper) | ||
1954 | 1944 | ||
1955 | #ifdef CONFIG_64BIT | 1945 | #ifdef CONFIG_64BIT |
1956 | .export sys32_execve_wrapper | ||
1957 | .import sys32_execve | 1946 | .import sys32_execve |
1958 | 1947 | ENTRY(sys32_execve_wrapper) | |
1959 | sys32_execve_wrapper: | ||
1960 | execve_wrapper sys32_execve | 1948 | execve_wrapper sys32_execve |
1949 | ENDPROC(sys32_execve_wrapper) | ||
1961 | #endif | 1950 | #endif |
1962 | 1951 | ||
1963 | .export sys_rt_sigreturn_wrapper | 1952 | ENTRY(sys_rt_sigreturn_wrapper) |
1964 | sys_rt_sigreturn_wrapper: | ||
1965 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r26 | 1953 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r26 |
1966 | ldo TASK_REGS(%r26),%r26 /* get pt regs */ | 1954 | ldo TASK_REGS(%r26),%r26 /* get pt regs */ |
1967 | /* Don't save regs, we are going to restore them from sigcontext. */ | 1955 | /* Don't save regs, we are going to restore them from sigcontext. */ |
@@ -1989,9 +1977,9 @@ sys_rt_sigreturn_wrapper: | |||
1989 | */ | 1977 | */ |
1990 | bv %r0(%r2) | 1978 | bv %r0(%r2) |
1991 | LDREG PT_GR28(%r1),%r28 /* reload original r28 for syscall_exit */ | 1979 | LDREG PT_GR28(%r1),%r28 /* reload original r28 for syscall_exit */ |
1980 | ENDPROC(sys_rt_sigreturn_wrapper) | ||
1992 | 1981 | ||
1993 | .export sys_sigaltstack_wrapper | 1982 | ENTRY(sys_sigaltstack_wrapper) |
1994 | sys_sigaltstack_wrapper: | ||
1995 | /* Get the user stack pointer */ | 1983 | /* Get the user stack pointer */ |
1996 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | 1984 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 |
1997 | ldo TASK_REGS(%r1),%r24 /* get pt regs */ | 1985 | ldo TASK_REGS(%r1),%r24 /* get pt regs */ |
@@ -1999,10 +1987,10 @@ sys_sigaltstack_wrapper: | |||
1999 | STREG %r2, -RP_OFFSET(%r30) | 1987 | STREG %r2, -RP_OFFSET(%r30) |
2000 | #ifdef CONFIG_64BIT | 1988 | #ifdef CONFIG_64BIT |
2001 | ldo FRAME_SIZE(%r30), %r30 | 1989 | ldo FRAME_SIZE(%r30), %r30 |
2002 | b,l do_sigaltstack,%r2 | 1990 | BL do_sigaltstack,%r2 |
2003 | ldo -16(%r30),%r29 /* Reference param save area */ | 1991 | ldo -16(%r30),%r29 /* Reference param save area */ |
2004 | #else | 1992 | #else |
2005 | bl do_sigaltstack,%r2 | 1993 | BL do_sigaltstack,%r2 |
2006 | ldo FRAME_SIZE(%r30), %r30 | 1994 | ldo FRAME_SIZE(%r30), %r30 |
2007 | #endif | 1995 | #endif |
2008 | 1996 | ||
@@ -2010,53 +1998,26 @@ sys_sigaltstack_wrapper: | |||
2010 | LDREG -RP_OFFSET(%r30), %r2 | 1998 | LDREG -RP_OFFSET(%r30), %r2 |
2011 | bv %r0(%r2) | 1999 | bv %r0(%r2) |
2012 | nop | 2000 | nop |
2001 | ENDPROC(sys_sigaltstack_wrapper) | ||
2013 | 2002 | ||
2014 | #ifdef CONFIG_64BIT | 2003 | #ifdef CONFIG_64BIT |
2015 | .export sys32_sigaltstack_wrapper | 2004 | ENTRY(sys32_sigaltstack_wrapper) |
2016 | sys32_sigaltstack_wrapper: | ||
2017 | /* Get the user stack pointer */ | 2005 | /* Get the user stack pointer */ |
2018 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r24 | 2006 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r24 |
2019 | LDREG TASK_PT_GR30(%r24),%r24 | 2007 | LDREG TASK_PT_GR30(%r24),%r24 |
2020 | STREG %r2, -RP_OFFSET(%r30) | 2008 | STREG %r2, -RP_OFFSET(%r30) |
2021 | ldo FRAME_SIZE(%r30), %r30 | 2009 | ldo FRAME_SIZE(%r30), %r30 |
2022 | b,l do_sigaltstack32,%r2 | 2010 | BL do_sigaltstack32,%r2 |
2023 | ldo -16(%r30),%r29 /* Reference param save area */ | 2011 | ldo -16(%r30),%r29 /* Reference param save area */ |
2024 | 2012 | ||
2025 | ldo -FRAME_SIZE(%r30), %r30 | 2013 | ldo -FRAME_SIZE(%r30), %r30 |
2026 | LDREG -RP_OFFSET(%r30), %r2 | 2014 | LDREG -RP_OFFSET(%r30), %r2 |
2027 | bv %r0(%r2) | 2015 | bv %r0(%r2) |
2028 | nop | 2016 | nop |
2017 | ENDPROC(sys32_sigaltstack_wrapper) | ||
2029 | #endif | 2018 | #endif |
2030 | 2019 | ||
2031 | .export sys_rt_sigsuspend_wrapper | 2020 | ENTRY(syscall_exit) |
2032 | sys_rt_sigsuspend_wrapper: | ||
2033 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1 | ||
2034 | ldo TASK_REGS(%r1),%r24 | ||
2035 | reg_save %r24 | ||
2036 | |||
2037 | STREG %r2, -RP_OFFSET(%r30) | ||
2038 | #ifdef CONFIG_64BIT | ||
2039 | ldo FRAME_SIZE(%r30), %r30 | ||
2040 | b,l sys_rt_sigsuspend,%r2 | ||
2041 | ldo -16(%r30),%r29 /* Reference param save area */ | ||
2042 | #else | ||
2043 | bl sys_rt_sigsuspend,%r2 | ||
2044 | ldo FRAME_SIZE(%r30), %r30 | ||
2045 | #endif | ||
2046 | |||
2047 | ldo -FRAME_SIZE(%r30), %r30 | ||
2048 | LDREG -RP_OFFSET(%r30), %r2 | ||
2049 | |||
2050 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1 | ||
2051 | ldo TASK_REGS(%r1),%r1 | ||
2052 | reg_restore %r1 | ||
2053 | |||
2054 | bv %r0(%r2) | ||
2055 | nop | ||
2056 | |||
2057 | .export syscall_exit | ||
2058 | syscall_exit: | ||
2059 | |||
2060 | /* NOTE: HP-UX syscalls also come through here | 2021 | /* NOTE: HP-UX syscalls also come through here |
2061 | * after hpux_syscall_exit fixes up return | 2022 | * after hpux_syscall_exit fixes up return |
2062 | * values. */ | 2023 | * values. */ |
@@ -2119,9 +2080,35 @@ syscall_check_resched: | |||
2119 | LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19 /* long */ | 2080 | LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19 /* long */ |
2120 | bb,<,n %r19, 31-TIF_NEED_RESCHED, syscall_do_resched /* forward */ | 2081 | bb,<,n %r19, 31-TIF_NEED_RESCHED, syscall_do_resched /* forward */ |
2121 | 2082 | ||
2083 | .import do_signal,code | ||
2122 | syscall_check_sig: | 2084 | syscall_check_sig: |
2123 | LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19 /* get ti flags */ | 2085 | LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19 |
2124 | bb,<,n %r19, 31-TIF_SIGPENDING, syscall_do_signal /* forward */ | 2086 | ldi (_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK), %r26 |
2087 | and,COND(<>) %r19, %r26, %r0 | ||
2088 | b,n syscall_restore /* skip past if we've nothing to do */ | ||
2089 | |||
2090 | syscall_do_signal: | ||
2091 | /* Save callee-save registers (for sigcontext). | ||
2092 | * FIXME: After this point the process structure should be | ||
2093 | * consistent with all the relevant state of the process | ||
2094 | * before the syscall. We need to verify this. | ||
2095 | */ | ||
2096 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | ||
2097 | ldo TASK_REGS(%r1), %r26 /* struct pt_regs *regs */ | ||
2098 | reg_save %r26 | ||
2099 | |||
2100 | #ifdef CONFIG_64BIT | ||
2101 | ldo -16(%r30),%r29 /* Reference param save area */ | ||
2102 | #endif | ||
2103 | |||
2104 | BL do_notify_resume,%r2 | ||
2105 | ldi 1, %r25 /* long in_syscall = 1 */ | ||
2106 | |||
2107 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | ||
2108 | ldo TASK_REGS(%r1), %r20 /* reload pt_regs */ | ||
2109 | reg_restore %r20 | ||
2110 | |||
2111 | b,n syscall_check_sig | ||
2125 | 2112 | ||
2126 | syscall_restore: | 2113 | syscall_restore: |
2127 | /* Are we being ptraced? */ | 2114 | /* Are we being ptraced? */ |
@@ -2259,31 +2246,10 @@ syscall_do_resched: | |||
2259 | #endif | 2246 | #endif |
2260 | b syscall_check_bh /* if resched, we start over again */ | 2247 | b syscall_check_bh /* if resched, we start over again */ |
2261 | nop | 2248 | nop |
2249 | ENDPROC(syscall_exit) | ||
2262 | 2250 | ||
2263 | .import do_signal,code | ||
2264 | syscall_do_signal: | ||
2265 | /* Save callee-save registers (for sigcontext). | ||
2266 | FIXME: After this point the process structure should be | ||
2267 | consistent with all the relevant state of the process | ||
2268 | before the syscall. We need to verify this. */ | ||
2269 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | ||
2270 | ldo TASK_REGS(%r1), %r25 /* struct pt_regs *regs */ | ||
2271 | reg_save %r25 | ||
2272 | |||
2273 | ldi 1, %r24 /* unsigned long in_syscall */ | ||
2274 | |||
2275 | #ifdef CONFIG_64BIT | ||
2276 | ldo -16(%r30),%r29 /* Reference param save area */ | ||
2277 | #endif | ||
2278 | BL do_signal,%r2 | ||
2279 | copy %r0, %r26 /* sigset_t *oldset = NULL */ | ||
2280 | |||
2281 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | ||
2282 | ldo TASK_REGS(%r1), %r20 /* reload pt_regs */ | ||
2283 | reg_restore %r20 | ||
2284 | |||
2285 | b,n syscall_check_sig | ||
2286 | 2251 | ||
2252 | get_register: | ||
2287 | /* | 2253 | /* |
2288 | * get_register is used by the non access tlb miss handlers to | 2254 | * get_register is used by the non access tlb miss handlers to |
2289 | * copy the value of the general register specified in r8 into | 2255 | * copy the value of the general register specified in r8 into |
@@ -2294,8 +2260,6 @@ syscall_do_signal: | |||
2294 | * a -1 in it, but that is OK, it just means that we will have | 2260 | * a -1 in it, but that is OK, it just means that we will have |
2295 | * to use the slow path instead). | 2261 | * to use the slow path instead). |
2296 | */ | 2262 | */ |
2297 | |||
2298 | get_register: | ||
2299 | blr %r8,%r0 | 2263 | blr %r8,%r0 |
2300 | nop | 2264 | nop |
2301 | bv %r0(%r25) /* r0 */ | 2265 | bv %r0(%r25) /* r0 */ |
@@ -2363,13 +2327,13 @@ get_register: | |||
2363 | bv %r0(%r25) /* r31 */ | 2327 | bv %r0(%r25) /* r31 */ |
2364 | copy %r31,%r1 | 2328 | copy %r31,%r1 |
2365 | 2329 | ||
2330 | |||
2331 | set_register: | ||
2366 | /* | 2332 | /* |
2367 | * set_register is used by the non access tlb miss handlers to | 2333 | * set_register is used by the non access tlb miss handlers to |
2368 | * copy the value of r1 into the general register specified in | 2334 | * copy the value of r1 into the general register specified in |
2369 | * r8. | 2335 | * r8. |
2370 | */ | 2336 | */ |
2371 | |||
2372 | set_register: | ||
2373 | blr %r8,%r0 | 2337 | blr %r8,%r0 |
2374 | nop | 2338 | nop |
2375 | bv %r0(%r25) /* r0 (silly, but it is a place holder) */ | 2339 | bv %r0(%r25) /* r0 (silly, but it is a place holder) */ |
@@ -2436,3 +2400,4 @@ set_register: | |||
2436 | copy %r1,%r30 | 2400 | copy %r1,%r30 |
2437 | bv %r0(%r25) /* r31 */ | 2401 | bv %r0(%r25) /* r31 */ |
2438 | copy %r1,%r31 | 2402 | copy %r1,%r31 |
2403 | |||
diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index 9158b707c0dd..39dc835bf89e 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c | |||
@@ -74,7 +74,7 @@ static DEFINE_SPINLOCK(pdc_lock); | |||
74 | static unsigned long pdc_result[32] __attribute__ ((aligned (8))); | 74 | static unsigned long pdc_result[32] __attribute__ ((aligned (8))); |
75 | static unsigned long pdc_result2[32] __attribute__ ((aligned (8))); | 75 | static unsigned long pdc_result2[32] __attribute__ ((aligned (8))); |
76 | 76 | ||
77 | #ifdef __LP64__ | 77 | #ifdef CONFIG_64BIT |
78 | #define WIDE_FIRMWARE 0x1 | 78 | #define WIDE_FIRMWARE 0x1 |
79 | #define NARROW_FIRMWARE 0x2 | 79 | #define NARROW_FIRMWARE 0x2 |
80 | 80 | ||
@@ -94,12 +94,12 @@ int parisc_narrow_firmware __read_mostly = 1; | |||
94 | * when running a 64-bit kernel on such boxes (e.g. C200 or C360). | 94 | * when running a 64-bit kernel on such boxes (e.g. C200 or C360). |
95 | */ | 95 | */ |
96 | 96 | ||
97 | #ifdef __LP64__ | 97 | #ifdef CONFIG_64BIT |
98 | long real64_call(unsigned long function, ...); | 98 | long real64_call(unsigned long function, ...); |
99 | #endif | 99 | #endif |
100 | long real32_call(unsigned long function, ...); | 100 | long real32_call(unsigned long function, ...); |
101 | 101 | ||
102 | #ifdef __LP64__ | 102 | #ifdef CONFIG_64BIT |
103 | # define MEM_PDC (unsigned long)(PAGE0->mem_pdc_hi) << 32 | PAGE0->mem_pdc | 103 | # define MEM_PDC (unsigned long)(PAGE0->mem_pdc_hi) << 32 | PAGE0->mem_pdc |
104 | # define mem_pdc_call(args...) unlikely(parisc_narrow_firmware) ? real32_call(MEM_PDC, args) : real64_call(MEM_PDC, args) | 104 | # define mem_pdc_call(args...) unlikely(parisc_narrow_firmware) ? real32_call(MEM_PDC, args) : real64_call(MEM_PDC, args) |
105 | #else | 105 | #else |
@@ -117,7 +117,7 @@ long real32_call(unsigned long function, ...); | |||
117 | */ | 117 | */ |
118 | static unsigned long f_extend(unsigned long address) | 118 | static unsigned long f_extend(unsigned long address) |
119 | { | 119 | { |
120 | #ifdef __LP64__ | 120 | #ifdef CONFIG_64BIT |
121 | if(unlikely(parisc_narrow_firmware)) { | 121 | if(unlikely(parisc_narrow_firmware)) { |
122 | if((address & 0xff000000) == 0xf0000000) | 122 | if((address & 0xff000000) == 0xf0000000) |
123 | return 0xf0f0f0f000000000UL | (u32)address; | 123 | return 0xf0f0f0f000000000UL | (u32)address; |
@@ -139,7 +139,7 @@ static unsigned long f_extend(unsigned long address) | |||
139 | */ | 139 | */ |
140 | static void convert_to_wide(unsigned long *addr) | 140 | static void convert_to_wide(unsigned long *addr) |
141 | { | 141 | { |
142 | #ifdef __LP64__ | 142 | #ifdef CONFIG_64BIT |
143 | int i; | 143 | int i; |
144 | unsigned int *p = (unsigned int *)addr; | 144 | unsigned int *p = (unsigned int *)addr; |
145 | 145 | ||
@@ -158,7 +158,7 @@ static void convert_to_wide(unsigned long *addr) | |||
158 | */ | 158 | */ |
159 | void __init set_firmware_width(void) | 159 | void __init set_firmware_width(void) |
160 | { | 160 | { |
161 | #ifdef __LP64__ | 161 | #ifdef CONFIG_64BIT |
162 | int retval; | 162 | int retval; |
163 | unsigned long flags; | 163 | unsigned long flags; |
164 | 164 | ||
@@ -238,7 +238,7 @@ int __init pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_inf | |||
238 | * | 238 | * |
239 | * Must be correctly formatted or expect system crash | 239 | * Must be correctly formatted or expect system crash |
240 | */ | 240 | */ |
241 | #ifdef __LP64__ | 241 | #ifdef CONFIG_64BIT |
242 | int pdc_pat_chassis_send_log(unsigned long state, unsigned long data) | 242 | int pdc_pat_chassis_send_log(unsigned long state, unsigned long data) |
243 | { | 243 | { |
244 | int retval = 0; | 244 | int retval = 0; |
@@ -949,7 +949,7 @@ int pdc_tod_set(unsigned long sec, unsigned long usec) | |||
949 | } | 949 | } |
950 | EXPORT_SYMBOL(pdc_tod_set); | 950 | EXPORT_SYMBOL(pdc_tod_set); |
951 | 951 | ||
952 | #ifdef __LP64__ | 952 | #ifdef CONFIG_64BIT |
953 | int pdc_mem_mem_table(struct pdc_memory_table_raddr *r_addr, | 953 | int pdc_mem_mem_table(struct pdc_memory_table_raddr *r_addr, |
954 | struct pdc_memory_table *tbl, unsigned long entries) | 954 | struct pdc_memory_table *tbl, unsigned long entries) |
955 | { | 955 | { |
@@ -965,7 +965,7 @@ int pdc_mem_mem_table(struct pdc_memory_table_raddr *r_addr, | |||
965 | 965 | ||
966 | return retval; | 966 | return retval; |
967 | } | 967 | } |
968 | #endif /* __LP64__ */ | 968 | #endif /* CONFIG_64BIT */ |
969 | 969 | ||
970 | /* FIXME: Is this pdc used? I could not find type reference to ftc_bitmap | 970 | /* FIXME: Is this pdc used? I could not find type reference to ftc_bitmap |
971 | * so I guessed at unsigned long. Someone who knows what this does, can fix | 971 | * so I guessed at unsigned long. Someone who knows what this does, can fix |
@@ -1204,7 +1204,7 @@ int pdc_sti_call(unsigned long func, unsigned long flags, | |||
1204 | } | 1204 | } |
1205 | EXPORT_SYMBOL(pdc_sti_call); | 1205 | EXPORT_SYMBOL(pdc_sti_call); |
1206 | 1206 | ||
1207 | #ifdef __LP64__ | 1207 | #ifdef CONFIG_64BIT |
1208 | /** | 1208 | /** |
1209 | * pdc_pat_cell_get_number - Returns the cell number. | 1209 | * pdc_pat_cell_get_number - Returns the cell number. |
1210 | * @cell_info: The return buffer. | 1210 | * @cell_info: The return buffer. |
@@ -1387,7 +1387,7 @@ int pdc_pat_io_pci_cfg_write(unsigned long pci_addr, int pci_size, u32 val) | |||
1387 | 1387 | ||
1388 | return retval; | 1388 | return retval; |
1389 | } | 1389 | } |
1390 | #endif /* __LP64__ */ | 1390 | #endif /* CONFIG_64BIT */ |
1391 | 1391 | ||
1392 | 1392 | ||
1393 | /***************** 32-bit real-mode calls ***********/ | 1393 | /***************** 32-bit real-mode calls ***********/ |
@@ -1445,7 +1445,7 @@ long real32_call(unsigned long fn, ...) | |||
1445 | return real32_call_asm(&real_stack.sp, &real_stack.arg0, fn); | 1445 | return real32_call_asm(&real_stack.sp, &real_stack.arg0, fn); |
1446 | } | 1446 | } |
1447 | 1447 | ||
1448 | #ifdef __LP64__ | 1448 | #ifdef CONFIG_64BIT |
1449 | /***************** 64-bit real-mode calls ***********/ | 1449 | /***************** 64-bit real-mode calls ***********/ |
1450 | 1450 | ||
1451 | struct wide_stack { | 1451 | struct wide_stack { |
@@ -1496,5 +1496,5 @@ long real64_call(unsigned long fn, ...) | |||
1496 | return real64_call_asm(&real64_stack.sp, &real64_stack.arg0, fn); | 1496 | return real64_call_asm(&real64_stack.sp, &real64_stack.arg0, fn); |
1497 | } | 1497 | } |
1498 | 1498 | ||
1499 | #endif /* __LP64__ */ | 1499 | #endif /* CONFIG_64BIT */ |
1500 | 1500 | ||
diff --git a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S index eaad2328fea1..9676c486bb63 100644 --- a/arch/parisc/kernel/head.S +++ b/arch/parisc/kernel/head.S | |||
@@ -2,7 +2,7 @@ | |||
2 | * License. See the file "COPYING" in the main directory of this archive | 2 | * License. See the file "COPYING" in the main directory of this archive |
3 | * for more details. | 3 | * for more details. |
4 | * | 4 | * |
5 | * Copyright (C) 1999 by Helge Deller | 5 | * Copyright (C) 1999-2007 by Helge Deller <deller@gmx.de> |
6 | * Copyright 1999 SuSE GmbH (Philipp Rumpf) | 6 | * Copyright 1999 SuSE GmbH (Philipp Rumpf) |
7 | * Copyright 1999 Philipp Rumpf (prumpf@tux.org) | 7 | * Copyright 1999 Philipp Rumpf (prumpf@tux.org) |
8 | * Copyright 2000 Hewlett Packard (Paul Bame, bame@puffin.external.hp.com) | 8 | * Copyright 2000 Hewlett Packard (Paul Bame, bame@puffin.external.hp.com) |
@@ -19,16 +19,17 @@ | |||
19 | #include <asm/assembly.h> | 19 | #include <asm/assembly.h> |
20 | #include <asm/pgtable.h> | 20 | #include <asm/pgtable.h> |
21 | 21 | ||
22 | #include <linux/linkage.h> | ||
23 | |||
22 | .level LEVEL | 24 | .level LEVEL |
23 | 25 | ||
24 | .data | 26 | .data |
25 | 27 | ENTRY(boot_args) | |
26 | .export boot_args | ||
27 | boot_args: | ||
28 | .word 0 /* arg0 */ | 28 | .word 0 /* arg0 */ |
29 | .word 0 /* arg1 */ | 29 | .word 0 /* arg1 */ |
30 | .word 0 /* arg2 */ | 30 | .word 0 /* arg2 */ |
31 | .word 0 /* arg3 */ | 31 | .word 0 /* arg3 */ |
32 | END(boot_args) | ||
32 | 33 | ||
33 | .text | 34 | .text |
34 | .align 4 | 35 | .align 4 |
@@ -38,10 +39,9 @@ boot_args: | |||
38 | .import fault_vector_11,code /* IVA parisc 1.1 32 bit */ | 39 | .import fault_vector_11,code /* IVA parisc 1.1 32 bit */ |
39 | .import $global$ /* forward declaration */ | 40 | .import $global$ /* forward declaration */ |
40 | #endif /*!CONFIG_64BIT*/ | 41 | #endif /*!CONFIG_64BIT*/ |
41 | .export stext | ||
42 | .export _stext,data /* Kernel want it this way! */ | 42 | .export _stext,data /* Kernel want it this way! */ |
43 | _stext: | 43 | _stext: |
44 | stext: | 44 | ENTRY(stext) |
45 | .proc | 45 | .proc |
46 | .callinfo | 46 | .callinfo |
47 | 47 | ||
@@ -343,6 +343,9 @@ smp_slave_stext: | |||
343 | 343 | ||
344 | .procend | 344 | .procend |
345 | #endif /* CONFIG_SMP */ | 345 | #endif /* CONFIG_SMP */ |
346 | |||
347 | ENDPROC(stext) | ||
348 | |||
346 | #ifndef CONFIG_64BIT | 349 | #ifndef CONFIG_64BIT |
347 | .data | 350 | .data |
348 | 351 | ||
diff --git a/arch/parisc/kernel/hpmc.S b/arch/parisc/kernel/hpmc.S index c412c0adc4a9..d8baa158d8a0 100644 --- a/arch/parisc/kernel/hpmc.S +++ b/arch/parisc/kernel/hpmc.S | |||
@@ -46,6 +46,8 @@ | |||
46 | #include <asm/assembly.h> | 46 | #include <asm/assembly.h> |
47 | #include <asm/pdc.h> | 47 | #include <asm/pdc.h> |
48 | 48 | ||
49 | #include <linux/linkage.h> | ||
50 | |||
49 | /* | 51 | /* |
50 | * stack for os_hpmc, the HPMC handler. | 52 | * stack for os_hpmc, the HPMC handler. |
51 | * buffer for IODC procedures (for the HPMC handler). | 53 | * buffer for IODC procedures (for the HPMC handler). |
@@ -69,17 +71,15 @@ hpmc_raddr: | |||
69 | 71 | ||
70 | #define HPMC_PIM_DATA_SIZE 896 /* Enough to hold all architected 2.0 state */ | 72 | #define HPMC_PIM_DATA_SIZE 896 /* Enough to hold all architected 2.0 state */ |
71 | 73 | ||
72 | .export hpmc_pim_data, data | ||
73 | .align 8 | 74 | .align 8 |
74 | hpmc_pim_data: | 75 | ENTRY(hpmc_pim_data) |
75 | .block HPMC_PIM_DATA_SIZE | 76 | .block HPMC_PIM_DATA_SIZE |
77 | END(hpmc_pim_data) | ||
76 | 78 | ||
77 | .text | 79 | .text |
78 | 80 | ||
79 | .export os_hpmc, code | ||
80 | .import intr_save, code | 81 | .import intr_save, code |
81 | 82 | ENTRY(os_hpmc) | |
82 | os_hpmc: | ||
83 | 83 | ||
84 | /* | 84 | /* |
85 | * registers modified: | 85 | * registers modified: |
@@ -294,11 +294,9 @@ os_hpmc_6: | |||
294 | 294 | ||
295 | b . | 295 | b . |
296 | nop | 296 | nop |
297 | ENDPROC(os_hpmc) | ||
297 | 298 | ||
298 | /* this label used to compute os_hpmc checksum */ | 299 | /* this label used to compute os_hpmc checksum */ |
299 | 300 | ENTRY(os_hpmc_end) | |
300 | .export os_hpmc_end, code | ||
301 | |||
302 | os_hpmc_end: | ||
303 | 301 | ||
304 | nop | 302 | nop |
diff --git a/arch/parisc/kernel/inventory.c b/arch/parisc/kernel/inventory.c index 4e847ba53180..4845a6444633 100644 --- a/arch/parisc/kernel/inventory.c +++ b/arch/parisc/kernel/inventory.c | |||
@@ -47,7 +47,7 @@ void __init setup_pdc(void) | |||
47 | struct pdc_system_map_mod_info module_result; | 47 | struct pdc_system_map_mod_info module_result; |
48 | struct pdc_module_path module_path; | 48 | struct pdc_module_path module_path; |
49 | struct pdc_model model; | 49 | struct pdc_model model; |
50 | #ifdef __LP64__ | 50 | #ifdef CONFIG_64BIT |
51 | struct pdc_pat_cell_num cell_info; | 51 | struct pdc_pat_cell_num cell_info; |
52 | #endif | 52 | #endif |
53 | 53 | ||
@@ -73,7 +73,7 @@ void __init setup_pdc(void) | |||
73 | * clearer message. | 73 | * clearer message. |
74 | */ | 74 | */ |
75 | 75 | ||
76 | #ifdef __LP64__ | 76 | #ifdef CONFIG_64BIT |
77 | status = pdc_pat_cell_get_number(&cell_info); | 77 | status = pdc_pat_cell_get_number(&cell_info); |
78 | if (status == PDC_OK) { | 78 | if (status == PDC_OK) { |
79 | pdc_type = PDC_TYPE_PAT; | 79 | pdc_type = PDC_TYPE_PAT; |
@@ -152,7 +152,7 @@ static void __init pagezero_memconfig(void) | |||
152 | npmem_ranges = 1; | 152 | npmem_ranges = 1; |
153 | } | 153 | } |
154 | 154 | ||
155 | #ifdef __LP64__ | 155 | #ifdef CONFIG_64BIT |
156 | 156 | ||
157 | /* All of the PDC PAT specific code is 64-bit only */ | 157 | /* All of the PDC PAT specific code is 64-bit only */ |
158 | 158 | ||
@@ -408,13 +408,13 @@ static void __init sprockets_memconfig(void) | |||
408 | } | 408 | } |
409 | } | 409 | } |
410 | 410 | ||
411 | #else /* !__LP64__ */ | 411 | #else /* !CONFIG_64BIT */ |
412 | 412 | ||
413 | #define pat_inventory() do { } while (0) | 413 | #define pat_inventory() do { } while (0) |
414 | #define pat_memconfig() do { } while (0) | 414 | #define pat_memconfig() do { } while (0) |
415 | #define sprockets_memconfig() pagezero_memconfig() | 415 | #define sprockets_memconfig() pagezero_memconfig() |
416 | 416 | ||
417 | #endif /* !__LP64__ */ | 417 | #endif /* !CONFIG_64BIT */ |
418 | 418 | ||
419 | 419 | ||
420 | #ifndef CONFIG_PA20 | 420 | #ifndef CONFIG_PA20 |
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index b39c5b9aff46..e9d09b020e86 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
@@ -336,11 +336,7 @@ unsigned int txn_alloc_data(unsigned int virt_irq) | |||
336 | 336 | ||
337 | static inline int eirr_to_irq(unsigned long eirr) | 337 | static inline int eirr_to_irq(unsigned long eirr) |
338 | { | 338 | { |
339 | #ifdef CONFIG_64BIT | 339 | int bit = fls_long(eirr); |
340 | int bit = fls64(eirr); | ||
341 | #else | ||
342 | int bit = fls(eirr); | ||
343 | #endif | ||
344 | return (BITS_PER_LONG - bit) + TIMER_IRQ; | 340 | return (BITS_PER_LONG - bit) + TIMER_IRQ; |
345 | } | 341 | } |
346 | 342 | ||
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c index f50b982b0834..fdacdd4341c9 100644 --- a/arch/parisc/kernel/module.c +++ b/arch/parisc/kernel/module.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <linux/fs.h> | 46 | #include <linux/fs.h> |
47 | #include <linux/string.h> | 47 | #include <linux/string.h> |
48 | #include <linux/kernel.h> | 48 | #include <linux/kernel.h> |
49 | #include <linux/bug.h> | ||
49 | 50 | ||
50 | #include <asm/unwind.h> | 51 | #include <asm/unwind.h> |
51 | 52 | ||
@@ -96,7 +97,7 @@ static inline int in_local_section(struct module *me, void *loc, void *dot) | |||
96 | } | 97 | } |
97 | 98 | ||
98 | 99 | ||
99 | #ifndef __LP64__ | 100 | #ifndef CONFIG_64BIT |
100 | struct got_entry { | 101 | struct got_entry { |
101 | Elf32_Addr addr; | 102 | Elf32_Addr addr; |
102 | }; | 103 | }; |
@@ -176,7 +177,7 @@ void *module_alloc(unsigned long size) | |||
176 | return vmalloc(size); | 177 | return vmalloc(size); |
177 | } | 178 | } |
178 | 179 | ||
179 | #ifndef __LP64__ | 180 | #ifndef CONFIG_64BIT |
180 | static inline unsigned long count_gots(const Elf_Rela *rela, unsigned long n) | 181 | static inline unsigned long count_gots(const Elf_Rela *rela, unsigned long n) |
181 | { | 182 | { |
182 | return 0; | 183 | return 0; |
@@ -319,7 +320,7 @@ int module_frob_arch_sections(CONST Elf_Ehdr *hdr, | |||
319 | return 0; | 320 | return 0; |
320 | } | 321 | } |
321 | 322 | ||
322 | #ifdef __LP64__ | 323 | #ifdef CONFIG_64BIT |
323 | static Elf64_Word get_got(struct module *me, unsigned long value, long addend) | 324 | static Elf64_Word get_got(struct module *me, unsigned long value, long addend) |
324 | { | 325 | { |
325 | unsigned int i; | 326 | unsigned int i; |
@@ -342,9 +343,9 @@ static Elf64_Word get_got(struct module *me, unsigned long value, long addend) | |||
342 | value); | 343 | value); |
343 | return i * sizeof(struct got_entry); | 344 | return i * sizeof(struct got_entry); |
344 | } | 345 | } |
345 | #endif /* __LP64__ */ | 346 | #endif /* CONFIG_64BIT */ |
346 | 347 | ||
347 | #ifdef __LP64__ | 348 | #ifdef CONFIG_64BIT |
348 | static Elf_Addr get_fdesc(struct module *me, unsigned long value) | 349 | static Elf_Addr get_fdesc(struct module *me, unsigned long value) |
349 | { | 350 | { |
350 | Elf_Fdesc *fdesc = me->module_core + me->arch.fdesc_offset; | 351 | Elf_Fdesc *fdesc = me->module_core + me->arch.fdesc_offset; |
@@ -368,7 +369,7 @@ static Elf_Addr get_fdesc(struct module *me, unsigned long value) | |||
368 | fdesc->gp = (Elf_Addr)me->module_core + me->arch.got_offset; | 369 | fdesc->gp = (Elf_Addr)me->module_core + me->arch.got_offset; |
369 | return (Elf_Addr)fdesc; | 370 | return (Elf_Addr)fdesc; |
370 | } | 371 | } |
371 | #endif /* __LP64__ */ | 372 | #endif /* CONFIG_64BIT */ |
372 | 373 | ||
373 | enum elf_stub_type { | 374 | enum elf_stub_type { |
374 | ELF_STUB_GOT, | 375 | ELF_STUB_GOT, |
@@ -394,7 +395,7 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend, | |||
394 | i * sizeof(struct stub_entry); | 395 | i * sizeof(struct stub_entry); |
395 | } | 396 | } |
396 | 397 | ||
397 | #ifndef __LP64__ | 398 | #ifndef CONFIG_64BIT |
398 | /* for 32-bit the stub looks like this: | 399 | /* for 32-bit the stub looks like this: |
399 | * ldil L'XXX,%r1 | 400 | * ldil L'XXX,%r1 |
400 | * be,n R'XXX(%sr4,%r1) | 401 | * be,n R'XXX(%sr4,%r1) |
@@ -472,7 +473,7 @@ int apply_relocate(Elf_Shdr *sechdrs, | |||
472 | return -ENOEXEC; | 473 | return -ENOEXEC; |
473 | } | 474 | } |
474 | 475 | ||
475 | #ifndef __LP64__ | 476 | #ifndef CONFIG_64BIT |
476 | int apply_relocate_add(Elf_Shdr *sechdrs, | 477 | int apply_relocate_add(Elf_Shdr *sechdrs, |
477 | const char *strtab, | 478 | const char *strtab, |
478 | unsigned int symindex, | 479 | unsigned int symindex, |
@@ -822,7 +823,8 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
822 | me->name, strtab, symhdr); | 823 | me->name, strtab, symhdr); |
823 | 824 | ||
824 | if(me->arch.got_count > MAX_GOTS) { | 825 | if(me->arch.got_count > MAX_GOTS) { |
825 | printk(KERN_ERR "%s: Global Offset Table overflow (used %ld, allowed %d\n", me->name, me->arch.got_count, MAX_GOTS); | 826 | printk(KERN_ERR "%s: Global Offset Table overflow (used %ld, allowed %d)\n", |
827 | me->name, me->arch.got_count, MAX_GOTS); | ||
826 | return -EINVAL; | 828 | return -EINVAL; |
827 | } | 829 | } |
828 | 830 | ||
@@ -850,10 +852,11 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
850 | nsyms = newptr - (Elf_Sym *)symhdr->sh_addr; | 852 | nsyms = newptr - (Elf_Sym *)symhdr->sh_addr; |
851 | DEBUGP("NEW num_symtab %lu\n", nsyms); | 853 | DEBUGP("NEW num_symtab %lu\n", nsyms); |
852 | symhdr->sh_size = nsyms * sizeof(Elf_Sym); | 854 | symhdr->sh_size = nsyms * sizeof(Elf_Sym); |
853 | return 0; | 855 | return module_bug_finalize(hdr, sechdrs, me); |
854 | } | 856 | } |
855 | 857 | ||
856 | void module_arch_cleanup(struct module *mod) | 858 | void module_arch_cleanup(struct module *mod) |
857 | { | 859 | { |
858 | deregister_unwind_table(mod); | 860 | deregister_unwind_table(mod); |
861 | module_bug_cleanup(mod); | ||
859 | } | 862 | } |
diff --git a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S index e81c9937d10a..90b240878520 100644 --- a/arch/parisc/kernel/pacache.S +++ b/arch/parisc/kernel/pacache.S | |||
@@ -27,31 +27,21 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | #ifdef CONFIG_64BIT | 29 | #ifdef CONFIG_64BIT |
30 | #define ADDIB addib,* | ||
31 | #define CMPB cmpb,* | ||
32 | #define ANDCM andcm,* | ||
33 | |||
34 | .level 2.0w | 30 | .level 2.0w |
35 | #else | 31 | #else |
36 | #define ADDIB addib, | ||
37 | #define CMPB cmpb, | ||
38 | #define ANDCM andcm | ||
39 | |||
40 | .level 2.0 | 32 | .level 2.0 |
41 | #endif | 33 | #endif |
42 | 34 | ||
43 | |||
44 | #include <asm/psw.h> | 35 | #include <asm/psw.h> |
45 | #include <asm/assembly.h> | 36 | #include <asm/assembly.h> |
46 | #include <asm/pgtable.h> | 37 | #include <asm/pgtable.h> |
47 | #include <asm/cache.h> | 38 | #include <asm/cache.h> |
39 | #include <linux/linkage.h> | ||
48 | 40 | ||
49 | .text | 41 | .text |
50 | .align 128 | 42 | .align 128 |
51 | 43 | ||
52 | .export flush_tlb_all_local,code | 44 | ENTRY(flush_tlb_all_local) |
53 | |||
54 | flush_tlb_all_local: | ||
55 | .proc | 45 | .proc |
56 | .callinfo NO_CALLS | 46 | .callinfo NO_CALLS |
57 | .entry | 47 | .entry |
@@ -200,11 +190,11 @@ fdtdone: | |||
200 | 190 | ||
201 | .exit | 191 | .exit |
202 | .procend | 192 | .procend |
193 | ENDPROC(flush_tlb_all_local) | ||
203 | 194 | ||
204 | .export flush_instruction_cache_local,code | ||
205 | .import cache_info,data | 195 | .import cache_info,data |
206 | 196 | ||
207 | flush_instruction_cache_local: | 197 | ENTRY(flush_instruction_cache_local) |
208 | .proc | 198 | .proc |
209 | .callinfo NO_CALLS | 199 | .callinfo NO_CALLS |
210 | .entry | 200 | .entry |
@@ -241,11 +231,11 @@ fisync: | |||
241 | .exit | 231 | .exit |
242 | 232 | ||
243 | .procend | 233 | .procend |
234 | ENDPROC(flush_instruction_cache_local) | ||
244 | 235 | ||
245 | .export flush_data_cache_local, code | ||
246 | .import cache_info, data | ||
247 | 236 | ||
248 | flush_data_cache_local: | 237 | .import cache_info, data |
238 | ENTRY(flush_data_cache_local) | ||
249 | .proc | 239 | .proc |
250 | .callinfo NO_CALLS | 240 | .callinfo NO_CALLS |
251 | .entry | 241 | .entry |
@@ -283,11 +273,11 @@ fdsync: | |||
283 | .exit | 273 | .exit |
284 | 274 | ||
285 | .procend | 275 | .procend |
276 | ENDPROC(flush_data_cache_local) | ||
286 | 277 | ||
287 | .export copy_user_page_asm,code | ||
288 | .align 16 | 278 | .align 16 |
289 | 279 | ||
290 | copy_user_page_asm: | 280 | ENTRY(copy_user_page_asm) |
291 | .proc | 281 | .proc |
292 | .callinfo NO_CALLS | 282 | .callinfo NO_CALLS |
293 | .entry | 283 | .entry |
@@ -409,6 +399,7 @@ copy_user_page_asm: | |||
409 | .exit | 399 | .exit |
410 | 400 | ||
411 | .procend | 401 | .procend |
402 | ENDPROC(copy_user_page_asm) | ||
412 | 403 | ||
413 | /* | 404 | /* |
414 | * NOTE: Code in clear_user_page has a hard coded dependency on the | 405 | * NOTE: Code in clear_user_page has a hard coded dependency on the |
@@ -446,9 +437,7 @@ copy_user_page_asm: | |||
446 | * lobby for such a change. | 437 | * lobby for such a change. |
447 | */ | 438 | */ |
448 | 439 | ||
449 | .export copy_user_page_asm,code | 440 | ENTRY(copy_user_page_asm) |
450 | |||
451 | copy_user_page_asm: | ||
452 | .proc | 441 | .proc |
453 | .callinfo NO_CALLS | 442 | .callinfo NO_CALLS |
454 | .entry | 443 | .entry |
@@ -534,11 +523,10 @@ copy_user_page_asm: | |||
534 | .exit | 523 | .exit |
535 | 524 | ||
536 | .procend | 525 | .procend |
526 | ENDPROC(copy_user_page_asm) | ||
537 | #endif | 527 | #endif |
538 | 528 | ||
539 | .export __clear_user_page_asm,code | 529 | ENTRY(__clear_user_page_asm) |
540 | |||
541 | __clear_user_page_asm: | ||
542 | .proc | 530 | .proc |
543 | .callinfo NO_CALLS | 531 | .callinfo NO_CALLS |
544 | .entry | 532 | .entry |
@@ -618,10 +606,9 @@ __clear_user_page_asm: | |||
618 | .exit | 606 | .exit |
619 | 607 | ||
620 | .procend | 608 | .procend |
609 | ENDPROC(__clear_user_page_asm) | ||
621 | 610 | ||
622 | .export flush_kernel_dcache_page_asm | 611 | ENTRY(flush_kernel_dcache_page_asm) |
623 | |||
624 | flush_kernel_dcache_page_asm: | ||
625 | .proc | 612 | .proc |
626 | .callinfo NO_CALLS | 613 | .callinfo NO_CALLS |
627 | .entry | 614 | .entry |
@@ -662,10 +649,9 @@ flush_kernel_dcache_page_asm: | |||
662 | .exit | 649 | .exit |
663 | 650 | ||
664 | .procend | 651 | .procend |
652 | ENDPROC(flush_kernel_dcache_page_asm) | ||
665 | 653 | ||
666 | .export flush_user_dcache_page | 654 | ENTRY(flush_user_dcache_page) |
667 | |||
668 | flush_user_dcache_page: | ||
669 | .proc | 655 | .proc |
670 | .callinfo NO_CALLS | 656 | .callinfo NO_CALLS |
671 | .entry | 657 | .entry |
@@ -706,10 +692,9 @@ flush_user_dcache_page: | |||
706 | .exit | 692 | .exit |
707 | 693 | ||
708 | .procend | 694 | .procend |
695 | ENDPROC(flush_user_dcache_page) | ||
709 | 696 | ||
710 | .export flush_user_icache_page | 697 | ENTRY(flush_user_icache_page) |
711 | |||
712 | flush_user_icache_page: | ||
713 | .proc | 698 | .proc |
714 | .callinfo NO_CALLS | 699 | .callinfo NO_CALLS |
715 | .entry | 700 | .entry |
@@ -750,11 +735,10 @@ flush_user_icache_page: | |||
750 | .exit | 735 | .exit |
751 | 736 | ||
752 | .procend | 737 | .procend |
738 | ENDPROC(flush_user_icache_page) | ||
753 | 739 | ||
754 | 740 | ||
755 | .export purge_kernel_dcache_page | 741 | ENTRY(purge_kernel_dcache_page) |
756 | |||
757 | purge_kernel_dcache_page: | ||
758 | .proc | 742 | .proc |
759 | .callinfo NO_CALLS | 743 | .callinfo NO_CALLS |
760 | .entry | 744 | .entry |
@@ -794,15 +778,14 @@ purge_kernel_dcache_page: | |||
794 | .exit | 778 | .exit |
795 | 779 | ||
796 | .procend | 780 | .procend |
781 | ENDPROC(purge_kernel_dcache_page) | ||
797 | 782 | ||
798 | #if 0 | 783 | #if 0 |
799 | /* Currently not used, but it still is a possible alternate | 784 | /* Currently not used, but it still is a possible alternate |
800 | * solution. | 785 | * solution. |
801 | */ | 786 | */ |
802 | 787 | ||
803 | .export flush_alias_page | 788 | ENTRY(flush_alias_page) |
804 | |||
805 | flush_alias_page: | ||
806 | .proc | 789 | .proc |
807 | .callinfo NO_CALLS | 790 | .callinfo NO_CALLS |
808 | .entry | 791 | .entry |
@@ -882,10 +865,9 @@ flush_user_dcache_range_asm: | |||
882 | .exit | 865 | .exit |
883 | 866 | ||
884 | .procend | 867 | .procend |
868 | ENDPROC(flush_alias_page) | ||
885 | 869 | ||
886 | .export flush_kernel_dcache_range_asm | 870 | ENTRY(flush_kernel_dcache_range_asm) |
887 | |||
888 | flush_kernel_dcache_range_asm: | ||
889 | .proc | 871 | .proc |
890 | .callinfo NO_CALLS | 872 | .callinfo NO_CALLS |
891 | .entry | 873 | .entry |
@@ -905,10 +887,9 @@ flush_kernel_dcache_range_asm: | |||
905 | .exit | 887 | .exit |
906 | 888 | ||
907 | .procend | 889 | .procend |
890 | ENDPROC(flush_kernel_dcache_range_asm) | ||
908 | 891 | ||
909 | .export flush_user_icache_range_asm | 892 | ENTRY(flush_user_icache_range_asm) |
910 | |||
911 | flush_user_icache_range_asm: | ||
912 | .proc | 893 | .proc |
913 | .callinfo NO_CALLS | 894 | .callinfo NO_CALLS |
914 | .entry | 895 | .entry |
@@ -927,10 +908,9 @@ flush_user_icache_range_asm: | |||
927 | .exit | 908 | .exit |
928 | 909 | ||
929 | .procend | 910 | .procend |
911 | ENDPROC(flush_user_icache_range_asm) | ||
930 | 912 | ||
931 | .export flush_kernel_icache_page | 913 | ENTRY(flush_kernel_icache_page) |
932 | |||
933 | flush_kernel_icache_page: | ||
934 | .proc | 914 | .proc |
935 | .callinfo NO_CALLS | 915 | .callinfo NO_CALLS |
936 | .entry | 916 | .entry |
@@ -971,10 +951,9 @@ flush_kernel_icache_page: | |||
971 | .exit | 951 | .exit |
972 | 952 | ||
973 | .procend | 953 | .procend |
954 | ENDPROC(flush_kernel_icache_page) | ||
974 | 955 | ||
975 | .export flush_kernel_icache_range_asm | 956 | ENTRY(flush_kernel_icache_range_asm) |
976 | |||
977 | flush_kernel_icache_range_asm: | ||
978 | .proc | 957 | .proc |
979 | .callinfo NO_CALLS | 958 | .callinfo NO_CALLS |
980 | .entry | 959 | .entry |
@@ -992,14 +971,13 @@ flush_kernel_icache_range_asm: | |||
992 | nop | 971 | nop |
993 | .exit | 972 | .exit |
994 | .procend | 973 | .procend |
974 | ENDPROC(flush_kernel_icache_range_asm) | ||
995 | 975 | ||
996 | /* align should cover use of rfi in disable_sr_hashing_asm and | 976 | /* align should cover use of rfi in disable_sr_hashing_asm and |
997 | * srdis_done. | 977 | * srdis_done. |
998 | */ | 978 | */ |
999 | .align 256 | 979 | .align 256 |
1000 | .export disable_sr_hashing_asm,code | 980 | ENTRY(disable_sr_hashing_asm) |
1001 | |||
1002 | disable_sr_hashing_asm: | ||
1003 | .proc | 981 | .proc |
1004 | .callinfo NO_CALLS | 982 | .callinfo NO_CALLS |
1005 | .entry | 983 | .entry |
@@ -1088,5 +1066,6 @@ srdis_done: | |||
1088 | .exit | 1066 | .exit |
1089 | 1067 | ||
1090 | .procend | 1068 | .procend |
1069 | ENDPROC(disable_sr_hashing_asm) | ||
1091 | 1070 | ||
1092 | .end | 1071 | .end |
diff --git a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c index 8f6a0b312f7a..7aca704e96f0 100644 --- a/arch/parisc/kernel/parisc_ksyms.c +++ b/arch/parisc/kernel/parisc_ksyms.c | |||
@@ -7,7 +7,7 @@ | |||
7 | * Copyright (C) 2001-2003 Grant Grundler <grundler with parisc-linux.org> | 7 | * Copyright (C) 2001-2003 Grant Grundler <grundler with parisc-linux.org> |
8 | * Copyright (C) 2002-2003 Matthew Wilcox <willy at parisc-linux.org> | 8 | * Copyright (C) 2002-2003 Matthew Wilcox <willy at parisc-linux.org> |
9 | * Copyright (C) 2002 Randolph Chung <tausq at parisc-linux.org> | 9 | * Copyright (C) 2002 Randolph Chung <tausq at parisc-linux.org> |
10 | * Copyright (C) 2002-2003 Helge Deller <deller with parisc-linux.org> | 10 | * Copyright (C) 2002-2007 Helge Deller <deller with parisc-linux.org> |
11 | * | 11 | * |
12 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
13 | * it under the terms of the GNU General Public License as published by | 13 | * it under the terms of the GNU General Public License as published by |
@@ -38,7 +38,7 @@ EXPORT_SYMBOL(__cmpxchg_u32); | |||
38 | #ifdef CONFIG_SMP | 38 | #ifdef CONFIG_SMP |
39 | EXPORT_SYMBOL(__atomic_hash); | 39 | EXPORT_SYMBOL(__atomic_hash); |
40 | #endif | 40 | #endif |
41 | #ifdef __LP64__ | 41 | #ifdef CONFIG_64BIT |
42 | EXPORT_SYMBOL(__xchg64); | 42 | EXPORT_SYMBOL(__xchg64); |
43 | EXPORT_SYMBOL(__cmpxchg_u64); | 43 | EXPORT_SYMBOL(__cmpxchg_u64); |
44 | #endif | 44 | #endif |
@@ -58,7 +58,7 @@ EXPORT_SYMBOL(fixup_get_user_skip_2); | |||
58 | EXPORT_SYMBOL(fixup_put_user_skip_1); | 58 | EXPORT_SYMBOL(fixup_put_user_skip_1); |
59 | EXPORT_SYMBOL(fixup_put_user_skip_2); | 59 | EXPORT_SYMBOL(fixup_put_user_skip_2); |
60 | 60 | ||
61 | #ifndef __LP64__ | 61 | #ifndef CONFIG_64BIT |
62 | /* Needed so insmod can set dp value */ | 62 | /* Needed so insmod can set dp value */ |
63 | extern int $global$; | 63 | extern int $global$; |
64 | EXPORT_SYMBOL($global$); | 64 | EXPORT_SYMBOL($global$); |
@@ -135,7 +135,7 @@ EXPORT_SYMBOL(__muldi3); | |||
135 | asmlinkage void * __canonicalize_funcptr_for_compare(void *); | 135 | asmlinkage void * __canonicalize_funcptr_for_compare(void *); |
136 | EXPORT_SYMBOL(__canonicalize_funcptr_for_compare); | 136 | EXPORT_SYMBOL(__canonicalize_funcptr_for_compare); |
137 | 137 | ||
138 | #ifdef __LP64__ | 138 | #ifdef CONFIG_64BIT |
139 | extern void __divdi3(void); | 139 | extern void __divdi3(void); |
140 | extern void __udivdi3(void); | 140 | extern void __udivdi3(void); |
141 | extern void __umoddi3(void); | 141 | extern void __umoddi3(void); |
@@ -147,7 +147,7 @@ EXPORT_SYMBOL(__umoddi3); | |||
147 | EXPORT_SYMBOL(__moddi3); | 147 | EXPORT_SYMBOL(__moddi3); |
148 | #endif | 148 | #endif |
149 | 149 | ||
150 | #ifndef __LP64__ | 150 | #ifndef CONFIG_64BIT |
151 | extern void $$dyncall(void); | 151 | extern void $$dyncall(void); |
152 | EXPORT_SYMBOL($$dyncall); | 152 | EXPORT_SYMBOL($$dyncall); |
153 | #endif | 153 | #endif |
diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c index a6caf1073085..0c3aecb85a5c 100644 --- a/arch/parisc/kernel/pci-dma.c +++ b/arch/parisc/kernel/pci-dma.c | |||
@@ -342,7 +342,7 @@ pcxl_dma_init(void) | |||
342 | pcxl_res_map = (char *)__get_free_pages(GFP_KERNEL, | 342 | pcxl_res_map = (char *)__get_free_pages(GFP_KERNEL, |
343 | get_order(pcxl_res_size)); | 343 | get_order(pcxl_res_size)); |
344 | memset(pcxl_res_map, 0, pcxl_res_size); | 344 | memset(pcxl_res_map, 0, pcxl_res_size); |
345 | proc_gsc_root = proc_mkdir("gsc", 0); | 345 | proc_gsc_root = proc_mkdir("gsc", NULL); |
346 | if (!proc_gsc_root) | 346 | if (!proc_gsc_root) |
347 | printk(KERN_WARNING | 347 | printk(KERN_WARNING |
348 | "pcxl_dma_init: Unable to create gsc /proc dir entry\n"); | 348 | "pcxl_dma_init: Unable to create gsc /proc dir entry\n"); |
diff --git a/arch/parisc/kernel/pci.c b/arch/parisc/kernel/pci.c index 199887a61c76..563df0072dee 100644 --- a/arch/parisc/kernel/pci.c +++ b/arch/parisc/kernel/pci.c | |||
@@ -200,8 +200,8 @@ static void | |||
200 | pcibios_link_hba_resources( struct resource *hba_res, struct resource *r) | 200 | pcibios_link_hba_resources( struct resource *hba_res, struct resource *r) |
201 | { | 201 | { |
202 | if (!r->parent) { | 202 | if (!r->parent) { |
203 | printk(KERN_EMERG "PCI: resource not parented! [%lx-%lx]\n", | 203 | printk(KERN_EMERG "PCI: resource not parented! [%p-%p]\n", |
204 | r->start, r->end); | 204 | (void*) r->start, (void*) r->end); |
205 | r->parent = hba_res; | 205 | r->parent = hba_res; |
206 | 206 | ||
207 | /* reverse link is harder *sigh* */ | 207 | /* reverse link is harder *sigh* */ |
diff --git a/arch/parisc/kernel/perf_asm.S b/arch/parisc/kernel/perf_asm.S index 5e7bb90e7e08..43874ca3ed67 100644 --- a/arch/parisc/kernel/perf_asm.S +++ b/arch/parisc/kernel/perf_asm.S | |||
@@ -20,6 +20,7 @@ | |||
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <asm/assembly.h> | 22 | #include <asm/assembly.h> |
23 | #include <linux/linkage.h> | ||
23 | 24 | ||
24 | #ifdef CONFIG_64BIT | 25 | #ifdef CONFIG_64BIT |
25 | .level 2.0w | 26 | .level 2.0w |
@@ -41,10 +42,8 @@ | |||
41 | ; starting/stopping the coprocessor with the pmenb/pmdis. | 42 | ; starting/stopping the coprocessor with the pmenb/pmdis. |
42 | ; | 43 | ; |
43 | .text | 44 | .text |
44 | .align 32 | ||
45 | 45 | ||
46 | .export perf_intrigue_enable_perf_counters,code | 46 | ENTRY(perf_intrigue_enable_perf_counters) |
47 | perf_intrigue_enable_perf_counters: | ||
48 | .proc | 47 | .proc |
49 | .callinfo frame=0,NO_CALLS | 48 | .callinfo frame=0,NO_CALLS |
50 | .entry | 49 | .entry |
@@ -69,9 +68,9 @@ perf_intrigue_enable_perf_counters: | |||
69 | nop | 68 | nop |
70 | .exit | 69 | .exit |
71 | .procend | 70 | .procend |
71 | ENDPROC(perf_intrigue_enable_perf_counters) | ||
72 | 72 | ||
73 | .export perf_intrigue_disable_perf_counters,code | 73 | ENTRY(perf_intrigue_disable_perf_counters) |
74 | perf_intrigue_disable_perf_counters: | ||
75 | .proc | 74 | .proc |
76 | .callinfo frame=0,NO_CALLS | 75 | .callinfo frame=0,NO_CALLS |
77 | .entry | 76 | .entry |
@@ -86,6 +85,7 @@ perf_intrigue_disable_perf_counters: | |||
86 | mtctl %r26,ccr ; turn off performance coprocessor | 85 | mtctl %r26,ccr ; turn off performance coprocessor |
87 | .exit | 86 | .exit |
88 | .procend | 87 | .procend |
88 | ENDPROC(perf_intrigue_disable_perf_counters) | ||
89 | 89 | ||
90 | ;*********************************************************************** | 90 | ;*********************************************************************** |
91 | ;* | 91 | ;* |
@@ -117,8 +117,7 @@ perf_intrigue_disable_perf_counters: | |||
117 | ;* | 117 | ;* |
118 | ;*********************************************************************** | 118 | ;*********************************************************************** |
119 | 119 | ||
120 | .export perf_rdr_shift_in_W,code | 120 | ENTRY(perf_rdr_shift_in_W) |
121 | perf_rdr_shift_in_W: | ||
122 | .proc | 121 | .proc |
123 | .callinfo frame=0,NO_CALLS | 122 | .callinfo frame=0,NO_CALLS |
124 | .entry | 123 | .entry |
@@ -550,6 +549,7 @@ perf_rdr_shift_in_W_leave: | |||
550 | .exit | 549 | .exit |
551 | MTDIAG_2 (24) ; restore DR2 | 550 | MTDIAG_2 (24) ; restore DR2 |
552 | .procend | 551 | .procend |
552 | ENDPROC(perf_rdr_shift_in_W) | ||
553 | 553 | ||
554 | 554 | ||
555 | ;*********************************************************************** | 555 | ;*********************************************************************** |
@@ -575,8 +575,7 @@ perf_rdr_shift_in_W_leave: | |||
575 | ;* | 575 | ;* |
576 | ;*********************************************************************** | 576 | ;*********************************************************************** |
577 | 577 | ||
578 | .export perf_rdr_shift_out_W,code | 578 | ENTRY(perf_rdr_shift_out_W) |
579 | perf_rdr_shift_out_W: | ||
580 | .proc | 579 | .proc |
581 | .callinfo frame=0,NO_CALLS | 580 | .callinfo frame=0,NO_CALLS |
582 | .entry | 581 | .entry |
@@ -983,6 +982,7 @@ perf_rdr_shift_out_W_leave: | |||
983 | .exit | 982 | .exit |
984 | MTDIAG_2 (23) ; restore DR2 | 983 | MTDIAG_2 (23) ; restore DR2 |
985 | .procend | 984 | .procend |
985 | ENDPROC(perf_rdr_shift_out_W) | ||
986 | 986 | ||
987 | 987 | ||
988 | ;*********************************************************************** | 988 | ;*********************************************************************** |
@@ -1012,8 +1012,7 @@ perf_rdr_shift_out_W_leave: | |||
1012 | ;* | 1012 | ;* |
1013 | ;*********************************************************************** | 1013 | ;*********************************************************************** |
1014 | 1014 | ||
1015 | .export perf_rdr_shift_in_U,code | 1015 | ENTRY(perf_rdr_shift_in_U) |
1016 | perf_rdr_shift_in_U: | ||
1017 | .proc | 1016 | .proc |
1018 | .callinfo frame=0,NO_CALLS | 1017 | .callinfo frame=0,NO_CALLS |
1019 | .entry | 1018 | .entry |
@@ -1343,6 +1342,7 @@ perf_rdr_shift_in_U_leave: | |||
1343 | .exit | 1342 | .exit |
1344 | MTDIAG_2 (24) ; restore DR2 | 1343 | MTDIAG_2 (24) ; restore DR2 |
1345 | .procend | 1344 | .procend |
1345 | ENDPROC(perf_rdr_shift_in_U) | ||
1346 | 1346 | ||
1347 | ;*********************************************************************** | 1347 | ;*********************************************************************** |
1348 | ;* | 1348 | ;* |
@@ -1369,8 +1369,7 @@ perf_rdr_shift_in_U_leave: | |||
1369 | ;* | 1369 | ;* |
1370 | ;*********************************************************************** | 1370 | ;*********************************************************************** |
1371 | 1371 | ||
1372 | .export perf_rdr_shift_out_U,code | 1372 | ENTRY(perf_rdr_shift_out_U) |
1373 | perf_rdr_shift_out_U: | ||
1374 | .proc | 1373 | .proc |
1375 | .callinfo frame=0,NO_CALLS | 1374 | .callinfo frame=0,NO_CALLS |
1376 | .entry | 1375 | .entry |
@@ -1687,4 +1686,5 @@ perf_rdr_shift_out_U_leave: | |||
1687 | .exit | 1686 | .exit |
1688 | MTDIAG_2 (23) ; restore DR2 | 1687 | MTDIAG_2 (23) ; restore DR2 |
1689 | .procend | 1688 | .procend |
1689 | ENDPROC(perf_rdr_shift_out_U) | ||
1690 | 1690 | ||
diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c index 2f9f9dfa66f7..0dd3847f494c 100644 --- a/arch/parisc/kernel/process.c +++ b/arch/parisc/kernel/process.c | |||
@@ -13,7 +13,7 @@ | |||
13 | * Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org> | 13 | * Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org> |
14 | * Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org> | 14 | * Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org> |
15 | * Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org> | 15 | * Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org> |
16 | * Copyright (C) 2001-2002 Helge Deller <deller at parisc-linux.org> | 16 | * Copyright (C) 2001-2007 Helge Deller <deller at parisc-linux.org> |
17 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> | 17 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> |
18 | * | 18 | * |
19 | * | 19 | * |
@@ -303,7 +303,7 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long usp, | |||
303 | * Copy function and argument to be called from | 303 | * Copy function and argument to be called from |
304 | * ret_from_kernel_thread. | 304 | * ret_from_kernel_thread. |
305 | */ | 305 | */ |
306 | #ifdef __LP64__ | 306 | #ifdef CONFIG_64BIT |
307 | cregs->gr[27] = pregs->gr[27]; | 307 | cregs->gr[27] = pregs->gr[27]; |
308 | #endif | 308 | #endif |
309 | cregs->gr[26] = pregs->gr[26]; | 309 | cregs->gr[26] = pregs->gr[26]; |
@@ -355,8 +355,8 @@ asmlinkage int sys_execve(struct pt_regs *regs) | |||
355 | error = PTR_ERR(filename); | 355 | error = PTR_ERR(filename); |
356 | if (IS_ERR(filename)) | 356 | if (IS_ERR(filename)) |
357 | goto out; | 357 | goto out; |
358 | error = do_execve(filename, (char __user **) regs->gr[25], | 358 | error = do_execve(filename, (char __user * __user *) regs->gr[25], |
359 | (char __user **) regs->gr[24], regs); | 359 | (char __user * __user *) regs->gr[24], regs); |
360 | if (error == 0) { | 360 | if (error == 0) { |
361 | task_lock(current); | 361 | task_lock(current); |
362 | current->ptrace &= ~PT_DTRACE; | 362 | current->ptrace &= ~PT_DTRACE; |
diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c index fb81e5687e7c..7c056dcebf55 100644 --- a/arch/parisc/kernel/processor.c +++ b/arch/parisc/kernel/processor.c | |||
@@ -93,7 +93,7 @@ static int __init processor_probe(struct parisc_device *dev) | |||
93 | cpuid = boot_cpu_data.cpu_count; | 93 | cpuid = boot_cpu_data.cpu_count; |
94 | txn_addr = dev->hpa.start; /* for legacy PDC */ | 94 | txn_addr = dev->hpa.start; /* for legacy PDC */ |
95 | 95 | ||
96 | #ifdef __LP64__ | 96 | #ifdef CONFIG_64BIT |
97 | if (is_pdc_pat()) { | 97 | if (is_pdc_pat()) { |
98 | ulong status; | 98 | ulong status; |
99 | unsigned long bytecnt; | 99 | unsigned long bytecnt; |
@@ -153,8 +153,6 @@ static int __init processor_probe(struct parisc_device *dev) | |||
153 | p->cpuid = cpuid; /* save CPU id */ | 153 | p->cpuid = cpuid; /* save CPU id */ |
154 | p->txn_addr = txn_addr; /* save CPU IRQ address */ | 154 | p->txn_addr = txn_addr; /* save CPU IRQ address */ |
155 | #ifdef CONFIG_SMP | 155 | #ifdef CONFIG_SMP |
156 | spin_lock_init(&p->lock); | ||
157 | |||
158 | /* | 156 | /* |
159 | ** FIXME: review if any other initialization is clobbered | 157 | ** FIXME: review if any other initialization is clobbered |
160 | ** for boot_cpu by the above memset(). | 158 | ** for boot_cpu by the above memset(). |
@@ -311,11 +309,11 @@ int __init init_per_cpu(int cpunum) | |||
311 | } else { | 309 | } else { |
312 | printk(KERN_WARNING "WARNING: No FP CoProcessor?!" | 310 | printk(KERN_WARNING "WARNING: No FP CoProcessor?!" |
313 | " (coproc_cfg.ccr_functional == 0x%lx, expected 0xc0)\n" | 311 | " (coproc_cfg.ccr_functional == 0x%lx, expected 0xc0)\n" |
314 | #ifdef __LP64__ | 312 | #ifdef CONFIG_64BIT |
315 | "Halting Machine - FP required\n" | 313 | "Halting Machine - FP required\n" |
316 | #endif | 314 | #endif |
317 | , coproc_cfg.ccr_functional); | 315 | , coproc_cfg.ccr_functional); |
318 | #ifdef __LP64__ | 316 | #ifdef CONFIG_64BIT |
319 | mdelay(100); /* previous chars get pushed to console */ | 317 | mdelay(100); /* previous chars get pushed to console */ |
320 | panic("FP CoProc not reported"); | 318 | panic("FP CoProc not reported"); |
321 | #endif | 319 | #endif |
@@ -339,9 +337,6 @@ show_cpuinfo (struct seq_file *m, void *v) | |||
339 | #ifdef CONFIG_SMP | 337 | #ifdef CONFIG_SMP |
340 | if (0 == cpu_data[n].hpa) | 338 | if (0 == cpu_data[n].hpa) |
341 | continue; | 339 | continue; |
342 | #ifdef ENTRY_SYS_CPUS | ||
343 | #error iCOD support wants to show CPU state here | ||
344 | #endif | ||
345 | #endif | 340 | #endif |
346 | seq_printf(m, "processor\t: %d\n" | 341 | seq_printf(m, "processor\t: %d\n" |
347 | "cpu family\t: PA-RISC %s\n", | 342 | "cpu family\t: PA-RISC %s\n", |
diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 3f28de974556..0d0d617b6f21 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c | |||
@@ -36,7 +36,7 @@ | |||
36 | #define DBG(x...) | 36 | #define DBG(x...) |
37 | #endif | 37 | #endif |
38 | 38 | ||
39 | #ifdef __LP64__ | 39 | #ifdef CONFIG_64BIT |
40 | 40 | ||
41 | /* This function is needed to translate 32 bit pt_regs offsets in to | 41 | /* This function is needed to translate 32 bit pt_regs offsets in to |
42 | * 64 bit pt_regs offsets. For example, a 32 bit gdb under a 64 bit kernel | 42 | * 64 bit pt_regs offsets. For example, a 32 bit gdb under a 64 bit kernel |
@@ -90,7 +90,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
90 | case PTRACE_PEEKDATA: { | 90 | case PTRACE_PEEKDATA: { |
91 | int copied; | 91 | int copied; |
92 | 92 | ||
93 | #ifdef __LP64__ | 93 | #ifdef CONFIG_64BIT |
94 | if (__is_compat_task(child)) { | 94 | if (__is_compat_task(child)) { |
95 | unsigned int tmp; | 95 | unsigned int tmp; |
96 | 96 | ||
@@ -122,7 +122,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
122 | case PTRACE_POKETEXT: /* write the word at location addr. */ | 122 | case PTRACE_POKETEXT: /* write the word at location addr. */ |
123 | case PTRACE_POKEDATA: | 123 | case PTRACE_POKEDATA: |
124 | ret = 0; | 124 | ret = 0; |
125 | #ifdef __LP64__ | 125 | #ifdef CONFIG_64BIT |
126 | if (__is_compat_task(child)) { | 126 | if (__is_compat_task(child)) { |
127 | unsigned int tmp = (unsigned int)data; | 127 | unsigned int tmp = (unsigned int)data; |
128 | DBG("sys_ptrace(POKE%s, %d, %lx, %lx)\n", | 128 | DBG("sys_ptrace(POKE%s, %d, %lx, %lx)\n", |
@@ -145,7 +145,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
145 | processes, the kernel saves all regs on a syscall. */ | 145 | processes, the kernel saves all regs on a syscall. */ |
146 | case PTRACE_PEEKUSR: { | 146 | case PTRACE_PEEKUSR: { |
147 | ret = -EIO; | 147 | ret = -EIO; |
148 | #ifdef __LP64__ | 148 | #ifdef CONFIG_64BIT |
149 | if (__is_compat_task(child)) { | 149 | if (__is_compat_task(child)) { |
150 | unsigned int tmp; | 150 | unsigned int tmp; |
151 | 151 | ||
@@ -204,7 +204,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
204 | ret = 0; | 204 | ret = 0; |
205 | goto out_tsk; | 205 | goto out_tsk; |
206 | } | 206 | } |
207 | #ifdef __LP64__ | 207 | #ifdef CONFIG_64BIT |
208 | if (__is_compat_task(child)) { | 208 | if (__is_compat_task(child)) { |
209 | if (addr & (sizeof(int)-1)) | 209 | if (addr & (sizeof(int)-1)) |
210 | goto out_tsk; | 210 | goto out_tsk; |
diff --git a/arch/parisc/kernel/real2.S b/arch/parisc/kernel/real2.S index 789061f6ceb4..7a92695d95a6 100644 --- a/arch/parisc/kernel/real2.S +++ b/arch/parisc/kernel/real2.S | |||
@@ -11,6 +11,8 @@ | |||
11 | #include <asm/psw.h> | 11 | #include <asm/psw.h> |
12 | #include <asm/assembly.h> | 12 | #include <asm/assembly.h> |
13 | 13 | ||
14 | #include <linux/linkage.h> | ||
15 | |||
14 | .section .bss | 16 | .section .bss |
15 | .export real_stack | 17 | .export real_stack |
16 | .export real32_stack | 18 | .export real32_stack |
@@ -39,8 +41,6 @@ save_cr_end: | |||
39 | 41 | ||
40 | .text | 42 | .text |
41 | 43 | ||
42 | .export real32_call_asm | ||
43 | |||
44 | /* unsigned long real32_call_asm(unsigned int *sp, | 44 | /* unsigned long real32_call_asm(unsigned int *sp, |
45 | * unsigned int *arg0p, | 45 | * unsigned int *arg0p, |
46 | * unsigned int iodc_fn) | 46 | * unsigned int iodc_fn) |
@@ -49,7 +49,7 @@ save_cr_end: | |||
49 | * iodc_fn is the IODC function to call | 49 | * iodc_fn is the IODC function to call |
50 | */ | 50 | */ |
51 | 51 | ||
52 | real32_call_asm: | 52 | ENTRY(real32_call_asm) |
53 | STREG %rp, -RP_OFFSET(%sp) /* save RP */ | 53 | STREG %rp, -RP_OFFSET(%sp) /* save RP */ |
54 | #ifdef CONFIG_64BIT | 54 | #ifdef CONFIG_64BIT |
55 | callee_save | 55 | callee_save |
@@ -107,6 +107,7 @@ ric_ret: | |||
107 | LDREG -RP_OFFSET(%sp), %rp /* restore RP */ | 107 | LDREG -RP_OFFSET(%sp), %rp /* restore RP */ |
108 | bv 0(%rp) | 108 | bv 0(%rp) |
109 | nop | 109 | nop |
110 | ENDPROC(real32_call_asm) | ||
110 | 111 | ||
111 | 112 | ||
112 | # define PUSH_CR(r, where) mfctl r, %r1 ! STREG,ma %r1, REG_SZ(where) | 113 | # define PUSH_CR(r, where) mfctl r, %r1 ! STREG,ma %r1, REG_SZ(where) |
@@ -218,7 +219,6 @@ rfi_r2v_1: | |||
218 | /************************ 64-bit real-mode calls ***********************/ | 219 | /************************ 64-bit real-mode calls ***********************/ |
219 | /* This is only usable in wide kernels right now and will probably stay so */ | 220 | /* This is only usable in wide kernels right now and will probably stay so */ |
220 | .text | 221 | .text |
221 | .export real64_call_asm | ||
222 | /* unsigned long real64_call_asm(unsigned long *sp, | 222 | /* unsigned long real64_call_asm(unsigned long *sp, |
223 | * unsigned long *arg0p, | 223 | * unsigned long *arg0p, |
224 | * unsigned long fn) | 224 | * unsigned long fn) |
@@ -226,7 +226,7 @@ rfi_r2v_1: | |||
226 | * arg0p points to where saved arg values may be found | 226 | * arg0p points to where saved arg values may be found |
227 | * iodc_fn is the IODC function to call | 227 | * iodc_fn is the IODC function to call |
228 | */ | 228 | */ |
229 | real64_call_asm: | 229 | ENTRY(real64_call_asm) |
230 | std %rp, -0x10(%sp) /* save RP */ | 230 | std %rp, -0x10(%sp) /* save RP */ |
231 | std %sp, -8(%arg0) /* save SP on real-mode stack */ | 231 | std %sp, -8(%arg0) /* save SP on real-mode stack */ |
232 | copy %arg0, %sp /* adopt the real-mode SP */ | 232 | copy %arg0, %sp /* adopt the real-mode SP */ |
@@ -272,19 +272,21 @@ r64_ret: | |||
272 | ldd -0x10(%sp), %rp /* restore RP */ | 272 | ldd -0x10(%sp), %rp /* restore RP */ |
273 | bv 0(%rp) | 273 | bv 0(%rp) |
274 | nop | 274 | nop |
275 | ENDPROC(real64_call_asm) | ||
275 | 276 | ||
276 | #endif | 277 | #endif |
277 | 278 | ||
278 | .export __canonicalize_funcptr_for_compare | ||
279 | .text | 279 | .text |
280 | /* http://lists.parisc-linux.org/hypermail/parisc-linux/10916.html | 280 | /* http://lists.parisc-linux.org/hypermail/parisc-linux/10916.html |
281 | ** GCC 3.3 and later has a new function in libgcc.a for | 281 | ** GCC 3.3 and later has a new function in libgcc.a for |
282 | ** comparing function pointers. | 282 | ** comparing function pointers. |
283 | */ | 283 | */ |
284 | __canonicalize_funcptr_for_compare: | 284 | ENTRY(__canonicalize_funcptr_for_compare) |
285 | #ifdef CONFIG_64BIT | 285 | #ifdef CONFIG_64BIT |
286 | bve (%r2) | 286 | bve (%r2) |
287 | #else | 287 | #else |
288 | bv %r0(%r2) | 288 | bv %r0(%r2) |
289 | #endif | 289 | #endif |
290 | copy %r26,%r28 | 290 | copy %r26,%r28 |
291 | ENDPROC(__canonicalize_funcptr_for_compare) | ||
292 | |||
diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c index 74b3686dd1e0..bd2116e03f34 100644 --- a/arch/parisc/kernel/setup.c +++ b/arch/parisc/kernel/setup.c | |||
@@ -120,13 +120,13 @@ extern void collect_boot_cpu_data(void); | |||
120 | 120 | ||
121 | void __init setup_arch(char **cmdline_p) | 121 | void __init setup_arch(char **cmdline_p) |
122 | { | 122 | { |
123 | #ifdef __LP64__ | 123 | #ifdef CONFIG_64BIT |
124 | extern int parisc_narrow_firmware; | 124 | extern int parisc_narrow_firmware; |
125 | #endif | 125 | #endif |
126 | 126 | ||
127 | init_per_cpu(smp_processor_id()); /* Set Modes & Enable FP */ | 127 | init_per_cpu(smp_processor_id()); /* Set Modes & Enable FP */ |
128 | 128 | ||
129 | #ifdef __LP64__ | 129 | #ifdef CONFIG_64BIT |
130 | printk(KERN_INFO "The 64-bit Kernel has started...\n"); | 130 | printk(KERN_INFO "The 64-bit Kernel has started...\n"); |
131 | #else | 131 | #else |
132 | printk(KERN_INFO "The 32-bit Kernel has started...\n"); | 132 | printk(KERN_INFO "The 32-bit Kernel has started...\n"); |
@@ -134,7 +134,7 @@ void __init setup_arch(char **cmdline_p) | |||
134 | 134 | ||
135 | pdc_console_init(); | 135 | pdc_console_init(); |
136 | 136 | ||
137 | #ifdef __LP64__ | 137 | #ifdef CONFIG_64BIT |
138 | if(parisc_narrow_firmware) { | 138 | if(parisc_narrow_firmware) { |
139 | printk(KERN_INFO "Kernel is using PDC in 32-bit mode.\n"); | 139 | printk(KERN_INFO "Kernel is using PDC in 32-bit mode.\n"); |
140 | } | 140 | } |
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index ee6653edeb7a..9784e405f849 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
@@ -59,58 +59,13 @@ | |||
59 | * this. */ | 59 | * this. */ |
60 | #define A(__x) ((unsigned long)(__x)) | 60 | #define A(__x) ((unsigned long)(__x)) |
61 | 61 | ||
62 | int do_signal(sigset_t *oldset, struct pt_regs *regs, int in_syscall); | ||
63 | |||
64 | /* | 62 | /* |
65 | * Atomically swap in the new signal mask, and wait for a signal. | 63 | * Atomically swap in the new signal mask, and wait for a signal. |
66 | */ | 64 | */ |
67 | #ifdef __LP64__ | 65 | #ifdef CONFIG_64BIT |
68 | #include "sys32.h" | 66 | #include "sys32.h" |
69 | #endif | 67 | #endif |
70 | 68 | ||
71 | asmlinkage int | ||
72 | sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, struct pt_regs *regs) | ||
73 | { | ||
74 | sigset_t saveset, newset; | ||
75 | #ifdef __LP64__ | ||
76 | compat_sigset_t newset32; | ||
77 | |||
78 | if (is_compat_task()) { | ||
79 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
80 | if (sigsetsize != sizeof(compat_sigset_t)) | ||
81 | return -EINVAL; | ||
82 | if (copy_from_user(&newset32, (compat_sigset_t __user *)unewset, sizeof(newset32))) | ||
83 | return -EFAULT; | ||
84 | sigset_32to64(&newset,&newset32); | ||
85 | |||
86 | } else | ||
87 | #endif | ||
88 | { | ||
89 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
90 | if (sigsetsize != sizeof(sigset_t)) | ||
91 | return -EINVAL; | ||
92 | |||
93 | if (copy_from_user(&newset, unewset, sizeof(newset))) | ||
94 | return -EFAULT; | ||
95 | } | ||
96 | |||
97 | sigdelsetmask(&newset, ~_BLOCKABLE); | ||
98 | |||
99 | spin_lock_irq(¤t->sighand->siglock); | ||
100 | saveset = current->blocked; | ||
101 | current->blocked = newset; | ||
102 | recalc_sigpending(); | ||
103 | spin_unlock_irq(¤t->sighand->siglock); | ||
104 | |||
105 | regs->gr[28] = -EINTR; | ||
106 | while (1) { | ||
107 | current->state = TASK_INTERRUPTIBLE; | ||
108 | schedule(); | ||
109 | if (do_signal(&saveset, regs, 1)) | ||
110 | return -EINTR; | ||
111 | } | ||
112 | } | ||
113 | |||
114 | /* | 69 | /* |
115 | * Do a signal return - restore sigcontext. | 70 | * Do a signal return - restore sigcontext. |
116 | */ | 71 | */ |
@@ -148,7 +103,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
148 | sigset_t set; | 103 | sigset_t set; |
149 | unsigned long usp = (regs->gr[30] & ~(0x01UL)); | 104 | unsigned long usp = (regs->gr[30] & ~(0x01UL)); |
150 | unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE; | 105 | unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE; |
151 | #ifdef __LP64__ | 106 | #ifdef CONFIG_64BIT |
152 | compat_sigset_t compat_set; | 107 | compat_sigset_t compat_set; |
153 | struct compat_rt_sigframe __user * compat_frame; | 108 | struct compat_rt_sigframe __user * compat_frame; |
154 | 109 | ||
@@ -162,7 +117,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
162 | (usp - sigframe_size); | 117 | (usp - sigframe_size); |
163 | DBG(2,"sys_rt_sigreturn: frame is %p\n", frame); | 118 | DBG(2,"sys_rt_sigreturn: frame is %p\n", frame); |
164 | 119 | ||
165 | #ifdef __LP64__ | 120 | #ifdef CONFIG_64BIT |
166 | compat_frame = (struct compat_rt_sigframe __user *)frame; | 121 | compat_frame = (struct compat_rt_sigframe __user *)frame; |
167 | 122 | ||
168 | if (is_compat_task()) { | 123 | if (is_compat_task()) { |
@@ -184,7 +139,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
184 | spin_unlock_irq(¤t->sighand->siglock); | 139 | spin_unlock_irq(¤t->sighand->siglock); |
185 | 140 | ||
186 | /* Good thing we saved the old gr[30], eh? */ | 141 | /* Good thing we saved the old gr[30], eh? */ |
187 | #ifdef __LP64__ | 142 | #ifdef CONFIG_64BIT |
188 | if (is_compat_task()) { | 143 | if (is_compat_task()) { |
189 | DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n", | 144 | DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n", |
190 | &compat_frame->uc.uc_mcontext); | 145 | &compat_frame->uc.uc_mcontext); |
@@ -296,7 +251,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
296 | unsigned long rp, usp; | 251 | unsigned long rp, usp; |
297 | unsigned long haddr, sigframe_size; | 252 | unsigned long haddr, sigframe_size; |
298 | int err = 0; | 253 | int err = 0; |
299 | #ifdef __LP64__ | 254 | #ifdef CONFIG_64BIT |
300 | compat_int_t compat_val; | 255 | compat_int_t compat_val; |
301 | struct compat_rt_sigframe __user * compat_frame; | 256 | struct compat_rt_sigframe __user * compat_frame; |
302 | compat_sigset_t compat_set; | 257 | compat_sigset_t compat_set; |
@@ -310,7 +265,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
310 | DBG(1,"setup_rt_frame: frame %p info %p\n", frame, info); | 265 | DBG(1,"setup_rt_frame: frame %p info %p\n", frame, info); |
311 | 266 | ||
312 | 267 | ||
313 | #ifdef __LP64__ | 268 | #ifdef CONFIG_64BIT |
314 | 269 | ||
315 | compat_frame = (struct compat_rt_sigframe __user *)frame; | 270 | compat_frame = (struct compat_rt_sigframe __user *)frame; |
316 | 271 | ||
@@ -390,7 +345,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
390 | 345 | ||
391 | haddr = A(ka->sa.sa_handler); | 346 | haddr = A(ka->sa.sa_handler); |
392 | /* The sa_handler may be a pointer to a function descriptor */ | 347 | /* The sa_handler may be a pointer to a function descriptor */ |
393 | #ifdef __LP64__ | 348 | #ifdef CONFIG_64BIT |
394 | if (is_compat_task()) { | 349 | if (is_compat_task()) { |
395 | #endif | 350 | #endif |
396 | if (haddr & PA_PLABEL_FDESC) { | 351 | if (haddr & PA_PLABEL_FDESC) { |
@@ -405,7 +360,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
405 | haddr = fdesc.addr; | 360 | haddr = fdesc.addr; |
406 | regs->gr[19] = fdesc.gp; | 361 | regs->gr[19] = fdesc.gp; |
407 | } | 362 | } |
408 | #ifdef __LP64__ | 363 | #ifdef CONFIG_64BIT |
409 | } else { | 364 | } else { |
410 | Elf64_Fdesc fdesc; | 365 | Elf64_Fdesc fdesc; |
411 | Elf64_Fdesc __user *ufdesc = (Elf64_Fdesc __user *)A(haddr & ~3); | 366 | Elf64_Fdesc __user *ufdesc = (Elf64_Fdesc __user *)A(haddr & ~3); |
@@ -425,19 +380,19 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
425 | /* The syscall return path will create IAOQ values from r31. | 380 | /* The syscall return path will create IAOQ values from r31. |
426 | */ | 381 | */ |
427 | sigframe_size = PARISC_RT_SIGFRAME_SIZE; | 382 | sigframe_size = PARISC_RT_SIGFRAME_SIZE; |
428 | #ifdef __LP64__ | 383 | #ifdef CONFIG_64BIT |
429 | if (is_compat_task()) | 384 | if (is_compat_task()) |
430 | sigframe_size = PARISC_RT_SIGFRAME_SIZE32; | 385 | sigframe_size = PARISC_RT_SIGFRAME_SIZE32; |
431 | #endif | 386 | #endif |
432 | if (in_syscall) { | 387 | if (in_syscall) { |
433 | regs->gr[31] = haddr; | 388 | regs->gr[31] = haddr; |
434 | #ifdef __LP64__ | 389 | #ifdef CONFIG_64BIT |
435 | if (!test_thread_flag(TIF_32BIT)) | 390 | if (!test_thread_flag(TIF_32BIT)) |
436 | sigframe_size |= 1; | 391 | sigframe_size |= 1; |
437 | #endif | 392 | #endif |
438 | } else { | 393 | } else { |
439 | unsigned long psw = USER_PSW; | 394 | unsigned long psw = USER_PSW; |
440 | #ifdef __LP64__ | 395 | #ifdef CONFIG_64BIT |
441 | if (!test_thread_flag(TIF_32BIT)) | 396 | if (!test_thread_flag(TIF_32BIT)) |
442 | psw |= PSW_W; | 397 | psw |= PSW_W; |
443 | #endif | 398 | #endif |
@@ -462,7 +417,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
462 | regs->gr[2] = rp; /* userland return pointer */ | 417 | regs->gr[2] = rp; /* userland return pointer */ |
463 | regs->gr[26] = sig; /* signal number */ | 418 | regs->gr[26] = sig; /* signal number */ |
464 | 419 | ||
465 | #ifdef __LP64__ | 420 | #ifdef CONFIG_64BIT |
466 | if (is_compat_task()) { | 421 | if (is_compat_task()) { |
467 | regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */ | 422 | regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */ |
468 | regs->gr[24] = A(&compat_frame->uc); /* ucontext pointer */ | 423 | regs->gr[24] = A(&compat_frame->uc); /* ucontext pointer */ |
@@ -516,6 +471,97 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
516 | return 1; | 471 | return 1; |
517 | } | 472 | } |
518 | 473 | ||
474 | static inline void | ||
475 | syscall_restart(struct pt_regs *regs, struct k_sigaction *ka) | ||
476 | { | ||
477 | /* Check the return code */ | ||
478 | switch (regs->gr[28]) { | ||
479 | case -ERESTART_RESTARTBLOCK: | ||
480 | current_thread_info()->restart_block.fn = | ||
481 | do_no_restart_syscall; | ||
482 | case -ERESTARTNOHAND: | ||
483 | DBG(1,"ERESTARTNOHAND: returning -EINTR\n"); | ||
484 | regs->gr[28] = -EINTR; | ||
485 | break; | ||
486 | |||
487 | case -ERESTARTSYS: | ||
488 | if (!(ka->sa.sa_flags & SA_RESTART)) { | ||
489 | DBG(1,"ERESTARTSYS: putting -EINTR\n"); | ||
490 | regs->gr[28] = -EINTR; | ||
491 | break; | ||
492 | } | ||
493 | /* fallthrough */ | ||
494 | case -ERESTARTNOINTR: | ||
495 | /* A syscall is just a branch, so all | ||
496 | * we have to do is fiddle the return pointer. | ||
497 | */ | ||
498 | regs->gr[31] -= 8; /* delayed branching */ | ||
499 | /* Preserve original r28. */ | ||
500 | regs->gr[28] = regs->orig_r28; | ||
501 | break; | ||
502 | } | ||
503 | } | ||
504 | |||
505 | static inline void | ||
506 | insert_restart_trampoline(struct pt_regs *regs) | ||
507 | { | ||
508 | switch(regs->gr[28]) { | ||
509 | case -ERESTART_RESTARTBLOCK: { | ||
510 | /* Restart the system call - no handlers present */ | ||
511 | unsigned int *usp = (unsigned int *)regs->gr[30]; | ||
512 | |||
513 | /* Setup a trampoline to restart the syscall | ||
514 | * with __NR_restart_syscall | ||
515 | * | ||
516 | * 0: <return address (orig r31)> | ||
517 | * 4: <2nd half for 64-bit> | ||
518 | * 8: ldw 0(%sp), %r31 | ||
519 | * 12: be 0x100(%sr2, %r0) | ||
520 | * 16: ldi __NR_restart_syscall, %r20 | ||
521 | */ | ||
522 | #ifdef CONFIG_64BIT | ||
523 | put_user(regs->gr[31] >> 32, &usp[0]); | ||
524 | put_user(regs->gr[31] & 0xffffffff, &usp[1]); | ||
525 | put_user(0x0fc010df, &usp[2]); | ||
526 | #else | ||
527 | put_user(regs->gr[31], &usp[0]); | ||
528 | put_user(0x0fc0109f, &usp[2]); | ||
529 | #endif | ||
530 | put_user(0xe0008200, &usp[3]); | ||
531 | put_user(0x34140000, &usp[4]); | ||
532 | |||
533 | /* Stack is 64-byte aligned, and we only need | ||
534 | * to flush 1 cache line. | ||
535 | * Flushing one cacheline is cheap. | ||
536 | * "sync" on bigger (> 4 way) boxes is not. | ||
537 | */ | ||
538 | flush_icache_range(regs->gr[30], regs->gr[30] + 4); | ||
539 | |||
540 | regs->gr[31] = regs->gr[30] + 8; | ||
541 | /* Preserve original r28. */ | ||
542 | regs->gr[28] = regs->orig_r28; | ||
543 | |||
544 | return; | ||
545 | } | ||
546 | case -ERESTARTNOHAND: | ||
547 | case -ERESTARTSYS: | ||
548 | case -ERESTARTNOINTR: { | ||
549 | /* Hooray for delayed branching. We don't | ||
550 | * have to restore %r20 (the system call | ||
551 | * number) because it gets loaded in the delay | ||
552 | * slot of the branch external instruction. | ||
553 | */ | ||
554 | regs->gr[31] -= 8; | ||
555 | /* Preserve original r28. */ | ||
556 | regs->gr[28] = regs->orig_r28; | ||
557 | |||
558 | return; | ||
559 | } | ||
560 | default: | ||
561 | break; | ||
562 | } | ||
563 | } | ||
564 | |||
519 | /* | 565 | /* |
520 | * Note that 'init' is a special process: it doesn't get signals it doesn't | 566 | * Note that 'init' is a special process: it doesn't get signals it doesn't |
521 | * want to handle. Thus you cannot kill init even with a SIGKILL even by | 567 | * want to handle. Thus you cannot kill init even with a SIGKILL even by |
@@ -527,13 +573,13 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
527 | * registers). As noted below, the syscall number gets restored for | 573 | * registers). As noted below, the syscall number gets restored for |
528 | * us due to the magic of delayed branching. | 574 | * us due to the magic of delayed branching. |
529 | */ | 575 | */ |
530 | 576 | asmlinkage void | |
531 | asmlinkage int | 577 | do_signal(struct pt_regs *regs, long in_syscall) |
532 | do_signal(sigset_t *oldset, struct pt_regs *regs, int in_syscall) | ||
533 | { | 578 | { |
534 | siginfo_t info; | 579 | siginfo_t info; |
535 | struct k_sigaction ka; | 580 | struct k_sigaction ka; |
536 | int signr; | 581 | int signr; |
582 | sigset_t *oldset; | ||
537 | 583 | ||
538 | DBG(1,"\ndo_signal: oldset=0x%p, regs=0x%p, sr7 %#lx, in_syscall=%d\n", | 584 | DBG(1,"\ndo_signal: oldset=0x%p, regs=0x%p, sr7 %#lx, in_syscall=%d\n", |
539 | oldset, regs, regs->sr[7], in_syscall); | 585 | oldset, regs, regs->sr[7], in_syscall); |
@@ -543,7 +589,9 @@ do_signal(sigset_t *oldset, struct pt_regs *regs, int in_syscall) | |||
543 | we would be called in that case, but for some reason we | 589 | we would be called in that case, but for some reason we |
544 | are. */ | 590 | are. */ |
545 | 591 | ||
546 | if (!oldset) | 592 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
593 | oldset = ¤t->saved_sigmask; | ||
594 | else | ||
547 | oldset = ¤t->blocked; | 595 | oldset = ¤t->blocked; |
548 | 596 | ||
549 | DBG(1,"do_signal: oldset %08lx / %08lx\n", | 597 | DBG(1,"do_signal: oldset %08lx / %08lx\n", |
@@ -560,98 +608,41 @@ do_signal(sigset_t *oldset, struct pt_regs *regs, int in_syscall) | |||
560 | break; | 608 | break; |
561 | 609 | ||
562 | /* Restart a system call if necessary. */ | 610 | /* Restart a system call if necessary. */ |
563 | if (in_syscall) { | 611 | if (in_syscall) |
564 | /* Check the return code */ | 612 | syscall_restart(regs, &ka); |
565 | switch (regs->gr[28]) { | 613 | |
566 | case -ERESTART_RESTARTBLOCK: | ||
567 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||
568 | case -ERESTARTNOHAND: | ||
569 | DBG(1,"ERESTARTNOHAND: returning -EINTR\n"); | ||
570 | regs->gr[28] = -EINTR; | ||
571 | break; | ||
572 | |||
573 | case -ERESTARTSYS: | ||
574 | if (!(ka.sa.sa_flags & SA_RESTART)) { | ||
575 | DBG(1,"ERESTARTSYS: putting -EINTR\n"); | ||
576 | regs->gr[28] = -EINTR; | ||
577 | break; | ||
578 | } | ||
579 | /* fallthrough */ | ||
580 | case -ERESTARTNOINTR: | ||
581 | /* A syscall is just a branch, so all | ||
582 | we have to do is fiddle the return pointer. */ | ||
583 | regs->gr[31] -= 8; /* delayed branching */ | ||
584 | /* Preserve original r28. */ | ||
585 | regs->gr[28] = regs->orig_r28; | ||
586 | break; | ||
587 | } | ||
588 | } | ||
589 | /* Whee! Actually deliver the signal. If the | 614 | /* Whee! Actually deliver the signal. If the |
590 | delivery failed, we need to continue to iterate in | 615 | delivery failed, we need to continue to iterate in |
591 | this loop so we can deliver the SIGSEGV... */ | 616 | this loop so we can deliver the SIGSEGV... */ |
592 | if (handle_signal(signr, &info, &ka, oldset, regs, in_syscall)) { | 617 | if (handle_signal(signr, &info, &ka, oldset, |
618 | regs, in_syscall)) { | ||
593 | DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n", | 619 | DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n", |
594 | regs->gr[28]); | 620 | regs->gr[28]); |
595 | return 1; | 621 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
622 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
623 | return; | ||
596 | } | 624 | } |
597 | } | 625 | } |
598 | /* end of while(1) looping forever if we can't force a signal */ | 626 | /* end of while(1) looping forever if we can't force a signal */ |
599 | 627 | ||
600 | /* Did we come from a system call? */ | 628 | /* Did we come from a system call? */ |
601 | if (in_syscall) { | 629 | if (in_syscall) |
602 | /* Restart the system call - no handlers present */ | 630 | insert_restart_trampoline(regs); |
603 | if (regs->gr[28] == -ERESTART_RESTARTBLOCK) { | ||
604 | unsigned int *usp = (unsigned int *)regs->gr[30]; | ||
605 | |||
606 | /* Setup a trampoline to restart the syscall | ||
607 | * with __NR_restart_syscall | ||
608 | * | ||
609 | * 0: <return address (orig r31)> | ||
610 | * 4: <2nd half for 64-bit> | ||
611 | * 8: ldw 0(%sp), %r31 | ||
612 | * 12: be 0x100(%sr2, %r0) | ||
613 | * 16: ldi __NR_restart_syscall, %r20 | ||
614 | */ | ||
615 | #ifndef __LP64__ | ||
616 | put_user(regs->gr[31], &usp[0]); | ||
617 | put_user(0x0fc0109f, &usp[2]); | ||
618 | #else | ||
619 | put_user(regs->gr[31] >> 32, &usp[0]); | ||
620 | put_user(regs->gr[31] & 0xffffffff, &usp[1]); | ||
621 | put_user(0x0fc010df, &usp[2]); | ||
622 | #endif | ||
623 | put_user(0xe0008200, &usp[3]); | ||
624 | put_user(0x34140000, &usp[4]); | ||
625 | |||
626 | /* Stack is 64-byte aligned, and we only need | ||
627 | * to flush 1 cache line. | ||
628 | * Flushing one cacheline is cheap. | ||
629 | * "sync" on bigger (> 4 way) boxes is not. | ||
630 | */ | ||
631 | asm("fdc %%r0(%%sr3, %0)\n" | ||
632 | "sync\n" | ||
633 | "fic %%r0(%%sr3, %0)\n" | ||
634 | "sync\n" | ||
635 | : : "r"(regs->gr[30])); | ||
636 | |||
637 | regs->gr[31] = regs->gr[30] + 8; | ||
638 | /* Preserve original r28. */ | ||
639 | regs->gr[28] = regs->orig_r28; | ||
640 | } else if (regs->gr[28] == -ERESTARTNOHAND || | ||
641 | regs->gr[28] == -ERESTARTSYS || | ||
642 | regs->gr[28] == -ERESTARTNOINTR) { | ||
643 | /* Hooray for delayed branching. We don't | ||
644 | have to restore %r20 (the system call | ||
645 | number) because it gets loaded in the delay | ||
646 | slot of the branch external instruction. */ | ||
647 | regs->gr[31] -= 8; | ||
648 | /* Preserve original r28. */ | ||
649 | regs->gr[28] = regs->orig_r28; | ||
650 | } | ||
651 | } | ||
652 | 631 | ||
653 | DBG(1,"do_signal: Exit (not delivered), regs->gr[28] = %ld\n", | 632 | DBG(1,"do_signal: Exit (not delivered), regs->gr[28] = %ld\n", |
654 | regs->gr[28]); | 633 | regs->gr[28]); |
655 | 634 | ||
656 | return 0; | 635 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { |
636 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
637 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | ||
638 | } | ||
639 | |||
640 | return; | ||
641 | } | ||
642 | |||
643 | void do_notify_resume(struct pt_regs *regs, long in_syscall) | ||
644 | { | ||
645 | if (test_thread_flag(TIF_SIGPENDING) || | ||
646 | test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
647 | do_signal(regs, in_syscall); | ||
657 | } | 648 | } |
diff --git a/arch/parisc/kernel/signal32.c b/arch/parisc/kernel/signal32.c index a6b4231cafa1..1c1a37f73053 100644 --- a/arch/parisc/kernel/signal32.c +++ b/arch/parisc/kernel/signal32.c | |||
@@ -1,6 +1,8 @@ | |||
1 | /* Signal support for 32-bit kernel builds | 1 | /* Signal support for 32-bit kernel builds |
2 | * | 2 | * |
3 | * Copyright (C) 2001 Matthew Wilcox <willy at parisc-linux.org> | 3 | * Copyright (C) 2001 Matthew Wilcox <willy at parisc-linux.org> |
4 | * Copyright (C) 2006 Kyle McMartin <kyle at parisc-linux.org> | ||
5 | * | ||
4 | * Code was mostly borrowed from kernel/signal.c. | 6 | * Code was mostly borrowed from kernel/signal.c. |
5 | * See kernel/signal.c for additional Copyrights. | 7 | * See kernel/signal.c for additional Copyrights. |
6 | * | 8 | * |
@@ -401,7 +403,7 @@ setup_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __ | |||
401 | int | 403 | int |
402 | copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from) | 404 | copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from) |
403 | { | 405 | { |
404 | unsigned long tmp; | 406 | compat_uptr_t addr; |
405 | int err; | 407 | int err; |
406 | 408 | ||
407 | if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t))) | 409 | if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t))) |
@@ -424,8 +426,8 @@ copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from) | |||
424 | err |= __get_user(to->si_uid, &from->si_uid); | 426 | err |= __get_user(to->si_uid, &from->si_uid); |
425 | break; | 427 | break; |
426 | case __SI_FAULT >> 16: | 428 | case __SI_FAULT >> 16: |
427 | err |= __get_user(tmp, &from->si_addr); | 429 | err |= __get_user(addr, &from->si_addr); |
428 | to->si_addr = (void __user *) tmp; | 430 | to->si_addr = compat_ptr(addr); |
429 | break; | 431 | break; |
430 | case __SI_POLL >> 16: | 432 | case __SI_POLL >> 16: |
431 | err |= __get_user(to->si_band, &from->si_band); | 433 | err |= __get_user(to->si_band, &from->si_band); |
@@ -445,7 +447,8 @@ copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from) | |||
445 | int | 447 | int |
446 | copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from) | 448 | copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from) |
447 | { | 449 | { |
448 | unsigned int addr; | 450 | compat_uptr_t addr; |
451 | compat_int_t val; | ||
449 | int err; | 452 | int err; |
450 | 453 | ||
451 | if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t))) | 454 | if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t))) |
@@ -474,8 +477,8 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from) | |||
474 | err |= __put_user(from->si_uid, &to->si_uid); | 477 | err |= __put_user(from->si_uid, &to->si_uid); |
475 | break; | 478 | break; |
476 | case __SI_FAULT >> 16: | 479 | case __SI_FAULT >> 16: |
477 | /* avoid type-checking warnings by copying _pad[0] in lieu of si_addr... */ | 480 | addr = ptr_to_compat(from->si_addr); |
478 | err |= __put_user(from->_sifields._pad[0], &to->si_addr); | 481 | err |= __put_user(addr, &to->si_addr); |
479 | break; | 482 | break; |
480 | case __SI_POLL >> 16: | 483 | case __SI_POLL >> 16: |
481 | err |= __put_user(from->si_band, &to->si_band); | 484 | err |= __put_user(from->si_band, &to->si_band); |
@@ -484,17 +487,36 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from) | |||
484 | case __SI_TIMER >> 16: | 487 | case __SI_TIMER >> 16: |
485 | err |= __put_user(from->si_tid, &to->si_tid); | 488 | err |= __put_user(from->si_tid, &to->si_tid); |
486 | err |= __put_user(from->si_overrun, &to->si_overrun); | 489 | err |= __put_user(from->si_overrun, &to->si_overrun); |
487 | addr = (unsigned long) from->si_ptr; | 490 | val = (compat_int_t)from->si_int; |
488 | err |= __put_user(addr, &to->si_ptr); | 491 | err |= __put_user(val, &to->si_int); |
489 | break; | 492 | break; |
490 | case __SI_RT >> 16: /* Not generated by the kernel as of now. */ | 493 | case __SI_RT >> 16: /* Not generated by the kernel as of now. */ |
491 | case __SI_MESGQ >> 16: | 494 | case __SI_MESGQ >> 16: |
492 | err |= __put_user(from->si_uid, &to->si_uid); | 495 | err |= __put_user(from->si_uid, &to->si_uid); |
493 | err |= __put_user(from->si_pid, &to->si_pid); | 496 | err |= __put_user(from->si_pid, &to->si_pid); |
494 | addr = (unsigned long) from->si_ptr; | 497 | val = (compat_int_t)from->si_int; |
495 | err |= __put_user(addr, &to->si_ptr); | 498 | err |= __put_user(val, &to->si_int); |
496 | break; | 499 | break; |
497 | } | 500 | } |
498 | } | 501 | } |
499 | return err; | 502 | return err; |
500 | } | 503 | } |
504 | |||
505 | asmlinkage long compat_sys_rt_sigqueueinfo(int pid, int sig, | ||
506 | struct compat_siginfo __user *uinfo) | ||
507 | { | ||
508 | siginfo_t info; | ||
509 | |||
510 | if (copy_siginfo_from_user32(&info, uinfo)) | ||
511 | return -EFAULT; | ||
512 | |||
513 | /* Not even root can pretend to send signals from the kernel. | ||
514 | Nor can they impersonate a kill(), which adds source info. */ | ||
515 | if (info.si_code >= 0) | ||
516 | return -EPERM; | ||
517 | info.si_signo = sig; | ||
518 | |||
519 | /* POSIX.1b doesn't mention process groups. */ | ||
520 | return kill_proc_info(sig, &info, pid); | ||
521 | } | ||
522 | |||
diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index 12cc019307ad..6ba9257fdb7f 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c | |||
@@ -16,9 +16,6 @@ | |||
16 | ** the Free Software Foundation; either version 2 of the License, or | 16 | ** the Free Software Foundation; either version 2 of the License, or |
17 | ** (at your option) any later version. | 17 | ** (at your option) any later version. |
18 | */ | 18 | */ |
19 | #undef ENTRY_SYS_CPUS /* syscall support for iCOD-like functionality */ | ||
20 | |||
21 | |||
22 | #include <linux/types.h> | 19 | #include <linux/types.h> |
23 | #include <linux/spinlock.h> | 20 | #include <linux/spinlock.h> |
24 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
@@ -51,7 +48,15 @@ | |||
51 | #include <asm/unistd.h> | 48 | #include <asm/unistd.h> |
52 | #include <asm/cacheflush.h> | 49 | #include <asm/cacheflush.h> |
53 | 50 | ||
54 | #define kDEBUG 0 | 51 | #undef DEBUG_SMP |
52 | #ifdef DEBUG_SMP | ||
53 | static int smp_debug_lvl = 0; | ||
54 | #define smp_debug(lvl, printargs...) \ | ||
55 | if (lvl >= smp_debug_lvl) \ | ||
56 | printk(printargs); | ||
57 | #else | ||
58 | #define smp_debug(lvl, ...) | ||
59 | #endif /* DEBUG_SMP */ | ||
55 | 60 | ||
56 | DEFINE_SPINLOCK(smp_lock); | 61 | DEFINE_SPINLOCK(smp_lock); |
57 | 62 | ||
@@ -76,6 +81,7 @@ cpumask_t cpu_possible_map __read_mostly = CPU_MASK_ALL; /* Bitmap of Present CP | |||
76 | EXPORT_SYMBOL(cpu_online_map); | 81 | EXPORT_SYMBOL(cpu_online_map); |
77 | EXPORT_SYMBOL(cpu_possible_map); | 82 | EXPORT_SYMBOL(cpu_possible_map); |
78 | 83 | ||
84 | DEFINE_PER_CPU(spinlock_t, ipi_lock) = SPIN_LOCK_UNLOCKED; | ||
79 | 85 | ||
80 | struct smp_call_struct { | 86 | struct smp_call_struct { |
81 | void (*func) (void *info); | 87 | void (*func) (void *info); |
@@ -107,13 +113,6 @@ enum ipi_message_type { | |||
107 | static void | 113 | static void |
108 | ipi_init(int cpuid) | 114 | ipi_init(int cpuid) |
109 | { | 115 | { |
110 | |||
111 | /* If CPU is present ... */ | ||
112 | #ifdef ENTRY_SYS_CPUS | ||
113 | /* *and* running (not stopped) ... */ | ||
114 | #error iCOD support wants state checked here. | ||
115 | #endif | ||
116 | |||
117 | #error verify IRQ_OFFSET(IPI_IRQ) is ipi_interrupt() in new IRQ region | 116 | #error verify IRQ_OFFSET(IPI_IRQ) is ipi_interrupt() in new IRQ region |
118 | 117 | ||
119 | if(cpu_online(cpuid) ) | 118 | if(cpu_online(cpuid) ) |
@@ -133,23 +132,12 @@ ipi_init(int cpuid) | |||
133 | static void | 132 | static void |
134 | halt_processor(void) | 133 | halt_processor(void) |
135 | { | 134 | { |
136 | #ifdef ENTRY_SYS_CPUS | ||
137 | #error halt_processor() needs rework | ||
138 | /* | ||
139 | ** o migrate I/O interrupts off this CPU. | ||
140 | ** o leave IPI enabled - __cli() will disable IPI. | ||
141 | ** o leave CPU in online map - just change the state | ||
142 | */ | ||
143 | cpu_data[this_cpu].state = STATE_STOPPED; | ||
144 | mark_bh(IPI_BH); | ||
145 | #else | ||
146 | /* REVISIT : redirect I/O Interrupts to another CPU? */ | 135 | /* REVISIT : redirect I/O Interrupts to another CPU? */ |
147 | /* REVISIT : does PM *know* this CPU isn't available? */ | 136 | /* REVISIT : does PM *know* this CPU isn't available? */ |
148 | cpu_clear(smp_processor_id(), cpu_online_map); | 137 | cpu_clear(smp_processor_id(), cpu_online_map); |
149 | local_irq_disable(); | 138 | local_irq_disable(); |
150 | for (;;) | 139 | for (;;) |
151 | ; | 140 | ; |
152 | #endif | ||
153 | } | 141 | } |
154 | 142 | ||
155 | 143 | ||
@@ -167,10 +155,11 @@ ipi_interrupt(int irq, void *dev_id) | |||
167 | mb(); /* Order interrupt and bit testing. */ | 155 | mb(); /* Order interrupt and bit testing. */ |
168 | 156 | ||
169 | for (;;) { | 157 | for (;;) { |
170 | spin_lock_irqsave(&(p->lock),flags); | 158 | spinlock_t *lock = &per_cpu(ipi_lock, this_cpu); |
159 | spin_lock_irqsave(lock, flags); | ||
171 | ops = p->pending_ipi; | 160 | ops = p->pending_ipi; |
172 | p->pending_ipi = 0; | 161 | p->pending_ipi = 0; |
173 | spin_unlock_irqrestore(&(p->lock),flags); | 162 | spin_unlock_irqrestore(lock, flags); |
174 | 163 | ||
175 | mb(); /* Order bit clearing and data access. */ | 164 | mb(); /* Order bit clearing and data access. */ |
176 | 165 | ||
@@ -184,15 +173,11 @@ ipi_interrupt(int irq, void *dev_id) | |||
184 | 173 | ||
185 | switch (which) { | 174 | switch (which) { |
186 | case IPI_NOP: | 175 | case IPI_NOP: |
187 | #if (kDEBUG>=100) | 176 | smp_debug(100, KERN_DEBUG "CPU%d IPI_NOP\n", this_cpu); |
188 | printk(KERN_DEBUG "CPU%d IPI_NOP\n",this_cpu); | ||
189 | #endif /* kDEBUG */ | ||
190 | break; | 177 | break; |
191 | 178 | ||
192 | case IPI_RESCHEDULE: | 179 | case IPI_RESCHEDULE: |
193 | #if (kDEBUG>=100) | 180 | smp_debug(100, KERN_DEBUG "CPU%d IPI_RESCHEDULE\n", this_cpu); |
194 | printk(KERN_DEBUG "CPU%d IPI_RESCHEDULE\n",this_cpu); | ||
195 | #endif /* kDEBUG */ | ||
196 | /* | 181 | /* |
197 | * Reschedule callback. Everything to be | 182 | * Reschedule callback. Everything to be |
198 | * done is done by the interrupt return path. | 183 | * done is done by the interrupt return path. |
@@ -200,9 +185,7 @@ ipi_interrupt(int irq, void *dev_id) | |||
200 | break; | 185 | break; |
201 | 186 | ||
202 | case IPI_CALL_FUNC: | 187 | case IPI_CALL_FUNC: |
203 | #if (kDEBUG>=100) | 188 | smp_debug(100, KERN_DEBUG "CPU%d IPI_CALL_FUNC\n", this_cpu); |
204 | printk(KERN_DEBUG "CPU%d IPI_CALL_FUNC\n",this_cpu); | ||
205 | #endif /* kDEBUG */ | ||
206 | { | 189 | { |
207 | volatile struct smp_call_struct *data; | 190 | volatile struct smp_call_struct *data; |
208 | void (*func)(void *info); | 191 | void (*func)(void *info); |
@@ -233,28 +216,16 @@ ipi_interrupt(int irq, void *dev_id) | |||
233 | break; | 216 | break; |
234 | 217 | ||
235 | case IPI_CPU_START: | 218 | case IPI_CPU_START: |
236 | #if (kDEBUG>=100) | 219 | smp_debug(100, KERN_DEBUG "CPU%d IPI_CPU_START\n", this_cpu); |
237 | printk(KERN_DEBUG "CPU%d IPI_CPU_START\n",this_cpu); | ||
238 | #endif /* kDEBUG */ | ||
239 | #ifdef ENTRY_SYS_CPUS | ||
240 | p->state = STATE_RUNNING; | ||
241 | #endif | ||
242 | break; | 220 | break; |
243 | 221 | ||
244 | case IPI_CPU_STOP: | 222 | case IPI_CPU_STOP: |
245 | #if (kDEBUG>=100) | 223 | smp_debug(100, KERN_DEBUG "CPU%d IPI_CPU_STOP\n", this_cpu); |
246 | printk(KERN_DEBUG "CPU%d IPI_CPU_STOP\n",this_cpu); | ||
247 | #endif /* kDEBUG */ | ||
248 | #ifdef ENTRY_SYS_CPUS | ||
249 | #else | ||
250 | halt_processor(); | 224 | halt_processor(); |
251 | #endif | ||
252 | break; | 225 | break; |
253 | 226 | ||
254 | case IPI_CPU_TEST: | 227 | case IPI_CPU_TEST: |
255 | #if (kDEBUG>=100) | 228 | smp_debug(100, KERN_DEBUG "CPU%d is alive!\n", this_cpu); |
256 | printk(KERN_DEBUG "CPU%d is alive!\n",this_cpu); | ||
257 | #endif /* kDEBUG */ | ||
258 | break; | 229 | break; |
259 | 230 | ||
260 | default: | 231 | default: |
@@ -275,12 +246,13 @@ static inline void | |||
275 | ipi_send(int cpu, enum ipi_message_type op) | 246 | ipi_send(int cpu, enum ipi_message_type op) |
276 | { | 247 | { |
277 | struct cpuinfo_parisc *p = &cpu_data[cpu]; | 248 | struct cpuinfo_parisc *p = &cpu_data[cpu]; |
249 | spinlock_t *lock = &per_cpu(ipi_lock, cpu); | ||
278 | unsigned long flags; | 250 | unsigned long flags; |
279 | 251 | ||
280 | spin_lock_irqsave(&(p->lock),flags); | 252 | spin_lock_irqsave(lock, flags); |
281 | p->pending_ipi |= 1 << op; | 253 | p->pending_ipi |= 1 << op; |
282 | gsc_writel(IPI_IRQ - CPU_IRQ_BASE, cpu_data[cpu].hpa); | 254 | gsc_writel(IPI_IRQ - CPU_IRQ_BASE, cpu_data[cpu].hpa); |
283 | spin_unlock_irqrestore(&(p->lock),flags); | 255 | spin_unlock_irqrestore(lock, flags); |
284 | } | 256 | } |
285 | 257 | ||
286 | 258 | ||
@@ -560,13 +532,8 @@ int __init smp_boot_one_cpu(int cpuid) | |||
560 | 532 | ||
561 | alive: | 533 | alive: |
562 | /* Remember the Slave data */ | 534 | /* Remember the Slave data */ |
563 | #if (kDEBUG>=100) | 535 | smp_debug(100, KERN_DEBUG "SMP: CPU:%d came alive after %ld _us\n", |
564 | printk(KERN_DEBUG "SMP: CPU:%d came alive after %ld _us\n", | ||
565 | cpuid, timeout * 100); | 536 | cpuid, timeout * 100); |
566 | #endif /* kDEBUG */ | ||
567 | #ifdef ENTRY_SYS_CPUS | ||
568 | cpu_data[cpuid].state = STATE_RUNNING; | ||
569 | #endif | ||
570 | return 0; | 537 | return 0; |
571 | } | 538 | } |
572 | 539 | ||
@@ -574,10 +541,6 @@ void __devinit smp_prepare_boot_cpu(void) | |||
574 | { | 541 | { |
575 | int bootstrap_processor=cpu_data[0].cpuid; /* CPU ID of BSP */ | 542 | int bootstrap_processor=cpu_data[0].cpuid; /* CPU ID of BSP */ |
576 | 543 | ||
577 | #ifdef ENTRY_SYS_CPUS | ||
578 | cpu_data[0].state = STATE_RUNNING; | ||
579 | #endif | ||
580 | |||
581 | /* Setup BSP mappings */ | 544 | /* Setup BSP mappings */ |
582 | printk("SMP: bootstrap CPU ID is %d\n",bootstrap_processor); | 545 | printk("SMP: bootstrap CPU ID is %d\n",bootstrap_processor); |
583 | 546 | ||
@@ -616,101 +579,6 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
616 | return cpu_online(cpu) ? 0 : -ENOSYS; | 579 | return cpu_online(cpu) ? 0 : -ENOSYS; |
617 | } | 580 | } |
618 | 581 | ||
619 | |||
620 | |||
621 | #ifdef ENTRY_SYS_CPUS | ||
622 | /* Code goes along with: | ||
623 | ** entry.s: ENTRY_NAME(sys_cpus) / * 215, for cpu stat * / | ||
624 | */ | ||
625 | int sys_cpus(int argc, char **argv) | ||
626 | { | ||
627 | int i,j=0; | ||
628 | extern int current_pid(int cpu); | ||
629 | |||
630 | if( argc > 2 ) { | ||
631 | printk("sys_cpus:Only one argument supported\n"); | ||
632 | return (-1); | ||
633 | } | ||
634 | if ( argc == 1 ){ | ||
635 | |||
636 | #ifdef DUMP_MORE_STATE | ||
637 | for_each_online_cpu(i) { | ||
638 | int cpus_per_line = 4; | ||
639 | |||
640 | if (j++ % cpus_per_line) | ||
641 | printk(" %3d",i); | ||
642 | else | ||
643 | printk("\n %3d",i); | ||
644 | } | ||
645 | printk("\n"); | ||
646 | #else | ||
647 | printk("\n 0\n"); | ||
648 | #endif | ||
649 | } else if((argc==2) && !(strcmp(argv[1],"-l"))) { | ||
650 | printk("\nCPUSTATE TASK CPUNUM CPUID HARDCPU(HPA)\n"); | ||
651 | #ifdef DUMP_MORE_STATE | ||
652 | for_each_online_cpu(i) { | ||
653 | if (cpu_data[i].cpuid != NO_PROC_ID) { | ||
654 | switch(cpu_data[i].state) { | ||
655 | case STATE_RENDEZVOUS: | ||
656 | printk("RENDEZVS "); | ||
657 | break; | ||
658 | case STATE_RUNNING: | ||
659 | printk((current_pid(i)!=0) ? "RUNNING " : "IDLING "); | ||
660 | break; | ||
661 | case STATE_STOPPED: | ||
662 | printk("STOPPED "); | ||
663 | break; | ||
664 | case STATE_HALTED: | ||
665 | printk("HALTED "); | ||
666 | break; | ||
667 | default: | ||
668 | printk("%08x?", cpu_data[i].state); | ||
669 | break; | ||
670 | } | ||
671 | if(cpu_online(i)) { | ||
672 | printk(" %4d",current_pid(i)); | ||
673 | } | ||
674 | printk(" %6d",cpu_number_map(i)); | ||
675 | printk(" %5d",i); | ||
676 | printk(" 0x%lx\n",cpu_data[i].hpa); | ||
677 | } | ||
678 | } | ||
679 | #else | ||
680 | printk("\n%s %4d 0 0 --------", | ||
681 | (current->pid)?"RUNNING ": "IDLING ",current->pid); | ||
682 | #endif | ||
683 | } else if ((argc==2) && !(strcmp(argv[1],"-s"))) { | ||
684 | #ifdef DUMP_MORE_STATE | ||
685 | printk("\nCPUSTATE CPUID\n"); | ||
686 | for_each_online_cpu(i) { | ||
687 | if (cpu_data[i].cpuid != NO_PROC_ID) { | ||
688 | switch(cpu_data[i].state) { | ||
689 | case STATE_RENDEZVOUS: | ||
690 | printk("RENDEZVS");break; | ||
691 | case STATE_RUNNING: | ||
692 | printk((current_pid(i)!=0) ? "RUNNING " : "IDLING"); | ||
693 | break; | ||
694 | case STATE_STOPPED: | ||
695 | printk("STOPPED ");break; | ||
696 | case STATE_HALTED: | ||
697 | printk("HALTED ");break; | ||
698 | default: | ||
699 | } | ||
700 | printk(" %5d\n",i); | ||
701 | } | ||
702 | } | ||
703 | #else | ||
704 | printk("\n%s CPU0",(current->pid==0)?"RUNNING ":"IDLING "); | ||
705 | #endif | ||
706 | } else { | ||
707 | printk("sys_cpus:Unknown request\n"); | ||
708 | return (-1); | ||
709 | } | ||
710 | return 0; | ||
711 | } | ||
712 | #endif /* ENTRY_SYS_CPUS */ | ||
713 | |||
714 | #ifdef CONFIG_PROC_FS | 582 | #ifdef CONFIG_PROC_FS |
715 | int __init | 583 | int __init |
716 | setup_profiling_timer(unsigned int multiplier) | 584 | setup_profiling_timer(unsigned int multiplier) |
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S index a05800429304..10859f53e94f 100644 --- a/arch/parisc/kernel/syscall.S +++ b/arch/parisc/kernel/syscall.S | |||
@@ -12,27 +12,23 @@ | |||
12 | #include <asm/errno.h> | 12 | #include <asm/errno.h> |
13 | #include <asm/psw.h> | 13 | #include <asm/psw.h> |
14 | #include <asm/thread_info.h> | 14 | #include <asm/thread_info.h> |
15 | |||
16 | #include <asm/assembly.h> | 15 | #include <asm/assembly.h> |
17 | #include <asm/processor.h> | 16 | #include <asm/processor.h> |
18 | 17 | ||
18 | #include <linux/linkage.h> | ||
19 | |||
19 | /* We fill the empty parts of the gateway page with | 20 | /* We fill the empty parts of the gateway page with |
20 | * something that will kill the kernel or a | 21 | * something that will kill the kernel or a |
21 | * userspace application. | 22 | * userspace application. |
22 | */ | 23 | */ |
23 | #define KILL_INSN break 0,0 | 24 | #define KILL_INSN break 0,0 |
24 | 25 | ||
25 | #ifdef CONFIG_64BIT | 26 | .level LEVEL |
26 | .level 2.0w | ||
27 | #else | ||
28 | .level 1.1 | ||
29 | #endif | ||
30 | 27 | ||
31 | .text | 28 | .text |
32 | 29 | ||
33 | .import syscall_exit,code | 30 | .import syscall_exit,code |
34 | .import syscall_exit_rfi,code | 31 | .import syscall_exit_rfi,code |
35 | .export linux_gateway_page | ||
36 | 32 | ||
37 | /* Linux gateway page is aliased to virtual page 0 in the kernel | 33 | /* Linux gateway page is aliased to virtual page 0 in the kernel |
38 | * address space. Since it is a gateway page it cannot be | 34 | * address space. Since it is a gateway page it cannot be |
@@ -43,7 +39,7 @@ | |||
43 | */ | 39 | */ |
44 | 40 | ||
45 | .align ASM_PAGE_SIZE | 41 | .align ASM_PAGE_SIZE |
46 | linux_gateway_page: | 42 | ENTRY(linux_gateway_page) |
47 | 43 | ||
48 | /* ADDRESS 0x00 to 0xb0 = 176 bytes / 4 bytes per insn = 44 insns */ | 44 | /* ADDRESS 0x00 to 0xb0 = 176 bytes / 4 bytes per insn = 44 insns */ |
49 | .rept 44 | 45 | .rept 44 |
@@ -595,73 +591,43 @@ cas_action: | |||
595 | the other for the store. Either return -EFAULT. | 591 | the other for the store. Either return -EFAULT. |
596 | Each of the entries must be relocated. */ | 592 | Each of the entries must be relocated. */ |
597 | .section __ex_table,"aw" | 593 | .section __ex_table,"aw" |
598 | #ifdef CONFIG_64BIT | 594 | ASM_ULONG_INSN (1b - linux_gateway_page), (3b - linux_gateway_page) |
599 | /* Pad the address calculation */ | 595 | ASM_ULONG_INSN (2b - linux_gateway_page), (3b - linux_gateway_page) |
600 | .word 0,(2b - linux_gateway_page) | ||
601 | .word 0,(3b - linux_gateway_page) | ||
602 | #else | ||
603 | .word (2b - linux_gateway_page) | ||
604 | .word (3b - linux_gateway_page) | ||
605 | #endif | ||
606 | .previous | 596 | .previous |
607 | 597 | ||
608 | .section __ex_table,"aw" | ||
609 | #ifdef CONFIG_64BIT | ||
610 | /* Pad the address calculation */ | ||
611 | .word 0,(1b - linux_gateway_page) | ||
612 | .word 0,(3b - linux_gateway_page) | ||
613 | #else | ||
614 | .word (1b - linux_gateway_page) | ||
615 | .word (3b - linux_gateway_page) | ||
616 | #endif | ||
617 | .previous | ||
618 | |||
619 | end_compare_and_swap: | ||
620 | 598 | ||
621 | /* Make sure nothing else is placed on this page */ | 599 | /* Make sure nothing else is placed on this page */ |
622 | .align ASM_PAGE_SIZE | 600 | .align ASM_PAGE_SIZE |
623 | .export end_linux_gateway_page | 601 | END(linux_gateway_page) |
624 | end_linux_gateway_page: | 602 | ENTRY(end_linux_gateway_page) |
625 | 603 | ||
626 | /* Relocate symbols assuming linux_gateway_page is mapped | 604 | /* Relocate symbols assuming linux_gateway_page is mapped |
627 | to virtual address 0x0 */ | 605 | to virtual address 0x0 */ |
628 | #ifdef CONFIG_64BIT | 606 | |
629 | /* FIXME: The code will always be on the gateay page | 607 | #define LWS_ENTRY(_name_) ASM_ULONG_INSN (lws_##_name_ - linux_gateway_page) |
630 | and thus it will be on the first 4k, the | ||
631 | assembler seems to think that the final | ||
632 | subtraction result is only a word in | ||
633 | length, so we pad the value. | ||
634 | */ | ||
635 | #define LWS_ENTRY(_name_) .word 0,(lws_##_name_ - linux_gateway_page) | ||
636 | #else | ||
637 | #define LWS_ENTRY(_name_) .word (lws_##_name_ - linux_gateway_page) | ||
638 | #endif | ||
639 | 608 | ||
640 | .section .rodata,"a" | 609 | .section .rodata,"a" |
641 | 610 | ||
642 | .align ASM_PAGE_SIZE | 611 | .align ASM_PAGE_SIZE |
643 | /* Light-weight-syscall table */ | 612 | /* Light-weight-syscall table */ |
644 | /* Start of lws table. */ | 613 | /* Start of lws table. */ |
645 | .export lws_table | 614 | ENTRY(lws_table) |
646 | .Llws_table: | ||
647 | lws_table: | ||
648 | LWS_ENTRY(compare_and_swap32) /* 0 - ELF32 Atomic compare and swap */ | 615 | LWS_ENTRY(compare_and_swap32) /* 0 - ELF32 Atomic compare and swap */ |
649 | LWS_ENTRY(compare_and_swap64) /* 1 - ELF64 Atomic compare and swap */ | 616 | LWS_ENTRY(compare_and_swap64) /* 1 - ELF64 Atomic compare and swap */ |
617 | END(lws_table) | ||
650 | /* End of lws table */ | 618 | /* End of lws table */ |
651 | 619 | ||
652 | .align ASM_PAGE_SIZE | 620 | .align ASM_PAGE_SIZE |
653 | .export sys_call_table | 621 | ENTRY(sys_call_table) |
654 | .Lsys_call_table: | ||
655 | sys_call_table: | ||
656 | #include "syscall_table.S" | 622 | #include "syscall_table.S" |
623 | END(sys_call_table) | ||
657 | 624 | ||
658 | #ifdef CONFIG_64BIT | 625 | #ifdef CONFIG_64BIT |
659 | .align ASM_PAGE_SIZE | 626 | .align ASM_PAGE_SIZE |
660 | .export sys_call_table64 | 627 | ENTRY(sys_call_table64) |
661 | .Lsys_call_table64: | ||
662 | sys_call_table64: | ||
663 | #define SYSCALL_TABLE_64BIT | 628 | #define SYSCALL_TABLE_64BIT |
664 | #include "syscall_table.S" | 629 | #include "syscall_table.S" |
630 | END(sys_call_table64) | ||
665 | #endif | 631 | #endif |
666 | 632 | ||
667 | #ifdef CONFIG_SMP | 633 | #ifdef CONFIG_SMP |
@@ -671,9 +637,7 @@ sys_call_table64: | |||
671 | */ | 637 | */ |
672 | .section .data | 638 | .section .data |
673 | .align 4096 | 639 | .align 4096 |
674 | .export lws_lock_start | 640 | ENTRY(lws_lock_start) |
675 | .Llws_lock_start: | ||
676 | lws_lock_start: | ||
677 | /* lws locks */ | 641 | /* lws locks */ |
678 | .align 16 | 642 | .align 16 |
679 | .rept 16 | 643 | .rept 16 |
@@ -683,6 +647,7 @@ lws_lock_start: | |||
683 | .word 0 | 647 | .word 0 |
684 | .word 0 | 648 | .word 0 |
685 | .endr | 649 | .endr |
650 | END(lws_lock_start) | ||
686 | .previous | 651 | .previous |
687 | #endif | 652 | #endif |
688 | /* CONFIG_SMP for lws_lock_start */ | 653 | /* CONFIG_SMP for lws_lock_start */ |
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index be8eb9a0d24a..8bf87e5d9c37 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
@@ -10,7 +10,7 @@ | |||
10 | * Copyright (C) 2000 Grant Grundler <grundler at parisc-linux.org> | 10 | * Copyright (C) 2000 Grant Grundler <grundler at parisc-linux.org> |
11 | * Copyright (C) 2001 Richard Hirst <rhirst with parisc-linux.org> | 11 | * Copyright (C) 2001 Richard Hirst <rhirst with parisc-linux.org> |
12 | * Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org> | 12 | * Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org> |
13 | * Copyright (C) 2001 Helge Deller <deller at parisc-linux.org> | 13 | * Copyright (C) 2001-2007 Helge Deller <deller at parisc-linux.org> |
14 | * Copyright (C) 2000-2001 Thomas Bogendoerfer <tsbogend at parisc-linux.org> | 14 | * Copyright (C) 2000-2001 Thomas Bogendoerfer <tsbogend at parisc-linux.org> |
15 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> | 15 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> |
16 | * Copyright (C) 2005-2006 Kyle McMartin <kyle at parisc-linux.org> | 16 | * Copyright (C) 2005-2006 Kyle McMartin <kyle at parisc-linux.org> |
@@ -282,8 +282,8 @@ | |||
282 | * to worry about faulting trying to copy in a larger 64-bit | 282 | * to worry about faulting trying to copy in a larger 64-bit |
283 | * struct from a 32-bit user-space app. | 283 | * struct from a 32-bit user-space app. |
284 | */ | 284 | */ |
285 | ENTRY_SAME(rt_sigqueueinfo) | 285 | ENTRY_COMP(rt_sigqueueinfo) |
286 | ENTRY_SAME(rt_sigsuspend_wrapper) /* not really SAME -- see the code */ | 286 | ENTRY_COMP(rt_sigsuspend) |
287 | ENTRY_SAME(chown) /* 180 */ | 287 | ENTRY_SAME(chown) /* 180 */ |
288 | /* setsockopt() used by iptables: SO_SET_REPLACE/SO_SET_ADD_COUNTERS */ | 288 | /* setsockopt() used by iptables: SO_SET_REPLACE/SO_SET_ADD_COUNTERS */ |
289 | ENTRY_COMP(setsockopt) | 289 | ENTRY_COMP(setsockopt) |
@@ -377,9 +377,9 @@ | |||
377 | ENTRY_SAME(inotify_init) | 377 | ENTRY_SAME(inotify_init) |
378 | ENTRY_SAME(inotify_add_watch) /* 270 */ | 378 | ENTRY_SAME(inotify_add_watch) /* 270 */ |
379 | ENTRY_SAME(inotify_rm_watch) | 379 | ENTRY_SAME(inotify_rm_watch) |
380 | ENTRY_SAME(ni_syscall) /* 271 ENTRY_COMP(pselect6) */ | ||
381 | ENTRY_SAME(ni_syscall) /* 272 ENTRY_COMP(ppoll) */ | ||
382 | ENTRY_SAME(migrate_pages) | 380 | ENTRY_SAME(migrate_pages) |
381 | ENTRY_COMP(pselect6) | ||
382 | ENTRY_COMP(ppoll) | ||
383 | ENTRY_COMP(openat) /* 275 */ | 383 | ENTRY_COMP(openat) /* 275 */ |
384 | ENTRY_SAME(mkdirat) | 384 | ENTRY_SAME(mkdirat) |
385 | ENTRY_SAME(mknodat) | 385 | ENTRY_SAME(mknodat) |
@@ -399,5 +399,11 @@ | |||
399 | ENTRY_SAME(splice) | 399 | ENTRY_SAME(splice) |
400 | ENTRY_OURS(sync_file_range) | 400 | ENTRY_OURS(sync_file_range) |
401 | ENTRY_SAME(tee) | 401 | ENTRY_SAME(tee) |
402 | ENTRY_COMP(vmsplice) | ||
403 | ENTRY_COMP(move_pages) /* 295 */ | ||
404 | ENTRY_SAME(getcpu) | ||
405 | ENTRY_SAME(epoll_pwait) | ||
406 | ENTRY_COMP(statfs64) | ||
407 | ENTRY_COMP(fstatfs64) | ||
402 | /* Nothing yet */ | 408 | /* Nothing yet */ |
403 | 409 | ||
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index 5f1b51af06a9..d1db8e518654 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/smp.h> | 23 | #include <linux/smp.h> |
24 | #include <linux/profile.h> | 24 | #include <linux/profile.h> |
25 | #include <linux/clocksource.h> | ||
25 | 26 | ||
26 | #include <asm/uaccess.h> | 27 | #include <asm/uaccess.h> |
27 | #include <asm/io.h> | 28 | #include <asm/io.h> |
@@ -98,7 +99,7 @@ irqreturn_t timer_interrupt(int irq, void *dev_id) | |||
98 | * cycles after the IT fires. But it's arbitrary how much time passes | 99 | * cycles after the IT fires. But it's arbitrary how much time passes |
99 | * before we call it "late". I've picked one second. | 100 | * before we call it "late". I've picked one second. |
100 | */ | 101 | */ |
101 | if (ticks_elapsed > HZ) { | 102 | if (unlikely(ticks_elapsed > HZ)) { |
102 | /* Scenario 3: very long delay? bad in any case */ | 103 | /* Scenario 3: very long delay? bad in any case */ |
103 | printk (KERN_CRIT "timer_interrupt(CPU %d): delayed!" | 104 | printk (KERN_CRIT "timer_interrupt(CPU %d): delayed!" |
104 | " cycles %lX rem %lX " | 105 | " cycles %lX rem %lX " |
@@ -147,10 +148,6 @@ irqreturn_t timer_interrupt(int irq, void *dev_id) | |||
147 | write_sequnlock(&xtime_lock); | 148 | write_sequnlock(&xtime_lock); |
148 | } | 149 | } |
149 | 150 | ||
150 | /* check soft power switch status */ | ||
151 | if (cpu == 0 && !atomic_read(&power_tasklet.count)) | ||
152 | tasklet_schedule(&power_tasklet); | ||
153 | |||
154 | return IRQ_HANDLED; | 151 | return IRQ_HANDLED; |
155 | } | 152 | } |
156 | 153 | ||
@@ -172,121 +169,41 @@ unsigned long profile_pc(struct pt_regs *regs) | |||
172 | EXPORT_SYMBOL(profile_pc); | 169 | EXPORT_SYMBOL(profile_pc); |
173 | 170 | ||
174 | 171 | ||
175 | /* | 172 | /* clock source code */ |
176 | * Return the number of micro-seconds that elapsed since the last | ||
177 | * update to wall time (aka xtime). The xtime_lock | ||
178 | * must be at least read-locked when calling this routine. | ||
179 | */ | ||
180 | static inline unsigned long gettimeoffset (void) | ||
181 | { | ||
182 | #ifndef CONFIG_SMP | ||
183 | /* | ||
184 | * FIXME: This won't work on smp because jiffies are updated by cpu 0. | ||
185 | * Once parisc-linux learns the cr16 difference between processors, | ||
186 | * this could be made to work. | ||
187 | */ | ||
188 | unsigned long now; | ||
189 | unsigned long prev_tick; | ||
190 | unsigned long next_tick; | ||
191 | unsigned long elapsed_cycles; | ||
192 | unsigned long usec; | ||
193 | unsigned long cpuid = smp_processor_id(); | ||
194 | unsigned long cpt = clocktick; | ||
195 | |||
196 | next_tick = cpu_data[cpuid].it_value; | ||
197 | now = mfctl(16); /* Read the hardware interval timer. */ | ||
198 | 173 | ||
199 | prev_tick = next_tick - cpt; | 174 | static cycle_t read_cr16(void) |
175 | { | ||
176 | return get_cycles(); | ||
177 | } | ||
200 | 178 | ||
201 | /* Assume Scenario 1: "now" is later than prev_tick. */ | 179 | static int cr16_update_callback(void); |
202 | elapsed_cycles = now - prev_tick; | ||
203 | 180 | ||
204 | /* aproximate HZ with shifts. Intended math is "(elapsed/clocktick) > HZ" */ | 181 | static struct clocksource clocksource_cr16 = { |
205 | #if HZ == 1000 | 182 | .name = "cr16", |
206 | if (elapsed_cycles > (cpt << 10) ) | 183 | .rating = 300, |
207 | #elif HZ == 250 | 184 | .read = read_cr16, |
208 | if (elapsed_cycles > (cpt << 8) ) | 185 | .mask = CLOCKSOURCE_MASK(BITS_PER_LONG), |
209 | #elif HZ == 100 | 186 | .mult = 0, /* to be set */ |
210 | if (elapsed_cycles > (cpt << 7) ) | 187 | .shift = 22, |
211 | #else | 188 | .update_callback = cr16_update_callback, |
212 | #warn WTF is HZ set to anyway? | 189 | .is_continuous = 1, |
213 | if (elapsed_cycles > (HZ * cpt) ) | 190 | }; |
214 | #endif | ||
215 | { | ||
216 | /* Scenario 3: clock ticks are missing. */ | ||
217 | printk (KERN_CRIT "gettimeoffset(CPU %ld): missing %ld ticks!" | ||
218 | " cycles %lX prev/now/next %lX/%lX/%lX clock %lX\n", | ||
219 | cpuid, elapsed_cycles / cpt, | ||
220 | elapsed_cycles, prev_tick, now, next_tick, cpt); | ||
221 | } | ||
222 | 191 | ||
223 | /* FIXME: Can we improve the precision? Not with PAGE0. */ | 192 | static int cr16_update_callback(void) |
224 | usec = (elapsed_cycles * 10000) / PAGE0->mem_10msec; | ||
225 | return usec; | ||
226 | #else | ||
227 | return 0; | ||
228 | #endif | ||
229 | } | ||
230 | |||
231 | void | ||
232 | do_gettimeofday (struct timeval *tv) | ||
233 | { | 193 | { |
234 | unsigned long flags, seq, usec, sec; | 194 | int change = 0; |
235 | 195 | ||
236 | /* Hold xtime_lock and adjust timeval. */ | 196 | /* since the cr16 cycle counters are not syncronized across CPUs, |
237 | do { | 197 | we'll check if we should switch to a safe clocksource: */ |
238 | seq = read_seqbegin_irqsave(&xtime_lock, flags); | 198 | if (clocksource_cr16.rating != 0 && num_online_cpus() > 1) { |
239 | usec = gettimeoffset(); | 199 | clocksource_cr16.rating = 0; |
240 | sec = xtime.tv_sec; | 200 | clocksource_reselect(); |
241 | usec += (xtime.tv_nsec / 1000); | 201 | change = 1; |
242 | } while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); | ||
243 | |||
244 | /* Move adjusted usec's into sec's. */ | ||
245 | while (usec >= USEC_PER_SEC) { | ||
246 | usec -= USEC_PER_SEC; | ||
247 | ++sec; | ||
248 | } | 202 | } |
249 | 203 | ||
250 | /* Return adjusted result. */ | 204 | return change; |
251 | tv->tv_sec = sec; | ||
252 | tv->tv_usec = usec; | ||
253 | } | 205 | } |
254 | 206 | ||
255 | EXPORT_SYMBOL(do_gettimeofday); | ||
256 | |||
257 | int | ||
258 | do_settimeofday (struct timespec *tv) | ||
259 | { | ||
260 | time_t wtm_sec, sec = tv->tv_sec; | ||
261 | long wtm_nsec, nsec = tv->tv_nsec; | ||
262 | |||
263 | if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) | ||
264 | return -EINVAL; | ||
265 | |||
266 | write_seqlock_irq(&xtime_lock); | ||
267 | { | ||
268 | /* | ||
269 | * This is revolting. We need to set "xtime" | ||
270 | * correctly. However, the value in this location is | ||
271 | * the value at the most recent update of wall time. | ||
272 | * Discover what correction gettimeofday would have | ||
273 | * done, and then undo it! | ||
274 | */ | ||
275 | nsec -= gettimeoffset() * 1000; | ||
276 | |||
277 | wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec); | ||
278 | wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec); | ||
279 | |||
280 | set_normalized_timespec(&xtime, sec, nsec); | ||
281 | set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec); | ||
282 | |||
283 | ntp_clear(); | ||
284 | } | ||
285 | write_sequnlock_irq(&xtime_lock); | ||
286 | clock_was_set(); | ||
287 | return 0; | ||
288 | } | ||
289 | EXPORT_SYMBOL(do_settimeofday); | ||
290 | 207 | ||
291 | void __init start_cpu_itimer(void) | 208 | void __init start_cpu_itimer(void) |
292 | { | 209 | { |
@@ -301,11 +218,18 @@ void __init start_cpu_itimer(void) | |||
301 | void __init time_init(void) | 218 | void __init time_init(void) |
302 | { | 219 | { |
303 | static struct pdc_tod tod_data; | 220 | static struct pdc_tod tod_data; |
221 | unsigned long current_cr16_khz; | ||
304 | 222 | ||
305 | clocktick = (100 * PAGE0->mem_10msec) / HZ; | 223 | clocktick = (100 * PAGE0->mem_10msec) / HZ; |
306 | 224 | ||
307 | start_cpu_itimer(); /* get CPU 0 started */ | 225 | start_cpu_itimer(); /* get CPU 0 started */ |
308 | 226 | ||
227 | /* register at clocksource framework */ | ||
228 | current_cr16_khz = PAGE0->mem_10msec/10; /* kHz */ | ||
229 | clocksource_cr16.mult = clocksource_khz2mult(current_cr16_khz, | ||
230 | clocksource_cr16.shift); | ||
231 | clocksource_register(&clocksource_cr16); | ||
232 | |||
309 | if (pdc_tod_read(&tod_data) == 0) { | 233 | if (pdc_tod_read(&tod_data) == 0) { |
310 | unsigned long flags; | 234 | unsigned long flags; |
311 | 235 | ||
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index 65cd6ca32fed..55bc1471967d 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
27 | #include <linux/console.h> | 27 | #include <linux/console.h> |
28 | #include <linux/kallsyms.h> | 28 | #include <linux/kallsyms.h> |
29 | #include <linux/bug.h> | ||
29 | 30 | ||
30 | #include <asm/assembly.h> | 31 | #include <asm/assembly.h> |
31 | #include <asm/system.h> | 32 | #include <asm/system.h> |
@@ -39,6 +40,8 @@ | |||
39 | #include <asm/pdc.h> | 40 | #include <asm/pdc.h> |
40 | #include <asm/pdc_chassis.h> | 41 | #include <asm/pdc_chassis.h> |
41 | #include <asm/unwind.h> | 42 | #include <asm/unwind.h> |
43 | #include <asm/tlbflush.h> | ||
44 | #include <asm/cacheflush.h> | ||
42 | 45 | ||
43 | #include "../math-emu/math-emu.h" /* for handle_fpe() */ | 46 | #include "../math-emu/math-emu.h" /* for handle_fpe() */ |
44 | 47 | ||
@@ -49,7 +52,7 @@ | |||
49 | DEFINE_SPINLOCK(pa_dbit_lock); | 52 | DEFINE_SPINLOCK(pa_dbit_lock); |
50 | #endif | 53 | #endif |
51 | 54 | ||
52 | int printbinary(char *buf, unsigned long x, int nbits) | 55 | static int printbinary(char *buf, unsigned long x, int nbits) |
53 | { | 56 | { |
54 | unsigned long mask = 1UL << (nbits - 1); | 57 | unsigned long mask = 1UL << (nbits - 1); |
55 | while (mask != 0) { | 58 | while (mask != 0) { |
@@ -61,7 +64,7 @@ int printbinary(char *buf, unsigned long x, int nbits) | |||
61 | return nbits; | 64 | return nbits; |
62 | } | 65 | } |
63 | 66 | ||
64 | #ifdef __LP64__ | 67 | #ifdef CONFIG_64BIT |
65 | #define RFMT "%016lx" | 68 | #define RFMT "%016lx" |
66 | #else | 69 | #else |
67 | #define RFMT "%08lx" | 70 | #define RFMT "%08lx" |
@@ -160,13 +163,13 @@ static void do_show_stack(struct unwind_frame_info *info) | |||
160 | { | 163 | { |
161 | int i = 1; | 164 | int i = 1; |
162 | 165 | ||
163 | printk("Backtrace:\n"); | 166 | printk(KERN_CRIT "Backtrace:\n"); |
164 | while (i <= 16) { | 167 | while (i <= 16) { |
165 | if (unwind_once(info) < 0 || info->ip == 0) | 168 | if (unwind_once(info) < 0 || info->ip == 0) |
166 | break; | 169 | break; |
167 | 170 | ||
168 | if (__kernel_text_address(info->ip)) { | 171 | if (__kernel_text_address(info->ip)) { |
169 | printk(" [<" RFMT ">] ", info->ip); | 172 | printk("%s [<" RFMT ">] ", (i&0x3)==1 ? KERN_CRIT : "", info->ip); |
170 | #ifdef CONFIG_KALLSYMS | 173 | #ifdef CONFIG_KALLSYMS |
171 | print_symbol("%s\n", info->ip); | 174 | print_symbol("%s\n", info->ip); |
172 | #else | 175 | #else |
@@ -185,18 +188,19 @@ void show_stack(struct task_struct *task, unsigned long *s) | |||
185 | 188 | ||
186 | if (!task) { | 189 | if (!task) { |
187 | unsigned long sp; | 190 | unsigned long sp; |
188 | struct pt_regs *r; | ||
189 | 191 | ||
190 | HERE: | 192 | HERE: |
191 | asm volatile ("copy %%r30, %0" : "=r"(sp)); | 193 | asm volatile ("copy %%r30, %0" : "=r"(sp)); |
192 | r = kzalloc(sizeof(struct pt_regs), GFP_KERNEL); | 194 | { |
193 | if (!r) | 195 | struct pt_regs r; |
194 | return; | 196 | |
195 | r->iaoq[0] = (unsigned long)&&HERE; | 197 | memset(&r, 0, sizeof(struct pt_regs)); |
196 | r->gr[2] = (unsigned long)__builtin_return_address(0); | 198 | r.iaoq[0] = (unsigned long)&&HERE; |
197 | r->gr[30] = sp; | 199 | r.gr[2] = (unsigned long)__builtin_return_address(0); |
198 | unwind_frame_init(&info, current, r); | 200 | r.gr[30] = sp; |
199 | kfree(r); | 201 | |
202 | unwind_frame_init(&info, current, &r); | ||
203 | } | ||
200 | } else { | 204 | } else { |
201 | unwind_frame_init_from_blocked_task(&info, task); | 205 | unwind_frame_init_from_blocked_task(&info, task); |
202 | } | 206 | } |
@@ -204,6 +208,11 @@ HERE: | |||
204 | do_show_stack(&info); | 208 | do_show_stack(&info); |
205 | } | 209 | } |
206 | 210 | ||
211 | int is_valid_bugaddr(unsigned long iaoq) | ||
212 | { | ||
213 | return 1; | ||
214 | } | ||
215 | |||
207 | void die_if_kernel(char *str, struct pt_regs *regs, long err) | 216 | void die_if_kernel(char *str, struct pt_regs *regs, long err) |
208 | { | 217 | { |
209 | if (user_mode(regs)) { | 218 | if (user_mode(regs)) { |
@@ -222,15 +231,15 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err) | |||
222 | oops_in_progress = 1; | 231 | oops_in_progress = 1; |
223 | 232 | ||
224 | /* Amuse the user in a SPARC fashion */ | 233 | /* Amuse the user in a SPARC fashion */ |
225 | printk( | 234 | if (err) printk( |
226 | " _______________________________ \n" | 235 | KERN_CRIT " _______________________________ \n" |
227 | " < Your System ate a SPARC! Gah! >\n" | 236 | KERN_CRIT " < Your System ate a SPARC! Gah! >\n" |
228 | " ------------------------------- \n" | 237 | KERN_CRIT " ------------------------------- \n" |
229 | " \\ ^__^\n" | 238 | KERN_CRIT " \\ ^__^\n" |
230 | " \\ (xx)\\_______\n" | 239 | KERN_CRIT " \\ (xx)\\_______\n" |
231 | " (__)\\ )\\/\\\n" | 240 | KERN_CRIT " (__)\\ )\\/\\\n" |
232 | " U ||----w |\n" | 241 | KERN_CRIT " U ||----w |\n" |
233 | " || ||\n"); | 242 | KERN_CRIT " || ||\n"); |
234 | 243 | ||
235 | /* unlock the pdc lock if necessary */ | 244 | /* unlock the pdc lock if necessary */ |
236 | pdc_emergency_unlock(); | 245 | pdc_emergency_unlock(); |
@@ -242,9 +251,20 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err) | |||
242 | if (!console_drivers) | 251 | if (!console_drivers) |
243 | pdc_console_restart(); | 252 | pdc_console_restart(); |
244 | 253 | ||
245 | printk(KERN_CRIT "%s (pid %d): %s (code %ld)\n", | 254 | if (err) |
246 | current->comm, current->pid, str, err); | 255 | printk(KERN_CRIT "%s (pid %d): %s (code %ld)\n", |
256 | current->comm, current->pid, str, err); | ||
257 | |||
258 | /* Wot's wrong wif bein' racy? */ | ||
259 | if (current->thread.flags & PARISC_KERNEL_DEATH) { | ||
260 | printk(KERN_CRIT "%s() recursion detected.\n", __FUNCTION__); | ||
261 | local_irq_enable(); | ||
262 | while (1); | ||
263 | } | ||
264 | current->thread.flags |= PARISC_KERNEL_DEATH; | ||
265 | |||
247 | show_regs(regs); | 266 | show_regs(regs); |
267 | dump_stack(); | ||
248 | 268 | ||
249 | if (in_interrupt()) | 269 | if (in_interrupt()) |
250 | panic("Fatal exception in interrupt"); | 270 | panic("Fatal exception in interrupt"); |
@@ -255,14 +275,6 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err) | |||
255 | panic("Fatal exception"); | 275 | panic("Fatal exception"); |
256 | } | 276 | } |
257 | 277 | ||
258 | /* Wot's wrong wif bein' racy? */ | ||
259 | if (current->thread.flags & PARISC_KERNEL_DEATH) { | ||
260 | printk(KERN_CRIT "%s() recursion detected.\n", __FUNCTION__); | ||
261 | local_irq_enable(); | ||
262 | while (1); | ||
263 | } | ||
264 | |||
265 | current->thread.flags |= PARISC_KERNEL_DEATH; | ||
266 | do_exit(SIGSEGV); | 278 | do_exit(SIGSEGV); |
267 | } | 279 | } |
268 | 280 | ||
@@ -273,61 +285,45 @@ int syscall_ipi(int (*syscall) (struct pt_regs *), struct pt_regs *regs) | |||
273 | 285 | ||
274 | /* gdb uses break 4,8 */ | 286 | /* gdb uses break 4,8 */ |
275 | #define GDB_BREAK_INSN 0x10004 | 287 | #define GDB_BREAK_INSN 0x10004 |
276 | void handle_gdb_break(struct pt_regs *regs, int wot) | 288 | static void handle_gdb_break(struct pt_regs *regs, int wot) |
277 | { | 289 | { |
278 | struct siginfo si; | 290 | struct siginfo si; |
279 | 291 | ||
280 | si.si_code = wot; | ||
281 | si.si_addr = (void __user *) (regs->iaoq[0] & ~3); | ||
282 | si.si_signo = SIGTRAP; | 292 | si.si_signo = SIGTRAP; |
283 | si.si_errno = 0; | 293 | si.si_errno = 0; |
294 | si.si_code = wot; | ||
295 | si.si_addr = (void __user *) (regs->iaoq[0] & ~3); | ||
284 | force_sig_info(SIGTRAP, &si, current); | 296 | force_sig_info(SIGTRAP, &si, current); |
285 | } | 297 | } |
286 | 298 | ||
287 | void handle_break(unsigned iir, struct pt_regs *regs) | 299 | static void handle_break(struct pt_regs *regs) |
288 | { | 300 | { |
289 | struct siginfo si; | 301 | unsigned iir = regs->iir; |
290 | 302 | ||
291 | switch(iir) { | 303 | if (unlikely(iir == PARISC_BUG_BREAK_INSN && !user_mode(regs))) { |
292 | case 0x00: | 304 | /* check if a BUG() or WARN() trapped here. */ |
293 | #ifdef PRINT_USER_FAULTS | 305 | enum bug_trap_type tt; |
294 | printk(KERN_DEBUG "break 0,0: pid=%d command='%s'\n", | 306 | tt = report_bug(regs->iaoq[0] & ~3); |
295 | current->pid, current->comm); | 307 | if (tt == BUG_TRAP_TYPE_WARN) { |
296 | #endif | 308 | regs->iaoq[0] += 4; |
297 | die_if_kernel("Breakpoint", regs, 0); | 309 | regs->iaoq[1] += 4; |
298 | #ifdef PRINT_USER_FAULTS | 310 | return; /* return to next instruction when WARN_ON(). */ |
299 | show_regs(regs); | 311 | } |
300 | #endif | 312 | die_if_kernel("Unknown kernel breakpoint", regs, |
301 | si.si_code = TRAP_BRKPT; | 313 | (tt == BUG_TRAP_TYPE_NONE) ? 9 : 0); |
302 | si.si_addr = (void __user *) (regs->iaoq[0] & ~3); | 314 | } |
303 | si.si_signo = SIGTRAP; | ||
304 | force_sig_info(SIGTRAP, &si, current); | ||
305 | break; | ||
306 | |||
307 | case GDB_BREAK_INSN: | ||
308 | die_if_kernel("Breakpoint", regs, 0); | ||
309 | handle_gdb_break(regs, TRAP_BRKPT); | ||
310 | break; | ||
311 | 315 | ||
312 | default: | ||
313 | #ifdef PRINT_USER_FAULTS | 316 | #ifdef PRINT_USER_FAULTS |
314 | printk(KERN_DEBUG "break %#08x: pid=%d command='%s'\n", | 317 | if (unlikely(iir != GDB_BREAK_INSN)) { |
315 | iir, current->pid, current->comm); | 318 | printk(KERN_DEBUG "break %d,%d: pid=%d command='%s'\n", |
319 | iir & 31, (iir>>13) & ((1<<13)-1), | ||
320 | current->pid, current->comm); | ||
316 | show_regs(regs); | 321 | show_regs(regs); |
317 | #endif | ||
318 | si.si_signo = SIGTRAP; | ||
319 | si.si_code = TRAP_BRKPT; | ||
320 | si.si_addr = (void __user *) (regs->iaoq[0] & ~3); | ||
321 | force_sig_info(SIGTRAP, &si, current); | ||
322 | return; | ||
323 | } | 322 | } |
324 | } | 323 | #endif |
325 | |||
326 | 324 | ||
327 | int handle_toc(void) | 325 | /* send standard GDB signal */ |
328 | { | 326 | handle_gdb_break(regs, TRAP_BRKPT); |
329 | printk(KERN_CRIT "TOC call.\n"); | ||
330 | return 0; | ||
331 | } | 327 | } |
332 | 328 | ||
333 | static void default_trap(int code, struct pt_regs *regs) | 329 | static void default_trap(int code, struct pt_regs *regs) |
@@ -336,7 +332,7 @@ static void default_trap(int code, struct pt_regs *regs) | |||
336 | show_regs(regs); | 332 | show_regs(regs); |
337 | } | 333 | } |
338 | 334 | ||
339 | void (*cpu_lpmc) (int code, struct pt_regs *regs) = default_trap; | 335 | void (*cpu_lpmc) (int code, struct pt_regs *regs) __read_mostly = default_trap; |
340 | 336 | ||
341 | 337 | ||
342 | void transfer_pim_to_trap_frame(struct pt_regs *regs) | 338 | void transfer_pim_to_trap_frame(struct pt_regs *regs) |
@@ -554,7 +550,8 @@ void handle_interruption(int code, struct pt_regs *regs) | |||
554 | /* Low-priority machine check */ | 550 | /* Low-priority machine check */ |
555 | pdc_chassis_send_status(PDC_CHASSIS_DIRECT_LPMC); | 551 | pdc_chassis_send_status(PDC_CHASSIS_DIRECT_LPMC); |
556 | 552 | ||
557 | flush_all_caches(); | 553 | flush_cache_all(); |
554 | flush_tlb_all(); | ||
558 | cpu_lpmc(5, regs); | 555 | cpu_lpmc(5, regs); |
559 | return; | 556 | return; |
560 | 557 | ||
@@ -572,7 +569,7 @@ void handle_interruption(int code, struct pt_regs *regs) | |||
572 | 569 | ||
573 | case 9: | 570 | case 9: |
574 | /* Break instruction trap */ | 571 | /* Break instruction trap */ |
575 | handle_break(regs->iir,regs); | 572 | handle_break(regs); |
576 | return; | 573 | return; |
577 | 574 | ||
578 | case 10: | 575 | case 10: |
@@ -840,7 +837,7 @@ int __init check_ivt(void *iva) | |||
840 | return 0; | 837 | return 0; |
841 | } | 838 | } |
842 | 839 | ||
843 | #ifndef __LP64__ | 840 | #ifndef CONFIG_64BIT |
844 | extern const void fault_vector_11; | 841 | extern const void fault_vector_11; |
845 | #endif | 842 | #endif |
846 | extern const void fault_vector_20; | 843 | extern const void fault_vector_20; |
@@ -852,7 +849,7 @@ void __init trap_init(void) | |||
852 | if (boot_cpu_data.cpu_type >= pcxu) | 849 | if (boot_cpu_data.cpu_type >= pcxu) |
853 | iva = (void *) &fault_vector_20; | 850 | iva = (void *) &fault_vector_20; |
854 | else | 851 | else |
855 | #ifdef __LP64__ | 852 | #ifdef CONFIG_64BIT |
856 | panic("Can't boot 64-bit OS on PA1.1 processor!"); | 853 | panic("Can't boot 64-bit OS on PA1.1 processor!"); |
857 | #else | 854 | #else |
858 | iva = (void *) &fault_vector_11; | 855 | iva = (void *) &fault_vector_11; |
diff --git a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c index bd2230d6a2a6..347bb922e6d0 100644 --- a/arch/parisc/kernel/unaligned.c +++ b/arch/parisc/kernel/unaligned.c | |||
@@ -20,8 +20,11 @@ | |||
20 | * | 20 | * |
21 | */ | 21 | */ |
22 | 22 | ||
23 | #include <linux/jiffies.h> | ||
23 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
24 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/sched.h> | ||
27 | #include <linux/signal.h> | ||
25 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
26 | 29 | ||
27 | /* #define DEBUG_UNALIGNED 1 */ | 30 | /* #define DEBUG_UNALIGNED 1 */ |
@@ -32,7 +35,7 @@ | |||
32 | #define DPRINTF(fmt, args...) | 35 | #define DPRINTF(fmt, args...) |
33 | #endif | 36 | #endif |
34 | 37 | ||
35 | #ifdef __LP64__ | 38 | #ifdef CONFIG_64BIT |
36 | #define RFMT "%016lx" | 39 | #define RFMT "%016lx" |
37 | #else | 40 | #else |
38 | #define RFMT "%08lx" | 41 | #define RFMT "%08lx" |
@@ -147,15 +150,8 @@ static int emulate_ldh(struct pt_regs *regs, int toreg) | |||
147 | "4: ldi -2, %1\n" | 150 | "4: ldi -2, %1\n" |
148 | FIXUP_BRANCH(3b) | 151 | FIXUP_BRANCH(3b) |
149 | " .previous\n" | 152 | " .previous\n" |
150 | " .section __ex_table,\"aw\"\n" | 153 | ASM_EXCEPTIONTABLE_ENTRY(1b, 4b) |
151 | #ifdef __LP64__ | 154 | ASM_EXCEPTIONTABLE_ENTRY(2b, 4b) |
152 | " .dword 1b,4b\n" | ||
153 | " .dword 2b,4b\n" | ||
154 | #else | ||
155 | " .word 1b,4b\n" | ||
156 | " .word 2b,4b\n" | ||
157 | #endif | ||
158 | " .previous\n" | ||
159 | : "=r" (val), "=r" (ret) | 155 | : "=r" (val), "=r" (ret) |
160 | : "0" (val), "r" (saddr), "r" (regs->isr) | 156 | : "0" (val), "r" (saddr), "r" (regs->isr) |
161 | : "r20", FIXUP_BRANCH_CLOBBER ); | 157 | : "r20", FIXUP_BRANCH_CLOBBER ); |
@@ -192,15 +188,8 @@ static int emulate_ldw(struct pt_regs *regs, int toreg, int flop) | |||
192 | "4: ldi -2, %1\n" | 188 | "4: ldi -2, %1\n" |
193 | FIXUP_BRANCH(3b) | 189 | FIXUP_BRANCH(3b) |
194 | " .previous\n" | 190 | " .previous\n" |
195 | " .section __ex_table,\"aw\"\n" | 191 | ASM_EXCEPTIONTABLE_ENTRY(1b, 4b) |
196 | #ifdef __LP64__ | 192 | ASM_EXCEPTIONTABLE_ENTRY(2b, 4b) |
197 | " .dword 1b,4b\n" | ||
198 | " .dword 2b,4b\n" | ||
199 | #else | ||
200 | " .word 1b,4b\n" | ||
201 | " .word 2b,4b\n" | ||
202 | #endif | ||
203 | " .previous\n" | ||
204 | : "=r" (val), "=r" (ret) | 193 | : "=r" (val), "=r" (ret) |
205 | : "0" (val), "r" (saddr), "r" (regs->isr) | 194 | : "0" (val), "r" (saddr), "r" (regs->isr) |
206 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); | 195 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); |
@@ -224,7 +213,7 @@ static int emulate_ldd(struct pt_regs *regs, int toreg, int flop) | |||
224 | regs->isr, regs->ior, toreg); | 213 | regs->isr, regs->ior, toreg); |
225 | #ifdef CONFIG_PA20 | 214 | #ifdef CONFIG_PA20 |
226 | 215 | ||
227 | #ifndef __LP64__ | 216 | #ifndef CONFIG_64BIT |
228 | if (!flop) | 217 | if (!flop) |
229 | return -1; | 218 | return -1; |
230 | #endif | 219 | #endif |
@@ -243,15 +232,8 @@ static int emulate_ldd(struct pt_regs *regs, int toreg, int flop) | |||
243 | "4: ldi -2, %1\n" | 232 | "4: ldi -2, %1\n" |
244 | FIXUP_BRANCH(3b) | 233 | FIXUP_BRANCH(3b) |
245 | " .previous\n" | 234 | " .previous\n" |
246 | " .section __ex_table,\"aw\"\n" | 235 | ASM_EXCEPTIONTABLE_ENTRY(1b,4b) |
247 | #ifdef __LP64__ | 236 | ASM_EXCEPTIONTABLE_ENTRY(2b,4b) |
248 | " .dword 1b,4b\n" | ||
249 | " .dword 2b,4b\n" | ||
250 | #else | ||
251 | " .word 1b,4b\n" | ||
252 | " .word 2b,4b\n" | ||
253 | #endif | ||
254 | " .previous\n" | ||
255 | : "=r" (val), "=r" (ret) | 237 | : "=r" (val), "=r" (ret) |
256 | : "0" (val), "r" (saddr), "r" (regs->isr) | 238 | : "0" (val), "r" (saddr), "r" (regs->isr) |
257 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); | 239 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); |
@@ -275,17 +257,9 @@ static int emulate_ldd(struct pt_regs *regs, int toreg, int flop) | |||
275 | "5: ldi -2, %2\n" | 257 | "5: ldi -2, %2\n" |
276 | FIXUP_BRANCH(4b) | 258 | FIXUP_BRANCH(4b) |
277 | " .previous\n" | 259 | " .previous\n" |
278 | " .section __ex_table,\"aw\"\n" | 260 | ASM_EXCEPTIONTABLE_ENTRY(1b,5b) |
279 | #ifdef __LP64__ | 261 | ASM_EXCEPTIONTABLE_ENTRY(2b,5b) |
280 | " .dword 1b,5b\n" | 262 | ASM_EXCEPTIONTABLE_ENTRY(3b,5b) |
281 | " .dword 2b,5b\n" | ||
282 | " .dword 3b,5b\n" | ||
283 | #else | ||
284 | " .word 1b,5b\n" | ||
285 | " .word 2b,5b\n" | ||
286 | " .word 3b,5b\n" | ||
287 | #endif | ||
288 | " .previous\n" | ||
289 | : "=r" (valh), "=r" (vall), "=r" (ret) | 263 | : "=r" (valh), "=r" (vall), "=r" (ret) |
290 | : "0" (valh), "1" (vall), "r" (saddr), "r" (regs->isr) | 264 | : "0" (valh), "1" (vall), "r" (saddr), "r" (regs->isr) |
291 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); | 265 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); |
@@ -325,15 +299,8 @@ static int emulate_sth(struct pt_regs *regs, int frreg) | |||
325 | "4: ldi -2, %0\n" | 299 | "4: ldi -2, %0\n" |
326 | FIXUP_BRANCH(3b) | 300 | FIXUP_BRANCH(3b) |
327 | " .previous\n" | 301 | " .previous\n" |
328 | " .section __ex_table,\"aw\"\n" | 302 | ASM_EXCEPTIONTABLE_ENTRY(1b,4b) |
329 | #ifdef __LP64__ | 303 | ASM_EXCEPTIONTABLE_ENTRY(2b,4b) |
330 | " .dword 1b,4b\n" | ||
331 | " .dword 2b,4b\n" | ||
332 | #else | ||
333 | " .word 1b,4b\n" | ||
334 | " .word 2b,4b\n" | ||
335 | #endif | ||
336 | " .previous\n" | ||
337 | : "=r" (ret) | 304 | : "=r" (ret) |
338 | : "r" (val), "r" (regs->ior), "r" (regs->isr) | 305 | : "r" (val), "r" (regs->ior), "r" (regs->isr) |
339 | : "r19", FIXUP_BRANCH_CLOBBER ); | 306 | : "r19", FIXUP_BRANCH_CLOBBER ); |
@@ -379,15 +346,8 @@ static int emulate_stw(struct pt_regs *regs, int frreg, int flop) | |||
379 | "4: ldi -2, %0\n" | 346 | "4: ldi -2, %0\n" |
380 | FIXUP_BRANCH(3b) | 347 | FIXUP_BRANCH(3b) |
381 | " .previous\n" | 348 | " .previous\n" |
382 | " .section __ex_table,\"aw\"\n" | 349 | ASM_EXCEPTIONTABLE_ENTRY(1b,4b) |
383 | #ifdef __LP64__ | 350 | ASM_EXCEPTIONTABLE_ENTRY(2b,4b) |
384 | " .dword 1b,4b\n" | ||
385 | " .dword 2b,4b\n" | ||
386 | #else | ||
387 | " .word 1b,4b\n" | ||
388 | " .word 2b,4b\n" | ||
389 | #endif | ||
390 | " .previous\n" | ||
391 | : "=r" (ret) | 351 | : "=r" (ret) |
392 | : "r" (val), "r" (regs->ior), "r" (regs->isr) | 352 | : "r" (val), "r" (regs->ior), "r" (regs->isr) |
393 | : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER ); | 353 | : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER ); |
@@ -410,7 +370,7 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop) | |||
410 | val, regs->isr, regs->ior); | 370 | val, regs->isr, regs->ior); |
411 | 371 | ||
412 | #ifdef CONFIG_PA20 | 372 | #ifdef CONFIG_PA20 |
413 | #ifndef __LP64__ | 373 | #ifndef CONFIG_64BIT |
414 | if (!flop) | 374 | if (!flop) |
415 | return -1; | 375 | return -1; |
416 | #endif | 376 | #endif |
@@ -436,19 +396,10 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop) | |||
436 | "6: ldi -2, %0\n" | 396 | "6: ldi -2, %0\n" |
437 | FIXUP_BRANCH(5b) | 397 | FIXUP_BRANCH(5b) |
438 | " .previous\n" | 398 | " .previous\n" |
439 | " .section __ex_table,\"aw\"\n" | 399 | ASM_EXCEPTIONTABLE_ENTRY(1b,6b) |
440 | #ifdef __LP64__ | 400 | ASM_EXCEPTIONTABLE_ENTRY(2b,6b) |
441 | " .dword 1b,6b\n" | 401 | ASM_EXCEPTIONTABLE_ENTRY(3b,6b) |
442 | " .dword 2b,6b\n" | 402 | ASM_EXCEPTIONTABLE_ENTRY(4b,6b) |
443 | " .dword 3b,6b\n" | ||
444 | " .dword 4b,6b\n" | ||
445 | #else | ||
446 | " .word 1b,6b\n" | ||
447 | " .word 2b,6b\n" | ||
448 | " .word 3b,6b\n" | ||
449 | " .word 4b,6b\n" | ||
450 | #endif | ||
451 | " .previous\n" | ||
452 | : "=r" (ret) | 403 | : "=r" (ret) |
453 | : "r" (val), "r" (regs->ior), "r" (regs->isr) | 404 | : "r" (val), "r" (regs->ior), "r" (regs->isr) |
454 | : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER ); | 405 | : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER ); |
@@ -479,21 +430,11 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop) | |||
479 | "7: ldi -2, %0\n" | 430 | "7: ldi -2, %0\n" |
480 | FIXUP_BRANCH(6b) | 431 | FIXUP_BRANCH(6b) |
481 | " .previous\n" | 432 | " .previous\n" |
482 | " .section __ex_table,\"aw\"\n" | 433 | ASM_EXCEPTIONTABLE_ENTRY(1b,7b) |
483 | #ifdef __LP64__ | 434 | ASM_EXCEPTIONTABLE_ENTRY(2b,7b) |
484 | " .dword 1b,7b\n" | 435 | ASM_EXCEPTIONTABLE_ENTRY(3b,7b) |
485 | " .dword 2b,7b\n" | 436 | ASM_EXCEPTIONTABLE_ENTRY(4b,7b) |
486 | " .dword 3b,7b\n" | 437 | ASM_EXCEPTIONTABLE_ENTRY(5b,7b) |
487 | " .dword 4b,7b\n" | ||
488 | " .dword 5b,7b\n" | ||
489 | #else | ||
490 | " .word 1b,7b\n" | ||
491 | " .word 2b,7b\n" | ||
492 | " .word 3b,7b\n" | ||
493 | " .word 4b,7b\n" | ||
494 | " .word 5b,7b\n" | ||
495 | #endif | ||
496 | " .previous\n" | ||
497 | : "=r" (ret) | 438 | : "=r" (ret) |
498 | : "r" (valh), "r" (vall), "r" (regs->ior), "r" (regs->isr) | 439 | : "r" (valh), "r" (vall), "r" (regs->ior), "r" (regs->isr) |
499 | : "r19", "r20", "r21", "r1", FIXUP_BRANCH_CLOBBER ); | 440 | : "r19", "r20", "r21", "r1", FIXUP_BRANCH_CLOBBER ); |
diff --git a/arch/parisc/kernel/unwind.c b/arch/parisc/kernel/unwind.c index c10ab47d81fa..5f75b3e65986 100644 --- a/arch/parisc/kernel/unwind.c +++ b/arch/parisc/kernel/unwind.c | |||
@@ -10,6 +10,7 @@ | |||
10 | 10 | ||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/sched.h> | ||
13 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
14 | #include <linux/kallsyms.h> | 15 | #include <linux/kallsyms.h> |
15 | 16 | ||
diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index 3b78c2794c36..2a8253358c6c 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S | |||
@@ -68,6 +68,8 @@ SECTIONS | |||
68 | 68 | ||
69 | RODATA | 69 | RODATA |
70 | 70 | ||
71 | BUG_TABLE | ||
72 | |||
71 | /* writeable */ | 73 | /* writeable */ |
72 | . = ALIGN(ASM_PAGE_SIZE); /* Make sure this is page aligned so | 74 | . = ALIGN(ASM_PAGE_SIZE); /* Make sure this is page aligned so |
73 | that we can properly leave these | 75 | that we can properly leave these |