aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc')
-rw-r--r--arch/sparc/Kconfig3
-rw-r--r--arch/sparc/crypto/aes_glue.c2
-rw-r--r--arch/sparc/crypto/camellia_glue.c2
-rw-r--r--arch/sparc/crypto/des_glue.c1
-rw-r--r--arch/sparc/crypto/md5_glue.c2
-rw-r--r--arch/sparc/include/asm/io_64.h20
-rw-r--r--arch/sparc/include/asm/pgtable_32.h29
-rw-r--r--arch/sparc/include/asm/pgtable_64.h42
-rw-r--r--arch/sparc/include/asm/pgtsrmmu.h14
-rw-r--r--arch/sparc/include/asm/starfire.h1
-rw-r--r--arch/sparc/include/asm/thread_info_32.h6
-rw-r--r--arch/sparc/include/asm/thread_info_64.h12
-rw-r--r--arch/sparc/include/asm/uaccess_32.h339
-rw-r--r--arch/sparc/include/asm/uaccess_64.h222
-rw-r--r--arch/sparc/kernel/entry.h4
-rw-r--r--arch/sparc/kernel/module.c2
-rw-r--r--arch/sparc/kernel/signal32.c4
-rw-r--r--arch/sparc/kernel/signal_32.c2
-rw-r--r--arch/sparc/kernel/signal_64.c2
-rw-r--r--arch/sparc/kernel/smp_64.c27
-rw-r--r--arch/sparc/kernel/starfire.c5
-rw-r--r--arch/sparc/kernel/sys_sparc_64.c2
-rw-r--r--arch/sparc/kernel/traps_64.c32
-rw-r--r--arch/sparc/mm/gup.c6
-rw-r--r--arch/sparc/mm/hugetlbpage.c12
-rw-r--r--arch/sparc/mm/init_64.c2
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
89config ARCH_PROC_KCORE_TEXT
90 def_bool y
91
89config IOMMU_HELPER 92config 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);
497module_exit(aes_sparc64_mod_fini); 497module_exit(aes_sparc64_mod_fini);
498 498
499MODULE_LICENSE("GPL"); 499MODULE_LICENSE("GPL");
500MODULE_DESCRIPTION("AES Secure Hash Algorithm, sparc64 aes opcode accelerated"); 500MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm, sparc64 aes opcode accelerated");
501 501
502MODULE_ALIAS_CRYPTO("aes"); 502MODULE_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);
322MODULE_LICENSE("GPL"); 322MODULE_LICENSE("GPL");
323MODULE_DESCRIPTION("Camellia Cipher Algorithm, sparc64 camellia opcode accelerated"); 323MODULE_DESCRIPTION("Camellia Cipher Algorithm, sparc64 camellia opcode accelerated");
324 324
325MODULE_ALIAS_CRYPTO("aes"); 325MODULE_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");
533MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms, sparc64 des opcode accelerated"); 533MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms, sparc64 des opcode accelerated");
534 534
535MODULE_ALIAS_CRYPTO("des"); 535MODULE_ALIAS_CRYPTO("des");
536MODULE_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);
183module_exit(md5_sparc64_mod_fini); 183module_exit(md5_sparc64_mod_fini);
184 184
185MODULE_LICENSE("GPL"); 185MODULE_LICENSE("GPL");
186MODULE_DESCRIPTION("MD5 Secure Hash Algorithm, sparc64 md5 opcode accelerated"); 186MODULE_DESCRIPTION("MD5 Message Digest Algorithm, sparc64 md5 opcode accelerated");
187 187
188MODULE_ALIAS_CRYPTO("md5"); 188MODULE_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 */
422void __iomem *ioport_map(unsigned long port, unsigned int nr); 422void __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 */
103static inline unsigned long srmmu_swap(unsigned long *addr, unsigned long value) 103static 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 */
227static inline int pte_file(pte_t pte)
228{
229 return pte_val(pte) & SRMMU_FILE;
230}
231
232static inline int pte_special(pte_t pte) 225static 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 */
379static inline unsigned long pte_to_pgoff(pte_t pte)
380{
381 return pte_val(pte) >> SRMMU_PTE_FILE_SHIFT;
382}
383
384static 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
394static inline unsigned long 371static 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
335static 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
351static inline pgprot_t pgprot_noncached(pgprot_t prot) 333static 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
612static 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
628static inline unsigned long pte_present(pte_t pte) 594static 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. */
975unsigned long pte_file(pte_t);
976#define pte_to_pgoff(pte) (pte_val(pte) >> PAGE_SHIFT)
977pte_t pgoff_to_pte(unsigned long);
978#define PTE_FILE_MAX_BITS (64UL - PAGE_SHIFT - 1UL)
979
980int page_in_phys_avail(unsigned long paddr); 940int 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 @@
12extern int this_is_starfire; 12extern int this_is_starfire;
13 13
14void check_if_starfire(void); 14void check_if_starfire(void);
15int starfire_hard_smp_processor_id(void);
16void starfire_hookup(int); 15void starfire_hookup(int);
17unsigned int starfire_translate(unsigned long imap, unsigned int upaid); 16unsigned 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) ({ \
95unsigned 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
100unsigned 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
112struct __large_struct { unsigned long buf[100]; }; 116struct __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) ({ \
116register int __pu_ret; \ 120 register int __pu_ret; \
117if (__access_ok(addr,size)) { \ 121 if (__access_ok(addr, size)) { \
118switch (size) { \ 122 switch (size) { \
119case 1: __put_user_asm(x,b,addr,__pu_ret); break; \ 123 case 1: \
120case 2: __put_user_asm(x,h,addr,__pu_ret); break; \ 124 __put_user_asm(x, b, addr, __pu_ret); \
121case 4: __put_user_asm(x,,addr,__pu_ret); break; \ 125 break; \
122case 8: __put_user_asm(x,d,addr,__pu_ret); break; \ 126 case 2: \
123default: __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); \
127register int __pu_ret; \ 131 break; \
128switch (size) { \ 132 case 8: \
129case 1: __put_user_asm(x,b,addr,__pu_ret); break; \ 133 __put_user_asm(x, d, addr, __pu_ret); \
130case 2: __put_user_asm(x,h,addr,__pu_ret); break; \ 134 break; \
131case 4: __put_user_asm(x,,addr,__pu_ret); break; \ 135 default: \
132case 8: __put_user_asm(x,d,addr,__pu_ret); break; \ 136 __pu_ret = __put_user_bad(); \
133default: __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
155int __put_user_bad(void); 176int __put_user_bad(void);
156 177
157#define __get_user_check(x,addr,size,type) ({ \ 178#define __get_user_check(x, addr, size, type) ({ \
158register int __gu_ret; \ 179 register int __gu_ret; \
159register unsigned long __gu_val; \ 180 register unsigned long __gu_val; \
160if (__access_ok(addr,size)) { \ 181 if (__access_ok(addr, size)) { \
161switch (size) { \ 182 switch (size) { \
162case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; \ 183 case 1: \
163case 2: __get_user_asm(__gu_val,uh,addr,__gu_ret); break; \ 184 __get_user_asm(__gu_val, ub, addr, __gu_ret); \
164case 4: __get_user_asm(__gu_val,,addr,__gu_ret); break; \ 185 break; \
165case 8: __get_user_asm(__gu_val,d,addr,__gu_ret); break; \ 186 case 2: \
166default: __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); \
170register unsigned long __gu_val __asm__ ("l1"); \ 191 break; \
171if (__access_ok(addr,size)) { \ 192 case 8: \
172switch (size) { \ 193 __get_user_asm(__gu_val, d, addr, __gu_ret); \
173case 1: __get_user_asm_ret(__gu_val,ub,addr,retval); break; \ 194 break; \
174case 2: __get_user_asm_ret(__gu_val,uh,addr,retval); break; \ 195 default: \
175case 4: __get_user_asm_ret(__gu_val,,addr,retval); break; \ 196 __gu_val = 0; \
176case 8: __get_user_asm_ret(__gu_val,d,addr,retval); break; \ 197 __gu_ret = __get_user_bad(); \
177default: 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; \
181register int __gu_ret; \ 202 __gu_ret = -EFAULT; \
182register unsigned long __gu_val; \ 203 } \
183switch (size) { \ 204 x = (__force type) __gu_val; \
184case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; \ 205 __gu_ret; \
185case 2: __get_user_asm(__gu_val,uh,addr,__gu_ret); break; \ 206})
186case 4: __get_user_asm(__gu_val,,addr,__gu_ret); break; \ 207
187case 8: __get_user_asm(__gu_val,d,addr,__gu_ret); break; \ 208#define __get_user_check_ret(x, addr, size, type, retval) ({ \
188default: __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: \
192register unsigned long __gu_val __asm__ ("l1"); \ 213 __get_user_asm_ret(__gu_val, ub, addr, retval); \
193switch (size) { \ 214 break; \
194case 1: __get_user_asm_ret(__gu_val,ub,addr,retval); break; \ 215 case 2: \
195case 2: __get_user_asm_ret(__gu_val,uh,addr,retval); break; \ 216 __get_user_asm_ret(__gu_val, uh, addr, retval); \
196case 4: __get_user_asm_ret(__gu_val,,addr,retval); break; \ 217 break; \
197case 8: __get_user_asm_ret(__gu_val,d,addr,retval); break; \ 218 case 4: \
198default: 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) \
222if (__builtin_constant_p(retval) && retval == -EFAULT) \ 285if (__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))); \
231else \ 294else \
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
247int __get_user_bad(void); 310int __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) \
47do { \ 47do { \
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) ({ \
92unsigned 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) ({ \
97unsigned 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
104struct __large_struct { unsigned long buf[100]; }; 106struct __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) ({ \
108register int __pu_ret; \ 110 register int __pu_ret; \
109switch (size) { \ 111 switch (size) { \
110case 1: __put_user_asm(data,b,addr,__pu_ret); break; \ 112 case 1: __put_user_asm(data, b, addr, __pu_ret); break; \
111case 2: __put_user_asm(data,h,addr,__pu_ret); break; \ 113 case 2: __put_user_asm(data, h, addr, __pu_ret); break; \
112case 4: __put_user_asm(data,w,addr,__pu_ret); break; \ 114 case 4: __put_user_asm(data, w, addr, __pu_ret); break; \
113case 8: __put_user_asm(data,x,addr,__pu_ret); break; \ 115 case 8: __put_user_asm(data, x, addr, __pu_ret); break; \
114default: __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
137int __put_user_bad(void); 141int __put_user_bad(void);
138 142
139#define __get_user_nocheck(data,addr,size,type) ({ \ 143#define __get_user_nocheck(data, addr, size, type) ({ \
140register int __gu_ret; \ 144 register int __gu_ret; \
141register unsigned long __gu_val; \ 145 register unsigned long __gu_val; \
142switch (size) { \ 146 switch (size) { \
143case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; \ 147 case 1: __get_user_asm(__gu_val, ub, addr, __gu_ret); break; \
144case 2: __get_user_asm(__gu_val,uh,addr,__gu_ret); break; \ 148 case 2: __get_user_asm(__gu_val, uh, addr, __gu_ret); break; \
145case 4: __get_user_asm(__gu_val,uw,addr,__gu_ret); break; \ 149 case 4: __get_user_asm(__gu_val, uw, addr, __gu_ret); break; \
146case 8: __get_user_asm(__gu_val,x,addr,__gu_ret); break; \ 150 case 8: __get_user_asm(__gu_val, x, addr, __gu_ret); break; \
147default: __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; \
151register unsigned long __gu_val __asm__ ("l1"); \ 155 } \
152switch (size) { \ 156 data = (__force type) __gu_val; \
153case 1: __get_user_asm_ret(__gu_val,ub,addr,retval); break; \ 157 __gu_ret; \
154case 2: __get_user_asm_ret(__gu_val,uh,addr,retval); break; \ 158})
155case 4: __get_user_asm_ret(__gu_val,uw,addr,retval); break; \ 159
156case 8: __get_user_asm_ret(__gu_val,x,addr,retval); break; \ 160#define __get_user_nocheck_ret(data, addr, size, type, retval) ({ \
157default: 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) \
182if (__builtin_constant_p(retval) && retval == -EFAULT) \ 196if (__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))); \
191else \ 205else \
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
207int __get_user_bad(void); 221int __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,
98void do_privop(struct pt_regs *regs); 98void do_privop(struct pt_regs *regs);
99void do_privact(struct pt_regs *regs); 99void do_privact(struct pt_regs *regs);
100void do_cee(struct pt_regs *regs); 100void do_cee(struct pt_regs *regs);
101void do_cee_tl1(struct pt_regs *regs);
102void do_dae_tl1(struct pt_regs *regs);
103void do_iae_tl1(struct pt_regs *regs);
104void do_div0_tl1(struct pt_regs *regs); 101void do_div0_tl1(struct pt_regs *regs);
105void do_fpdis_tl1(struct pt_regs *regs);
106void do_fpieee_tl1(struct pt_regs *regs); 102void do_fpieee_tl1(struct pt_regs *regs);
107void do_fpother_tl1(struct pt_regs *regs); 103void do_fpother_tl1(struct pt_regs *regs);
108void do_ill_tl1(struct pt_regs *regs); 104void 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 1409static void stop_this_cpu(void *dummy)
1410 * anyways when making the PROM active. 1410{
1411 */ 1411 prom_stopself();
1412}
1413
1412void smp_send_stop(void) 1414void 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
31int 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
2567void 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
2574void 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
2581void 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
2588void do_div0_tl1(struct pt_regs *regs) 2569void 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
2595void 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
2602void do_fpieee_tl1(struct pt_regs *regs) 2576void 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
218struct page *follow_huge_addr(struct mm_struct *mm,
219 unsigned long address, int write)
220{
221 return ERR_PTR(-EINVAL);
222}
223
224int pmd_huge(pmd_t pmd) 218int 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
234struct 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}
2823device_initcall(report_memory); 2823arch_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