diff options
Diffstat (limited to 'arch/sparc')
26 files changed, 383 insertions, 412 deletions
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 96ac69c5eba0..efb00ec75805 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
@@ -86,6 +86,9 @@ config ARCH_DEFCONFIG | |||
86 | default "arch/sparc/configs/sparc32_defconfig" if SPARC32 | 86 | default "arch/sparc/configs/sparc32_defconfig" if SPARC32 |
87 | default "arch/sparc/configs/sparc64_defconfig" if SPARC64 | 87 | default "arch/sparc/configs/sparc64_defconfig" if SPARC64 |
88 | 88 | ||
89 | config ARCH_PROC_KCORE_TEXT | ||
90 | def_bool y | ||
91 | |||
89 | config IOMMU_HELPER | 92 | config IOMMU_HELPER |
90 | bool | 93 | bool |
91 | default y if SPARC64 | 94 | default y if SPARC64 |
diff --git a/arch/sparc/crypto/aes_glue.c b/arch/sparc/crypto/aes_glue.c index 705408766ab0..2e48eb8813ff 100644 --- a/arch/sparc/crypto/aes_glue.c +++ b/arch/sparc/crypto/aes_glue.c | |||
@@ -497,7 +497,7 @@ module_init(aes_sparc64_mod_init); | |||
497 | module_exit(aes_sparc64_mod_fini); | 497 | module_exit(aes_sparc64_mod_fini); |
498 | 498 | ||
499 | MODULE_LICENSE("GPL"); | 499 | MODULE_LICENSE("GPL"); |
500 | MODULE_DESCRIPTION("AES Secure Hash Algorithm, sparc64 aes opcode accelerated"); | 500 | MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm, sparc64 aes opcode accelerated"); |
501 | 501 | ||
502 | MODULE_ALIAS_CRYPTO("aes"); | 502 | MODULE_ALIAS_CRYPTO("aes"); |
503 | 503 | ||
diff --git a/arch/sparc/crypto/camellia_glue.c b/arch/sparc/crypto/camellia_glue.c index 641f55cb61c3..6bf2479a12fb 100644 --- a/arch/sparc/crypto/camellia_glue.c +++ b/arch/sparc/crypto/camellia_glue.c | |||
@@ -322,6 +322,6 @@ module_exit(camellia_sparc64_mod_fini); | |||
322 | MODULE_LICENSE("GPL"); | 322 | MODULE_LICENSE("GPL"); |
323 | MODULE_DESCRIPTION("Camellia Cipher Algorithm, sparc64 camellia opcode accelerated"); | 323 | MODULE_DESCRIPTION("Camellia Cipher Algorithm, sparc64 camellia opcode accelerated"); |
324 | 324 | ||
325 | MODULE_ALIAS_CRYPTO("aes"); | 325 | MODULE_ALIAS_CRYPTO("camellia"); |
326 | 326 | ||
327 | #include "crop_devid.c" | 327 | #include "crop_devid.c" |
diff --git a/arch/sparc/crypto/des_glue.c b/arch/sparc/crypto/des_glue.c index d11500972994..dd6a34fa6e19 100644 --- a/arch/sparc/crypto/des_glue.c +++ b/arch/sparc/crypto/des_glue.c | |||
@@ -533,5 +533,6 @@ MODULE_LICENSE("GPL"); | |||
533 | MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms, sparc64 des opcode accelerated"); | 533 | MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms, sparc64 des opcode accelerated"); |
534 | 534 | ||
535 | MODULE_ALIAS_CRYPTO("des"); | 535 | MODULE_ALIAS_CRYPTO("des"); |
536 | MODULE_ALIAS_CRYPTO("des3_ede"); | ||
536 | 537 | ||
537 | #include "crop_devid.c" | 538 | #include "crop_devid.c" |
diff --git a/arch/sparc/crypto/md5_glue.c b/arch/sparc/crypto/md5_glue.c index 64c7ff5f72a9..b688731d7ede 100644 --- a/arch/sparc/crypto/md5_glue.c +++ b/arch/sparc/crypto/md5_glue.c | |||
@@ -183,7 +183,7 @@ module_init(md5_sparc64_mod_init); | |||
183 | module_exit(md5_sparc64_mod_fini); | 183 | module_exit(md5_sparc64_mod_fini); |
184 | 184 | ||
185 | MODULE_LICENSE("GPL"); | 185 | MODULE_LICENSE("GPL"); |
186 | MODULE_DESCRIPTION("MD5 Secure Hash Algorithm, sparc64 md5 opcode accelerated"); | 186 | MODULE_DESCRIPTION("MD5 Message Digest Algorithm, sparc64 md5 opcode accelerated"); |
187 | 187 | ||
188 | MODULE_ALIAS_CRYPTO("md5"); | 188 | MODULE_ALIAS_CRYPTO("md5"); |
189 | 189 | ||
diff --git a/arch/sparc/include/asm/io_64.h b/arch/sparc/include/asm/io_64.h index 9b672be70dda..50d4840d9aeb 100644 --- a/arch/sparc/include/asm/io_64.h +++ b/arch/sparc/include/asm/io_64.h | |||
@@ -407,16 +407,16 @@ static inline void iounmap(volatile void __iomem *addr) | |||
407 | { | 407 | { |
408 | } | 408 | } |
409 | 409 | ||
410 | #define ioread8(X) readb(X) | 410 | #define ioread8 readb |
411 | #define ioread16(X) readw(X) | 411 | #define ioread16 readw |
412 | #define ioread16be(X) __raw_readw(X) | 412 | #define ioread16be __raw_readw |
413 | #define ioread32(X) readl(X) | 413 | #define ioread32 readl |
414 | #define ioread32be(X) __raw_readl(X) | 414 | #define ioread32be __raw_readl |
415 | #define iowrite8(val,X) writeb(val,X) | 415 | #define iowrite8 writeb |
416 | #define iowrite16(val,X) writew(val,X) | 416 | #define iowrite16 writew |
417 | #define iowrite16be(val,X) __raw_writew(val,X) | 417 | #define iowrite16be __raw_writew |
418 | #define iowrite32(val,X) writel(val,X) | 418 | #define iowrite32 writel |
419 | #define iowrite32be(val,X) __raw_writel(val,X) | 419 | #define iowrite32be __raw_writel |
420 | 420 | ||
421 | /* Create a virtual mapping cookie for an IO port range */ | 421 | /* Create a virtual mapping cookie for an IO port range */ |
422 | void __iomem *ioport_map(unsigned long port, unsigned int nr); | 422 | void __iomem *ioport_map(unsigned long port, unsigned int nr); |
diff --git a/arch/sparc/include/asm/pgtable_32.h b/arch/sparc/include/asm/pgtable_32.h index b9b91ae19fe1..f06b36a00a3b 100644 --- a/arch/sparc/include/asm/pgtable_32.h +++ b/arch/sparc/include/asm/pgtable_32.h | |||
@@ -44,7 +44,7 @@ unsigned long __init bootmem_init(unsigned long *pages_avail); | |||
44 | #define PTRS_PER_PMD SRMMU_PTRS_PER_PMD | 44 | #define PTRS_PER_PMD SRMMU_PTRS_PER_PMD |
45 | #define PTRS_PER_PGD SRMMU_PTRS_PER_PGD | 45 | #define PTRS_PER_PGD SRMMU_PTRS_PER_PGD |
46 | #define USER_PTRS_PER_PGD PAGE_OFFSET / SRMMU_PGDIR_SIZE | 46 | #define USER_PTRS_PER_PGD PAGE_OFFSET / SRMMU_PGDIR_SIZE |
47 | #define FIRST_USER_ADDRESS 0 | 47 | #define FIRST_USER_ADDRESS 0UL |
48 | #define PTE_SIZE (PTRS_PER_PTE*4) | 48 | #define PTE_SIZE (PTRS_PER_PTE*4) |
49 | 49 | ||
50 | #define PAGE_NONE SRMMU_PAGE_NONE | 50 | #define PAGE_NONE SRMMU_PAGE_NONE |
@@ -102,7 +102,8 @@ extern unsigned long empty_zero_page; | |||
102 | */ | 102 | */ |
103 | static inline unsigned long srmmu_swap(unsigned long *addr, unsigned long value) | 103 | static inline unsigned long srmmu_swap(unsigned long *addr, unsigned long value) |
104 | { | 104 | { |
105 | __asm__ __volatile__("swap [%2], %0" : "=&r" (value) : "0" (value), "r" (addr)); | 105 | __asm__ __volatile__("swap [%2], %0" : |
106 | "=&r" (value) : "0" (value), "r" (addr) : "memory"); | ||
106 | return value; | 107 | return value; |
107 | } | 108 | } |
108 | 109 | ||
@@ -221,14 +222,6 @@ static inline int pte_young(pte_t pte) | |||
221 | return pte_val(pte) & SRMMU_REF; | 222 | return pte_val(pte) & SRMMU_REF; |
222 | } | 223 | } |
223 | 224 | ||
224 | /* | ||
225 | * The following only work if pte_present() is not true. | ||
226 | */ | ||
227 | static inline int pte_file(pte_t pte) | ||
228 | { | ||
229 | return pte_val(pte) & SRMMU_FILE; | ||
230 | } | ||
231 | |||
232 | static inline int pte_special(pte_t pte) | 225 | static inline int pte_special(pte_t pte) |
233 | { | 226 | { |
234 | return 0; | 227 | return 0; |
@@ -375,22 +368,6 @@ static inline swp_entry_t __swp_entry(unsigned long type, unsigned long offset) | |||
375 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) | 368 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) |
376 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) | 369 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) |
377 | 370 | ||
378 | /* file-offset-in-pte helpers */ | ||
379 | static inline unsigned long pte_to_pgoff(pte_t pte) | ||
380 | { | ||
381 | return pte_val(pte) >> SRMMU_PTE_FILE_SHIFT; | ||
382 | } | ||
383 | |||
384 | static inline pte_t pgoff_to_pte(unsigned long pgoff) | ||
385 | { | ||
386 | return __pte((pgoff << SRMMU_PTE_FILE_SHIFT) | SRMMU_FILE); | ||
387 | } | ||
388 | |||
389 | /* | ||
390 | * This is made a constant because mm/fremap.c required a constant. | ||
391 | */ | ||
392 | #define PTE_FILE_MAX_BITS 24 | ||
393 | |||
394 | static inline unsigned long | 371 | static inline unsigned long |
395 | __get_phys (unsigned long addr) | 372 | __get_phys (unsigned long addr) |
396 | { | 373 | { |
diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h index 1ff9e7864168..dc165ebdf05a 100644 --- a/arch/sparc/include/asm/pgtable_64.h +++ b/arch/sparc/include/asm/pgtable_64.h | |||
@@ -93,7 +93,7 @@ bool kern_addr_valid(unsigned long addr); | |||
93 | #define PTRS_PER_PGD (1UL << PGDIR_BITS) | 93 | #define PTRS_PER_PGD (1UL << PGDIR_BITS) |
94 | 94 | ||
95 | /* Kernel has a separate 44bit address space. */ | 95 | /* Kernel has a separate 44bit address space. */ |
96 | #define FIRST_USER_ADDRESS 0 | 96 | #define FIRST_USER_ADDRESS 0UL |
97 | 97 | ||
98 | #define pmd_ERROR(e) \ | 98 | #define pmd_ERROR(e) \ |
99 | pr_err("%s:%d: bad pmd %p(%016lx) seen at (%pS)\n", \ | 99 | pr_err("%s:%d: bad pmd %p(%016lx) seen at (%pS)\n", \ |
@@ -137,7 +137,6 @@ bool kern_addr_valid(unsigned long addr); | |||
137 | #define _PAGE_SOFT_4U _AC(0x0000000000001F80,UL) /* Software bits: */ | 137 | #define _PAGE_SOFT_4U _AC(0x0000000000001F80,UL) /* Software bits: */ |
138 | #define _PAGE_EXEC_4U _AC(0x0000000000001000,UL) /* Executable SW bit */ | 138 | #define _PAGE_EXEC_4U _AC(0x0000000000001000,UL) /* Executable SW bit */ |
139 | #define _PAGE_MODIFIED_4U _AC(0x0000000000000800,UL) /* Modified (dirty) */ | 139 | #define _PAGE_MODIFIED_4U _AC(0x0000000000000800,UL) /* Modified (dirty) */ |
140 | #define _PAGE_FILE_4U _AC(0x0000000000000800,UL) /* Pagecache page */ | ||
141 | #define _PAGE_ACCESSED_4U _AC(0x0000000000000400,UL) /* Accessed (ref'd) */ | 140 | #define _PAGE_ACCESSED_4U _AC(0x0000000000000400,UL) /* Accessed (ref'd) */ |
142 | #define _PAGE_READ_4U _AC(0x0000000000000200,UL) /* Readable SW Bit */ | 141 | #define _PAGE_READ_4U _AC(0x0000000000000200,UL) /* Readable SW Bit */ |
143 | #define _PAGE_WRITE_4U _AC(0x0000000000000100,UL) /* Writable SW Bit */ | 142 | #define _PAGE_WRITE_4U _AC(0x0000000000000100,UL) /* Writable SW Bit */ |
@@ -167,7 +166,6 @@ bool kern_addr_valid(unsigned long addr); | |||
167 | #define _PAGE_EXEC_4V _AC(0x0000000000000080,UL) /* Executable Page */ | 166 | #define _PAGE_EXEC_4V _AC(0x0000000000000080,UL) /* Executable Page */ |
168 | #define _PAGE_W_4V _AC(0x0000000000000040,UL) /* Writable */ | 167 | #define _PAGE_W_4V _AC(0x0000000000000040,UL) /* Writable */ |
169 | #define _PAGE_SOFT_4V _AC(0x0000000000000030,UL) /* Software bits */ | 168 | #define _PAGE_SOFT_4V _AC(0x0000000000000030,UL) /* Software bits */ |
170 | #define _PAGE_FILE_4V _AC(0x0000000000000020,UL) /* Pagecache page */ | ||
171 | #define _PAGE_PRESENT_4V _AC(0x0000000000000010,UL) /* Present */ | 169 | #define _PAGE_PRESENT_4V _AC(0x0000000000000010,UL) /* Present */ |
172 | #define _PAGE_RESV_4V _AC(0x0000000000000008,UL) /* Reserved */ | 170 | #define _PAGE_RESV_4V _AC(0x0000000000000008,UL) /* Reserved */ |
173 | #define _PAGE_SZ16GB_4V _AC(0x0000000000000007,UL) /* 16GB Page */ | 171 | #define _PAGE_SZ16GB_4V _AC(0x0000000000000007,UL) /* 16GB Page */ |
@@ -332,22 +330,6 @@ static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot) | |||
332 | } | 330 | } |
333 | #endif | 331 | #endif |
334 | 332 | ||
335 | static inline pte_t pgoff_to_pte(unsigned long off) | ||
336 | { | ||
337 | off <<= PAGE_SHIFT; | ||
338 | |||
339 | __asm__ __volatile__( | ||
340 | "\n661: or %0, %2, %0\n" | ||
341 | " .section .sun4v_1insn_patch, \"ax\"\n" | ||
342 | " .word 661b\n" | ||
343 | " or %0, %3, %0\n" | ||
344 | " .previous\n" | ||
345 | : "=r" (off) | ||
346 | : "0" (off), "i" (_PAGE_FILE_4U), "i" (_PAGE_FILE_4V)); | ||
347 | |||
348 | return __pte(off); | ||
349 | } | ||
350 | |||
351 | static inline pgprot_t pgprot_noncached(pgprot_t prot) | 333 | static inline pgprot_t pgprot_noncached(pgprot_t prot) |
352 | { | 334 | { |
353 | unsigned long val = pgprot_val(prot); | 335 | unsigned long val = pgprot_val(prot); |
@@ -609,22 +591,6 @@ static inline unsigned long pte_exec(pte_t pte) | |||
609 | return (pte_val(pte) & mask); | 591 | return (pte_val(pte) & mask); |
610 | } | 592 | } |
611 | 593 | ||
612 | static inline unsigned long pte_file(pte_t pte) | ||
613 | { | ||
614 | unsigned long val = pte_val(pte); | ||
615 | |||
616 | __asm__ __volatile__( | ||
617 | "\n661: and %0, %2, %0\n" | ||
618 | " .section .sun4v_1insn_patch, \"ax\"\n" | ||
619 | " .word 661b\n" | ||
620 | " and %0, %3, %0\n" | ||
621 | " .previous\n" | ||
622 | : "=r" (val) | ||
623 | : "0" (val), "i" (_PAGE_FILE_4U), "i" (_PAGE_FILE_4V)); | ||
624 | |||
625 | return val; | ||
626 | } | ||
627 | |||
628 | static inline unsigned long pte_present(pte_t pte) | 594 | static inline unsigned long pte_present(pte_t pte) |
629 | { | 595 | { |
630 | unsigned long val = pte_val(pte); | 596 | unsigned long val = pte_val(pte); |
@@ -971,12 +937,6 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp); | |||
971 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) | 937 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) |
972 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) | 938 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) |
973 | 939 | ||
974 | /* File offset in PTE support. */ | ||
975 | unsigned long pte_file(pte_t); | ||
976 | #define pte_to_pgoff(pte) (pte_val(pte) >> PAGE_SHIFT) | ||
977 | pte_t pgoff_to_pte(unsigned long); | ||
978 | #define PTE_FILE_MAX_BITS (64UL - PAGE_SHIFT - 1UL) | ||
979 | |||
980 | int page_in_phys_avail(unsigned long paddr); | 940 | int page_in_phys_avail(unsigned long paddr); |
981 | 941 | ||
982 | /* | 942 | /* |
diff --git a/arch/sparc/include/asm/pgtsrmmu.h b/arch/sparc/include/asm/pgtsrmmu.h index 79da17866fa8..ae51a111a8c7 100644 --- a/arch/sparc/include/asm/pgtsrmmu.h +++ b/arch/sparc/include/asm/pgtsrmmu.h | |||
@@ -80,10 +80,6 @@ | |||
80 | #define SRMMU_PRIV 0x1c | 80 | #define SRMMU_PRIV 0x1c |
81 | #define SRMMU_PRIV_RDONLY 0x18 | 81 | #define SRMMU_PRIV_RDONLY 0x18 |
82 | 82 | ||
83 | #define SRMMU_FILE 0x40 /* Implemented in software */ | ||
84 | |||
85 | #define SRMMU_PTE_FILE_SHIFT 8 /* == 32-PTE_FILE_MAX_BITS */ | ||
86 | |||
87 | #define SRMMU_CHG_MASK (0xffffff00 | SRMMU_REF | SRMMU_DIRTY) | 83 | #define SRMMU_CHG_MASK (0xffffff00 | SRMMU_REF | SRMMU_DIRTY) |
88 | 84 | ||
89 | /* SRMMU swap entry encoding | 85 | /* SRMMU swap entry encoding |
@@ -94,13 +90,13 @@ | |||
94 | * oooooooooooooooooootttttRRRRRRRR | 90 | * oooooooooooooooooootttttRRRRRRRR |
95 | * fedcba9876543210fedcba9876543210 | 91 | * fedcba9876543210fedcba9876543210 |
96 | * | 92 | * |
97 | * The bottom 8 bits are reserved for protection and status bits, especially | 93 | * The bottom 7 bits are reserved for protection and status bits, especially |
98 | * FILE and PRESENT. | 94 | * PRESENT. |
99 | */ | 95 | */ |
100 | #define SRMMU_SWP_TYPE_MASK 0x1f | 96 | #define SRMMU_SWP_TYPE_MASK 0x1f |
101 | #define SRMMU_SWP_TYPE_SHIFT SRMMU_PTE_FILE_SHIFT | 97 | #define SRMMU_SWP_TYPE_SHIFT 7 |
102 | #define SRMMU_SWP_OFF_MASK 0x7ffff | 98 | #define SRMMU_SWP_OFF_MASK 0xfffff |
103 | #define SRMMU_SWP_OFF_SHIFT (SRMMU_PTE_FILE_SHIFT + 5) | 99 | #define SRMMU_SWP_OFF_SHIFT (SRMMU_SWP_TYPE_SHIFT + 5) |
104 | 100 | ||
105 | /* Some day I will implement true fine grained access bits for | 101 | /* Some day I will implement true fine grained access bits for |
106 | * user pages because the SRMMU gives us the capabilities to | 102 | * user pages because the SRMMU gives us the capabilities to |
diff --git a/arch/sparc/include/asm/starfire.h b/arch/sparc/include/asm/starfire.h index c100dc27a0a9..176fa0ad19f1 100644 --- a/arch/sparc/include/asm/starfire.h +++ b/arch/sparc/include/asm/starfire.h | |||
@@ -12,7 +12,6 @@ | |||
12 | extern int this_is_starfire; | 12 | extern int this_is_starfire; |
13 | 13 | ||
14 | void check_if_starfire(void); | 14 | void check_if_starfire(void); |
15 | int starfire_hard_smp_processor_id(void); | ||
16 | void starfire_hookup(int); | 15 | void starfire_hookup(int); |
17 | unsigned int starfire_translate(unsigned long imap, unsigned int upaid); | 16 | unsigned int starfire_translate(unsigned long imap, unsigned int upaid); |
18 | 17 | ||
diff --git a/arch/sparc/include/asm/thread_info_32.h b/arch/sparc/include/asm/thread_info_32.h index 025c98446b1e..fd7bd0a440ca 100644 --- a/arch/sparc/include/asm/thread_info_32.h +++ b/arch/sparc/include/asm/thread_info_32.h | |||
@@ -47,8 +47,6 @@ struct thread_info { | |||
47 | struct reg_window32 reg_window[NSWINS]; /* align for ldd! */ | 47 | struct reg_window32 reg_window[NSWINS]; /* align for ldd! */ |
48 | unsigned long rwbuf_stkptrs[NSWINS]; | 48 | unsigned long rwbuf_stkptrs[NSWINS]; |
49 | unsigned long w_saved; | 49 | unsigned long w_saved; |
50 | |||
51 | struct restart_block restart_block; | ||
52 | }; | 50 | }; |
53 | 51 | ||
54 | /* | 52 | /* |
@@ -62,9 +60,6 @@ struct thread_info { | |||
62 | .flags = 0, \ | 60 | .flags = 0, \ |
63 | .cpu = 0, \ | 61 | .cpu = 0, \ |
64 | .preempt_count = INIT_PREEMPT_COUNT, \ | 62 | .preempt_count = INIT_PREEMPT_COUNT, \ |
65 | .restart_block = { \ | ||
66 | .fn = do_no_restart_syscall, \ | ||
67 | }, \ | ||
68 | } | 63 | } |
69 | 64 | ||
70 | #define init_thread_info (init_thread_union.thread_info) | 65 | #define init_thread_info (init_thread_union.thread_info) |
@@ -103,7 +98,6 @@ register struct thread_info *current_thread_info_reg asm("g6"); | |||
103 | #define TI_REG_WINDOW 0x30 | 98 | #define TI_REG_WINDOW 0x30 |
104 | #define TI_RWIN_SPTRS 0x230 | 99 | #define TI_RWIN_SPTRS 0x230 |
105 | #define TI_W_SAVED 0x250 | 100 | #define TI_W_SAVED 0x250 |
106 | /* #define TI_RESTART_BLOCK 0x25n */ /* Nobody cares */ | ||
107 | 101 | ||
108 | /* | 102 | /* |
109 | * thread information flag bit numbers | 103 | * thread information flag bit numbers |
diff --git a/arch/sparc/include/asm/thread_info_64.h b/arch/sparc/include/asm/thread_info_64.h index 798f0279a4b5..ff455164732a 100644 --- a/arch/sparc/include/asm/thread_info_64.h +++ b/arch/sparc/include/asm/thread_info_64.h | |||
@@ -58,8 +58,6 @@ struct thread_info { | |||
58 | unsigned long gsr[7]; | 58 | unsigned long gsr[7]; |
59 | unsigned long xfsr[7]; | 59 | unsigned long xfsr[7]; |
60 | 60 | ||
61 | struct restart_block restart_block; | ||
62 | |||
63 | struct pt_regs *kern_una_regs; | 61 | struct pt_regs *kern_una_regs; |
64 | unsigned int kern_una_insn; | 62 | unsigned int kern_una_insn; |
65 | 63 | ||
@@ -92,10 +90,9 @@ struct thread_info { | |||
92 | #define TI_RWIN_SPTRS 0x000003c8 | 90 | #define TI_RWIN_SPTRS 0x000003c8 |
93 | #define TI_GSR 0x00000400 | 91 | #define TI_GSR 0x00000400 |
94 | #define TI_XFSR 0x00000438 | 92 | #define TI_XFSR 0x00000438 |
95 | #define TI_RESTART_BLOCK 0x00000470 | 93 | #define TI_KUNA_REGS 0x00000470 |
96 | #define TI_KUNA_REGS 0x000004a0 | 94 | #define TI_KUNA_INSN 0x00000478 |
97 | #define TI_KUNA_INSN 0x000004a8 | 95 | #define TI_FPREGS 0x00000480 |
98 | #define TI_FPREGS 0x000004c0 | ||
99 | 96 | ||
100 | /* We embed this in the uppermost byte of thread_info->flags */ | 97 | /* We embed this in the uppermost byte of thread_info->flags */ |
101 | #define FAULT_CODE_WRITE 0x01 /* Write access, implies D-TLB */ | 98 | #define FAULT_CODE_WRITE 0x01 /* Write access, implies D-TLB */ |
@@ -124,9 +121,6 @@ struct thread_info { | |||
124 | .current_ds = ASI_P, \ | 121 | .current_ds = ASI_P, \ |
125 | .exec_domain = &default_exec_domain, \ | 122 | .exec_domain = &default_exec_domain, \ |
126 | .preempt_count = INIT_PREEMPT_COUNT, \ | 123 | .preempt_count = INIT_PREEMPT_COUNT, \ |
127 | .restart_block = { \ | ||
128 | .fn = do_no_restart_syscall, \ | ||
129 | }, \ | ||
130 | } | 124 | } |
131 | 125 | ||
132 | #define init_thread_info (init_thread_union.thread_info) | 126 | #define init_thread_info (init_thread_union.thread_info) |
diff --git a/arch/sparc/include/asm/uaccess_32.h b/arch/sparc/include/asm/uaccess_32.h index 9634d086fc56..64ee103dc29d 100644 --- a/arch/sparc/include/asm/uaccess_32.h +++ b/arch/sparc/include/asm/uaccess_32.h | |||
@@ -37,7 +37,7 @@ | |||
37 | #define get_fs() (current->thread.current_ds) | 37 | #define get_fs() (current->thread.current_ds) |
38 | #define set_fs(val) ((current->thread.current_ds) = (val)) | 38 | #define set_fs(val) ((current->thread.current_ds) = (val)) |
39 | 39 | ||
40 | #define segment_eq(a,b) ((a).seg == (b).seg) | 40 | #define segment_eq(a, b) ((a).seg == (b).seg) |
41 | 41 | ||
42 | /* We have there a nice not-mapped page at PAGE_OFFSET - PAGE_SIZE, so that this test | 42 | /* We have there a nice not-mapped page at PAGE_OFFSET - PAGE_SIZE, so that this test |
43 | * can be fairly lightweight. | 43 | * can be fairly lightweight. |
@@ -46,8 +46,8 @@ | |||
46 | */ | 46 | */ |
47 | #define __user_ok(addr, size) ({ (void)(size); (addr) < STACK_TOP; }) | 47 | #define __user_ok(addr, size) ({ (void)(size); (addr) < STACK_TOP; }) |
48 | #define __kernel_ok (segment_eq(get_fs(), KERNEL_DS)) | 48 | #define __kernel_ok (segment_eq(get_fs(), KERNEL_DS)) |
49 | #define __access_ok(addr,size) (__user_ok((addr) & get_fs().seg,(size))) | 49 | #define __access_ok(addr, size) (__user_ok((addr) & get_fs().seg, (size))) |
50 | #define access_ok(type, addr, size) \ | 50 | #define access_ok(type, addr, size) \ |
51 | ({ (void)(type); __access_ok((unsigned long)(addr), size); }) | 51 | ({ (void)(type); __access_ok((unsigned long)(addr), size); }) |
52 | 52 | ||
53 | /* | 53 | /* |
@@ -91,158 +91,221 @@ void __ret_efault(void); | |||
91 | * of a performance impact. Thus we have a few rather ugly macros here, | 91 | * of a performance impact. Thus we have a few rather ugly macros here, |
92 | * and hide all the ugliness from the user. | 92 | * and hide all the ugliness from the user. |
93 | */ | 93 | */ |
94 | #define put_user(x,ptr) ({ \ | 94 | #define put_user(x, ptr) ({ \ |
95 | unsigned long __pu_addr = (unsigned long)(ptr); \ | 95 | unsigned long __pu_addr = (unsigned long)(ptr); \ |
96 | __chk_user_ptr(ptr); \ | 96 | __chk_user_ptr(ptr); \ |
97 | __put_user_check((__typeof__(*(ptr)))(x),__pu_addr,sizeof(*(ptr))); }) | 97 | __put_user_check((__typeof__(*(ptr)))(x), __pu_addr, sizeof(*(ptr))); \ |
98 | 98 | }) | |
99 | #define get_user(x,ptr) ({ \ | 99 | |
100 | unsigned long __gu_addr = (unsigned long)(ptr); \ | 100 | #define get_user(x, ptr) ({ \ |
101 | __chk_user_ptr(ptr); \ | 101 | unsigned long __gu_addr = (unsigned long)(ptr); \ |
102 | __get_user_check((x),__gu_addr,sizeof(*(ptr)),__typeof__(*(ptr))); }) | 102 | __chk_user_ptr(ptr); \ |
103 | __get_user_check((x), __gu_addr, sizeof(*(ptr)), __typeof__(*(ptr))); \ | ||
104 | }) | ||
103 | 105 | ||
104 | /* | 106 | /* |
105 | * The "__xxx" versions do not do address space checking, useful when | 107 | * The "__xxx" versions do not do address space checking, useful when |
106 | * doing multiple accesses to the same area (the user has to do the | 108 | * doing multiple accesses to the same area (the user has to do the |
107 | * checks by hand with "access_ok()") | 109 | * checks by hand with "access_ok()") |
108 | */ | 110 | */ |
109 | #define __put_user(x,ptr) __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr))) | 111 | #define __put_user(x, ptr) \ |
110 | #define __get_user(x,ptr) __get_user_nocheck((x),(ptr),sizeof(*(ptr)),__typeof__(*(ptr))) | 112 | __put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) |
113 | #define __get_user(x, ptr) \ | ||
114 | __get_user_nocheck((x), (ptr), sizeof(*(ptr)), __typeof__(*(ptr))) | ||
111 | 115 | ||
112 | struct __large_struct { unsigned long buf[100]; }; | 116 | struct __large_struct { unsigned long buf[100]; }; |
113 | #define __m(x) ((struct __large_struct __user *)(x)) | 117 | #define __m(x) ((struct __large_struct __user *)(x)) |
114 | 118 | ||
115 | #define __put_user_check(x,addr,size) ({ \ | 119 | #define __put_user_check(x, addr, size) ({ \ |
116 | register int __pu_ret; \ | 120 | register int __pu_ret; \ |
117 | if (__access_ok(addr,size)) { \ | 121 | if (__access_ok(addr, size)) { \ |
118 | switch (size) { \ | 122 | switch (size) { \ |
119 | case 1: __put_user_asm(x,b,addr,__pu_ret); break; \ | 123 | case 1: \ |
120 | case 2: __put_user_asm(x,h,addr,__pu_ret); break; \ | 124 | __put_user_asm(x, b, addr, __pu_ret); \ |
121 | case 4: __put_user_asm(x,,addr,__pu_ret); break; \ | 125 | break; \ |
122 | case 8: __put_user_asm(x,d,addr,__pu_ret); break; \ | 126 | case 2: \ |
123 | default: __pu_ret = __put_user_bad(); break; \ | 127 | __put_user_asm(x, h, addr, __pu_ret); \ |
124 | } } else { __pu_ret = -EFAULT; } __pu_ret; }) | 128 | break; \ |
125 | 129 | case 4: \ | |
126 | #define __put_user_nocheck(x,addr,size) ({ \ | 130 | __put_user_asm(x, , addr, __pu_ret); \ |
127 | register int __pu_ret; \ | 131 | break; \ |
128 | switch (size) { \ | 132 | case 8: \ |
129 | case 1: __put_user_asm(x,b,addr,__pu_ret); break; \ | 133 | __put_user_asm(x, d, addr, __pu_ret); \ |
130 | case 2: __put_user_asm(x,h,addr,__pu_ret); break; \ | 134 | break; \ |
131 | case 4: __put_user_asm(x,,addr,__pu_ret); break; \ | 135 | default: \ |
132 | case 8: __put_user_asm(x,d,addr,__pu_ret); break; \ | 136 | __pu_ret = __put_user_bad(); \ |
133 | default: __pu_ret = __put_user_bad(); break; \ | 137 | break; \ |
134 | } __pu_ret; }) | 138 | } \ |
135 | 139 | } else { \ | |
136 | #define __put_user_asm(x,size,addr,ret) \ | 140 | __pu_ret = -EFAULT; \ |
141 | } \ | ||
142 | __pu_ret; \ | ||
143 | }) | ||
144 | |||
145 | #define __put_user_nocheck(x, addr, size) ({ \ | ||
146 | register int __pu_ret; \ | ||
147 | switch (size) { \ | ||
148 | case 1: __put_user_asm(x, b, addr, __pu_ret); break; \ | ||
149 | case 2: __put_user_asm(x, h, addr, __pu_ret); break; \ | ||
150 | case 4: __put_user_asm(x, , addr, __pu_ret); break; \ | ||
151 | case 8: __put_user_asm(x, d, addr, __pu_ret); break; \ | ||
152 | default: __pu_ret = __put_user_bad(); break; \ | ||
153 | } \ | ||
154 | __pu_ret; \ | ||
155 | }) | ||
156 | |||
157 | #define __put_user_asm(x, size, addr, ret) \ | ||
137 | __asm__ __volatile__( \ | 158 | __asm__ __volatile__( \ |
138 | "/* Put user asm, inline. */\n" \ | 159 | "/* Put user asm, inline. */\n" \ |
139 | "1:\t" "st"#size " %1, %2\n\t" \ | 160 | "1:\t" "st"#size " %1, %2\n\t" \ |
140 | "clr %0\n" \ | 161 | "clr %0\n" \ |
141 | "2:\n\n\t" \ | 162 | "2:\n\n\t" \ |
142 | ".section .fixup,#alloc,#execinstr\n\t" \ | 163 | ".section .fixup,#alloc,#execinstr\n\t" \ |
143 | ".align 4\n" \ | 164 | ".align 4\n" \ |
144 | "3:\n\t" \ | 165 | "3:\n\t" \ |
145 | "b 2b\n\t" \ | 166 | "b 2b\n\t" \ |
146 | " mov %3, %0\n\t" \ | 167 | " mov %3, %0\n\t" \ |
147 | ".previous\n\n\t" \ | 168 | ".previous\n\n\t" \ |
148 | ".section __ex_table,#alloc\n\t" \ | 169 | ".section __ex_table,#alloc\n\t" \ |
149 | ".align 4\n\t" \ | 170 | ".align 4\n\t" \ |
150 | ".word 1b, 3b\n\t" \ | 171 | ".word 1b, 3b\n\t" \ |
151 | ".previous\n\n\t" \ | 172 | ".previous\n\n\t" \ |
152 | : "=&r" (ret) : "r" (x), "m" (*__m(addr)), \ | 173 | : "=&r" (ret) : "r" (x), "m" (*__m(addr)), \ |
153 | "i" (-EFAULT)) | 174 | "i" (-EFAULT)) |
154 | 175 | ||
155 | int __put_user_bad(void); | 176 | int __put_user_bad(void); |
156 | 177 | ||
157 | #define __get_user_check(x,addr,size,type) ({ \ | 178 | #define __get_user_check(x, addr, size, type) ({ \ |
158 | register int __gu_ret; \ | 179 | register int __gu_ret; \ |
159 | register unsigned long __gu_val; \ | 180 | register unsigned long __gu_val; \ |
160 | if (__access_ok(addr,size)) { \ | 181 | if (__access_ok(addr, size)) { \ |
161 | switch (size) { \ | 182 | switch (size) { \ |
162 | case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; \ | 183 | case 1: \ |
163 | case 2: __get_user_asm(__gu_val,uh,addr,__gu_ret); break; \ | 184 | __get_user_asm(__gu_val, ub, addr, __gu_ret); \ |
164 | case 4: __get_user_asm(__gu_val,,addr,__gu_ret); break; \ | 185 | break; \ |
165 | case 8: __get_user_asm(__gu_val,d,addr,__gu_ret); break; \ | 186 | case 2: \ |
166 | default: __gu_val = 0; __gu_ret = __get_user_bad(); break; \ | 187 | __get_user_asm(__gu_val, uh, addr, __gu_ret); \ |
167 | } } else { __gu_val = 0; __gu_ret = -EFAULT; } x = (type) __gu_val; __gu_ret; }) | 188 | break; \ |
168 | 189 | case 4: \ | |
169 | #define __get_user_check_ret(x,addr,size,type,retval) ({ \ | 190 | __get_user_asm(__gu_val, , addr, __gu_ret); \ |
170 | register unsigned long __gu_val __asm__ ("l1"); \ | 191 | break; \ |
171 | if (__access_ok(addr,size)) { \ | 192 | case 8: \ |
172 | switch (size) { \ | 193 | __get_user_asm(__gu_val, d, addr, __gu_ret); \ |
173 | case 1: __get_user_asm_ret(__gu_val,ub,addr,retval); break; \ | 194 | break; \ |
174 | case 2: __get_user_asm_ret(__gu_val,uh,addr,retval); break; \ | 195 | default: \ |
175 | case 4: __get_user_asm_ret(__gu_val,,addr,retval); break; \ | 196 | __gu_val = 0; \ |
176 | case 8: __get_user_asm_ret(__gu_val,d,addr,retval); break; \ | 197 | __gu_ret = __get_user_bad(); \ |
177 | default: if (__get_user_bad()) return retval; \ | 198 | break; \ |
178 | } x = (type) __gu_val; } else return retval; }) | 199 | } \ |
179 | 200 | } else { \ | |
180 | #define __get_user_nocheck(x,addr,size,type) ({ \ | 201 | __gu_val = 0; \ |
181 | register int __gu_ret; \ | 202 | __gu_ret = -EFAULT; \ |
182 | register unsigned long __gu_val; \ | 203 | } \ |
183 | switch (size) { \ | 204 | x = (__force type) __gu_val; \ |
184 | case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; \ | 205 | __gu_ret; \ |
185 | case 2: __get_user_asm(__gu_val,uh,addr,__gu_ret); break; \ | 206 | }) |
186 | case 4: __get_user_asm(__gu_val,,addr,__gu_ret); break; \ | 207 | |
187 | case 8: __get_user_asm(__gu_val,d,addr,__gu_ret); break; \ | 208 | #define __get_user_check_ret(x, addr, size, type, retval) ({ \ |
188 | default: __gu_val = 0; __gu_ret = __get_user_bad(); break; \ | 209 | register unsigned long __gu_val __asm__ ("l1"); \ |
189 | } x = (type) __gu_val; __gu_ret; }) | 210 | if (__access_ok(addr, size)) { \ |
190 | 211 | switch (size) { \ | |
191 | #define __get_user_nocheck_ret(x,addr,size,type,retval) ({ \ | 212 | case 1: \ |
192 | register unsigned long __gu_val __asm__ ("l1"); \ | 213 | __get_user_asm_ret(__gu_val, ub, addr, retval); \ |
193 | switch (size) { \ | 214 | break; \ |
194 | case 1: __get_user_asm_ret(__gu_val,ub,addr,retval); break; \ | 215 | case 2: \ |
195 | case 2: __get_user_asm_ret(__gu_val,uh,addr,retval); break; \ | 216 | __get_user_asm_ret(__gu_val, uh, addr, retval); \ |
196 | case 4: __get_user_asm_ret(__gu_val,,addr,retval); break; \ | 217 | break; \ |
197 | case 8: __get_user_asm_ret(__gu_val,d,addr,retval); break; \ | 218 | case 4: \ |
198 | default: if (__get_user_bad()) return retval; \ | 219 | __get_user_asm_ret(__gu_val, , addr, retval); \ |
199 | } x = (type) __gu_val; }) | 220 | break; \ |
200 | 221 | case 8: \ | |
201 | #define __get_user_asm(x,size,addr,ret) \ | 222 | __get_user_asm_ret(__gu_val, d, addr, retval); \ |
223 | break; \ | ||
224 | default: \ | ||
225 | if (__get_user_bad()) \ | ||
226 | return retval; \ | ||
227 | } \ | ||
228 | x = (__force type) __gu_val; \ | ||
229 | } else \ | ||
230 | return retval; \ | ||
231 | }) | ||
232 | |||
233 | #define __get_user_nocheck(x, addr, size, type) ({ \ | ||
234 | register int __gu_ret; \ | ||
235 | register unsigned long __gu_val; \ | ||
236 | switch (size) { \ | ||
237 | case 1: __get_user_asm(__gu_val, ub, addr, __gu_ret); break; \ | ||
238 | case 2: __get_user_asm(__gu_val, uh, addr, __gu_ret); break; \ | ||
239 | case 4: __get_user_asm(__gu_val, , addr, __gu_ret); break; \ | ||
240 | case 8: __get_user_asm(__gu_val, d, addr, __gu_ret); break; \ | ||
241 | default: \ | ||
242 | __gu_val = 0; \ | ||
243 | __gu_ret = __get_user_bad(); \ | ||
244 | break; \ | ||
245 | } \ | ||
246 | x = (__force type) __gu_val; \ | ||
247 | __gu_ret; \ | ||
248 | }) | ||
249 | |||
250 | #define __get_user_nocheck_ret(x, addr, size, type, retval) ({ \ | ||
251 | register unsigned long __gu_val __asm__ ("l1"); \ | ||
252 | switch (size) { \ | ||
253 | case 1: __get_user_asm_ret(__gu_val, ub, addr, retval); break; \ | ||
254 | case 2: __get_user_asm_ret(__gu_val, uh, addr, retval); break; \ | ||
255 | case 4: __get_user_asm_ret(__gu_val, , addr, retval); break; \ | ||
256 | case 8: __get_user_asm_ret(__gu_val, d, addr, retval); break; \ | ||
257 | default: \ | ||
258 | if (__get_user_bad()) \ | ||
259 | return retval; \ | ||
260 | } \ | ||
261 | x = (__force type) __gu_val; \ | ||
262 | }) | ||
263 | |||
264 | #define __get_user_asm(x, size, addr, ret) \ | ||
202 | __asm__ __volatile__( \ | 265 | __asm__ __volatile__( \ |
203 | "/* Get user asm, inline. */\n" \ | 266 | "/* Get user asm, inline. */\n" \ |
204 | "1:\t" "ld"#size " %2, %1\n\t" \ | 267 | "1:\t" "ld"#size " %2, %1\n\t" \ |
205 | "clr %0\n" \ | 268 | "clr %0\n" \ |
206 | "2:\n\n\t" \ | 269 | "2:\n\n\t" \ |
207 | ".section .fixup,#alloc,#execinstr\n\t" \ | 270 | ".section .fixup,#alloc,#execinstr\n\t" \ |
208 | ".align 4\n" \ | 271 | ".align 4\n" \ |
209 | "3:\n\t" \ | 272 | "3:\n\t" \ |
210 | "clr %1\n\t" \ | 273 | "clr %1\n\t" \ |
211 | "b 2b\n\t" \ | 274 | "b 2b\n\t" \ |
212 | " mov %3, %0\n\n\t" \ | 275 | " mov %3, %0\n\n\t" \ |
213 | ".previous\n\t" \ | 276 | ".previous\n\t" \ |
214 | ".section __ex_table,#alloc\n\t" \ | 277 | ".section __ex_table,#alloc\n\t" \ |
215 | ".align 4\n\t" \ | 278 | ".align 4\n\t" \ |
216 | ".word 1b, 3b\n\n\t" \ | 279 | ".word 1b, 3b\n\n\t" \ |
217 | ".previous\n\t" \ | 280 | ".previous\n\t" \ |
218 | : "=&r" (ret), "=&r" (x) : "m" (*__m(addr)), \ | 281 | : "=&r" (ret), "=&r" (x) : "m" (*__m(addr)), \ |
219 | "i" (-EFAULT)) | 282 | "i" (-EFAULT)) |
220 | 283 | ||
221 | #define __get_user_asm_ret(x,size,addr,retval) \ | 284 | #define __get_user_asm_ret(x, size, addr, retval) \ |
222 | if (__builtin_constant_p(retval) && retval == -EFAULT) \ | 285 | if (__builtin_constant_p(retval) && retval == -EFAULT) \ |
223 | __asm__ __volatile__( \ | 286 | __asm__ __volatile__( \ |
224 | "/* Get user asm ret, inline. */\n" \ | 287 | "/* Get user asm ret, inline. */\n" \ |
225 | "1:\t" "ld"#size " %1, %0\n\n\t" \ | 288 | "1:\t" "ld"#size " %1, %0\n\n\t" \ |
226 | ".section __ex_table,#alloc\n\t" \ | 289 | ".section __ex_table,#alloc\n\t" \ |
227 | ".align 4\n\t" \ | 290 | ".align 4\n\t" \ |
228 | ".word 1b,__ret_efault\n\n\t" \ | 291 | ".word 1b,__ret_efault\n\n\t" \ |
229 | ".previous\n\t" \ | 292 | ".previous\n\t" \ |
230 | : "=&r" (x) : "m" (*__m(addr))); \ | 293 | : "=&r" (x) : "m" (*__m(addr))); \ |
231 | else \ | 294 | else \ |
232 | __asm__ __volatile__( \ | 295 | __asm__ __volatile__( \ |
233 | "/* Get user asm ret, inline. */\n" \ | 296 | "/* Get user asm ret, inline. */\n" \ |
234 | "1:\t" "ld"#size " %1, %0\n\n\t" \ | 297 | "1:\t" "ld"#size " %1, %0\n\n\t" \ |
235 | ".section .fixup,#alloc,#execinstr\n\t" \ | 298 | ".section .fixup,#alloc,#execinstr\n\t" \ |
236 | ".align 4\n" \ | 299 | ".align 4\n" \ |
237 | "3:\n\t" \ | 300 | "3:\n\t" \ |
238 | "ret\n\t" \ | 301 | "ret\n\t" \ |
239 | " restore %%g0, %2, %%o0\n\n\t" \ | 302 | " restore %%g0, %2, %%o0\n\n\t" \ |
240 | ".previous\n\t" \ | 303 | ".previous\n\t" \ |
241 | ".section __ex_table,#alloc\n\t" \ | 304 | ".section __ex_table,#alloc\n\t" \ |
242 | ".align 4\n\t" \ | 305 | ".align 4\n\t" \ |
243 | ".word 1b, 3b\n\n\t" \ | 306 | ".word 1b, 3b\n\n\t" \ |
244 | ".previous\n\t" \ | 307 | ".previous\n\t" \ |
245 | : "=&r" (x) : "m" (*__m(addr)), "i" (retval)) | 308 | : "=&r" (x) : "m" (*__m(addr)), "i" (retval)) |
246 | 309 | ||
247 | int __get_user_bad(void); | 310 | int __get_user_bad(void); |
248 | 311 | ||
diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h index c990a5e577f0..a35194b7dba0 100644 --- a/arch/sparc/include/asm/uaccess_64.h +++ b/arch/sparc/include/asm/uaccess_64.h | |||
@@ -41,11 +41,11 @@ | |||
41 | #define get_fs() ((mm_segment_t){(current_thread_info()->current_ds)}) | 41 | #define get_fs() ((mm_segment_t){(current_thread_info()->current_ds)}) |
42 | #define get_ds() (KERNEL_DS) | 42 | #define get_ds() (KERNEL_DS) |
43 | 43 | ||
44 | #define segment_eq(a,b) ((a).seg == (b).seg) | 44 | #define segment_eq(a, b) ((a).seg == (b).seg) |
45 | 45 | ||
46 | #define set_fs(val) \ | 46 | #define set_fs(val) \ |
47 | do { \ | 47 | do { \ |
48 | current_thread_info()->current_ds =(val).seg; \ | 48 | current_thread_info()->current_ds = (val).seg; \ |
49 | __asm__ __volatile__ ("wr %%g0, %0, %%asi" : : "r" ((val).seg)); \ | 49 | __asm__ __volatile__ ("wr %%g0, %0, %%asi" : : "r" ((val).seg)); \ |
50 | } while(0) | 50 | } while(0) |
51 | 51 | ||
@@ -88,121 +88,135 @@ void __retl_efault(void); | |||
88 | * of a performance impact. Thus we have a few rather ugly macros here, | 88 | * of a performance impact. Thus we have a few rather ugly macros here, |
89 | * and hide all the ugliness from the user. | 89 | * and hide all the ugliness from the user. |
90 | */ | 90 | */ |
91 | #define put_user(x,ptr) ({ \ | 91 | #define put_user(x, ptr) ({ \ |
92 | unsigned long __pu_addr = (unsigned long)(ptr); \ | 92 | unsigned long __pu_addr = (unsigned long)(ptr); \ |
93 | __chk_user_ptr(ptr); \ | 93 | __chk_user_ptr(ptr); \ |
94 | __put_user_nocheck((__typeof__(*(ptr)))(x),__pu_addr,sizeof(*(ptr))); }) | 94 | __put_user_nocheck((__typeof__(*(ptr)))(x), __pu_addr, sizeof(*(ptr)));\ |
95 | }) | ||
95 | 96 | ||
96 | #define get_user(x,ptr) ({ \ | 97 | #define get_user(x, ptr) ({ \ |
97 | unsigned long __gu_addr = (unsigned long)(ptr); \ | 98 | unsigned long __gu_addr = (unsigned long)(ptr); \ |
98 | __chk_user_ptr(ptr); \ | 99 | __chk_user_ptr(ptr); \ |
99 | __get_user_nocheck((x),__gu_addr,sizeof(*(ptr)),__typeof__(*(ptr))); }) | 100 | __get_user_nocheck((x), __gu_addr, sizeof(*(ptr)), __typeof__(*(ptr)));\ |
101 | }) | ||
100 | 102 | ||
101 | #define __put_user(x,ptr) put_user(x,ptr) | 103 | #define __put_user(x, ptr) put_user(x, ptr) |
102 | #define __get_user(x,ptr) get_user(x,ptr) | 104 | #define __get_user(x, ptr) get_user(x, ptr) |
103 | 105 | ||
104 | struct __large_struct { unsigned long buf[100]; }; | 106 | struct __large_struct { unsigned long buf[100]; }; |
105 | #define __m(x) ((struct __large_struct *)(x)) | 107 | #define __m(x) ((struct __large_struct *)(x)) |
106 | 108 | ||
107 | #define __put_user_nocheck(data,addr,size) ({ \ | 109 | #define __put_user_nocheck(data, addr, size) ({ \ |
108 | register int __pu_ret; \ | 110 | register int __pu_ret; \ |
109 | switch (size) { \ | 111 | switch (size) { \ |
110 | case 1: __put_user_asm(data,b,addr,__pu_ret); break; \ | 112 | case 1: __put_user_asm(data, b, addr, __pu_ret); break; \ |
111 | case 2: __put_user_asm(data,h,addr,__pu_ret); break; \ | 113 | case 2: __put_user_asm(data, h, addr, __pu_ret); break; \ |
112 | case 4: __put_user_asm(data,w,addr,__pu_ret); break; \ | 114 | case 4: __put_user_asm(data, w, addr, __pu_ret); break; \ |
113 | case 8: __put_user_asm(data,x,addr,__pu_ret); break; \ | 115 | case 8: __put_user_asm(data, x, addr, __pu_ret); break; \ |
114 | default: __pu_ret = __put_user_bad(); break; \ | 116 | default: __pu_ret = __put_user_bad(); break; \ |
115 | } __pu_ret; }) | 117 | } \ |
116 | 118 | __pu_ret; \ | |
117 | #define __put_user_asm(x,size,addr,ret) \ | 119 | }) |
120 | |||
121 | #define __put_user_asm(x, size, addr, ret) \ | ||
118 | __asm__ __volatile__( \ | 122 | __asm__ __volatile__( \ |
119 | "/* Put user asm, inline. */\n" \ | 123 | "/* Put user asm, inline. */\n" \ |
120 | "1:\t" "st"#size "a %1, [%2] %%asi\n\t" \ | 124 | "1:\t" "st"#size "a %1, [%2] %%asi\n\t" \ |
121 | "clr %0\n" \ | 125 | "clr %0\n" \ |
122 | "2:\n\n\t" \ | 126 | "2:\n\n\t" \ |
123 | ".section .fixup,#alloc,#execinstr\n\t" \ | 127 | ".section .fixup,#alloc,#execinstr\n\t" \ |
124 | ".align 4\n" \ | 128 | ".align 4\n" \ |
125 | "3:\n\t" \ | 129 | "3:\n\t" \ |
126 | "sethi %%hi(2b), %0\n\t" \ | 130 | "sethi %%hi(2b), %0\n\t" \ |
127 | "jmpl %0 + %%lo(2b), %%g0\n\t" \ | 131 | "jmpl %0 + %%lo(2b), %%g0\n\t" \ |
128 | " mov %3, %0\n\n\t" \ | 132 | " mov %3, %0\n\n\t" \ |
129 | ".previous\n\t" \ | 133 | ".previous\n\t" \ |
130 | ".section __ex_table,\"a\"\n\t" \ | 134 | ".section __ex_table,\"a\"\n\t" \ |
131 | ".align 4\n\t" \ | 135 | ".align 4\n\t" \ |
132 | ".word 1b, 3b\n\t" \ | 136 | ".word 1b, 3b\n\t" \ |
133 | ".previous\n\n\t" \ | 137 | ".previous\n\n\t" \ |
134 | : "=r" (ret) : "r" (x), "r" (__m(addr)), \ | 138 | : "=r" (ret) : "r" (x), "r" (__m(addr)), \ |
135 | "i" (-EFAULT)) | 139 | "i" (-EFAULT)) |
136 | 140 | ||
137 | int __put_user_bad(void); | 141 | int __put_user_bad(void); |
138 | 142 | ||
139 | #define __get_user_nocheck(data,addr,size,type) ({ \ | 143 | #define __get_user_nocheck(data, addr, size, type) ({ \ |
140 | register int __gu_ret; \ | 144 | register int __gu_ret; \ |
141 | register unsigned long __gu_val; \ | 145 | register unsigned long __gu_val; \ |
142 | switch (size) { \ | 146 | switch (size) { \ |
143 | case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; \ | 147 | case 1: __get_user_asm(__gu_val, ub, addr, __gu_ret); break; \ |
144 | case 2: __get_user_asm(__gu_val,uh,addr,__gu_ret); break; \ | 148 | case 2: __get_user_asm(__gu_val, uh, addr, __gu_ret); break; \ |
145 | case 4: __get_user_asm(__gu_val,uw,addr,__gu_ret); break; \ | 149 | case 4: __get_user_asm(__gu_val, uw, addr, __gu_ret); break; \ |
146 | case 8: __get_user_asm(__gu_val,x,addr,__gu_ret); break; \ | 150 | case 8: __get_user_asm(__gu_val, x, addr, __gu_ret); break; \ |
147 | default: __gu_val = 0; __gu_ret = __get_user_bad(); break; \ | 151 | default: \ |
148 | } data = (type) __gu_val; __gu_ret; }) | 152 | __gu_val = 0; \ |
149 | 153 | __gu_ret = __get_user_bad(); \ | |
150 | #define __get_user_nocheck_ret(data,addr,size,type,retval) ({ \ | 154 | break; \ |
151 | register unsigned long __gu_val __asm__ ("l1"); \ | 155 | } \ |
152 | switch (size) { \ | 156 | data = (__force type) __gu_val; \ |
153 | case 1: __get_user_asm_ret(__gu_val,ub,addr,retval); break; \ | 157 | __gu_ret; \ |
154 | case 2: __get_user_asm_ret(__gu_val,uh,addr,retval); break; \ | 158 | }) |
155 | case 4: __get_user_asm_ret(__gu_val,uw,addr,retval); break; \ | 159 | |
156 | case 8: __get_user_asm_ret(__gu_val,x,addr,retval); break; \ | 160 | #define __get_user_nocheck_ret(data, addr, size, type, retval) ({ \ |
157 | default: if (__get_user_bad()) return retval; \ | 161 | register unsigned long __gu_val __asm__ ("l1"); \ |
158 | } data = (type) __gu_val; }) | 162 | switch (size) { \ |
159 | 163 | case 1: __get_user_asm_ret(__gu_val, ub, addr, retval); break; \ | |
160 | #define __get_user_asm(x,size,addr,ret) \ | 164 | case 2: __get_user_asm_ret(__gu_val, uh, addr, retval); break; \ |
165 | case 4: __get_user_asm_ret(__gu_val, uw, addr, retval); break; \ | ||
166 | case 8: __get_user_asm_ret(__gu_val, x, addr, retval); break; \ | ||
167 | default: \ | ||
168 | if (__get_user_bad()) \ | ||
169 | return retval; \ | ||
170 | } \ | ||
171 | data = (__force type) __gu_val; \ | ||
172 | }) | ||
173 | |||
174 | #define __get_user_asm(x, size, addr, ret) \ | ||
161 | __asm__ __volatile__( \ | 175 | __asm__ __volatile__( \ |
162 | "/* Get user asm, inline. */\n" \ | 176 | "/* Get user asm, inline. */\n" \ |
163 | "1:\t" "ld"#size "a [%2] %%asi, %1\n\t" \ | 177 | "1:\t" "ld"#size "a [%2] %%asi, %1\n\t" \ |
164 | "clr %0\n" \ | 178 | "clr %0\n" \ |
165 | "2:\n\n\t" \ | 179 | "2:\n\n\t" \ |
166 | ".section .fixup,#alloc,#execinstr\n\t" \ | 180 | ".section .fixup,#alloc,#execinstr\n\t" \ |
167 | ".align 4\n" \ | 181 | ".align 4\n" \ |
168 | "3:\n\t" \ | 182 | "3:\n\t" \ |
169 | "sethi %%hi(2b), %0\n\t" \ | 183 | "sethi %%hi(2b), %0\n\t" \ |
170 | "clr %1\n\t" \ | 184 | "clr %1\n\t" \ |
171 | "jmpl %0 + %%lo(2b), %%g0\n\t" \ | 185 | "jmpl %0 + %%lo(2b), %%g0\n\t" \ |
172 | " mov %3, %0\n\n\t" \ | 186 | " mov %3, %0\n\n\t" \ |
173 | ".previous\n\t" \ | 187 | ".previous\n\t" \ |
174 | ".section __ex_table,\"a\"\n\t" \ | 188 | ".section __ex_table,\"a\"\n\t" \ |
175 | ".align 4\n\t" \ | 189 | ".align 4\n\t" \ |
176 | ".word 1b, 3b\n\n\t" \ | 190 | ".word 1b, 3b\n\n\t" \ |
177 | ".previous\n\t" \ | 191 | ".previous\n\t" \ |
178 | : "=r" (ret), "=r" (x) : "r" (__m(addr)), \ | 192 | : "=r" (ret), "=r" (x) : "r" (__m(addr)), \ |
179 | "i" (-EFAULT)) | 193 | "i" (-EFAULT)) |
180 | 194 | ||
181 | #define __get_user_asm_ret(x,size,addr,retval) \ | 195 | #define __get_user_asm_ret(x, size, addr, retval) \ |
182 | if (__builtin_constant_p(retval) && retval == -EFAULT) \ | 196 | if (__builtin_constant_p(retval) && retval == -EFAULT) \ |
183 | __asm__ __volatile__( \ | 197 | __asm__ __volatile__( \ |
184 | "/* Get user asm ret, inline. */\n" \ | 198 | "/* Get user asm ret, inline. */\n" \ |
185 | "1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \ | 199 | "1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \ |
186 | ".section __ex_table,\"a\"\n\t" \ | 200 | ".section __ex_table,\"a\"\n\t" \ |
187 | ".align 4\n\t" \ | 201 | ".align 4\n\t" \ |
188 | ".word 1b,__ret_efault\n\n\t" \ | 202 | ".word 1b,__ret_efault\n\n\t" \ |
189 | ".previous\n\t" \ | 203 | ".previous\n\t" \ |
190 | : "=r" (x) : "r" (__m(addr))); \ | 204 | : "=r" (x) : "r" (__m(addr))); \ |
191 | else \ | 205 | else \ |
192 | __asm__ __volatile__( \ | 206 | __asm__ __volatile__( \ |
193 | "/* Get user asm ret, inline. */\n" \ | 207 | "/* Get user asm ret, inline. */\n" \ |
194 | "1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \ | 208 | "1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \ |
195 | ".section .fixup,#alloc,#execinstr\n\t" \ | 209 | ".section .fixup,#alloc,#execinstr\n\t" \ |
196 | ".align 4\n" \ | 210 | ".align 4\n" \ |
197 | "3:\n\t" \ | 211 | "3:\n\t" \ |
198 | "ret\n\t" \ | 212 | "ret\n\t" \ |
199 | " restore %%g0, %2, %%o0\n\n\t" \ | 213 | " restore %%g0, %2, %%o0\n\n\t" \ |
200 | ".previous\n\t" \ | 214 | ".previous\n\t" \ |
201 | ".section __ex_table,\"a\"\n\t" \ | 215 | ".section __ex_table,\"a\"\n\t" \ |
202 | ".align 4\n\t" \ | 216 | ".align 4\n\t" \ |
203 | ".word 1b, 3b\n\n\t" \ | 217 | ".word 1b, 3b\n\n\t" \ |
204 | ".previous\n\t" \ | 218 | ".previous\n\t" \ |
205 | : "=r" (x) : "r" (__m(addr)), "i" (retval)) | 219 | : "=r" (x) : "r" (__m(addr)), "i" (retval)) |
206 | 220 | ||
207 | int __get_user_bad(void); | 221 | int __get_user_bad(void); |
208 | 222 | ||
diff --git a/arch/sparc/kernel/entry.h b/arch/sparc/kernel/entry.h index 88d322b67fac..07cc49e541f4 100644 --- a/arch/sparc/kernel/entry.h +++ b/arch/sparc/kernel/entry.h | |||
@@ -98,11 +98,7 @@ void sun4v_do_mna(struct pt_regs *regs, | |||
98 | void do_privop(struct pt_regs *regs); | 98 | void do_privop(struct pt_regs *regs); |
99 | void do_privact(struct pt_regs *regs); | 99 | void do_privact(struct pt_regs *regs); |
100 | void do_cee(struct pt_regs *regs); | 100 | void do_cee(struct pt_regs *regs); |
101 | void do_cee_tl1(struct pt_regs *regs); | ||
102 | void do_dae_tl1(struct pt_regs *regs); | ||
103 | void do_iae_tl1(struct pt_regs *regs); | ||
104 | void do_div0_tl1(struct pt_regs *regs); | 101 | void do_div0_tl1(struct pt_regs *regs); |
105 | void do_fpdis_tl1(struct pt_regs *regs); | ||
106 | void do_fpieee_tl1(struct pt_regs *regs); | 102 | void do_fpieee_tl1(struct pt_regs *regs); |
107 | void do_fpother_tl1(struct pt_regs *regs); | 103 | void do_fpother_tl1(struct pt_regs *regs); |
108 | void do_ill_tl1(struct pt_regs *regs); | 104 | void do_ill_tl1(struct pt_regs *regs); |
diff --git a/arch/sparc/kernel/module.c b/arch/sparc/kernel/module.c index 97655e0fd243..192a617a32f3 100644 --- a/arch/sparc/kernel/module.c +++ b/arch/sparc/kernel/module.c | |||
@@ -29,7 +29,7 @@ static void *module_map(unsigned long size) | |||
29 | if (PAGE_ALIGN(size) > MODULES_LEN) | 29 | if (PAGE_ALIGN(size) > MODULES_LEN) |
30 | return NULL; | 30 | return NULL; |
31 | return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, | 31 | return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, |
32 | GFP_KERNEL, PAGE_KERNEL, NUMA_NO_NODE, | 32 | GFP_KERNEL, PAGE_KERNEL, 0, NUMA_NO_NODE, |
33 | __builtin_return_address(0)); | 33 | __builtin_return_address(0)); |
34 | } | 34 | } |
35 | #else | 35 | #else |
diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c index 62deba7be1a9..4eed773a7735 100644 --- a/arch/sparc/kernel/signal32.c +++ b/arch/sparc/kernel/signal32.c | |||
@@ -150,7 +150,7 @@ void do_sigreturn32(struct pt_regs *regs) | |||
150 | int err, i; | 150 | int err, i; |
151 | 151 | ||
152 | /* Always make any pending restarted system calls return -EINTR */ | 152 | /* Always make any pending restarted system calls return -EINTR */ |
153 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 153 | current->restart_block.fn = do_no_restart_syscall; |
154 | 154 | ||
155 | synchronize_user_stack(); | 155 | synchronize_user_stack(); |
156 | 156 | ||
@@ -235,7 +235,7 @@ asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) | |||
235 | int err, i; | 235 | int err, i; |
236 | 236 | ||
237 | /* Always make any pending restarted system calls return -EINTR */ | 237 | /* Always make any pending restarted system calls return -EINTR */ |
238 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 238 | current->restart_block.fn = do_no_restart_syscall; |
239 | 239 | ||
240 | synchronize_user_stack(); | 240 | synchronize_user_stack(); |
241 | regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; | 241 | regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; |
diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c index 9ee72fc8e0e4..52aa5e4ce5e7 100644 --- a/arch/sparc/kernel/signal_32.c +++ b/arch/sparc/kernel/signal_32.c | |||
@@ -70,7 +70,7 @@ asmlinkage void do_sigreturn(struct pt_regs *regs) | |||
70 | int err; | 70 | int err; |
71 | 71 | ||
72 | /* Always make any pending restarted system calls return -EINTR */ | 72 | /* Always make any pending restarted system calls return -EINTR */ |
73 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 73 | current->restart_block.fn = do_no_restart_syscall; |
74 | 74 | ||
75 | synchronize_user_stack(); | 75 | synchronize_user_stack(); |
76 | 76 | ||
diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 1a6999868031..d88beff47bab 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c | |||
@@ -254,7 +254,7 @@ void do_rt_sigreturn(struct pt_regs *regs) | |||
254 | int err; | 254 | int err; |
255 | 255 | ||
256 | /* Always make any pending restarted system calls return -EINTR */ | 256 | /* Always make any pending restarted system calls return -EINTR */ |
257 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 257 | current->restart_block.fn = do_no_restart_syscall; |
258 | 258 | ||
259 | synchronize_user_stack (); | 259 | synchronize_user_stack (); |
260 | sf = (struct rt_signal_frame __user *) | 260 | sf = (struct rt_signal_frame __user *) |
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index da6f1a7fc4db..61139d9924ca 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c | |||
@@ -1406,11 +1406,32 @@ void __irq_entry smp_receive_signal_client(int irq, struct pt_regs *regs) | |||
1406 | scheduler_ipi(); | 1406 | scheduler_ipi(); |
1407 | } | 1407 | } |
1408 | 1408 | ||
1409 | /* This is a nop because we capture all other cpus | 1409 | static void stop_this_cpu(void *dummy) |
1410 | * anyways when making the PROM active. | 1410 | { |
1411 | */ | 1411 | prom_stopself(); |
1412 | } | ||
1413 | |||
1412 | void smp_send_stop(void) | 1414 | void smp_send_stop(void) |
1413 | { | 1415 | { |
1416 | int cpu; | ||
1417 | |||
1418 | if (tlb_type == hypervisor) { | ||
1419 | for_each_online_cpu(cpu) { | ||
1420 | if (cpu == smp_processor_id()) | ||
1421 | continue; | ||
1422 | #ifdef CONFIG_SUN_LDOMS | ||
1423 | if (ldom_domaining_enabled) { | ||
1424 | unsigned long hv_err; | ||
1425 | hv_err = sun4v_cpu_stop(cpu); | ||
1426 | if (hv_err) | ||
1427 | printk(KERN_ERR "sun4v_cpu_stop() " | ||
1428 | "failed err=%lu\n", hv_err); | ||
1429 | } else | ||
1430 | #endif | ||
1431 | prom_stopcpu_cpuid(cpu); | ||
1432 | } | ||
1433 | } else | ||
1434 | smp_call_function(stop_this_cpu, NULL, 0); | ||
1414 | } | 1435 | } |
1415 | 1436 | ||
1416 | /** | 1437 | /** |
diff --git a/arch/sparc/kernel/starfire.c b/arch/sparc/kernel/starfire.c index 82281a566bb8..167fdfd9c837 100644 --- a/arch/sparc/kernel/starfire.c +++ b/arch/sparc/kernel/starfire.c | |||
@@ -28,11 +28,6 @@ void check_if_starfire(void) | |||
28 | this_is_starfire = 1; | 28 | this_is_starfire = 1; |
29 | } | 29 | } |
30 | 30 | ||
31 | int starfire_hard_smp_processor_id(void) | ||
32 | { | ||
33 | return upa_readl(0x1fff40000d0UL); | ||
34 | } | ||
35 | |||
36 | /* | 31 | /* |
37 | * Each Starfire board has 32 registers which perform translation | 32 | * Each Starfire board has 32 registers which perform translation |
38 | * and delivery of traditional interrupt packets into the extended | 33 | * and delivery of traditional interrupt packets into the extended |
diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index c85403d0496c..30e7ddb27a3a 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c | |||
@@ -333,7 +333,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second | |||
333 | long err; | 333 | long err; |
334 | 334 | ||
335 | /* No need for backward compatibility. We can start fresh... */ | 335 | /* No need for backward compatibility. We can start fresh... */ |
336 | if (call <= SEMCTL) { | 336 | if (call <= SEMTIMEDOP) { |
337 | switch (call) { | 337 | switch (call) { |
338 | case SEMOP: | 338 | case SEMOP: |
339 | err = sys_semtimedop(first, ptr, | 339 | err = sys_semtimedop(first, ptr, |
diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c index 981a769b9558..0e699745d643 100644 --- a/arch/sparc/kernel/traps_64.c +++ b/arch/sparc/kernel/traps_64.c | |||
@@ -2427,6 +2427,8 @@ void __noreturn die_if_kernel(char *str, struct pt_regs *regs) | |||
2427 | } | 2427 | } |
2428 | user_instruction_dump ((unsigned int __user *) regs->tpc); | 2428 | user_instruction_dump ((unsigned int __user *) regs->tpc); |
2429 | } | 2429 | } |
2430 | if (panic_on_oops) | ||
2431 | panic("Fatal exception"); | ||
2430 | if (regs->tstate & TSTATE_PRIV) | 2432 | if (regs->tstate & TSTATE_PRIV) |
2431 | do_exit(SIGKILL); | 2433 | do_exit(SIGKILL); |
2432 | do_exit(SIGSEGV); | 2434 | do_exit(SIGSEGV); |
@@ -2564,27 +2566,6 @@ void do_cee(struct pt_regs *regs) | |||
2564 | die_if_kernel("TL0: Cache Error Exception", regs); | 2566 | die_if_kernel("TL0: Cache Error Exception", regs); |
2565 | } | 2567 | } |
2566 | 2568 | ||
2567 | void do_cee_tl1(struct pt_regs *regs) | ||
2568 | { | ||
2569 | exception_enter(); | ||
2570 | dump_tl1_traplog((struct tl1_traplog *)(regs + 1)); | ||
2571 | die_if_kernel("TL1: Cache Error Exception", regs); | ||
2572 | } | ||
2573 | |||
2574 | void do_dae_tl1(struct pt_regs *regs) | ||
2575 | { | ||
2576 | exception_enter(); | ||
2577 | dump_tl1_traplog((struct tl1_traplog *)(regs + 1)); | ||
2578 | die_if_kernel("TL1: Data Access Exception", regs); | ||
2579 | } | ||
2580 | |||
2581 | void do_iae_tl1(struct pt_regs *regs) | ||
2582 | { | ||
2583 | exception_enter(); | ||
2584 | dump_tl1_traplog((struct tl1_traplog *)(regs + 1)); | ||
2585 | die_if_kernel("TL1: Instruction Access Exception", regs); | ||
2586 | } | ||
2587 | |||
2588 | void do_div0_tl1(struct pt_regs *regs) | 2569 | void do_div0_tl1(struct pt_regs *regs) |
2589 | { | 2570 | { |
2590 | exception_enter(); | 2571 | exception_enter(); |
@@ -2592,13 +2573,6 @@ void do_div0_tl1(struct pt_regs *regs) | |||
2592 | die_if_kernel("TL1: DIV0 Exception", regs); | 2573 | die_if_kernel("TL1: DIV0 Exception", regs); |
2593 | } | 2574 | } |
2594 | 2575 | ||
2595 | void do_fpdis_tl1(struct pt_regs *regs) | ||
2596 | { | ||
2597 | exception_enter(); | ||
2598 | dump_tl1_traplog((struct tl1_traplog *)(regs + 1)); | ||
2599 | die_if_kernel("TL1: FPU Disabled", regs); | ||
2600 | } | ||
2601 | |||
2602 | void do_fpieee_tl1(struct pt_regs *regs) | 2576 | void do_fpieee_tl1(struct pt_regs *regs) |
2603 | { | 2577 | { |
2604 | exception_enter(); | 2578 | exception_enter(); |
@@ -2730,8 +2704,6 @@ void __init trap_init(void) | |||
2730 | TI_NEW_CHILD != offsetof(struct thread_info, new_child) || | 2704 | TI_NEW_CHILD != offsetof(struct thread_info, new_child) || |
2731 | TI_CURRENT_DS != offsetof(struct thread_info, | 2705 | TI_CURRENT_DS != offsetof(struct thread_info, |
2732 | current_ds) || | 2706 | current_ds) || |
2733 | TI_RESTART_BLOCK != offsetof(struct thread_info, | ||
2734 | restart_block) || | ||
2735 | TI_KUNA_REGS != offsetof(struct thread_info, | 2707 | TI_KUNA_REGS != offsetof(struct thread_info, |
2736 | kern_una_regs) || | 2708 | kern_una_regs) || |
2737 | TI_KUNA_INSN != offsetof(struct thread_info, | 2709 | TI_KUNA_INSN != offsetof(struct thread_info, |
diff --git a/arch/sparc/mm/gup.c b/arch/sparc/mm/gup.c index ae6ce383d4df..2e5c4fc2daa9 100644 --- a/arch/sparc/mm/gup.c +++ b/arch/sparc/mm/gup.c | |||
@@ -249,10 +249,8 @@ slow: | |||
249 | start += nr << PAGE_SHIFT; | 249 | start += nr << PAGE_SHIFT; |
250 | pages += nr; | 250 | pages += nr; |
251 | 251 | ||
252 | down_read(&mm->mmap_sem); | 252 | ret = get_user_pages_unlocked(current, mm, start, |
253 | ret = get_user_pages(current, mm, start, | 253 | (end - start) >> PAGE_SHIFT, write, 0, pages); |
254 | (end - start) >> PAGE_SHIFT, write, 0, pages, NULL); | ||
255 | up_read(&mm->mmap_sem); | ||
256 | 254 | ||
257 | /* Have to be a bit careful with return values */ | 255 | /* Have to be a bit careful with return values */ |
258 | if (nr > 0) { | 256 | if (nr > 0) { |
diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c index d329537739c6..4242eab12e10 100644 --- a/arch/sparc/mm/hugetlbpage.c +++ b/arch/sparc/mm/hugetlbpage.c | |||
@@ -215,12 +215,6 @@ pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, | |||
215 | return entry; | 215 | return entry; |
216 | } | 216 | } |
217 | 217 | ||
218 | struct page *follow_huge_addr(struct mm_struct *mm, | ||
219 | unsigned long address, int write) | ||
220 | { | ||
221 | return ERR_PTR(-EINVAL); | ||
222 | } | ||
223 | |||
224 | int pmd_huge(pmd_t pmd) | 218 | int pmd_huge(pmd_t pmd) |
225 | { | 219 | { |
226 | return 0; | 220 | return 0; |
@@ -230,9 +224,3 @@ int pud_huge(pud_t pud) | |||
230 | { | 224 | { |
231 | return 0; | 225 | return 0; |
232 | } | 226 | } |
233 | |||
234 | struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, | ||
235 | pmd_t *pmd, int write) | ||
236 | { | ||
237 | return NULL; | ||
238 | } | ||
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index 3ea267c53320..4ca0d6ba5ec8 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c | |||
@@ -2820,7 +2820,7 @@ static int __init report_memory(void) | |||
2820 | 2820 | ||
2821 | return 0; | 2821 | return 0; |
2822 | } | 2822 | } |
2823 | device_initcall(report_memory); | 2823 | arch_initcall(report_memory); |
2824 | 2824 | ||
2825 | #ifdef CONFIG_SMP | 2825 | #ifdef CONFIG_SMP |
2826 | #define do_flush_tlb_kernel_range smp_flush_tlb_kernel_range | 2826 | #define do_flush_tlb_kernel_range smp_flush_tlb_kernel_range |