diff options
author | David S. Miller <davem@davemloft.net> | 2014-08-05 21:57:18 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-08-05 21:57:18 -0400 |
commit | e9011d086674caeedb0ffb6eb5b8bc5920821df3 (patch) | |
tree | ed5d06353d8dc1fa5f6da349808f8345ca2291a5 /arch/sparc | |
parent | cfcfe22256d5a8a14924a1145d56017b043b554f (diff) | |
parent | c78f77e20d2ba5d4d5e478e85a6fb42556893e2d (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc
Conflicts:
arch/sparc/mm/init_64.c
Conflict was simple non-overlapping additions.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc')
-rw-r--r-- | arch/sparc/Makefile | 3 | ||||
-rw-r--r-- | arch/sparc/boot/Makefile | 4 | ||||
-rw-r--r-- | arch/sparc/boot/install.sh | 50 | ||||
-rw-r--r-- | arch/sparc/include/asm/tlbflush_64.h | 12 | ||||
-rw-r--r-- | arch/sparc/include/uapi/asm/unistd.h | 3 | ||||
-rw-r--r-- | arch/sparc/kernel/ldc.c | 2 | ||||
-rw-r--r-- | arch/sparc/kernel/sys32.S | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/systbls_32.S | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/systbls_64.S | 2 | ||||
-rw-r--r-- | arch/sparc/math-emu/math_32.c | 2 | ||||
-rw-r--r-- | arch/sparc/mm/init_64.c | 32 |
11 files changed, 99 insertions, 13 deletions
diff --git a/arch/sparc/Makefile b/arch/sparc/Makefile index 9ff423678cbc..eaee14637d93 100644 --- a/arch/sparc/Makefile +++ b/arch/sparc/Makefile | |||
@@ -68,6 +68,9 @@ all: zImage | |||
68 | image zImage uImage tftpboot.img vmlinux.aout: vmlinux | 68 | image zImage uImage tftpboot.img vmlinux.aout: vmlinux |
69 | $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ | 69 | $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ |
70 | 70 | ||
71 | install: | ||
72 | $(Q)$(MAKE) $(build)=$(boot) $@ | ||
73 | |||
71 | archclean: | 74 | archclean: |
72 | $(Q)$(MAKE) $(clean)=$(boot) | 75 | $(Q)$(MAKE) $(clean)=$(boot) |
73 | 76 | ||
diff --git a/arch/sparc/boot/Makefile b/arch/sparc/boot/Makefile index 6e63afb128d9..6a4ceae5ec67 100644 --- a/arch/sparc/boot/Makefile +++ b/arch/sparc/boot/Makefile | |||
@@ -69,3 +69,7 @@ $(obj)/image: vmlinux FORCE | |||
69 | $(obj)/tftpboot.img: $(obj)/image $(obj)/piggyback System.map $(ROOT_IMG) FORCE | 69 | $(obj)/tftpboot.img: $(obj)/image $(obj)/piggyback System.map $(ROOT_IMG) FORCE |
70 | $(call if_changed,elftoaout) | 70 | $(call if_changed,elftoaout) |
71 | $(call if_changed,piggy) | 71 | $(call if_changed,piggy) |
72 | |||
73 | install: | ||
74 | sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(obj)/zImage \ | ||
75 | System.map "$(INSTALL_PATH)" | ||
diff --git a/arch/sparc/boot/install.sh b/arch/sparc/boot/install.sh new file mode 100644 index 000000000000..b32851eae693 --- /dev/null +++ b/arch/sparc/boot/install.sh | |||
@@ -0,0 +1,50 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # This file is subject to the terms and conditions of the GNU General Public | ||
4 | # License. See the file "COPYING" in the main directory of this archive | ||
5 | # for more details. | ||
6 | # | ||
7 | # Copyright (C) 1995 by Linus Torvalds | ||
8 | # | ||
9 | # Adapted from code in arch/i386/boot/Makefile by H. Peter Anvin | ||
10 | # | ||
11 | # "make install" script for SPARC architecture | ||
12 | # | ||
13 | # Arguments: | ||
14 | # $1 - kernel version | ||
15 | # $2 - kernel image file | ||
16 | # $3 - kernel map file | ||
17 | # $4 - default install path (blank if root directory) | ||
18 | # | ||
19 | |||
20 | verify () { | ||
21 | if [ ! -f "$1" ]; then | ||
22 | echo "" 1>&2 | ||
23 | echo " *** Missing file: $1" 1>&2 | ||
24 | echo ' *** You need to run "make" before "make install".' 1>&2 | ||
25 | echo "" 1>&2 | ||
26 | exit 1 | ||
27 | fi | ||
28 | } | ||
29 | |||
30 | # Make sure the files actually exist | ||
31 | verify "$2" | ||
32 | verify "$3" | ||
33 | |||
34 | # User may have a custom install script | ||
35 | |||
36 | if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi | ||
37 | if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi | ||
38 | |||
39 | # Default install - same as make zlilo | ||
40 | |||
41 | if [ -f $4/vmlinuz ]; then | ||
42 | mv $4/vmlinuz $4/vmlinuz.old | ||
43 | fi | ||
44 | |||
45 | if [ -f $4/System.map ]; then | ||
46 | mv $4/System.map $4/System.old | ||
47 | fi | ||
48 | |||
49 | cat $2 > $4/vmlinuz | ||
50 | cp $3 $4/System.map | ||
diff --git a/arch/sparc/include/asm/tlbflush_64.h b/arch/sparc/include/asm/tlbflush_64.h index 816d8202fa0a..dea1cfa2122b 100644 --- a/arch/sparc/include/asm/tlbflush_64.h +++ b/arch/sparc/include/asm/tlbflush_64.h | |||
@@ -34,6 +34,8 @@ static inline void flush_tlb_range(struct vm_area_struct *vma, | |||
34 | { | 34 | { |
35 | } | 35 | } |
36 | 36 | ||
37 | void flush_tlb_kernel_range(unsigned long start, unsigned long end); | ||
38 | |||
37 | #define __HAVE_ARCH_ENTER_LAZY_MMU_MODE | 39 | #define __HAVE_ARCH_ENTER_LAZY_MMU_MODE |
38 | 40 | ||
39 | void flush_tlb_pending(void); | 41 | void flush_tlb_pending(void); |
@@ -48,11 +50,6 @@ void __flush_tlb_kernel_range(unsigned long start, unsigned long end); | |||
48 | 50 | ||
49 | #ifndef CONFIG_SMP | 51 | #ifndef CONFIG_SMP |
50 | 52 | ||
51 | #define flush_tlb_kernel_range(start,end) \ | ||
52 | do { flush_tsb_kernel_range(start,end); \ | ||
53 | __flush_tlb_kernel_range(start,end); \ | ||
54 | } while (0) | ||
55 | |||
56 | static inline void global_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr) | 53 | static inline void global_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr) |
57 | { | 54 | { |
58 | __flush_tlb_page(CTX_HWBITS(mm->context), vaddr); | 55 | __flush_tlb_page(CTX_HWBITS(mm->context), vaddr); |
@@ -63,11 +60,6 @@ static inline void global_flush_tlb_page(struct mm_struct *mm, unsigned long vad | |||
63 | void smp_flush_tlb_kernel_range(unsigned long start, unsigned long end); | 60 | void smp_flush_tlb_kernel_range(unsigned long start, unsigned long end); |
64 | void smp_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr); | 61 | void smp_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr); |
65 | 62 | ||
66 | #define flush_tlb_kernel_range(start, end) \ | ||
67 | do { flush_tsb_kernel_range(start,end); \ | ||
68 | smp_flush_tlb_kernel_range(start, end); \ | ||
69 | } while (0) | ||
70 | |||
71 | #define global_flush_tlb_page(mm, vaddr) \ | 63 | #define global_flush_tlb_page(mm, vaddr) \ |
72 | smp_flush_tlb_page(mm, vaddr) | 64 | smp_flush_tlb_page(mm, vaddr) |
73 | 65 | ||
diff --git a/arch/sparc/include/uapi/asm/unistd.h b/arch/sparc/include/uapi/asm/unistd.h index b73274fb961a..42f2bca1d338 100644 --- a/arch/sparc/include/uapi/asm/unistd.h +++ b/arch/sparc/include/uapi/asm/unistd.h | |||
@@ -410,8 +410,9 @@ | |||
410 | #define __NR_finit_module 342 | 410 | #define __NR_finit_module 342 |
411 | #define __NR_sched_setattr 343 | 411 | #define __NR_sched_setattr 343 |
412 | #define __NR_sched_getattr 344 | 412 | #define __NR_sched_getattr 344 |
413 | #define __NR_renameat2 345 | ||
413 | 414 | ||
414 | #define NR_syscalls 345 | 415 | #define NR_syscalls 346 |
415 | 416 | ||
416 | /* Bitmask values returned from kern_features system call. */ | 417 | /* Bitmask values returned from kern_features system call. */ |
417 | #define KERN_FEATURE_MIXED_MODE_STACK 0x00000001 | 418 | #define KERN_FEATURE_MIXED_MODE_STACK 0x00000001 |
diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c index e01d75d40329..66dacd56bb10 100644 --- a/arch/sparc/kernel/ldc.c +++ b/arch/sparc/kernel/ldc.c | |||
@@ -1336,7 +1336,7 @@ int ldc_connect(struct ldc_channel *lp) | |||
1336 | if (!(lp->flags & LDC_FLAG_ALLOCED_QUEUES) || | 1336 | if (!(lp->flags & LDC_FLAG_ALLOCED_QUEUES) || |
1337 | !(lp->flags & LDC_FLAG_REGISTERED_QUEUES) || | 1337 | !(lp->flags & LDC_FLAG_REGISTERED_QUEUES) || |
1338 | lp->hs_state != LDC_HS_OPEN) | 1338 | lp->hs_state != LDC_HS_OPEN) |
1339 | err = -EINVAL; | 1339 | err = ((lp->hs_state > LDC_HS_OPEN) ? 0 : -EINVAL); |
1340 | else | 1340 | else |
1341 | err = start_handshake(lp); | 1341 | err = start_handshake(lp); |
1342 | 1342 | ||
diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S index d066eb18650c..f834224208ed 100644 --- a/arch/sparc/kernel/sys32.S +++ b/arch/sparc/kernel/sys32.S | |||
@@ -48,6 +48,7 @@ SIGN1(sys32_futex, compat_sys_futex, %o1) | |||
48 | SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0) | 48 | SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0) |
49 | SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0) | 49 | SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0) |
50 | SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) | 50 | SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) |
51 | SIGN2(sys32_renameat2, sys_renameat2, %o0, %o2) | ||
51 | 52 | ||
52 | .globl sys32_mmap2 | 53 | .globl sys32_mmap2 |
53 | sys32_mmap2: | 54 | sys32_mmap2: |
diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S index 151ace8766cc..85fe9b1087cd 100644 --- a/arch/sparc/kernel/systbls_32.S +++ b/arch/sparc/kernel/systbls_32.S | |||
@@ -86,3 +86,4 @@ sys_call_table: | |||
86 | /*330*/ .long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime | 86 | /*330*/ .long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime |
87 | /*335*/ .long sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev | 87 | /*335*/ .long sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev |
88 | /*340*/ .long sys_ni_syscall, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr | 88 | /*340*/ .long sys_ni_syscall, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr |
89 | /*345*/ .long sys_renameat2 | ||
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index 4bd4e2bb26cf..33ecba2826ea 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S | |||
@@ -87,6 +87,7 @@ sys_call_table32: | |||
87 | /*330*/ .word compat_sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime | 87 | /*330*/ .word compat_sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime |
88 | .word sys_syncfs, compat_sys_sendmmsg, sys_setns, compat_sys_process_vm_readv, compat_sys_process_vm_writev | 88 | .word sys_syncfs, compat_sys_sendmmsg, sys_setns, compat_sys_process_vm_readv, compat_sys_process_vm_writev |
89 | /*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr | 89 | /*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr |
90 | .word sys32_renameat2 | ||
90 | 91 | ||
91 | #endif /* CONFIG_COMPAT */ | 92 | #endif /* CONFIG_COMPAT */ |
92 | 93 | ||
@@ -165,3 +166,4 @@ sys_call_table: | |||
165 | /*330*/ .word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime | 166 | /*330*/ .word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime |
166 | .word sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev | 167 | .word sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev |
167 | /*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr | 168 | /*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr |
169 | .word sys_renameat2 | ||
diff --git a/arch/sparc/math-emu/math_32.c b/arch/sparc/math-emu/math_32.c index aa4d55b0bdf0..5ce8f2f64604 100644 --- a/arch/sparc/math-emu/math_32.c +++ b/arch/sparc/math-emu/math_32.c | |||
@@ -499,7 +499,7 @@ static int do_one_mathemu(u32 insn, unsigned long *pfsr, unsigned long *fregs) | |||
499 | case 0: fsr = *pfsr; | 499 | case 0: fsr = *pfsr; |
500 | if (IR == -1) IR = 2; | 500 | if (IR == -1) IR = 2; |
501 | /* fcc is always fcc0 */ | 501 | /* fcc is always fcc0 */ |
502 | fsr &= ~0xc00; fsr |= (IR << 10); break; | 502 | fsr &= ~0xc00; fsr |= (IR << 10); |
503 | *pfsr = fsr; | 503 | *pfsr = fsr; |
504 | break; | 504 | break; |
505 | case 1: rd->s = IR; break; | 505 | case 1: rd->s = IR; break; |
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index 9f4f532e2627..cdc9f145e3c3 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c | |||
@@ -352,6 +352,10 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t * | |||
352 | 352 | ||
353 | mm = vma->vm_mm; | 353 | mm = vma->vm_mm; |
354 | 354 | ||
355 | /* Don't insert a non-valid PTE into the TSB, we'll deadlock. */ | ||
356 | if (!pte_accessible(mm, pte)) | ||
357 | return; | ||
358 | |||
355 | spin_lock_irqsave(&mm->context.lock, flags); | 359 | spin_lock_irqsave(&mm->context.lock, flags); |
356 | 360 | ||
357 | #if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE) | 361 | #if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE) |
@@ -2620,6 +2624,10 @@ void update_mmu_cache_pmd(struct vm_area_struct *vma, unsigned long addr, | |||
2620 | 2624 | ||
2621 | pte = pmd_val(entry); | 2625 | pte = pmd_val(entry); |
2622 | 2626 | ||
2627 | /* Don't insert a non-valid PMD into the TSB, we'll deadlock. */ | ||
2628 | if (!(pte & _PAGE_VALID)) | ||
2629 | return; | ||
2630 | |||
2623 | /* We are fabricating 8MB pages using 4MB real hw pages. */ | 2631 | /* We are fabricating 8MB pages using 4MB real hw pages. */ |
2624 | pte |= (addr & (1UL << REAL_HPAGE_SHIFT)); | 2632 | pte |= (addr & (1UL << REAL_HPAGE_SHIFT)); |
2625 | 2633 | ||
@@ -2764,3 +2772,27 @@ static int __init report_memory(void) | |||
2764 | return 0; | 2772 | return 0; |
2765 | } | 2773 | } |
2766 | device_initcall(report_memory); | 2774 | device_initcall(report_memory); |
2775 | |||
2776 | #ifdef CONFIG_SMP | ||
2777 | #define do_flush_tlb_kernel_range smp_flush_tlb_kernel_range | ||
2778 | #else | ||
2779 | #define do_flush_tlb_kernel_range __flush_tlb_kernel_range | ||
2780 | #endif | ||
2781 | |||
2782 | void flush_tlb_kernel_range(unsigned long start, unsigned long end) | ||
2783 | { | ||
2784 | if (start < HI_OBP_ADDRESS && end > LOW_OBP_ADDRESS) { | ||
2785 | if (start < LOW_OBP_ADDRESS) { | ||
2786 | flush_tsb_kernel_range(start, LOW_OBP_ADDRESS); | ||
2787 | do_flush_tlb_kernel_range(start, LOW_OBP_ADDRESS); | ||
2788 | } | ||
2789 | if (end > HI_OBP_ADDRESS) { | ||
2790 | flush_tsb_kernel_range(end, HI_OBP_ADDRESS); | ||
2791 | do_flush_tlb_kernel_range(end, HI_OBP_ADDRESS); | ||
2792 | } | ||
2793 | } else { | ||
2794 | flush_tsb_kernel_range(start, end); | ||
2795 | do_flush_tlb_kernel_range(start, end); | ||
2796 | } | ||
2797 | } | ||
2798 | >>>>>>> c78f77e20d2ba5d4d5e478e85a6fb42556893e2d | ||