diff options
Diffstat (limited to 'arch/sparc')
212 files changed, 2556 insertions, 2676 deletions
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 2137ad66743..407c87d9879 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -12,6 +12,8 @@ config 64BIT  config SPARC  	bool  	default y +	select ARCH_MIGHT_HAVE_PC_PARPORT if SPARC64 && PCI +	select ARCH_MIGHT_HAVE_PC_SERIO  	select OF  	select OF_PROMTREE  	select HAVE_IDE @@ -25,10 +27,9 @@ config SPARC  	select RTC_DRV_M48T59  	select HAVE_DMA_ATTRS  	select HAVE_DMA_API_DEBUG -	select HAVE_ARCH_JUMP_LABEL +	select HAVE_ARCH_JUMP_LABEL if SPARC64  	select GENERIC_IRQ_SHOW  	select ARCH_WANT_IPC_PARSE_VERSION -	select USE_GENERIC_SMP_HELPERS if SMP  	select GENERIC_PCI_IOMAP  	select HAVE_NMI_WATCHDOG if SPARC64  	select HAVE_BPF_JIT @@ -64,6 +65,7 @@ config SPARC64  	select HAVE_DYNAMIC_FTRACE  	select HAVE_FTRACE_MCOUNT_RECORD  	select HAVE_SYSCALL_TRACEPOINTS +	select HAVE_CONTEXT_TRACKING  	select HAVE_DEBUG_KMEMLEAK  	select RTC_DRV_CMOS  	select RTC_DRV_BQ4802 @@ -75,6 +77,8 @@ config SPARC64  	select ARCH_HAVE_NMI_SAFE_CMPXCHG  	select HAVE_C_RECORDMCOUNT  	select NO_BOOTMEM +	select HAVE_ARCH_AUDITSYSCALL +	select ARCH_SUPPORTS_ATOMIC_RMW  config ARCH_DEFCONFIG  	string @@ -151,10 +155,10 @@ config SMP  	  a system with only one CPU, say N. If you have a system with more  	  than one CPU, say Y. -	  If you say N here, the kernel will run on single and multiprocessor +	  If you say N here, the kernel will run on uni- and multiprocessor  	  machines, but will use only one CPU of a multiprocessor machine. If  	  you say Y here, the kernel will run on many, but not all, -	  singleprocessor machines. On a singleprocessor machine, the kernel +	  uniprocessor machines. On a uniprocessor machine, the kernel  	  will run faster if you say N here.  	  People using multiprocessor machines who say Y here should also say @@ -506,12 +510,17 @@ config SUN_OPENPROMFS  	  Only choose N if you know in advance that you will not need to modify  	  OpenPROM settings on the running system. -# Makefile helper +# Makefile helpers  config SPARC64_PCI  	bool  	default y  	depends on SPARC64 && PCI +config SPARC64_PCI_MSI +	bool +	default y +	depends on SPARC64_PCI && PCI_MSI +  endmenu  menu "Executable file formats" diff --git a/arch/sparc/crypto/aes_glue.c b/arch/sparc/crypto/aes_glue.c index 503e6d96ad4..df922f52d76 100644 --- a/arch/sparc/crypto/aes_glue.c +++ b/arch/sparc/crypto/aes_glue.c @@ -124,7 +124,7 @@ extern void aes_sparc64_ctr_crypt_256(const u64 *key, const u64 *input,  				      u64 *output, unsigned int len,  				      u64 *iv); -struct aes_ops aes128_ops = { +static struct aes_ops aes128_ops = {  	.encrypt		= aes_sparc64_encrypt_128,  	.decrypt		= aes_sparc64_decrypt_128,  	.load_encrypt_keys	= aes_sparc64_load_encrypt_keys_128, @@ -136,7 +136,7 @@ struct aes_ops aes128_ops = {  	.ctr_crypt		= aes_sparc64_ctr_crypt_128,  }; -struct aes_ops aes192_ops = { +static struct aes_ops aes192_ops = {  	.encrypt		= aes_sparc64_encrypt_192,  	.decrypt		= aes_sparc64_decrypt_192,  	.load_encrypt_keys	= aes_sparc64_load_encrypt_keys_192, @@ -148,7 +148,7 @@ struct aes_ops aes192_ops = {  	.ctr_crypt		= aes_sparc64_ctr_crypt_192,  }; -struct aes_ops aes256_ops = { +static struct aes_ops aes256_ops = {  	.encrypt		= aes_sparc64_encrypt_256,  	.decrypt		= aes_sparc64_decrypt_256,  	.load_encrypt_keys	= aes_sparc64_load_encrypt_keys_256, diff --git a/arch/sparc/include/asm/Kbuild b/arch/sparc/include/asm/Kbuild index 7e4a97fbded..a4582181800 100644 --- a/arch/sparc/include/asm/Kbuild +++ b/arch/sparc/include/asm/Kbuild @@ -6,12 +6,15 @@ generic-y += cputime.h  generic-y += div64.h  generic-y += emergency-restart.h  generic-y += exec.h -generic-y += linkage.h -generic-y += local64.h -generic-y += mutex.h +generic-y += hash.h  generic-y += irq_regs.h +generic-y += linkage.h  generic-y += local.h +generic-y += local64.h +generic-y += mcs_spinlock.h  generic-y += module.h +generic-y += mutex.h +generic-y += preempt.h  generic-y += serial.h  generic-y += trace_clock.h  generic-y += types.h diff --git a/arch/sparc/include/asm/atomic_32.h b/arch/sparc/include/asm/atomic_32.h index 905832aa9e9..7aed2be45b4 100644 --- a/arch/sparc/include/asm/atomic_32.h +++ b/arch/sparc/include/asm/atomic_32.h @@ -14,16 +14,17 @@  #include <linux/types.h>  #include <asm/cmpxchg.h> +#include <asm/barrier.h>  #include <asm-generic/atomic64.h>  #define ATOMIC_INIT(i)  { (i) } -extern int __atomic_add_return(int, atomic_t *); -extern int atomic_cmpxchg(atomic_t *, int, int); +int __atomic_add_return(int, atomic_t *); +int atomic_cmpxchg(atomic_t *, int, int);  #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) -extern int __atomic_add_unless(atomic_t *, int, int); -extern void atomic_set(atomic_t *, int); +int __atomic_add_unless(atomic_t *, int, int); +void atomic_set(atomic_t *, int);  #define atomic_read(v)          (*(volatile int *)&(v)->counter) @@ -52,10 +53,4 @@ extern void atomic_set(atomic_t *, int);  #define atomic_dec_and_test(v) (atomic_dec_return(v) == 0)  #define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0) -/* Atomic operations are already serializing */ -#define smp_mb__before_atomic_dec()	barrier() -#define smp_mb__after_atomic_dec()	barrier() -#define smp_mb__before_atomic_inc()	barrier() -#define smp_mb__after_atomic_inc()	barrier() -  #endif /* !(__ARCH_SPARC_ATOMIC__) */ diff --git a/arch/sparc/include/asm/atomic_64.h b/arch/sparc/include/asm/atomic_64.h index be56a244c9c..bb894c8bec5 100644 --- a/arch/sparc/include/asm/atomic_64.h +++ b/arch/sparc/include/asm/atomic_64.h @@ -9,6 +9,7 @@  #include <linux/types.h>  #include <asm/cmpxchg.h> +#include <asm/barrier.h>  #define ATOMIC_INIT(i)		{ (i) }  #define ATOMIC64_INIT(i)	{ (i) } @@ -19,15 +20,15 @@  #define atomic_set(v, i)	(((v)->counter) = i)  #define atomic64_set(v, i)	(((v)->counter) = i) -extern void atomic_add(int, atomic_t *); -extern void atomic64_add(long, atomic64_t *); -extern void atomic_sub(int, atomic_t *); -extern void atomic64_sub(long, atomic64_t *); +void atomic_add(int, atomic_t *); +void atomic64_add(long, atomic64_t *); +void atomic_sub(int, atomic_t *); +void atomic64_sub(long, atomic64_t *); -extern int atomic_add_ret(int, atomic_t *); -extern long atomic64_add_ret(long, atomic64_t *); -extern int atomic_sub_ret(int, atomic_t *); -extern long atomic64_sub_ret(long, atomic64_t *); +int atomic_add_ret(int, atomic_t *); +long atomic64_add_ret(long, atomic64_t *); +int atomic_sub_ret(int, atomic_t *); +long atomic64_sub_ret(long, atomic64_t *);  #define atomic_dec_return(v) atomic_sub_ret(1, v)  #define atomic64_dec_return(v) atomic64_sub_ret(1, v) @@ -106,12 +107,6 @@ static inline long atomic64_add_unless(atomic64_t *v, long a, long u)  #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) -extern long atomic64_dec_if_positive(atomic64_t *v); - -/* Atomic operations are already serializing */ -#define smp_mb__before_atomic_dec()	barrier() -#define smp_mb__after_atomic_dec()	barrier() -#define smp_mb__before_atomic_inc()	barrier() -#define smp_mb__after_atomic_inc()	barrier() +long atomic64_dec_if_positive(atomic64_t *v);  #endif /* !(__ARCH_SPARC64_ATOMIC__) */ diff --git a/arch/sparc/include/asm/auxio.h b/arch/sparc/include/asm/auxio.h index 13dc67f0301..3e09a07b77e 100644 --- a/arch/sparc/include/asm/auxio.h +++ b/arch/sparc/include/asm/auxio.h @@ -1,5 +1,12 @@  #ifndef ___ASM_SPARC_AUXIO_H  #define ___ASM_SPARC_AUXIO_H + +#ifndef __ASSEMBLY__ + +extern void __iomem *auxio_register; + +#endif /* ifndef __ASSEMBLY__ */ +  #if defined(__sparc__) && defined(__arch64__)  #include <asm/auxio_64.h>  #else diff --git a/arch/sparc/include/asm/auxio_32.h b/arch/sparc/include/asm/auxio_32.h index 3a319775ae3..5d685df427b 100644 --- a/arch/sparc/include/asm/auxio_32.h +++ b/arch/sparc/include/asm/auxio_32.h @@ -34,8 +34,8 @@   * NOTE: these routines are implementation dependent--   * understand the hardware you are querying!   */ -extern void set_auxio(unsigned char bits_on, unsigned char bits_off); -extern unsigned char get_auxio(void); /* .../asm/floppy.h */ +void set_auxio(unsigned char bits_on, unsigned char bits_off); +unsigned char get_auxio(void); /* .../asm/floppy.h */  /*   * The following routines are provided for driver-compatibility @@ -78,7 +78,7 @@ do { \  /* AUXIO2 (Power Off Control) */ -extern __volatile__ unsigned char * auxio_power_register; +extern volatile u8 __iomem *auxio_power_register;  #define	AUXIO_POWER_DETECT_FAILURE	32  #define	AUXIO_POWER_CLEAR_FAILURE	2 diff --git a/arch/sparc/include/asm/auxio_64.h b/arch/sparc/include/asm/auxio_64.h index f61cd1e3e39..6079e59a7ad 100644 --- a/arch/sparc/include/asm/auxio_64.h +++ b/arch/sparc/include/asm/auxio_64.h @@ -75,8 +75,6 @@  #ifndef __ASSEMBLY__ -extern void __iomem *auxio_register; -  #define AUXIO_LTE_ON	1  #define AUXIO_LTE_OFF	0 @@ -84,7 +82,7 @@ extern void __iomem *auxio_register;   *   * on - AUXIO_LTE_ON or AUXIO_LTE_OFF   */ -extern void auxio_set_lte(int on); +void auxio_set_lte(int on);  #define AUXIO_LED_ON	1  #define AUXIO_LED_OFF	0 @@ -93,7 +91,7 @@ extern void auxio_set_lte(int on);   *   * on - AUXIO_LED_ON or AUXIO_LED_OFF   */ -extern void auxio_set_led(int on); +void auxio_set_led(int on);  #endif /* ifndef __ASSEMBLY__ */ diff --git a/arch/sparc/include/asm/barrier_32.h b/arch/sparc/include/asm/barrier_32.h index c1b76654ee7..ae69eda288f 100644 --- a/arch/sparc/include/asm/barrier_32.h +++ b/arch/sparc/include/asm/barrier_32.h @@ -1,15 +1,7 @@  #ifndef __SPARC_BARRIER_H  #define __SPARC_BARRIER_H -/* XXX Change this if we ever use a PSO mode kernel. */ -#define mb()	__asm__ __volatile__ ("" : : : "memory") -#define rmb()	mb() -#define wmb()	mb() -#define read_barrier_depends()	do { } while(0) -#define set_mb(__var, __value)  do { __var = __value; mb(); } while(0) -#define smp_mb()	__asm__ __volatile__("":::"memory") -#define smp_rmb()	__asm__ __volatile__("":::"memory") -#define smp_wmb()	__asm__ __volatile__("":::"memory") -#define smp_read_barrier_depends()	do { } while(0) +#include <asm/processor.h> /* for nop() */ +#include <asm-generic/barrier.h>  #endif /* !(__SPARC_BARRIER_H) */ diff --git a/arch/sparc/include/asm/barrier_64.h b/arch/sparc/include/asm/barrier_64.h index 95d45986f90..305dcc3dc72 100644 --- a/arch/sparc/include/asm/barrier_64.h +++ b/arch/sparc/include/asm/barrier_64.h @@ -53,4 +53,22 @@ do {	__asm__ __volatile__("ba,pt	%%xcc, 1f\n\t" \  #define smp_read_barrier_depends()	do { } while(0) +#define smp_store_release(p, v)						\ +do {									\ +	compiletime_assert_atomic_type(*p);				\ +	barrier();							\ +	ACCESS_ONCE(*p) = (v);						\ +} while (0) + +#define smp_load_acquire(p)						\ +({									\ +	typeof(*p) ___p1 = ACCESS_ONCE(*p);				\ +	compiletime_assert_atomic_type(*p);				\ +	barrier();							\ +	___p1;								\ +}) + +#define smp_mb__before_atomic()	barrier() +#define smp_mb__after_atomic()	barrier() +  #endif /* !(__SPARC64_BARRIER_H) */ diff --git a/arch/sparc/include/asm/bitext.h b/arch/sparc/include/asm/bitext.h index 297b2f2fcb4..9c988bf3adb 100644 --- a/arch/sparc/include/asm/bitext.h +++ b/arch/sparc/include/asm/bitext.h @@ -20,8 +20,8 @@ struct bit_map {  	int num_colors;  }; -extern int bit_map_string_get(struct bit_map *t, int len, int align); -extern void bit_map_clear(struct bit_map *t, int offset, int len); -extern void bit_map_init(struct bit_map *t, unsigned long *map, int size); +int bit_map_string_get(struct bit_map *t, int len, int align); +void bit_map_clear(struct bit_map *t, int offset, int len); +void bit_map_init(struct bit_map *t, unsigned long *map, int size);  #endif /* defined(_SPARC_BITEXT_H) */ diff --git a/arch/sparc/include/asm/bitops_32.h b/arch/sparc/include/asm/bitops_32.h index 25a676653d4..600ed1d9c8c 100644 --- a/arch/sparc/include/asm/bitops_32.h +++ b/arch/sparc/include/asm/bitops_32.h @@ -18,9 +18,9 @@  #error only <linux/bitops.h> can be included directly  #endif -extern unsigned long ___set_bit(unsigned long *addr, unsigned long mask); -extern unsigned long ___clear_bit(unsigned long *addr, unsigned long mask); -extern unsigned long ___change_bit(unsigned long *addr, unsigned long mask); +unsigned long ___set_bit(unsigned long *addr, unsigned long mask); +unsigned long ___clear_bit(unsigned long *addr, unsigned long mask); +unsigned long ___change_bit(unsigned long *addr, unsigned long mask);  /*   * Set bit 'nr' in 32-bit quantity at address 'addr' where bit '0' @@ -90,9 +90,6 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *addr)  #include <asm-generic/bitops/non-atomic.h> -#define smp_mb__before_clear_bit()	do { } while(0) -#define smp_mb__after_clear_bit()	do { } while(0) -  #include <asm-generic/bitops/ffz.h>  #include <asm-generic/bitops/__ffs.h>  #include <asm-generic/bitops/sched.h> diff --git a/arch/sparc/include/asm/bitops_64.h b/arch/sparc/include/asm/bitops_64.h index 29011cc0e4b..2d522402a93 100644 --- a/arch/sparc/include/asm/bitops_64.h +++ b/arch/sparc/include/asm/bitops_64.h @@ -13,27 +13,25 @@  #include <linux/compiler.h>  #include <asm/byteorder.h> +#include <asm/barrier.h> -extern int test_and_set_bit(unsigned long nr, volatile unsigned long *addr); -extern int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr); -extern int test_and_change_bit(unsigned long nr, volatile unsigned long *addr); -extern void set_bit(unsigned long nr, volatile unsigned long *addr); -extern void clear_bit(unsigned long nr, volatile unsigned long *addr); -extern void change_bit(unsigned long nr, volatile unsigned long *addr); +int test_and_set_bit(unsigned long nr, volatile unsigned long *addr); +int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr); +int test_and_change_bit(unsigned long nr, volatile unsigned long *addr); +void set_bit(unsigned long nr, volatile unsigned long *addr); +void clear_bit(unsigned long nr, volatile unsigned long *addr); +void change_bit(unsigned long nr, volatile unsigned long *addr);  #include <asm-generic/bitops/non-atomic.h> -#define smp_mb__before_clear_bit()	barrier() -#define smp_mb__after_clear_bit()	barrier() -  #include <asm-generic/bitops/fls.h>  #include <asm-generic/bitops/__fls.h>  #include <asm-generic/bitops/fls64.h>  #ifdef __KERNEL__ -extern int ffs(int x); -extern unsigned long __ffs(unsigned long); +int ffs(int x); +unsigned long __ffs(unsigned long);  #include <asm-generic/bitops/ffz.h>  #include <asm-generic/bitops/sched.h> @@ -43,10 +41,10 @@ extern unsigned long __ffs(unsigned long);   * of bits set) of a N-bit word   */ -extern unsigned long __arch_hweight64(__u64 w); -extern unsigned int __arch_hweight32(unsigned int w); -extern unsigned int __arch_hweight16(unsigned int w); -extern unsigned int __arch_hweight8(unsigned int w); +unsigned long __arch_hweight64(__u64 w); +unsigned int __arch_hweight32(unsigned int w); +unsigned int __arch_hweight16(unsigned int w); +unsigned int __arch_hweight8(unsigned int w);  #include <asm-generic/bitops/const_hweight.h>  #include <asm-generic/bitops/lock.h> diff --git a/arch/sparc/include/asm/btext.h b/arch/sparc/include/asm/btext.h index 9b2bc6b6ed0..75a32b109e1 100644 --- a/arch/sparc/include/asm/btext.h +++ b/arch/sparc/include/asm/btext.h @@ -1,6 +1,6 @@  #ifndef _SPARC_BTEXT_H  #define _SPARC_BTEXT_H -extern int btext_find_display(void); +int btext_find_display(void);  #endif /* _SPARC_BTEXT_H */ diff --git a/arch/sparc/include/asm/bug.h b/arch/sparc/include/asm/bug.h index 6bd9f43cb5a..eaa8f8d3812 100644 --- a/arch/sparc/include/asm/bug.h +++ b/arch/sparc/include/asm/bug.h @@ -5,7 +5,7 @@  #include <linux/compiler.h>  #ifdef CONFIG_DEBUG_BUGVERBOSE -extern void do_BUG(const char *file, int line); +void do_BUG(const char *file, int line);  #define BUG() do {					\  	do_BUG(__FILE__, __LINE__);			\  	__builtin_trap();				\ @@ -20,6 +20,6 @@ extern void do_BUG(const char *file, int line);  #include <asm-generic/bug.h>  struct pt_regs; -extern void die_if_kernel(char *str, struct pt_regs *regs) __attribute__ ((noreturn)); +void __noreturn die_if_kernel(char *str, struct pt_regs *regs);  #endif diff --git a/arch/sparc/include/asm/cacheflush_32.h b/arch/sparc/include/asm/cacheflush_32.h index bb014c24f31..12164006181 100644 --- a/arch/sparc/include/asm/cacheflush_32.h +++ b/arch/sparc/include/asm/cacheflush_32.h @@ -36,7 +36,7 @@  #define flush_page_for_dma(addr) \  	sparc32_cachetlb_ops->page_for_dma(addr) -extern void sparc_flush_page_to_ram(struct page *page); +void sparc_flush_page_to_ram(struct page *page);  #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1  #define flush_dcache_page(page)			sparc_flush_page_to_ram(page) @@ -51,8 +51,8 @@ extern void sparc_flush_page_to_ram(struct page *page);   * way the windows are all clean for the next process and the stack   * frames are up to date.   */ -extern void flush_user_windows(void); -extern void kill_user_windows(void); -extern void flushw_all(void); +void flush_user_windows(void); +void kill_user_windows(void); +void flushw_all(void);  #endif /* _SPARC_CACHEFLUSH_H */ diff --git a/arch/sparc/include/asm/cacheflush_64.h b/arch/sparc/include/asm/cacheflush_64.h index 301736d9e7a..38965379e35 100644 --- a/arch/sparc/include/asm/cacheflush_64.h +++ b/arch/sparc/include/asm/cacheflush_64.h @@ -10,7 +10,7 @@  /* Cache flush operations. */  #define flushw_all()	__asm__ __volatile__("flushw") -extern void __flushw_user(void); +void __flushw_user(void);  #define flushw_user() __flushw_user()  #define flush_user_windows flushw_user @@ -30,29 +30,29 @@ extern void __flushw_user(void);   * use block commit stores (which invalidate icache lines) during   * module load, so we need this.   */ -extern void flush_icache_range(unsigned long start, unsigned long end); -extern void __flush_icache_page(unsigned long); +void flush_icache_range(unsigned long start, unsigned long end); +void __flush_icache_page(unsigned long); -extern void __flush_dcache_page(void *addr, int flush_icache); -extern void flush_dcache_page_impl(struct page *page); +void __flush_dcache_page(void *addr, int flush_icache); +void flush_dcache_page_impl(struct page *page);  #ifdef CONFIG_SMP -extern void smp_flush_dcache_page_impl(struct page *page, int cpu); -extern void flush_dcache_page_all(struct mm_struct *mm, struct page *page); +void smp_flush_dcache_page_impl(struct page *page, int cpu); +void flush_dcache_page_all(struct mm_struct *mm, struct page *page);  #else  #define smp_flush_dcache_page_impl(page,cpu) flush_dcache_page_impl(page)  #define flush_dcache_page_all(mm,page) flush_dcache_page_impl(page)  #endif -extern void __flush_dcache_range(unsigned long start, unsigned long end); +void __flush_dcache_range(unsigned long start, unsigned long end);  #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1 -extern void flush_dcache_page(struct page *page); +void flush_dcache_page(struct page *page);  #define flush_icache_page(vma, pg)	do { } while(0)  #define flush_icache_user_range(vma,pg,adr,len)	do { } while (0) -extern void flush_ptrace_access(struct vm_area_struct *, struct page *, -				unsigned long uaddr, void *kaddr, -				unsigned long len, int write); +void flush_ptrace_access(struct vm_area_struct *, struct page *, +			 unsigned long uaddr, void *kaddr, +			 unsigned long len, int write);  #define copy_to_user_page(vma, page, vaddr, dst, src, len)		\  	do {								\ diff --git a/arch/sparc/include/asm/checksum_32.h b/arch/sparc/include/asm/checksum_32.h index bdbda1453aa..426b2389a1c 100644 --- a/arch/sparc/include/asm/checksum_32.h +++ b/arch/sparc/include/asm/checksum_32.h @@ -29,7 +29,7 @@   *   * it's best to have buff aligned on a 32-bit boundary   */ -extern __wsum csum_partial(const void *buff, int len, __wsum sum); +__wsum csum_partial(const void *buff, int len, __wsum sum);  /* the same as csum_partial, but copies from fs:src while it   * checksums @@ -38,7 +38,7 @@ extern __wsum csum_partial(const void *buff, int len, __wsum sum);   * better 64-bit) boundary   */ -extern unsigned int __csum_partial_copy_sparc_generic (const unsigned char *, unsigned char *); +unsigned int __csum_partial_copy_sparc_generic (const unsigned char *, unsigned char *);  static inline __wsum  csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum) @@ -238,4 +238,16 @@ static inline __sum16 ip_compute_csum(const void *buff, int len)  	return csum_fold(csum_partial(buff, len, 0));  } +#define HAVE_ARCH_CSUM_ADD +static inline __wsum csum_add(__wsum csum, __wsum addend) +{ +	__asm__ __volatile__( +		"addcc   %0, %1, %0\n" +		"addx    %0, %%g0, %0" +		: "=r" (csum) +		: "r" (addend), "0" (csum)); + +	return csum; +} +  #endif /* !(__SPARC_CHECKSUM_H) */ diff --git a/arch/sparc/include/asm/checksum_64.h b/arch/sparc/include/asm/checksum_64.h index 019b9615e43..b8779a6a591 100644 --- a/arch/sparc/include/asm/checksum_64.h +++ b/arch/sparc/include/asm/checksum_64.h @@ -29,7 +29,7 @@   *   * it's best to have buff aligned on a 32-bit boundary   */ -extern __wsum csum_partial(const void * buff, int len, __wsum sum); +__wsum csum_partial(const void * buff, int len, __wsum sum);  /* the same as csum_partial, but copies from user space while it   * checksums @@ -37,12 +37,12 @@ extern __wsum csum_partial(const void * buff, int len, __wsum sum);   * here even more important to align src and dst on a 32-bit (or even   * better 64-bit) boundary   */ -extern __wsum csum_partial_copy_nocheck(const void *src, void *dst, -					      int len, __wsum sum); +__wsum csum_partial_copy_nocheck(const void *src, void *dst, +				 int len, __wsum sum); -extern long __csum_partial_copy_from_user(const void __user *src, -					  void *dst, int len, -					  __wsum sum); +long __csum_partial_copy_from_user(const void __user *src, +				   void *dst, int len, +				   __wsum sum);  static inline __wsum  csum_partial_copy_from_user(const void __user *src, @@ -59,9 +59,9 @@ csum_partial_copy_from_user(const void __user *src,   *	Copy and checksum to user   */  #define HAVE_CSUM_COPY_USER -extern long __csum_partial_copy_to_user(const void *src, -					void __user *dst, int len, -					  __wsum sum); +long __csum_partial_copy_to_user(const void *src, +				 void __user *dst, int len, +				 __wsum sum);  static inline __wsum  csum_and_copy_to_user(const void *src, @@ -77,7 +77,7 @@ csum_and_copy_to_user(const void *src,  /* ihl is always 5 or greater, almost always is 5, and iph is word aligned   * the majority of the time.   */ -extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl); +__sum16 ip_fast_csum(const void *iph, unsigned int ihl);  /* Fold a partial checksum without adding pseudo headers. */  static inline __sum16 csum_fold(__wsum sum) @@ -96,9 +96,9 @@ static inline __sum16 csum_fold(__wsum sum)  }  static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, -					       unsigned int len, -					       unsigned short proto, -					       __wsum sum) +					unsigned int len, +					unsigned short proto, +					__wsum sum)  {  	__asm__ __volatile__(  "	addcc		%1, %0, %0\n" @@ -116,9 +116,9 @@ static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,   * returns a 16-bit checksum, already complemented   */  static inline __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr, -						   unsigned short len, -						   unsigned short proto, -						   __wsum sum) +					unsigned short len, +					unsigned short proto, +					__wsum sum)  {  	return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));  } @@ -164,4 +164,16 @@ static inline __sum16 ip_compute_csum(const void *buff, int len)  	return csum_fold(csum_partial(buff, len, 0));  } +#define HAVE_ARCH_CSUM_ADD +static inline __wsum csum_add(__wsum csum, __wsum addend) +{ +	__asm__ __volatile__( +		"addcc   %0, %1, %0\n" +		"addx    %0, %%g0, %0" +		: "=r" (csum) +		: "r" (addend), "0" (csum)); + +	return csum; +} +  #endif /* !(__SPARC64_CHECKSUM_H) */ diff --git a/arch/sparc/include/asm/cmpxchg_32.h b/arch/sparc/include/asm/cmpxchg_32.h index 1fae1a02e3c..32c29a133f9 100644 --- a/arch/sparc/include/asm/cmpxchg_32.h +++ b/arch/sparc/include/asm/cmpxchg_32.h @@ -20,7 +20,7 @@ static inline unsigned long xchg_u32(__volatile__ unsigned long *m, unsigned lon  	return val;  } -extern void __xchg_called_with_bad_pointer(void); +void __xchg_called_with_bad_pointer(void);  static inline unsigned long __xchg(unsigned long x, __volatile__ void * ptr, int size)  { @@ -45,9 +45,9 @@ static inline unsigned long __xchg(unsigned long x, __volatile__ void * ptr, int  #define __HAVE_ARCH_CMPXCHG	1  /* bug catcher for when unsupported size is used - won't link */ -extern void __cmpxchg_called_with_bad_pointer(void); +void __cmpxchg_called_with_bad_pointer(void);  /* we only need to support cmpxchg of a u32 on sparc */ -extern unsigned long __cmpxchg_u32(volatile u32 *m, u32 old, u32 new_); +unsigned long __cmpxchg_u32(volatile u32 *m, u32 old, u32 new_);  /* don't worry...optimizer will get rid of most of this */  static inline unsigned long diff --git a/arch/sparc/include/asm/cmpxchg_64.h b/arch/sparc/include/asm/cmpxchg_64.h index 4adefe8e288..0e1ed6cfbf6 100644 --- a/arch/sparc/include/asm/cmpxchg_64.h +++ b/arch/sparc/include/asm/cmpxchg_64.h @@ -42,7 +42,7 @@ static inline unsigned long xchg64(__volatile__ unsigned long *m, unsigned long  #define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) -extern void __xchg_called_with_bad_pointer(void); +void __xchg_called_with_bad_pointer(void);  static inline unsigned long __xchg(unsigned long x, __volatile__ void * ptr,  				       int size) @@ -91,7 +91,7 @@ __cmpxchg_u64(volatile long *m, unsigned long old, unsigned long new)  /* This function doesn't exist, so you'll get a linker error     if something tries to do an invalid cmpxchg().  */ -extern void __cmpxchg_called_with_bad_pointer(void); +void __cmpxchg_called_with_bad_pointer(void);  static inline unsigned long  __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) diff --git a/arch/sparc/include/asm/cpudata.h b/arch/sparc/include/asm/cpudata.h index b5976de7cac..128b56b0867 100644 --- a/arch/sparc/include/asm/cpudata.h +++ b/arch/sparc/include/asm/cpudata.h @@ -1,5 +1,15 @@  #ifndef ___ASM_SPARC_CPUDATA_H  #define ___ASM_SPARC_CPUDATA_H + +#ifndef __ASSEMBLY__ + +#include <linux/threads.h> +#include <linux/percpu.h> + +extern const struct seq_operations cpuinfo_op; + +#endif /* !(__ASSEMBLY__) */ +  #if defined(__sparc__) && defined(__arch64__)  #include <asm/cpudata_64.h>  #else diff --git a/arch/sparc/include/asm/cpudata_64.h b/arch/sparc/include/asm/cpudata_64.h index 050ef35b9dc..0e594076912 100644 --- a/arch/sparc/include/asm/cpudata_64.h +++ b/arch/sparc/include/asm/cpudata_64.h @@ -8,9 +8,6 @@  #ifndef __ASSEMBLY__ -#include <linux/percpu.h> -#include <linux/threads.h> -  typedef struct {  	/* Dcache line 1 */  	unsigned int	__softirq_pending; /* must be 1st, see rtrap.S */ @@ -35,8 +32,6 @@ DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data);  #define cpu_data(__cpu)		per_cpu(__cpu_data, (__cpu))  #define local_cpu_data()	__get_cpu_var(__cpu_data) -extern const struct seq_operations cpuinfo_op; -  #endif /* !(__ASSEMBLY__) */  #include <asm/trap_block.h> diff --git a/arch/sparc/include/asm/delay_32.h b/arch/sparc/include/asm/delay_32.h index bc9aba2bead..3fb8ca144b4 100644 --- a/arch/sparc/include/asm/delay_32.h +++ b/arch/sparc/include/asm/delay_32.h @@ -20,8 +20,8 @@ static inline void __delay(unsigned long loops)  }  /* This is too messy with inline asm on the Sparc. */ -extern void __udelay(unsigned long usecs, unsigned long lpj); -extern void __ndelay(unsigned long nsecs, unsigned long lpj); +void __udelay(unsigned long usecs, unsigned long lpj); +void __ndelay(unsigned long nsecs, unsigned long lpj);  #ifdef CONFIG_SMP  #define __udelay_val	cpu_data(smp_processor_id()).udelay_val diff --git a/arch/sparc/include/asm/delay_64.h b/arch/sparc/include/asm/delay_64.h index a77aa622d76..0ba5424856d 100644 --- a/arch/sparc/include/asm/delay_64.h +++ b/arch/sparc/include/asm/delay_64.h @@ -8,8 +8,8 @@  #ifndef __ASSEMBLY__ -extern void __delay(unsigned long loops); -extern void udelay(unsigned long usecs); +void __delay(unsigned long loops); +void udelay(unsigned long usecs);  #define mdelay(n)	udelay((n) * 1000)  #endif /* !__ASSEMBLY__ */ diff --git a/arch/sparc/include/asm/device.h b/arch/sparc/include/asm/device.h index daa6a8a5e9c..bb3f0b0c675 100644 --- a/arch/sparc/include/asm/device.h +++ b/arch/sparc/include/asm/device.h @@ -19,7 +19,7 @@ struct dev_archdata {  	int			numa_node;  }; -extern void of_propagate_archdata(struct platform_device *bus); +void of_propagate_archdata(struct platform_device *bus);  struct pdev_archdata {  	struct resource		resource[PROMREG_MAX]; diff --git a/arch/sparc/include/asm/dma-mapping.h b/arch/sparc/include/asm/dma-mapping.h index 05fe53f5346..1ee02710b2d 100644 --- a/arch/sparc/include/asm/dma-mapping.h +++ b/arch/sparc/include/asm/dma-mapping.h @@ -7,7 +7,7 @@  #define DMA_ERROR_CODE	(~(dma_addr_t)0x0) -extern int dma_supported(struct device *dev, u64 mask); +int dma_supported(struct device *dev, u64 mask);  #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)  #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) diff --git a/arch/sparc/include/asm/ebus_dma.h b/arch/sparc/include/asm/ebus_dma.h index f07a5b541c9..fcfb4948147 100644 --- a/arch/sparc/include/asm/ebus_dma.h +++ b/arch/sparc/include/asm/ebus_dma.h @@ -22,14 +22,14 @@ struct ebus_dma_info {  	unsigned char	name[64];  }; -extern int ebus_dma_register(struct ebus_dma_info *p); -extern int ebus_dma_irq_enable(struct ebus_dma_info *p, int on); -extern void ebus_dma_unregister(struct ebus_dma_info *p); -extern int ebus_dma_request(struct ebus_dma_info *p, dma_addr_t bus_addr, +int ebus_dma_register(struct ebus_dma_info *p); +int ebus_dma_irq_enable(struct ebus_dma_info *p, int on); +void ebus_dma_unregister(struct ebus_dma_info *p); +int ebus_dma_request(struct ebus_dma_info *p, dma_addr_t bus_addr,  			    size_t len); -extern void ebus_dma_prepare(struct ebus_dma_info *p, int write); -extern unsigned int ebus_dma_residue(struct ebus_dma_info *p); -extern unsigned int ebus_dma_addr(struct ebus_dma_info *p); -extern void ebus_dma_enable(struct ebus_dma_info *p, int on); +void ebus_dma_prepare(struct ebus_dma_info *p, int write); +unsigned int ebus_dma_residue(struct ebus_dma_info *p); +unsigned int ebus_dma_addr(struct ebus_dma_info *p); +void ebus_dma_enable(struct ebus_dma_info *p, int on);  #endif /* __ASM_SPARC_EBUS_DMA_H */ diff --git a/arch/sparc/include/asm/floppy_32.h b/arch/sparc/include/asm/floppy_32.h index fb3f16954c6..071b83e52f1 100644 --- a/arch/sparc/include/asm/floppy_32.h +++ b/arch/sparc/include/asm/floppy_32.h @@ -9,11 +9,12 @@  #include <linux/of.h>  #include <linux/of_device.h> -#include <asm/page.h>  #include <asm/pgtable.h>  #include <asm/idprom.h>  #include <asm/oplib.h>  #include <asm/auxio.h> +#include <asm/setup.h> +#include <asm/page.h>  #include <asm/irq.h>  /* We don't need no stinkin' I/O port allocation crap. */ @@ -49,7 +50,6 @@ struct sun_flpy_controller {  /* You'll only ever find one controller on a SparcStation anyways. */  static struct sun_flpy_controller *sun_fdc = NULL; -extern volatile unsigned char *fdc_status;  struct sun_floppy_ops {  	unsigned char (*fd_inb)(int port); @@ -212,13 +212,6 @@ static void sun_82077_fd_outb(unsigned char value, int port)   * underruns.  If non-zero, doing_pdma encodes the direction of   * the transfer for debugging.  1=read 2=write   */ -extern char *pdma_vaddr; -extern unsigned long pdma_size; -extern volatile int doing_pdma; - -/* This is software state */ -extern char *pdma_base; -extern unsigned long pdma_areasize;  /* Common routines to all controller types on the Sparc. */  static inline void virtual_dma_init(void) @@ -263,8 +256,7 @@ static inline void sun_fd_enable_dma(void)  	pdma_areasize = pdma_size;  } -extern int sparc_floppy_request_irq(unsigned int irq, -                                    irq_handler_t irq_handler); +int sparc_floppy_request_irq(unsigned int irq, irq_handler_t irq_handler);  static int sun_fd_request_irq(void)  { diff --git a/arch/sparc/include/asm/floppy_64.h b/arch/sparc/include/asm/floppy_64.h index e204f902e6c..625756406a7 100644 --- a/arch/sparc/include/asm/floppy_64.h +++ b/arch/sparc/include/asm/floppy_64.h @@ -254,7 +254,7 @@ static int sun_fd_request_irq(void)  		once = 1;  		error = request_irq(FLOPPY_IRQ, sparc_floppy_irq, -				    IRQF_DISABLED, "floppy", NULL); +				    0, "floppy", NULL);  		return ((error == 0) ? 0 : -1);  	} @@ -296,7 +296,7 @@ struct sun_pci_dma_op {  static struct sun_pci_dma_op sun_pci_dma_current = { -1U, 0, 0, NULL};  static struct sun_pci_dma_op sun_pci_dma_pending = { -1U, 0, 0, NULL}; -extern irqreturn_t floppy_interrupt(int irq, void *dev_id); +irqreturn_t floppy_interrupt(int irq, void *dev_id);  static unsigned char sun_pci_fd_inb(unsigned long port)  { diff --git a/arch/sparc/include/asm/ftrace.h b/arch/sparc/include/asm/ftrace.h index b0f18e9893d..9ec94ad116f 100644 --- a/arch/sparc/include/asm/ftrace.h +++ b/arch/sparc/include/asm/ftrace.h @@ -6,7 +6,7 @@  #define MCOUNT_INSN_SIZE	4 /* sizeof mcount call */  #ifndef __ASSEMBLY__ -extern void _mcount(void); +void _mcount(void);  #endif  #endif @@ -22,4 +22,8 @@ struct dyn_arch_ftrace {  };  #endif /*  CONFIG_DYNAMIC_FTRACE */ +unsigned long prepare_ftrace_return(unsigned long parent, +				    unsigned long self_addr, +				    unsigned long frame_pointer); +  #endif /* _ASM_SPARC64_FTRACE */ diff --git a/arch/sparc/include/asm/hardirq_32.h b/arch/sparc/include/asm/hardirq_32.h index 162007643cd..ee93923b7f8 100644 --- a/arch/sparc/include/asm/hardirq_32.h +++ b/arch/sparc/include/asm/hardirq_32.h @@ -7,7 +7,6 @@  #ifndef __SPARC_HARDIRQ_H  #define __SPARC_HARDIRQ_H -#define HARDIRQ_BITS    8  #include <asm-generic/hardirq.h>  #endif /* __SPARC_HARDIRQ_H */ diff --git a/arch/sparc/include/asm/hardirq_64.h b/arch/sparc/include/asm/hardirq_64.h index 7c29fd1a87a..f478ff1ddd0 100644 --- a/arch/sparc/include/asm/hardirq_64.h +++ b/arch/sparc/include/asm/hardirq_64.h @@ -14,6 +14,4 @@  void ack_bad_irq(unsigned int irq); -#define HARDIRQ_BITS	8 -  #endif /* !(__SPARC64_HARDIRQ_H) */ diff --git a/arch/sparc/include/asm/highmem.h b/arch/sparc/include/asm/highmem.h index 4f9e15c757e..92ded294a4e 100644 --- a/arch/sparc/include/asm/highmem.h +++ b/arch/sparc/include/asm/highmem.h @@ -31,7 +31,7 @@ extern unsigned long highstart_pfn, highend_pfn;  extern pgprot_t kmap_prot;  extern pte_t *pkmap_page_table; -extern void kmap_init(void) __init; +void kmap_init(void) __init;  /*   * Right now we initialize only a single pte table. It can be extended @@ -49,8 +49,8 @@ extern void kmap_init(void) __init;  #define PKMAP_END (PKMAP_ADDR(LAST_PKMAP)) -extern void *kmap_high(struct page *page); -extern void kunmap_high(struct page *page); +void *kmap_high(struct page *page); +void kunmap_high(struct page *page);  static inline void *kmap(struct page *page)  { @@ -68,8 +68,8 @@ static inline void kunmap(struct page *page)  	kunmap_high(page);  } -extern void *kmap_atomic(struct page *page); -extern void __kunmap_atomic(void *kvaddr); +void *kmap_atomic(struct page *page); +void __kunmap_atomic(void *kvaddr);  #define flush_cache_kmaps()	flush_cache_all() diff --git a/arch/sparc/include/asm/hvtramp.h b/arch/sparc/include/asm/hvtramp.h index b2b9b947b3a..04b56f862bb 100644 --- a/arch/sparc/include/asm/hvtramp.h +++ b/arch/sparc/include/asm/hvtramp.h @@ -19,7 +19,7 @@ struct hvtramp_descr {  	struct hvtramp_mapping	maps[1];  }; -extern void hv_cpu_startup(unsigned long hvdescr_pa); +void hv_cpu_startup(unsigned long hvdescr_pa);  #endif diff --git a/arch/sparc/include/asm/hypervisor.h b/arch/sparc/include/asm/hypervisor.h index ca121f0fa3e..94b39caea3e 100644 --- a/arch/sparc/include/asm/hypervisor.h +++ b/arch/sparc/include/asm/hypervisor.h @@ -98,7 +98,7 @@  #define HV_FAST_MACH_EXIT		0x00  #ifndef __ASSEMBLY__ -extern void sun4v_mach_exit(unsigned long exit_code); +void sun4v_mach_exit(unsigned long exit_code);  #endif  /* Domain services.  */ @@ -127,9 +127,9 @@ extern void sun4v_mach_exit(unsigned long exit_code);  #define HV_FAST_MACH_DESC		0x01  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_mach_desc(unsigned long buffer_pa, -				     unsigned long buf_len, -				     unsigned long *real_buf_len); +unsigned long sun4v_mach_desc(unsigned long buffer_pa, +			      unsigned long buf_len, +			      unsigned long *real_buf_len);  #endif  /* mach_sir() @@ -148,7 +148,7 @@ extern unsigned long sun4v_mach_desc(unsigned long buffer_pa,  #define HV_FAST_MACH_SIR		0x02  #ifndef __ASSEMBLY__ -extern void sun4v_mach_sir(void); +void sun4v_mach_sir(void);  #endif  /* mach_set_watchdog() @@ -204,8 +204,8 @@ extern void sun4v_mach_sir(void);  #define HV_FAST_MACH_SET_WATCHDOG	0x05  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_mach_set_watchdog(unsigned long timeout, -					     unsigned long *orig_timeout); +unsigned long sun4v_mach_set_watchdog(unsigned long timeout, +				      unsigned long *orig_timeout);  #endif  /* CPU services. @@ -250,10 +250,10 @@ extern unsigned long sun4v_mach_set_watchdog(unsigned long timeout,  #define HV_FAST_CPU_START		0x10  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_cpu_start(unsigned long cpuid, -				     unsigned long pc, -				     unsigned long rtba, -				     unsigned long arg0); +unsigned long sun4v_cpu_start(unsigned long cpuid, +			      unsigned long pc, +			      unsigned long rtba, +			      unsigned long arg0);  #endif  /* cpu_stop() @@ -278,7 +278,7 @@ extern unsigned long sun4v_cpu_start(unsigned long cpuid,  #define HV_FAST_CPU_STOP		0x11  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_cpu_stop(unsigned long cpuid); +unsigned long sun4v_cpu_stop(unsigned long cpuid);  #endif  /* cpu_yield() @@ -295,7 +295,7 @@ extern unsigned long sun4v_cpu_stop(unsigned long cpuid);  #define HV_FAST_CPU_YIELD		0x12  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_cpu_yield(void); +unsigned long sun4v_cpu_yield(void);  #endif  /* cpu_qconf() @@ -341,9 +341,9 @@ extern unsigned long sun4v_cpu_yield(void);  #define  HV_CPU_QUEUE_NONRES_ERROR	 0x3f  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_cpu_qconf(unsigned long type, -				     unsigned long queue_paddr, -				     unsigned long num_queue_entries); +unsigned long sun4v_cpu_qconf(unsigned long type, +			      unsigned long queue_paddr, +			      unsigned long num_queue_entries);  #endif  /* cpu_qinfo() @@ -394,7 +394,9 @@ extern unsigned long sun4v_cpu_qconf(unsigned long type,  #define HV_FAST_CPU_MONDO_SEND		0x42  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_cpu_mondo_send(unsigned long cpu_count, unsigned long cpu_list_pa, unsigned long mondo_block_pa); +unsigned long sun4v_cpu_mondo_send(unsigned long cpu_count, +				   unsigned long cpu_list_pa, +				   unsigned long mondo_block_pa);  #endif  /* cpu_myid() @@ -425,7 +427,7 @@ extern unsigned long sun4v_cpu_mondo_send(unsigned long cpu_count, unsigned long  #define  HV_CPU_STATE_ERROR		 0x03  #ifndef __ASSEMBLY__ -extern long sun4v_cpu_state(unsigned long cpuid); +long sun4v_cpu_state(unsigned long cpuid);  #endif  /* cpu_set_rtba() @@ -625,8 +627,8 @@ struct hv_fault_status {  #define HV_FAST_MMU_TSB_CTX0		0x20  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_mmu_tsb_ctx0(unsigned long num_descriptions, -					unsigned long tsb_desc_ra); +unsigned long sun4v_mmu_tsb_ctx0(unsigned long num_descriptions, +				 unsigned long tsb_desc_ra);  #endif  /* mmu_tsb_ctxnon0() @@ -710,7 +712,7 @@ extern unsigned long sun4v_mmu_tsb_ctx0(unsigned long num_descriptions,  #define HV_FAST_MMU_DEMAP_ALL		0x24  #ifndef __ASSEMBLY__ -extern void sun4v_mmu_demap_all(void); +void sun4v_mmu_demap_all(void);  #endif  /* mmu_map_perm_addr() @@ -740,10 +742,10 @@ extern void sun4v_mmu_demap_all(void);  #define HV_FAST_MMU_MAP_PERM_ADDR	0x25  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_mmu_map_perm_addr(unsigned long vaddr, -					     unsigned long set_to_zero, -					     unsigned long tte, -					     unsigned long flags); +unsigned long sun4v_mmu_map_perm_addr(unsigned long vaddr, +				      unsigned long set_to_zero, +				      unsigned long tte, +				      unsigned long flags);  #endif  /* mmu_fault_area_conf() @@ -945,7 +947,7 @@ extern unsigned long sun4v_mmu_map_perm_addr(unsigned long vaddr,  #define HV_FAST_TOD_GET			0x50  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_tod_get(unsigned long *time); +unsigned long sun4v_tod_get(unsigned long *time);  #endif  /* tod_set() @@ -962,7 +964,7 @@ extern unsigned long sun4v_tod_get(unsigned long *time);  #define HV_FAST_TOD_SET			0x51  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_tod_set(unsigned long time); +unsigned long sun4v_tod_set(unsigned long time);  #endif  /* Console services */ @@ -1038,14 +1040,14 @@ extern unsigned long sun4v_tod_set(unsigned long time);  #define HV_FAST_CONS_WRITE		0x63  #ifndef __ASSEMBLY__ -extern long sun4v_con_getchar(long *status); -extern long sun4v_con_putchar(long c); -extern long sun4v_con_read(unsigned long buffer, -			   unsigned long size, -			   unsigned long *bytes_read); -extern unsigned long sun4v_con_write(unsigned long buffer, -				     unsigned long size, -				     unsigned long *bytes_written); +long sun4v_con_getchar(long *status); +long sun4v_con_putchar(long c); +long sun4v_con_read(unsigned long buffer, +		    unsigned long size, +		    unsigned long *bytes_read); +unsigned long sun4v_con_write(unsigned long buffer, +			      unsigned long size, +			      unsigned long *bytes_written);  #endif  /* mach_set_soft_state() @@ -1080,8 +1082,8 @@ extern unsigned long sun4v_con_write(unsigned long buffer,  #define  HV_SOFT_STATE_TRANSITION	 0x02  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_mach_set_soft_state(unsigned long soft_state, -					       unsigned long msg_string_ra); +unsigned long sun4v_mach_set_soft_state(unsigned long soft_state, +				        unsigned long msg_string_ra);  #endif  /* mach_get_soft_state() @@ -1159,20 +1161,20 @@ extern unsigned long sun4v_mach_set_soft_state(unsigned long soft_state,  #define HV_FAST_SVC_CLRSTATUS		0x84  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_svc_send(unsigned long svc_id, -				    unsigned long buffer, -				    unsigned long buffer_size, -				    unsigned long *sent_bytes); -extern unsigned long sun4v_svc_recv(unsigned long svc_id, -				    unsigned long buffer, -				    unsigned long buffer_size, -				    unsigned long *recv_bytes); -extern unsigned long sun4v_svc_getstatus(unsigned long svc_id, -					 unsigned long *status_bits); -extern unsigned long sun4v_svc_setstatus(unsigned long svc_id, -					 unsigned long status_bits); -extern unsigned long sun4v_svc_clrstatus(unsigned long svc_id, -					 unsigned long status_bits); +unsigned long sun4v_svc_send(unsigned long svc_id, +			     unsigned long buffer, +			     unsigned long buffer_size, +			     unsigned long *sent_bytes); +unsigned long sun4v_svc_recv(unsigned long svc_id, +			     unsigned long buffer, +			     unsigned long buffer_size, +			     unsigned long *recv_bytes); +unsigned long sun4v_svc_getstatus(unsigned long svc_id, +				  unsigned long *status_bits); +unsigned long sun4v_svc_setstatus(unsigned long svc_id, +				  unsigned long status_bits); +unsigned long sun4v_svc_clrstatus(unsigned long svc_id, +				  unsigned long status_bits);  #endif  /* Trap trace services. @@ -1458,8 +1460,8 @@ struct hv_trap_trace_entry {  #define HV_FAST_INTR_DEVINO2SYSINO	0xa0  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_devino_to_sysino(unsigned long devhandle, -					    unsigned long devino); +unsigned long sun4v_devino_to_sysino(unsigned long devhandle, +				     unsigned long devino);  #endif  /* intr_getenabled() @@ -1476,7 +1478,7 @@ extern unsigned long sun4v_devino_to_sysino(unsigned long devhandle,  #define HV_FAST_INTR_GETENABLED		0xa1  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_intr_getenabled(unsigned long sysino); +unsigned long sun4v_intr_getenabled(unsigned long sysino);  #endif  /* intr_setenabled() @@ -1492,7 +1494,8 @@ extern unsigned long sun4v_intr_getenabled(unsigned long sysino);  #define HV_FAST_INTR_SETENABLED		0xa2  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_intr_setenabled(unsigned long sysino, unsigned long intr_enabled); +unsigned long sun4v_intr_setenabled(unsigned long sysino, +				    unsigned long intr_enabled);  #endif  /* intr_getstate() @@ -1508,7 +1511,7 @@ extern unsigned long sun4v_intr_setenabled(unsigned long sysino, unsigned long i  #define HV_FAST_INTR_GETSTATE		0xa3  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_intr_getstate(unsigned long sysino); +unsigned long sun4v_intr_getstate(unsigned long sysino);  #endif  /* intr_setstate() @@ -1528,7 +1531,7 @@ extern unsigned long sun4v_intr_getstate(unsigned long sysino);  #define HV_FAST_INTR_SETSTATE		0xa4  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_intr_setstate(unsigned long sysino, unsigned long intr_state); +unsigned long sun4v_intr_setstate(unsigned long sysino, unsigned long intr_state);  #endif  /* intr_gettarget() @@ -1546,7 +1549,7 @@ extern unsigned long sun4v_intr_setstate(unsigned long sysino, unsigned long int  #define HV_FAST_INTR_GETTARGET		0xa5  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_intr_gettarget(unsigned long sysino); +unsigned long sun4v_intr_gettarget(unsigned long sysino);  #endif  /* intr_settarget() @@ -1563,7 +1566,7 @@ extern unsigned long sun4v_intr_gettarget(unsigned long sysino);  #define HV_FAST_INTR_SETTARGET		0xa6  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_intr_settarget(unsigned long sysino, unsigned long cpuid); +unsigned long sun4v_intr_settarget(unsigned long sysino, unsigned long cpuid);  #endif  /* vintr_get_cookie() @@ -1647,30 +1650,30 @@ extern unsigned long sun4v_intr_settarget(unsigned long sysino, unsigned long cp  #define HV_FAST_VINTR_SET_TARGET	0xae  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_vintr_get_cookie(unsigned long dev_handle, -					    unsigned long dev_ino, -					    unsigned long *cookie); -extern unsigned long sun4v_vintr_set_cookie(unsigned long dev_handle, -					    unsigned long dev_ino, -					    unsigned long cookie); -extern unsigned long sun4v_vintr_get_valid(unsigned long dev_handle, -					   unsigned long dev_ino, -					   unsigned long *valid); -extern unsigned long sun4v_vintr_set_valid(unsigned long dev_handle, -					   unsigned long dev_ino, -					   unsigned long valid); -extern unsigned long sun4v_vintr_get_state(unsigned long dev_handle, -					   unsigned long dev_ino, -					   unsigned long *state); -extern unsigned long sun4v_vintr_set_state(unsigned long dev_handle, -					   unsigned long dev_ino, -					   unsigned long state); -extern unsigned long sun4v_vintr_get_target(unsigned long dev_handle, -					    unsigned long dev_ino, -					    unsigned long *cpuid); -extern unsigned long sun4v_vintr_set_target(unsigned long dev_handle, -					    unsigned long dev_ino, -					    unsigned long cpuid); +unsigned long sun4v_vintr_get_cookie(unsigned long dev_handle, +				     unsigned long dev_ino, +				     unsigned long *cookie); +unsigned long sun4v_vintr_set_cookie(unsigned long dev_handle, +				     unsigned long dev_ino, +				     unsigned long cookie); +unsigned long sun4v_vintr_get_valid(unsigned long dev_handle, +				    unsigned long dev_ino, +				    unsigned long *valid); +unsigned long sun4v_vintr_set_valid(unsigned long dev_handle, +				    unsigned long dev_ino, +				    unsigned long valid); +unsigned long sun4v_vintr_get_state(unsigned long dev_handle, +				    unsigned long dev_ino, +				    unsigned long *state); +unsigned long sun4v_vintr_set_state(unsigned long dev_handle, +				    unsigned long dev_ino, +				    unsigned long state); +unsigned long sun4v_vintr_get_target(unsigned long dev_handle, +				     unsigned long dev_ino, +				     unsigned long *cpuid); +unsigned long sun4v_vintr_set_target(unsigned long dev_handle, +				     unsigned long dev_ino, +				     unsigned long cpuid);  #endif  /* PCI IO services. @@ -2627,50 +2630,50 @@ struct ldc_mtable_entry {  #define HV_FAST_LDC_REVOKE		0xef  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_ldc_tx_qconf(unsigned long channel, -					unsigned long ra, -					unsigned long num_entries); -extern unsigned long sun4v_ldc_tx_qinfo(unsigned long channel, -					unsigned long *ra, -					unsigned long *num_entries); -extern unsigned long sun4v_ldc_tx_get_state(unsigned long channel, -					    unsigned long *head_off, -					    unsigned long *tail_off, -					    unsigned long *chan_state); -extern unsigned long sun4v_ldc_tx_set_qtail(unsigned long channel, -					    unsigned long tail_off); -extern unsigned long sun4v_ldc_rx_qconf(unsigned long channel, -					unsigned long ra, -					unsigned long num_entries); -extern unsigned long sun4v_ldc_rx_qinfo(unsigned long channel, -					unsigned long *ra, -					unsigned long *num_entries); -extern unsigned long sun4v_ldc_rx_get_state(unsigned long channel, -					    unsigned long *head_off, -					    unsigned long *tail_off, -					    unsigned long *chan_state); -extern unsigned long sun4v_ldc_rx_set_qhead(unsigned long channel, -					    unsigned long head_off); -extern unsigned long sun4v_ldc_set_map_table(unsigned long channel, -					     unsigned long ra, -					     unsigned long num_entries); -extern unsigned long sun4v_ldc_get_map_table(unsigned long channel, -					     unsigned long *ra, -					     unsigned long *num_entries); -extern unsigned long sun4v_ldc_copy(unsigned long channel, -				    unsigned long dir_code, -				    unsigned long tgt_raddr, -				    unsigned long lcl_raddr, -				    unsigned long len, -				    unsigned long *actual_len); -extern unsigned long sun4v_ldc_mapin(unsigned long channel, -				     unsigned long cookie, -				     unsigned long *ra, -				     unsigned long *perm); -extern unsigned long sun4v_ldc_unmap(unsigned long ra); -extern unsigned long sun4v_ldc_revoke(unsigned long channel, -				      unsigned long cookie, -				      unsigned long mte_cookie); +unsigned long sun4v_ldc_tx_qconf(unsigned long channel, +				 unsigned long ra, +				 unsigned long num_entries); +unsigned long sun4v_ldc_tx_qinfo(unsigned long channel, +				 unsigned long *ra, +				 unsigned long *num_entries); +unsigned long sun4v_ldc_tx_get_state(unsigned long channel, +				     unsigned long *head_off, +				     unsigned long *tail_off, +				     unsigned long *chan_state); +unsigned long sun4v_ldc_tx_set_qtail(unsigned long channel, +				     unsigned long tail_off); +unsigned long sun4v_ldc_rx_qconf(unsigned long channel, +				 unsigned long ra, +				 unsigned long num_entries); +unsigned long sun4v_ldc_rx_qinfo(unsigned long channel, +				 unsigned long *ra, +				 unsigned long *num_entries); +unsigned long sun4v_ldc_rx_get_state(unsigned long channel, +				     unsigned long *head_off, +				     unsigned long *tail_off, +				     unsigned long *chan_state); +unsigned long sun4v_ldc_rx_set_qhead(unsigned long channel, +				     unsigned long head_off); +unsigned long sun4v_ldc_set_map_table(unsigned long channel, +				      unsigned long ra, +				      unsigned long num_entries); +unsigned long sun4v_ldc_get_map_table(unsigned long channel, +				      unsigned long *ra, +				      unsigned long *num_entries); +unsigned long sun4v_ldc_copy(unsigned long channel, +			     unsigned long dir_code, +			     unsigned long tgt_raddr, +			     unsigned long lcl_raddr, +			     unsigned long len, +			     unsigned long *actual_len); +unsigned long sun4v_ldc_mapin(unsigned long channel, +			      unsigned long cookie, +			      unsigned long *ra, +			      unsigned long *perm); +unsigned long sun4v_ldc_unmap(unsigned long ra); +unsigned long sun4v_ldc_revoke(unsigned long channel, +			       unsigned long cookie, +			       unsigned long mte_cookie);  #endif  /* Performance counter services.  */ @@ -2727,14 +2730,14 @@ extern unsigned long sun4v_ldc_revoke(unsigned long channel,  #define HV_FAST_N2_SET_PERFREG		0x105  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_niagara_getperf(unsigned long reg, -					   unsigned long *val); -extern unsigned long sun4v_niagara_setperf(unsigned long reg, -					   unsigned long val); -extern unsigned long sun4v_niagara2_getperf(unsigned long reg, -					    unsigned long *val); -extern unsigned long sun4v_niagara2_setperf(unsigned long reg, -					    unsigned long val); +unsigned long sun4v_niagara_getperf(unsigned long reg, +				    unsigned long *val); +unsigned long sun4v_niagara_setperf(unsigned long reg, +				    unsigned long val); +unsigned long sun4v_niagara2_getperf(unsigned long reg, +				     unsigned long *val); +unsigned long sun4v_niagara2_setperf(unsigned long reg, +				     unsigned long val);  #endif  /* MMU statistics services. @@ -2829,8 +2832,8 @@ struct hv_mmu_statistics {  #define HV_FAST_MMUSTAT_INFO		0x103  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_mmustat_conf(unsigned long ra, unsigned long *orig_ra); -extern unsigned long sun4v_mmustat_info(unsigned long *ra); +unsigned long sun4v_mmustat_conf(unsigned long ra, unsigned long *orig_ra); +unsigned long sun4v_mmustat_info(unsigned long *ra);  #endif  /* NCS crypto services  */ @@ -2919,9 +2922,9 @@ struct hv_ncs_qtail_update_arg {  #define HV_FAST_NCS_REQUEST		0x110  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_ncs_request(unsigned long request, -				       unsigned long arg_ra, -				       unsigned long arg_size); +unsigned long sun4v_ncs_request(unsigned long request, +			        unsigned long arg_ra, +			        unsigned long arg_size);  #endif  #define HV_FAST_FIRE_GET_PERFREG	0x120 @@ -2930,18 +2933,18 @@ extern unsigned long sun4v_ncs_request(unsigned long request,  #define HV_FAST_REBOOT_DATA_SET		0x172  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_reboot_data_set(unsigned long ra, -					   unsigned long len); +unsigned long sun4v_reboot_data_set(unsigned long ra, +				    unsigned long len);  #endif  #define HV_FAST_VT_GET_PERFREG		0x184  #define HV_FAST_VT_SET_PERFREG		0x185  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_vt_get_perfreg(unsigned long reg_num, -					  unsigned long *reg_val); -extern unsigned long sun4v_vt_set_perfreg(unsigned long reg_num, -					  unsigned long reg_val); +unsigned long sun4v_vt_get_perfreg(unsigned long reg_num, +				   unsigned long *reg_val); +unsigned long sun4v_vt_set_perfreg(unsigned long reg_num, +				   unsigned long reg_val);  #endif  /* Function numbers for HV_CORE_TRAP.  */ @@ -2978,21 +2981,21 @@ extern unsigned long sun4v_vt_set_perfreg(unsigned long reg_num,  #define HV_GRP_DIAG			0x0300  #ifndef __ASSEMBLY__ -extern unsigned long sun4v_get_version(unsigned long group, -				       unsigned long *major, -				       unsigned long *minor); -extern unsigned long sun4v_set_version(unsigned long group, -				       unsigned long major, -				       unsigned long minor, -				       unsigned long *actual_minor); - -extern int sun4v_hvapi_register(unsigned long group, unsigned long major, -				unsigned long *minor); -extern void sun4v_hvapi_unregister(unsigned long group); -extern int sun4v_hvapi_get(unsigned long group, -			   unsigned long *major, -			   unsigned long *minor); -extern void sun4v_hvapi_init(void); +unsigned long sun4v_get_version(unsigned long group, +			        unsigned long *major, +			        unsigned long *minor); +unsigned long sun4v_set_version(unsigned long group, +			        unsigned long major, +			        unsigned long minor, +			        unsigned long *actual_minor); + +int sun4v_hvapi_register(unsigned long group, unsigned long major, +			 unsigned long *minor); +void sun4v_hvapi_unregister(unsigned long group); +int sun4v_hvapi_get(unsigned long group, +		    unsigned long *major, +		    unsigned long *minor); +void sun4v_hvapi_init(void);  #endif  #endif /* !(_SPARC64_HYPERVISOR_H) */ diff --git a/arch/sparc/include/asm/idprom.h b/arch/sparc/include/asm/idprom.h index 6976aa2439c..3793f7f91c4 100644 --- a/arch/sparc/include/asm/idprom.h +++ b/arch/sparc/include/asm/idprom.h @@ -20,6 +20,6 @@ struct idprom {  };  extern struct idprom *idprom; -extern void idprom_init(void); +void idprom_init(void);  #endif /* !(_SPARC_IDPROM_H) */ diff --git a/arch/sparc/include/asm/io-unit.h b/arch/sparc/include/asm/io-unit.h index 01ab2f613e9..04a9701e720 100644 --- a/arch/sparc/include/asm/io-unit.h +++ b/arch/sparc/include/asm/io-unit.h @@ -43,7 +43,7 @@  struct iounit_struct {  	unsigned long		bmap[(IOUNIT_DMA_SIZE >> (PAGE_SHIFT + 3)) / sizeof(unsigned long)];  	spinlock_t		lock; -	iopte_t			*page_table; +	iopte_t __iomem		*page_table;  	unsigned long		rotor[3];  	unsigned long		limit[4];  }; diff --git a/arch/sparc/include/asm/io_32.h b/arch/sparc/include/asm/io_32.h index c1acbd891cb..9f532902627 100644 --- a/arch/sparc/include/asm/io_32.h +++ b/arch/sparc/include/asm/io_32.h @@ -2,191 +2,94 @@  #define __SPARC_IO_H  #include <linux/kernel.h> -#include <linux/types.h>  #include <linux/ioport.h>  /* struct resource */ -#include <asm/page.h>      /* IO address mapping routines need this */ -#include <asm-generic/pci_iomap.h> - -#define page_to_phys(page)	(page_to_pfn(page) << PAGE_SHIFT) - -static inline u32 flip_dword (u32 l) -{ -	return ((l&0xff)<<24) | (((l>>8)&0xff)<<16) | (((l>>16)&0xff)<<8)| ((l>>24)&0xff); -} - -static inline u16 flip_word (u16 w) -{ -	return ((w&0xff) << 8) | ((w>>8)&0xff); -} - -#define mmiowb() - -/* - * Memory mapped I/O to PCI - */ - -static inline u8 __raw_readb(const volatile void __iomem *addr) -{ -	return *(__force volatile u8 *)addr; -} - -static inline u16 __raw_readw(const volatile void __iomem *addr) -{ -	return *(__force volatile u16 *)addr; -} - -static inline u32 __raw_readl(const volatile void __iomem *addr) -{ -	return *(__force volatile u32 *)addr; -} +#define readb_relaxed(__addr)	readb(__addr) +#define readw_relaxed(__addr)	readw(__addr) +#define readl_relaxed(__addr)	readl(__addr) -static inline void __raw_writeb(u8 b, volatile void __iomem *addr) -{ -	*(__force volatile u8 *)addr = b; -} +#define IO_SPACE_LIMIT 0xffffffff -static inline void __raw_writew(u16 w, volatile void __iomem *addr) -{ -	*(__force volatile u16 *)addr = w; -} +#define memset_io(d,c,sz)     _memset_io(d,c,sz) +#define memcpy_fromio(d,s,sz) _memcpy_fromio(d,s,sz) +#define memcpy_toio(d,s,sz)   _memcpy_toio(d,s,sz) -static inline void __raw_writel(u32 l, volatile void __iomem *addr) -{ -	*(__force volatile u32 *)addr = l; -} +#include <asm-generic/io.h> -static inline u8 __readb(const volatile void __iomem *addr) +static inline void _memset_io(volatile void __iomem *dst, +                              int c, __kernel_size_t n)  { -	return *(__force volatile u8 *)addr; -} +	volatile void __iomem *d = dst; -static inline u16 __readw(const volatile void __iomem *addr) -{ -	return flip_word(*(__force volatile u16 *)addr); +	while (n--) { +		writeb(c, d); +		d++; +	}  } -static inline u32 __readl(const volatile void __iomem *addr) +static inline void _memcpy_fromio(void *dst, const volatile void __iomem *src, +                                  __kernel_size_t n)  { -	return flip_dword(*(__force volatile u32 *)addr); -} +	char *d = dst; -static inline void __writeb(u8 b, volatile void __iomem *addr) -{ -	*(__force volatile u8 *)addr = b; +	while (n--) { +		char tmp = readb(src); +		*d++ = tmp; +		src++; +	}  } -static inline void __writew(u16 w, volatile void __iomem *addr) +static inline void _memcpy_toio(volatile void __iomem *dst, const void *src, +                                __kernel_size_t n)  { -	*(__force volatile u16 *)addr = flip_word(w); -} +	const char *s = src; +	volatile void __iomem *d = dst; -static inline void __writel(u32 l, volatile void __iomem *addr) -{ -	*(__force volatile u32 *)addr = flip_dword(l); +	while (n--) { +		char tmp = *s++; +		writeb(tmp, d); +		d++; +	}  } -#define readb(__addr)		__readb(__addr) -#define readw(__addr)		__readw(__addr) -#define readl(__addr)		__readl(__addr) -#define readb_relaxed(__addr)	readb(__addr) -#define readw_relaxed(__addr)	readw(__addr) -#define readl_relaxed(__addr)	readl(__addr) - -#define writeb(__b, __addr)	__writeb((__b),(__addr)) -#define writew(__w, __addr)	__writew((__w),(__addr)) -#define writel(__l, __addr)	__writel((__l),(__addr)) - -/* - * I/O space operations - * - * Arrangement on a Sun is somewhat complicated. - * - * First of all, we want to use standard Linux drivers - * for keyboard, PC serial, etc. These drivers think - * they access I/O space and use inb/outb. - * On the other hand, EBus bridge accepts PCI *memory* - * cycles and converts them into ISA *I/O* cycles. - * Ergo, we want inb & outb to generate PCI memory cycles. - * - * If we want to issue PCI *I/O* cycles, we do this - * with a low 64K fixed window in PCIC. This window gets - * mapped somewhere into virtual kernel space and we - * can use inb/outb again. - */ -#define inb_local(__addr)	__readb((void __iomem *)(unsigned long)(__addr)) -#define inb(__addr)		__readb((void __iomem *)(unsigned long)(__addr)) -#define inw(__addr)		__readw((void __iomem *)(unsigned long)(__addr)) -#define inl(__addr)		__readl((void __iomem *)(unsigned long)(__addr)) - -#define outb_local(__b, __addr)	__writeb(__b, (void __iomem *)(unsigned long)(__addr)) -#define outb(__b, __addr)	__writeb(__b, (void __iomem *)(unsigned long)(__addr)) -#define outw(__w, __addr)	__writew(__w, (void __iomem *)(unsigned long)(__addr)) -#define outl(__l, __addr)	__writel(__l, (void __iomem *)(unsigned long)(__addr)) - -#define inb_p(__addr)		inb(__addr) -#define outb_p(__b, __addr)	outb(__b, __addr) -#define inw_p(__addr)		inw(__addr) -#define outw_p(__w, __addr)	outw(__w, __addr) -#define inl_p(__addr)		inl(__addr) -#define outl_p(__l, __addr)	outl(__l, __addr) - -void outsb(unsigned long addr, const void *src, unsigned long cnt); -void outsw(unsigned long addr, const void *src, unsigned long cnt); -void outsl(unsigned long addr, const void *src, unsigned long cnt); -void insb(unsigned long addr, void *dst, unsigned long count); -void insw(unsigned long addr, void *dst, unsigned long count); -void insl(unsigned long addr, void *dst, unsigned long count); - -#define IO_SPACE_LIMIT 0xffffffff -  /*   * SBus accessors.   *   * SBus has only one, memory mapped, I/O space.   * We do not need to flip bytes for SBus of course.   */ -static inline u8 _sbus_readb(const volatile void __iomem *addr) +static inline u8 sbus_readb(const volatile void __iomem *addr)  {  	return *(__force volatile u8 *)addr;  } -static inline u16 _sbus_readw(const volatile void __iomem *addr) +static inline u16 sbus_readw(const volatile void __iomem *addr)  {  	return *(__force volatile u16 *)addr;  } -static inline u32 _sbus_readl(const volatile void __iomem *addr) +static inline u32 sbus_readl(const volatile void __iomem *addr)  {  	return *(__force volatile u32 *)addr;  } -static inline void _sbus_writeb(u8 b, volatile void __iomem *addr) +static inline void sbus_writeb(u8 b, volatile void __iomem *addr)  {  	*(__force volatile u8 *)addr = b;  } -static inline void _sbus_writew(u16 w, volatile void __iomem *addr) +static inline void sbus_writew(u16 w, volatile void __iomem *addr)  {  	*(__force volatile u16 *)addr = w;  } -static inline void _sbus_writel(u32 l, volatile void __iomem *addr) +static inline void sbus_writel(u32 l, volatile void __iomem *addr)  {  	*(__force volatile u32 *)addr = l;  } -/* - * The only reason for #define's is to hide casts to unsigned long. - */ -#define sbus_readb(__addr)		_sbus_readb(__addr) -#define sbus_readw(__addr)		_sbus_readw(__addr) -#define sbus_readl(__addr)		_sbus_readl(__addr) -#define sbus_writeb(__b, __addr)	_sbus_writeb(__b, __addr) -#define sbus_writew(__w, __addr)	_sbus_writew(__w, __addr) -#define sbus_writel(__l, __addr)	_sbus_writel(__l, __addr) - -static inline void sbus_memset_io(volatile void __iomem *__dst, int c, __kernel_size_t n) +static inline void sbus_memset_io(volatile void __iomem *__dst, int c, +                                  __kernel_size_t n)  {  	while(n--) {  		sbus_writeb(c, __dst); @@ -194,22 +97,9 @@ static inline void sbus_memset_io(volatile void __iomem *__dst, int c, __kernel_  	}  } -static inline void -_memset_io(volatile void __iomem *dst, int c, __kernel_size_t n) -{ -	volatile void __iomem *d = dst; - -	while (n--) { -		writeb(c, d); -		d++; -	} -} - -#define memset_io(d,c,sz)	_memset_io(d,c,sz) - -static inline void -_sbus_memcpy_fromio(void *dst, const volatile void __iomem *src, -		    __kernel_size_t n) +static inline void sbus_memcpy_fromio(void *dst, +                                      const volatile void __iomem *src, +                                      __kernel_size_t n)  {  	char *d = dst; @@ -220,25 +110,9 @@ _sbus_memcpy_fromio(void *dst, const volatile void __iomem *src,  	}  } -#define sbus_memcpy_fromio(d, s, sz)	_sbus_memcpy_fromio(d, s, sz) - -static inline void -_memcpy_fromio(void *dst, const volatile void __iomem *src, __kernel_size_t n) -{ -	char *d = dst; - -	while (n--) { -		char tmp = readb(src); -		*d++ = tmp; -		src++; -	} -} - -#define memcpy_fromio(d,s,sz)	_memcpy_fromio(d,s,sz) - -static inline void -_sbus_memcpy_toio(volatile void __iomem *dst, const void *src, -		  __kernel_size_t n) +static inline void sbus_memcpy_toio(volatile void __iomem *dst, +                                    const void *src, +                                    __kernel_size_t n)  {  	const char *s = src;  	volatile void __iomem *d = dst; @@ -250,81 +124,26 @@ _sbus_memcpy_toio(volatile void __iomem *dst, const void *src,  	}  } -#define sbus_memcpy_toio(d, s, sz)	_sbus_memcpy_toio(d, s, sz) - -static inline void -_memcpy_toio(volatile void __iomem *dst, const void *src, __kernel_size_t n) -{ -	const char *s = src; -	volatile void __iomem *d = dst; - -	while (n--) { -		char tmp = *s++; -		writeb(tmp, d); -		d++; -	} -} - -#define memcpy_toio(d,s,sz)	_memcpy_toio(d,s,sz) -  #ifdef __KERNEL__  /*   * Bus number may be embedded in the higher bits of the physical address.   * This is why we have no bus number argument to ioremap().   */ -extern void __iomem *ioremap(unsigned long offset, unsigned long size); +void __iomem *ioremap(unsigned long offset, unsigned long size);  #define ioremap_nocache(X,Y)	ioremap((X),(Y))  #define ioremap_wc(X,Y)		ioremap((X),(Y)) -extern void iounmap(volatile void __iomem *addr); - -#define ioread8(X)			readb(X) -#define ioread16(X)			readw(X) -#define ioread16be(X)			__raw_readw(X) -#define ioread32(X)			readl(X) -#define ioread32be(X)			__raw_readl(X) -#define iowrite8(val,X)			writeb(val,X) -#define iowrite16(val,X)		writew(val,X) -#define iowrite16be(val,X)		__raw_writew(val,X) -#define iowrite32(val,X)		writel(val,X) -#define iowrite32be(val,X)		__raw_writel(val,X) - -static inline void ioread8_rep(void __iomem *port, void *buf, unsigned long count) -{ -	insb((unsigned long __force)port, buf, count); -} -static inline void ioread16_rep(void __iomem *port, void *buf, unsigned long count) -{ -	insw((unsigned long __force)port, buf, count); -} - -static inline void ioread32_rep(void __iomem *port, void *buf, unsigned long count) -{ -	insl((unsigned long __force)port, buf, count); -} - -static inline void iowrite8_rep(void __iomem *port, const void *buf, unsigned long count) -{ -	outsb((unsigned long __force)port, buf, count); -} - -static inline void iowrite16_rep(void __iomem *port, const void *buf, unsigned long count) -{ -	outsw((unsigned long __force)port, buf, count); -} - -static inline void iowrite32_rep(void __iomem *port, const void *buf, unsigned long count) -{ -	outsl((unsigned long __force)port, buf, count); -} +void iounmap(volatile void __iomem *addr);  /* Create a virtual mapping cookie for an IO port range */ -extern void __iomem *ioport_map(unsigned long port, unsigned int nr); -extern void ioport_unmap(void __iomem *); +void __iomem *ioport_map(unsigned long port, unsigned int nr); +void ioport_unmap(void __iomem *);  /* Create a virtual mapping cookie for a PCI BAR (memory or IO) */  struct pci_dev; -extern void pci_iounmap(struct pci_dev *dev, void __iomem *); +void pci_iounmap(struct pci_dev *dev, void __iomem *); + +  /*   * At the moment, we do not use CMOS_READ anywhere outside of rtc.c, @@ -343,21 +162,11 @@ static inline int sbus_can_burst64(void)  	return 0; /* actually, sparc_cpu_model==sun4d */  }  struct device; -extern void sbus_set_sbus64(struct device *, int); +void sbus_set_sbus64(struct device *, int);  #endif  #define __ARCH_HAS_NO_PAGE_ZERO_MAPPED		1 -/* - * Convert a physical pointer to a virtual kernel pointer for /dev/mem - * access - */ -#define xlate_dev_mem_ptr(p)	__va(p) - -/* - * Convert a virtual cached pointer to an uncached pointer - */ -#define xlate_dev_kmem_ptr(p)	p  #endif /* !(__SPARC_IO_H) */ diff --git a/arch/sparc/include/asm/io_64.h b/arch/sparc/include/asm/io_64.h index 09b0b88aeb2..05381c3a422 100644 --- a/arch/sparc/include/asm/io_64.h +++ b/arch/sparc/include/asm/io_64.h @@ -15,7 +15,6 @@  /* BIO layer definitions. */  extern unsigned long kern_base, kern_size; -#define page_to_phys(page)	(page_to_pfn(page) << PAGE_SHIFT)  static inline u8 _inb(unsigned long addr)  { @@ -91,12 +90,12 @@ static inline void _outl(u32 l, unsigned long addr)  #define inl_p(__addr)		inl(__addr)  #define outl_p(__l, __addr)	outl(__l, __addr) -extern void outsb(unsigned long, const void *, unsigned long); -extern void outsw(unsigned long, const void *, unsigned long); -extern void outsl(unsigned long, const void *, unsigned long); -extern void insb(unsigned long, void *, unsigned long); -extern void insw(unsigned long, void *, unsigned long); -extern void insl(unsigned long, void *, unsigned long); +void outsb(unsigned long, const void *, unsigned long); +void outsw(unsigned long, const void *, unsigned long); +void outsl(unsigned long, const void *, unsigned long); +void insb(unsigned long, void *, unsigned long); +void insw(unsigned long, void *, unsigned long); +void insl(unsigned long, void *, unsigned long);  static inline void ioread8_rep(void __iomem *port, void *buf, unsigned long count)  { @@ -509,12 +508,12 @@ static inline void iounmap(volatile void __iomem *addr)  #define iowrite32be(val,X)		__raw_writel(val,X)  /* Create a virtual mapping cookie for an IO port range */ -extern void __iomem *ioport_map(unsigned long port, unsigned int nr); -extern void ioport_unmap(void __iomem *); +void __iomem *ioport_map(unsigned long port, unsigned int nr); +void ioport_unmap(void __iomem *);  /* Create a virtual mapping cookie for a PCI BAR (memory or IO) */  struct pci_dev; -extern void pci_iounmap(struct pci_dev *dev, void __iomem *); +void pci_iounmap(struct pci_dev *dev, void __iomem *);  static inline int sbus_can_dma_64bit(void)  { @@ -525,7 +524,7 @@ static inline int sbus_can_burst64(void)  	return 1;  }  struct device; -extern void sbus_set_sbus64(struct device *, int); +void sbus_set_sbus64(struct device *, int);  /*   * Convert a physical pointer to a virtual kernel pointer for /dev/mem diff --git a/arch/sparc/include/asm/iommu_32.h b/arch/sparc/include/asm/iommu_32.h index 70c589c05a1..f6c066b52fd 100644 --- a/arch/sparc/include/asm/iommu_32.h +++ b/arch/sparc/include/asm/iommu_32.h @@ -99,7 +99,7 @@ struct iommu_regs {  #define IOPTE_WAZ           0x00000001 /* Write as zeros */  struct iommu_struct { -	struct iommu_regs *regs; +	struct iommu_regs __iomem *regs;  	iopte_t *page_table;  	/* For convenience */  	unsigned long start; /* First managed virtual address */ @@ -108,14 +108,14 @@ struct iommu_struct {  	struct bit_map usemap;  }; -static inline void iommu_invalidate(struct iommu_regs *regs) +static inline void iommu_invalidate(struct iommu_regs __iomem *regs)  { -	regs->tlbflush = 0; +	sbus_writel(0, ®s->tlbflush);  } -static inline void iommu_invalidate_page(struct iommu_regs *regs, unsigned long ba) +static inline void iommu_invalidate_page(struct iommu_regs __iomem *regs, unsigned long ba)  { -	regs->pageflush = (ba & PAGE_MASK); +	sbus_writel(ba & PAGE_MASK, ®s->pageflush);  }  #endif /* !(_SPARC_IOMMU_H) */ diff --git a/arch/sparc/include/asm/iommu_64.h b/arch/sparc/include/asm/iommu_64.h index caf798b5619..2b9321ab064 100644 --- a/arch/sparc/include/asm/iommu_64.h +++ b/arch/sparc/include/asm/iommu_64.h @@ -58,8 +58,8 @@ struct strbuf {  	volatile unsigned long	__flushflag_buf[(64+(64-1)) / sizeof(long)];  }; -extern int iommu_table_init(struct iommu *iommu, int tsbsize, -			    u32 dma_offset, u32 dma_addr_mask, -			    int numa_node); +int iommu_table_init(struct iommu *iommu, int tsbsize, +		     u32 dma_offset, u32 dma_addr_mask, +		     int numa_node);  #endif /* !(_SPARC64_IOMMU_H) */ diff --git a/arch/sparc/include/asm/irq_32.h b/arch/sparc/include/asm/irq_32.h index 2ae3acaeb1b..eecd3d8442c 100644 --- a/arch/sparc/include/asm/irq_32.h +++ b/arch/sparc/include/asm/irq_32.h @@ -16,7 +16,8 @@  #define irq_canonicalize(irq)	(irq) -extern void __init init_IRQ(void); +void __init init_IRQ(void); +void __init sun4d_init_sbi_irq(void);  #define NO_IRQ		0xffffffff diff --git a/arch/sparc/include/asm/irq_64.h b/arch/sparc/include/asm/irq_64.h index abf6afe82ca..91d21938130 100644 --- a/arch/sparc/include/asm/irq_64.h +++ b/arch/sparc/include/asm/irq_64.h @@ -39,32 +39,32 @@   */  #define NR_IRQS    255 -extern void irq_install_pre_handler(int irq, -				    void (*func)(unsigned int, void *, void *), -				    void *arg1, void *arg2); +void irq_install_pre_handler(int irq, +			     void (*func)(unsigned int, void *, void *), +			     void *arg1, void *arg2);  #define irq_canonicalize(irq)	(irq) -extern unsigned int build_irq(int inofixup, unsigned long iclr, unsigned long imap); -extern unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino); -extern unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino); -extern unsigned int sun4v_build_msi(u32 devhandle, unsigned int *irq_p, -				    unsigned int msi_devino_start, -				    unsigned int msi_devino_end); -extern void sun4v_destroy_msi(unsigned int irq); -extern unsigned int sun4u_build_msi(u32 portid, unsigned int *irq_p, -				    unsigned int msi_devino_start, -				    unsigned int msi_devino_end, -				    unsigned long imap_base, -				    unsigned long iclr_base); -extern void sun4u_destroy_msi(unsigned int irq); - -extern unsigned char irq_alloc(unsigned int dev_handle, -				    unsigned int dev_ino); +unsigned int build_irq(int inofixup, unsigned long iclr, unsigned long imap); +unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino); +unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino); +unsigned int sun4v_build_msi(u32 devhandle, unsigned int *irq_p, +			     unsigned int msi_devino_start, +			     unsigned int msi_devino_end); +void sun4v_destroy_msi(unsigned int irq); +unsigned int sun4u_build_msi(u32 portid, unsigned int *irq_p, +			     unsigned int msi_devino_start, +			     unsigned int msi_devino_end, +			     unsigned long imap_base, +			     unsigned long iclr_base); +void sun4u_destroy_msi(unsigned int irq); + +unsigned char irq_alloc(unsigned int dev_handle, +			unsigned int dev_ino);  #ifdef CONFIG_PCI_MSI -extern void irq_free(unsigned int irq); +void irq_free(unsigned int irq);  #endif -extern void __init init_IRQ(void); -extern void fixup_irqs(void); +void __init init_IRQ(void); +void fixup_irqs(void);  static inline void set_softint(unsigned long bits)  { @@ -89,7 +89,7 @@ static inline unsigned long get_softint(void)  	return retval;  } -void arch_trigger_all_cpu_backtrace(void); +void arch_trigger_all_cpu_backtrace(bool);  #define arch_trigger_all_cpu_backtrace arch_trigger_all_cpu_backtrace  extern void *hardirq_stack[NR_CPUS]; diff --git a/arch/sparc/include/asm/irqflags_32.h b/arch/sparc/include/asm/irqflags_32.h index e414c06615c..71cc284f55c 100644 --- a/arch/sparc/include/asm/irqflags_32.h +++ b/arch/sparc/include/asm/irqflags_32.h @@ -15,9 +15,9 @@  #include <linux/types.h>  #include <asm/psr.h> -extern void arch_local_irq_restore(unsigned long); -extern unsigned long arch_local_irq_save(void); -extern void arch_local_irq_enable(void); +void arch_local_irq_restore(unsigned long); +unsigned long arch_local_irq_save(void); +void arch_local_irq_enable(void);  static inline notrace unsigned long arch_local_save_flags(void)  { diff --git a/arch/sparc/include/asm/jump_label.h b/arch/sparc/include/asm/jump_label.h index 5080d16a832..ec2e2e2aba7 100644 --- a/arch/sparc/include/asm/jump_label.h +++ b/arch/sparc/include/asm/jump_label.h @@ -9,7 +9,7 @@  static __always_inline bool arch_static_branch(struct static_key *key)  { -		asm goto("1:\n\t" +		asm_volatile_goto("1:\n\t"  			 "nop\n\t"  			 "nop\n\t"  			 ".pushsection __jump_table,  \"aw\"\n\t" diff --git a/arch/sparc/include/asm/kdebug_64.h b/arch/sparc/include/asm/kdebug_64.h index feb3578e12c..04465de8f3b 100644 --- a/arch/sparc/include/asm/kdebug_64.h +++ b/arch/sparc/include/asm/kdebug_64.h @@ -3,7 +3,7 @@  struct pt_regs; -extern void bad_trap(struct pt_regs *, long); +void bad_trap(struct pt_regs *, long);  /* Grossly misnamed. */  enum die_val { diff --git a/arch/sparc/include/asm/kgdb.h b/arch/sparc/include/asm/kgdb.h index b6ef301d05b..47366af7a58 100644 --- a/arch/sparc/include/asm/kgdb.h +++ b/arch/sparc/include/asm/kgdb.h @@ -28,9 +28,12 @@ enum regnames {  #define NUMREGBYTES		((GDB_CSR + 1) * 4)  #else  #define NUMREGBYTES		((GDB_Y + 1) * 8) + +struct pt_regs; +asmlinkage void kgdb_trap(unsigned long trap_level, struct pt_regs *regs);  #endif -extern void arch_kgdb_breakpoint(void); +void arch_kgdb_breakpoint(void);  #define BREAK_INSTR_SIZE	4  #define CACHE_FLUSH_IS_SAFE	1 diff --git a/arch/sparc/include/asm/kprobes.h b/arch/sparc/include/asm/kprobes.h index 5879d71afda..a145d798e11 100644 --- a/arch/sparc/include/asm/kprobes.h +++ b/arch/sparc/include/asm/kprobes.h @@ -43,7 +43,9 @@ struct kprobe_ctlblk {  	struct prev_kprobe prev_kprobe;  }; -extern int kprobe_exceptions_notify(struct notifier_block *self, -				    unsigned long val, void *data); -extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr); +int kprobe_exceptions_notify(struct notifier_block *self, +			     unsigned long val, void *data); +int kprobe_fault_handler(struct pt_regs *regs, int trapnr); +asmlinkage void __kprobes kprobe_trap(unsigned long trap_level, +				      struct pt_regs *regs);  #endif /* _SPARC64_KPROBES_H */ diff --git a/arch/sparc/include/asm/ldc.h b/arch/sparc/include/asm/ldc.h index bdb524a7b81..c8c67f621f4 100644 --- a/arch/sparc/include/asm/ldc.h +++ b/arch/sparc/include/asm/ldc.h @@ -4,9 +4,9 @@  #include <asm/hypervisor.h>  extern int ldom_domaining_enabled; -extern void ldom_set_var(const char *var, const char *value); -extern void ldom_reboot(const char *boot_command); -extern void ldom_power_off(void); +void ldom_set_var(const char *var, const char *value); +void ldom_reboot(const char *boot_command); +void ldom_power_off(void);  /* The event handler will be evoked when link state changes   * or data becomes available on the receive side. @@ -51,30 +51,30 @@ struct ldc_channel_config {  struct ldc_channel;  /* Allocate state for a channel.  */ -extern struct ldc_channel *ldc_alloc(unsigned long id, -				     const struct ldc_channel_config *cfgp, -				     void *event_arg); +struct ldc_channel *ldc_alloc(unsigned long id, +			      const struct ldc_channel_config *cfgp, +			      void *event_arg);  /* Shut down and free state for a channel.  */ -extern void ldc_free(struct ldc_channel *lp); +void ldc_free(struct ldc_channel *lp);  /* Register TX and RX queues of the link with the hypervisor.  */ -extern int ldc_bind(struct ldc_channel *lp, const char *name); +int ldc_bind(struct ldc_channel *lp, const char *name);  /* For non-RAW protocols we need to complete a handshake before   * communication can proceed.  ldc_connect() does that, if the   * handshake completes successfully, an LDC_EVENT_UP event will   * be sent up to the driver.   */ -extern int ldc_connect(struct ldc_channel *lp); -extern int ldc_disconnect(struct ldc_channel *lp); +int ldc_connect(struct ldc_channel *lp); +int ldc_disconnect(struct ldc_channel *lp); -extern int ldc_state(struct ldc_channel *lp); +int ldc_state(struct ldc_channel *lp);  /* Read and write operations.  Only valid when the link is up.  */ -extern int ldc_write(struct ldc_channel *lp, const void *buf, -		     unsigned int size); -extern int ldc_read(struct ldc_channel *lp, void *buf, unsigned int size); +int ldc_write(struct ldc_channel *lp, const void *buf, +	      unsigned int size); +int ldc_read(struct ldc_channel *lp, void *buf, unsigned int size);  #define LDC_MAP_SHADOW	0x01  #define LDC_MAP_DIRECT	0x02 @@ -92,22 +92,22 @@ struct ldc_trans_cookie {  };  struct scatterlist; -extern int ldc_map_sg(struct ldc_channel *lp, -		      struct scatterlist *sg, int num_sg, -		      struct ldc_trans_cookie *cookies, int ncookies, -		      unsigned int map_perm); +int ldc_map_sg(struct ldc_channel *lp, +	       struct scatterlist *sg, int num_sg, +	       struct ldc_trans_cookie *cookies, int ncookies, +	       unsigned int map_perm); -extern int ldc_map_single(struct ldc_channel *lp, -			  void *buf, unsigned int len, -			  struct ldc_trans_cookie *cookies, int ncookies, -			  unsigned int map_perm); +int ldc_map_single(struct ldc_channel *lp, +		   void *buf, unsigned int len, +		   struct ldc_trans_cookie *cookies, int ncookies, +		   unsigned int map_perm); -extern void ldc_unmap(struct ldc_channel *lp, struct ldc_trans_cookie *cookies, -		      int ncookies); +void ldc_unmap(struct ldc_channel *lp, struct ldc_trans_cookie *cookies, +	       int ncookies); -extern int ldc_copy(struct ldc_channel *lp, int copy_dir, -		    void *buf, unsigned int len, unsigned long offset, -		    struct ldc_trans_cookie *cookies, int ncookies); +int ldc_copy(struct ldc_channel *lp, int copy_dir, +	     void *buf, unsigned int len, unsigned long offset, +	     struct ldc_trans_cookie *cookies, int ncookies);  static inline int ldc_get_dring_entry(struct ldc_channel *lp,  				      void *buf, unsigned int len, @@ -127,12 +127,12 @@ static inline int ldc_put_dring_entry(struct ldc_channel *lp,  	return ldc_copy(lp, LDC_COPY_OUT, buf, len, offset, cookies, ncookies);  } -extern void *ldc_alloc_exp_dring(struct ldc_channel *lp, unsigned int len, -				 struct ldc_trans_cookie *cookies, -				 int *ncookies, unsigned int map_perm); +void *ldc_alloc_exp_dring(struct ldc_channel *lp, unsigned int len, +			  struct ldc_trans_cookie *cookies, +			  int *ncookies, unsigned int map_perm); -extern void ldc_free_exp_dring(struct ldc_channel *lp, void *buf, -			       unsigned int len, -			       struct ldc_trans_cookie *cookies, int ncookies); +void ldc_free_exp_dring(struct ldc_channel *lp, void *buf, +		        unsigned int len, +		        struct ldc_trans_cookie *cookies, int ncookies);  #endif /* _SPARC64_LDC_H */ diff --git a/arch/sparc/include/asm/leon.h b/arch/sparc/include/asm/leon.h index c2f6ff6d7a3..204771cd74a 100644 --- a/arch/sparc/include/asm/leon.h +++ b/arch/sparc/include/asm/leon.h @@ -82,8 +82,8 @@ static inline unsigned long leon_load_reg(unsigned long paddr)  #define LEON_BYPASS_LOAD_PA(x)      leon_load_reg((unsigned long)(x))  #define LEON_BYPASS_STORE_PA(x, v)  leon_store_reg((unsigned long)(x), (unsigned long)(v)) -extern void leon_switch_mm(void); -extern void leon_init_IRQ(void); +void leon_switch_mm(void); +void leon_init_IRQ(void);  static inline unsigned long sparc_leon3_get_dcachecfg(void)  { @@ -196,14 +196,14 @@ static inline int sparc_leon3_cpuid(void)  #ifndef __ASSEMBLY__  struct vm_area_struct; -extern unsigned long leon_swprobe(unsigned long vaddr, unsigned long *paddr); -extern void leon_flush_icache_all(void); -extern void leon_flush_dcache_all(void); -extern void leon_flush_cache_all(void); -extern void leon_flush_tlb_all(void); +unsigned long leon_swprobe(unsigned long vaddr, unsigned long *paddr); +void leon_flush_icache_all(void); +void leon_flush_dcache_all(void); +void leon_flush_cache_all(void); +void leon_flush_tlb_all(void);  extern int leon_flush_during_switch; -extern int leon_flush_needed(void); -extern void leon_flush_pcache_all(struct vm_area_struct *vma, unsigned long page); +int leon_flush_needed(void); +void leon_flush_pcache_all(struct vm_area_struct *vma, unsigned long page);  /* struct that hold LEON3 cache configuration registers */  struct leon3_cacheregs { @@ -217,29 +217,29 @@ struct leon3_cacheregs {  struct device_node;  struct task_struct; -extern unsigned int leon_build_device_irq(unsigned int real_irq, -					   irq_flow_handler_t flow_handler, -					   const char *name, int do_ack); -extern void leon_update_virq_handling(unsigned int virq, -			      irq_flow_handler_t flow_handler, -			      const char *name, int do_ack); -extern void leon_init_timers(void); -extern void leon_trans_init(struct device_node *dp); -extern void leon_node_init(struct device_node *dp, struct device_node ***nextp); -extern void init_leon(void); -extern void poke_leonsparc(void); -extern void leon3_getCacheRegs(struct leon3_cacheregs *regs); +unsigned int leon_build_device_irq(unsigned int real_irq, +				   irq_flow_handler_t flow_handler, +				   const char *name, int do_ack); +void leon_update_virq_handling(unsigned int virq, +			       irq_flow_handler_t flow_handler, +			       const char *name, int do_ack); +void leon_init_timers(void); +void leon_trans_init(struct device_node *dp); +void leon_node_init(struct device_node *dp, struct device_node ***nextp); +void init_leon(void); +void poke_leonsparc(void); +void leon3_getCacheRegs(struct leon3_cacheregs *regs);  extern int leon3_ticker_irq;  #ifdef CONFIG_SMP -extern int leon_smp_nrcpus(void); -extern void leon_clear_profile_irq(int cpu); -extern void leon_smp_done(void); -extern void leon_boot_cpus(void); -extern int leon_boot_one_cpu(int i, struct task_struct *); +int leon_smp_nrcpus(void); +void leon_clear_profile_irq(int cpu); +void leon_smp_done(void); +void leon_boot_cpus(void); +int leon_boot_one_cpu(int i, struct task_struct *);  void leon_init_smp(void);  void leon_enable_irq_cpu(unsigned int irq_nr, unsigned int cpu); -extern irqreturn_t leon_percpu_timer_interrupt(int irq, void *unused); +irqreturn_t leon_percpu_timer_interrupt(int irq, void *unused);  extern unsigned int smpleon_ipi[];  extern unsigned int linux_trap_ipi15_leon[]; diff --git a/arch/sparc/include/asm/leon_pci.h b/arch/sparc/include/asm/leon_pci.h index bfd3ab3092b..049d067ed8b 100644 --- a/arch/sparc/include/asm/leon_pci.h +++ b/arch/sparc/include/asm/leon_pci.h @@ -16,7 +16,7 @@ struct leon_pci_info {  	int (*map_irq)(const struct pci_dev *dev, u8 slot, u8 pin);  }; -extern void leon_pci_init(struct platform_device *ofdev, -				struct leon_pci_info *info); +void leon_pci_init(struct platform_device *ofdev, +		   struct leon_pci_info *info);  #endif /* _ASM_LEON_PCI_H_ */ diff --git a/arch/sparc/include/asm/mc146818rtc.h b/arch/sparc/include/asm/mc146818rtc.h index 67ed9e3a023..d8e72f37dc4 100644 --- a/arch/sparc/include/asm/mc146818rtc.h +++ b/arch/sparc/include/asm/mc146818rtc.h @@ -1,5 +1,10 @@  #ifndef ___ASM_SPARC_MC146818RTC_H  #define ___ASM_SPARC_MC146818RTC_H + +#include <linux/spinlock.h> + +extern spinlock_t rtc_lock; +  #if defined(__sparc__) && defined(__arch64__)  #include <asm/mc146818rtc_64.h>  #else diff --git a/arch/sparc/include/asm/mdesc.h b/arch/sparc/include/asm/mdesc.h index 139097f3a67..aebeb88f70d 100644 --- a/arch/sparc/include/asm/mdesc.h +++ b/arch/sparc/include/asm/mdesc.h @@ -12,13 +12,13 @@ struct mdesc_handle;   * the first argument to all of the operational calls that work   * on mdescs.   */ -extern struct mdesc_handle *mdesc_grab(void); -extern void mdesc_release(struct mdesc_handle *); +struct mdesc_handle *mdesc_grab(void); +void mdesc_release(struct mdesc_handle *);  #define MDESC_NODE_NULL		(~(u64)0) -extern u64 mdesc_node_by_name(struct mdesc_handle *handle, -			      u64 from_node, const char *name); +u64 mdesc_node_by_name(struct mdesc_handle *handle, +		       u64 from_node, const char *name);  #define mdesc_for_each_node_by_name(__hdl, __node, __name) \  	for (__node = mdesc_node_by_name(__hdl, MDESC_NODE_NULL, __name); \  	     (__node) != MDESC_NODE_NULL; \ @@ -34,9 +34,9 @@ extern u64 mdesc_node_by_name(struct mdesc_handle *handle,   *   * These same rules apply to mdesc_node_name().   */ -extern const void *mdesc_get_property(struct mdesc_handle *handle, -				      u64 node, const char *name, int *lenp); -extern const char *mdesc_node_name(struct mdesc_handle *hp, u64 node); +const void *mdesc_get_property(struct mdesc_handle *handle, +			       u64 node, const char *name, int *lenp); +const char *mdesc_node_name(struct mdesc_handle *hp, u64 node);  /* MD arc iteration, the standard sequence is:   * @@ -50,16 +50,16 @@ extern const char *mdesc_node_name(struct mdesc_handle *hp, u64 node);  #define MDESC_ARC_TYPE_FWD	"fwd"  #define MDESC_ARC_TYPE_BACK	"back" -extern u64 mdesc_next_arc(struct mdesc_handle *handle, u64 from, -			  const char *arc_type); +u64 mdesc_next_arc(struct mdesc_handle *handle, u64 from, +		   const char *arc_type);  #define mdesc_for_each_arc(__arc, __hdl, __node, __type) \  	for (__arc = mdesc_next_arc(__hdl, __node, __type); \  	     (__arc) != MDESC_NODE_NULL; \  	     __arc = mdesc_next_arc(__hdl, __arc, __type)) -extern u64 mdesc_arc_target(struct mdesc_handle *hp, u64 arc); +u64 mdesc_arc_target(struct mdesc_handle *hp, u64 arc); -extern void mdesc_update(void); +void mdesc_update(void);  struct mdesc_notifier_client {  	void (*add)(struct mdesc_handle *handle, u64 node); @@ -69,12 +69,12 @@ struct mdesc_notifier_client {  	struct mdesc_notifier_client	*next;  }; -extern void mdesc_register_notifier(struct mdesc_notifier_client *client); +void mdesc_register_notifier(struct mdesc_notifier_client *client); -extern void mdesc_fill_in_cpu_data(cpumask_t *mask); -extern void mdesc_populate_present_mask(cpumask_t *mask); -extern void mdesc_get_page_sizes(cpumask_t *mask, unsigned long *pgsz_mask); +void mdesc_fill_in_cpu_data(cpumask_t *mask); +void mdesc_populate_present_mask(cpumask_t *mask); +void mdesc_get_page_sizes(cpumask_t *mask, unsigned long *pgsz_mask); -extern void sun4v_mdesc_init(void); +void sun4v_mdesc_init(void);  #endif diff --git a/arch/sparc/include/asm/mmu_64.h b/arch/sparc/include/asm/mmu_64.h index 76092c4dd27..70067ce184b 100644 --- a/arch/sparc/include/asm/mmu_64.h +++ b/arch/sparc/include/asm/mmu_64.h @@ -67,9 +67,9 @@ struct tsb {  	unsigned long pte;  } __attribute__((aligned(TSB_ENTRY_ALIGNMENT))); -extern void __tsb_insert(unsigned long ent, unsigned long tag, unsigned long pte); -extern void tsb_flush(unsigned long ent, unsigned long tag); -extern void tsb_init(struct tsb *tsb, unsigned long size); +void __tsb_insert(unsigned long ent, unsigned long tag, unsigned long pte); +void tsb_flush(unsigned long ent, unsigned long tag); +void tsb_init(struct tsb *tsb, unsigned long size);  struct tsb_config {  	struct tsb		*tsb; @@ -93,7 +93,6 @@ typedef struct {  	spinlock_t		lock;  	unsigned long		sparc64_ctx_val;  	unsigned long		huge_pte_count; -	struct page		*pgtable_page;  	struct tsb_config	tsb_block[MM_NUM_TSBS];  	struct hv_tsb_descr	tsb_descr[MM_NUM_TSBS];  } mm_context_t; diff --git a/arch/sparc/include/asm/mmu_context_64.h b/arch/sparc/include/asm/mmu_context_64.h index 3d528f06e4b..b84be675e50 100644 --- a/arch/sparc/include/asm/mmu_context_64.h +++ b/arch/sparc/include/asm/mmu_context_64.h @@ -17,20 +17,20 @@ extern spinlock_t ctx_alloc_lock;  extern unsigned long tlb_context_cache;  extern unsigned long mmu_context_bmap[]; -extern void get_new_mmu_context(struct mm_struct *mm); +void get_new_mmu_context(struct mm_struct *mm);  #ifdef CONFIG_SMP -extern void smp_new_mmu_context_version(void); +void smp_new_mmu_context_version(void);  #else  #define smp_new_mmu_context_version() do { } while (0)  #endif -extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm); -extern void destroy_context(struct mm_struct *mm); +int init_new_context(struct task_struct *tsk, struct mm_struct *mm); +void destroy_context(struct mm_struct *mm); -extern void __tsb_context_switch(unsigned long pgd_pa, -				 struct tsb_config *tsb_base, -				 struct tsb_config *tsb_huge, -				 unsigned long tsb_descr_pa); +void __tsb_context_switch(unsigned long pgd_pa, +			  struct tsb_config *tsb_base, +			  struct tsb_config *tsb_huge, +			  unsigned long tsb_descr_pa);  static inline void tsb_context_switch(struct mm_struct *mm)  { @@ -46,9 +46,11 @@ static inline void tsb_context_switch(struct mm_struct *mm)  			     , __pa(&mm->context.tsb_descr[0]));  } -extern void tsb_grow(struct mm_struct *mm, unsigned long tsb_index, unsigned long mm_rss); +void tsb_grow(struct mm_struct *mm, +	      unsigned long tsb_index, +	      unsigned long mm_rss);  #ifdef CONFIG_SMP -extern void smp_tsb_sync(struct mm_struct *mm); +void smp_tsb_sync(struct mm_struct *mm);  #else  #define smp_tsb_sync(__mm) do { } while (0)  #endif @@ -66,7 +68,7 @@ extern void smp_tsb_sync(struct mm_struct *mm);  	: "r" (CTX_HWBITS((__mm)->context)), \  	  "r" (SECONDARY_CONTEXT), "i" (ASI_DMMU), "i" (ASI_MMU)) -extern void __flush_tlb_mm(unsigned long, unsigned long); +void __flush_tlb_mm(unsigned long, unsigned long);  /* Switch the current MM context. */  static inline void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, struct task_struct *tsk) diff --git a/arch/sparc/include/asm/nmi.h b/arch/sparc/include/asm/nmi.h index 72e6500e7ab..26ad2b2607c 100644 --- a/arch/sparc/include/asm/nmi.h +++ b/arch/sparc/include/asm/nmi.h @@ -1,13 +1,13 @@  #ifndef __NMI_H  #define __NMI_H -extern int __init nmi_init(void); -extern void perfctr_irq(int irq, struct pt_regs *regs); -extern void nmi_adjust_hz(unsigned int new_hz); +int __init nmi_init(void); +void perfctr_irq(int irq, struct pt_regs *regs); +void nmi_adjust_hz(unsigned int new_hz);  extern atomic_t nmi_active; -extern void start_nmi_watchdog(void *unused); -extern void stop_nmi_watchdog(void *unused); +void start_nmi_watchdog(void *unused); +void stop_nmi_watchdog(void *unused);  #endif /* __NMI_H */ diff --git a/arch/sparc/include/asm/oplib_32.h b/arch/sparc/include/asm/oplib_32.h index c72f3045820..56a09b9d7b1 100644 --- a/arch/sparc/include/asm/oplib_32.h +++ b/arch/sparc/include/asm/oplib_32.h @@ -43,28 +43,28 @@ extern struct linux_nodeops *prom_nodeops;  /* You must call prom_init() before using any of the library services,   * preferably as early as possible.  Pass it the romvec pointer.   */ -extern void prom_init(struct linux_romvec *rom_ptr); +void prom_init(struct linux_romvec *rom_ptr);  /* Boot argument acquisition, returns the boot command line string. */ -extern char *prom_getbootargs(void); +char *prom_getbootargs(void);  /* Miscellaneous routines, don't really fit in any category per se. */  /* Reboot the machine with the command line passed. */ -extern void prom_reboot(char *boot_command); +void prom_reboot(char *boot_command);  /* Evaluate the forth string passed. */ -extern void prom_feval(char *forth_string); +void prom_feval(char *forth_string);  /* Enter the prom, with possibility of continuation with the 'go'   * command in newer proms.   */ -extern void prom_cmdline(void); +void prom_cmdline(void);  /* Enter the prom, with no chance of continuation for the stand-alone   * which calls this.   */ -extern void __noreturn prom_halt(void); +void __noreturn prom_halt(void);  /* Set the PROM 'sync' callback function to the passed function pointer.   * When the user gives the 'sync' command at the prom prompt while the @@ -73,37 +73,37 @@ extern void __noreturn prom_halt(void);   * XXX The arguments are different on V0 vs. V2->higher proms, grrr! XXX   */  typedef void (*sync_func_t)(void); -extern void prom_setsync(sync_func_t func_ptr); +void prom_setsync(sync_func_t func_ptr);  /* Acquire the IDPROM of the root node in the prom device tree.  This   * gets passed a buffer where you would like it stuffed.  The return value   * is the format type of this idprom or 0xff on error.   */ -extern unsigned char prom_get_idprom(char *idp_buffer, int idpbuf_size); +unsigned char prom_get_idprom(char *idp_buffer, int idpbuf_size);  /* Get the prom major version. */ -extern int prom_version(void); +int prom_version(void);  /* Get the prom plugin revision. */ -extern int prom_getrev(void); +int prom_getrev(void);  /* Get the prom firmware revision. */ -extern int prom_getprev(void); +int prom_getprev(void);  /* Write a buffer of characters to the console. */ -extern void prom_console_write_buf(const char *buf, int len); +void prom_console_write_buf(const char *buf, int len);  /* Prom's internal routines, don't use in kernel/boot code. */ -extern __printf(1, 2) void prom_printf(const char *fmt, ...); -extern void prom_write(const char *buf, unsigned int len); +__printf(1, 2) void prom_printf(const char *fmt, ...); +void prom_write(const char *buf, unsigned int len);  /* Multiprocessor operations... */  /* Start the CPU with the given device tree node, context table, and context   * at the passed program counter.   */ -extern int prom_startcpu(int cpunode, struct linux_prom_registers *context_table, -			 int context, char *program_counter); +int prom_startcpu(int cpunode, struct linux_prom_registers *context_table, +		  int context, char *program_counter);  /* Initialize the memory lists based upon the prom version. */  void prom_meminit(void); @@ -111,65 +111,65 @@ void prom_meminit(void);  /* PROM device tree traversal functions... */  /* Get the child node of the given node, or zero if no child exists. */ -extern phandle prom_getchild(phandle parent_node); +phandle prom_getchild(phandle parent_node);  /* Get the next sibling node of the given node, or zero if no further   * siblings exist.   */ -extern phandle prom_getsibling(phandle node); +phandle prom_getsibling(phandle node);  /* Get the length, at the passed node, of the given property type.   * Returns -1 on error (ie. no such property at this node).   */ -extern int prom_getproplen(phandle thisnode, const char *property); +int prom_getproplen(phandle thisnode, const char *property);  /* Fetch the requested property using the given buffer.  Returns   * the number of bytes the prom put into your buffer or -1 on error.   */ -extern int __must_check prom_getproperty(phandle thisnode, const char *property, -					 char *prop_buffer, int propbuf_size); +int __must_check prom_getproperty(phandle thisnode, const char *property, +				  char *prop_buffer, int propbuf_size);  /* Acquire an integer property. */ -extern int prom_getint(phandle node, char *property); +int prom_getint(phandle node, char *property);  /* Acquire an integer property, with a default value. */ -extern int prom_getintdefault(phandle node, char *property, int defval); +int prom_getintdefault(phandle node, char *property, int defval);  /* Acquire a boolean property, 0=FALSE 1=TRUE. */ -extern int prom_getbool(phandle node, char *prop); +int prom_getbool(phandle node, char *prop);  /* Acquire a string property, null string on error. */ -extern void prom_getstring(phandle node, char *prop, char *buf, int bufsize); +void prom_getstring(phandle node, char *prop, char *buf, int bufsize);  /* Search all siblings starting at the passed node for "name" matching   * the given string.  Returns the node on success, zero on failure.   */ -extern phandle prom_searchsiblings(phandle node_start, char *name); +phandle prom_searchsiblings(phandle node_start, char *name);  /* Returns the next property after the passed property for the given   * node.  Returns null string on failure.   */ -extern char *prom_nextprop(phandle node, char *prev_property, char *buffer); +char *prom_nextprop(phandle node, char *prev_property, char *buffer);  /* Returns phandle of the path specified */ -extern phandle prom_finddevice(char *name); +phandle prom_finddevice(char *name);  /* Set the indicated property at the given node with the passed value.   * Returns the number of bytes of your value that the prom took.   */ -extern int prom_setprop(phandle node, const char *prop_name, char *prop_value, -			int value_size); +int prom_setprop(phandle node, const char *prop_name, char *prop_value, +		 int value_size); -extern phandle prom_inst2pkg(int); +phandle prom_inst2pkg(int);  /* Dorking with Bus ranges... */  /* Apply promlib probes OBIO ranges to registers. */ -extern void prom_apply_obio_ranges(struct linux_prom_registers *obioregs, int nregs); +void prom_apply_obio_ranges(struct linux_prom_registers *obioregs, int nregs);  /* Apply ranges of any prom node (and optionally parent node as well) to registers. */ -extern void prom_apply_generic_ranges(phandle node, phandle parent, -				      struct linux_prom_registers *sbusregs, int nregs); +void prom_apply_generic_ranges(phandle node, phandle parent, +			       struct linux_prom_registers *sbusregs, int nregs);  void prom_ranges_init(void); diff --git a/arch/sparc/include/asm/oplib_64.h b/arch/sparc/include/asm/oplib_64.h index a12dbe3b776..f34682430fc 100644 --- a/arch/sparc/include/asm/oplib_64.h +++ b/arch/sparc/include/asm/oplib_64.h @@ -62,100 +62,100 @@ struct linux_mem_p1275 {  /* You must call prom_init() before using any of the library services,   * preferably as early as possible.  Pass it the romvec pointer.   */ -extern void prom_init(void *cif_handler, void *cif_stack); +void prom_init(void *cif_handler, void *cif_stack);  /* Boot argument acquisition, returns the boot command line string. */ -extern char *prom_getbootargs(void); +char *prom_getbootargs(void);  /* Miscellaneous routines, don't really fit in any category per se. */  /* Reboot the machine with the command line passed. */ -extern void prom_reboot(const char *boot_command); +void prom_reboot(const char *boot_command);  /* Evaluate the forth string passed. */ -extern void prom_feval(const char *forth_string); +void prom_feval(const char *forth_string);  /* Enter the prom, with possibility of continuation with the 'go'   * command in newer proms.   */ -extern void prom_cmdline(void); +void prom_cmdline(void);  /* Enter the prom, with no chance of continuation for the stand-alone   * which calls this.   */ -extern void prom_halt(void) __attribute__ ((noreturn)); +void prom_halt(void) __attribute__ ((noreturn));  /* Halt and power-off the machine. */ -extern void prom_halt_power_off(void) __attribute__ ((noreturn)); +void prom_halt_power_off(void) __attribute__ ((noreturn));  /* Acquire the IDPROM of the root node in the prom device tree.  This   * gets passed a buffer where you would like it stuffed.  The return value   * is the format type of this idprom or 0xff on error.   */ -extern unsigned char prom_get_idprom(char *idp_buffer, int idpbuf_size); +unsigned char prom_get_idprom(char *idp_buffer, int idpbuf_size);  /* Write a buffer of characters to the console. */ -extern void prom_console_write_buf(const char *buf, int len); +void prom_console_write_buf(const char *buf, int len);  /* Prom's internal routines, don't use in kernel/boot code. */ -extern __printf(1, 2) void prom_printf(const char *fmt, ...); -extern void prom_write(const char *buf, unsigned int len); +__printf(1, 2) void prom_printf(const char *fmt, ...); +void prom_write(const char *buf, unsigned int len);  /* Multiprocessor operations... */  #ifdef CONFIG_SMP  /* Start the CPU with the given device tree node at the passed program   * counter with the given arg passed in via register %o0.   */ -extern void prom_startcpu(int cpunode, unsigned long pc, unsigned long arg); +void prom_startcpu(int cpunode, unsigned long pc, unsigned long arg);  /* Start the CPU with the given cpu ID at the passed program   * counter with the given arg passed in via register %o0.   */ -extern void prom_startcpu_cpuid(int cpuid, unsigned long pc, unsigned long arg); +void prom_startcpu_cpuid(int cpuid, unsigned long pc, unsigned long arg);  /* Stop the CPU with the given cpu ID.  */ -extern void prom_stopcpu_cpuid(int cpuid); +void prom_stopcpu_cpuid(int cpuid);  /* Stop the current CPU. */ -extern void prom_stopself(void); +void prom_stopself(void);  /* Idle the current CPU. */ -extern void prom_idleself(void); +void prom_idleself(void);  /* Resume the CPU with the passed device tree node. */ -extern void prom_resumecpu(int cpunode); +void prom_resumecpu(int cpunode);  #endif  /* Power management interfaces. */  /* Put the current CPU to sleep. */ -extern void prom_sleepself(void); +void prom_sleepself(void);  /* Put the entire system to sleep. */ -extern int prom_sleepsystem(void); +int prom_sleepsystem(void);  /* Initiate a wakeup event. */ -extern int prom_wakeupsystem(void); +int prom_wakeupsystem(void);  /* MMU and memory related OBP interfaces. */  /* Get unique string identifying SIMM at given physical address. */ -extern int prom_getunumber(int syndrome_code, -			   unsigned long phys_addr, -			   char *buf, int buflen); +int prom_getunumber(int syndrome_code, +		    unsigned long phys_addr, +		    char *buf, int buflen);  /* Retain physical memory to the caller across soft resets. */ -extern int prom_retain(const char *name, unsigned long size, -		       unsigned long align, unsigned long *paddr); +int prom_retain(const char *name, unsigned long size, +		unsigned long align, unsigned long *paddr);  /* Load explicit I/D TLB entries into the calling processor. */ -extern long prom_itlb_load(unsigned long index, -			   unsigned long tte_data, -			   unsigned long vaddr); +long prom_itlb_load(unsigned long index, +		    unsigned long tte_data, +		    unsigned long vaddr); -extern long prom_dtlb_load(unsigned long index, -			   unsigned long tte_data, -			   unsigned long vaddr); +long prom_dtlb_load(unsigned long index, +		    unsigned long tte_data, +		    unsigned long vaddr);  /* Map/Unmap client program address ranges.  First the format of   * the mapping mode argument. @@ -170,81 +170,81 @@ extern long prom_dtlb_load(unsigned long index,  #define PROM_MAP_IE	0x0100 /* Invert-Endianness */  #define PROM_MAP_DEFAULT (PROM_MAP_WRITE | PROM_MAP_READ | PROM_MAP_EXEC | PROM_MAP_CACHED) -extern int prom_map(int mode, unsigned long size, -		    unsigned long vaddr, unsigned long paddr); -extern void prom_unmap(unsigned long size, unsigned long vaddr); +int prom_map(int mode, unsigned long size, +	     unsigned long vaddr, unsigned long paddr); +void prom_unmap(unsigned long size, unsigned long vaddr);  /* PROM device tree traversal functions... */  /* Get the child node of the given node, or zero if no child exists. */ -extern phandle prom_getchild(phandle parent_node); +phandle prom_getchild(phandle parent_node);  /* Get the next sibling node of the given node, or zero if no further   * siblings exist.   */ -extern phandle prom_getsibling(phandle node); +phandle prom_getsibling(phandle node);  /* Get the length, at the passed node, of the given property type.   * Returns -1 on error (ie. no such property at this node).   */ -extern int prom_getproplen(phandle thisnode, const char *property); +int prom_getproplen(phandle thisnode, const char *property);  /* Fetch the requested property using the given buffer.  Returns   * the number of bytes the prom put into your buffer or -1 on error.   */ -extern int prom_getproperty(phandle thisnode, const char *property, -			    char *prop_buffer, int propbuf_size); +int prom_getproperty(phandle thisnode, const char *property, +		     char *prop_buffer, int propbuf_size);  /* Acquire an integer property. */ -extern int prom_getint(phandle node, const char *property); +int prom_getint(phandle node, const char *property);  /* Acquire an integer property, with a default value. */ -extern int prom_getintdefault(phandle node, const char *property, int defval); +int prom_getintdefault(phandle node, const char *property, int defval);  /* Acquire a boolean property, 0=FALSE 1=TRUE. */ -extern int prom_getbool(phandle node, const char *prop); +int prom_getbool(phandle node, const char *prop);  /* Acquire a string property, null string on error. */ -extern void prom_getstring(phandle node, const char *prop, char *buf, -			   int bufsize); +void prom_getstring(phandle node, const char *prop, char *buf, +		    int bufsize);  /* Does the passed node have the given "name"? YES=1 NO=0 */ -extern int prom_nodematch(phandle thisnode, const char *name); +int prom_nodematch(phandle thisnode, const char *name);  /* Search all siblings starting at the passed node for "name" matching   * the given string.  Returns the node on success, zero on failure.   */ -extern phandle prom_searchsiblings(phandle node_start, const char *name); +phandle prom_searchsiblings(phandle node_start, const char *name);  /* Return the first property type, as a string, for the given node.   * Returns a null string on error. Buffer should be at least 32B long.   */ -extern char *prom_firstprop(phandle node, char *buffer); +char *prom_firstprop(phandle node, char *buffer);  /* Returns the next property after the passed property for the given   * node.  Returns null string on failure. Buffer should be at least 32B long.   */ -extern char *prom_nextprop(phandle node, const char *prev_property, char *buf); +char *prom_nextprop(phandle node, const char *prev_property, char *buf);  /* Returns 1 if the specified node has given property. */ -extern int prom_node_has_property(phandle node, const char *property); +int prom_node_has_property(phandle node, const char *property);  /* Returns phandle of the path specified */ -extern phandle prom_finddevice(const char *name); +phandle prom_finddevice(const char *name);  /* Set the indicated property at the given node with the passed value.   * Returns the number of bytes of your value that the prom took.   */ -extern int prom_setprop(phandle node, const char *prop_name, char *prop_value, -			int value_size); +int prom_setprop(phandle node, const char *prop_name, char *prop_value, +		 int value_size); -extern phandle prom_inst2pkg(int); -extern void prom_sun4v_guest_soft_state(void); +phandle prom_inst2pkg(int); +void prom_sun4v_guest_soft_state(void); -extern int prom_ihandle2path(int handle, char *buffer, int bufsize); +int prom_ihandle2path(int handle, char *buffer, int bufsize);  /* Client interface level routines. */ -extern void p1275_cmd_direct(unsigned long *); +void p1275_cmd_direct(unsigned long *);  #endif /* !(__SPARC64_OPLIB_H) */ diff --git a/arch/sparc/include/asm/page.h b/arch/sparc/include/asm/page.h index f21de034902..1be2fdec626 100644 --- a/arch/sparc/include/asm/page.h +++ b/arch/sparc/include/asm/page.h @@ -1,5 +1,8 @@  #ifndef ___ASM_SPARC_PAGE_H  #define ___ASM_SPARC_PAGE_H + +#define page_to_phys(page)	(page_to_pfn(page) << PAGE_SHIFT) +  #if defined(__sparc__) && defined(__arch64__)  #include <asm/page_64.h>  #else diff --git a/arch/sparc/include/asm/page_64.h b/arch/sparc/include/asm/page_64.h index e15538899f3..bf109984a03 100644 --- a/arch/sparc/include/asm/page_64.h +++ b/arch/sparc/include/asm/page_64.h @@ -15,7 +15,10 @@  #define DCACHE_ALIASING_POSSIBLE  #endif -#define HPAGE_SHIFT		22 +#define HPAGE_SHIFT		23 +#define REAL_HPAGE_SHIFT	22 + +#define REAL_HPAGE_SIZE		(_AC(1,UL) << REAL_HPAGE_SHIFT)  #if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)  #define HPAGE_SIZE		(_AC(1,UL) << HPAGE_SHIFT) @@ -28,17 +31,17 @@  #if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)  struct pt_regs; -extern void hugetlb_setup(struct pt_regs *regs); +void hugetlb_setup(struct pt_regs *regs);  #endif  #define WANT_PAGE_VIRTUAL -extern void _clear_page(void *page); +void _clear_page(void *page);  #define clear_page(X)	_clear_page((void *)(X))  struct page; -extern void clear_user_page(void *addr, unsigned long vaddr, struct page *page); +void clear_user_page(void *addr, unsigned long vaddr, struct page *page);  #define copy_page(X,Y)	memcpy((void *)(X), (void *)(Y), PAGE_SIZE) -extern void copy_user_page(void *to, void *from, unsigned long vaddr, struct page *topage); +void copy_user_page(void *to, void *from, unsigned long vaddr, struct page *topage);  /* Unlike sparc32, sparc64's parameter passing API is more   * sane in that structures which as small enough are passed @@ -53,8 +56,8 @@ extern void copy_user_page(void *to, void *from, unsigned long vaddr, struct pag  /* These are used to make use of C type-checking.. */  typedef struct { unsigned long pte; } pte_t;  typedef struct { unsigned long iopte; } iopte_t; -typedef struct { unsigned int pmd; } pmd_t; -typedef struct { unsigned int pgd; } pgd_t; +typedef struct { unsigned long pmd; } pmd_t; +typedef struct { unsigned long pgd; } pgd_t;  typedef struct { unsigned long pgprot; } pgprot_t;  #define pte_val(x)	((x).pte) @@ -73,8 +76,8 @@ typedef struct { unsigned long pgprot; } pgprot_t;  /* .. while these make it easier on the compiler */  typedef unsigned long pte_t;  typedef unsigned long iopte_t; -typedef unsigned int pmd_t; -typedef unsigned int pgd_t; +typedef unsigned long pmd_t; +typedef unsigned long pgd_t;  typedef unsigned long pgprot_t;  #define pte_val(x)	(x) @@ -93,18 +96,44 @@ typedef unsigned long pgprot_t;  typedef pte_t *pgtable_t; +/* These two values define the virtual address space range in which we + * must forbid 64-bit user processes from making mappings.  It used to + * represent precisely the virtual address space hole present in most + * early sparc64 chips including UltraSPARC-I.  But now it also is + * further constrained by the limits of our page tables, which is + * 43-bits of virtual address. + */ +#define SPARC64_VA_HOLE_TOP	_AC(0xfffffc0000000000,UL) +#define SPARC64_VA_HOLE_BOTTOM	_AC(0x0000040000000000,UL) + +/* The next two defines specify the actual exclusion region we + * enforce, wherein we use a 4GB red zone on each side of the VA hole. + */ +#define VA_EXCLUDE_START (SPARC64_VA_HOLE_BOTTOM - (1UL << 32UL)) +#define VA_EXCLUDE_END   (SPARC64_VA_HOLE_TOP + (1UL << 32UL)) +  #define TASK_UNMAPPED_BASE	(test_thread_flag(TIF_32BIT) ? \ -				 (_AC(0x0000000070000000,UL)) : \ -				 (_AC(0xfffff80000000000,UL) + (1UL << 32UL))) +				 _AC(0x0000000070000000,UL) : \ +				 VA_EXCLUDE_END)  #include <asm-generic/memory_model.h> +#define PAGE_OFFSET_BY_BITS(X)	(-(_AC(1,UL) << (X))) +extern unsigned long PAGE_OFFSET; +  #endif /* !(__ASSEMBLY__) */ -/* We used to stick this into a hard-coded global register (%g4) - * but that does not make sense anymore. +/* The maximum number of physical memory address bits we support, this + * is used to size various tables used to manage kernel TLB misses and + * also the sparsemem code. + */ +#define MAX_PHYS_ADDRESS_BITS	47 + +/* These two shift counts are used when indexing sparc64_valid_addr_bitmap + * and kpte_linear_bitmap.   */ -#define PAGE_OFFSET		_AC(0xFFFFF80000000000,UL) +#define ILOG2_4MB		22 +#define ILOG2_256MB		28  #ifndef __ASSEMBLY__ diff --git a/arch/sparc/include/asm/pci_32.h b/arch/sparc/include/asm/pci_32.h index dc503297481..53e9b4987db 100644 --- a/arch/sparc/include/asm/pci_32.h +++ b/arch/sparc/include/asm/pci_32.h @@ -16,11 +16,6 @@  #define PCI_IRQ_NONE		0xffffffff -static inline void pcibios_penalize_isa_irq(int irq, int active) -{ -	/* We don't do dynamic PCI IRQ allocation */ -} -  /* Dynamic DMA mapping stuff.   */  #define PCI_DMA_BUS_IS_PHYS	(0) diff --git a/arch/sparc/include/asm/pci_64.h b/arch/sparc/include/asm/pci_64.h index 1633b718d3b..bd00a622616 100644 --- a/arch/sparc/include/asm/pci_64.h +++ b/arch/sparc/include/asm/pci_64.h @@ -16,11 +16,6 @@  #define PCI_IRQ_NONE		0xffffffff -static inline void pcibios_penalize_isa_irq(int irq, int active) -{ -	/* We don't do dynamic PCI IRQ allocation */ -} -  /* The PCI address space does not equal the physical memory   * address space.  The networking and block device layers use   * this boolean for bounce buffer decisions. @@ -57,7 +52,7 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev,  /* Return the index of the PCI controller for device PDEV. */ -extern int pci_domain_nr(struct pci_bus *bus); +int pci_domain_nr(struct pci_bus *bus);  static inline int pci_proc_domain(struct pci_bus *bus)  {  	return 1; @@ -69,9 +64,9 @@ static inline int pci_proc_domain(struct pci_bus *bus)  #define HAVE_ARCH_PCI_GET_UNMAPPED_AREA  #define get_pci_unmapped_area get_fb_unmapped_area -extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, -			       enum pci_mmap_state mmap_state, -			       int write_combine); +int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, +			enum pci_mmap_state mmap_state, +			int write_combine);  static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)  { @@ -79,9 +74,9 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)  }  #define HAVE_ARCH_PCI_RESOURCE_TO_USER -extern void pci_resource_to_user(const struct pci_dev *dev, int bar, -				 const struct resource *rsrc, -				 resource_size_t *start, resource_size_t *end); +void pci_resource_to_user(const struct pci_dev *dev, int bar, +			  const struct resource *rsrc, +			  resource_size_t *start, resource_size_t *end);  #endif /* __KERNEL__ */  #endif /* __SPARC64_PCI_H */ diff --git a/arch/sparc/include/asm/pcic.h b/arch/sparc/include/asm/pcic.h index 6676cbcc8b6..f4170679259 100644 --- a/arch/sparc/include/asm/pcic.h +++ b/arch/sparc/include/asm/pcic.h @@ -30,10 +30,10 @@ struct linux_pcic {  };  #ifdef CONFIG_PCIC_PCI -extern int pcic_present(void); -extern int pcic_probe(void); -extern void pci_time_init(void); -extern void sun4m_pci_init_IRQ(void); +int pcic_present(void); +int pcic_probe(void); +void pci_time_init(void); +void sun4m_pci_init_IRQ(void);  #else  static inline int pcic_present(void) { return 0; }  static inline int pcic_probe(void) { return 0; } diff --git a/arch/sparc/include/asm/pcr.h b/arch/sparc/include/asm/pcr.h index 942bb17f60c..cdf800c3326 100644 --- a/arch/sparc/include/asm/pcr.h +++ b/arch/sparc/include/asm/pcr.h @@ -12,8 +12,8 @@ struct pcr_ops {  };  extern const struct pcr_ops *pcr_ops; -extern void deferred_pcr_work_irq(int irq, struct pt_regs *regs); -extern void schedule_deferred_pcr_work(void); +void deferred_pcr_work_irq(int irq, struct pt_regs *regs); +void schedule_deferred_pcr_work(void);  #define PCR_PIC_PRIV		0x00000001 /* PIC access is privileged */  #define PCR_STRACE		0x00000002 /* Trace supervisor events  */ @@ -45,6 +45,6 @@ extern void schedule_deferred_pcr_work(void);  #define PCR_N4_PICNHT		0x00020000 /* PIC non-hypervisor trap  */  #define PCR_N4_NTC		0x00040000 /* Next-To-Commit wrap      */ -extern int pcr_arch_init(void); +int pcr_arch_init(void);  #endif /* __PCR_H */ diff --git a/arch/sparc/include/asm/pgalloc_32.h b/arch/sparc/include/asm/pgalloc_32.h index 9b1c36de0f1..a3890da9442 100644 --- a/arch/sparc/include/asm/pgalloc_32.h +++ b/arch/sparc/include/asm/pgalloc_32.h @@ -14,6 +14,8 @@ struct page;  void *srmmu_get_nocache(int size, int align);  void srmmu_free_nocache(void *addr, int size); +extern struct resource sparc_iomap; +  #define check_pgt_cache()	do { } while (0)  pgd_t *get_pgd_fast(void); diff --git a/arch/sparc/include/asm/pgalloc_64.h b/arch/sparc/include/asm/pgalloc_64.h index bcfe063bce2..39a7ac49b00 100644 --- a/arch/sparc/include/asm/pgalloc_64.h +++ b/arch/sparc/include/asm/pgalloc_64.h @@ -38,12 +38,12 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)  	kmem_cache_free(pgtable_cache, pmd);  } -extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, -				   unsigned long address); -extern pgtable_t pte_alloc_one(struct mm_struct *mm, -			       unsigned long address); -extern void pte_free_kernel(struct mm_struct *mm, pte_t *pte); -extern void pte_free(struct mm_struct *mm, pgtable_t ptepage); +pte_t *pte_alloc_one_kernel(struct mm_struct *mm, +			    unsigned long address); +pgtable_t pte_alloc_one(struct mm_struct *mm, +			unsigned long address); +void pte_free_kernel(struct mm_struct *mm, pte_t *pte); +void pte_free(struct mm_struct *mm, pgtable_t ptepage);  #define pmd_populate_kernel(MM, PMD, PTE)	pmd_set(MM, PMD, PTE)  #define pmd_populate(MM, PMD, PTE)		pmd_set(MM, PMD, PTE) @@ -51,12 +51,12 @@ extern void pte_free(struct mm_struct *mm, pgtable_t ptepage);  #define check_pgt_cache()	do { } while (0) -extern void pgtable_free(void *table, bool is_page); +void pgtable_free(void *table, bool is_page);  #ifdef CONFIG_SMP  struct mmu_gather; -extern void tlb_remove_table(struct mmu_gather *, void *); +void tlb_remove_table(struct mmu_gather *, void *);  static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, bool is_page)  { diff --git a/arch/sparc/include/asm/pgtable_32.h b/arch/sparc/include/asm/pgtable_32.h index 502f632f6cc..b9b91ae19fe 100644 --- a/arch/sparc/include/asm/pgtable_32.h +++ b/arch/sparc/include/asm/pgtable_32.h @@ -25,8 +25,9 @@  struct vm_area_struct;  struct page; -extern void load_mmu(void); -extern unsigned long calc_highpages(void); +void load_mmu(void); +unsigned long calc_highpages(void); +unsigned long __init bootmem_init(unsigned long *pages_avail);  #define pte_ERROR(e)   __builtin_trap()  #define pmd_ERROR(e)   __builtin_trap() @@ -56,7 +57,7 @@ extern unsigned long calc_highpages(void);   * srmmu.c will assign the real one (which is dynamically sized) */  #define swapper_pg_dir NULL -extern void paging_init(void); +void paging_init(void);  extern unsigned long ptr_in_current_pgd; @@ -428,8 +429,8 @@ extern unsigned long *sparc_valid_addr_bitmap;  #define GET_IOSPACE(pfn)		(pfn >> (BITS_PER_LONG - 4))  #define GET_PFN(pfn)			(pfn & 0x0fffffffUL) -extern int remap_pfn_range(struct vm_area_struct *, unsigned long, unsigned long, -			   unsigned long, pgprot_t); +int remap_pfn_range(struct vm_area_struct *, unsigned long, unsigned long, +		    unsigned long, pgprot_t);  static inline int io_remap_pfn_range(struct vm_area_struct *vma,  				     unsigned long from, unsigned long pfn, diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h index 36760317814..3770bf5c6e1 100644 --- a/arch/sparc/include/asm/pgtable_64.h +++ b/arch/sparc/include/asm/pgtable_64.h @@ -24,7 +24,8 @@  /* The kernel image occupies 0x4000000 to 0x6000000 (4MB --> 96MB).   * The page copy blockops can use 0x6000000 to 0x8000000. - * The TSB is mapped in the 0x8000000 to 0xa000000 range. + * The 8K TSB is mapped in the 0x8000000 to 0x8400000 range. + * The 4M TSB is mapped in the 0x8400000 to 0x8800000 range.   * The PROM resides in an area spanning 0xf0000000 to 0x100000000.   * The vmalloc area spans 0x100000000 to 0x200000000.   * Since modules need to be in the lowest 32-bits of the address space, @@ -33,7 +34,8 @@   * 0x400000000.   */  #define	TLBTEMP_BASE		_AC(0x0000000006000000,UL) -#define	TSBMAP_BASE		_AC(0x0000000008000000,UL) +#define	TSBMAP_8K_BASE		_AC(0x0000000008000000,UL) +#define	TSBMAP_4M_BASE		_AC(0x0000000008400000,UL)  #define MODULES_VADDR		_AC(0x0000000010000000,UL)  #define MODULES_LEN		_AC(0x00000000e0000000,UL)  #define MODULES_END		_AC(0x00000000f0000000,UL) @@ -48,18 +50,18 @@  /* PMD_SHIFT determines the size of the area a second-level page   * table can map   */ -#define PMD_SHIFT	(PAGE_SHIFT + (PAGE_SHIFT-4)) +#define PMD_SHIFT	(PAGE_SHIFT + (PAGE_SHIFT-3))  #define PMD_SIZE	(_AC(1,UL) << PMD_SHIFT)  #define PMD_MASK	(~(PMD_SIZE-1)) -#define PMD_BITS	(PAGE_SHIFT - 2) +#define PMD_BITS	(PAGE_SHIFT - 3)  /* PGDIR_SHIFT determines what a third-level page table entry can map */ -#define PGDIR_SHIFT	(PAGE_SHIFT + (PAGE_SHIFT-4) + PMD_BITS) +#define PGDIR_SHIFT	(PAGE_SHIFT + (PAGE_SHIFT-3) + PMD_BITS)  #define PGDIR_SIZE	(_AC(1,UL) << PGDIR_SHIFT)  #define PGDIR_MASK	(~(PGDIR_SIZE-1)) -#define PGDIR_BITS	(PAGE_SHIFT - 2) +#define PGDIR_BITS	(PAGE_SHIFT - 3) -#if (PGDIR_SHIFT + PGDIR_BITS) != 44 +#if (PGDIR_SHIFT + PGDIR_BITS) != 43  #error Page table parameters do not cover virtual address space properly.  #endif @@ -67,44 +69,41 @@  #error PMD_SHIFT must equal HPAGE_SHIFT for transparent huge pages.  #endif -/* PMDs point to PTE tables which are 4K aligned.  */ -#define PMD_PADDR	_AC(0xfffffffe,UL) -#define PMD_PADDR_SHIFT	_AC(11,UL) +#ifndef __ASSEMBLY__ -#define PMD_ISHUGE	_AC(0x00000001,UL) +#include <linux/sched.h> -/* This is the PMD layout when PMD_ISHUGE is set.  With 4MB huge - * pages, this frees up a bunch of bits in the layout that we can - * use for the protection settings and software metadata. - */ -#define PMD_HUGE_PADDR		_AC(0xfffff800,UL) -#define PMD_HUGE_PROTBITS	_AC(0x000007ff,UL) -#define PMD_HUGE_PRESENT	_AC(0x00000400,UL) -#define PMD_HUGE_WRITE		_AC(0x00000200,UL) -#define PMD_HUGE_DIRTY		_AC(0x00000100,UL) -#define PMD_HUGE_ACCESSED	_AC(0x00000080,UL) -#define PMD_HUGE_EXEC		_AC(0x00000040,UL) -#define PMD_HUGE_SPLITTING	_AC(0x00000020,UL) - -/* PGDs point to PMD tables which are 8K aligned.  */ -#define PGD_PADDR	_AC(0xfffffffc,UL) -#define PGD_PADDR_SHIFT	_AC(11,UL) +extern unsigned long sparc64_valid_addr_bitmap[]; -#ifndef __ASSEMBLY__ +/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ +static inline bool __kern_addr_valid(unsigned long paddr) +{ +	if ((paddr >> MAX_PHYS_ADDRESS_BITS) != 0UL) +		return false; +	return test_bit(paddr >> ILOG2_4MB, sparc64_valid_addr_bitmap); +} -#include <linux/sched.h> +static inline bool kern_addr_valid(unsigned long addr) +{ +	unsigned long paddr = __pa(addr); + +	return __kern_addr_valid(paddr); +}  /* Entries per page directory level. */ -#define PTRS_PER_PTE	(1UL << (PAGE_SHIFT-4)) +#define PTRS_PER_PTE	(1UL << (PAGE_SHIFT-3))  #define PTRS_PER_PMD	(1UL << PMD_BITS)  #define PTRS_PER_PGD	(1UL << PGDIR_BITS)  /* Kernel has a separate 44bit address space. */  #define FIRST_USER_ADDRESS	0 -#define pte_ERROR(e)	__builtin_trap() -#define pmd_ERROR(e)	__builtin_trap() -#define pgd_ERROR(e)	__builtin_trap() +#define pmd_ERROR(e)							\ +	pr_err("%s:%d: bad pmd %p(%016lx) seen at (%pS)\n",		\ +	       __FILE__, __LINE__, &(e), pmd_val(e), __builtin_return_address(0)) +#define pgd_ERROR(e)							\ +	pr_err("%s:%d: bad pgd %p(%016lx) seen at (%pS)\n",		\ +	       __FILE__, __LINE__, &(e), pgd_val(e), __builtin_return_address(0))  #endif /* !(__ASSEMBLY__) */ @@ -112,6 +111,7 @@  #define _PAGE_VALID	  _AC(0x8000000000000000,UL) /* Valid TTE            */  #define _PAGE_R	  	  _AC(0x8000000000000000,UL) /* Keep ref bit uptodate*/  #define _PAGE_SPECIAL     _AC(0x0200000000000000,UL) /* Special page         */ +#define _PAGE_PMD_HUGE    _AC(0x0100000000000000,UL) /* Huge page            */  /* Advertise support for _PAGE_SPECIAL */  #define __HAVE_ARCH_PTE_SPECIAL @@ -125,6 +125,7 @@  #define _PAGE_IE_4U	  _AC(0x0800000000000000,UL) /* Invert Endianness    */  #define _PAGE_SOFT2_4U	  _AC(0x07FC000000000000,UL) /* Software bits, set 2 */  #define _PAGE_SPECIAL_4U  _AC(0x0200000000000000,UL) /* Special page         */ +#define _PAGE_PMD_HUGE_4U _AC(0x0100000000000000,UL) /* Huge page            */  #define _PAGE_RES1_4U	  _AC(0x0002000000000000,UL) /* Reserved             */  #define _PAGE_SZ32MB_4U	  _AC(0x0001000000000000,UL) /* (Panther) 32MB page  */  #define _PAGE_SZ256MB_4U  _AC(0x2001000000000000,UL) /* (Panther) 256MB page */ @@ -155,6 +156,7 @@  #define _PAGE_READ_4V	  _AC(0x0800000000000000,UL) /* Readable SW Bit      */  #define _PAGE_WRITE_4V	  _AC(0x0400000000000000,UL) /* Writable SW Bit      */  #define _PAGE_SPECIAL_4V  _AC(0x0200000000000000,UL) /* Special page         */ +#define _PAGE_PMD_HUGE_4V _AC(0x0100000000000000,UL) /* Huge page            */  #define _PAGE_PADDR_4V	  _AC(0x00FFFFFFFFFFE000,UL) /* paddr[55:13]         */  #define _PAGE_IE_4V	  _AC(0x0000000000001000,UL) /* Invert Endianness    */  #define _PAGE_E_4V	  _AC(0x0000000000000800,UL) /* side-Effect          */ @@ -180,6 +182,10 @@  #define _PAGE_SZBITS_4U	_PAGE_SZ8K_4U  #define _PAGE_SZBITS_4V	_PAGE_SZ8K_4V +#if REAL_HPAGE_SHIFT != 22 +#error REAL_HPAGE_SHIFT and _PAGE_SZHUGE_foo must match up +#endif +  #define _PAGE_SZHUGE_4U	_PAGE_SZ4MB_4U  #define _PAGE_SZHUGE_4V	_PAGE_SZ4MB_4V @@ -204,9 +210,9 @@  #ifndef __ASSEMBLY__ -extern pte_t mk_pte_io(unsigned long, pgprot_t, int, unsigned long); +pte_t mk_pte_io(unsigned long, pgprot_t, int, unsigned long); -extern unsigned long pte_sz_bits(unsigned long size); +unsigned long pte_sz_bits(unsigned long size);  extern pgprot_t PAGE_KERNEL;  extern pgprot_t PAGE_KERNEL_LOCKED; @@ -239,16 +245,13 @@ static inline pte_t pfn_pte(unsigned long pfn, pgprot_t prot)  #define mk_pte(page, pgprot)	pfn_pte(page_to_pfn(page), (pgprot))  #ifdef CONFIG_TRANSPARENT_HUGEPAGE -extern pmd_t pfn_pmd(unsigned long page_nr, pgprot_t pgprot); -#define mk_pmd(page, pgprot)	pfn_pmd(page_to_pfn(page), (pgprot)) - -extern pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot); - -static inline pmd_t pmd_mkhuge(pmd_t pmd) +static inline pmd_t pfn_pmd(unsigned long page_nr, pgprot_t pgprot)  { -	/* Do nothing, mk_pmd() does this part.  */ -	return pmd; +	pte_t pte = pfn_pte(page_nr, pgprot); + +	return __pmd(pte_val(pte));  } +#define mk_pmd(page, pgprot)	pfn_pmd(page_to_pfn(page), (pgprot))  #endif  /* This one can be done with two shifts.  */ @@ -277,8 +280,8 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t prot)  {  	unsigned long mask, tmp; -	/* SUN4U: 0x600307ffffffecb8 (negated == 0x9ffcf80000001347) -	 * SUN4V: 0x30ffffffffffee17 (negated == 0xcf000000000011e8) +	/* SUN4U: 0x630107ffffffec38 (negated == 0x9cfef800000013c7) +	 * SUN4V: 0x33ffffffffffee07 (negated == 0xcc000000000011f8)  	 *  	 * Even if we use negation tricks the result is still a 6  	 * instruction sequence, so don't try to play fancy and just @@ -308,15 +311,26 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t prot)  	"	.previous\n"  	: "=r" (mask), "=r" (tmp)  	: "i" (_PAGE_PADDR_4U | _PAGE_MODIFIED_4U | _PAGE_ACCESSED_4U | -	       _PAGE_CP_4U | _PAGE_CV_4U | _PAGE_E_4U | _PAGE_PRESENT_4U | -	       _PAGE_SPECIAL), +	       _PAGE_CP_4U | _PAGE_CV_4U | _PAGE_E_4U | +	       _PAGE_SPECIAL | _PAGE_PMD_HUGE | _PAGE_SZALL_4U),  	  "i" (_PAGE_PADDR_4V | _PAGE_MODIFIED_4V | _PAGE_ACCESSED_4V | -	       _PAGE_CP_4V | _PAGE_CV_4V | _PAGE_E_4V | _PAGE_PRESENT_4V | -	       _PAGE_SPECIAL)); +	       _PAGE_CP_4V | _PAGE_CV_4V | _PAGE_E_4V | +	       _PAGE_SPECIAL | _PAGE_PMD_HUGE | _PAGE_SZALL_4V));  	return __pte((pte_val(pte) & mask) | (pgprot_val(prot) & ~mask));  } +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot) +{ +	pte_t pte = __pte(pmd_val(pmd)); + +	pte = pte_modify(pte, newprot); + +	return __pmd(pte_val(pte)); +} +#endif +  static inline pte_t pgoff_to_pte(unsigned long off)  {  	off <<= PAGE_SHIFT; @@ -357,7 +371,7 @@ static inline pgprot_t pgprot_noncached(pgprot_t prot)   */  #define pgprot_noncached pgprot_noncached -#ifdef CONFIG_HUGETLB_PAGE +#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)  static inline pte_t pte_mkhuge(pte_t pte)  {  	unsigned long mask; @@ -375,6 +389,17 @@ static inline pte_t pte_mkhuge(pte_t pte)  	return __pte(pte_val(pte) | mask);  } +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +static inline pmd_t pmd_mkhuge(pmd_t pmd) +{ +	pte_t pte = __pte(pmd_val(pmd)); + +	pte = pte_mkhuge(pte); +	pte_val(pte) |= _PAGE_PMD_HUGE; + +	return __pmd(pte_val(pte)); +} +#endif  #endif  static inline pte_t pte_mkdirty(pte_t pte) @@ -616,7 +641,7 @@ static inline unsigned long pte_present(pte_t pte)  }  #define pte_accessible pte_accessible -static inline unsigned long pte_accessible(pte_t a) +static inline unsigned long pte_accessible(struct mm_struct *mm, pte_t a)  {  	return pte_val(a) & _PAGE_VALID;  } @@ -626,98 +651,137 @@ static inline unsigned long pte_special(pte_t pte)  	return pte_val(pte) & _PAGE_SPECIAL;  } -static inline int pmd_large(pmd_t pmd) +static inline unsigned long pmd_large(pmd_t pmd)  { -	return (pmd_val(pmd) & (PMD_ISHUGE | PMD_HUGE_PRESENT)) == -		(PMD_ISHUGE | PMD_HUGE_PRESENT); +	pte_t pte = __pte(pmd_val(pmd)); + +	return pte_val(pte) & _PAGE_PMD_HUGE;  }  #ifdef CONFIG_TRANSPARENT_HUGEPAGE -static inline int pmd_young(pmd_t pmd) +static inline unsigned long pmd_young(pmd_t pmd)  { -	return pmd_val(pmd) & PMD_HUGE_ACCESSED; +	pte_t pte = __pte(pmd_val(pmd)); + +	return pte_young(pte);  } -static inline int pmd_write(pmd_t pmd) +static inline unsigned long pmd_write(pmd_t pmd)  { -	return pmd_val(pmd) & PMD_HUGE_WRITE; +	pte_t pte = __pte(pmd_val(pmd)); + +	return pte_write(pte);  }  static inline unsigned long pmd_pfn(pmd_t pmd)  { -	unsigned long val = pmd_val(pmd) & PMD_HUGE_PADDR; +	pte_t pte = __pte(pmd_val(pmd)); -	return val >> (PAGE_SHIFT - PMD_PADDR_SHIFT); +	return pte_pfn(pte);  } -static inline int pmd_trans_splitting(pmd_t pmd) +static inline unsigned long pmd_trans_huge(pmd_t pmd)  { -	return (pmd_val(pmd) & (PMD_ISHUGE|PMD_HUGE_SPLITTING)) == -		(PMD_ISHUGE|PMD_HUGE_SPLITTING); +	pte_t pte = __pte(pmd_val(pmd)); + +	return pte_val(pte) & _PAGE_PMD_HUGE;  } -static inline int pmd_trans_huge(pmd_t pmd) +static inline unsigned long pmd_trans_splitting(pmd_t pmd)  { -	return pmd_val(pmd) & PMD_ISHUGE; +	pte_t pte = __pte(pmd_val(pmd)); + +	return pmd_trans_huge(pmd) && pte_special(pte);  }  #define has_transparent_hugepage() 1  static inline pmd_t pmd_mkold(pmd_t pmd)  { -	pmd_val(pmd) &= ~PMD_HUGE_ACCESSED; -	return pmd; +	pte_t pte = __pte(pmd_val(pmd)); + +	pte = pte_mkold(pte); + +	return __pmd(pte_val(pte));  }  static inline pmd_t pmd_wrprotect(pmd_t pmd)  { -	pmd_val(pmd) &= ~PMD_HUGE_WRITE; -	return pmd; +	pte_t pte = __pte(pmd_val(pmd)); + +	pte = pte_wrprotect(pte); + +	return __pmd(pte_val(pte));  }  static inline pmd_t pmd_mkdirty(pmd_t pmd)  { -	pmd_val(pmd) |= PMD_HUGE_DIRTY; -	return pmd; +	pte_t pte = __pte(pmd_val(pmd)); + +	pte = pte_mkdirty(pte); + +	return __pmd(pte_val(pte));  }  static inline pmd_t pmd_mkyoung(pmd_t pmd)  { -	pmd_val(pmd) |= PMD_HUGE_ACCESSED; -	return pmd; +	pte_t pte = __pte(pmd_val(pmd)); + +	pte = pte_mkyoung(pte); + +	return __pmd(pte_val(pte));  }  static inline pmd_t pmd_mkwrite(pmd_t pmd)  { -	pmd_val(pmd) |= PMD_HUGE_WRITE; -	return pmd; -} +	pte_t pte = __pte(pmd_val(pmd)); -static inline pmd_t pmd_mknotpresent(pmd_t pmd) -{ -	pmd_val(pmd) &= ~PMD_HUGE_PRESENT; -	return pmd; +	pte = pte_mkwrite(pte); + +	return __pmd(pte_val(pte));  }  static inline pmd_t pmd_mksplitting(pmd_t pmd)  { -	pmd_val(pmd) |= PMD_HUGE_SPLITTING; -	return pmd; +	pte_t pte = __pte(pmd_val(pmd)); + +	pte = pte_mkspecial(pte); + +	return __pmd(pte_val(pte));  } -extern pgprot_t pmd_pgprot(pmd_t entry); +static inline pgprot_t pmd_pgprot(pmd_t entry) +{ +	unsigned long val = pmd_val(entry); + +	return __pgprot(val); +}  #endif  static inline int pmd_present(pmd_t pmd)  { -	return pmd_val(pmd) != 0U; +	return pmd_val(pmd) != 0UL;  }  #define pmd_none(pmd)			(!pmd_val(pmd)) +/* pmd_bad() is only called on non-trans-huge PMDs.  Our encoding is + * very simple, it's just the physical address.  PTE tables are of + * size PAGE_SIZE so make sure the sub-PAGE_SIZE bits are clear and + * the top bits outside of the range of any physical address size we + * support are clear as well.  We also validate the physical itself. + */ +#define pmd_bad(pmd)			((pmd_val(pmd) & ~PAGE_MASK) || \ +					 !__kern_addr_valid(pmd_val(pmd))) + +#define pud_none(pud)			(!pud_val(pud)) + +#define pud_bad(pud)			((pud_val(pud) & ~PAGE_MASK) || \ +					 !__kern_addr_valid(pud_val(pud))) +  #ifdef CONFIG_TRANSPARENT_HUGEPAGE -extern void set_pmd_at(struct mm_struct *mm, unsigned long addr, -		       pmd_t *pmdp, pmd_t pmd); +void set_pmd_at(struct mm_struct *mm, unsigned long addr, +		pmd_t *pmdp, pmd_t pmd);  #else  static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,  			      pmd_t *pmdp, pmd_t pmd) @@ -728,33 +792,29 @@ static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,  static inline void pmd_set(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep)  { -	unsigned long val = __pa((unsigned long) (ptep)) >> PMD_PADDR_SHIFT; +	unsigned long val = __pa((unsigned long) (ptep));  	pmd_val(*pmdp) = val;  }  #define pud_set(pudp, pmdp)	\ -	(pud_val(*(pudp)) = (__pa((unsigned long) (pmdp)) >> PGD_PADDR_SHIFT)) +	(pud_val(*(pudp)) = (__pa((unsigned long) (pmdp))))  static inline unsigned long __pmd_page(pmd_t pmd)  { -	unsigned long paddr = (unsigned long) pmd_val(pmd); -#ifdef CONFIG_TRANSPARENT_HUGEPAGE -	if (pmd_val(pmd) & PMD_ISHUGE) -		paddr &= PMD_HUGE_PADDR; -#endif -	paddr <<= PMD_PADDR_SHIFT; -	return ((unsigned long) __va(paddr)); +	pte_t pte = __pte(pmd_val(pmd)); +	unsigned long pfn; + +	pfn = pte_pfn(pte); + +	return ((unsigned long) __va(pfn << PAGE_SHIFT));  }  #define pmd_page(pmd) 			virt_to_page((void *)__pmd_page(pmd))  #define pud_page_vaddr(pud)		\ -	((unsigned long) __va((((unsigned long)pud_val(pud))<<PGD_PADDR_SHIFT))) +	((unsigned long) __va(pud_val(pud)))  #define pud_page(pud) 			virt_to_page((void *)pud_page_vaddr(pud)) -#define pmd_bad(pmd)			(0) -#define pmd_clear(pmdp)			(pmd_val(*(pmdp)) = 0U) -#define pud_none(pud)			(!pud_val(pud)) -#define pud_bad(pud)			(0) +#define pmd_clear(pmdp)			(pmd_val(*(pmdp)) = 0UL)  #define pud_present(pud)		(pud_val(pud) != 0U) -#define pud_clear(pudp)			(pud_val(*(pudp)) = 0U) +#define pud_clear(pudp)			(pud_val(*(pudp)) = 0UL)  /* Same in both SUN4V and SUN4U.  */  #define pte_none(pte) 			(!pte_val(pte)) @@ -780,8 +840,8 @@ static inline unsigned long __pmd_page(pmd_t pmd)  #define pte_unmap(pte)			do { } while (0)  /* Actual page table PTE updates.  */ -extern void tlb_batch_add(struct mm_struct *mm, unsigned long vaddr, -			  pte_t *ptep, pte_t orig, int fullmm); +void tlb_batch_add(struct mm_struct *mm, unsigned long vaddr, +		   pte_t *ptep, pte_t orig, int fullmm);  #define __HAVE_ARCH_PMDP_GET_AND_CLEAR  static inline pmd_t pmdp_get_and_clear(struct mm_struct *mm, @@ -789,7 +849,7 @@ static inline pmd_t pmdp_get_and_clear(struct mm_struct *mm,  				       pmd_t *pmdp)  {  	pmd_t pmd = *pmdp; -	set_pmd_at(mm, addr, pmdp, __pmd(0U)); +	set_pmd_at(mm, addr, pmdp, __pmd(0UL));  	return pmd;  } @@ -806,7 +866,7 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,  	 * SUN4V NOTE: _PAGE_VALID is the same value in both the SUN4U  	 *             and SUN4V pte layout, so this inline test is fine.  	 */ -	if (likely(mm != &init_mm) && pte_accessible(orig)) +	if (likely(mm != &init_mm) && pte_accessible(mm, orig))  		tlb_batch_add(mm, addr, ptep, orig, fullmm);  } @@ -837,27 +897,31 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,  })  #endif -extern pgd_t swapper_pg_dir[2048]; -extern pmd_t swapper_low_pmd_dir[2048]; +extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; +extern pmd_t swapper_low_pmd_dir[PTRS_PER_PMD]; -extern void paging_init(void); -extern unsigned long find_ecache_flush_span(unsigned long size); +void paging_init(void); +unsigned long find_ecache_flush_span(unsigned long size);  struct seq_file; -extern void mmu_info(struct seq_file *); +void mmu_info(struct seq_file *);  struct vm_area_struct; -extern void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t *); +void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t *);  #ifdef CONFIG_TRANSPARENT_HUGEPAGE -extern void update_mmu_cache_pmd(struct vm_area_struct *vma, unsigned long addr, -				 pmd_t *pmd); +void update_mmu_cache_pmd(struct vm_area_struct *vma, unsigned long addr, +			  pmd_t *pmd); + +#define __HAVE_ARCH_PMDP_INVALIDATE +extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, +			    pmd_t *pmdp);  #define __HAVE_ARCH_PGTABLE_DEPOSIT -extern void pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp, -				       pgtable_t pgtable); +void pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp, +				pgtable_t pgtable);  #define __HAVE_ARCH_PGTABLE_WITHDRAW -extern pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp); +pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp);  #endif  /* Encode and de-code a swap entry */ @@ -873,24 +937,12 @@ extern pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp);  #define __swp_entry_to_pte(x)		((pte_t) { (x).val })  /* File offset in PTE support. */ -extern unsigned long pte_file(pte_t); +unsigned long pte_file(pte_t);  #define pte_to_pgoff(pte)	(pte_val(pte) >> PAGE_SHIFT) -extern pte_t pgoff_to_pte(unsigned long); +pte_t pgoff_to_pte(unsigned long);  #define PTE_FILE_MAX_BITS	(64UL - PAGE_SHIFT - 1UL) -extern unsigned long sparc64_valid_addr_bitmap[]; - -/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ -static inline bool kern_addr_valid(unsigned long addr) -{ -	unsigned long paddr = __pa(addr); - -	if ((paddr >> 41UL) != 0UL) -		return false; -	return test_bit(paddr >> 22, sparc64_valid_addr_bitmap); -} - -extern int page_in_phys_avail(unsigned long paddr); +int page_in_phys_avail(unsigned long paddr);  /*   * For sparc32&64, the pfn in io_remap_pfn_range() carries <iospace> in @@ -900,8 +952,8 @@ extern int page_in_phys_avail(unsigned long paddr);  #define GET_IOSPACE(pfn)		(pfn >> (BITS_PER_LONG - 4))  #define GET_PFN(pfn)			(pfn & 0x0fffffffffffffffUL) -extern int remap_pfn_range(struct vm_area_struct *, unsigned long, unsigned long, -			   unsigned long, pgprot_t); +int remap_pfn_range(struct vm_area_struct *, unsigned long, unsigned long, +		    unsigned long, pgprot_t);  static inline int io_remap_pfn_range(struct vm_area_struct *vma,  				     unsigned long from, unsigned long pfn, @@ -929,20 +981,20 @@ static inline int io_remap_pfn_range(struct vm_area_struct *vma,  /* We provide a special get_unmapped_area for framebuffer mmaps to try and use   * the largest alignment possible such that larget PTEs can be used.   */ -extern unsigned long get_fb_unmapped_area(struct file *filp, unsigned long, -					  unsigned long, unsigned long, -					  unsigned long); +unsigned long get_fb_unmapped_area(struct file *filp, unsigned long, +				   unsigned long, unsigned long, +				   unsigned long);  #define HAVE_ARCH_FB_UNMAPPED_AREA -extern void pgtable_cache_init(void); -extern void sun4v_register_fault_status(void); -extern void sun4v_ktsb_register(void); -extern void __init cheetah_ecache_flush_init(void); -extern void sun4v_patch_tlb_handlers(void); +void pgtable_cache_init(void); +void sun4v_register_fault_status(void); +void sun4v_ktsb_register(void); +void __init cheetah_ecache_flush_init(void); +void sun4v_patch_tlb_handlers(void);  extern unsigned long cmdline_memory_size; -extern asmlinkage void do_sparc64_fault(struct pt_regs *regs); +asmlinkage void do_sparc64_fault(struct pt_regs *regs);  #endif /* !(__ASSEMBLY__) */ diff --git a/arch/sparc/include/asm/processor_32.h b/arch/sparc/include/asm/processor_32.h index 2c7baa4c450..a564817bbc2 100644 --- a/arch/sparc/include/asm/processor_32.h +++ b/arch/sparc/include/asm/processor_32.h @@ -74,7 +74,7 @@ struct thread_struct {  }  /* Return saved PC of a blocked thread. */ -extern unsigned long thread_saved_pc(struct task_struct *t); +unsigned long thread_saved_pc(struct task_struct *t);  /* Do necessary setup to start up a newly executed thread. */  static inline void start_thread(struct pt_regs * regs, unsigned long pc, @@ -107,7 +107,7 @@ static inline void start_thread(struct pt_regs * regs, unsigned long pc,  /* Free all resources held by a thread. */  #define release_thread(tsk)		do { } while(0) -extern unsigned long get_wchan(struct task_struct *); +unsigned long get_wchan(struct task_struct *);  #define task_pt_regs(tsk) ((tsk)->thread.kregs)  #define KSTK_EIP(tsk)  ((tsk)->thread.kregs->pc) @@ -116,6 +116,7 @@ extern unsigned long get_wchan(struct task_struct *);  #ifdef __KERNEL__  extern struct task_struct *last_task_used_math; +int do_mathemu(struct pt_regs *regs, struct task_struct *fpt);  #define cpu_relax()	barrier()  extern void (*sparc_idle)(void); diff --git a/arch/sparc/include/asm/processor_64.h b/arch/sparc/include/asm/processor_64.h index 4c3f7f01c70..7028fe1a7c0 100644 --- a/arch/sparc/include/asm/processor_64.h +++ b/arch/sparc/include/asm/processor_64.h @@ -95,7 +95,7 @@ struct thread_struct {  /* Return saved PC of a blocked thread. */  struct task_struct; -extern unsigned long thread_saved_pc(struct task_struct *); +unsigned long thread_saved_pc(struct task_struct *);  /* On Uniprocessor, even in RMO processes see TSO semantics */  #ifdef CONFIG_SMP @@ -194,7 +194,7 @@ do { \  /* Free all resources held by a thread. */  #define release_thread(tsk)		do { } while (0) -extern unsigned long get_wchan(struct task_struct *task); +unsigned long get_wchan(struct task_struct *task);  #define task_pt_regs(tsk) (task_thread_info(tsk)->kregs)  #define KSTK_EIP(tsk)  (task_pt_regs(tsk)->tpc) @@ -253,6 +253,8 @@ static inline void prefetchw(const void *x)  #define HAVE_ARCH_PICK_MMAP_LAYOUT +int do_mathemu(struct pt_regs *regs, struct fpustate *f, bool illegal_insn_trap); +  #endif /* !(__ASSEMBLY__) */  #endif /* !(__ASM_SPARC64_PROCESSOR_H) */ diff --git a/arch/sparc/include/asm/prom.h b/arch/sparc/include/asm/prom.h index 67c62578d17..d955c8df62d 100644 --- a/arch/sparc/include/asm/prom.h +++ b/arch/sparc/include/asm/prom.h @@ -36,40 +36,28 @@ struct of_irq_controller {  	void		*data;  }; -extern struct device_node *of_find_node_by_cpuid(int cpuid); -extern int of_set_property(struct device_node *node, const char *name, void *val, int len); +struct device_node *of_find_node_by_cpuid(int cpuid); +int of_set_property(struct device_node *node, const char *name, void *val, int len);  extern struct mutex of_set_property_mutex; -extern int of_getintprop_default(struct device_node *np, -				 const char *name, +int of_getintprop_default(struct device_node *np, +			  const char *name,  				 int def); -extern int of_find_in_proplist(const char *list, const char *match, int len); -#ifdef CONFIG_NUMA -extern int of_node_to_nid(struct device_node *dp); -#define of_node_to_nid of_node_to_nid -#endif +int of_find_in_proplist(const char *list, const char *match, int len); -extern void prom_build_devicetree(void); -extern void of_populate_present_mask(void); -extern void of_fill_in_cpu_data(void); +void prom_build_devicetree(void); +void of_populate_present_mask(void); +void of_fill_in_cpu_data(void);  struct resource; -extern void __iomem *of_ioremap(struct resource *res, unsigned long offset, unsigned long size, char *name); -extern void of_iounmap(struct resource *res, void __iomem *base, unsigned long size); +void __iomem *of_ioremap(struct resource *res, unsigned long offset, unsigned long size, char *name); +void of_iounmap(struct resource *res, void __iomem *base, unsigned long size);  extern struct device_node *of_console_device;  extern char *of_console_path;  extern char *of_console_options; -extern void irq_trans_init(struct device_node *dp); -extern char *build_path_component(struct device_node *dp); - -/* SPARC has local implementations */ -extern int of_address_to_resource(struct device_node *dev, int index, -				  struct resource *r); -#define of_address_to_resource of_address_to_resource - -void __iomem *of_iomap(struct device_node *node, int index); -#define of_iomap of_iomap +void irq_trans_init(struct device_node *dp); +char *build_path_component(struct device_node *dp);  #endif /* __KERNEL__ */  #endif /* _SPARC_PROM_H */ diff --git a/arch/sparc/include/asm/ptrace.h b/arch/sparc/include/asm/ptrace.h index bdfafd7af46..bac6a946ee0 100644 --- a/arch/sparc/include/asm/ptrace.h +++ b/arch/sparc/include/asm/ptrace.h @@ -73,7 +73,7 @@ static inline long regs_return_value(struct pt_regs *regs)  	return regs->u_regs[UREG_I0];  }  #ifdef CONFIG_SMP -extern unsigned long profile_pc(struct pt_regs *); +unsigned long profile_pc(struct pt_regs *);  #else  #define profile_pc(regs) instruction_pointer(regs)  #endif diff --git a/arch/sparc/include/asm/setup.h b/arch/sparc/include/asm/setup.h index 5e35e051731..f5fffd84d0d 100644 --- a/arch/sparc/include/asm/setup.h +++ b/arch/sparc/include/asm/setup.h @@ -4,8 +4,9 @@  #ifndef _SPARC_SETUP_H  #define _SPARC_SETUP_H -#include <uapi/asm/setup.h> +#include <linux/interrupt.h> +#include <uapi/asm/setup.h>  extern char reboot_command[]; @@ -22,9 +23,43 @@ static inline int con_is_present(void)  {  	return serial_console ? 0 : 1;  } + +/* from irq_32.c */ +extern volatile unsigned char *fdc_status; +extern char *pdma_vaddr; +extern unsigned long pdma_size; +extern volatile int doing_pdma; + +/* This is software state */ +extern char *pdma_base; +extern unsigned long pdma_areasize; + +int sparc_floppy_request_irq(unsigned int irq, irq_handler_t irq_handler); + +/* setup_32.c */ +extern unsigned long cmdline_memory_size; + +/* devices.c */ +void __init device_scan(void); + +/* unaligned_32.c */ +unsigned long safe_compute_effective_address(struct pt_regs *, unsigned int); + +#endif + +#ifdef CONFIG_SPARC64 +/* unaligned_64.c */ +int handle_ldf_stq(u32 insn, struct pt_regs *regs); +void handle_ld_nf(u32 insn, struct pt_regs *regs); + +/* init_64.c */ +extern atomic_t dcpage_flushes; +extern atomic_t dcpage_flushes_xcall; + +extern int sysctl_tsb_ratio;  #endif -extern void sun_do_break(void); +void sun_do_break(void);  extern int stop_a_enabled;  extern int scons_pwroff; diff --git a/arch/sparc/include/asm/sfp-machine_32.h b/arch/sparc/include/asm/sfp-machine_32.h index 01d9c3b5a73..838c9d58f3b 100644 --- a/arch/sparc/include/asm/sfp-machine_32.h +++ b/arch/sparc/include/asm/sfp-machine_32.h @@ -79,9 +79,9 @@    __asm__ ("addcc %r7,%8,%2\n\t"					\  	   "addxcc %r5,%6,%1\n\t"					\  	   "addx %r3,%4,%0\n"						\ -	   : "=r" ((USItype)(r2)),					\ -	     "=&r" ((USItype)(r1)),					\ -	     "=&r" ((USItype)(r0))					\ +	   : "=r" (r2),							\ +	     "=&r" (r1),						\ +	     "=&r" (r0)							\  	   : "%rJ" ((USItype)(x2)),					\  	     "rI" ((USItype)(y2)),					\  	     "%rJ" ((USItype)(x1)),					\ @@ -94,9 +94,9 @@    __asm__ ("subcc %r7,%8,%2\n\t"					\  	    "subxcc %r5,%6,%1\n\t"					\  	    "subx %r3,%4,%0\n"						\ -	   : "=r" ((USItype)(r2)),					\ -	     "=&r" ((USItype)(r1)),					\ -	     "=&r" ((USItype)(r0))					\ +	   : "=r" (r2),							\ +	     "=&r" (r1),						\ +	     "=&r" (r0)							\  	   : "%rJ" ((USItype)(x2)),					\  	     "rI" ((USItype)(y2)),					\  	     "%rJ" ((USItype)(x1)),					\ @@ -115,8 +115,8 @@  	    "addxcc %r6,%7,%0\n\t"					\  	    "addxcc %r4,%5,%%g2\n\t"					\  	    "addx %r2,%3,%%g1\n\t"					\ -	   : "=&r" ((USItype)(r1)),					\ -	     "=&r" ((USItype)(r0))					\ +	   : "=&r" (r1),						\ +	     "=&r" (r0)							\  	   : "%rJ" ((USItype)(x3)),					\  	     "rI" ((USItype)(y3)),					\  	     "%rJ" ((USItype)(x2)),					\ @@ -140,8 +140,8 @@  	    "subxcc %r6,%7,%0\n\t"					\  	    "subxcc %r4,%5,%%g2\n\t"					\  	    "subx %r2,%3,%%g1\n\t"					\ -	   : "=&r" ((USItype)(r1)),					\ -	     "=&r" ((USItype)(r0))					\ +	   : "=&r" (r1),						\ +	     "=&r" (r0)							\  	   : "%rJ" ((USItype)(x3)),					\  	     "rI" ((USItype)(y3)),					\  	     "%rJ" ((USItype)(x2)),					\ @@ -164,10 +164,10 @@  	   "addxcc %2,%%g0,%2\n\t"					\  	   "addxcc %1,%%g0,%1\n\t"					\  	   "addx %0,%%g0,%0\n\t"					\ -	   : "=&r" ((USItype)(x3)),					\ -	     "=&r" ((USItype)(x2)),					\ -	     "=&r" ((USItype)(x1)),					\ -	     "=&r" ((USItype)(x0))					\ +	   : "=&r" (x3),						\ +	     "=&r" (x2),						\ +	     "=&r" (x1),						\ +	     "=&r" (x0)							\  	   : "rI" ((USItype)(i)),					\  	     "0" ((USItype)(x3)),					\  	     "1" ((USItype)(x2)),					\ diff --git a/arch/sparc/include/asm/smp_32.h b/arch/sparc/include/asm/smp_32.h index 3c8917f054d..7c24e08a88d 100644 --- a/arch/sparc/include/asm/smp_32.h +++ b/arch/sparc/include/asm/smp_32.h @@ -93,15 +93,15 @@ static inline void xc4(smpfunc_t func, unsigned long arg1, unsigned long arg2,  				    arg1, arg2, arg3, arg4);  } -extern void arch_send_call_function_single_ipi(int cpu); -extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); +void arch_send_call_function_single_ipi(int cpu); +void arch_send_call_function_ipi_mask(const struct cpumask *mask);  static inline int cpu_logical_map(int cpu)  {  	return cpu;  } -extern int hard_smp_processor_id(void); +int hard_smp_processor_id(void);  #define raw_smp_processor_id()		(current_thread_info()->cpu) diff --git a/arch/sparc/include/asm/smp_64.h b/arch/sparc/include/asm/smp_64.h index dd3bef4b989..26d9e772686 100644 --- a/arch/sparc/include/asm/smp_64.h +++ b/arch/sparc/include/asm/smp_64.h @@ -32,31 +32,36 @@  DECLARE_PER_CPU(cpumask_t, cpu_sibling_map);  extern cpumask_t cpu_core_map[NR_CPUS]; -extern int sparc64_multi_core; -extern void arch_send_call_function_single_ipi(int cpu); -extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); +void arch_send_call_function_single_ipi(int cpu); +void arch_send_call_function_ipi_mask(const struct cpumask *mask);  /*   *	General functions that each host system must provide.   */ -extern int hard_smp_processor_id(void); +int hard_smp_processor_id(void);  #define raw_smp_processor_id() (current_thread_info()->cpu) -extern void smp_fill_in_sib_core_maps(void); -extern void cpu_play_dead(void); +void smp_fill_in_sib_core_maps(void); +void cpu_play_dead(void); -extern void smp_fetch_global_regs(void); -extern void smp_fetch_global_pmu(void); +void smp_fetch_global_regs(void); +void smp_fetch_global_pmu(void);  struct seq_file;  void smp_bogo(struct seq_file *);  void smp_info(struct seq_file *); +void smp_callin(void); +void cpu_panic(void); +void smp_synchronize_tick_client(void); +void smp_capture(void); +void smp_release(void); +  #ifdef CONFIG_HOTPLUG_CPU -extern int __cpu_disable(void); -extern void __cpu_die(unsigned int cpu); +int __cpu_disable(void); +void __cpu_die(unsigned int cpu);  #endif  #endif /* !(__ASSEMBLY__) */ diff --git a/arch/sparc/include/asm/sparsemem.h b/arch/sparc/include/asm/sparsemem.h index b99d4e4b6d2..e5e1752d5d7 100644 --- a/arch/sparc/include/asm/sparsemem.h +++ b/arch/sparc/include/asm/sparsemem.h @@ -3,9 +3,11 @@  #ifdef __KERNEL__ +#include <asm/page.h> +  #define SECTION_SIZE_BITS       30 -#define MAX_PHYSADDR_BITS       42 -#define MAX_PHYSMEM_BITS        42 +#define MAX_PHYSADDR_BITS       MAX_PHYS_ADDRESS_BITS +#define MAX_PHYSMEM_BITS        MAX_PHYS_ADDRESS_BITS  #endif /* !(__KERNEL__) */ diff --git a/arch/sparc/include/asm/spitfire.h b/arch/sparc/include/asm/spitfire.h index 6b67e50fb9b..3fc58691dbd 100644 --- a/arch/sparc/include/asm/spitfire.h +++ b/arch/sparc/include/asm/spitfire.h @@ -62,7 +62,7 @@ extern enum ultra_tlb_layout tlb_type;  extern int sun4v_chip_type;  extern int cheetah_pcache_forced_on; -extern void cheetah_enable_pcache(void); +void cheetah_enable_pcache(void);  #define sparc64_highest_locked_tlbent()	\  	(tlb_type == spitfire ? \ diff --git a/arch/sparc/include/asm/stacktrace.h b/arch/sparc/include/asm/stacktrace.h index 6cee39adf6d..c30d066f304 100644 --- a/arch/sparc/include/asm/stacktrace.h +++ b/arch/sparc/include/asm/stacktrace.h @@ -1,6 +1,6 @@  #ifndef _SPARC64_STACKTRACE_H  #define _SPARC64_STACKTRACE_H -extern void stack_trace_flush(void); +void stack_trace_flush(void);  #endif /* _SPARC64_STACKTRACE_H */ diff --git a/arch/sparc/include/asm/starfire.h b/arch/sparc/include/asm/starfire.h index d56ce60a599..c100dc27a0a 100644 --- a/arch/sparc/include/asm/starfire.h +++ b/arch/sparc/include/asm/starfire.h @@ -11,10 +11,10 @@  extern int this_is_starfire; -extern void check_if_starfire(void); -extern int starfire_hard_smp_processor_id(void); -extern void starfire_hookup(int); -extern unsigned int starfire_translate(unsigned long imap, unsigned int upaid); +void check_if_starfire(void); +int starfire_hard_smp_processor_id(void); +void starfire_hookup(int); +unsigned int starfire_translate(unsigned long imap, unsigned int upaid);  #endif  #endif diff --git a/arch/sparc/include/asm/string_32.h b/arch/sparc/include/asm/string_32.h index 12f67857152..69974e92461 100644 --- a/arch/sparc/include/asm/string_32.h +++ b/arch/sparc/include/asm/string_32.h @@ -15,7 +15,7 @@  #ifdef __KERNEL__ -extern void __memmove(void *,const void *,__kernel_size_t); +void __memmove(void *,const void *,__kernel_size_t);  #ifndef EXPORT_SYMTAB_STROPS @@ -40,8 +40,8 @@ extern void __memmove(void *,const void *,__kernel_size_t);  #undef memscan  #define memscan(__arg0, __char, __arg2)						\  ({										\ -	extern void *__memscan_zero(void *, size_t);				\ -	extern void *__memscan_generic(void *, int, size_t);			\ +	void *__memscan_zero(void *, size_t);					\ +	void *__memscan_generic(void *, int, size_t);				\  	void *__retval, *__addr = (__arg0);					\  	size_t __size = (__arg2);						\  										\ @@ -54,14 +54,14 @@ extern void __memmove(void *,const void *,__kernel_size_t);  })  #define __HAVE_ARCH_MEMCMP -extern int memcmp(const void *,const void *,__kernel_size_t); +int memcmp(const void *,const void *,__kernel_size_t);  /* Now the str*() stuff... */  #define __HAVE_ARCH_STRLEN -extern __kernel_size_t strlen(const char *); +__kernel_size_t strlen(const char *);  #define __HAVE_ARCH_STRNCMP -extern int strncmp(const char *, const char *, __kernel_size_t); +int strncmp(const char *, const char *, __kernel_size_t);  #endif /* !EXPORT_SYMTAB_STROPS */ diff --git a/arch/sparc/include/asm/string_64.h b/arch/sparc/include/asm/string_64.h index 9623bc21315..5936b8ff3c0 100644 --- a/arch/sparc/include/asm/string_64.h +++ b/arch/sparc/include/asm/string_64.h @@ -19,7 +19,7 @@  /* First the mem*() things. */  #define __HAVE_ARCH_MEMMOVE -extern void *memmove(void *, const void *, __kernel_size_t); +void *memmove(void *, const void *, __kernel_size_t);  #define __HAVE_ARCH_MEMCPY  #define memcpy(t, f, n) __builtin_memcpy(t, f, n) @@ -32,8 +32,8 @@ extern void *memmove(void *, const void *, __kernel_size_t);  #undef memscan  #define memscan(__arg0, __char, __arg2)					\  ({									\ -	extern void *__memscan_zero(void *, size_t);			\ -	extern void *__memscan_generic(void *, int, size_t);		\ +	void *__memscan_zero(void *, size_t);				\ +	void *__memscan_generic(void *, int, size_t);			\  	void *__retval, *__addr = (__arg0);				\  	size_t __size = (__arg2);					\  									\ @@ -46,14 +46,14 @@ extern void *memmove(void *, const void *, __kernel_size_t);  })  #define __HAVE_ARCH_MEMCMP -extern int memcmp(const void *,const void *,__kernel_size_t); +int memcmp(const void *,const void *,__kernel_size_t);  /* Now the str*() stuff... */  #define __HAVE_ARCH_STRLEN -extern __kernel_size_t strlen(const char *); +__kernel_size_t strlen(const char *);  #define __HAVE_ARCH_STRNCMP -extern int strncmp(const char *, const char *, __kernel_size_t); +int strncmp(const char *, const char *, __kernel_size_t);  #endif /* !EXPORT_SYMTAB_STROPS */ diff --git a/arch/sparc/include/asm/switch_to_32.h b/arch/sparc/include/asm/switch_to_32.h index e32e82b76ee..16f10374feb 100644 --- a/arch/sparc/include/asm/switch_to_32.h +++ b/arch/sparc/include/asm/switch_to_32.h @@ -99,8 +99,8 @@ extern struct thread_info *current_set[NR_CPUS];  	  "o0", "o1", "o2", "o3",                   "o7");	\  	} while(0) -extern void fpsave(unsigned long *fpregs, unsigned long *fsr, -		   void *fpqueue, unsigned long *fpqdepth); -extern void synchronize_user_stack(void); +void fpsave(unsigned long *fpregs, unsigned long *fsr, +	    void *fpqueue, unsigned long *fpqdepth); +void synchronize_user_stack(void);  #endif /* __SPARC_SWITCH_TO_H */ diff --git a/arch/sparc/include/asm/switch_to_64.h b/arch/sparc/include/asm/switch_to_64.h index 8d284801f23..10e76332dc9 100644 --- a/arch/sparc/include/asm/switch_to_64.h +++ b/arch/sparc/include/asm/switch_to_64.h @@ -65,7 +65,7 @@ do {	save_and_clear_fpu();						\  	  "o0", "o1", "o2", "o3", "o4", "o5",       "o7");		\  } while(0) -extern void synchronize_user_stack(void); -extern void fault_in_user_windows(void); +void synchronize_user_stack(void); +void fault_in_user_windows(void);  #endif /* __SPARC64_SWITCH_TO_64_H */ diff --git a/arch/sparc/include/asm/syscalls.h b/arch/sparc/include/asm/syscalls.h index bf8972adea1..b0a0db8ea61 100644 --- a/arch/sparc/include/asm/syscalls.h +++ b/arch/sparc/include/asm/syscalls.h @@ -3,9 +3,9 @@  struct pt_regs; -extern asmlinkage long sparc_do_fork(unsigned long clone_flags, -				     unsigned long stack_start, -				     struct pt_regs *regs, -				     unsigned long stack_size); +asmlinkage long sparc_do_fork(unsigned long clone_flags, +			      unsigned long stack_start, +			      struct pt_regs *regs, +			      unsigned long stack_size);  #endif /* _SPARC64_SYSCALLS_H */ diff --git a/arch/sparc/include/asm/thread_info_32.h b/arch/sparc/include/asm/thread_info_32.h index dd3807599bb..96efa7adc22 100644 --- a/arch/sparc/include/asm/thread_info_32.h +++ b/arch/sparc/include/asm/thread_info_32.h @@ -105,8 +105,6 @@ register struct thread_info *current_thread_info_reg asm("g6");  #define TI_W_SAVED	0x250  /* #define TI_RESTART_BLOCK 0x25n */ /* Nobody cares */ -#define PREEMPT_ACTIVE		0x4000000 -  /*   * 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 d5e50425107..a5f01ac6d0f 100644 --- a/arch/sparc/include/asm/thread_info_64.h +++ b/arch/sparc/include/asm/thread_info_64.h @@ -111,8 +111,6 @@ struct thread_info {  #define THREAD_SHIFT PAGE_SHIFT  #endif /* PAGE_SHIFT == 13 */ -#define PREEMPT_ACTIVE		0x10000000 -  /*   * macros/functions for gaining access to the thread information structure   */ @@ -192,7 +190,7 @@ register struct thread_info *current_thread_info_reg asm("g6");  #define TIF_UNALIGNED		5	/* allowed to do unaligned accesses */  /* flag bit 6 is available */  #define TIF_32BIT		7	/* 32-bit binary */ -/* flag bit 8 is available */ +#define TIF_NOHZ		8	/* in adaptive nohz mode */  #define TIF_SECCOMP		9	/* secure computing */  #define TIF_SYSCALL_AUDIT	10	/* syscall auditing active */  #define TIF_SYSCALL_TRACEPOINT	11	/* syscall tracepoint instrumentation */ @@ -210,6 +208,7 @@ register struct thread_info *current_thread_info_reg asm("g6");  #define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED)  #define _TIF_UNALIGNED		(1<<TIF_UNALIGNED)  #define _TIF_32BIT		(1<<TIF_32BIT) +#define _TIF_NOHZ		(1<<TIF_NOHZ)  #define _TIF_SECCOMP		(1<<TIF_SECCOMP)  #define _TIF_SYSCALL_AUDIT	(1<<TIF_SYSCALL_AUDIT)  #define _TIF_SYSCALL_TRACEPOINT	(1<<TIF_SYSCALL_TRACEPOINT) diff --git a/arch/sparc/include/asm/timer_32.h b/arch/sparc/include/asm/timer_32.h index 72f40a546de..f8e708a0aa5 100644 --- a/arch/sparc/include/asm/timer_32.h +++ b/arch/sparc/include/asm/timer_32.h @@ -32,13 +32,13 @@ static inline unsigned int timer_value(unsigned int value)  	return (value + 1) << TIMER_VALUE_SHIFT;  } -extern __volatile__ unsigned int *master_l10_counter; +extern volatile u32 __iomem *master_l10_counter; -extern irqreturn_t notrace timer_interrupt(int dummy, void *dev_id); +irqreturn_t notrace timer_interrupt(int dummy, void *dev_id);  #ifdef CONFIG_SMP  DECLARE_PER_CPU(struct clock_event_device, sparc32_clockevent); -extern void register_percpu_ce(int cpu); +void register_percpu_ce(int cpu);  #endif  #endif /* !(_SPARC_TIMER_H) */ diff --git a/arch/sparc/include/asm/timer_64.h b/arch/sparc/include/asm/timer_64.h index 01197d8215c..fce41503400 100644 --- a/arch/sparc/include/asm/timer_64.h +++ b/arch/sparc/include/asm/timer_64.h @@ -23,8 +23,8 @@ struct sparc64_tick_ops {  extern struct sparc64_tick_ops *tick_ops; -extern unsigned long sparc64_get_clock_tick(unsigned int cpu); -extern void setup_sparc64_timer(void); -extern void __init time_init(void); +unsigned long sparc64_get_clock_tick(unsigned int cpu); +void setup_sparc64_timer(void); +void __init time_init(void);  #endif /* _SPARC64_TIMER_H */ diff --git a/arch/sparc/include/asm/tlb_64.h b/arch/sparc/include/asm/tlb_64.h index 190e18913cc..4cb392f75d2 100644 --- a/arch/sparc/include/asm/tlb_64.h +++ b/arch/sparc/include/asm/tlb_64.h @@ -8,19 +8,19 @@  #include <asm/mmu_context.h>  #ifdef CONFIG_SMP -extern void smp_flush_tlb_pending(struct mm_struct *, +void smp_flush_tlb_pending(struct mm_struct *,  				  unsigned long, unsigned long *);  #endif  #ifdef CONFIG_SMP -extern void smp_flush_tlb_mm(struct mm_struct *mm); +void smp_flush_tlb_mm(struct mm_struct *mm);  #define do_flush_tlb_mm(mm) smp_flush_tlb_mm(mm)  #else  #define do_flush_tlb_mm(mm) __flush_tlb_mm(CTX_HWBITS(mm->context), SECONDARY_CONTEXT)  #endif -extern void __flush_tlb_pending(unsigned long, unsigned long, unsigned long *); -extern void flush_tlb_pending(void); +void __flush_tlb_pending(unsigned long, unsigned long, unsigned long *); +void flush_tlb_pending(void);  #define tlb_start_vma(tlb, vma) do { } while (0)  #define tlb_end_vma(tlb, vma)	do { } while (0) diff --git a/arch/sparc/include/asm/tlbflush_64.h b/arch/sparc/include/asm/tlbflush_64.h index f0d6a9700f4..816d8202fa0 100644 --- a/arch/sparc/include/asm/tlbflush_64.h +++ b/arch/sparc/include/asm/tlbflush_64.h @@ -1,7 +1,6 @@  #ifndef _SPARC64_TLBFLUSH_H  #define _SPARC64_TLBFLUSH_H -#include <linux/mm.h>  #include <asm/mmu_context.h>  /* TSB flush operations. */ @@ -15,9 +14,9 @@ struct tlb_batch {  	unsigned long vaddrs[TLB_BATCH_NR];  }; -extern void flush_tsb_kernel_range(unsigned long start, unsigned long end); -extern void flush_tsb_user(struct tlb_batch *tb); -extern void flush_tsb_user_page(struct mm_struct *mm, unsigned long vaddr); +void flush_tsb_kernel_range(unsigned long start, unsigned long end); +void flush_tsb_user(struct tlb_batch *tb); +void flush_tsb_user_page(struct mm_struct *mm, unsigned long vaddr);  /* TLB flush operations. */ @@ -37,15 +36,15 @@ static inline void flush_tlb_range(struct vm_area_struct *vma,  #define __HAVE_ARCH_ENTER_LAZY_MMU_MODE -extern void flush_tlb_pending(void); -extern void arch_enter_lazy_mmu_mode(void); -extern void arch_leave_lazy_mmu_mode(void); +void flush_tlb_pending(void); +void arch_enter_lazy_mmu_mode(void); +void arch_leave_lazy_mmu_mode(void);  #define arch_flush_lazy_mmu_mode()      do {} while (0)  /* Local cpu only.  */ -extern void __flush_tlb_all(void); -extern void __flush_tlb_page(unsigned long context, unsigned long vaddr); -extern void __flush_tlb_kernel_range(unsigned long start, unsigned long end); +void __flush_tlb_all(void); +void __flush_tlb_page(unsigned long context, unsigned long vaddr); +void __flush_tlb_kernel_range(unsigned long start, unsigned long end);  #ifndef CONFIG_SMP @@ -61,8 +60,8 @@ static inline void global_flush_tlb_page(struct mm_struct *mm, unsigned long vad  #else /* CONFIG_SMP */ -extern void smp_flush_tlb_kernel_range(unsigned long start, unsigned long end); -extern void smp_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr); +void smp_flush_tlb_kernel_range(unsigned long start, unsigned long end); +void smp_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr);  #define flush_tlb_kernel_range(start, end) \  do {	flush_tsb_kernel_range(start,end); \ diff --git a/arch/sparc/include/asm/topology_64.h b/arch/sparc/include/asm/topology_64.h index 1754390a426..ed8f071132e 100644 --- a/arch/sparc/include/asm/topology_64.h +++ b/arch/sparc/include/asm/topology_64.h @@ -18,7 +18,7 @@ static inline int cpu_to_node(int cpu)  struct pci_bus;  #ifdef CONFIG_PCI -extern int pcibus_to_node(struct pci_bus *pbus); +int pcibus_to_node(struct pci_bus *pbus);  #else  static inline int pcibus_to_node(struct pci_bus *pbus)  { @@ -42,8 +42,6 @@ static inline int pcibus_to_node(struct pci_bus *pbus)  #define topology_core_id(cpu)			(cpu_data(cpu).core_id)  #define topology_core_cpumask(cpu)		(&cpu_core_map[cpu])  #define topology_thread_cpumask(cpu)		(&per_cpu(cpu_sibling_map, cpu)) -#define mc_capable()				(sparc64_multi_core) -#define smt_capable()				(sparc64_multi_core)  #endif /* CONFIG_SMP */  extern cpumask_t cpu_core_map[NR_CPUS]; diff --git a/arch/sparc/include/asm/trap_block.h b/arch/sparc/include/asm/trap_block.h index 7e26b2db621..6fd4436d32f 100644 --- a/arch/sparc/include/asm/trap_block.h +++ b/arch/sparc/include/asm/trap_block.h @@ -51,11 +51,11 @@ struct trap_per_cpu {  	unsigned long		__per_cpu_base;  } __attribute__((aligned(64)));  extern struct trap_per_cpu trap_block[NR_CPUS]; -extern void init_cur_cpu_trap(struct thread_info *); -extern void setup_tba(void); +void init_cur_cpu_trap(struct thread_info *); +void setup_tba(void);  extern int ncpus_probed; -extern unsigned long real_hard_smp_processor_id(void); +unsigned long real_hard_smp_processor_id(void);  struct cpuid_patch_entry {  	unsigned int	addr; diff --git a/arch/sparc/include/asm/tsb.h b/arch/sparc/include/asm/tsb.h index e696432b950..90916f955ca 100644 --- a/arch/sparc/include/asm/tsb.h +++ b/arch/sparc/include/asm/tsb.h @@ -142,98 +142,40 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end;  	or		REG1, %lo(swapper_pg_dir), REG1; \  	sllx		VADDR, 64 - (PGDIR_SHIFT + PGDIR_BITS), REG2; \  	srlx		REG2, 64 - PAGE_SHIFT, REG2; \ -	andn		REG2, 0x3, REG2; \ -	lduw		[REG1 + REG2], REG1; \ +	andn		REG2, 0x7, REG2; \ +	ldx		[REG1 + REG2], REG1; \  	brz,pn		REG1, FAIL_LABEL; \  	 sllx		VADDR, 64 - (PMD_SHIFT + PMD_BITS), REG2; \  	srlx		REG2, 64 - PAGE_SHIFT, REG2; \ -	sllx		REG1, PGD_PADDR_SHIFT, REG1; \ -	andn		REG2, 0x3, REG2; \ -	lduwa		[REG1 + REG2] ASI_PHYS_USE_EC, REG1; \ +	andn		REG2, 0x7, REG2; \ +	ldxa		[REG1 + REG2] ASI_PHYS_USE_EC, REG1; \  	brz,pn		REG1, FAIL_LABEL; \  	 sllx		VADDR, 64 - PMD_SHIFT, REG2; \ -	srlx		REG2, 64 - (PAGE_SHIFT - 1), REG2; \ -	sllx		REG1, PMD_PADDR_SHIFT, REG1; \ +	srlx		REG2, 64 - PAGE_SHIFT, REG2; \  	andn		REG2, 0x7, REG2; \  	add		REG1, REG2, REG1; -	/* These macros exists only to make the PMD translator below -	 * easier to read.  It hides the ELF section switch for the -	 * sun4v code patching. -	 */ -#define OR_PTE_BIT_1INSN(REG, NAME)			\ -661:	or		REG, _PAGE_##NAME##_4U, REG;	\ -	.section	.sun4v_1insn_patch, "ax";	\ -	.word		661b;				\ -	or		REG, _PAGE_##NAME##_4V, REG;	\ -	.previous; - -#define OR_PTE_BIT_2INSN(REG, TMP, NAME)		\ -661:	sethi		%hi(_PAGE_##NAME##_4U), TMP;	\ -	or		REG, TMP, REG;			\ -	.section	.sun4v_2insn_patch, "ax";	\ -	.word		661b;				\ -	mov		-1, TMP;			\ -	or		REG, _PAGE_##NAME##_4V, REG;	\ -	.previous; - -	/* Load into REG the PTE value for VALID, CACHE, and SZHUGE.  */ -#define BUILD_PTE_VALID_SZHUGE_CACHE(REG)				   \ -661:	sethi		%uhi(_PAGE_VALID|_PAGE_SZHUGE_4U), REG;		   \ -	.section	.sun4v_1insn_patch, "ax";			   \ -	.word		661b;						   \ -	sethi		%uhi(_PAGE_VALID), REG;				   \ -	.previous;							   \ -	sllx		REG, 32, REG;					   \ -661:	or		REG, _PAGE_CP_4U|_PAGE_CV_4U, REG;		   \ -	.section	.sun4v_1insn_patch, "ax";			   \ -	.word		661b;						   \ -	or		REG, _PAGE_CP_4V|_PAGE_CV_4V|_PAGE_SZHUGE_4V, REG; \ -	.previous; -  	/* PMD has been loaded into REG1, interpret the value, seeing  	 * if it is a HUGE PMD or a normal one.  If it is not valid  	 * then jump to FAIL_LABEL.  If it is a HUGE PMD, and it  	 * translates to a valid PTE, branch to PTE_LABEL.  	 * -	 * We translate the PMD by hand, one bit at a time, -	 * constructing the huge PTE. -	 * -	 * So we construct the PTE in REG2 as follows: -	 * -	 * 1) Extract the PMD PFN from REG1 and place it into REG2. -	 * -	 * 2) Translate PMD protection bits in REG1 into REG2, one bit -	 *    at a time using andcc tests on REG1 and OR's into REG2. -	 * -	 *    Only two bits to be concerned with here, EXEC and WRITE. -	 *    Now REG1 is freed up and we can use it as a temporary. -	 * -	 * 3) Construct the VALID, CACHE, and page size PTE bits in -	 *    REG1, OR with REG2 to form final PTE. +	 * We have to propagate the 4MB bit of the virtual address +	 * because we are fabricating 8MB pages using 4MB hw pages.  	 */  #ifdef CONFIG_TRANSPARENT_HUGEPAGE  #define USER_PGTABLE_CHECK_PMD_HUGE(VADDR, REG1, REG2, FAIL_LABEL, PTE_LABEL) \ -	brz,pn		REG1, FAIL_LABEL;				      \ -	 andcc		REG1, PMD_ISHUGE, %g0;				      \ -	be,pt		%xcc, 700f;					      \ -	 and		REG1, PMD_HUGE_PRESENT|PMD_HUGE_ACCESSED, REG2;	      \ -	cmp		REG2, PMD_HUGE_PRESENT|PMD_HUGE_ACCESSED;	      \ -	bne,pn		%xcc, FAIL_LABEL;				      \ -	 andn		REG1, PMD_HUGE_PROTBITS, REG2;			      \ -	sllx		REG2, PMD_PADDR_SHIFT, REG2;			      \ -	/* REG2 now holds PFN << PAGE_SHIFT */				      \ -	andcc		REG1, PMD_HUGE_WRITE, %g0;			      \ -	bne,a,pt	%xcc, 1f;					      \ -	 OR_PTE_BIT_1INSN(REG2, W);					      \ -1:	andcc		REG1, PMD_HUGE_EXEC, %g0;			      \ -	be,pt		%xcc, 1f;					      \ -	 nop;								      \ -	OR_PTE_BIT_2INSN(REG2, REG1, EXEC);				      \ -	/* REG1 can now be clobbered, build final PTE */		      \ -1:	BUILD_PTE_VALID_SZHUGE_CACHE(REG1);				      \ -	ba,pt		%xcc, PTE_LABEL;				      \ -	 or		REG1, REG2, REG1;				      \ +	brz,pn		REG1, FAIL_LABEL;		\ +	 sethi		%uhi(_PAGE_PMD_HUGE), REG2;	\ +	sllx		REG2, 32, REG2;			\ +	andcc		REG1, REG2, %g0;		\ +	be,pt		%xcc, 700f;			\ +	 sethi		%hi(4 * 1024 * 1024), REG2;	\ +	brgez,pn	REG1, FAIL_LABEL;		\ +	 andn		REG1, REG2, REG1;		\ +	and		VADDR, REG2, REG2;		\ +	brlz,pt		REG1, PTE_LABEL;		\ +	 or		REG1, REG2, REG1;		\  700:  #else  #define USER_PGTABLE_CHECK_PMD_HUGE(VADDR, REG1, REG2, FAIL_LABEL, PTE_LABEL) \ @@ -253,18 +195,16 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end;  #define USER_PGTABLE_WALK_TL1(VADDR, PHYS_PGD, REG1, REG2, FAIL_LABEL)	\  	sllx		VADDR, 64 - (PGDIR_SHIFT + PGDIR_BITS), REG2; \  	srlx		REG2, 64 - PAGE_SHIFT, REG2; \ -	andn		REG2, 0x3, REG2; \ -	lduwa		[PHYS_PGD + REG2] ASI_PHYS_USE_EC, REG1; \ +	andn		REG2, 0x7, REG2; \ +	ldxa		[PHYS_PGD + REG2] ASI_PHYS_USE_EC, REG1; \  	brz,pn		REG1, FAIL_LABEL; \  	 sllx		VADDR, 64 - (PMD_SHIFT + PMD_BITS), REG2; \  	srlx		REG2, 64 - PAGE_SHIFT, REG2; \ -	sllx		REG1, PGD_PADDR_SHIFT, REG1; \ -	andn		REG2, 0x3, REG2; \ -	lduwa		[REG1 + REG2] ASI_PHYS_USE_EC, REG1; \ +	andn		REG2, 0x7, REG2; \ +	ldxa		[REG1 + REG2] ASI_PHYS_USE_EC, REG1; \  	USER_PGTABLE_CHECK_PMD_HUGE(VADDR, REG1, REG2, FAIL_LABEL, 800f) \  	sllx		VADDR, 64 - PMD_SHIFT, REG2; \ -	srlx		REG2, 64 - (PAGE_SHIFT - 1), REG2; \ -	sllx		REG1, PMD_PADDR_SHIFT, REG1; \ +	srlx		REG2, 64 - PAGE_SHIFT, REG2; \  	andn		REG2, 0x7, REG2; \  	add		REG1, REG2, REG1; \  	ldxa		[REG1] ASI_PHYS_USE_EC, REG1; \ diff --git a/arch/sparc/include/asm/uaccess.h b/arch/sparc/include/asm/uaccess.h index 0167d26d0d1..bd56c28fff9 100644 --- a/arch/sparc/include/asm/uaccess.h +++ b/arch/sparc/include/asm/uaccess.h @@ -9,6 +9,6 @@  #define user_addr_max() \  	(segment_eq(get_fs(), USER_DS) ? TASK_SIZE : ~0UL) -extern long strncpy_from_user(char *dest, const char __user *src, long count); +long strncpy_from_user(char *dest, const char __user *src, long count);  #endif diff --git a/arch/sparc/include/asm/uaccess_32.h b/arch/sparc/include/asm/uaccess_32.h index 53a28dd59f5..9634d086fc5 100644 --- a/arch/sparc/include/asm/uaccess_32.h +++ b/arch/sparc/include/asm/uaccess_32.h @@ -78,9 +78,9 @@ struct exception_table_entry  };  /* Returns 0 if exception not found and fixup otherwise.  */ -extern unsigned long search_extables_range(unsigned long addr, unsigned long *g2); +unsigned long search_extables_range(unsigned long addr, unsigned long *g2); -extern void __ret_efault(void); +void __ret_efault(void);  /* Uh, these should become the main single-value transfer routines..   * They automatically use the right size if we just have the right @@ -152,7 +152,7 @@ __asm__ __volatile__(							\         : "=&r" (ret) : "r" (x), "m" (*__m(addr)),			\  	 "i" (-EFAULT)) -extern int __put_user_bad(void); +int __put_user_bad(void);  #define __get_user_check(x,addr,size,type) ({ \  register int __gu_ret; \ @@ -244,9 +244,9 @@ __asm__ __volatile__(							\  	".previous\n\t"							\         : "=&r" (x) : "m" (*__m(addr)), "i" (retval)) -extern int __get_user_bad(void); +int __get_user_bad(void); -extern unsigned long __copy_user(void __user *to, const void __user *from, unsigned long size); +unsigned long __copy_user(void __user *to, const void __user *from, unsigned long size);  static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)  { @@ -306,8 +306,8 @@ static inline unsigned long clear_user(void __user *addr, unsigned long n)  		return n;  } -extern __must_check long strlen_user(const char __user *str); -extern __must_check long strnlen_user(const char __user *str, long n); +__must_check long strlen_user(const char __user *str); +__must_check long strnlen_user(const char __user *str, long n);  #endif  /* __ASSEMBLY__ */ diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h index e562d3caee5..c990a5e577f 100644 --- a/arch/sparc/include/asm/uaccess_64.h +++ b/arch/sparc/include/asm/uaccess_64.h @@ -76,8 +76,8 @@ struct exception_table_entry {          unsigned int insn, fixup;  }; -extern void __ret_efault(void); -extern void __retl_efault(void); +void __ret_efault(void); +void __retl_efault(void);  /* Uh, these should become the main single-value transfer routines..   * They automatically use the right size if we just have the right @@ -134,7 +134,7 @@ __asm__ __volatile__(							\         : "=r" (ret) : "r" (x), "r" (__m(addr)),				\  	 "i" (-EFAULT)) -extern int __put_user_bad(void); +int __put_user_bad(void);  #define __get_user_nocheck(data,addr,size,type) ({ \  register int __gu_ret; \ @@ -204,13 +204,13 @@ __asm__ __volatile__(							\  	".previous\n\t"							\         : "=r" (x) : "r" (__m(addr)), "i" (retval)) -extern int __get_user_bad(void); +int __get_user_bad(void); -extern unsigned long __must_check ___copy_from_user(void *to, -						    const void __user *from, -						    unsigned long size); -extern unsigned long copy_from_user_fixup(void *to, const void __user *from, -					  unsigned long size); +unsigned long __must_check ___copy_from_user(void *to, +					     const void __user *from, +					     unsigned long size); +unsigned long copy_from_user_fixup(void *to, const void __user *from, +				   unsigned long size);  static inline unsigned long __must_check  copy_from_user(void *to, const void __user *from, unsigned long size)  { @@ -223,11 +223,11 @@ copy_from_user(void *to, const void __user *from, unsigned long size)  }  #define __copy_from_user copy_from_user -extern unsigned long __must_check ___copy_to_user(void __user *to, -						  const void *from, -						  unsigned long size); -extern unsigned long copy_to_user_fixup(void __user *to, const void *from, -					unsigned long size); +unsigned long __must_check ___copy_to_user(void __user *to, +					   const void *from, +					   unsigned long size); +unsigned long copy_to_user_fixup(void __user *to, const void *from, +				 unsigned long size);  static inline unsigned long __must_check  copy_to_user(void __user *to, const void *from, unsigned long size)  { @@ -239,11 +239,11 @@ copy_to_user(void __user *to, const void *from, unsigned long size)  }  #define __copy_to_user copy_to_user -extern unsigned long __must_check ___copy_in_user(void __user *to, -						  const void __user *from, -						  unsigned long size); -extern unsigned long copy_in_user_fixup(void __user *to, void __user *from, -					unsigned long size); +unsigned long __must_check ___copy_in_user(void __user *to, +					   const void __user *from, +					   unsigned long size); +unsigned long copy_in_user_fixup(void __user *to, void __user *from, +				 unsigned long size);  static inline unsigned long __must_check  copy_in_user(void __user *to, void __user *from, unsigned long size)  { @@ -255,20 +255,20 @@ copy_in_user(void __user *to, void __user *from, unsigned long size)  }  #define __copy_in_user copy_in_user -extern unsigned long __must_check __clear_user(void __user *, unsigned long); +unsigned long __must_check __clear_user(void __user *, unsigned long);  #define clear_user __clear_user -extern __must_check long strlen_user(const char __user *str); -extern __must_check long strnlen_user(const char __user *str, long n); +__must_check long strlen_user(const char __user *str); +__must_check long strnlen_user(const char __user *str, long n); -#define __copy_to_user_inatomic ___copy_to_user -#define __copy_from_user_inatomic ___copy_from_user +#define __copy_to_user_inatomic __copy_to_user +#define __copy_from_user_inatomic __copy_from_user  struct pt_regs; -extern unsigned long compute_effective_address(struct pt_regs *, -					       unsigned int insn, -					       unsigned int rd); +unsigned long compute_effective_address(struct pt_regs *, +					unsigned int insn, +					unsigned int rd);  #endif  /* __ASSEMBLY__ */ diff --git a/arch/sparc/include/asm/unistd.h b/arch/sparc/include/asm/unistd.h index dfa53fdd5cb..0aac1e8f296 100644 --- a/arch/sparc/include/asm/unistd.h +++ b/arch/sparc/include/asm/unistd.h @@ -25,7 +25,6 @@  #define __ARCH_WANT_SYS_ALARM  #define __ARCH_WANT_SYS_GETHOSTNAME  #define __ARCH_WANT_SYS_PAUSE -#define __ARCH_WANT_SYS_SGETMASK  #define __ARCH_WANT_SYS_SIGNAL  #define __ARCH_WANT_SYS_TIME  #define __ARCH_WANT_SYS_UTIME diff --git a/arch/sparc/include/asm/vio.h b/arch/sparc/include/asm/vio.h index 432afa83886..e0f6c399f1d 100644 --- a/arch/sparc/include/asm/vio.h +++ b/arch/sparc/include/asm/vio.h @@ -372,14 +372,14 @@ do {	if (vio->debug & VIO_DEBUG_##TYPE) \  		       vio->vdev->channel_id, ## a); \  } while (0) -extern int __vio_register_driver(struct vio_driver *drv, struct module *owner, +int __vio_register_driver(struct vio_driver *drv, struct module *owner,  				 const char *mod_name);  /*   * vio_register_driver must be a macro so that KBUILD_MODNAME can be expanded   */  #define vio_register_driver(driver)		\  	__vio_register_driver(driver, THIS_MODULE, KBUILD_MODNAME) -extern void vio_unregister_driver(struct vio_driver *drv); +void vio_unregister_driver(struct vio_driver *drv);  static inline struct vio_driver *to_vio_driver(struct device_driver *drv)  { @@ -391,21 +391,21 @@ static inline struct vio_dev *to_vio_dev(struct device *dev)  	return container_of(dev, struct vio_dev, dev);  } -extern int vio_ldc_send(struct vio_driver_state *vio, void *data, int len); -extern void vio_link_state_change(struct vio_driver_state *vio, int event); -extern void vio_conn_reset(struct vio_driver_state *vio); -extern int vio_control_pkt_engine(struct vio_driver_state *vio, void *pkt); -extern int vio_validate_sid(struct vio_driver_state *vio, -			    struct vio_msg_tag *tp); -extern u32 vio_send_sid(struct vio_driver_state *vio); -extern int vio_ldc_alloc(struct vio_driver_state *vio, -			 struct ldc_channel_config *base_cfg, void *event_arg); -extern void vio_ldc_free(struct vio_driver_state *vio); -extern int vio_driver_init(struct vio_driver_state *vio, struct vio_dev *vdev, -			   u8 dev_class, struct vio_version *ver_table, -			   int ver_table_size, struct vio_driver_ops *ops, -			   char *name); - -extern void vio_port_up(struct vio_driver_state *vio); +int vio_ldc_send(struct vio_driver_state *vio, void *data, int len); +void vio_link_state_change(struct vio_driver_state *vio, int event); +void vio_conn_reset(struct vio_driver_state *vio); +int vio_control_pkt_engine(struct vio_driver_state *vio, void *pkt); +int vio_validate_sid(struct vio_driver_state *vio, +		     struct vio_msg_tag *tp); +u32 vio_send_sid(struct vio_driver_state *vio); +int vio_ldc_alloc(struct vio_driver_state *vio, +		  struct ldc_channel_config *base_cfg, void *event_arg); +void vio_ldc_free(struct vio_driver_state *vio); +int vio_driver_init(struct vio_driver_state *vio, struct vio_dev *vdev, +		    u8 dev_class, struct vio_version *ver_table, +		    int ver_table_size, struct vio_driver_ops *ops, +		    char *name); + +void vio_port_up(struct vio_driver_state *vio);  #endif /* _SPARC64_VIO_H */ diff --git a/arch/sparc/include/asm/visasm.h b/arch/sparc/include/asm/visasm.h index 39ca301920d..b2667375928 100644 --- a/arch/sparc/include/asm/visasm.h +++ b/arch/sparc/include/asm/visasm.h @@ -57,7 +57,8 @@ static inline void save_and_clear_fpu(void) {  "		" : : "i" (FPRS_FEF|FPRS_DU) :  		"o5", "g1", "g2", "g3", "g7", "cc");  } -extern int vis_emul(struct pt_regs *, unsigned int); + +int vis_emul(struct pt_regs *, unsigned int);  #endif  #endif /* _SPARC64_ASI_H */ diff --git a/arch/sparc/include/asm/xor_64.h b/arch/sparc/include/asm/xor_64.h index ee8edc68423..50c88285603 100644 --- a/arch/sparc/include/asm/xor_64.h +++ b/arch/sparc/include/asm/xor_64.h @@ -20,13 +20,13 @@  #include <asm/spitfire.h> -extern void xor_vis_2(unsigned long, unsigned long *, unsigned long *); -extern void xor_vis_3(unsigned long, unsigned long *, unsigned long *, -		      unsigned long *); -extern void xor_vis_4(unsigned long, unsigned long *, unsigned long *, -		      unsigned long *, unsigned long *); -extern void xor_vis_5(unsigned long, unsigned long *, unsigned long *, -		      unsigned long *, unsigned long *, unsigned long *); +void xor_vis_2(unsigned long, unsigned long *, unsigned long *); +void xor_vis_3(unsigned long, unsigned long *, unsigned long *, +	       unsigned long *); +void xor_vis_4(unsigned long, unsigned long *, unsigned long *, +	       unsigned long *, unsigned long *); +void xor_vis_5(unsigned long, unsigned long *, unsigned long *, +	       unsigned long *, unsigned long *, unsigned long *);  /* XXX Ugh, write cheetah versions... -DaveM */ @@ -38,13 +38,13 @@ static struct xor_block_template xor_block_VIS = {          .do_5	= xor_vis_5,  }; -extern void xor_niagara_2(unsigned long, unsigned long *, unsigned long *); -extern void xor_niagara_3(unsigned long, unsigned long *, unsigned long *, -			  unsigned long *); -extern void xor_niagara_4(unsigned long, unsigned long *, unsigned long *, -			  unsigned long *, unsigned long *); -extern void xor_niagara_5(unsigned long, unsigned long *, unsigned long *, -			  unsigned long *, unsigned long *, unsigned long *); +void xor_niagara_2(unsigned long, unsigned long *, unsigned long *); +void xor_niagara_3(unsigned long, unsigned long *, unsigned long *, +		   unsigned long *); +void xor_niagara_4(unsigned long, unsigned long *, unsigned long *, +		   unsigned long *, unsigned long *); +void xor_niagara_5(unsigned long, unsigned long *, unsigned long *, +		   unsigned long *, unsigned long *, unsigned long *);  static struct xor_block_template xor_block_niagara = {          .name	= "Niagara", diff --git a/arch/sparc/include/uapi/asm/errno.h b/arch/sparc/include/uapi/asm/errno.h index c351aba997b..20423e17285 100644 --- a/arch/sparc/include/uapi/asm/errno.h +++ b/arch/sparc/include/uapi/asm/errno.h @@ -40,7 +40,7 @@  #define EPROCLIM        67      /* SUNOS: Too many processes */  #define	EUSERS		68	/* Too many users */  #define	EDQUOT		69	/* Quota exceeded */ -#define	ESTALE		70	/* Stale NFS file handle */ +#define	ESTALE		70	/* Stale file handle */  #define	EREMOTE		71	/* Object is remote */  #define	ENOSTR		72	/* Device not a stream */  #define	ETIME		73	/* Timer expired */ diff --git a/arch/sparc/include/uapi/asm/socket.h b/arch/sparc/include/uapi/asm/socket.h index 4e1d66c3ce7..54d9608681b 100644 --- a/arch/sparc/include/uapi/asm/socket.h +++ b/arch/sparc/include/uapi/asm/socket.h @@ -72,6 +72,10 @@  #define SO_BUSY_POLL		0x0030 +#define SO_MAX_PACING_RATE	0x0031 + +#define SO_BPF_EXTENSIONS	0x0032 +  /* Security levels - as per NRL IPv6 - don't actually do anything */  #define SO_SECURITY_AUTHENTICATION		0x5001  #define SO_SECURITY_ENCRYPTION_TRANSPORT	0x5002 diff --git a/arch/sparc/include/uapi/asm/unistd.h b/arch/sparc/include/uapi/asm/unistd.h index 62ced589bcf..42f2bca1d33 100644 --- a/arch/sparc/include/uapi/asm/unistd.h +++ b/arch/sparc/include/uapi/asm/unistd.h @@ -408,8 +408,11 @@  #define __NR_kern_features	340  #define __NR_kcmp		341  #define __NR_finit_module	342 +#define __NR_sched_setattr	343 +#define __NR_sched_getattr	344 +#define __NR_renameat2		345 -#define NR_syscalls		343 +#define NR_syscalls		346  /* Bitmask values returned from kern_features system call.  */  #define KERN_FEATURE_MIXED_MODE_STACK	0x00000001 diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile index d432fb20358..7cf9c6ea3f1 100644 --- a/arch/sparc/kernel/Makefile +++ b/arch/sparc/kernel/Makefile @@ -1,3 +1,4 @@ +  #  # Makefile for the linux kernel.  # @@ -41,7 +42,6 @@ obj-y                   += time_$(BITS).o  obj-$(CONFIG_SPARC32)   += windows.o  obj-y                   += cpu.o  obj-$(CONFIG_SPARC32)   += devices.o -obj-$(CONFIG_SPARC32)   += tadpole.o  obj-y                   += ptrace_$(BITS).o  obj-y                   += unaligned_$(BITS).o  obj-y                   += una_asm_$(BITS).o @@ -99,7 +99,7 @@ obj-$(CONFIG_STACKTRACE)     += stacktrace.o  obj-$(CONFIG_SPARC64_PCI)    += pci.o pci_common.o psycho_common.o  obj-$(CONFIG_SPARC64_PCI)    += pci_psycho.o pci_sabre.o pci_schizo.o  obj-$(CONFIG_SPARC64_PCI)    += pci_sun4v.o pci_sun4v_asm.o pci_fire.o -obj-$(CONFIG_PCI_MSI)        += pci_msi.o +obj-$(CONFIG_SPARC64_PCI_MSI) += pci_msi.o  obj-$(CONFIG_COMPAT)         += sys32.o sys_sparc32.o signal32.o diff --git a/arch/sparc/kernel/audit.c b/arch/sparc/kernel/audit.c index 8fff0ac63d5..24361b494a9 100644 --- a/arch/sparc/kernel/audit.c +++ b/arch/sparc/kernel/audit.c @@ -3,6 +3,8 @@  #include <linux/audit.h>  #include <asm/unistd.h> +#include "kernel.h" +  static unsigned dir_class[] = {  #include <asm-generic/audit_dir_write.h>  ~0U @@ -40,7 +42,6 @@ int audit_classify_arch(int arch)  int audit_classify_syscall(int abi, unsigned syscall)  {  #ifdef CONFIG_COMPAT -	extern int sparc32_classify_syscall(unsigned);  	if (abi == AUDIT_ARCH_SPARC)  		return sparc32_classify_syscall(syscall);  #endif @@ -61,11 +62,6 @@ int audit_classify_syscall(int abi, unsigned syscall)  static int __init audit_classes_init(void)  {  #ifdef CONFIG_COMPAT -	extern __u32 sparc32_dir_class[]; -	extern __u32 sparc32_write_class[]; -	extern __u32 sparc32_read_class[]; -	extern __u32 sparc32_chattr_class[]; -	extern __u32 sparc32_signal_class[];  	audit_register_class(AUDIT_CLASS_WRITE_32, sparc32_write_class);  	audit_register_class(AUDIT_CLASS_READ_32, sparc32_read_class);  	audit_register_class(AUDIT_CLASS_DIR_WRITE_32, sparc32_dir_class); diff --git a/arch/sparc/kernel/auxio_32.c b/arch/sparc/kernel/auxio_32.c index e20cc55fb76..ae88c223e4d 100644 --- a/arch/sparc/kernel/auxio_32.c +++ b/arch/sparc/kernel/auxio_32.c @@ -9,12 +9,15 @@  #include <linux/of.h>  #include <linux/of_device.h>  #include <linux/export.h> +  #include <asm/oplib.h>  #include <asm/io.h>  #include <asm/auxio.h>  #include <asm/string.h>		/* memset(), Linux has no bzero() */  #include <asm/cpu_type.h> +#include "kernel.h" +  /* Probe and map in the Auxiliary I/O register */  /* auxio_register is not static because it is referenced  @@ -103,7 +106,7 @@ EXPORT_SYMBOL(set_auxio);  /* sun4m power control register (AUXIO2) */ -volatile unsigned char * auxio_power_register = NULL; +volatile u8 __iomem *auxio_power_register = NULL;  void __init auxio_power_probe(void)  { @@ -127,8 +130,8 @@ void __init auxio_power_probe(void)  	r.flags = regs.which_io & 0xF;  	r.start = regs.phys_addr;  	r.end = regs.phys_addr + regs.reg_size - 1; -	auxio_power_register = (unsigned char *) of_ioremap(&r, 0, -	    regs.reg_size, "auxpower"); +	auxio_power_register = +		(u8 __iomem *)of_ioremap(&r, 0, regs.reg_size, "auxpower");  	/* Display a quick message on the console. */  	if (auxio_power_register) diff --git a/arch/sparc/kernel/btext.c b/arch/sparc/kernel/btext.c index 57073e56ba9..987f7ec497c 100644 --- a/arch/sparc/kernel/btext.c +++ b/arch/sparc/kernel/btext.c @@ -137,7 +137,7 @@ static void scrollscreen(void)  }  #endif /* ndef NO_SCROLL */ -void btext_drawchar(char c) +static void btext_drawchar(char c)  {  	int cline = 0;  #ifdef NO_SCROLL diff --git a/arch/sparc/kernel/compat_audit.c b/arch/sparc/kernel/compat_audit.c index d865575b25b..7062263d09c 100644 --- a/arch/sparc/kernel/compat_audit.c +++ b/arch/sparc/kernel/compat_audit.c @@ -1,5 +1,6 @@  #define __32bit_syscall_numbers__  #include <asm/unistd.h> +#include "kernel.h"  unsigned sparc32_dir_class[] = {  #include <asm-generic/audit_dir_write.h> diff --git a/arch/sparc/kernel/cpu.c b/arch/sparc/kernel/cpu.c index 5c5125895db..82a3a71c451 100644 --- a/arch/sparc/kernel/cpu.c +++ b/arch/sparc/kernel/cpu.c @@ -22,6 +22,7 @@  #include <asm/cpudata.h>  #include "kernel.h" +#include "entry.h"  DEFINE_PER_CPU(cpuinfo_sparc, __cpu_data) = { 0 };  EXPORT_PER_CPU_SYMBOL(__cpu_data); diff --git a/arch/sparc/kernel/cpumap.c b/arch/sparc/kernel/cpumap.c index cb5d272d658..de1c844dfab 100644 --- a/arch/sparc/kernel/cpumap.c +++ b/arch/sparc/kernel/cpumap.c @@ -6,7 +6,6 @@  #include <linux/export.h>  #include <linux/slab.h>  #include <linux/kernel.h> -#include <linux/init.h>  #include <linux/cpumask.h>  #include <linux/spinlock.h>  #include <asm/cpudata.h> diff --git a/arch/sparc/kernel/cpumap.h b/arch/sparc/kernel/cpumap.h index e639880ab86..9dac398c434 100644 --- a/arch/sparc/kernel/cpumap.h +++ b/arch/sparc/kernel/cpumap.h @@ -2,8 +2,8 @@  #define _CPUMAP_H  #ifdef CONFIG_SMP -extern void cpu_map_rebuild(void); -extern int  map_to_cpu(unsigned int index); +void cpu_map_rebuild(void); +int map_to_cpu(unsigned int index);  #define cpu_map_init() cpu_map_rebuild()  #else  #define cpu_map_init() do {} while (0) diff --git a/arch/sparc/kernel/devices.c b/arch/sparc/kernel/devices.c index 3d465e87f7e..8d5d09f09ca 100644 --- a/arch/sparc/kernel/devices.c +++ b/arch/sparc/kernel/devices.c @@ -19,8 +19,9 @@  #include <asm/smp.h>  #include <asm/cpudata.h>  #include <asm/cpu_type.h> +#include <asm/setup.h> -extern void clock_stop_probe(void); /* tadpole.c */ +#include "kernel.h"  static char *cpu_mid_prop(void)  { @@ -131,11 +132,6 @@ void __init device_scan(void)  	}  #endif /* !CONFIG_SMP */ -	{ -		extern void auxio_probe(void); -		extern void auxio_power_probe(void); -		auxio_probe(); -		auxio_power_probe(); -	} -	clock_stop_probe(); +	auxio_probe(); +	auxio_power_probe();  } diff --git a/arch/sparc/kernel/ds.c b/arch/sparc/kernel/ds.c index 4d9ac8406f3..dff60abbea0 100644 --- a/arch/sparc/kernel/ds.c +++ b/arch/sparc/kernel/ds.c @@ -849,9 +849,8 @@ void ldom_reboot(const char *boot_command)  	if (boot_command && strlen(boot_command)) {  		unsigned long len; -		strcpy(full_boot_str, "boot "); -		strlcpy(full_boot_str + strlen("boot "), boot_command, -			sizeof(full_boot_str)); +		snprintf(full_boot_str, sizeof(full_boot_str), "boot %s", +			 boot_command);  		len = strlen(full_boot_str);  		if (reboot_data_supported) { diff --git a/arch/sparc/kernel/ebus.c b/arch/sparc/kernel/ebus.c index e306fb08ee5..acf8314cec4 100644 --- a/arch/sparc/kernel/ebus.c +++ b/arch/sparc/kernel/ebus.c @@ -7,7 +7,6 @@  #include <linux/export.h>  #include <linux/kernel.h>  #include <linux/types.h> -#include <linux/init.h>  #include <linux/interrupt.h>  #include <linux/delay.h> diff --git a/arch/sparc/kernel/entry.h b/arch/sparc/kernel/entry.h index 9c179fbfb21..ebaba6167dd 100644 --- a/arch/sparc/kernel/entry.h +++ b/arch/sparc/kernel/entry.h @@ -6,40 +6,39 @@  #include <linux/init.h>  /* irq */ -extern void handler_irq(int irq, struct pt_regs *regs); +void handler_irq(int irq, struct pt_regs *regs);  #ifdef CONFIG_SPARC32  /* traps */ -extern void do_hw_interrupt(struct pt_regs *regs, unsigned long type); -extern void do_illegal_instruction(struct pt_regs *regs, unsigned long pc, -                                   unsigned long npc, unsigned long psr); - -extern void do_priv_instruction(struct pt_regs *regs, unsigned long pc, -                                unsigned long npc, unsigned long psr); -extern void do_memaccess_unaligned(struct pt_regs *regs, unsigned long pc, -                                   unsigned long npc, -                                   unsigned long psr); -extern void do_fpd_trap(struct pt_regs *regs, unsigned long pc, +void do_hw_interrupt(struct pt_regs *regs, unsigned long type); +void do_illegal_instruction(struct pt_regs *regs, unsigned long pc, +                            unsigned long npc, unsigned long psr); + +void do_priv_instruction(struct pt_regs *regs, unsigned long pc, +                         unsigned long npc, unsigned long psr); +void do_memaccess_unaligned(struct pt_regs *regs, unsigned long pc, +                            unsigned long npc, unsigned long psr); +void do_fpd_trap(struct pt_regs *regs, unsigned long pc, +                 unsigned long npc, unsigned long psr); +void do_fpe_trap(struct pt_regs *regs, unsigned long pc, +                 unsigned long npc, unsigned long psr); +void handle_tag_overflow(struct pt_regs *regs, unsigned long pc, +                         unsigned long npc, unsigned long psr); +void handle_watchpoint(struct pt_regs *regs, unsigned long pc, +                       unsigned long npc, unsigned long psr); +void handle_reg_access(struct pt_regs *regs, unsigned long pc, +                       unsigned long npc, unsigned long psr); +void handle_cp_disabled(struct pt_regs *regs, unsigned long pc,                          unsigned long npc, unsigned long psr); -extern void do_fpe_trap(struct pt_regs *regs, unsigned long pc, -                        unsigned long npc, unsigned long psr); -extern void handle_tag_overflow(struct pt_regs *regs, unsigned long pc, -                                unsigned long npc, unsigned long psr); -extern void handle_watchpoint(struct pt_regs *regs, unsigned long pc, -                              unsigned long npc, unsigned long psr); -extern void handle_reg_access(struct pt_regs *regs, unsigned long pc, -                              unsigned long npc, unsigned long psr); -extern void handle_cp_disabled(struct pt_regs *regs, unsigned long pc, -                               unsigned long npc, unsigned long psr); -extern void handle_cp_exception(struct pt_regs *regs, unsigned long pc, -                                unsigned long npc, unsigned long psr); +void handle_cp_exception(struct pt_regs *regs, unsigned long pc, +                         unsigned long npc, unsigned long psr);  /* entry.S */ -extern void fpsave(unsigned long *fpregs, unsigned long *fsr, -                   void *fpqueue, unsigned long *fpqdepth); -extern void fpload(unsigned long *fpregs, unsigned long *fsr); +void fpsave(unsigned long *fpregs, unsigned long *fsr, +            void *fpqueue, unsigned long *fpqdepth); +void fpload(unsigned long *fpregs, unsigned long *fsr);  #else /* CONFIG_SPARC32 */ @@ -66,124 +65,123 @@ struct pause_patch_entry {  extern struct pause_patch_entry __pause_3insn_patch,  	__pause_3insn_patch_end; -extern void __init per_cpu_patch(void); -extern void sun4v_patch_1insn_range(struct sun4v_1insn_patch_entry *, -				    struct sun4v_1insn_patch_entry *); -extern void sun4v_patch_2insn_range(struct sun4v_2insn_patch_entry *, -				    struct sun4v_2insn_patch_entry *); -extern void __init sun4v_patch(void); -extern void __init boot_cpu_id_too_large(int cpu); +void __init per_cpu_patch(void); +void sun4v_patch_1insn_range(struct sun4v_1insn_patch_entry *, +			     struct sun4v_1insn_patch_entry *); +void sun4v_patch_2insn_range(struct sun4v_2insn_patch_entry *, +			     struct sun4v_2insn_patch_entry *); +void __init sun4v_patch(void); +void __init boot_cpu_id_too_large(int cpu);  extern unsigned int dcache_parity_tl1_occurred;  extern unsigned int icache_parity_tl1_occurred; -extern asmlinkage void sparc_breakpoint(struct pt_regs *regs); -extern void timer_interrupt(int irq, struct pt_regs *regs); - -extern void do_notify_resume(struct pt_regs *regs, -			     unsigned long orig_i0, -			     unsigned long thread_info_flags); - -extern asmlinkage int syscall_trace_enter(struct pt_regs *regs); -extern asmlinkage void syscall_trace_leave(struct pt_regs *regs); - -extern void bad_trap_tl1(struct pt_regs *regs, long lvl); - -extern void do_fpe_common(struct pt_regs *regs); -extern void do_fpieee(struct pt_regs *regs); -extern void do_fpother(struct pt_regs *regs); -extern void do_tof(struct pt_regs *regs); -extern void do_div0(struct pt_regs *regs); -extern void do_illegal_instruction(struct pt_regs *regs); -extern void mem_address_unaligned(struct pt_regs *regs, -				  unsigned long sfar, -				  unsigned long sfsr); -extern void sun4v_do_mna(struct pt_regs *regs, -			 unsigned long addr, -			 unsigned long type_ctx); -extern void do_privop(struct pt_regs *regs); -extern void do_privact(struct pt_regs *regs); -extern void do_cee(struct pt_regs *regs); -extern void do_cee_tl1(struct pt_regs *regs); -extern void do_dae_tl1(struct pt_regs *regs); -extern void do_iae_tl1(struct pt_regs *regs); -extern void do_div0_tl1(struct pt_regs *regs); -extern void do_fpdis_tl1(struct pt_regs *regs); -extern void do_fpieee_tl1(struct pt_regs *regs); -extern void do_fpother_tl1(struct pt_regs *regs); -extern void do_ill_tl1(struct pt_regs *regs); -extern void do_irq_tl1(struct pt_regs *regs); -extern void do_lddfmna_tl1(struct pt_regs *regs); -extern void do_stdfmna_tl1(struct pt_regs *regs); -extern void do_paw(struct pt_regs *regs); -extern void do_paw_tl1(struct pt_regs *regs); -extern void do_vaw(struct pt_regs *regs); -extern void do_vaw_tl1(struct pt_regs *regs); -extern void do_tof_tl1(struct pt_regs *regs); -extern void do_getpsr(struct pt_regs *regs); - -extern void spitfire_insn_access_exception(struct pt_regs *regs, -					   unsigned long sfsr, -					   unsigned long sfar); -extern void spitfire_insn_access_exception_tl1(struct pt_regs *regs, -					       unsigned long sfsr, -					       unsigned long sfar); -extern void spitfire_data_access_exception(struct pt_regs *regs, -					   unsigned long sfsr, -					   unsigned long sfar); -extern void spitfire_data_access_exception_tl1(struct pt_regs *regs, -					       unsigned long sfsr, -					       unsigned long sfar); -extern void spitfire_access_error(struct pt_regs *regs, -				  unsigned long status_encoded, -				  unsigned long afar); - -extern void cheetah_fecc_handler(struct pt_regs *regs, -				 unsigned long afsr, -				 unsigned long afar); -extern void cheetah_cee_handler(struct pt_regs *regs, -				unsigned long afsr, -				unsigned long afar); -extern void cheetah_deferred_handler(struct pt_regs *regs, -				     unsigned long afsr, -				     unsigned long afar); -extern void cheetah_plus_parity_error(int type, struct pt_regs *regs); - -extern void sun4v_insn_access_exception(struct pt_regs *regs, -					unsigned long addr, -					unsigned long type_ctx); -extern void sun4v_insn_access_exception_tl1(struct pt_regs *regs, -					    unsigned long addr, -					    unsigned long type_ctx); -extern void sun4v_data_access_exception(struct pt_regs *regs, -					unsigned long addr, -					unsigned long type_ctx); -extern void sun4v_data_access_exception_tl1(struct pt_regs *regs, -					    unsigned long addr, -					    unsigned long type_ctx); -extern void sun4v_resum_error(struct pt_regs *regs, -			      unsigned long offset); -extern void sun4v_resum_overflow(struct pt_regs *regs); -extern void sun4v_nonresum_error(struct pt_regs *regs, -				 unsigned long offset); -extern void sun4v_nonresum_overflow(struct pt_regs *regs); +asmlinkage void sparc_breakpoint(struct pt_regs *regs); +void timer_interrupt(int irq, struct pt_regs *regs); + +void do_notify_resume(struct pt_regs *regs, +		      unsigned long orig_i0, +		      unsigned long thread_info_flags); + +asmlinkage int syscall_trace_enter(struct pt_regs *regs); +asmlinkage void syscall_trace_leave(struct pt_regs *regs); + +void bad_trap_tl1(struct pt_regs *regs, long lvl); + +void do_fpieee(struct pt_regs *regs); +void do_fpother(struct pt_regs *regs); +void do_tof(struct pt_regs *regs); +void do_div0(struct pt_regs *regs); +void do_illegal_instruction(struct pt_regs *regs); +void mem_address_unaligned(struct pt_regs *regs, +			   unsigned long sfar, +			   unsigned long sfsr); +void sun4v_do_mna(struct pt_regs *regs, +		  unsigned long addr, +		  unsigned long type_ctx); +void do_privop(struct pt_regs *regs); +void do_privact(struct pt_regs *regs); +void do_cee(struct pt_regs *regs); +void do_cee_tl1(struct pt_regs *regs); +void do_dae_tl1(struct pt_regs *regs); +void do_iae_tl1(struct pt_regs *regs); +void do_div0_tl1(struct pt_regs *regs); +void do_fpdis_tl1(struct pt_regs *regs); +void do_fpieee_tl1(struct pt_regs *regs); +void do_fpother_tl1(struct pt_regs *regs); +void do_ill_tl1(struct pt_regs *regs); +void do_irq_tl1(struct pt_regs *regs); +void do_lddfmna_tl1(struct pt_regs *regs); +void do_stdfmna_tl1(struct pt_regs *regs); +void do_paw(struct pt_regs *regs); +void do_paw_tl1(struct pt_regs *regs); +void do_vaw(struct pt_regs *regs); +void do_vaw_tl1(struct pt_regs *regs); +void do_tof_tl1(struct pt_regs *regs); +void do_getpsr(struct pt_regs *regs); + +void spitfire_insn_access_exception(struct pt_regs *regs, +				    unsigned long sfsr, +				    unsigned long sfar); +void spitfire_insn_access_exception_tl1(struct pt_regs *regs, +				        unsigned long sfsr, +				        unsigned long sfar); +void spitfire_data_access_exception(struct pt_regs *regs, +				    unsigned long sfsr, +				    unsigned long sfar); +void spitfire_data_access_exception_tl1(struct pt_regs *regs, +				        unsigned long sfsr, +				        unsigned long sfar); +void spitfire_access_error(struct pt_regs *regs, +			   unsigned long status_encoded, +			   unsigned long afar); + +void cheetah_fecc_handler(struct pt_regs *regs, +			  unsigned long afsr, +			  unsigned long afar); +void cheetah_cee_handler(struct pt_regs *regs, +			 unsigned long afsr, +			 unsigned long afar); +void cheetah_deferred_handler(struct pt_regs *regs, +			      unsigned long afsr, +			      unsigned long afar); +void cheetah_plus_parity_error(int type, struct pt_regs *regs); + +void sun4v_insn_access_exception(struct pt_regs *regs, +				 unsigned long addr, +				 unsigned long type_ctx); +void sun4v_insn_access_exception_tl1(struct pt_regs *regs, +				     unsigned long addr, +				     unsigned long type_ctx); +void sun4v_data_access_exception(struct pt_regs *regs, +				 unsigned long addr, +				 unsigned long type_ctx); +void sun4v_data_access_exception_tl1(struct pt_regs *regs, +				     unsigned long addr, +				     unsigned long type_ctx); +void sun4v_resum_error(struct pt_regs *regs, +		       unsigned long offset); +void sun4v_resum_overflow(struct pt_regs *regs); +void sun4v_nonresum_error(struct pt_regs *regs, +			  unsigned long offset); +void sun4v_nonresum_overflow(struct pt_regs *regs);  extern unsigned long sun4v_err_itlb_vaddr;  extern unsigned long sun4v_err_itlb_ctx;  extern unsigned long sun4v_err_itlb_pte;  extern unsigned long sun4v_err_itlb_error; -extern void sun4v_itlb_error_report(struct pt_regs *regs, int tl); +void sun4v_itlb_error_report(struct pt_regs *regs, int tl);  extern unsigned long sun4v_err_dtlb_vaddr;  extern unsigned long sun4v_err_dtlb_ctx;  extern unsigned long sun4v_err_dtlb_pte;  extern unsigned long sun4v_err_dtlb_error; -extern void sun4v_dtlb_error_report(struct pt_regs *regs, int tl); -extern void hypervisor_tlbop_error(unsigned long err, -				   unsigned long op); -extern void hypervisor_tlbop_error_xcall(unsigned long err, -					 unsigned long op); +void sun4v_dtlb_error_report(struct pt_regs *regs, int tl); +void hypervisor_tlbop_error(unsigned long err, +			    unsigned long op); +void hypervisor_tlbop_error_xcall(unsigned long err, +				  unsigned long op);  /* WARNING: The error trap handlers in assembly know the precise   *	    layout of the following structure. @@ -249,8 +247,8 @@ struct ino_bucket {  extern struct ino_bucket *ivector_table;  extern unsigned long ivector_table_pa; -extern void init_irqwork_curcpu(void); -extern void sun4v_register_mondo_queues(int this_cpu); +void init_irqwork_curcpu(void); +void sun4v_register_mondo_queues(int this_cpu);  #endif /* CONFIG_SPARC32 */  #endif /* _ENTRY_H */ diff --git a/arch/sparc/kernel/ftrace.c b/arch/sparc/kernel/ftrace.c index 03ab022e51c..0a2d2ddff54 100644 --- a/arch/sparc/kernel/ftrace.c +++ b/arch/sparc/kernel/ftrace.c @@ -82,12 +82,8 @@ int ftrace_update_ftrace_func(ftrace_func_t func)  	return ftrace_modify_code(ip, old, new);  } -int __init ftrace_dyn_arch_init(void *data) +int __init ftrace_dyn_arch_init(void)  { -	unsigned long *p = data; - -	*p = 0; -  	return 0;  }  #endif diff --git a/arch/sparc/kernel/head_64.S b/arch/sparc/kernel/head_64.S index 26b706a1867..452f04fe8da 100644 --- a/arch/sparc/kernel/head_64.S +++ b/arch/sparc/kernel/head_64.S @@ -282,8 +282,8 @@ sun4v_chip_type:  	stx	%l2, [%l4 + 0x0]  	ldx	[%sp + 2047 + 128 + 0x50], %l3	! physaddr low  	/* 4MB align */ -	srlx	%l3, 22, %l3 -	sllx	%l3, 22, %l3 +	srlx	%l3, ILOG2_4MB, %l3 +	sllx	%l3, ILOG2_4MB, %l3  	stx	%l3, [%l4 + 0x8]  	/* Leave service as-is, "call-method" */ diff --git a/arch/sparc/kernel/hvtramp.S b/arch/sparc/kernel/hvtramp.S index 4eb1a5a1d54..b7ddcdd1dea 100644 --- a/arch/sparc/kernel/hvtramp.S +++ b/arch/sparc/kernel/hvtramp.S @@ -3,7 +3,6 @@   * Copyright (C) 2007, 2008 David S. Miller <davem@davemloft.net>   */ -#include <linux/init.h>  #include <asm/thread_info.h>  #include <asm/hypervisor.h> diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c index 070ed141aac..bfa4d0c2df4 100644 --- a/arch/sparc/kernel/iommu.c +++ b/arch/sparc/kernel/iommu.c @@ -21,6 +21,7 @@  #include <asm/iommu.h>  #include "iommu_common.h" +#include "kernel.h"  #define STC_CTXMATCH_ADDR(STC, CTX)	\  	((STC)->strbuf_ctxmatch_base + ((CTX) << 3)) @@ -840,8 +841,6 @@ static struct dma_map_ops sun4u_dma_ops = {  struct dma_map_ops *dma_ops = &sun4u_dma_ops;  EXPORT_SYMBOL(dma_ops); -extern int pci64_dma_supported(struct pci_dev *pdev, u64 device_mask); -  int dma_supported(struct device *dev, u64 device_mask)  {  	struct iommu *iommu = dev->archdata.iommu; @@ -854,7 +853,7 @@ int dma_supported(struct device *dev, u64 device_mask)  		return 1;  #ifdef CONFIG_PCI -	if (dev->bus == &pci_bus_type) +	if (dev_is_pci(dev))  		return pci64_dma_supported(to_pci_dev(dev), device_mask);  #endif diff --git a/arch/sparc/kernel/iommu_common.h b/arch/sparc/kernel/iommu_common.h index 591f5879039..1ec0de4156e 100644 --- a/arch/sparc/kernel/iommu_common.h +++ b/arch/sparc/kernel/iommu_common.h @@ -48,12 +48,12 @@ static inline int is_span_boundary(unsigned long entry,  	return iommu_is_span_boundary(entry, nr, shift, boundary_size);  } -extern unsigned long iommu_range_alloc(struct device *dev, -				       struct iommu *iommu, -				       unsigned long npages, -				       unsigned long *handle); -extern void iommu_range_free(struct iommu *iommu, -			     dma_addr_t dma_addr, -			     unsigned long npages); +unsigned long iommu_range_alloc(struct device *dev, +				struct iommu *iommu, +				unsigned long npages, +				unsigned long *handle); +void iommu_range_free(struct iommu *iommu, +		      dma_addr_t dma_addr, +		      unsigned long npages);  #endif /* _IOMMU_COMMON_H */ diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index 2096468de9b..7f08ec8a7c6 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c @@ -186,7 +186,7 @@ static void __iomem *_sparc_alloc_io(unsigned int busno, unsigned long phys,  	if (name == NULL) name = "???"; -	if ((xres = xres_alloc()) != 0) { +	if ((xres = xres_alloc()) != NULL) {  		tack = xres->xname;  		res = &xres->xres;  	} else { @@ -400,7 +400,7 @@ static void sbus_sync_sg_for_device(struct device *dev, struct scatterlist *sg,  	BUG();  } -struct dma_map_ops sbus_dma_ops = { +static struct dma_map_ops sbus_dma_ops = {  	.alloc			= sbus_alloc_coherent,  	.free			= sbus_free_coherent,  	.map_page		= sbus_map_page, @@ -666,10 +666,9 @@ EXPORT_SYMBOL(dma_ops);   */  int dma_supported(struct device *dev, u64 mask)  { -#ifdef CONFIG_PCI -	if (dev->bus == &pci_bus_type) +	if (dev_is_pci(dev))  		return 1; -#endif +  	return 0;  }  EXPORT_SYMBOL(dma_supported); @@ -682,7 +681,7 @@ static int sparc_io_proc_show(struct seq_file *m, void *v)  	const char *nm;  	for (r = root->child; r != NULL; r = r->sibling) { -		if ((nm = r->name) == 0) nm = "???"; +		if ((nm = r->name) == NULL) nm = "???";  		seq_printf(m, "%016llx-%016llx: %s\n",  				(unsigned long long)r->start,  				(unsigned long long)r->end, nm); diff --git a/arch/sparc/kernel/irq.h b/arch/sparc/kernel/irq.h index b66b6aad1d6..70a0b8ddd0b 100644 --- a/arch/sparc/kernel/irq.h +++ b/arch/sparc/kernel/irq.h @@ -82,11 +82,20 @@ void handler_irq(unsigned int pil, struct pt_regs *regs);  unsigned long leon_get_irqmask(unsigned int irq); +/* irq_32.c */ +void sparc_floppy_irq(int irq, void *dev_id, struct pt_regs *regs); + +/* sun4m_irq.c */ +void sun4m_nmi(struct pt_regs *regs); + +/* sun4d_irq.c */ +void sun4d_handler_irq(unsigned int pil, struct pt_regs *regs); +  #ifdef CONFIG_SMP  /* All SUN4D IPIs are sent on this IRQ, may be shared with hard IRQs */  #define SUN4D_IPI_IRQ 13 -extern void sun4d_ipi_interrupt(void); +void sun4d_ipi_interrupt(void);  #endif diff --git a/arch/sparc/kernel/irq_32.c b/arch/sparc/kernel/irq_32.c index c145f6fd123..a979e99f875 100644 --- a/arch/sparc/kernel/irq_32.c +++ b/arch/sparc/kernel/irq_32.c @@ -17,6 +17,7 @@  #include <asm/cacheflush.h>  #include <asm/cpudata.h> +#include <asm/setup.h>  #include <asm/pcic.h>  #include <asm/leon.h> diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index d4840cec2c5..666193f4e8b 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c @@ -698,30 +698,19 @@ void __irq_entry handler_irq(int pil, struct pt_regs *regs)  	set_irq_regs(old_regs);  } -void do_softirq(void) +void do_softirq_own_stack(void)  { -	unsigned long flags; - -	if (in_interrupt()) -		return; - -	local_irq_save(flags); +	void *orig_sp, *sp = softirq_stack[smp_processor_id()]; -	if (local_softirq_pending()) { -		void *orig_sp, *sp = softirq_stack[smp_processor_id()]; - -		sp += THREAD_SIZE - 192 - STACK_BIAS; - -		__asm__ __volatile__("mov %%sp, %0\n\t" -				     "mov %1, %%sp" -				     : "=&r" (orig_sp) -				     : "r" (sp)); -		__do_softirq(); -		__asm__ __volatile__("mov %0, %%sp" -				     : : "r" (orig_sp)); -	} +	sp += THREAD_SIZE - 192 - STACK_BIAS; -	local_irq_restore(flags); +	__asm__ __volatile__("mov %%sp, %0\n\t" +			     "mov %1, %%sp" +			     : "=&r" (orig_sp) +			     : "r" (sp)); +	__do_softirq(); +	__asm__ __volatile__("mov %0, %%sp" +			     : : "r" (orig_sp));  }  #ifdef CONFIG_HOTPLUG_CPU diff --git a/arch/sparc/kernel/kernel.h b/arch/sparc/kernel/kernel.h index a702d9ab019..e7f652be9e6 100644 --- a/arch/sparc/kernel/kernel.h +++ b/arch/sparc/kernel/kernel.h @@ -2,6 +2,7 @@  #define __SPARC_KERNEL_H  #include <linux/interrupt.h> +#include <linux/ftrace.h>  #include <asm/traps.h>  #include <asm/head.h> @@ -15,62 +16,111 @@ extern int ncpus_probed;  #ifdef CONFIG_SPARC64  /* setup_64.c */  struct seq_file; -extern void cpucap_info(struct seq_file *); +void cpucap_info(struct seq_file *); -static inline unsigned long kimage_addr_to_ra(const char *p) +static inline unsigned long kimage_addr_to_ra(const void *p)  {  	unsigned long val = (unsigned long) p;  	return kern_base + (val - KERNBASE);  } + +/* sys_sparc_64.c */ +asmlinkage long sys_kern_features(void); + +/* unaligned_64.c */ +asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn); +int handle_popc(u32 insn, struct pt_regs *regs); +void handle_lddfmna(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr); +void handle_stdfmna(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr); + +/* smp_64.c */ +void __irq_entry smp_call_function_client(int irq, struct pt_regs *regs); +void __irq_entry smp_call_function_single_client(int irq, struct pt_regs *regs); +void __irq_entry smp_new_mmu_context_version_client(int irq, struct pt_regs *regs); +void __irq_entry smp_penguin_jailcell(int irq, struct pt_regs *regs); +void __irq_entry smp_receive_signal_client(int irq, struct pt_regs *regs); + +/* kgdb_64.c */ +void __irq_entry smp_kgdb_capture_client(int irq, struct pt_regs *regs); + +/* pci.c */ +int pci64_dma_supported(struct pci_dev *pdev, u64 device_mask); + +/* signal32.c */ +void do_sigreturn32(struct pt_regs *regs); +asmlinkage void do_rt_sigreturn32(struct pt_regs *regs); +void do_signal32(struct pt_regs * regs); +asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp); + +/* compat_audit.c */ +extern unsigned sparc32_dir_class[]; +extern unsigned sparc32_chattr_class[]; +extern unsigned sparc32_write_class[]; +extern unsigned sparc32_read_class[]; +extern unsigned sparc32_signal_class[]; +int sparc32_classify_syscall(unsigned syscall);  #endif  #ifdef CONFIG_SPARC32  /* setup_32.c */ +struct linux_romvec;  void sparc32_start_kernel(struct linux_romvec *rp);  /* cpu.c */ -extern void cpu_probe(void); +void cpu_probe(void);  /* traps_32.c */ -extern void handle_hw_divzero(struct pt_regs *regs, unsigned long pc, -                              unsigned long npc, unsigned long psr); +void handle_hw_divzero(struct pt_regs *regs, unsigned long pc, +                       unsigned long npc, unsigned long psr);  /* irq_32.c */  extern struct irqaction static_irqaction[];  extern int static_irq_count;  extern spinlock_t irq_action_lock; -extern void unexpected_irq(int irq, void *dev_id, struct pt_regs * regs); -extern void init_IRQ(void); +void unexpected_irq(int irq, void *dev_id, struct pt_regs * regs); +void init_IRQ(void);  /* sun4m_irq.c */ -extern void sun4m_init_IRQ(void); -extern void sun4m_unmask_profile_irq(void); -extern void sun4m_clear_profile_irq(int cpu); +void sun4m_init_IRQ(void); +void sun4m_unmask_profile_irq(void); +void sun4m_clear_profile_irq(int cpu);  /* sun4m_smp.c */  void sun4m_cpu_pre_starting(void *arg);  void sun4m_cpu_pre_online(void *arg); +void __init smp4m_boot_cpus(void); +int smp4m_boot_one_cpu(int i, struct task_struct *idle); +void __init smp4m_smp_done(void); +void smp4m_cross_call_irq(void); +void smp4m_percpu_timer_interrupt(struct pt_regs *regs);  /* sun4d_irq.c */  extern spinlock_t sun4d_imsk_lock; -extern void sun4d_init_IRQ(void); -extern int sun4d_request_irq(unsigned int irq, -                             irq_handler_t handler, -                             unsigned long irqflags, -                             const char *devname, void *dev_id); -extern int show_sun4d_interrupts(struct seq_file *, void *); -extern void sun4d_distribute_irqs(void); -extern void sun4d_free_irq(unsigned int irq, void *dev_id); +void sun4d_init_IRQ(void); +int sun4d_request_irq(unsigned int irq, +                      irq_handler_t handler, +                      unsigned long irqflags, +                      const char *devname, void *dev_id); +int show_sun4d_interrupts(struct seq_file *, void *); +void sun4d_distribute_irqs(void); +void sun4d_free_irq(unsigned int irq, void *dev_id);  /* sun4d_smp.c */  void sun4d_cpu_pre_starting(void *arg);  void sun4d_cpu_pre_online(void *arg); +void __init smp4d_boot_cpus(void); +int smp4d_boot_one_cpu(int i, struct task_struct *idle); +void __init smp4d_smp_done(void); +void smp4d_cross_call_irq(void); +void smp4d_percpu_timer_interrupt(struct pt_regs *regs);  /* leon_smp.c */  void leon_cpu_pre_starting(void *arg);  void leon_cpu_pre_online(void *arg); +void leonsmp_ipi_interrupt(void); +void leon_cross_call_irq(void);  /* head_32.S */  extern unsigned int t_nmi[]; @@ -89,12 +139,48 @@ extern unsigned int real_irq_entry[];  extern unsigned int smp4d_ticker[];  extern unsigned int patchme_maybe_smp_msg[]; -extern void floppy_hardint(void); +void floppy_hardint(void);  /* trampoline_32.S */  extern unsigned long sun4m_cpu_startup;  extern unsigned long sun4d_cpu_startup; +/* process_32.c */ +asmlinkage int sparc_do_fork(unsigned long clone_flags, +                             unsigned long stack_start, +                             struct pt_regs *regs, +                             unsigned long stack_size); + +/* signal_32.c */ +asmlinkage void do_sigreturn(struct pt_regs *regs); +asmlinkage void do_rt_sigreturn(struct pt_regs *regs); +void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, +                      unsigned long thread_info_flags); +asmlinkage int do_sys_sigstack(struct sigstack __user *ssptr, +                               struct sigstack __user *ossptr, +                               unsigned long sp); + +/* ptrace_32.c */ +asmlinkage int syscall_trace(struct pt_regs *regs, int syscall_exit_p); + +/* unaligned_32.c */ +asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn); +asmlinkage void user_unaligned_trap(struct pt_regs *regs, unsigned int insn); + +/* windows.c */ +void try_to_clear_window_buffer(struct pt_regs *regs, int who); + +/* auxio_32.c */ +void __init auxio_probe(void); +void __init auxio_power_probe(void); + +/* pcic.c */ +extern void __iomem *pcic_regs; +void pcic_nmi(unsigned int pend, struct pt_regs *regs); + +/* time_32.c */ +void __init time_init(void); +  #else /* CONFIG_SPARC32 */  #endif /* CONFIG_SPARC32 */  #endif /* !(__SPARC_KERNEL_H) */ diff --git a/arch/sparc/kernel/kgdb_64.c b/arch/sparc/kernel/kgdb_64.c index 53c0a82e603..cbf21d0870e 100644 --- a/arch/sparc/kernel/kgdb_64.c +++ b/arch/sparc/kernel/kgdb_64.c @@ -6,12 +6,15 @@  #include <linux/kgdb.h>  #include <linux/kdebug.h>  #include <linux/ftrace.h> +#include <linux/context_tracking.h>  #include <asm/cacheflush.h>  #include <asm/kdebug.h>  #include <asm/ptrace.h>  #include <asm/irq.h> +#include "kernel.h" +  void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs)  {  	struct reg_window *win; @@ -159,11 +162,12 @@ int kgdb_arch_handle_exception(int e_vector, int signo, int err_code,  asmlinkage void kgdb_trap(unsigned long trap_level, struct pt_regs *regs)  { +	enum ctx_state prev_state = exception_enter();  	unsigned long flags;  	if (user_mode(regs)) {  		bad_trap(regs, trap_level); -		return; +		goto out;  	}  	flushw_all(); @@ -171,6 +175,8 @@ asmlinkage void kgdb_trap(unsigned long trap_level, struct pt_regs *regs)  	local_irq_save(flags);  	kgdb_handle_exception(0x172, SIGTRAP, 0, regs);  	local_irq_restore(flags); +out: +	exception_exit(prev_state);  }  int kgdb_arch_init(void) diff --git a/arch/sparc/kernel/kprobes.c b/arch/sparc/kernel/kprobes.c index e72212148d2..98d71284341 100644 --- a/arch/sparc/kernel/kprobes.c +++ b/arch/sparc/kernel/kprobes.c @@ -8,6 +8,7 @@  #include <linux/module.h>  #include <linux/kdebug.h>  #include <linux/slab.h> +#include <linux/context_tracking.h>  #include <asm/signal.h>  #include <asm/cacheflush.h>  #include <asm/uaccess.h> @@ -349,7 +350,7 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)  	case KPROBE_HIT_SSDONE:  		/*  		 * We increment the nmissed count for accounting, -		 * we can also use npre/npostfault count for accouting +		 * we can also use npre/npostfault count for accounting  		 * these specific fault cases.  		 */  		kprobes_inc_nmissed_count(cur); @@ -418,12 +419,14 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self,  asmlinkage void __kprobes kprobe_trap(unsigned long trap_level,  				      struct pt_regs *regs)  { +	enum ctx_state prev_state = exception_enter(); +  	BUG_ON(trap_level != 0x170 && trap_level != 0x171);  	if (user_mode(regs)) {  		local_irq_enable();  		bad_trap(regs, trap_level); -		return; +		goto out;  	}  	/* trap_level == 0x170 --> ta 0x70 @@ -433,6 +436,8 @@ asmlinkage void __kprobes kprobe_trap(unsigned long trap_level,  		       (trap_level == 0x170) ? "debug" : "debug_2",  		       regs, 0, trap_level, SIGTRAP) != NOTIFY_STOP)  		bad_trap(regs, trap_level); +out: +	exception_exit(prev_state);  }  /* Jprobes support.  */ @@ -507,7 +512,8 @@ void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,  /*   * Called when the probe at kretprobe trampoline is hit   */ -int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) +static int __kprobes trampoline_probe_handler(struct kprobe *p, +					      struct pt_regs *regs)  {  	struct kretprobe_instance *ri = NULL;  	struct hlist_head *head, empty_rp; @@ -571,7 +577,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)  	return 1;  } -void kretprobe_trampoline_holder(void) +static void __used kretprobe_trampoline_holder(void)  {  	asm volatile(".global kretprobe_trampoline\n"  		     "kretprobe_trampoline:\n" diff --git a/arch/sparc/kernel/ktlb.S b/arch/sparc/kernel/ktlb.S index fde5a419cf2..605d4920458 100644 --- a/arch/sparc/kernel/ktlb.S +++ b/arch/sparc/kernel/ktlb.S @@ -153,12 +153,19 @@ kvmap_dtlb_tsb4m_miss:  	/* Clear the PAGE_OFFSET top virtual bits, shift  	 * down to get PFN, and make sure PFN is in range.  	 */ -	sllx		%g4, 21, %g5 +661:	sllx		%g4, 0, %g5 +	.section	.page_offset_shift_patch, "ax" +	.word		661b +	.previous  	/* Check to see if we know about valid memory at the 4MB  	 * chunk this physical address will reside within.  	 */ -	srlx		%g5, 21 + 41, %g2 +661:	srlx		%g5, MAX_PHYS_ADDRESS_BITS, %g2 +	.section	.page_offset_shift_patch, "ax" +	.word		661b +	.previous +  	brnz,pn		%g2, kvmap_dtlb_longpath  	 nop @@ -176,7 +183,11 @@ valid_addr_bitmap_patch:  	or		%g7, %lo(sparc64_valid_addr_bitmap), %g7  	.previous -	srlx		%g5, 21 + 22, %g2 +661:	srlx		%g5, ILOG2_4MB, %g2 +	.section	.page_offset_shift_patch, "ax" +	.word		661b +	.previous +  	srlx		%g2, 6, %g5  	and		%g2, 63, %g2  	sllx		%g5, 3, %g5 @@ -189,9 +200,18 @@ valid_addr_bitmap_patch:  2:	 sethi		%hi(kpte_linear_bitmap), %g2  	/* Get the 256MB physical address index. */ -	sllx		%g4, 21, %g5 +661:	sllx		%g4, 0, %g5 +	.section	.page_offset_shift_patch, "ax" +	.word		661b +	.previous +  	or		%g2, %lo(kpte_linear_bitmap), %g2 -	srlx		%g5, 21 + 28, %g5 + +661:	srlx		%g5, ILOG2_256MB, %g5 +	.section	.page_offset_shift_patch, "ax" +	.word		661b +	.previous +  	and		%g5, (32 - 1), %g7  	/* Divide by 32 to get the offset into the bitmask.  */ @@ -257,7 +277,7 @@ kvmap_dtlb_load:  #ifdef CONFIG_SPARSEMEM_VMEMMAP  kvmap_vmemmap:  	sub		%g4, %g5, %g5 -	srlx		%g5, 22, %g5 +	srlx		%g5, ILOG2_4MB, %g5  	sethi		%hi(vmemmap_table), %g1  	sllx		%g5, 3, %g5  	or		%g1, %lo(vmemmap_table), %g1 diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c index 54df554b82d..e01d75d4032 100644 --- a/arch/sparc/kernel/ldc.c +++ b/arch/sparc/kernel/ldc.c @@ -1249,12 +1249,12 @@ int ldc_bind(struct ldc_channel *lp, const char *name)  	snprintf(lp->rx_irq_name, LDC_IRQ_NAME_MAX, "%s RX", name);  	snprintf(lp->tx_irq_name, LDC_IRQ_NAME_MAX, "%s TX", name); -	err = request_irq(lp->cfg.rx_irq, ldc_rx, IRQF_DISABLED, +	err = request_irq(lp->cfg.rx_irq, ldc_rx, 0,  			  lp->rx_irq_name, lp);  	if (err)  		return err; -	err = request_irq(lp->cfg.tx_irq, ldc_tx, IRQF_DISABLED, +	err = request_irq(lp->cfg.tx_irq, ldc_tx, 0,  			  lp->tx_irq_name, lp);  	if (err) {  		free_irq(lp->cfg.rx_irq, lp); diff --git a/arch/sparc/kernel/leon_kernel.c b/arch/sparc/kernel/leon_kernel.c index b7c68976cbc..683c4af999d 100644 --- a/arch/sparc/kernel/leon_kernel.c +++ b/arch/sparc/kernel/leon_kernel.c @@ -32,12 +32,12 @@ struct leon3_gptimer_regs_map *leon3_gptimer_regs; /* timer controller base addr  int leondebug_irq_disable;  int leon_debug_irqout; -static int dummy_master_l10_counter; +static volatile u32 dummy_master_l10_counter;  unsigned long amba_system_id;  static DEFINE_SPINLOCK(leon_irq_lock); +static unsigned long leon3_gptimer_idx; /* Timer Index (0..6) within Timer Core */  unsigned long leon3_gptimer_irq; /* interrupt controller irq number */ -unsigned long leon3_gptimer_idx; /* Timer Index (0..6) within Timer Core */  unsigned int sparc_leon_eirq;  #define LEON_IMASK(cpu) (&leon3_irqctrl_regs->mask[cpu])  #define LEON_IACK (&leon3_irqctrl_regs->iclear) @@ -65,7 +65,7 @@ static void leon_handle_ext_irq(unsigned int irq, struct irq_desc *desc)  }  /* The extended IRQ controller has been found, this function registers it */ -void leon_eirq_setup(unsigned int eirq) +static void leon_eirq_setup(unsigned int eirq)  {  	unsigned long mask, oldmask;  	unsigned int veirq; @@ -270,7 +270,7 @@ static u32 leon_cycles_offset(void)  #ifdef CONFIG_SMP  /* smp clockevent irq */ -irqreturn_t leon_percpu_timer_ce_interrupt(int irq, void *unused) +static irqreturn_t leon_percpu_timer_ce_interrupt(int irq, void *unused)  {  	struct clock_event_device *ce;  	int cpu = smp_processor_id(); @@ -313,7 +313,7 @@ void __init leon_init_timers(void)  	leondebug_irq_disable = 0;  	leon_debug_irqout = 0; -	master_l10_counter = (unsigned int *)&dummy_master_l10_counter; +	master_l10_counter = (u32 __iomem *)&dummy_master_l10_counter;  	dummy_master_l10_counter = 0;  	rootnp = of_find_node_by_path("/ambapp0"); diff --git a/arch/sparc/kernel/leon_pci.c b/arch/sparc/kernel/leon_pci.c index 88aaaa57bb6..899b7203a4e 100644 --- a/arch/sparc/kernel/leon_pci.c +++ b/arch/sparc/kernel/leon_pci.c @@ -98,87 +98,3 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res,  {  	return res->start;  } - -int pcibios_enable_device(struct pci_dev *dev, int mask) -{ -	return pci_enable_resources(dev, mask); -} - -/* in/out routines taken from pcic.c - * - * This probably belongs here rather than ioport.c because - * we do not want this crud linked into SBus kernels. - * Also, think for a moment about likes of floppy.c that - * include architecture specific parts. They may want to redefine ins/outs. - * - * We do not use horrible macros here because we want to - * advance pointer by sizeof(size). - */ -void outsb(unsigned long addr, const void *src, unsigned long count) -{ -	while (count) { -		count -= 1; -		outb(*(const char *)src, addr); -		src += 1; -		/* addr += 1; */ -	} -} -EXPORT_SYMBOL(outsb); - -void outsw(unsigned long addr, const void *src, unsigned long count) -{ -	while (count) { -		count -= 2; -		outw(*(const short *)src, addr); -		src += 2; -		/* addr += 2; */ -	} -} -EXPORT_SYMBOL(outsw); - -void outsl(unsigned long addr, const void *src, unsigned long count) -{ -	while (count) { -		count -= 4; -		outl(*(const long *)src, addr); -		src += 4; -		/* addr += 4; */ -	} -} -EXPORT_SYMBOL(outsl); - -void insb(unsigned long addr, void *dst, unsigned long count) -{ -	while (count) { -		count -= 1; -		*(unsigned char *)dst = inb(addr); -		dst += 1; -		/* addr += 1; */ -	} -} -EXPORT_SYMBOL(insb); - -void insw(unsigned long addr, void *dst, unsigned long count) -{ -	while (count) { -		count -= 2; -		*(unsigned short *)dst = inw(addr); -		dst += 2; -		/* addr += 2; */ -	} -} -EXPORT_SYMBOL(insw); - -void insl(unsigned long addr, void *dst, unsigned long count) -{ -	while (count) { -		count -= 4; -		/* -		 * XXX I am sure we are in for an unaligned trap here. -		 */ -		*(unsigned long *)dst = inl(addr); -		dst += 4; -		/* addr += 4; */ -	} -} -EXPORT_SYMBOL(insl); diff --git a/arch/sparc/kernel/leon_pci_grpci1.c b/arch/sparc/kernel/leon_pci_grpci1.c index 6df26e37f87..c8bf26edfa7 100644 --- a/arch/sparc/kernel/leon_pci_grpci1.c +++ b/arch/sparc/kernel/leon_pci_grpci1.c @@ -80,7 +80,7 @@ struct grpci1_regs {  struct grpci1_priv {  	struct leon_pci_info	info; /* must be on top of this structure */ -	struct grpci1_regs	*regs;		/* GRPCI register map */ +	struct grpci1_regs __iomem *regs;		/* GRPCI register map */  	struct device		*dev;  	int			pci_err_mask;	/* STATUS register error mask */  	int			irq;		/* LEON irqctrl GRPCI IRQ */ @@ -101,7 +101,7 @@ static struct grpci1_priv *grpci1priv;  static int grpci1_cfg_w32(struct grpci1_priv *priv, unsigned int bus,  				unsigned int devfn, int where, u32 val); -int grpci1_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) +static int grpci1_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	struct grpci1_priv *priv = dev->bus->sysdata;  	int irq_group; @@ -144,7 +144,7 @@ static int grpci1_cfg_r32(struct grpci1_priv *priv, unsigned int bus,  		grpci1_cfg_w32(priv, TGT, 0, PCI_COMMAND, tmp);  	} else {  		/* Bus always little endian (unaffected by byte-swapping) */ -		*val = flip_dword(tmp); +		*val = swab32(tmp);  	}  	return 0; @@ -197,7 +197,7 @@ static int grpci1_cfg_w32(struct grpci1_priv *priv, unsigned int bus,  	pci_conf = (unsigned int *) (priv->pci_conf |  						(devfn << 8) | (where & 0xfc)); -	LEON3_BYPASS_STORE_PA(pci_conf, flip_dword(val)); +	LEON3_BYPASS_STORE_PA(pci_conf, swab32(val));  	return 0;  } @@ -417,10 +417,10 @@ out:   *  BAR1: peripheral DMA to host's memory (size at least 256MByte)   *  BAR2..BAR5: not implemented in hardware   */ -void grpci1_hw_init(struct grpci1_priv *priv) +static void grpci1_hw_init(struct grpci1_priv *priv)  {  	u32 ahbadr, bar_sz, data, pciadr; -	struct grpci1_regs *regs = priv->regs; +	struct grpci1_regs __iomem *regs = priv->regs;  	/* set 1:1 mapping between AHB -> PCI memory space */  	REGSTORE(regs->cfg_stat, priv->pci_area & 0xf0000000); @@ -509,7 +509,7 @@ static irqreturn_t grpci1_err_interrupt(int irq, void *arg)  static int grpci1_of_probe(struct platform_device *ofdev)  { -	struct grpci1_regs *regs; +	struct grpci1_regs __iomem *regs;  	struct grpci1_priv *priv;  	int err, len;  	const int *tmp; @@ -690,7 +690,7 @@ err3:  err2:  	release_resource(&priv->info.mem_space);  err1: -	iounmap((void *)priv->pci_io_va); +	iounmap((void __iomem *)priv->pci_io_va);  	grpci1priv = NULL;  	return err;  } diff --git a/arch/sparc/kernel/leon_pci_grpci2.c b/arch/sparc/kernel/leon_pci_grpci2.c index 5f0402aab7f..e433a4d69fe 100644 --- a/arch/sparc/kernel/leon_pci_grpci2.c +++ b/arch/sparc/kernel/leon_pci_grpci2.c @@ -8,6 +8,7 @@  #include <linux/of_device.h>  #include <linux/kernel.h>  #include <linux/pci.h> +#include <linux/slab.h>  #include <linux/delay.h>  #include <linux/export.h>  #include <asm/io.h> @@ -190,7 +191,7 @@ struct grpci2_cap_first {  struct grpci2_priv {  	struct leon_pci_info	info; /* must be on top of this structure */ -	struct grpci2_regs	*regs; +	struct grpci2_regs __iomem *regs;  	char			irq;  	char			irq_mode; /* IRQ Mode from CAPSTS REG */  	char			bt_enabled; @@ -214,10 +215,10 @@ struct grpci2_priv {  	struct grpci2_barcfg	tgtbars[6];  }; -DEFINE_SPINLOCK(grpci2_dev_lock); -struct grpci2_priv *grpci2priv; +static DEFINE_SPINLOCK(grpci2_dev_lock); +static struct grpci2_priv *grpci2priv; -int grpci2_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) +static int grpci2_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	struct grpci2_priv *priv = dev->bus->sysdata;  	int irq_group; @@ -269,7 +270,7 @@ static int grpci2_cfg_r32(struct grpci2_priv *priv, unsigned int bus,  		*val = 0xffffffff;  	} else {  		/* Bus always little endian (unaffected by byte-swapping) */ -		*val = flip_dword(tmp); +		*val = swab32(tmp);  	}  	return 0; @@ -327,7 +328,7 @@ static int grpci2_cfg_w32(struct grpci2_priv *priv, unsigned int bus,  	pci_conf = (unsigned int *) (priv->pci_conf |  						(devfn << 8) | (where & 0xfc)); -	LEON3_BYPASS_STORE_PA(pci_conf, flip_dword(val)); +	LEON3_BYPASS_STORE_PA(pci_conf, swab32(val));  	/* Wait until GRPCI2 signals that CFG access is done, it should be  	 * done instantaneously unless a DMA operation is ongoing... @@ -560,10 +561,10 @@ out:  	return virq;  } -void grpci2_hw_init(struct grpci2_priv *priv) +static void grpci2_hw_init(struct grpci2_priv *priv)  {  	u32 ahbadr, pciadr, bar_sz, capptr, io_map, data; -	struct grpci2_regs *regs = priv->regs; +	struct grpci2_regs __iomem *regs = priv->regs;  	int i;  	struct grpci2_barcfg *barcfg = priv->tgtbars; @@ -654,7 +655,7 @@ static irqreturn_t grpci2_jump_interrupt(int irq, void *arg)  static irqreturn_t grpci2_err_interrupt(int irq, void *arg)  {  	struct grpci2_priv *priv = arg; -	struct grpci2_regs *regs = priv->regs; +	struct grpci2_regs __iomem *regs = priv->regs;  	unsigned int status;  	status = REGLOAD(regs->sts_cap); @@ -681,7 +682,7 @@ static irqreturn_t grpci2_err_interrupt(int irq, void *arg)  static int grpci2_of_probe(struct platform_device *ofdev)  { -	struct grpci2_regs *regs; +	struct grpci2_regs __iomem *regs;  	struct grpci2_priv *priv;  	int err, i, len;  	const int *tmp; @@ -877,7 +878,7 @@ err4:  	release_resource(&priv->info.mem_space);  err3:  	err = -ENOMEM; -	iounmap((void *)priv->pci_io_va); +	iounmap((void __iomem *)priv->pci_io_va);  err2:  	kfree(priv);  err1: diff --git a/arch/sparc/kernel/leon_pmc.c b/arch/sparc/kernel/leon_pmc.c index b0b3967a2dd..ddcf950282e 100644 --- a/arch/sparc/kernel/leon_pmc.c +++ b/arch/sparc/kernel/leon_pmc.c @@ -12,14 +12,14 @@  #include <asm/processor.h>  /* List of Systems that need fixup instructions around power-down instruction */ -unsigned int pmc_leon_fixup_ids[] = { +static unsigned int pmc_leon_fixup_ids[] = {  	AEROFLEX_UT699,  	GAISLER_GR712RC,  	LEON4_NEXTREME1,  	0  }; -int pmc_leon_need_fixup(void) +static int pmc_leon_need_fixup(void)  {  	unsigned int systemid = amba_system_id >> 16;  	unsigned int *id; @@ -38,7 +38,7 @@ int pmc_leon_need_fixup(void)   * CPU idle callback function for systems that need some extra handling   * See .../arch/sparc/kernel/process.c   */ -void pmc_leon_idle_fixup(void) +static void pmc_leon_idle_fixup(void)  {  	/* Prepare an address to a non-cachable region. APB is always  	 * none-cachable. One instruction is executed after the Sleep @@ -62,7 +62,7 @@ void pmc_leon_idle_fixup(void)   * CPU idle callback function   * See .../arch/sparc/kernel/process.c   */ -void pmc_leon_idle(void) +static void pmc_leon_idle(void)  {  	/* Interrupts need to be enabled to not hang the CPU */  	local_irq_enable(); diff --git a/arch/sparc/kernel/leon_smp.c b/arch/sparc/kernel/leon_smp.c index 6edf955f987..018ef11f57d 100644 --- a/arch/sparc/kernel/leon_smp.c +++ b/arch/sparc/kernel/leon_smp.c @@ -130,7 +130,7 @@ void leon_configure_cache_smp(void)  	local_ops->tlb_all();  } -void leon_smp_setbroadcast(unsigned int mask) +static void leon_smp_setbroadcast(unsigned int mask)  {  	int broadcast =  	    ((LEON3_BYPASS_LOAD_PA(&(leon3_irqctrl_regs->mpstatus)) >> @@ -148,13 +148,6 @@ void leon_smp_setbroadcast(unsigned int mask)  	LEON_BYPASS_STORE_PA(&(leon3_irqctrl_regs->mpbroadcast), mask);  } -unsigned int leon_smp_getbroadcast(void) -{ -	unsigned int mask; -	mask = LEON_BYPASS_LOAD_PA(&(leon3_irqctrl_regs->mpbroadcast)); -	return mask; -} -  int leon_smp_nrcpus(void)  {  	int nrcpu = @@ -266,10 +259,6 @@ void __init leon_smp_done(void)  } -void leon_irq_rotate(int cpu) -{ -} -  struct leon_ipi_work {  	int single;  	int msk; diff --git a/arch/sparc/kernel/mdesc.c b/arch/sparc/kernel/mdesc.c index b90bf23e3aa..a1a4400d402 100644 --- a/arch/sparc/kernel/mdesc.c +++ b/arch/sparc/kernel/mdesc.c @@ -896,10 +896,6 @@ void mdesc_fill_in_cpu_data(cpumask_t *mask)  	mdesc_iterate_over_cpus(fill_in_one_cpu, NULL, mask); -#ifdef CONFIG_SMP -	sparc64_multi_core = 1; -#endif -  	hp = mdesc_grab();  	set_core_ids(hp); diff --git a/arch/sparc/kernel/module.c b/arch/sparc/kernel/module.c index 4435488ebe2..97655e0fd24 100644 --- a/arch/sparc/kernel/module.c +++ b/arch/sparc/kernel/module.c @@ -29,7 +29,7 @@ static void *module_map(unsigned long size)  	if (PAGE_ALIGN(size) > MODULES_LEN)  		return NULL;  	return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, -				GFP_KERNEL, PAGE_KERNEL, -1, +				GFP_KERNEL, PAGE_KERNEL, NUMA_NO_NODE,  				__builtin_return_address(0));  }  #else diff --git a/arch/sparc/kernel/nmi.c b/arch/sparc/kernel/nmi.c index 6479256fd5a..33709455691 100644 --- a/arch/sparc/kernel/nmi.c +++ b/arch/sparc/kernel/nmi.c @@ -68,27 +68,16 @@ EXPORT_SYMBOL(touch_nmi_watchdog);  static void die_nmi(const char *str, struct pt_regs *regs, int do_panic)  { +	int this_cpu = smp_processor_id(); +  	if (notify_die(DIE_NMIWATCHDOG, str, regs, 0,  		       pt_regs_trap_type(regs), SIGINT) == NOTIFY_STOP)  		return; -	console_verbose(); -	bust_spinlocks(1); - -	printk(KERN_EMERG "%s", str); -	printk(" on CPU%d, ip %08lx, registers:\n", -	       smp_processor_id(), regs->tpc); -	show_regs(regs); -	dump_stack(); - -	bust_spinlocks(0); -  	if (do_panic || panic_on_oops) -		panic("Non maskable interrupt"); - -	nmi_exit(); -	local_irq_enable(); -	do_exit(SIGBUS); +		panic("Watchdog detected hard LOCKUP on cpu %d", this_cpu); +	else +		WARN(1, "Watchdog detected hard LOCKUP on cpu %d", this_cpu);  }  notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs) diff --git a/arch/sparc/kernel/of_device_common.c b/arch/sparc/kernel/of_device_common.c index de199bf0cb0..de0ee3971f0 100644 --- a/arch/sparc/kernel/of_device_common.c +++ b/arch/sparc/kernel/of_device_common.c @@ -1,13 +1,14 @@  #include <linux/string.h>  #include <linux/kernel.h>  #include <linux/of.h> -#include <linux/init.h>  #include <linux/export.h>  #include <linux/mod_devicetable.h>  #include <linux/errno.h>  #include <linux/irq.h> -#include <linux/of_device.h>  #include <linux/of_platform.h> +#include <linux/of_address.h> +#include <linux/of_device.h> +#include <linux/of_irq.h>  #include "of_device_common.h" diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c index bc4d3f5d2e5..539babf00bb 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c @@ -28,6 +28,7 @@  #include <asm/apb.h>  #include "pci_impl.h" +#include "kernel.h"  /* List of all PCI controllers found in the system. */  struct pci_pbm_info *pci_pbm_root = NULL; @@ -392,15 +393,15 @@ static void apb_fake_ranges(struct pci_dev *dev,  	res->flags = IORESOURCE_IO;  	region.start = (first << 21);  	region.end = (last << 21) + ((1 << 21) - 1); -	pcibios_bus_to_resource(dev, res, ®ion); +	pcibios_bus_to_resource(dev->bus, res, ®ion);  	pci_read_config_byte(dev, APB_MEM_ADDRESS_MAP, &map);  	apb_calc_first_last(map, &first, &last);  	res = bus->resource[1];  	res->flags = IORESOURCE_MEM; -	region.start = (first << 21); -	region.end = (last << 21) + ((1 << 21) - 1); -	pcibios_bus_to_resource(dev, res, ®ion); +	region.start = (first << 29); +	region.end = (last << 29) + ((1 << 29) - 1); +	pcibios_bus_to_resource(dev->bus, res, ®ion);  }  static void pci_of_scan_bus(struct pci_pbm_info *pbm, @@ -491,7 +492,7 @@ static void of_scan_pci_bridge(struct pci_pbm_info *pbm,  		res->flags = flags;  		region.start = GET_64BIT(ranges, 1);  		region.end = region.start + size - 1; -		pcibios_bus_to_resource(dev, res, ®ion); +		pcibios_bus_to_resource(dev->bus, res, ®ion);  	}  after_ranges:  	sprintf(bus->name, "PCI Bus %04x:%02x", pci_domain_nr(bus), @@ -543,8 +544,7 @@ static void pci_of_scan_bus(struct pci_pbm_info *pbm,  			printk("PCI: dev header type: %x\n",  			       dev->hdr_type); -		if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE || -		    dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) +		if (pci_is_bridge(dev))  			of_scan_pci_bridge(pbm, child, dev);  	}  } @@ -1005,6 +1005,5 @@ static int __init of_pci_slot_init(void)  	return 0;  } - -module_init(of_pci_slot_init); +device_initcall(of_pci_slot_init);  #endif diff --git a/arch/sparc/kernel/pci_common.c b/arch/sparc/kernel/pci_common.c index a6895987fb7..944a06536ec 100644 --- a/arch/sparc/kernel/pci_common.c +++ b/arch/sparc/kernel/pci_common.c @@ -5,7 +5,6 @@  #include <linux/string.h>  #include <linux/slab.h> -#include <linux/init.h>  #include <linux/pci.h>  #include <linux/device.h>  #include <linux/of_device.h> diff --git a/arch/sparc/kernel/pci_impl.h b/arch/sparc/kernel/pci_impl.h index 5f688531f48..75803c780af 100644 --- a/arch/sparc/kernel/pci_impl.h +++ b/arch/sparc/kernel/pci_impl.h @@ -48,8 +48,8 @@ struct sparc64_msiq_ops {  			      unsigned long devino);  }; -extern void sparc64_pbm_msi_init(struct pci_pbm_info *pbm, -				 const struct sparc64_msiq_ops *ops); +void sparc64_pbm_msi_init(struct pci_pbm_info *pbm, +			  const struct sparc64_msiq_ops *ops);  struct sparc64_msiq_cookie {  	struct pci_pbm_info *pbm; @@ -158,23 +158,23 @@ extern struct pci_pbm_info *pci_pbm_root;  extern int pci_num_pbms;  /* PCI bus scanning and fixup support. */ -extern void pci_get_pbm_props(struct pci_pbm_info *pbm); -extern struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm, -					struct device *parent); -extern void pci_determine_mem_io_space(struct pci_pbm_info *pbm); +void pci_get_pbm_props(struct pci_pbm_info *pbm); +struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm, +				 struct device *parent); +void pci_determine_mem_io_space(struct pci_pbm_info *pbm);  /* Error reporting support. */ -extern void pci_scan_for_target_abort(struct pci_pbm_info *, struct pci_bus *); -extern void pci_scan_for_master_abort(struct pci_pbm_info *, struct pci_bus *); -extern void pci_scan_for_parity_error(struct pci_pbm_info *, struct pci_bus *); +void pci_scan_for_target_abort(struct pci_pbm_info *, struct pci_bus *); +void pci_scan_for_master_abort(struct pci_pbm_info *, struct pci_bus *); +void pci_scan_for_parity_error(struct pci_pbm_info *, struct pci_bus *);  /* Configuration space access. */ -extern void pci_config_read8(u8 *addr, u8 *ret); -extern void pci_config_read16(u16 *addr, u16 *ret); -extern void pci_config_read32(u32 *addr, u32 *ret); -extern void pci_config_write8(u8 *addr, u8 val); -extern void pci_config_write16(u16 *addr, u16 val); -extern void pci_config_write32(u32 *addr, u32 val); +void pci_config_read8(u8 *addr, u8 *ret); +void pci_config_read16(u16 *addr, u16 *ret); +void pci_config_read32(u32 *addr, u32 *ret); +void pci_config_write8(u8 *addr, u8 val); +void pci_config_write16(u16 *addr, u16 val); +void pci_config_write32(u32 *addr, u32 val);  extern struct pci_ops sun4u_pci_ops;  extern struct pci_ops sun4v_pci_ops; diff --git a/arch/sparc/kernel/pci_sun4v.h b/arch/sparc/kernel/pci_sun4v.h index 8e9fc3a5b4f..5642212390b 100644 --- a/arch/sparc/kernel/pci_sun4v.h +++ b/arch/sparc/kernel/pci_sun4v.h @@ -6,87 +6,87 @@  #ifndef _PCI_SUN4V_H  #define _PCI_SUN4V_H -extern long pci_sun4v_iommu_map(unsigned long devhandle, -				unsigned long tsbid, -				unsigned long num_ttes, -				unsigned long io_attributes, -				unsigned long io_page_list_pa); -extern unsigned long pci_sun4v_iommu_demap(unsigned long devhandle, -					   unsigned long tsbid, -					   unsigned long num_ttes); -extern unsigned long pci_sun4v_iommu_getmap(unsigned long devhandle, -					    unsigned long tsbid, -					    unsigned long *io_attributes, -					    unsigned long *real_address); -extern unsigned long pci_sun4v_config_get(unsigned long devhandle, -					  unsigned long pci_device, -					  unsigned long config_offset, -					  unsigned long size); -extern int pci_sun4v_config_put(unsigned long devhandle, -				unsigned long pci_device, -				unsigned long config_offset, -				unsigned long size, -				unsigned long data); +long pci_sun4v_iommu_map(unsigned long devhandle, +			 unsigned long tsbid, +			 unsigned long num_ttes, +			 unsigned long io_attributes, +			 unsigned long io_page_list_pa); +unsigned long pci_sun4v_iommu_demap(unsigned long devhandle, +				    unsigned long tsbid, +				    unsigned long num_ttes); +unsigned long pci_sun4v_iommu_getmap(unsigned long devhandle, +				     unsigned long tsbid, +				     unsigned long *io_attributes, +				     unsigned long *real_address); +unsigned long pci_sun4v_config_get(unsigned long devhandle, +				   unsigned long pci_device, +				   unsigned long config_offset, +				   unsigned long size); +int pci_sun4v_config_put(unsigned long devhandle, +			 unsigned long pci_device, +			 unsigned long config_offset, +			 unsigned long size, +			 unsigned long data); -extern unsigned long pci_sun4v_msiq_conf(unsigned long devhandle, +unsigned long pci_sun4v_msiq_conf(unsigned long devhandle,  					 unsigned long msiqid,  					 unsigned long msiq_paddr,  					 unsigned long num_entries); -extern unsigned long pci_sun4v_msiq_info(unsigned long devhandle, -					 unsigned long msiqid, -					 unsigned long *msiq_paddr, -					 unsigned long *num_entries); -extern unsigned long pci_sun4v_msiq_getvalid(unsigned long devhandle, -					     unsigned long msiqid, -					     unsigned long *valid); -extern unsigned long pci_sun4v_msiq_setvalid(unsigned long devhandle, -					     unsigned long msiqid, -					     unsigned long valid); -extern unsigned long pci_sun4v_msiq_getstate(unsigned long devhandle, -					     unsigned long msiqid, -					     unsigned long *state); -extern unsigned long pci_sun4v_msiq_setstate(unsigned long devhandle, -					     unsigned long msiqid, -					     unsigned long state); -extern unsigned long pci_sun4v_msiq_gethead(unsigned long devhandle, -					     unsigned long msiqid, -					     unsigned long *head); -extern unsigned long pci_sun4v_msiq_sethead(unsigned long devhandle, -					     unsigned long msiqid, -					     unsigned long head); -extern unsigned long pci_sun4v_msiq_gettail(unsigned long devhandle, -					     unsigned long msiqid, -					     unsigned long *head); -extern unsigned long pci_sun4v_msi_getvalid(unsigned long devhandle, -					    unsigned long msinum, -					    unsigned long *valid); -extern unsigned long pci_sun4v_msi_setvalid(unsigned long devhandle, -					    unsigned long msinum, -					    unsigned long valid); -extern unsigned long pci_sun4v_msi_getmsiq(unsigned long devhandle, -					   unsigned long msinum, -					   unsigned long *msiq); -extern unsigned long pci_sun4v_msi_setmsiq(unsigned long devhandle, -					   unsigned long msinum, -					   unsigned long msiq, -					   unsigned long msitype); -extern unsigned long pci_sun4v_msi_getstate(unsigned long devhandle, -					    unsigned long msinum, -					    unsigned long *state); -extern unsigned long pci_sun4v_msi_setstate(unsigned long devhandle, -					    unsigned long msinum, -					    unsigned long state); -extern unsigned long pci_sun4v_msg_getmsiq(unsigned long devhandle, -					   unsigned long msinum, -					   unsigned long *msiq); -extern unsigned long pci_sun4v_msg_setmsiq(unsigned long devhandle, -					   unsigned long msinum, -					   unsigned long msiq); -extern unsigned long pci_sun4v_msg_getvalid(unsigned long devhandle, -					    unsigned long msinum, -					    unsigned long *valid); -extern unsigned long pci_sun4v_msg_setvalid(unsigned long devhandle, -					    unsigned long msinum, -					    unsigned long valid); +unsigned long pci_sun4v_msiq_info(unsigned long devhandle, +				  unsigned long msiqid, +				  unsigned long *msiq_paddr, +				  unsigned long *num_entries); +unsigned long pci_sun4v_msiq_getvalid(unsigned long devhandle, +				      unsigned long msiqid, +				      unsigned long *valid); +unsigned long pci_sun4v_msiq_setvalid(unsigned long devhandle, +				      unsigned long msiqid, +				      unsigned long valid); +unsigned long pci_sun4v_msiq_getstate(unsigned long devhandle, +				      unsigned long msiqid, +				      unsigned long *state); +unsigned long pci_sun4v_msiq_setstate(unsigned long devhandle, +				      unsigned long msiqid, +				      unsigned long state); +unsigned long pci_sun4v_msiq_gethead(unsigned long devhandle, +				     unsigned long msiqid, +				     unsigned long *head); +unsigned long pci_sun4v_msiq_sethead(unsigned long devhandle, +				     unsigned long msiqid, +				     unsigned long head); +unsigned long pci_sun4v_msiq_gettail(unsigned long devhandle, +				      unsigned long msiqid, +				      unsigned long *head); +unsigned long pci_sun4v_msi_getvalid(unsigned long devhandle, +				     unsigned long msinum, +				     unsigned long *valid); +unsigned long pci_sun4v_msi_setvalid(unsigned long devhandle, +				     unsigned long msinum, +				     unsigned long valid); +unsigned long pci_sun4v_msi_getmsiq(unsigned long devhandle, +				    unsigned long msinum, +				    unsigned long *msiq); +unsigned long pci_sun4v_msi_setmsiq(unsigned long devhandle, +				    unsigned long msinum, +				    unsigned long msiq, +				    unsigned long msitype); +unsigned long pci_sun4v_msi_getstate(unsigned long devhandle, +				     unsigned long msinum, +				     unsigned long *state); +unsigned long pci_sun4v_msi_setstate(unsigned long devhandle, +				     unsigned long msinum, +				     unsigned long state); +unsigned long pci_sun4v_msg_getmsiq(unsigned long devhandle, +				    unsigned long msinum, +				    unsigned long *msiq); +unsigned long pci_sun4v_msg_setmsiq(unsigned long devhandle, +				    unsigned long msinum, +				    unsigned long msiq); +unsigned long pci_sun4v_msg_getvalid(unsigned long devhandle, +				     unsigned long msinum, +				     unsigned long *valid); +unsigned long pci_sun4v_msg_setvalid(unsigned long devhandle, +				     unsigned long msinum, +				     unsigned long valid);  #endif /* !(_PCI_SUN4V_H) */ diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c index 09f4fdd8d80..6cc78c213c0 100644 --- a/arch/sparc/kernel/pcic.c +++ b/arch/sparc/kernel/pcic.c @@ -36,6 +36,7 @@  #include <asm/uaccess.h>  #include <asm/irq_regs.h> +#include "kernel.h"  #include "irq.h"  /* @@ -162,8 +163,8 @@ static int pcic0_up;  static struct linux_pcic pcic0;  void __iomem *pcic_regs; -volatile int pcic_speculative; -volatile int pcic_trapped; +static volatile int pcic_speculative; +static volatile int pcic_trapped;  /* forward */  unsigned int pcic_build_device_irq(struct platform_device *op, @@ -329,7 +330,7 @@ int __init pcic_probe(void)  	pcic->pcic_res_cfg_addr.name = "pcic_cfg_addr";  	if ((pcic->pcic_config_space_addr = -	    ioremap(regs[2].phys_addr, regs[2].reg_size * 2)) == 0) { +	    ioremap(regs[2].phys_addr, regs[2].reg_size * 2)) == NULL) {  		prom_printf("PCIC: Error, cannot map "  			    "PCI Configuration Space Address.\n");  		prom_halt(); @@ -341,7 +342,7 @@ int __init pcic_probe(void)  	 */  	pcic->pcic_res_cfg_data.name = "pcic_cfg_data";  	if ((pcic->pcic_config_space_data = -	    ioremap(regs[3].phys_addr, regs[3].reg_size * 2)) == 0) { +	    ioremap(regs[3].phys_addr, regs[3].reg_size * 2)) == NULL) {  		prom_printf("PCIC: Error, cannot map "  			    "PCI Configuration Space Data.\n");  		prom_halt(); @@ -353,7 +354,6 @@ int __init pcic_probe(void)  	strcpy(pbm->prom_name, namebuf);  	{ -		extern volatile int t_nmi[4];  		extern int pcic_nmi_trap_patch[4];  		t_nmi[0] = pcic_nmi_trap_patch[0]; @@ -536,7 +536,7 @@ pcic_fill_irq(struct linux_pcic *pcic, struct pci_dev *dev, int node)  		prom_getstring(node, "name", namebuf, sizeof(namebuf));  	} -	if ((p = pcic->pcic_imap) == 0) { +	if ((p = pcic->pcic_imap) == NULL) {  		dev->irq = 0;  		return;  	} @@ -670,30 +670,6 @@ void pcibios_fixup_bus(struct pci_bus *bus)  	}  } -/* - * pcic_pin_to_irq() is exported to bus probing code - */ -unsigned int -pcic_pin_to_irq(unsigned int pin, const char *name) -{ -	struct linux_pcic *pcic = &pcic0; -	unsigned int irq; -	unsigned int ivec; - -	if (pin < 4) { -		ivec = readw(pcic->pcic_regs+PCI_INT_SELECT_LO); -		irq = ivec >> (pin << 2) & 0xF; -	} else if (pin < 8) { -		ivec = readw(pcic->pcic_regs+PCI_INT_SELECT_HI); -		irq = ivec >> ((pin-4) << 2) & 0xF; -	} else {					/* Corrupted map */ -		printk("PCIC: BAD PIN %d FOR %s\n", pin, name); -		for (;;) {}	/* XXX Cannot panic properly in case of PROLL */ -	} -/* P3 */ /* printk("PCIC: dev %s pin %d ivec 0x%x irq %x\n", name, pin, ivec, irq); */ -	return irq; -} -  /* Makes compiler happy */  static volatile int pcic_timer_dummy; @@ -783,7 +759,7 @@ int pcibios_enable_device(struct pci_dev *pdev, int mask)  void pcic_nmi(unsigned int pend, struct pt_regs *regs)  { -	pend = flip_dword(pend); +	pend = swab32(pend);  	if (!pcic_speculative || (pend & PCI_SYS_INT_PENDING_PIO) == 0) {  		/* @@ -875,82 +851,4 @@ void __init sun4m_pci_init_IRQ(void)  	sparc_config.load_profile_irq = pcic_load_profile_irq;  } -/* - * This probably belongs here rather than ioport.c because - * we do not want this crud linked into SBus kernels. - * Also, think for a moment about likes of floppy.c that - * include architecture specific parts. They may want to redefine ins/outs. - * - * We do not use horrible macros here because we want to - * advance pointer by sizeof(size). - */ -void outsb(unsigned long addr, const void *src, unsigned long count) -{ -	while (count) { -		count -= 1; -		outb(*(const char *)src, addr); -		src += 1; -		/* addr += 1; */ -	} -} -EXPORT_SYMBOL(outsb); - -void outsw(unsigned long addr, const void *src, unsigned long count) -{ -	while (count) { -		count -= 2; -		outw(*(const short *)src, addr); -		src += 2; -		/* addr += 2; */ -	} -} -EXPORT_SYMBOL(outsw); - -void outsl(unsigned long addr, const void *src, unsigned long count) -{ -	while (count) { -		count -= 4; -		outl(*(const long *)src, addr); -		src += 4; -		/* addr += 4; */ -	} -} -EXPORT_SYMBOL(outsl); - -void insb(unsigned long addr, void *dst, unsigned long count) -{ -	while (count) { -		count -= 1; -		*(unsigned char *)dst = inb(addr); -		dst += 1; -		/* addr += 1; */ -	} -} -EXPORT_SYMBOL(insb); - -void insw(unsigned long addr, void *dst, unsigned long count) -{ -	while (count) { -		count -= 2; -		*(unsigned short *)dst = inw(addr); -		dst += 2; -		/* addr += 2; */ -	} -} -EXPORT_SYMBOL(insw); - -void insl(unsigned long addr, void *dst, unsigned long count) -{ -	while (count) { -		count -= 4; -		/* -		 * XXX I am sure we are in for an unaligned trap here. -		 */ -		*(unsigned long *)dst = inl(addr); -		dst += 4; -		/* addr += 4; */ -	} -} -EXPORT_SYMBOL(insl); -  subsys_initcall(pcic_init); diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c index b5c38faa4ea..8efd33753ad 100644 --- a/arch/sparc/kernel/perf_event.c +++ b/arch/sparc/kernel/perf_event.c @@ -110,7 +110,7 @@ struct cpu_hw_events {  	unsigned int		group_flag;  }; -DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events) = { .enabled = 1, }; +static DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events) = { .enabled = 1, };  /* An event map describes the characteristics of a performance   * counter event.  In particular it gives the encoding as well as @@ -1153,7 +1153,7 @@ static void perf_stop_nmi_watchdog(void *unused)  		cpuc->pcr[i] = pcr_ops->read_pcr(i);  } -void perf_event_grab_pmc(void) +static void perf_event_grab_pmc(void)  {  	if (atomic_inc_not_zero(&active_events))  		return; @@ -1169,7 +1169,7 @@ void perf_event_grab_pmc(void)  	mutex_unlock(&pmc_grab_mutex);  } -void perf_event_release_pmc(void) +static void perf_event_release_pmc(void)  {  	if (atomic_dec_and_mutex_lock(&active_events, &pmc_grab_mutex)) {  		if (atomic_read(&nmi_active) == 0) @@ -1669,7 +1669,7 @@ static bool __init supported_pmu(void)  	return false;  } -int __init init_hw_perf_events(void) +static int __init init_hw_perf_events(void)  {  	pr_info("Performance events: "); @@ -1742,10 +1742,11 @@ static void perf_callchain_user_64(struct perf_callchain_entry *entry,  	ufp = regs->u_regs[UREG_I6] + STACK_BIAS;  	do { -		struct sparc_stackf *usf, sf; +		struct sparc_stackf __user *usf; +		struct sparc_stackf sf;  		unsigned long pc; -		usf = (struct sparc_stackf *) ufp; +		usf = (struct sparc_stackf __user *)ufp;  		if (__copy_from_user_inatomic(&sf, usf, sizeof(sf)))  			break; @@ -1765,17 +1766,19 @@ static void perf_callchain_user_32(struct perf_callchain_entry *entry,  		unsigned long pc;  		if (thread32_stack_is_64bit(ufp)) { -			struct sparc_stackf *usf, sf; +			struct sparc_stackf __user *usf; +			struct sparc_stackf sf;  			ufp += STACK_BIAS; -			usf = (struct sparc_stackf *) ufp; +			usf = (struct sparc_stackf __user *)ufp;  			if (__copy_from_user_inatomic(&sf, usf, sizeof(sf)))  				break;  			pc = sf.callers_pc & 0xffffffff;  			ufp = ((unsigned long) sf.fp) & 0xffffffff;  		} else { -			struct sparc_stackf32 *usf, sf; -			usf = (struct sparc_stackf32 *) ufp; +			struct sparc_stackf32 __user *usf; +			struct sparc_stackf32 sf; +			usf = (struct sparc_stackf32 __user *)ufp;  			if (__copy_from_user_inatomic(&sf, usf, sizeof(sf)))  				break;  			pc = sf.callers_pc; diff --git a/arch/sparc/kernel/process_32.c b/arch/sparc/kernel/process_32.c index fdd819dfdac..50e7b626afe 100644 --- a/arch/sparc/kernel/process_32.c +++ b/arch/sparc/kernel/process_32.c @@ -10,6 +10,7 @@  #include <stdarg.h> +#include <linux/elfcore.h>  #include <linux/errno.h>  #include <linux/module.h>  #include <linux/sched.h> @@ -22,8 +23,8 @@  #include <linux/reboot.h>  #include <linux/delay.h>  #include <linux/pm.h> -#include <linux/init.h>  #include <linux/slab.h> +#include <linux/cpu.h>  #include <asm/auxio.h>  #include <asm/oplib.h> @@ -39,6 +40,8 @@  #include <asm/unistd.h>  #include <asm/setup.h> +#include "kernel.h" +  /*    * Power management idle function    * Set in pm platform drivers (apc.c and pmc.c) @@ -103,8 +106,12 @@ void machine_restart(char * cmd)  void machine_power_off(void)  {  	if (auxio_power_register && -	    (strcmp(of_console_device->type, "serial") || scons_pwroff)) -		*auxio_power_register |= AUXIO_POWER_OFF; +	    (strcmp(of_console_device->type, "serial") || scons_pwroff)) { +		u8 power_register = sbus_readb(auxio_power_register); +		power_register |= AUXIO_POWER_OFF; +		sbus_writeb(power_register, auxio_power_register); +	} +  	machine_halt();  } diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c index baebab21549..027e0998619 100644 --- a/arch/sparc/kernel/process_64.c +++ b/arch/sparc/kernel/process_64.c @@ -31,6 +31,7 @@  #include <linux/elfcore.h>  #include <linux/sysrq.h>  #include <linux/nmi.h> +#include <linux/context_tracking.h>  #include <asm/uaccess.h>  #include <asm/page.h> @@ -57,9 +58,12 @@ void arch_cpu_idle(void)  {  	if (tlb_type != hypervisor) {  		touch_nmi_watchdog(); +		local_irq_enable();  	} else {  		unsigned long pstate; +		local_irq_enable(); +                  /* The sun4v sleeping code requires that we have PSTATE.IE cleared over                   * the cpu sleep hypervisor call.                   */ @@ -81,11 +85,10 @@ void arch_cpu_idle(void)  			: "=&r" (pstate)  			: "i" (PSTATE_IE));  	} -	local_irq_enable();  }  #ifdef CONFIG_HOTPLUG_CPU -void arch_cpu_idle_dead() +void arch_cpu_idle_dead(void)  {  	sched_preempt_enable_no_resched();  	cpu_play_dead(); @@ -236,7 +239,7 @@ static void __global_reg_poll(struct global_reg_snapshot *gp)  	}  } -void arch_trigger_all_cpu_backtrace(void) +void arch_trigger_all_cpu_backtrace(bool include_self)  {  	struct thread_info *tp = current_thread_info();  	struct pt_regs *regs = get_irq_regs(); @@ -248,16 +251,22 @@ void arch_trigger_all_cpu_backtrace(void)  	spin_lock_irqsave(&global_cpu_snapshot_lock, flags); -	memset(global_cpu_snapshot, 0, sizeof(global_cpu_snapshot)); -  	this_cpu = raw_smp_processor_id(); -	__global_reg_self(tp, regs, this_cpu); +	memset(global_cpu_snapshot, 0, sizeof(global_cpu_snapshot)); + +	if (include_self) +		__global_reg_self(tp, regs, this_cpu);  	smp_fetch_global_regs();  	for_each_online_cpu(cpu) { -		struct global_reg_snapshot *gp = &global_cpu_snapshot[cpu].reg; +		struct global_reg_snapshot *gp; + +		if (!include_self && cpu == this_cpu) +			continue; + +		gp = &global_cpu_snapshot[cpu].reg;  		__global_reg_poll(gp); @@ -289,7 +298,7 @@ void arch_trigger_all_cpu_backtrace(void)  static void sysrq_handle_globreg(int key)  { -	arch_trigger_all_cpu_backtrace(); +	arch_trigger_all_cpu_backtrace(true);  }  static struct sysrq_key_op sparc_globalreg_op = { @@ -557,6 +566,7 @@ void fault_in_user_windows(void)  barf:  	set_thread_wsaved(window + 1); +	user_exit();  	do_exit(SIGILL);  } diff --git a/arch/sparc/kernel/prom.h b/arch/sparc/kernel/prom.h index cf5fe1c0b02..890281b12b2 100644 --- a/arch/sparc/kernel/prom.h +++ b/arch/sparc/kernel/prom.h @@ -4,7 +4,7 @@  #include <linux/spinlock.h>  #include <asm/prom.h> -extern void of_console_init(void); +void of_console_init(void);  extern unsigned int prom_early_allocated; diff --git a/arch/sparc/kernel/prom_64.c b/arch/sparc/kernel/prom_64.c index d397d7fc5c2..20cc5d80a47 100644 --- a/arch/sparc/kernel/prom_64.c +++ b/arch/sparc/kernel/prom_64.c @@ -15,11 +15,12 @@   *      2 of the License, or (at your option) any later version.   */ +#include <linux/memblock.h>  #include <linux/kernel.h> -#include <linux/types.h>  #include <linux/string.h> +#include <linux/types.h> +#include <linux/cpu.h>  #include <linux/mm.h> -#include <linux/memblock.h>  #include <linux/of.h>  #include <asm/prom.h> @@ -373,6 +374,59 @@ static const char *get_mid_prop(void)  	return (tlb_type == spitfire ? "upa-portid" : "portid");  } +bool arch_find_n_match_cpu_physical_id(struct device_node *cpun, +				       int cpu, unsigned int *thread) +{ +	const char *mid_prop = get_mid_prop(); +	int this_cpu_id; + +	/* On hypervisor based platforms we interrogate the 'reg' +	 * property.  On everything else we look for a 'upa-portis', +	 * 'portid', or 'cpuid' property. +	 */ + +	if (tlb_type == hypervisor) { +		struct property *prop = of_find_property(cpun, "reg", NULL); +		u32 *regs; + +		if (!prop) { +			pr_warn("CPU node missing reg property\n"); +			return false; +		} +		regs = prop->value; +		this_cpu_id = regs[0] & 0x0fffffff; +	} else { +		this_cpu_id = of_getintprop_default(cpun, mid_prop, -1); + +		if (this_cpu_id < 0) { +			mid_prop = "cpuid"; +			this_cpu_id = of_getintprop_default(cpun, mid_prop, -1); +		} +		if (this_cpu_id < 0) { +			pr_warn("CPU node missing cpu ID property\n"); +			return false; +		} +	} +	if (this_cpu_id == cpu) { +		if (thread) { +			int proc_id = cpu_data(cpu).proc_id; + +			/* On sparc64, the cpu thread information is obtained +			 * either from OBP or the machine description.  We've +			 * actually probed this information already long before +			 * this interface gets called so instead of interrogating +			 * both the OF node and the MDESC again, just use what +			 * we discovered already. +			 */ +			if (proc_id < 0) +				proc_id = 0; +			*thread = proc_id; +		} +		return true; +	} +	return false; +} +  static void *of_iterate_over_cpus(void *(*func)(struct device_node *, int, int), int arg)  {  	struct device_node *dp; @@ -502,9 +556,6 @@ static void *fill_in_one_cpu(struct device_node *dp, int cpuid, int arg)  		cpu_data(cpuid).core_id = portid + 1;  		cpu_data(cpuid).proc_id = portid; -#ifdef CONFIG_SMP -		sparc64_multi_core = 1; -#endif  	} else {  		cpu_data(cpuid).dcache_size =  			of_getintprop_default(dp, "dcache-size", 16 * 1024); diff --git a/arch/sparc/kernel/psycho_common.h b/arch/sparc/kernel/psycho_common.h index 590b4ed8ab5..05a6e30a928 100644 --- a/arch/sparc/kernel/psycho_common.h +++ b/arch/sparc/kernel/psycho_common.h @@ -30,19 +30,19 @@ enum psycho_error_type {  	UE_ERR, CE_ERR, PCI_ERR  }; -extern void psycho_check_iommu_error(struct pci_pbm_info *pbm, -				     unsigned long afsr, -				     unsigned long afar, -				     enum psycho_error_type type); +void psycho_check_iommu_error(struct pci_pbm_info *pbm, +			      unsigned long afsr, +			      unsigned long afar, +			      enum psycho_error_type type); -extern irqreturn_t psycho_pcierr_intr(int irq, void *dev_id); +irqreturn_t psycho_pcierr_intr(int irq, void *dev_id); -extern int psycho_iommu_init(struct pci_pbm_info *pbm, int tsbsize, -			     u32 dvma_offset, u32 dma_mask, -			     unsigned long write_complete_offset); +int psycho_iommu_init(struct pci_pbm_info *pbm, int tsbsize, +		      u32 dvma_offset, u32 dma_mask, +		      unsigned long write_complete_offset); -extern void psycho_pbm_init_common(struct pci_pbm_info *pbm, -				   struct platform_device *op, -				   const char *chip_name, int chip_type); +void psycho_pbm_init_common(struct pci_pbm_info *pbm, +			    struct platform_device *op, +			    const char *chip_name, int chip_type);  #endif /* _PSYCHO_COMMON_H */ diff --git a/arch/sparc/kernel/ptrace_32.c b/arch/sparc/kernel/ptrace_32.c index 896ba7c5cd8..a331fdc11a2 100644 --- a/arch/sparc/kernel/ptrace_32.c +++ b/arch/sparc/kernel/ptrace_32.c @@ -26,6 +26,8 @@  #include <asm/uaccess.h>  #include <asm/cacheflush.h> +#include "kernel.h" +  /* #define ALLOW_INIT_TRACING */  /* diff --git a/arch/sparc/kernel/ptrace_64.c b/arch/sparc/kernel/ptrace_64.c index 773c1f2983c..c13c9f25d83 100644 --- a/arch/sparc/kernel/ptrace_64.c +++ b/arch/sparc/kernel/ptrace_64.c @@ -27,6 +27,7 @@  #include <trace/syscall.h>  #include <linux/compat.h>  #include <linux/elf.h> +#include <linux/context_tracking.h>  #include <asm/asi.h>  #include <asm/pgtable.h> @@ -1066,6 +1067,9 @@ asmlinkage int syscall_trace_enter(struct pt_regs *regs)  	/* do the secure computing check first */  	secure_computing_strict(regs->u_regs[UREG_G1]); +	if (test_thread_flag(TIF_NOHZ)) +		user_exit(); +  	if (test_thread_flag(TIF_SYSCALL_TRACE))  		ret = tracehook_report_syscall_entry(regs); @@ -1086,6 +1090,9 @@ asmlinkage int syscall_trace_enter(struct pt_regs *regs)  asmlinkage void syscall_trace_leave(struct pt_regs *regs)  { +	if (test_thread_flag(TIF_NOHZ)) +		user_exit(); +  	audit_syscall_exit(regs);  	if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) @@ -1093,4 +1100,7 @@ asmlinkage void syscall_trace_leave(struct pt_regs *regs)  	if (test_thread_flag(TIF_SYSCALL_TRACE))  		tracehook_report_syscall_exit(regs, 0); + +	if (test_thread_flag(TIF_NOHZ)) +		user_enter();  } diff --git a/arch/sparc/kernel/rtrap_64.S b/arch/sparc/kernel/rtrap_64.S index afa2a9e3d0a..39f0c662f4c 100644 --- a/arch/sparc/kernel/rtrap_64.S +++ b/arch/sparc/kernel/rtrap_64.S @@ -18,10 +18,16 @@  #define		RTRAP_PSTATE_IRQOFF	(PSTATE_TSO|PSTATE_PEF|PSTATE_PRIV)  #define		RTRAP_PSTATE_AG_IRQOFF	(PSTATE_TSO|PSTATE_PEF|PSTATE_PRIV|PSTATE_AG) +#ifdef CONFIG_CONTEXT_TRACKING +# define SCHEDULE_USER schedule_user +#else +# define SCHEDULE_USER schedule +#endif +  		.text  		.align			32  __handle_preemption: -		call			schedule +		call			SCHEDULE_USER  		 wrpr			%g0, RTRAP_PSTATE, %pstate  		ba,pt			%xcc, __handle_preemption_continue  		 wrpr			%g0, RTRAP_PSTATE_IRQOFF, %pstate @@ -306,12 +312,10 @@ to_kernel:  		 nop  		cmp			%l4, 0  		bne,pn			%xcc, kern_fpucheck -		 sethi			%hi(PREEMPT_ACTIVE), %l6 -		stw			%l6, [%g6 + TI_PRE_COUNT] -		call			schedule +		 nop +		call			preempt_schedule_irq  		 nop  		ba,pt			%xcc, rtrap -		 stw			%g0, [%g6 + TI_PRE_COUNT]  #endif  kern_fpucheck:	ldub			[%g6 + TI_FPDEPTH], %l5  		brz,pt			%l5, rt_continue diff --git a/arch/sparc/kernel/setup_32.c b/arch/sparc/kernel/setup_32.c index 1434526970a..baef495c06b 100644 --- a/arch/sparc/kernel/setup_32.c +++ b/arch/sparc/kernel/setup_32.c @@ -267,7 +267,7 @@ static __init void leon_patch(void)  }  struct tt_entry *sparc_ttable; -struct pt_regs fake_swapper_regs; +static struct pt_regs fake_swapper_regs;  /* Called from head_32.S - before we have setup anything   * in the kernel. Be very careful with what you do here. @@ -365,7 +365,7 @@ void __init setup_arch(char **cmdline_p)  	prom_setsync(prom_sync_me); -	if((boot_flags&BOOTME_DEBUG) && (linux_dbvec!=0) &&  +	if((boot_flags & BOOTME_DEBUG) && (linux_dbvec != NULL) &&  	   ((*(short *)linux_dbvec) != -1)) {  		printk("Booted under KADB. Syncing trap table.\n");  		(*(linux_dbvec->teach_debugger))(); diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c index b524f91dd0e..62deba7be1a 100644 --- a/arch/sparc/kernel/signal32.c +++ b/arch/sparc/kernel/signal32.c @@ -31,6 +31,7 @@  #include <asm/switch_to.h>  #include "sigutil.h" +#include "kernel.h"  /* This magic should be in g_upper[0] for all upper parts   * to be valid. @@ -68,7 +69,7 @@ struct rt_signal_frame32 {  	/* __siginfo_rwin_t * */u32 rwin_save;  } __attribute__((aligned(8))); -int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) +int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)  {  	int err; @@ -145,7 +146,7 @@ void do_sigreturn32(struct pt_regs *regs)  	unsigned int psr;  	unsigned pc, npc;  	sigset_t set; -	unsigned seta[_COMPAT_NSIG_WORDS]; +	compat_sigset_t seta;  	int err, i;  	/* Always make any pending restarted system calls return -EINTR */ @@ -209,17 +210,13 @@ void do_sigreturn32(struct pt_regs *regs)  		if (restore_rwin_state(compat_ptr(rwin_save)))  			goto segv;  	} -	err |= __get_user(seta[0], &sf->info.si_mask); -	err |= copy_from_user(seta+1, &sf->extramask, +	err |= __get_user(seta.sig[0], &sf->info.si_mask); +	err |= copy_from_user(&seta.sig[1], &sf->extramask,  			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));  	if (err)  	    	goto segv; -	switch (_NSIG_WORDS) { -		case 4: set.sig[3] = seta[6] + (((long)seta[7]) << 32); -		case 3: set.sig[2] = seta[4] + (((long)seta[5]) << 32); -		case 2: set.sig[1] = seta[2] + (((long)seta[3]) << 32); -		case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32); -	} + +	set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32);  	set_current_blocked(&set);  	return; @@ -303,12 +300,7 @@ asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)  			goto segv;  	} -	switch (_NSIG_WORDS) { -		case 4: set.sig[3] = seta.sig[6] + (((long)seta.sig[7]) << 32); -		case 3: set.sig[2] = seta.sig[4] + (((long)seta.sig[5]) << 32); -		case 2: set.sig[1] = seta.sig[2] + (((long)seta.sig[3]) << 32); -		case 1: set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32); -	} +	set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32);  	set_current_blocked(&set);  	return;  segv: @@ -417,7 +409,7 @@ static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs,  	void __user *tail;  	int sigframe_size;  	u32 psr; -	unsigned int seta[_COMPAT_NSIG_WORDS]; +	compat_sigset_t seta;  	/* 1. Make sure everything is clean */  	synchronize_user_stack(); @@ -481,18 +473,14 @@ static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs,  		err |= __put_user(0, &sf->rwin_save);  	} -	switch (_NSIG_WORDS) { -	case 4: seta[7] = (oldset->sig[3] >> 32); -	        seta[6] = oldset->sig[3]; -	case 3: seta[5] = (oldset->sig[2] >> 32); -	        seta[4] = oldset->sig[2]; -	case 2: seta[3] = (oldset->sig[1] >> 32); -	        seta[2] = oldset->sig[1]; -	case 1: seta[1] = (oldset->sig[0] >> 32); -	        seta[0] = oldset->sig[0]; -	} -	err |= __put_user(seta[0], &sf->info.si_mask); -	err |= __copy_to_user(sf->extramask, seta + 1, +	/* If these change we need to know - assignments to seta relies on these sizes */ +	BUILD_BUG_ON(_NSIG_WORDS != 1); +	BUILD_BUG_ON(_COMPAT_NSIG_WORDS != 2); +	seta.sig[1] = (oldset->sig[0] >> 32); +	seta.sig[0] = oldset->sig[0]; + +	err |= __put_user(seta.sig[0], &sf->info.si_mask); +	err |= __copy_to_user(sf->extramask, &seta.sig[1],  			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));  	if (!wsaved) { @@ -622,16 +610,8 @@ static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs,  	/* Setup sigaltstack */  	err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]); -	switch (_NSIG_WORDS) { -	case 4: seta.sig[7] = (oldset->sig[3] >> 32); -		seta.sig[6] = oldset->sig[3]; -	case 3: seta.sig[5] = (oldset->sig[2] >> 32); -		seta.sig[4] = oldset->sig[2]; -	case 2: seta.sig[3] = (oldset->sig[1] >> 32); -		seta.sig[2] = oldset->sig[1]; -	case 1: seta.sig[1] = (oldset->sig[0] >> 32); -		seta.sig[0] = oldset->sig[0]; -	} +	seta.sig[1] = (oldset->sig[0] >> 32); +	seta.sig[0] = oldset->sig[0];  	err |= __copy_to_user(&sf->mask, &seta, sizeof(compat_sigset_t));  	if (!wsaved) { diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c index 7d5d8e1f841..9ee72fc8e0e 100644 --- a/arch/sparc/kernel/signal_32.c +++ b/arch/sparc/kernel/signal_32.c @@ -28,6 +28,7 @@  #include <asm/switch_to.h>  #include "sigutil.h" +#include "kernel.h"  extern void fpsave(unsigned long *fpregs, unsigned long *fsr,  		   void *fpqueue, unsigned long *fpqdepth); @@ -341,7 +342,7 @@ static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs,  	err |= __put_user(0, &sf->extra_size);  	if (psr & PSR_EF) { -		__siginfo_fpu_t *fp = tail; +		__siginfo_fpu_t __user *fp = tail;  		tail += sizeof(*fp);  		err |= save_fpu_state(regs, fp);  		err |= __put_user(fp, &sf->fpu_save); @@ -349,7 +350,7 @@ static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs,  		err |= __put_user(0, &sf->fpu_save);  	}  	if (wsaved) { -		__siginfo_rwin_t *rwp = tail; +		__siginfo_rwin_t __user *rwp = tail;  		tail += sizeof(*rwp);  		err |= save_rwin_state(wsaved, rwp);  		err |= __put_user(rwp, &sf->rwin_save); @@ -517,9 +518,9 @@ void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0,  	}  } -asmlinkage int -do_sys_sigstack(struct sigstack __user *ssptr, struct sigstack __user *ossptr, -		unsigned long sp) +asmlinkage int do_sys_sigstack(struct sigstack __user *ssptr, +                               struct sigstack __user *ossptr, +                               unsigned long sp)  {  	int ret = -EFAULT; diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 35923e8abd8..1a699986803 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c @@ -23,6 +23,7 @@  #include <linux/tty.h>  #include <linux/binfmts.h>  #include <linux/bitops.h> +#include <linux/context_tracking.h>  #include <asm/uaccess.h>  #include <asm/ptrace.h> @@ -34,15 +35,17 @@  #include <asm/switch_to.h>  #include <asm/cacheflush.h> -#include "entry.h" -#include "systbls.h"  #include "sigutil.h" +#include "systbls.h" +#include "kernel.h" +#include "entry.h"  /* {set, get}context() needed for 64-bit SparcLinux userland. */  asmlinkage void sparc64_set_context(struct pt_regs *regs)  {  	struct ucontext __user *ucp = (struct ucontext __user *)  		regs->u_regs[UREG_I0]; +	enum ctx_state prev_state = exception_enter();  	mc_gregset_t __user *grp;  	unsigned long pc, npc, tstate;  	unsigned long fp, i7; @@ -129,16 +132,19 @@ asmlinkage void sparc64_set_context(struct pt_regs *regs)  	}  	if (err)  		goto do_sigsegv; - +out: +	exception_exit(prev_state);  	return;  do_sigsegv:  	force_sig(SIGSEGV, current); +	goto out;  }  asmlinkage void sparc64_get_context(struct pt_regs *regs)  {  	struct ucontext __user *ucp = (struct ucontext __user *)  		regs->u_regs[UREG_I0]; +	enum ctx_state prev_state = exception_enter();  	mc_gregset_t __user *grp;  	mcontext_t __user *mcp;  	unsigned long fp, i7; @@ -220,10 +226,12 @@ asmlinkage void sparc64_get_context(struct pt_regs *regs)  	}  	if (err)  		goto do_sigsegv; - +out: +	exception_exit(prev_state);  	return;  do_sigsegv:  	force_sig(SIGSEGV, current); +	goto out;  }  struct rt_signal_frame { @@ -485,7 +493,6 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)  #ifdef CONFIG_COMPAT  	if (test_thread_flag(TIF_32BIT)) { -		extern void do_signal32(struct pt_regs *);  		do_signal32(regs);  		return;  	} @@ -528,11 +535,13 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)  void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags)  { +	user_exit();  	if (thread_info_flags & _TIF_SIGPENDING)  		do_signal(regs, orig_i0);  	if (thread_info_flags & _TIF_NOTIFY_RESUME) {  		clear_thread_flag(TIF_NOTIFY_RESUME);  		tracehook_notify_resume(regs);  	} +	user_enter();  } diff --git a/arch/sparc/kernel/smp_32.c b/arch/sparc/kernel/smp_32.c index a102bfba6ea..7958242d63c 100644 --- a/arch/sparc/kernel/smp_32.c +++ b/arch/sparc/kernel/smp_32.c @@ -20,6 +20,7 @@  #include <linux/seq_file.h>  #include <linux/cache.h>  #include <linux/delay.h> +#include <linux/profile.h>  #include <linux/cpu.h>  #include <asm/ptrace.h> @@ -75,8 +76,6 @@ void smp_store_cpu_info(int id)  void __init smp_cpus_done(unsigned int max_cpus)  { -	extern void smp4m_smp_done(void); -	extern void smp4d_smp_done(void);  	unsigned long bogosum = 0;  	int cpu, num = 0; @@ -183,8 +182,6 @@ int setup_profiling_timer(unsigned int multiplier)  void __init smp_prepare_cpus(unsigned int max_cpus)  { -	extern void __init smp4m_boot_cpus(void); -	extern void __init smp4d_boot_cpus(void);  	int i, cpuid, extra;  	printk("Entering SMP Mode...\n"); @@ -261,8 +258,6 @@ void __init smp_prepare_boot_cpu(void)  int __cpu_up(unsigned int cpu, struct task_struct *tidle)  { -	extern int smp4m_boot_one_cpu(int, struct task_struct *); -	extern int smp4d_boot_one_cpu(int, struct task_struct *);  	int ret=0;  	switch(sparc_cpu_model) { @@ -297,7 +292,7 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle)  	return ret;  } -void arch_cpu_pre_starting(void *arg) +static void arch_cpu_pre_starting(void *arg)  {  	local_ops->cache_all();  	local_ops->tlb_all(); @@ -317,7 +312,7 @@ void arch_cpu_pre_starting(void *arg)  	}  } -void arch_cpu_pre_online(void *arg) +static void arch_cpu_pre_online(void *arg)  {  	unsigned int cpuid = hard_smp_processor_id(); @@ -344,7 +339,7 @@ void arch_cpu_pre_online(void *arg)  	}  } -void sparc_start_secondary(void *arg) +static void sparc_start_secondary(void *arg)  {  	unsigned int cpu; diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index e142545244f..41aa2478f3c 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c @@ -25,6 +25,7 @@  #include <linux/ftrace.h>  #include <linux/cpu.h>  #include <linux/slab.h> +#include <linux/kgdb.h>  #include <asm/head.h>  #include <asm/ptrace.h> @@ -35,6 +36,7 @@  #include <asm/hvtramp.h>  #include <asm/io.h>  #include <asm/timer.h> +#include <asm/setup.h>  #include <asm/irq.h>  #include <asm/irq_regs.h> @@ -52,8 +54,7 @@  #include <asm/pcr.h>  #include "cpumap.h" - -int sparc64_multi_core __read_mostly; +#include "kernel.h"  DEFINE_PER_CPU(cpumask_t, cpu_sibling_map) = CPU_MASK_NONE;  cpumask_t cpu_core_map[NR_CPUS] __read_mostly = @@ -123,11 +124,12 @@ void smp_callin(void)  		rmb();  	set_cpu_online(cpuid, true); -	local_irq_enable();  	/* idle thread is expected to have preempt disabled */  	preempt_disable(); +	local_irq_enable(); +  	cpu_startup_entry(CPUHP_ONLINE);  } @@ -150,7 +152,7 @@ void cpu_panic(void)  #define NUM_ROUNDS	64	/* magic value */  #define NUM_ITERS	5	/* likewise */ -static DEFINE_SPINLOCK(itc_sync_lock); +static DEFINE_RAW_SPINLOCK(itc_sync_lock);  static unsigned long go[SLAVE + 1];  #define DEBUG_TICK_SYNC	0 @@ -258,7 +260,7 @@ static void smp_synchronize_one_tick(int cpu)  	go[MASTER] = 0;  	membar_safe("#StoreLoad"); -	spin_lock_irqsave(&itc_sync_lock, flags); +	raw_spin_lock_irqsave(&itc_sync_lock, flags);  	{  		for (i = 0; i < NUM_ROUNDS*NUM_ITERS; i++) {  			while (!go[MASTER]) @@ -269,18 +271,10 @@ static void smp_synchronize_one_tick(int cpu)  			membar_safe("#StoreLoad");  		}  	} -	spin_unlock_irqrestore(&itc_sync_lock, flags); +	raw_spin_unlock_irqrestore(&itc_sync_lock, flags);  }  #if defined(CONFIG_SUN_LDOMS) && defined(CONFIG_HOTPLUG_CPU) -/* XXX Put this in some common place. XXX */ -static unsigned long kimage_addr_to_ra(void *p) -{ -	unsigned long val = (unsigned long) p; - -	return kern_base + (val - KERNBASE); -} -  static void ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg,  				void **descrp)  { @@ -868,11 +862,6 @@ extern unsigned long xcall_flush_dcache_page_cheetah;  #endif  extern unsigned long xcall_flush_dcache_page_spitfire; -#ifdef CONFIG_DEBUG_DCFLUSH -extern atomic_t dcpage_flushes; -extern atomic_t dcpage_flushes_xcall; -#endif -  static inline void __local_flush_dcache_page(struct page *page)  {  #ifdef DCACHE_ALIASING_POSSIBLE @@ -1399,8 +1388,13 @@ void __init smp_cpus_done(unsigned int max_cpus)  void smp_send_reschedule(int cpu)  { -	xcall_deliver((u64) &xcall_receive_signal, 0, 0, -		      cpumask_of(cpu)); +	if (cpu == smp_processor_id()) { +		WARN_ON_ONCE(preemptible()); +		set_softint(1 << PIL_SMP_RECEIVE_SIGNAL); +	} else { +		xcall_deliver((u64) &xcall_receive_signal, +			      0, 0, cpumask_of(cpu)); +	}  }  void __irq_entry smp_receive_signal_client(int irq, struct pt_regs *regs) diff --git a/arch/sparc/kernel/sparc_ksyms_32.c b/arch/sparc/kernel/sparc_ksyms_32.c index e521c54560f..bf4ccb10a78 100644 --- a/arch/sparc/kernel/sparc_ksyms_32.c +++ b/arch/sparc/kernel/sparc_ksyms_32.c @@ -6,7 +6,6 @@   */  #include <linux/module.h> -#include <linux/init.h>  #include <asm/pgtable.h>  #include <asm/uaccess.h> diff --git a/arch/sparc/kernel/sparc_ksyms_64.c b/arch/sparc/kernel/sparc_ksyms_64.c index 9f5e24ddcc7..a92d5d2c46a 100644 --- a/arch/sparc/kernel/sparc_ksyms_64.c +++ b/arch/sparc/kernel/sparc_ksyms_64.c @@ -7,7 +7,6 @@  #include <linux/export.h>  #include <linux/pci.h> -#include <linux/init.h>  #include <linux/bitops.h>  #include <asm/cpudata.h> diff --git a/arch/sparc/kernel/sun4d_irq.c b/arch/sparc/kernel/sun4d_irq.c index f8933be3ca8..a1bb2675b28 100644 --- a/arch/sparc/kernel/sun4d_irq.c +++ b/arch/sparc/kernel/sun4d_irq.c @@ -143,7 +143,7 @@ static void sun4d_sbus_handler_irq(int sbusl)  	}  } -void sun4d_handler_irq(int pil, struct pt_regs *regs) +void sun4d_handler_irq(unsigned int pil, struct pt_regs *regs)  {  	struct pt_regs *old_regs;  	/* SBUS IRQ level (1 - 7) */ @@ -236,7 +236,7 @@ static void sun4d_shutdown_irq(struct irq_data *data)  	irq_unlink(data->irq);  } -struct irq_chip sun4d_irq = { +static struct irq_chip sun4d_irq = {  	.name		= "sun4d",  	.irq_startup	= sun4d_startup_irq,  	.irq_shutdown	= sun4d_shutdown_irq, @@ -285,9 +285,9 @@ static void __init sun4d_load_profile_irqs(void)  	}  } -unsigned int _sun4d_build_device_irq(unsigned int real_irq, -                                     unsigned int pil, -                                     unsigned int board) +static unsigned int _sun4d_build_device_irq(unsigned int real_irq, +                                            unsigned int pil, +                                            unsigned int board)  {  	struct sun4d_handler_data *handler_data;  	unsigned int irq; @@ -320,8 +320,8 @@ err_out: -unsigned int sun4d_build_device_irq(struct platform_device *op, -                                    unsigned int real_irq) +static unsigned int sun4d_build_device_irq(struct platform_device *op, +                                           unsigned int real_irq)  {  	struct device_node *dp = op->dev.of_node;  	struct device_node *board_parent, *bus = dp->parent; @@ -383,7 +383,8 @@ err_out:  	return irq;  } -unsigned int sun4d_build_timer_irq(unsigned int board, unsigned int real_irq) +static unsigned int sun4d_build_timer_irq(unsigned int board, +                                          unsigned int real_irq)  {  	return _sun4d_build_device_irq(real_irq, real_irq, board);  } diff --git a/arch/sparc/kernel/sun4m_irq.c b/arch/sparc/kernel/sun4m_irq.c index c5ade9d27a1..8bb3b3fddea 100644 --- a/arch/sparc/kernel/sun4m_irq.c +++ b/arch/sparc/kernel/sun4m_irq.c @@ -9,6 +9,8 @@   *  Copyright (C) 1996 Dave Redman (djhr@tadpole.co.uk)   */ +#include <linux/slab.h> +  #include <asm/timer.h>  #include <asm/traps.h>  #include <asm/pgalloc.h> diff --git a/arch/sparc/kernel/sun4v_tlb_miss.S b/arch/sparc/kernel/sun4v_tlb_miss.S index bde867fd71e..e0c09bf8561 100644 --- a/arch/sparc/kernel/sun4v_tlb_miss.S +++ b/arch/sparc/kernel/sun4v_tlb_miss.S @@ -182,7 +182,7 @@ sun4v_tsb_miss_common:  	cmp	%g5, -1  	be,pt	%xcc, 80f  	 nop -	COMPUTE_TSB_PTR(%g5, %g4, HPAGE_SHIFT, %g2, %g7) +	COMPUTE_TSB_PTR(%g5, %g4, REAL_HPAGE_SHIFT, %g2, %g7)  	/* That clobbered %g2, reload it.  */  	ldxa	[%g0] ASI_SCRATCHPAD, %g2 diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S index f7c72b6efc2..f834224208e 100644 --- a/arch/sparc/kernel/sys32.S +++ b/arch/sparc/kernel/sys32.S @@ -44,10 +44,11 @@ SIGN1(sys32_timer_settime, compat_sys_timer_settime, %o1)  SIGN1(sys32_io_submit, compat_sys_io_submit, %o1)  SIGN1(sys32_mq_open, compat_sys_mq_open, %o1)  SIGN1(sys32_select, compat_sys_select, %o0) -SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5) +SIGN1(sys32_futex, compat_sys_futex, %o1)  SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0)  SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0)  SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) +SIGN2(sys32_renameat2, sys_renameat2, %o0, %o2)  	.globl		sys32_mmap2  sys32_mmap2: diff --git a/arch/sparc/kernel/sys_sparc32.c b/arch/sparc/kernel/sys_sparc32.c index 71368850dfc..022c30c72eb 100644 --- a/arch/sparc/kernel/sys_sparc32.c +++ b/arch/sparc/kernel/sys_sparc32.c @@ -49,6 +49,8 @@  #include <asm/mmu_context.h>  #include <asm/compat_signal.h> +#include "systbls.h" +  asmlinkage long sys32_truncate64(const char __user * path, unsigned long high, unsigned long low)  {  	if ((int)high < 0) diff --git a/arch/sparc/kernel/sys_sparc_32.c b/arch/sparc/kernel/sys_sparc_32.c index 3a8d1844402..646988d4c1a 100644 --- a/arch/sparc/kernel/sys_sparc_32.c +++ b/arch/sparc/kernel/sys_sparc_32.c @@ -24,6 +24,8 @@  #include <asm/uaccess.h>  #include <asm/unistd.h> +#include "systbls.h" +  /* #define DEBUG_UNIMP_SYSCALL */  /* XXX Make this per-binary type, this way we can detect the type of @@ -68,7 +70,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi   * sys_pipe() is the normal C calling standard for creating   * a pipe. It's not the way unix traditionally does this, though.   */ -asmlinkage int sparc_pipe(struct pt_regs *regs) +asmlinkage long sparc_pipe(struct pt_regs *regs)  {  	int fd[2];  	int error; @@ -93,7 +95,7 @@ int sparc_mmap_check(unsigned long addr, unsigned long len)  /* Linux version of mmap */ -asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len, +asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,  	unsigned long prot, unsigned long flags, unsigned long fd,  	unsigned long pgoff)  { @@ -103,7 +105,7 @@ asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len,  			      pgoff >> (PAGE_SHIFT - 12));  } -asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len, +asmlinkage long sys_mmap(unsigned long addr, unsigned long len,  	unsigned long prot, unsigned long flags, unsigned long fd,  	unsigned long off)  { @@ -197,7 +199,7 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig,  	return ret;  } -asmlinkage int sys_getdomainname(char __user *name, int len) +asmlinkage long sys_getdomainname(char __user *name, int len)  {   	int nlen, err; diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index 51561b8b15b..c85403d0496 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c @@ -24,12 +24,14 @@  #include <linux/personality.h>  #include <linux/random.h>  #include <linux/export.h> +#include <linux/context_tracking.h>  #include <asm/uaccess.h>  #include <asm/utrap.h>  #include <asm/unistd.h>  #include "entry.h" +#include "kernel.h"  #include "systbls.h"  /* #define DEBUG_UNIMP_SYSCALL */ @@ -39,9 +41,6 @@ asmlinkage unsigned long sys_getpagesize(void)  	return PAGE_SIZE;  } -#define VA_EXCLUDE_START (0x0000080000000000UL - (1UL << 32UL)) -#define VA_EXCLUDE_END   (0xfffff80000000000UL + (1UL << 32UL)) -  /* Does addr --> addr+len fall within 4GB of the VA-space hole or   * overflow past the end of the 64-bit address space?   */ @@ -499,6 +498,7 @@ asmlinkage unsigned long c_sys_nis_syscall(struct pt_regs *regs)  asmlinkage void sparc_breakpoint(struct pt_regs *regs)  { +	enum ctx_state prev_state = exception_enter();  	siginfo_t info;  	if (test_thread_flag(TIF_32BIT)) { @@ -517,6 +517,7 @@ asmlinkage void sparc_breakpoint(struct pt_regs *regs)  #ifdef DEBUG_SPARC_BREAKPOINT  	printk ("TRAP: Returning to space: PC=%lx nPC=%lx\n", regs->tpc, regs->tnpc);  #endif +	exception_exit(prev_state);  }  extern void check_pending(int signum); diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S index d950197a17e..33a17e7b3cc 100644 --- a/arch/sparc/kernel/syscalls.S +++ b/arch/sparc/kernel/syscalls.S @@ -52,7 +52,7 @@ sys32_rt_sigreturn:  #endif  	.align	32  1:	ldx	[%g6 + TI_FLAGS], %l5 -	andcc	%l5, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0 +	andcc	%l5, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0  	be,pt	%icc, rtrap  	 nop  	call	syscall_trace_leave @@ -184,12 +184,13 @@ linux_sparc_syscall32:  	srl	%i3, 0, %o3				! IEU0  	srl	%i2, 0, %o2				! IEU0	Group -	andcc	%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0 +	andcc	%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0  	bne,pn	%icc, linux_syscall_trace32		! CTI  	 mov	%i0, %l5				! IEU1  5:	call	%l7					! CTI	Group brk forced  	 srl	%i5, 0, %o5				! IEU1 -	ba,a,pt	%xcc, 3f +	ba,pt	%xcc, 3f +	 sra	%o0, 0, %o0  	/* Linux native system calls enter here... */  	.align	32 @@ -207,7 +208,7 @@ linux_sparc_syscall:  	mov	%i3, %o3				! IEU1  	mov	%i4, %o4				! IEU0	Group -	andcc	%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0 +	andcc	%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0  	bne,pn	%icc, linux_syscall_trace		! CTI	Group  	 mov	%i0, %l5				! IEU0  2:	call	%l7					! CTI	Group brk forced @@ -217,13 +218,12 @@ linux_sparc_syscall:  3:	stx	%o0, [%sp + PTREGS_OFF + PT_V9_I0]  ret_sys_call:  	ldx	[%sp + PTREGS_OFF + PT_V9_TSTATE], %g3 -	sra	%o0, 0, %o0  	mov	%ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2  	sllx	%g2, 32, %g2  	cmp	%o0, -ERESTART_RESTARTBLOCK  	bgeu,pn	%xcc, 1f -	 andcc	%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0 +	 andcc	%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0  	ldx	[%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc  2: diff --git a/arch/sparc/kernel/sysfs.c b/arch/sparc/kernel/sysfs.c index c21c673e5f7..7f41d40b7e6 100644 --- a/arch/sparc/kernel/sysfs.c +++ b/arch/sparc/kernel/sysfs.c @@ -151,7 +151,7 @@ static ssize_t store_mmustat_enable(struct device *s,  			size_t count)  {  	unsigned long val, err; -	int ret = sscanf(buf, "%ld", &val); +	int ret = sscanf(buf, "%lu", &val);  	if (ret != 1)  		return -EINVAL; @@ -300,7 +300,7 @@ static int __init topology_init(void)  	check_mmu_stats(); -	register_cpu_notifier(&sysfs_cpu_nb); +	cpu_notifier_register_begin();  	for_each_possible_cpu(cpu) {  		struct cpu *c = &per_cpu(cpu_devices, cpu); @@ -310,6 +310,10 @@ static int __init topology_init(void)  			register_cpu_online(cpu);  	} +	__register_cpu_notifier(&sysfs_cpu_nb); + +	cpu_notifier_register_done(); +  	return 0;  } diff --git a/arch/sparc/kernel/systbls.h b/arch/sparc/kernel/systbls.h index 26e6dd72e92..2dab8236d49 100644 --- a/arch/sparc/kernel/systbls.h +++ b/arch/sparc/kernel/systbls.h @@ -1,41 +1,103 @@  #ifndef _SYSTBLS_H  #define _SYSTBLS_H +#include <linux/signal.h>  #include <linux/kernel.h> +#include <linux/compat.h>  #include <linux/types.h> -#include <linux/signal.h> +  #include <asm/utrap.h> -extern asmlinkage unsigned long sys_getpagesize(void); -extern asmlinkage long sparc_pipe(struct pt_regs *regs); -extern asmlinkage long sys_sparc_ipc(unsigned int call, int first, -			       unsigned long second, -			       unsigned long third, -			       void __user *ptr, long fifth); -extern asmlinkage long sparc64_personality(unsigned long personality); -extern asmlinkage long sys64_munmap(unsigned long addr, size_t len); -extern asmlinkage unsigned long sys64_mremap(unsigned long addr, -					     unsigned long old_len, -					     unsigned long new_len, -					     unsigned long flags, -					     unsigned long new_addr); -extern asmlinkage unsigned long c_sys_nis_syscall(struct pt_regs *regs); -extern asmlinkage long sys_getdomainname(char __user *name, int len); -extern asmlinkage long sys_utrap_install(utrap_entry_t type, -					 utrap_handler_t new_p, -					 utrap_handler_t new_d, -					 utrap_handler_t __user *old_p, -					 utrap_handler_t __user *old_d); -extern asmlinkage long sparc_memory_ordering(unsigned long model, -					     struct pt_regs *regs); -extern asmlinkage long sys_rt_sigaction(int sig, -					const struct sigaction __user *act, -					struct sigaction __user *oact, -					void __user *restorer, -					size_t sigsetsize); +asmlinkage unsigned long sys_getpagesize(void); +asmlinkage long sparc_pipe(struct pt_regs *regs); +asmlinkage unsigned long c_sys_nis_syscall(struct pt_regs *regs); +asmlinkage long sys_getdomainname(char __user *name, int len); +void do_rt_sigreturn(struct pt_regs *regs); +asmlinkage long sys_mmap(unsigned long addr, unsigned long len, +			 unsigned long prot, unsigned long flags, +			 unsigned long fd, unsigned long off); +asmlinkage void sparc_breakpoint(struct pt_regs *regs); + +#ifdef CONFIG_SPARC32 +asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, +			  unsigned long prot, unsigned long flags, +			  unsigned long fd, unsigned long pgoff); +long sparc_remap_file_pages(unsigned long start, unsigned long size, +			    unsigned long prot, unsigned long pgoff, +			    unsigned long flags); -extern asmlinkage void sparc64_set_context(struct pt_regs *regs); -extern asmlinkage void sparc64_get_context(struct pt_regs *regs); -extern void do_rt_sigreturn(struct pt_regs *regs); +#endif /* CONFIG_SPARC32 */ +#ifdef CONFIG_SPARC64 +asmlinkage long sys_sparc_ipc(unsigned int call, int first, +			      unsigned long second, +			      unsigned long third, +			      void __user *ptr, long fifth); +asmlinkage long sparc64_personality(unsigned long personality); +asmlinkage long sys64_munmap(unsigned long addr, size_t len); +asmlinkage unsigned long sys64_mremap(unsigned long addr, +				      unsigned long old_len, +				      unsigned long new_len, +				      unsigned long flags, +				      unsigned long new_addr); +asmlinkage long sys_utrap_install(utrap_entry_t type, +				  utrap_handler_t new_p, +				  utrap_handler_t new_d, +				  utrap_handler_t __user *old_p, +				  utrap_handler_t __user *old_d); +asmlinkage long sparc_memory_ordering(unsigned long model, +				      struct pt_regs *regs); +asmlinkage void sparc64_set_context(struct pt_regs *regs); +asmlinkage void sparc64_get_context(struct pt_regs *regs); +asmlinkage long sys32_truncate64(const char __user * path, +				 unsigned long high, +				 unsigned long low); +asmlinkage long sys32_ftruncate64(unsigned int fd, +				  unsigned long high, +				  unsigned long low); +struct compat_stat64; +asmlinkage long compat_sys_stat64(const char __user * filename, +				  struct compat_stat64 __user *statbuf); +asmlinkage long compat_sys_lstat64(const char __user * filename, +				   struct compat_stat64 __user *statbuf); +asmlinkage long compat_sys_fstat64(unsigned int fd, +				   struct compat_stat64 __user * statbuf); +asmlinkage long compat_sys_fstatat64(unsigned int dfd, +				     const char __user *filename, +				     struct compat_stat64 __user * statbuf, int flag); +asmlinkage compat_ssize_t sys32_pread64(unsigned int fd, +					char __user *ubuf, +					compat_size_t count, +					unsigned long poshi, +					unsigned long poslo); +asmlinkage compat_ssize_t sys32_pwrite64(unsigned int fd, +					 char __user *ubuf, +					 compat_size_t count, +					 unsigned long poshi, +					 unsigned long poslo); +asmlinkage long compat_sys_readahead(int fd, +				     unsigned long offhi, +				     unsigned long offlo, +				     compat_size_t count); +long compat_sys_fadvise64(int fd, +			  unsigned long offhi, +			  unsigned long offlo, +			  compat_size_t len, int advice); +long compat_sys_fadvise64_64(int fd, +			     unsigned long offhi, unsigned long offlo, +			     unsigned long lenhi, unsigned long lenlo, +			     int advice); +long sys32_sync_file_range(unsigned int fd, +			   unsigned long off_high, unsigned long off_low, +			   unsigned long nb_high, unsigned long nb_low, +			   unsigned int flags); +asmlinkage long compat_sys_fallocate(int fd, int mode, u32 offhi, u32 offlo, +				     u32 lenhi, u32 lenlo); +asmlinkage long compat_sys_fstat64(unsigned int fd, +				   struct compat_stat64 __user * statbuf); +asmlinkage long compat_sys_fstatat64(unsigned int dfd, +				     const char __user *filename, +				     struct compat_stat64 __user * statbuf, +				     int flag); +#endif /* CONFIG_SPARC64 */  #endif /* _SYSTBLS_H */ diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S index 7b87171ecf1..85fe9b1087c 100644 --- a/arch/sparc/kernel/systbls_32.S +++ b/arch/sparc/kernel/systbls_32.S @@ -85,4 +85,5 @@ sys_call_table:  /*325*/	.long sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init  /*330*/	.long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime  /*335*/	.long sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev -/*340*/	.long sys_ni_syscall, sys_kcmp, sys_finit_module +/*340*/	.long sys_ni_syscall, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr +/*345*/	.long sys_renameat2 diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index 6d81597064b..33ecba2826e 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S @@ -86,7 +86,8 @@ sys_call_table32:  	.word compat_sys_pwritev, compat_sys_rt_tgsigqueueinfo, sys_perf_event_open, compat_sys_recvmmsg, sys_fanotify_init  /*330*/	.word compat_sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime  	.word sys_syncfs, compat_sys_sendmmsg, sys_setns, compat_sys_process_vm_readv, compat_sys_process_vm_writev -/*340*/	.word sys_kern_features, sys_kcmp, sys_finit_module +/*340*/	.word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr +	.word sys32_renameat2  #endif /* CONFIG_COMPAT */ @@ -164,4 +165,5 @@ sys_call_table:  	.word sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init  /*330*/	.word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime  	.word sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev -/*340*/	.word sys_kern_features, sys_kcmp, sys_finit_module +/*340*/	.word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr +	.word sys_renameat2 diff --git a/arch/sparc/kernel/tadpole.c b/arch/sparc/kernel/tadpole.c deleted file mode 100644 index 9aba8bd5a78..00000000000 --- a/arch/sparc/kernel/tadpole.c +++ /dev/null @@ -1,126 +0,0 @@ -/* tadpole.c: Probing for the tadpole clock stopping h/w at boot time. - * - * Copyright (C) 1996 David Redman (djhr@tadpole.co.uk) - */ - -#include <linux/string.h> -#include <linux/kernel.h> -#include <linux/sched.h> -#include <linux/init.h> - -#include <asm/asi.h> -#include <asm/oplib.h> -#include <asm/io.h> - -#define MACIO_SCSI_CSR_ADDR	0x78400000 -#define MACIO_EN_DMA		0x00000200 -#define CLOCK_INIT_DONE		1 - -static int clk_state; -static volatile unsigned char *clk_ctrl; -void (*cpu_pwr_save)(void); - -static inline unsigned int ldphys(unsigned int addr) -{ -	unsigned long data; -     -	__asm__ __volatile__("\n\tlda [%1] %2, %0\n\t" :  -			     "=r" (data) : -			     "r" (addr), "i" (ASI_M_BYPASS)); -	return data; -} - -static void clk_init(void) -{ -	__asm__ __volatile__("mov 0x6c, %%g1\n\t" -			     "mov 0x4c, %%g2\n\t" -			     "mov 0xdf, %%g3\n\t" -			     "stb %%g1, [%0+3]\n\t" -			     "stb %%g2, [%0+3]\n\t" -			     "stb %%g3, [%0+3]\n\t" : : -			     "r" (clk_ctrl) : -			     "g1", "g2", "g3"); -} - -static void clk_slow(void) -{ -	__asm__ __volatile__("mov 0xcc, %%g2\n\t" -			     "mov 0x4c, %%g3\n\t" -			     "mov 0xcf, %%g4\n\t" -			     "mov 0xdf, %%g5\n\t" -			     "stb %%g2, [%0+3]\n\t" -			     "stb %%g3, [%0+3]\n\t" -			     "stb %%g4, [%0+3]\n\t" -			     "stb %%g5, [%0+3]\n\t" : : -			     "r" (clk_ctrl) : -			     "g2", "g3", "g4", "g5"); -} - -/* - * Tadpole is guaranteed to be UP, using local_irq_save. - */ -static void tsu_clockstop(void) -{ -	unsigned int mcsr; -	unsigned long flags; - -	if (!clk_ctrl) -		return; -	if (!(clk_state & CLOCK_INIT_DONE)) { -		local_irq_save(flags); -		clk_init(); -		clk_state |= CLOCK_INIT_DONE;       /* all done */ -		local_irq_restore(flags); -		return; -	} -	if (!(clk_ctrl[2] & 1)) -		return;               /* no speed up yet */ - -	local_irq_save(flags); - -	/* if SCSI DMA in progress, don't slow clock */ -	mcsr = ldphys(MACIO_SCSI_CSR_ADDR); -	if ((mcsr&MACIO_EN_DMA) != 0) { -		local_irq_restore(flags); -		return; -	} -	/* TODO... the minimum clock setting ought to increase the -	 * memory refresh interval.. -	 */ -	clk_slow(); -	local_irq_restore(flags); -} - -static void swift_clockstop(void) -{ -	if (!clk_ctrl) -		return; -	clk_ctrl[0] = 0; -} - -void __init clock_stop_probe(void) -{ -	phandle node, clk_nd; -	char name[20]; -     -	prom_getstring(prom_root_node, "name", name, sizeof(name)); -	if (strncmp(name, "Tadpole", 7)) -		return; -	node = prom_getchild(prom_root_node); -	node = prom_searchsiblings(node, "obio"); -	node = prom_getchild(node); -	clk_nd = prom_searchsiblings(node, "clk-ctrl"); -	if (!clk_nd) -		return; -	printk("Clock Stopping h/w detected... "); -	clk_ctrl = (char *) prom_getint(clk_nd, "address"); -	clk_state = 0; -	if (name[10] == '\0') { -		cpu_pwr_save = tsu_clockstop; -		printk("enabled (S3)\n"); -	} else if ((name[10] == 'X') || (name[10] == 'G')) { -		cpu_pwr_save = swift_clockstop; -		printk("enabled (%s)\n",name+7); -	} else -		printk("disabled %s\n",name+7); -} diff --git a/arch/sparc/kernel/time_32.c b/arch/sparc/kernel/time_32.c index c4c27b0f906..5923d1e4e7c 100644 --- a/arch/sparc/kernel/time_32.c +++ b/arch/sparc/kernel/time_32.c @@ -36,6 +36,7 @@  #include <linux/of_device.h>  #include <linux/platform_device.h> +#include <asm/mc146818rtc.h>  #include <asm/oplib.h>  #include <asm/timex.h>  #include <asm/timer.h> @@ -47,6 +48,7 @@  #include <asm/irq_regs.h>  #include <asm/setup.h> +#include "kernel.h"  #include "irq.h"  static __cacheline_aligned_in_smp DEFINE_SEQLOCK(timer_cs_lock); @@ -83,7 +85,7 @@ unsigned long profile_pc(struct pt_regs *regs)  EXPORT_SYMBOL(profile_pc); -__volatile__ unsigned int *master_l10_counter; +volatile u32 __iomem *master_l10_counter;  int update_persistent_clock(struct timespec now)  { @@ -143,9 +145,9 @@ static __init void setup_timer_ce(void)  static unsigned int sbus_cycles_offset(void)  { -	unsigned int val, offset; +	u32 val, offset; -	val = *master_l10_counter; +	val = sbus_readl(master_l10_counter);  	offset = (val >> TIMER_VALUE_SHIFT) & TIMER_VALUE_MASK;  	/* Limit hit? */ diff --git a/arch/sparc/kernel/time_64.c b/arch/sparc/kernel/time_64.c index c3d82b5f54c..3fddf64c7fc 100644 --- a/arch/sparc/kernel/time_64.c +++ b/arch/sparc/kernel/time_64.c @@ -659,8 +659,7 @@ static int sparc64_cpufreq_notifier(struct notifier_block *nb, unsigned long val  		ft->clock_tick_ref = cpu_data(cpu).clock_tick;  	}  	if ((val == CPUFREQ_PRECHANGE  && freq->old < freq->new) || -	    (val == CPUFREQ_POSTCHANGE && freq->old > freq->new) || -	    (val == CPUFREQ_RESUMECHANGE)) { +	    (val == CPUFREQ_POSTCHANGE && freq->old > freq->new)) {  		cpu_data(cpu).clock_tick =  			cpufreq_scale(ft->clock_tick_ref,  				      ft->ref_freq, @@ -733,7 +732,7 @@ void __irq_entry timer_interrupt(int irq, struct pt_regs *regs)  	irq_enter();  	local_cpu_data().irq0_irqs++; -	kstat_incr_irqs_this_cpu(0, irq_to_desc(0)); +	kstat_incr_irq_this_cpu(0);  	if (unlikely(!evt->event_handler)) {  		printk(KERN_WARNING diff --git a/arch/sparc/kernel/trampoline_32.S b/arch/sparc/kernel/trampoline_32.S index 76dcbd3c988..3eed99fc698 100644 --- a/arch/sparc/kernel/trampoline_32.S +++ b/arch/sparc/kernel/trampoline_32.S @@ -5,7 +5,6 @@   * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)   */ -#include <linux/init.h>  #include <asm/head.h>  #include <asm/psr.h>  #include <asm/page.h> diff --git a/arch/sparc/kernel/trampoline_64.S b/arch/sparc/kernel/trampoline_64.S index ad4bde3bb61..737f8cbc7d5 100644 --- a/arch/sparc/kernel/trampoline_64.S +++ b/arch/sparc/kernel/trampoline_64.S @@ -4,7 +4,6 @@   * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)   */ -#include <linux/init.h>  #include <asm/head.h>  #include <asm/asi.h> diff --git a/arch/sparc/kernel/traps_32.c b/arch/sparc/kernel/traps_32.c index 662982946a8..6fd386c5232 100644 --- a/arch/sparc/kernel/traps_32.c +++ b/arch/sparc/kernel/traps_32.c @@ -44,7 +44,7 @@ static void instruction_dump(unsigned long *pc)  #define __SAVE __asm__ __volatile__("save %sp, -0x40, %sp\n\t")  #define __RESTORE __asm__ __volatile__("restore %g0, %g0, %g0\n\t") -void die_if_kernel(char *str, struct pt_regs *regs) +void __noreturn die_if_kernel(char *str, struct pt_regs *regs)  {  	static int die_counter;  	int count = 0; @@ -219,8 +219,6 @@ static unsigned long fake_fsr;  static unsigned long fake_queue[32] __attribute__ ((aligned (8)));  static unsigned long fake_depth; -extern int do_mathemu(struct pt_regs *, struct task_struct *); -  void do_fpe_trap(struct pt_regs *regs, unsigned long pc, unsigned long npc,  		 unsigned long psr)  { diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c index b3f833ab90e..fb6640ec855 100644 --- a/arch/sparc/kernel/traps_64.c +++ b/arch/sparc/kernel/traps_64.c @@ -20,6 +20,7 @@  #include <linux/ftrace.h>  #include <linux/reboot.h>  #include <linux/gfp.h> +#include <linux/context_tracking.h>  #include <asm/smp.h>  #include <asm/delay.h> @@ -42,8 +43,10 @@  #include <asm/prom.h>  #include <asm/memctrl.h>  #include <asm/cacheflush.h> +#include <asm/setup.h>  #include "entry.h" +#include "kernel.h"  #include "kstack.h"  /* When an irrecoverable trap occurs at tl > 0, the trap entry @@ -186,11 +189,12 @@ EXPORT_SYMBOL_GPL(unregister_dimm_printer);  void spitfire_insn_access_exception(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar)  { +	enum ctx_state prev_state = exception_enter();  	siginfo_t info;  	if (notify_die(DIE_TRAP, "instruction access exception", regs,  		       0, 0x8, SIGTRAP) == NOTIFY_STOP) -		return; +		goto out;  	if (regs->tstate & TSTATE_PRIV) {  		printk("spitfire_insn_access_exception: SFSR[%016lx] " @@ -207,6 +211,8 @@ void spitfire_insn_access_exception(struct pt_regs *regs, unsigned long sfsr, un  	info.si_addr = (void __user *)regs->tpc;  	info.si_trapno = 0;  	force_sig_info(SIGSEGV, &info, current); +out: +	exception_exit(prev_state);  }  void spitfire_insn_access_exception_tl1(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar) @@ -260,11 +266,12 @@ void sun4v_insn_access_exception_tl1(struct pt_regs *regs, unsigned long addr, u  void spitfire_data_access_exception(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar)  { +	enum ctx_state prev_state = exception_enter();  	siginfo_t info;  	if (notify_die(DIE_TRAP, "data access exception", regs,  		       0, 0x30, SIGTRAP) == NOTIFY_STOP) -		return; +		goto out;  	if (regs->tstate & TSTATE_PRIV) {  		/* Test if this comes from uaccess places. */ @@ -280,7 +287,7 @@ void spitfire_data_access_exception(struct pt_regs *regs, unsigned long sfsr, un  #endif  			regs->tpc = entry->fixup;  			regs->tnpc = regs->tpc + 4; -			return; +			goto out;  		}  		/* Shit... */  		printk("spitfire_data_access_exception: SFSR[%016lx] " @@ -294,6 +301,8 @@ void spitfire_data_access_exception(struct pt_regs *regs, unsigned long sfsr, un  	info.si_addr = (void __user *)sfar;  	info.si_trapno = 0;  	force_sig_info(SIGSEGV, &info, current); +out: +	exception_exit(prev_state);  }  void spitfire_data_access_exception_tl1(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar) @@ -1994,6 +2003,7 @@ static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent,   */  void sun4v_resum_error(struct pt_regs *regs, unsigned long offset)  { +	enum ctx_state prev_state = exception_enter();  	struct sun4v_error_entry *ent, local_copy;  	struct trap_per_cpu *tb;  	unsigned long paddr; @@ -2022,12 +2032,14 @@ void sun4v_resum_error(struct pt_regs *regs, unsigned long offset)  		pr_info("Shutdown request, %u seconds...\n",  			local_copy.err_secs);  		orderly_poweroff(true); -		return; +		goto out;  	}  	sun4v_log_error(regs, &local_copy, cpu,  			KERN_ERR "RESUMABLE ERROR",  			&sun4v_resum_oflow_cnt); +out: +	exception_exit(prev_state);  }  /* If we try to printk() we'll probably make matters worse, by trying @@ -2152,7 +2164,7 @@ void hypervisor_tlbop_error_xcall(unsigned long err, unsigned long op)  	       err, op);  } -void do_fpe_common(struct pt_regs *regs) +static void do_fpe_common(struct pt_regs *regs)  {  	if (regs->tstate & TSTATE_PRIV) {  		regs->tpc = regs->tnpc; @@ -2188,23 +2200,26 @@ void do_fpe_common(struct pt_regs *regs)  void do_fpieee(struct pt_regs *regs)  { +	enum ctx_state prev_state = exception_enter(); +  	if (notify_die(DIE_TRAP, "fpu exception ieee", regs,  		       0, 0x24, SIGFPE) == NOTIFY_STOP) -		return; +		goto out;  	do_fpe_common(regs); +out: +	exception_exit(prev_state);  } -extern int do_mathemu(struct pt_regs *, struct fpustate *, bool); -  void do_fpother(struct pt_regs *regs)  { +	enum ctx_state prev_state = exception_enter();  	struct fpustate *f = FPUSTATE;  	int ret = 0;  	if (notify_die(DIE_TRAP, "fpu exception other", regs,  		       0, 0x25, SIGFPE) == NOTIFY_STOP) -		return; +		goto out;  	switch ((current_thread_info()->xfsr[0] & 0x1c000)) {  	case (2 << 14): /* unfinished_FPop */ @@ -2213,17 +2228,20 @@ void do_fpother(struct pt_regs *regs)  		break;  	}  	if (ret) -		return; +		goto out;  	do_fpe_common(regs); +out: +	exception_exit(prev_state);  }  void do_tof(struct pt_regs *regs)  { +	enum ctx_state prev_state = exception_enter();  	siginfo_t info;  	if (notify_die(DIE_TRAP, "tagged arithmetic overflow", regs,  		       0, 0x26, SIGEMT) == NOTIFY_STOP) -		return; +		goto out;  	if (regs->tstate & TSTATE_PRIV)  		die_if_kernel("Penguin overflow trap from kernel mode", regs); @@ -2237,15 +2255,18 @@ void do_tof(struct pt_regs *regs)  	info.si_addr = (void __user *)regs->tpc;  	info.si_trapno = 0;  	force_sig_info(SIGEMT, &info, current); +out: +	exception_exit(prev_state);  }  void do_div0(struct pt_regs *regs)  { +	enum ctx_state prev_state = exception_enter();  	siginfo_t info;  	if (notify_die(DIE_TRAP, "integer division by zero", regs,  		       0, 0x28, SIGFPE) == NOTIFY_STOP) -		return; +		goto out;  	if (regs->tstate & TSTATE_PRIV)  		die_if_kernel("TL0: Kernel divide by zero.", regs); @@ -2259,6 +2280,8 @@ void do_div0(struct pt_regs *regs)  	info.si_addr = (void __user *)regs->tpc;  	info.si_trapno = 0;  	force_sig_info(SIGFPE, &info, current); +out: +	exception_exit(prev_state);  }  static void instruction_dump(unsigned int *pc) @@ -2360,7 +2383,7 @@ static inline struct reg_window *kernel_stack_up(struct reg_window *rw)  	return (struct reg_window *) (fp + STACK_BIAS);  } -void die_if_kernel(char *str, struct pt_regs *regs) +void __noreturn die_if_kernel(char *str, struct pt_regs *regs)  {  	static int die_counter;  	int count = 0; @@ -2410,11 +2433,9 @@ EXPORT_SYMBOL(die_if_kernel);  #define VIS_OPCODE_MASK	((0x3 << 30) | (0x3f << 19))  #define VIS_OPCODE_VAL	((0x2 << 30) | (0x36 << 19)) -extern int handle_popc(u32 insn, struct pt_regs *regs); -extern int handle_ldf_stq(u32 insn, struct pt_regs *regs); -  void do_illegal_instruction(struct pt_regs *regs)  { +	enum ctx_state prev_state = exception_enter();  	unsigned long pc = regs->tpc;  	unsigned long tstate = regs->tstate;  	u32 insn; @@ -2422,7 +2443,7 @@ void do_illegal_instruction(struct pt_regs *regs)  	if (notify_die(DIE_TRAP, "illegal instruction", regs,  		       0, 0x10, SIGILL) == NOTIFY_STOP) -		return; +		goto out;  	if (tstate & TSTATE_PRIV)  		die_if_kernel("Kernel illegal instruction", regs); @@ -2431,14 +2452,14 @@ void do_illegal_instruction(struct pt_regs *regs)  	if (get_user(insn, (u32 __user *) pc) != -EFAULT) {  		if ((insn & 0xc1ffc000) == 0x81700000) /* POPC */ {  			if (handle_popc(insn, regs)) -				return; +				goto out;  		} else if ((insn & 0xc1580000) == 0xc1100000) /* LDQ/STQ */ {  			if (handle_ldf_stq(insn, regs)) -				return; +				goto out;  		} else if (tlb_type == hypervisor) {  			if ((insn & VIS_OPCODE_MASK) == VIS_OPCODE_VAL) {  				if (!vis_emul(regs, insn)) -					return; +					goto out;  			} else {  				struct fpustate *f = FPUSTATE; @@ -2448,7 +2469,7 @@ void do_illegal_instruction(struct pt_regs *regs)  				 * Trap in the %fsr to unimplemented_FPop.  				 */  				if (do_mathemu(regs, f, true)) -					return; +					goto out;  			}  		}  	} @@ -2458,21 +2479,22 @@ void do_illegal_instruction(struct pt_regs *regs)  	info.si_addr = (void __user *)pc;  	info.si_trapno = 0;  	force_sig_info(SIGILL, &info, current); +out: +	exception_exit(prev_state);  } -extern void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn); -  void mem_address_unaligned(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr)  { +	enum ctx_state prev_state = exception_enter();  	siginfo_t info;  	if (notify_die(DIE_TRAP, "memory address unaligned", regs,  		       0, 0x34, SIGSEGV) == NOTIFY_STOP) -		return; +		goto out;  	if (regs->tstate & TSTATE_PRIV) {  		kernel_unaligned_trap(regs, *((unsigned int *)regs->tpc)); -		return; +		goto out;  	}  	info.si_signo = SIGBUS;  	info.si_errno = 0; @@ -2480,6 +2502,8 @@ void mem_address_unaligned(struct pt_regs *regs, unsigned long sfar, unsigned lo  	info.si_addr = (void __user *)sfar;  	info.si_trapno = 0;  	force_sig_info(SIGBUS, &info, current); +out: +	exception_exit(prev_state);  }  void sun4v_do_mna(struct pt_regs *regs, unsigned long addr, unsigned long type_ctx) @@ -2504,11 +2528,12 @@ void sun4v_do_mna(struct pt_regs *regs, unsigned long addr, unsigned long type_c  void do_privop(struct pt_regs *regs)  { +	enum ctx_state prev_state = exception_enter();  	siginfo_t info;  	if (notify_die(DIE_TRAP, "privileged operation", regs,  		       0, 0x11, SIGILL) == NOTIFY_STOP) -		return; +		goto out;  	if (test_thread_flag(TIF_32BIT)) {  		regs->tpc &= 0xffffffff; @@ -2520,6 +2545,8 @@ void do_privop(struct pt_regs *regs)  	info.si_addr = (void __user *)regs->tpc;  	info.si_trapno = 0;  	force_sig_info(SIGILL, &info, current); +out: +	exception_exit(prev_state);  }  void do_privact(struct pt_regs *regs) @@ -2530,99 +2557,116 @@ void do_privact(struct pt_regs *regs)  /* Trap level 1 stuff or other traps we should never see... */  void do_cee(struct pt_regs *regs)  { +	exception_enter();  	die_if_kernel("TL0: Cache Error Exception", regs);  }  void do_cee_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: Cache Error Exception", regs);  }  void do_dae_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: Data Access Exception", regs);  }  void do_iae_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: Instruction Access Exception", regs);  }  void do_div0_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: DIV0 Exception", regs);  }  void do_fpdis_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: FPU Disabled", regs);  }  void do_fpieee_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: FPU IEEE Exception", regs);  }  void do_fpother_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: FPU Other Exception", regs);  }  void do_ill_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: Illegal Instruction Exception", regs);  }  void do_irq_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: IRQ Exception", regs);  }  void do_lddfmna_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: LDDF Exception", regs);  }  void do_stdfmna_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: STDF Exception", regs);  }  void do_paw(struct pt_regs *regs)  { +	exception_enter();  	die_if_kernel("TL0: Phys Watchpoint Exception", regs);  }  void do_paw_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: Phys Watchpoint Exception", regs);  }  void do_vaw(struct pt_regs *regs)  { +	exception_enter();  	die_if_kernel("TL0: Virt Watchpoint Exception", regs);  }  void do_vaw_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: Virt Watchpoint Exception", regs);  }  void do_tof_tl1(struct pt_regs *regs)  { +	exception_enter();  	dump_tl1_traplog((struct tl1_traplog *)(regs + 1));  	die_if_kernel("TL1: Tag Overflow Exception", regs);  } diff --git a/arch/sparc/kernel/tsb.S b/arch/sparc/kernel/tsb.S index a313e4a9399..14158d40ba7 100644 --- a/arch/sparc/kernel/tsb.S +++ b/arch/sparc/kernel/tsb.S @@ -75,7 +75,7 @@ tsb_miss_page_table_walk:  	mov		512, %g7  	andn		%g5, 0x7, %g5  	sllx		%g7, %g6, %g7 -	srlx		%g4, HPAGE_SHIFT, %g6 +	srlx		%g4, REAL_HPAGE_SHIFT, %g6  	sub		%g7, 1, %g7  	and		%g6, %g7, %g6  	sllx		%g6, 4, %g6 diff --git a/arch/sparc/kernel/unaligned_32.c b/arch/sparc/kernel/unaligned_32.c index c0ec8978619..c5c61b3c6b5 100644 --- a/arch/sparc/kernel/unaligned_32.c +++ b/arch/sparc/kernel/unaligned_32.c @@ -16,6 +16,10 @@  #include <linux/smp.h>  #include <linux/perf_event.h> +#include <asm/setup.h> + +#include "kernel.h" +  enum direction {  	load,    /* ld, ldd, ldh, ldsh */  	store,   /* st, std, sth, stsh */ diff --git a/arch/sparc/kernel/unaligned_64.c b/arch/sparc/kernel/unaligned_64.c index 8201c25e766..62098a89bbb 100644 --- a/arch/sparc/kernel/unaligned_64.c +++ b/arch/sparc/kernel/unaligned_64.c @@ -21,8 +21,13 @@  #include <linux/bitops.h>  #include <linux/perf_event.h>  #include <linux/ratelimit.h> +#include <linux/context_tracking.h>  #include <asm/fpumacro.h>  #include <asm/cacheflush.h> +#include <asm/setup.h> + +#include "entry.h" +#include "kernel.h"  enum direction {  	load,    /* ld, ldd, ldh, ldsh */ @@ -163,17 +168,23 @@ static unsigned long *fetch_reg_addr(unsigned int reg, struct pt_regs *regs)  unsigned long compute_effective_address(struct pt_regs *regs,  					unsigned int insn, unsigned int rd)  { +	int from_kernel = (regs->tstate & TSTATE_PRIV) != 0;  	unsigned int rs1 = (insn >> 14) & 0x1f;  	unsigned int rs2 = insn & 0x1f; -	int from_kernel = (regs->tstate & TSTATE_PRIV) != 0; +	unsigned long addr;  	if (insn & 0x2000) {  		maybe_flush_windows(rs1, 0, rd, from_kernel); -		return (fetch_reg(rs1, regs) + sign_extend_imm13(insn)); +		addr = (fetch_reg(rs1, regs) + sign_extend_imm13(insn));  	} else {  		maybe_flush_windows(rs1, rs2, rd, from_kernel); -		return (fetch_reg(rs1, regs) + fetch_reg(rs2, regs)); +		addr = (fetch_reg(rs1, regs) + fetch_reg(rs2, regs));  	} + +	if (!from_kernel && test_thread_flag(TIF_32BIT)) +		addr &= 0xffffffff; + +	return addr;  }  /* This is just to make gcc think die_if_kernel does return... */ @@ -418,9 +429,6 @@ int handle_popc(u32 insn, struct pt_regs *regs)  extern void do_fpother(struct pt_regs *regs);  extern void do_privact(struct pt_regs *regs); -extern void spitfire_data_access_exception(struct pt_regs *regs, -					   unsigned long sfsr, -					   unsigned long sfar);  extern void sun4v_data_access_exception(struct pt_regs *regs,  					unsigned long addr,  					unsigned long type_ctx); @@ -578,6 +586,7 @@ void handle_ld_nf(u32 insn, struct pt_regs *regs)  void handle_lddfmna(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr)  { +	enum ctx_state prev_state = exception_enter();  	unsigned long pc = regs->tpc;  	unsigned long tstate = regs->tstate;  	u32 insn; @@ -632,13 +641,16 @@ daex:  			sun4v_data_access_exception(regs, sfar, sfsr);  		else  			spitfire_data_access_exception(regs, sfsr, sfar); -		return; +		goto out;  	}  	advance(regs); +out: +	exception_exit(prev_state);  }  void handle_stdfmna(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr)  { +	enum ctx_state prev_state = exception_enter();  	unsigned long pc = regs->tpc;  	unsigned long tstate = regs->tstate;  	u32 insn; @@ -680,7 +692,9 @@ daex:  			sun4v_data_access_exception(regs, sfar, sfsr);  		else  			spitfire_data_access_exception(regs, sfsr, sfar); -		return; +		goto out;  	}  	advance(regs); +out: +	exception_exit(prev_state);  } diff --git a/arch/sparc/kernel/vmlinux.lds.S b/arch/sparc/kernel/vmlinux.lds.S index 0bacceb1915..932ff90fd76 100644 --- a/arch/sparc/kernel/vmlinux.lds.S +++ b/arch/sparc/kernel/vmlinux.lds.S @@ -122,6 +122,11 @@ SECTIONS  		*(.swapper_4m_tsb_phys_patch)  		__swapper_4m_tsb_phys_patch_end = .;  	} +	.page_offset_shift_patch : { +		__page_offset_shift_patch = .; +		*(.page_offset_shift_patch) +		__page_offset_shift_patch_end = .; +	}  	.popc_3insn_patch : {  		__popc_3insn_patch = .;  		*(.popc_3insn_patch) diff --git a/arch/sparc/kernel/windows.c b/arch/sparc/kernel/windows.c index 3107381e576..87bab0a3857 100644 --- a/arch/sparc/kernel/windows.c +++ b/arch/sparc/kernel/windows.c @@ -10,8 +10,11 @@  #include <linux/mm.h>  #include <linux/smp.h> +#include <asm/cacheflush.h>  #include <asm/uaccess.h> +#include "kernel.h" +  /* Do save's until all user register windows are out of the cpu. */  void flush_user_windows(void)  { diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile index dbe119b63b4..3269b023409 100644 --- a/arch/sparc/lib/Makefile +++ b/arch/sparc/lib/Makefile @@ -41,7 +41,7 @@ lib-$(CONFIG_SPARC64) += GENpatch.o GENpage.o GENbzero.o  lib-$(CONFIG_SPARC64) += copy_in_user.o user_fixup.o memmove.o  lib-$(CONFIG_SPARC64) += mcount.o ipcsum.o xor.o hweight.o ffs.o -obj-y                 += iomap.o +obj-$(CONFIG_SPARC64) += iomap.o  obj-$(CONFIG_SPARC32) += atomic32.o ucmpdi2.o  obj-y                 += ksyms.o  obj-$(CONFIG_SPARC64) += PeeCeeI.o diff --git a/arch/sparc/lib/NG2memcpy.S b/arch/sparc/lib/NG2memcpy.S index 2c20ad63ddb..30eee6e8a81 100644 --- a/arch/sparc/lib/NG2memcpy.S +++ b/arch/sparc/lib/NG2memcpy.S @@ -236,6 +236,7 @@ FUNC_NAME:	/* %o0=dst, %o1=src, %o2=len */  	 */  	VISEntryHalf +	membar		#Sync  	alignaddr	%o1, %g0, %g0  	add		%o1, (64 - 1), %o4 diff --git a/arch/sparc/lib/clear_page.S b/arch/sparc/lib/clear_page.S index 77e531f6c2a..46272dfc26e 100644 --- a/arch/sparc/lib/clear_page.S +++ b/arch/sparc/lib/clear_page.S @@ -37,10 +37,10 @@ _clear_page:		/* %o0=dest */  	.globl		clear_user_page  clear_user_page:	/* %o0=dest, %o1=vaddr */  	lduw		[%g6 + TI_PRE_COUNT], %o2 -	sethi		%uhi(PAGE_OFFSET), %g2 +	sethi		%hi(PAGE_OFFSET), %g2  	sethi		%hi(PAGE_SIZE), %o4 -	sllx		%g2, 32, %g2 +	ldx		[%g2 + %lo(PAGE_OFFSET)], %g2  	sethi		%hi(PAGE_KERNEL_LOCKED), %g3  	ldx		[%g3 + %lo(PAGE_KERNEL_LOCKED)], %g3 diff --git a/arch/sparc/lib/copy_page.S b/arch/sparc/lib/copy_page.S index 4d2df328e51..dd16c61f326 100644 --- a/arch/sparc/lib/copy_page.S +++ b/arch/sparc/lib/copy_page.S @@ -46,10 +46,10 @@  	.type		copy_user_page,#function  copy_user_page:		/* %o0=dest, %o1=src, %o2=vaddr */  	lduw		[%g6 + TI_PRE_COUNT], %o4 -	sethi		%uhi(PAGE_OFFSET), %g2 +	sethi		%hi(PAGE_OFFSET), %g2  	sethi		%hi(PAGE_SIZE), %o3 -	sllx		%g2, 32, %g2 +	ldx		[%g2 + %lo(PAGE_OFFSET)], %g2  	sethi		%hi(PAGE_KERNEL_LOCKED), %g3  	ldx		[%g3 + %lo(PAGE_KERNEL_LOCKED)], %g3 diff --git a/arch/sparc/math-emu/sfp-util_32.h b/arch/sparc/math-emu/sfp-util_32.h index d1b2aff3c25..bb587d5f3d9 100644 --- a/arch/sparc/math-emu/sfp-util_32.h +++ b/arch/sparc/math-emu/sfp-util_32.h @@ -4,20 +4,20 @@  #include <asm/byteorder.h>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) 				\ -  __asm__ ("addcc %r4,%5,%1\n\t"						\ +  __asm__ ("addcc %r4,%5,%1\n\t"					\  	   "addx %r2,%3,%0\n"						\ -	   : "=r" ((USItype)(sh)),					\ -	     "=&r" ((USItype)(sl))					\ +	   : "=r" (sh),							\ +	     "=&r" (sl)							\  	   : "%rJ" ((USItype)(ah)),					\  	     "rI" ((USItype)(bh)),					\  	     "%rJ" ((USItype)(al)),					\  	     "rI" ((USItype)(bl))					\  	   : "cc")  #define sub_ddmmss(sh, sl, ah, al, bh, bl) 				\ -  __asm__ ("subcc %r4,%5,%1\n\t"						\ +  __asm__ ("subcc %r4,%5,%1\n\t"					\  	   "subx %r2,%3,%0\n"						\ -	   : "=r" ((USItype)(sh)),					\ -	     "=&r" ((USItype)(sl))					\ +	   : "=r" (sh),							\ +	     "=&r" (sl)							\  	   : "rJ" ((USItype)(ah)),					\  	     "rI" ((USItype)(bh)),					\  	     "rJ" ((USItype)(al)),					\ @@ -65,8 +65,8 @@  	"mulscc	%%g1,0,%%g1\n\t" 					\  	"add	%%g1,%%g2,%0\n\t" 					\  	"rd	%%y,%1\n"						\ -	   : "=r" ((USItype)(w1)),					\ -	     "=r" ((USItype)(w0))					\ +	   : "=r" (w1),							\ +	     "=r" (w0)							\  	   : "%rI" ((USItype)(u)),					\  	     "r" ((USItype)(v))						\  	   : "%g1", "%g2", "cc") @@ -98,8 +98,8 @@  	   "sub	%1,%2,%1\n\t"						\  	   "3:	xnor	%0,0,%0\n\t"					\  	   "! End of inline udiv_qrnnd\n"				\ -	   : "=&r" ((USItype)(q)),					\ -	     "=&r" ((USItype)(r))					\ +	   : "=&r" (q),							\ +	     "=&r" (r)							\  	   : "r" ((USItype)(d)),					\  	     "1" ((USItype)(n1)),					\  	     "0" ((USItype)(n0)) : "%g1", "cc") diff --git a/arch/sparc/math-emu/sfp-util_64.h b/arch/sparc/math-emu/sfp-util_64.h index 425d3cf01af..51320a861cc 100644 --- a/arch/sparc/math-emu/sfp-util_64.h +++ b/arch/sparc/math-emu/sfp-util_64.h @@ -17,8 +17,8 @@    	   "bcs,a,pn %%xcc, 1f\n\t"		\    	   "add %0, 1, %0\n"			\    	   "1:"					\ -	   : "=r" ((UDItype)(sh)),		\ -	     "=&r" ((UDItype)(sl))		\ +	   : "=r" (sh),				\ +	     "=&r" (sl)				\  	   : "r" ((UDItype)(ah)),		\  	     "r" ((UDItype)(bh)),		\  	     "r" ((UDItype)(al)),		\ @@ -31,8 +31,8 @@    	   "bcs,a,pn %%xcc, 1f\n\t"		\    	   "sub %0, 1, %0\n"			\    	   "1:"					\ -	   : "=r" ((UDItype)(sh)),		\ -	     "=&r" ((UDItype)(sl))		\ +	   : "=r" (sh),				\ +	     "=&r" (sl)				\  	   : "r" ((UDItype)(ah)),		\  	     "r" ((UDItype)(bh)),		\  	     "r" ((UDItype)(al)),		\ @@ -64,8 +64,8 @@  		   "sllx %3,32,%3\n\t"			\  		   "add %1,%3,%1\n\t"			\  		   "add %5,%2,%0"			\ -	   : "=r" ((UDItype)(wh)),			\ -	     "=&r" ((UDItype)(wl)),			\ +	   : "=r" (wh),					\ +	     "=&r" (wl),				\  	     "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4) \  	   : "r" ((UDItype)(u)),			\  	     "r" ((UDItype)(v))				\ diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c index 59dbd464572..908e8c17c90 100644 --- a/arch/sparc/mm/fault_32.c +++ b/arch/sparc/mm/fault_32.c @@ -26,14 +26,14 @@  #include <asm/pgtable.h>  #include <asm/openprom.h>  #include <asm/oplib.h> +#include <asm/setup.h>  #include <asm/smp.h>  #include <asm/traps.h>  #include <asm/uaccess.h> -int show_unhandled_signals = 1; +#include "mm_32.h" -static void unhandled_fault(unsigned long, struct task_struct *, -		struct pt_regs *) __attribute__ ((noreturn)); +int show_unhandled_signals = 1;  static void __noreturn unhandled_fault(unsigned long address,  				       struct task_struct *tsk, @@ -141,9 +141,6 @@ static void __do_fault_siginfo(int code, int sig, struct pt_regs *regs,  	force_sig_info (sig, &info, current);  } -extern unsigned long safe_compute_effective_address(struct pt_regs *, -						    unsigned int); -  static unsigned long compute_si_addr(struct pt_regs *regs, int text_fault)  {  	unsigned int insn; diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c index 2ebec263d68..587cd056512 100644 --- a/arch/sparc/mm/fault_64.c +++ b/arch/sparc/mm/fault_64.c @@ -21,6 +21,7 @@  #include <linux/kprobes.h>  #include <linux/kdebug.h>  #include <linux/percpu.h> +#include <linux/context_tracking.h>  #include <asm/page.h>  #include <asm/pgtable.h> @@ -31,6 +32,7 @@  #include <asm/lsu.h>  #include <asm/sections.h>  #include <asm/mmu_context.h> +#include <asm/setup.h>  int show_unhandled_signals = 1; @@ -95,38 +97,51 @@ static unsigned int get_user_insn(unsigned long tpc)  	pte_t *ptep, pte;  	unsigned long pa;  	u32 insn = 0; -	unsigned long pstate; -	if (pgd_none(*pgdp)) -		goto outret; +	if (pgd_none(*pgdp) || unlikely(pgd_bad(*pgdp))) +		goto out;  	pudp = pud_offset(pgdp, tpc); -	if (pud_none(*pudp)) -		goto outret; -	pmdp = pmd_offset(pudp, tpc); -	if (pmd_none(*pmdp)) -		goto outret; +	if (pud_none(*pudp) || unlikely(pud_bad(*pudp))) +		goto out;  	/* This disables preemption for us as well. */ -	__asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate)); -	__asm__ __volatile__("wrpr %0, %1, %%pstate" -				: : "r" (pstate), "i" (PSTATE_IE)); -	ptep = pte_offset_map(pmdp, tpc); -	pte = *ptep; -	if (!pte_present(pte)) -		goto out; +	local_irq_disable(); -	pa  = (pte_pfn(pte) << PAGE_SHIFT); -	pa += (tpc & ~PAGE_MASK); +	pmdp = pmd_offset(pudp, tpc); +	if (pmd_none(*pmdp) || unlikely(pmd_bad(*pmdp))) +		goto out_irq_enable; + +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +	if (pmd_trans_huge(*pmdp)) { +		if (pmd_trans_splitting(*pmdp)) +			goto out_irq_enable; -	/* Use phys bypass so we don't pollute dtlb/dcache. */ -	__asm__ __volatile__("lduwa [%1] %2, %0" -			     : "=r" (insn) -			     : "r" (pa), "i" (ASI_PHYS_USE_EC)); +		pa  = pmd_pfn(*pmdp) << PAGE_SHIFT; +		pa += tpc & ~HPAGE_MASK; +		/* Use phys bypass so we don't pollute dtlb/dcache. */ +		__asm__ __volatile__("lduwa [%1] %2, %0" +				     : "=r" (insn) +				     : "r" (pa), "i" (ASI_PHYS_USE_EC)); +	} else +#endif +	{ +		ptep = pte_offset_map(pmdp, tpc); +		pte = *ptep; +		if (pte_present(pte)) { +			pa  = (pte_pfn(pte) << PAGE_SHIFT); +			pa += (tpc & ~PAGE_MASK); + +			/* Use phys bypass so we don't pollute dtlb/dcache. */ +			__asm__ __volatile__("lduwa [%1] %2, %0" +					     : "=r" (insn) +					     : "r" (pa), "i" (ASI_PHYS_USE_EC)); +		} +		pte_unmap(ptep); +	} +out_irq_enable: +	local_irq_enable();  out: -	pte_unmap(ptep); -	__asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate)); -outret:  	return insn;  } @@ -152,7 +167,8 @@ show_signal_msg(struct pt_regs *regs, int sig, int code,  }  static void do_fault_siginfo(int code, int sig, struct pt_regs *regs, -			     unsigned int insn, int fault_code) +			     unsigned long fault_addr, unsigned int insn, +			     int fault_code)  {  	unsigned long addr;  	siginfo_t info; @@ -160,10 +176,18 @@ static void do_fault_siginfo(int code, int sig, struct pt_regs *regs,  	info.si_code = code;  	info.si_signo = sig;  	info.si_errno = 0; -	if (fault_code & FAULT_CODE_ITLB) +	if (fault_code & FAULT_CODE_ITLB) {  		addr = regs->tpc; -	else -		addr = compute_effective_address(regs, insn, 0); +	} else { +		/* If we were able to probe the faulting instruction, use it +		 * to compute a precise fault address.  Otherwise use the fault +		 * time provided address which may only have page granularity. +		 */ +		if (insn) +			addr = compute_effective_address(regs, insn, 0); +		else +			addr = fault_addr; +	}  	info.si_addr = (void __user *) addr;  	info.si_trapno = 0; @@ -173,9 +197,6 @@ static void do_fault_siginfo(int code, int sig, struct pt_regs *regs,  	force_sig_info(sig, &info, current);  } -extern int handle_ldf_stq(u32, struct pt_regs *); -extern int handle_ld_nf(u32, struct pt_regs *); -  static unsigned int get_fault_insn(struct pt_regs *regs, unsigned int insn)  {  	if (!insn) { @@ -238,7 +259,7 @@ static void __kprobes do_kernel_fault(struct pt_regs *regs, int si_code,  		/* The si_code was set to make clear whether  		 * this was a SEGV_MAPERR or SEGV_ACCERR fault.  		 */ -		do_fault_siginfo(si_code, SIGSEGV, regs, insn, fault_code); +		do_fault_siginfo(si_code, SIGSEGV, regs, address, insn, fault_code);  		return;  	} @@ -258,20 +279,9 @@ static void noinline __kprobes bogus_32bit_fault_tpc(struct pt_regs *regs)  	show_regs(regs);  } -static void noinline __kprobes bogus_32bit_fault_address(struct pt_regs *regs, -							 unsigned long addr) -{ -	static int times; - -	if (times++ < 10) -		printk(KERN_ERR "FAULT[%s:%d]: 32-bit process " -		       "reports 64-bit fault address [%lx]\n", -		       current->comm, current->pid, addr); -	show_regs(regs); -} -  asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)  { +	enum ctx_state prev_state = exception_enter();  	struct mm_struct *mm = current->mm;  	struct vm_area_struct *vma;  	unsigned int insn = 0; @@ -282,7 +292,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)  	fault_code = get_thread_fault_code();  	if (notify_page_fault(regs)) -		return; +		goto exit_exception;  	si_code = SEGV_MAPERR;  	address = current_thread_info()->fault_address; @@ -298,10 +308,8 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)  				goto intr_or_no_mm;  			}  		} -		if (unlikely((address >> 32) != 0)) { -			bogus_32bit_fault_address(regs, address); +		if (unlikely((address >> 32) != 0))  			goto intr_or_no_mm; -		}  	}  	if (regs->tstate & TSTATE_PRIV) { @@ -313,7 +321,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)  			/* Valid, no problems... */  		} else {  			bad_kernel_pc(regs, address); -			return; +			goto exit_exception;  		}  	} else  		flags |= FAULT_FLAG_USER; @@ -430,7 +438,7 @@ good_area:  	fault = handle_mm_fault(mm, vma, address, flags);  	if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) -		return; +		goto exit_exception;  	if (unlikely(fault & VM_FAULT_ERROR)) {  		if (fault & VM_FAULT_OOM) @@ -482,6 +490,8 @@ good_area:  	}  #endif +exit_exception: +	exception_exit(prev_state);  	return;  	/* @@ -494,7 +504,7 @@ bad_area:  handle_kernel_fault:  	do_kernel_fault(regs, si_code, fault_code, insn, address); -	return; +	goto exit_exception;  /*   * We ran out of memory, or some other thing happened to us that made @@ -505,7 +515,7 @@ out_of_memory:  	up_read(&mm->mmap_sem);  	if (!(regs->tstate & TSTATE_PRIV)) {  		pagefault_out_of_memory(); -		return; +		goto exit_exception;  	}  	goto handle_kernel_fault; @@ -521,7 +531,7 @@ do_sigbus:  	 * Send a sigbus, regardless of whether we were in kernel  	 * or user mode.  	 */ -	do_fault_siginfo(BUS_ADRERR, SIGBUS, regs, insn, fault_code); +	do_fault_siginfo(BUS_ADRERR, SIGBUS, regs, address, insn, fault_code);  	/* Kernel mode? Handle exceptions or die */  	if (regs->tstate & TSTATE_PRIV) diff --git a/arch/sparc/mm/gup.c b/arch/sparc/mm/gup.c index 01ee23dd724..1aed0432c64 100644 --- a/arch/sparc/mm/gup.c +++ b/arch/sparc/mm/gup.c @@ -71,13 +71,12 @@ static int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr,  			int *nr)  {  	struct page *head, *page, *tail; -	u32 mask;  	int refs; -	mask = PMD_HUGE_PRESENT; -	if (write) -		mask |= PMD_HUGE_WRITE; -	if ((pmd_val(pmd) & mask) != mask) +	if (!(pmd_val(pmd) & _PAGE_VALID)) +		return 0; + +	if (write && !pmd_write(pmd))  		return 0;  	refs = 0; diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c index 96399646570..d329537739c 100644 --- a/arch/sparc/mm/hugetlbpage.c +++ b/arch/sparc/mm/hugetlbpage.c @@ -4,7 +4,6 @@   * Copyright (C) 2002, 2003, 2006 David S. Miller (davem@davemloft.net)   */ -#include <linux/init.h>  #include <linux/fs.h>  #include <linux/mm.h>  #include <linux/hugetlb.h> @@ -21,8 +20,6 @@  /* Slightly simplified from the non-hugepage variant because by   * definition we don't have to worry about any page coloring stuff   */ -#define VA_EXCLUDE_START (0x0000080000000000UL - (1UL << 32UL)) -#define VA_EXCLUDE_END   (0xfffff80000000000UL + (1UL << 32UL))  static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *filp,  							unsigned long addr, @@ -234,11 +231,6 @@ int pud_huge(pud_t pud)  	return 0;  } -int pmd_huge_support(void) -{ -	return 0; -} -  struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,  			     pmd_t *pmd, int write)  { diff --git a/arch/sparc/mm/init_32.c b/arch/sparc/mm/init_32.c index db698708280..eb828715527 100644 --- a/arch/sparc/mm/init_32.c +++ b/arch/sparc/mm/init_32.c @@ -31,10 +31,13 @@  #include <asm/pgtable.h>  #include <asm/vaddrs.h>  #include <asm/pgalloc.h>	/* bug in asm-generic/tlb.h: check_pgt_cache */ +#include <asm/setup.h>  #include <asm/tlb.h>  #include <asm/prom.h>  #include <asm/leon.h> +#include "mm_32.h" +  unsigned long *sparc_valid_addr_bitmap;  EXPORT_SYMBOL(sparc_valid_addr_bitmap); @@ -63,7 +66,6 @@ void show_mem(unsigned int filter)  } -extern unsigned long cmdline_memory_size;  unsigned long last_valid_pfn;  unsigned long calc_highpages(void) @@ -246,9 +248,6 @@ unsigned long __init bootmem_init(unsigned long *pages_avail)   * init routine based upon the Sun model type on the Sparc.   *   */ -extern void srmmu_paging_init(void); -extern void device_scan(void); -  void __init paging_init(void)  {  	srmmu_paging_init(); diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index ed82edad1a3..16b58ff11e6 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c @@ -47,6 +47,7 @@  #include <asm/prom.h>  #include <asm/mdesc.h>  #include <asm/cpudata.h> +#include <asm/setup.h>  #include <asm/irq.h>  #include "init_64.h" @@ -354,7 +355,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t *  #if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)  	if (mm->context.huge_pte_count && is_hugetlb_pte(pte)) -		__update_mmu_tsb_insert(mm, MM_TSB_HUGE, HPAGE_SHIFT, +		__update_mmu_tsb_insert(mm, MM_TSB_HUGE, REAL_HPAGE_SHIFT,  					address, pte_val(pte));  	else  #endif @@ -588,7 +589,7 @@ static void __init remap_kernel(void)  	int i, tlb_ent = sparc64_highest_locked_tlbent();  	tte_vaddr = (unsigned long) KERNBASE; -	phys_page = (prom_boot_mapping_phys_low >> 22UL) << 22UL; +	phys_page = (prom_boot_mapping_phys_low >> ILOG2_4MB) << ILOG2_4MB;  	tte_data = kern_large_tte(phys_page);  	kern_locked_tte_data = tte_data; @@ -794,11 +795,11 @@ struct node_mem_mask {  static struct node_mem_mask node_masks[MAX_NUMNODES];  static int num_node_masks; +#ifdef CONFIG_NEED_MULTIPLE_NODES +  int numa_cpu_lookup_table[NR_CPUS];  cpumask_t numa_cpumask_lookup_table[MAX_NUMNODES]; -#ifdef CONFIG_NEED_MULTIPLE_NODES -  struct mdesc_mblock {  	u64	base;  	u64	size; @@ -887,17 +888,21 @@ static void __init allocate_node_data(int nid)  static void init_node_masks_nonnuma(void)  { +#ifdef CONFIG_NEED_MULTIPLE_NODES  	int i; +#endif  	numadbg("Initializing tables for non-numa.\n");  	node_masks[0].mask = node_masks[0].val = 0;  	num_node_masks = 1; +#ifdef CONFIG_NEED_MULTIPLE_NODES  	for (i = 0; i < NR_CPUS; i++)  		numa_cpu_lookup_table[i] = 0;  	cpumask_setall(&numa_cpumask_lookup_table[0]); +#endif  }  #ifdef CONFIG_NEED_MULTIPLE_NODES @@ -1021,7 +1026,8 @@ static void __init add_node_ranges(void)  				"start[%lx] end[%lx]\n",  				nid, start, this_end); -			memblock_set_node(start, this_end - start, nid); +			memblock_set_node(start, this_end - start, +					  &memblock.memory, nid);  			start = this_end;  		}  	} @@ -1325,7 +1331,7 @@ static void __init bootmem_init_nonnuma(void)  	       (top_of_ram - total_ram) >> 20);  	init_node_masks_nonnuma(); -	memblock_set_node(0, (phys_addr_t)ULLONG_MAX, 0); +	memblock_set_node(0, (phys_addr_t)ULLONG_MAX, &memblock.memory, 0);  	allocate_node_data(0);  	node_set_online(0);  } @@ -1557,6 +1563,96 @@ unsigned long __init find_ecache_flush_span(unsigned long size)  	return ~0UL;  } +unsigned long PAGE_OFFSET; +EXPORT_SYMBOL(PAGE_OFFSET); + +static void __init page_offset_shift_patch_one(unsigned int *insn, unsigned long phys_bits) +{ +	unsigned long final_shift; +	unsigned int val = *insn; +	unsigned int cnt; + +	/* We are patching in ilog2(max_supported_phys_address), and +	 * we are doing so in a manner similar to a relocation addend. +	 * That is, we are adding the shift value to whatever value +	 * is in the shift instruction count field already. +	 */ +	cnt = (val & 0x3f); +	val &= ~0x3f; + +	/* If we are trying to shift >= 64 bits, clear the destination +	 * register.  This can happen when phys_bits ends up being equal +	 * to MAX_PHYS_ADDRESS_BITS. +	 */ +	final_shift = (cnt + (64 - phys_bits)); +	if (final_shift >= 64) { +		unsigned int rd = (val >> 25) & 0x1f; + +		val = 0x80100000 | (rd << 25); +	} else { +		val |= final_shift; +	} +	*insn = val; + +	__asm__ __volatile__("flush	%0" +			     : /* no outputs */ +			     : "r" (insn)); +} + +static void __init page_offset_shift_patch(unsigned long phys_bits) +{ +	extern unsigned int __page_offset_shift_patch; +	extern unsigned int __page_offset_shift_patch_end; +	unsigned int *p; + +	p = &__page_offset_shift_patch; +	while (p < &__page_offset_shift_patch_end) { +		unsigned int *insn = (unsigned int *)(unsigned long)*p; + +		page_offset_shift_patch_one(insn, phys_bits); + +		p++; +	} +} + +static void __init setup_page_offset(void) +{ +	unsigned long max_phys_bits = 40; + +	if (tlb_type == cheetah || tlb_type == cheetah_plus) { +		max_phys_bits = 42; +	} else if (tlb_type == hypervisor) { +		switch (sun4v_chip_type) { +		case SUN4V_CHIP_NIAGARA1: +		case SUN4V_CHIP_NIAGARA2: +			max_phys_bits = 39; +			break; +		case SUN4V_CHIP_NIAGARA3: +			max_phys_bits = 43; +			break; +		case SUN4V_CHIP_NIAGARA4: +		case SUN4V_CHIP_NIAGARA5: +		case SUN4V_CHIP_SPARC64X: +		default: +			max_phys_bits = 47; +			break; +		} +	} + +	if (max_phys_bits > MAX_PHYS_ADDRESS_BITS) { +		prom_printf("MAX_PHYS_ADDRESS_BITS is too small, need %lu\n", +			    max_phys_bits); +		prom_halt(); +	} + +	PAGE_OFFSET = PAGE_OFFSET_BY_BITS(max_phys_bits); + +	pr_info("PAGE_OFFSET is 0x%016lx (max_phys_bits == %lu)\n", +		PAGE_OFFSET, max_phys_bits); + +	page_offset_shift_patch(max_phys_bits); +} +  static void __init tsb_phys_patch(void)  {  	struct tsb_ldquad_phys_patch_entry *pquad; @@ -1722,7 +1818,7 @@ static void __init sun4v_linear_pte_xor_finalize(void)  #ifndef CONFIG_DEBUG_PAGEALLOC  	if (cpu_pgsz_mask & HV_PGSZ_MASK_256MB) {  		kern_linear_pte_xor[1] = (_PAGE_VALID | _PAGE_SZ256MB_4V) ^ -			0xfffff80000000000UL; +			PAGE_OFFSET;  		kern_linear_pte_xor[1] |= (_PAGE_CP_4V | _PAGE_CV_4V |  					   _PAGE_P_4V | _PAGE_W_4V);  	} else { @@ -1731,7 +1827,7 @@ static void __init sun4v_linear_pte_xor_finalize(void)  	if (cpu_pgsz_mask & HV_PGSZ_MASK_2GB) {  		kern_linear_pte_xor[2] = (_PAGE_VALID | _PAGE_SZ2GB_4V) ^ -			0xfffff80000000000UL; +			PAGE_OFFSET;  		kern_linear_pte_xor[2] |= (_PAGE_CP_4V | _PAGE_CV_4V |  					   _PAGE_P_4V | _PAGE_W_4V);  	} else { @@ -1740,7 +1836,7 @@ static void __init sun4v_linear_pte_xor_finalize(void)  	if (cpu_pgsz_mask & HV_PGSZ_MASK_16GB) {  		kern_linear_pte_xor[3] = (_PAGE_VALID | _PAGE_SZ16GB_4V) ^ -			0xfffff80000000000UL; +			PAGE_OFFSET;  		kern_linear_pte_xor[3] |= (_PAGE_CP_4V | _PAGE_CV_4V |  					   _PAGE_P_4V | _PAGE_W_4V);  	} else { @@ -1752,7 +1848,7 @@ static void __init sun4v_linear_pte_xor_finalize(void)  /* paging_init() sets up the page tables */  static unsigned long last_valid_pfn; -pgd_t swapper_pg_dir[2048]; +pgd_t swapper_pg_dir[PTRS_PER_PGD];  static void sun4u_pgprot_init(void);  static void sun4v_pgprot_init(void); @@ -1763,6 +1859,8 @@ void __init paging_init(void)  	unsigned long real_end, i;  	int node; +	setup_page_offset(); +  	/* These build time checkes make sure that the dcache_dirty_cpu()  	 * page->flags usage will work.  	 * @@ -1788,7 +1886,7 @@ void __init paging_init(void)  	BUILD_BUG_ON(NR_CPUS > 4096); -	kern_base = (prom_boot_mapping_phys_low >> 22UL) << 22UL; +	kern_base = (prom_boot_mapping_phys_low >> ILOG2_4MB) << ILOG2_4MB;  	kern_size = (unsigned long)&_end - (unsigned long)KERNBASE;  	/* Invalidate both kernel TSBs.  */ @@ -1844,7 +1942,7 @@ void __init paging_init(void)  	shift = kern_base + PAGE_OFFSET - ((unsigned long)KERNBASE);  	real_end = (unsigned long)_end; -	num_kernel_image_mappings = DIV_ROUND_UP(real_end - KERNBASE, 1 << 22); +	num_kernel_image_mappings = DIV_ROUND_UP(real_end - KERNBASE, 1 << ILOG2_4MB);  	printk("Kernel: Using %d locked TLB entries for main kernel image.\n",  	       num_kernel_image_mappings); @@ -2001,7 +2099,7 @@ static void __init setup_valid_addr_bitmap_from_pavail(unsigned long *bitmap)  				if (new_start <= old_start &&  				    new_end >= (old_start + PAGE_SIZE)) { -					set_bit(old_start >> 22, bitmap); +					set_bit(old_start >> ILOG2_4MB, bitmap);  					goto do_next_page;  				}  			} @@ -2050,7 +2148,7 @@ void __init mem_init(void)  	addr = PAGE_OFFSET + kern_base;  	last = PAGE_ALIGN(kern_size) + addr;  	while (addr < last) { -		set_bit(__pa(addr) >> 22, sparc64_valid_addr_bitmap); +		set_bit(__pa(addr) >> ILOG2_4MB, sparc64_valid_addr_bitmap);  		addr += PAGE_SIZE;  	} @@ -2174,7 +2272,7 @@ int __meminit vmemmap_populate(unsigned long vstart, unsigned long vend,  		void *block;  		if (!(*vmem_pp & _PAGE_VALID)) { -			block = vmemmap_alloc_block(1UL << 22, node); +			block = vmemmap_alloc_block(1UL << ILOG2_4MB, node);  			if (!block)  				return -ENOMEM; @@ -2261,10 +2359,10 @@ static void __init sun4u_pgprot_init(void)  		     __ACCESS_BITS_4U | _PAGE_E_4U);  #ifdef CONFIG_DEBUG_PAGEALLOC -	kern_linear_pte_xor[0] = _PAGE_VALID ^ 0xfffff80000000000UL; +	kern_linear_pte_xor[0] = _PAGE_VALID ^ PAGE_OFFSET;  #else  	kern_linear_pte_xor[0] = (_PAGE_VALID | _PAGE_SZ4MB_4U) ^ -		0xfffff80000000000UL; +		PAGE_OFFSET;  #endif  	kern_linear_pte_xor[0] |= (_PAGE_CP_4U | _PAGE_CV_4U |  				   _PAGE_P_4U | _PAGE_W_4U); @@ -2308,10 +2406,10 @@ static void __init sun4v_pgprot_init(void)  	_PAGE_CACHE = _PAGE_CACHE_4V;  #ifdef CONFIG_DEBUG_PAGEALLOC -	kern_linear_pte_xor[0] = _PAGE_VALID ^ 0xfffff80000000000UL; +	kern_linear_pte_xor[0] = _PAGE_VALID ^ PAGE_OFFSET;  #else  	kern_linear_pte_xor[0] = (_PAGE_VALID | _PAGE_SZ4MB_4V) ^ -		0xfffff80000000000UL; +		PAGE_OFFSET;  #endif  	kern_linear_pte_xor[0] |= (_PAGE_CP_4V | _PAGE_CV_4V |  				   _PAGE_P_4V | _PAGE_W_4V); @@ -2455,53 +2553,13 @@ void __flush_tlb_all(void)  			     : : "r" (pstate));  } -static pte_t *get_from_cache(struct mm_struct *mm) -{ -	struct page *page; -	pte_t *ret; - -	spin_lock(&mm->page_table_lock); -	page = mm->context.pgtable_page; -	ret = NULL; -	if (page) { -		void *p = page_address(page); - -		mm->context.pgtable_page = NULL; - -		ret = (pte_t *) (p + (PAGE_SIZE / 2)); -	} -	spin_unlock(&mm->page_table_lock); - -	return ret; -} - -static struct page *__alloc_for_cache(struct mm_struct *mm) -{ -	struct page *page = alloc_page(GFP_KERNEL | __GFP_NOTRACK | -				       __GFP_REPEAT | __GFP_ZERO); - -	if (page) { -		spin_lock(&mm->page_table_lock); -		if (!mm->context.pgtable_page) { -			atomic_set(&page->_count, 2); -			mm->context.pgtable_page = page; -		} -		spin_unlock(&mm->page_table_lock); -	} -	return page; -} -  pte_t *pte_alloc_one_kernel(struct mm_struct *mm,  			    unsigned long address)  { -	struct page *page; -	pte_t *pte; - -	pte = get_from_cache(mm); -	if (pte) -		return pte; +	struct page *page = alloc_page(GFP_KERNEL | __GFP_NOTRACK | +				       __GFP_REPEAT | __GFP_ZERO); +	pte_t *pte = NULL; -	page = __alloc_for_cache(mm);  	if (page)  		pte = (pte_t *) page_address(page); @@ -2511,36 +2569,28 @@ pte_t *pte_alloc_one_kernel(struct mm_struct *mm,  pgtable_t pte_alloc_one(struct mm_struct *mm,  			unsigned long address)  { -	struct page *page; -	pte_t *pte; - -	pte = get_from_cache(mm); -	if (pte) -		return pte; - -	page = __alloc_for_cache(mm); -	if (page) { -		pgtable_page_ctor(page); -		pte = (pte_t *) page_address(page); +	struct page *page = alloc_page(GFP_KERNEL | __GFP_NOTRACK | +				       __GFP_REPEAT | __GFP_ZERO); +	if (!page) +		return NULL; +	if (!pgtable_page_ctor(page)) { +		free_hot_cold_page(page, 0); +		return NULL;  	} - -	return pte; +	return (pte_t *) page_address(page);  }  void pte_free_kernel(struct mm_struct *mm, pte_t *pte)  { -	struct page *page = virt_to_page(pte); -	if (put_page_testzero(page)) -		free_hot_cold_page(page, 0); +	free_page((unsigned long)pte);  }  static void __pte_free(pgtable_t pte)  {  	struct page *page = virt_to_page(pte); -	if (put_page_testzero(page)) { -		pgtable_page_dtor(page); -		free_hot_cold_page(page, 0); -	} + +	pgtable_page_dtor(page); +	__free_page(page);  }  void pte_free(struct mm_struct *mm, pgtable_t pte) @@ -2557,124 +2607,27 @@ void pgtable_free(void *table, bool is_page)  }  #ifdef CONFIG_TRANSPARENT_HUGEPAGE -static pmd_t pmd_set_protbits(pmd_t pmd, pgprot_t pgprot, bool for_modify) -{ -	if (pgprot_val(pgprot) & _PAGE_VALID) -		pmd_val(pmd) |= PMD_HUGE_PRESENT; -	if (tlb_type == hypervisor) { -		if (pgprot_val(pgprot) & _PAGE_WRITE_4V) -			pmd_val(pmd) |= PMD_HUGE_WRITE; -		if (pgprot_val(pgprot) & _PAGE_EXEC_4V) -			pmd_val(pmd) |= PMD_HUGE_EXEC; - -		if (!for_modify) { -			if (pgprot_val(pgprot) & _PAGE_ACCESSED_4V) -				pmd_val(pmd) |= PMD_HUGE_ACCESSED; -			if (pgprot_val(pgprot) & _PAGE_MODIFIED_4V) -				pmd_val(pmd) |= PMD_HUGE_DIRTY; -		} -	} else { -		if (pgprot_val(pgprot) & _PAGE_WRITE_4U) -			pmd_val(pmd) |= PMD_HUGE_WRITE; -		if (pgprot_val(pgprot) & _PAGE_EXEC_4U) -			pmd_val(pmd) |= PMD_HUGE_EXEC; - -		if (!for_modify) { -			if (pgprot_val(pgprot) & _PAGE_ACCESSED_4U) -				pmd_val(pmd) |= PMD_HUGE_ACCESSED; -			if (pgprot_val(pgprot) & _PAGE_MODIFIED_4U) -				pmd_val(pmd) |= PMD_HUGE_DIRTY; -		} -	} - -	return pmd; -} - -pmd_t pfn_pmd(unsigned long page_nr, pgprot_t pgprot) -{ -	pmd_t pmd; - -	pmd_val(pmd) = (page_nr << ((PAGE_SHIFT - PMD_PADDR_SHIFT))); -	pmd_val(pmd) |= PMD_ISHUGE; -	pmd = pmd_set_protbits(pmd, pgprot, false); -	return pmd; -} - -pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot) -{ -	pmd_val(pmd) &= ~(PMD_HUGE_PRESENT | -			  PMD_HUGE_WRITE | -			  PMD_HUGE_EXEC); -	pmd = pmd_set_protbits(pmd, newprot, true); -	return pmd; -} - -pgprot_t pmd_pgprot(pmd_t entry) -{ -	unsigned long pte = 0; - -	if (pmd_val(entry) & PMD_HUGE_PRESENT) -		pte |= _PAGE_VALID; - -	if (tlb_type == hypervisor) { -		if (pmd_val(entry) & PMD_HUGE_PRESENT) -			pte |= _PAGE_PRESENT_4V; -		if (pmd_val(entry) & PMD_HUGE_EXEC) -			pte |= _PAGE_EXEC_4V; -		if (pmd_val(entry) & PMD_HUGE_WRITE) -			pte |= _PAGE_W_4V; -		if (pmd_val(entry) & PMD_HUGE_ACCESSED) -			pte |= _PAGE_ACCESSED_4V; -		if (pmd_val(entry) & PMD_HUGE_DIRTY) -			pte |= _PAGE_MODIFIED_4V; -		pte |= _PAGE_CP_4V|_PAGE_CV_4V; -	} else { -		if (pmd_val(entry) & PMD_HUGE_PRESENT) -			pte |= _PAGE_PRESENT_4U; -		if (pmd_val(entry) & PMD_HUGE_EXEC) -			pte |= _PAGE_EXEC_4U; -		if (pmd_val(entry) & PMD_HUGE_WRITE) -			pte |= _PAGE_W_4U; -		if (pmd_val(entry) & PMD_HUGE_ACCESSED) -			pte |= _PAGE_ACCESSED_4U; -		if (pmd_val(entry) & PMD_HUGE_DIRTY) -			pte |= _PAGE_MODIFIED_4U; -		pte |= _PAGE_CP_4U|_PAGE_CV_4U; -	} - -	return __pgprot(pte); -} -  void update_mmu_cache_pmd(struct vm_area_struct *vma, unsigned long addr,  			  pmd_t *pmd)  {  	unsigned long pte, flags;  	struct mm_struct *mm;  	pmd_t entry = *pmd; -	pgprot_t prot;  	if (!pmd_large(entry) || !pmd_young(entry))  		return; -	pte = (pmd_val(entry) & ~PMD_HUGE_PROTBITS); -	pte <<= PMD_PADDR_SHIFT; -	pte |= _PAGE_VALID; - -	prot = pmd_pgprot(entry); - -	if (tlb_type == hypervisor) -		pgprot_val(prot) |= _PAGE_SZHUGE_4V; -	else -		pgprot_val(prot) |= _PAGE_SZHUGE_4U; +	pte = pmd_val(entry); -	pte |= pgprot_val(prot); +	/* We are fabricating 8MB pages using 4MB real hw pages.  */ +	pte |= (addr & (1UL << REAL_HPAGE_SHIFT));  	mm = vma->vm_mm;  	spin_lock_irqsave(&mm->context.lock, flags);  	if (mm->context.tsb_block[MM_TSB_HUGE].tsb != NULL) -		__update_mmu_tsb_insert(mm, MM_TSB_HUGE, HPAGE_SHIFT, +		__update_mmu_tsb_insert(mm, MM_TSB_HUGE, REAL_HPAGE_SHIFT,  					addr, pte);  	spin_unlock_irqrestore(&mm->context.lock, flags); diff --git a/arch/sparc/mm/init_64.h b/arch/sparc/mm/init_64.h index 0661aa606de..0668b364f44 100644 --- a/arch/sparc/mm/init_64.h +++ b/arch/sparc/mm/init_64.h @@ -1,11 +1,13 @@  #ifndef _SPARC64_MM_INIT_H  #define _SPARC64_MM_INIT_H +#include <asm/page.h> +  /* Most of the symbols in this file are defined in init.c and   * marked non-static so that assembler code can get at them.   */ -#define MAX_PHYS_ADDRESS	(1UL << 41UL) +#define MAX_PHYS_ADDRESS	(1UL << MAX_PHYS_ADDRESS_BITS)  #define KPTE_BITMAP_CHUNK_SZ		(256UL * 1024UL * 1024UL)  #define KPTE_BITMAP_BYTES	\  	((MAX_PHYS_ADDRESS / KPTE_BITMAP_CHUNK_SZ) / 4) @@ -19,7 +21,7 @@ extern unsigned int sparc64_highest_unlocked_tlb_ent;  extern unsigned long sparc64_kern_pri_context;  extern unsigned long sparc64_kern_pri_nuc_bits;  extern unsigned long sparc64_kern_sec_context; -extern void mmu_info(struct seq_file *m); +void mmu_info(struct seq_file *m);  struct linux_prom_translation {  	unsigned long virt; @@ -34,7 +36,7 @@ extern unsigned int prom_trans_ents;  /* Exported for SMP bootup purposes. */  extern unsigned long kern_locked_tte_data; -extern void prom_world(int enter); +void prom_world(int enter);  #ifdef CONFIG_SPARSEMEM_VMEMMAP  #define VMEMMAP_CHUNK_SHIFT	22 diff --git a/arch/sparc/mm/io-unit.c b/arch/sparc/mm/io-unit.c index eb99862e965..f311bf21901 100644 --- a/arch/sparc/mm/io-unit.c +++ b/arch/sparc/mm/io-unit.c @@ -25,6 +25,8 @@  #include <asm/dma.h>  #include <asm/oplib.h> +#include "mm_32.h" +  /* #define IOUNIT_DEBUG */  #ifdef IOUNIT_DEBUG  #define IOD(x) printk(x) @@ -38,7 +40,8 @@  static void __init iounit_iommu_init(struct platform_device *op)  {  	struct iounit_struct *iounit; -	iopte_t *xpt, *xptend; +	iopte_t __iomem *xpt; +	iopte_t __iomem *xptend;  	iounit = kzalloc(sizeof(struct iounit_struct), GFP_ATOMIC);  	if (!iounit) { @@ -62,10 +65,10 @@ static void __init iounit_iommu_init(struct platform_device *op)  	op->dev.archdata.iommu = iounit;  	iounit->page_table = xpt;  	spin_lock_init(&iounit->lock); -	 -	for (xptend = iounit->page_table + (16 * PAGE_SIZE) / sizeof(iopte_t); -	     xpt < xptend;) -	     	iopte_val(*xpt++) = 0; + +	xptend = iounit->page_table + (16 * PAGE_SIZE) / sizeof(iopte_t); +	for (; xpt < xptend; xpt++) +		sbus_writel(0, xpt);  }  static int __init iounit_init(void) @@ -130,7 +133,7 @@ nexti:	scan = find_next_zero_bit(iounit->bmap, limit, scan);  	vaddr = IOUNIT_DMA_BASE + (scan << PAGE_SHIFT) + (vaddr & ~PAGE_MASK);  	for (k = 0; k < npages; k++, iopte = __iopte(iopte_val(iopte) + 0x100), scan++) {  		set_bit(scan, iounit->bmap); -		iounit->page_table[scan] = iopte; +		sbus_writel(iopte, &iounit->page_table[scan]);  	}  	IOD(("%08lx\n", vaddr));  	return vaddr; @@ -202,7 +205,7 @@ static int iounit_map_dma_area(struct device *dev, dma_addr_t *pba, unsigned lon  	struct iounit_struct *iounit = dev->archdata.iommu;  	unsigned long page, end;  	pgprot_t dvma_prot; -	iopte_t *iopte; +	iopte_t __iomem *iopte;  	*pba = addr; @@ -224,8 +227,8 @@ static int iounit_map_dma_area(struct device *dev, dma_addr_t *pba, unsigned lon  			i = ((addr - IOUNIT_DMA_BASE) >> PAGE_SHIFT); -			iopte = (iopte_t *)(iounit->page_table + i); -			*iopte = MKIOPTE(__pa(page)); +			iopte = iounit->page_table + i; +			sbus_writel(MKIOPTE(__pa(page)), iopte);  		}  		addr += PAGE_SIZE;  		va += PAGE_SIZE; diff --git a/arch/sparc/mm/iommu.c b/arch/sparc/mm/iommu.c index 28f96f27c76..491511d37e3 100644 --- a/arch/sparc/mm/iommu.c +++ b/arch/sparc/mm/iommu.c @@ -27,6 +27,8 @@  #include <asm/iommu.h>  #include <asm/dma.h> +#include "mm_32.h" +  /*   * This can be sized dynamically, but we will do this   * only when we have a guidance about actual I/O pressures. @@ -37,9 +39,6 @@  #define IOMMU_NPTES	(IOMMU_WINSIZE/PAGE_SIZE)	/* 64K PTEs, 256KB */  #define IOMMU_ORDER	6				/* 4096 * (1<<6) */ -/* srmmu.c */ -extern int viking_mxcc_present; -extern int flush_page_for_dma_global;  static int viking_flush;  /* viking.S */  extern void viking_flush_page(unsigned long page); @@ -59,6 +58,8 @@ static void __init sbus_iommu_init(struct platform_device *op)  	struct iommu_struct *iommu;  	unsigned int impl, vers;  	unsigned long *bitmap; +	unsigned long control; +	unsigned long base;  	unsigned long tmp;  	iommu = kmalloc(sizeof(struct iommu_struct), GFP_KERNEL); @@ -73,12 +74,14 @@ static void __init sbus_iommu_init(struct platform_device *op)  		prom_printf("Cannot map IOMMU registers\n");  		prom_halt();  	} -	impl = (iommu->regs->control & IOMMU_CTRL_IMPL) >> 28; -	vers = (iommu->regs->control & IOMMU_CTRL_VERS) >> 24; -	tmp = iommu->regs->control; -	tmp &= ~(IOMMU_CTRL_RNGE); -	tmp |= (IOMMU_RNGE_256MB | IOMMU_CTRL_ENAB); -	iommu->regs->control = tmp; + +	control = sbus_readl(&iommu->regs->control); +	impl = (control & IOMMU_CTRL_IMPL) >> 28; +	vers = (control & IOMMU_CTRL_VERS) >> 24; +	control &= ~(IOMMU_CTRL_RNGE); +	control |= (IOMMU_RNGE_256MB | IOMMU_CTRL_ENAB); +	sbus_writel(control, &iommu->regs->control); +  	iommu_invalidate(iommu->regs);  	iommu->start = IOMMU_START;  	iommu->end = 0xffffffff; @@ -100,7 +103,9 @@ static void __init sbus_iommu_init(struct platform_device *op)  	memset(iommu->page_table, 0, IOMMU_NPTES*sizeof(iopte_t));  	flush_cache_all();  	flush_tlb_all(); -	iommu->regs->base = __pa((unsigned long) iommu->page_table) >> 4; + +	base = __pa((unsigned long)iommu->page_table) >> 4; +	sbus_writel(base, &iommu->regs->base);  	iommu_invalidate(iommu->regs);  	bitmap = kmalloc(IOMMU_NPTES>>3, GFP_KERNEL); diff --git a/arch/sparc/mm/leon_mm.c b/arch/sparc/mm/leon_mm.c index 5bed085a2c1..3b17b6f7895 100644 --- a/arch/sparc/mm/leon_mm.c +++ b/arch/sparc/mm/leon_mm.c @@ -15,10 +15,10 @@  #include <asm/leon.h>  #include <asm/tlbflush.h> -#include "srmmu.h" +#include "mm_32.h"  int leon_flush_during_switch = 1; -int srmmu_swprobe_trace; +static int srmmu_swprobe_trace;  static inline unsigned long leon_get_ctable_ptr(void)  { diff --git a/arch/sparc/mm/mm_32.h b/arch/sparc/mm/mm_32.h new file mode 100644 index 00000000000..a6c27ca9a72 --- /dev/null +++ b/arch/sparc/mm/mm_32.h @@ -0,0 +1,24 @@ +/* fault_32.c - visible as they are called from assembler */ +asmlinkage int lookup_fault(unsigned long pc, unsigned long ret_pc, +                            unsigned long address); +asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write, +                               unsigned long address); + +void window_overflow_fault(void); +void window_underflow_fault(unsigned long sp); +void window_ret_fault(struct pt_regs *regs); + +/* srmmu.c */ +extern char *srmmu_name; +extern int viking_mxcc_present; +extern int flush_page_for_dma_global; + +extern void (*poke_srmmu)(void); + +void __init srmmu_paging_init(void); + +/* iommu.c */ +void ld_mmu_iommu(void); + +/* io-unit.c */ +void ld_mmu_iounit(void); diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index 5d721df48a7..be65f035d18 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c @@ -14,6 +14,7 @@  #include <linux/pagemap.h>  #include <linux/vmalloc.h>  #include <linux/kdebug.h> +#include <linux/export.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/log2.h> @@ -48,7 +49,7 @@  #include <asm/mxcc.h>  #include <asm/ross.h> -#include "srmmu.h" +#include "mm_32.h"  enum mbus_module srmmu_modtype;  static unsigned int hwbug_bitmask; @@ -62,6 +63,7 @@ extern unsigned long last_valid_pfn;  static pgd_t *srmmu_swapper_pg_dir;  const struct sparc32_cachetlb_ops *sparc32_cachetlb_ops; +EXPORT_SYMBOL(sparc32_cachetlb_ops);  #ifdef CONFIG_SMP  const struct sparc32_cachetlb_ops *local_ops; @@ -98,7 +100,6 @@ static unsigned long srmmu_nocache_end;  #define SRMMU_NOCACHE_ALIGN_MAX (sizeof(ctxd_t)*SRMMU_MAX_CONTEXTS)  void *srmmu_nocache_pool; -void *srmmu_nocache_bitmap;  static struct bit_map srmmu_nocache_map;  static inline int srmmu_pmd_none(pmd_t pmd) @@ -171,7 +172,7 @@ static void *__srmmu_get_nocache(int size, int align)  		printk(KERN_ERR "srmmu: out of nocache %d: %d/%d\n",  		       size, (int) srmmu_nocache_size,  		       srmmu_nocache_map.used << SRMMU_NOCACHE_BITMAP_SHIFT); -		return 0; +		return NULL;  	}  	addr = SRMMU_NOCACHE_VADDR + (offset << SRMMU_NOCACHE_BITMAP_SHIFT); @@ -267,6 +268,7 @@ static void __init srmmu_nocache_calcsize(void)  static void __init srmmu_nocache_init(void)  { +	void *srmmu_nocache_bitmap;  	unsigned int bitmap_bits;  	pgd_t *pgd;  	pmd_t *pmd; @@ -345,7 +347,10 @@ pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address)  	if ((pte = (unsigned long)pte_alloc_one_kernel(mm, address)) == 0)  		return NULL;  	page = pfn_to_page(__nocache_pa(pte) >> PAGE_SHIFT); -	pgtable_page_ctor(page); +	if (!pgtable_page_ctor(page)) { +		__free_page(page); +		return NULL; +	}  	return page;  } @@ -723,7 +728,7 @@ static inline unsigned long srmmu_probe(unsigned long vaddr)  				     "=r" (retval) :  				     "r" (vaddr | 0x400), "i" (ASI_M_FLUSH_PROBE));  	} else { -		retval = leon_swprobe(vaddr, 0); +		retval = leon_swprobe(vaddr, NULL);  	}  	return retval;  } @@ -860,8 +865,6 @@ static void __init map_kernel(void)  void (*poke_srmmu)(void) = NULL; -extern unsigned long bootmem_init(unsigned long *pages_avail); -  void __init srmmu_paging_init(void)  {  	int i; @@ -1766,9 +1769,6 @@ static struct sparc32_cachetlb_ops smp_cachetlb_ops = {  /* Load up routines and constants for sun4m and sun4d mmu */  void __init load_mmu(void)  { -	extern void ld_mmu_iommu(void); -	extern void ld_mmu_iounit(void); -  	/* Functions */  	get_srmmu_type(); diff --git a/arch/sparc/mm/srmmu.h b/arch/sparc/mm/srmmu.h deleted file mode 100644 index 5703274ccf8..00000000000 --- a/arch/sparc/mm/srmmu.h +++ /dev/null @@ -1,4 +0,0 @@ -/* srmmu.c */ -extern char *srmmu_name; - -extern void (*poke_srmmu)(void); diff --git a/arch/sparc/mm/tlb.c b/arch/sparc/mm/tlb.c index 7a91f288c70..b89aba217e3 100644 --- a/arch/sparc/mm/tlb.c +++ b/arch/sparc/mm/tlb.c @@ -4,7 +4,6 @@   */  #include <linux/kernel.h> -#include <linux/init.h>  #include <linux/percpu.h>  #include <linux/mm.h>  #include <linux/swap.h> @@ -135,7 +134,7 @@ no_cache_flush:  #ifdef CONFIG_TRANSPARENT_HUGEPAGE  static void tlb_batch_pmd_scan(struct mm_struct *mm, unsigned long vaddr, -			       pmd_t pmd, bool exec) +			       pmd_t pmd)  {  	unsigned long end;  	pte_t *pte; @@ -143,8 +142,11 @@ static void tlb_batch_pmd_scan(struct mm_struct *mm, unsigned long vaddr,  	pte = pte_offset_map(&pmd, vaddr);  	end = vaddr + HPAGE_SIZE;  	while (vaddr < end) { -		if (pte_val(*pte) & _PAGE_VALID) +		if (pte_val(*pte) & _PAGE_VALID) { +			bool exec = pte_exec(*pte); +  			tlb_batch_add_one(mm, vaddr, exec); +		}  		pte++;  		vaddr += PAGE_SIZE;  	} @@ -161,8 +163,8 @@ void set_pmd_at(struct mm_struct *mm, unsigned long addr,  	if (mm == &init_mm)  		return; -	if ((pmd_val(pmd) ^ pmd_val(orig)) & PMD_ISHUGE) { -		if (pmd_val(pmd) & PMD_ISHUGE) +	if ((pmd_val(pmd) ^ pmd_val(orig)) & _PAGE_PMD_HUGE) { +		if (pmd_val(pmd) & _PAGE_PMD_HUGE)  			mm->context.huge_pte_count++;  		else  			mm->context.huge_pte_count--; @@ -178,16 +180,30 @@ void set_pmd_at(struct mm_struct *mm, unsigned long addr,  	}  	if (!pmd_none(orig)) { -		bool exec = ((pmd_val(orig) & PMD_HUGE_EXEC) != 0); -  		addr &= HPAGE_MASK; -		if (pmd_val(orig) & PMD_ISHUGE) +		if (pmd_trans_huge(orig)) { +			pte_t orig_pte = __pte(pmd_val(orig)); +			bool exec = pte_exec(orig_pte); +  			tlb_batch_add_one(mm, addr, exec); -		else -			tlb_batch_pmd_scan(mm, addr, orig, exec); +			tlb_batch_add_one(mm, addr + REAL_HPAGE_SIZE, exec); +		} else { +			tlb_batch_pmd_scan(mm, addr, orig); +		}  	}  } +void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, +		     pmd_t *pmdp) +{ +	pmd_t entry = *pmdp; + +	pmd_val(entry) &= ~_PAGE_VALID; + +	set_pmd_at(vma->vm_mm, address, pmdp, entry); +	flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE); +} +  void pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp,  				pgtable_t pgtable)  { @@ -196,11 +212,11 @@ void pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp,  	assert_spin_locked(&mm->page_table_lock);  	/* FIFO */ -	if (!mm->pmd_huge_pte) +	if (!pmd_huge_pte(mm, pmdp))  		INIT_LIST_HEAD(lh);  	else -		list_add(lh, (struct list_head *) mm->pmd_huge_pte); -	mm->pmd_huge_pte = pgtable; +		list_add(lh, (struct list_head *) pmd_huge_pte(mm, pmdp)); +	pmd_huge_pte(mm, pmdp) = pgtable;  }  pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp) @@ -211,12 +227,12 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp)  	assert_spin_locked(&mm->page_table_lock);  	/* FIFO */ -	pgtable = mm->pmd_huge_pte; +	pgtable = pmd_huge_pte(mm, pmdp);  	lh = (struct list_head *) pgtable;  	if (list_empty(lh)) -		mm->pmd_huge_pte = NULL; +		pmd_huge_pte(mm, pmdp) = NULL;  	else { -		mm->pmd_huge_pte = (pgtable_t) lh->next; +		pmd_huge_pte(mm, pmdp) = (pgtable_t) lh->next;  		list_del(lh);  	}  	pte_val(pgtable[0]) = 0; diff --git a/arch/sparc/mm/tsb.c b/arch/sparc/mm/tsb.c index 2cc3bce5ee9..a06576683c3 100644 --- a/arch/sparc/mm/tsb.c +++ b/arch/sparc/mm/tsb.c @@ -9,6 +9,7 @@  #include <asm/page.h>  #include <asm/pgtable.h>  #include <asm/mmu_context.h> +#include <asm/setup.h>  #include <asm/tsb.h>  #include <asm/tlb.h>  #include <asm/oplib.h> @@ -87,7 +88,7 @@ void flush_tsb_user(struct tlb_batch *tb)  		nentries = mm->context.tsb_block[MM_TSB_HUGE].tsb_nentries;  		if (tlb_type == cheetah_plus || tlb_type == hypervisor)  			base = __pa(base); -		__flush_tsb_one(tb, HPAGE_SHIFT, base, nentries); +		__flush_tsb_one(tb, REAL_HPAGE_SHIFT, base, nentries);  	}  #endif  	spin_unlock_irqrestore(&mm->context.lock, flags); @@ -111,7 +112,7 @@ void flush_tsb_user_page(struct mm_struct *mm, unsigned long vaddr)  		nentries = mm->context.tsb_block[MM_TSB_HUGE].tsb_nentries;  		if (tlb_type == cheetah_plus || tlb_type == hypervisor)  			base = __pa(base); -		__flush_tsb_one_entry(base, vaddr, HPAGE_SHIFT, nentries); +		__flush_tsb_one_entry(base, vaddr, REAL_HPAGE_SHIFT, nentries);  	}  #endif  	spin_unlock_irqrestore(&mm->context.lock, flags); @@ -133,7 +134,19 @@ static void setup_tsb_params(struct mm_struct *mm, unsigned long tsb_idx, unsign  	mm->context.tsb_block[tsb_idx].tsb_nentries =  		tsb_bytes / sizeof(struct tsb); -	base = TSBMAP_BASE; +	switch (tsb_idx) { +	case MM_TSB_BASE: +		base = TSBMAP_8K_BASE; +		break; +#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE) +	case MM_TSB_HUGE: +		base = TSBMAP_4M_BASE; +		break; +#endif +	default: +		BUG(); +	} +  	tte = pgprot_val(PAGE_KERNEL_LOCKED);  	tsb_paddr = __pa(mm->context.tsb_block[tsb_idx].tsb);  	BUG_ON(tsb_paddr & (tsb_bytes - 1UL)); @@ -273,7 +286,7 @@ void __init pgtable_cache_init(void)  		prom_halt();  	} -	for (i = 0; i < 8; i++) { +	for (i = 0; i < ARRAY_SIZE(tsb_cache_names); i++) {  		unsigned long size = 8192 << i;  		const char *name = tsb_cache_names[i]; @@ -472,8 +485,6 @@ int init_new_context(struct task_struct *tsk, struct mm_struct *mm)  	mm->context.huge_pte_count = 0;  #endif -	mm->context.pgtable_page = NULL; -  	/* copy_mm() copies over the parent's mm_struct before calling  	 * us, so we need to zero out the TSB pointer or else tsb_grow()  	 * will be confused and think there is an older TSB to free up. @@ -512,17 +523,10 @@ static void tsb_destroy_one(struct tsb_config *tp)  void destroy_context(struct mm_struct *mm)  {  	unsigned long flags, i; -	struct page *page;  	for (i = 0; i < MM_NUM_TSBS; i++)  		tsb_destroy_one(&mm->context.tsb_block[i]); -	page = mm->context.pgtable_page; -	if (page && put_page_testzero(page)) { -		pgtable_page_dtor(page); -		free_hot_cold_page(page, 0); -	} -  	spin_lock_irqsave(&ctx_alloc_lock, flags);  	if (CTX_VALID(mm->context)) { diff --git a/arch/sparc/mm/ultra.S b/arch/sparc/mm/ultra.S index 432aa0cb1b3..b4f4733abc6 100644 --- a/arch/sparc/mm/ultra.S +++ b/arch/sparc/mm/ultra.S @@ -153,10 +153,10 @@ __spitfire_flush_tlb_mm_slow:  	.globl		__flush_icache_page  __flush_icache_page:	/* %o0 = phys_page */  	srlx		%o0, PAGE_SHIFT, %o0 -	sethi		%uhi(PAGE_OFFSET), %g1 +	sethi		%hi(PAGE_OFFSET), %g1  	sllx		%o0, PAGE_SHIFT, %o0  	sethi		%hi(PAGE_SIZE), %g2 -	sllx		%g1, 32, %g1 +	ldx		[%g1 + %lo(PAGE_OFFSET)], %g1  	add		%o0, %g1, %o0  1:	subcc		%g2, 32, %g2  	bne,pt		%icc, 1b @@ -178,8 +178,8 @@ __flush_icache_page:	/* %o0 = phys_page */  	.align		64  	.globl		__flush_dcache_page  __flush_dcache_page:	/* %o0=kaddr, %o1=flush_icache */ -	sethi		%uhi(PAGE_OFFSET), %g1 -	sllx		%g1, 32, %g1 +	sethi		%hi(PAGE_OFFSET), %g1 +	ldx		[%g1 + %lo(PAGE_OFFSET)], %g1  	sub		%o0, %g1, %o0			! physical address  	srlx		%o0, 11, %o0			! make D-cache TAG  	sethi		%hi(1 << 14), %o2		! D-cache size @@ -287,8 +287,8 @@ __cheetah_flush_tlb_pending:	/* 27 insns */  #ifdef DCACHE_ALIASING_POSSIBLE  __cheetah_flush_dcache_page: /* 11 insns */ -	sethi		%uhi(PAGE_OFFSET), %g1 -	sllx		%g1, 32, %g1 +	sethi		%hi(PAGE_OFFSET), %g1 +	ldx		[%g1 + %lo(PAGE_OFFSET)], %g1  	sub		%o0, %g1, %o0  	sethi		%hi(PAGE_SIZE), %o4  1:	subcc		%o4, (1 << 5), %o4 diff --git a/arch/sparc/net/bpf_jit_comp.c b/arch/sparc/net/bpf_jit_comp.c index 218b6b23c37..892a102671a 100644 --- a/arch/sparc/net/bpf_jit_comp.c +++ b/arch/sparc/net/bpf_jit_comp.c @@ -83,9 +83,9 @@ static void bpf_flush_icache(void *start_, void *end_)  #define BNE		(F2(0, 2) | CONDNE)  #ifdef CONFIG_SPARC64 -#define BNE_PTR		(F2(0, 1) | CONDNE | (2 << 20)) +#define BE_PTR		(F2(0, 1) | CONDE | (2 << 20))  #else -#define BNE_PTR		BNE +#define BE_PTR		BE  #endif  #define SETHI(K, REG)	\ @@ -415,20 +415,11 @@ void bpf_jit_compile(struct sk_filter *fp)  		emit_reg_move(O7, r_saved_O7);  		switch (filter[0].code) { -		case BPF_S_RET_K: -		case BPF_S_LD_W_LEN: -		case BPF_S_ANC_PROTOCOL: -		case BPF_S_ANC_PKTTYPE: -		case BPF_S_ANC_IFINDEX: -		case BPF_S_ANC_MARK: -		case BPF_S_ANC_RXHASH: -		case BPF_S_ANC_VLAN_TAG: -		case BPF_S_ANC_VLAN_TAG_PRESENT: -		case BPF_S_ANC_CPU: -		case BPF_S_ANC_QUEUE: -		case BPF_S_LD_W_ABS: -		case BPF_S_LD_H_ABS: -		case BPF_S_LD_B_ABS: +		case BPF_RET | BPF_K: +		case BPF_LD | BPF_W | BPF_LEN: +		case BPF_LD | BPF_W | BPF_ABS: +		case BPF_LD | BPF_H | BPF_ABS: +		case BPF_LD | BPF_B | BPF_ABS:  			/* The first instruction sets the A register (or is  			 * a "RET 'constant'")  			 */ @@ -445,63 +436,75 @@ void bpf_jit_compile(struct sk_filter *fp)  			unsigned int t_offset;  			unsigned int f_offset;  			u32 t_op, f_op; +			u16 code = bpf_anc_helper(&filter[i]);  			int ilen; -			switch (filter[i].code) { -			case BPF_S_ALU_ADD_X:	/* A += X; */ +			switch (code) { +			case BPF_ALU | BPF_ADD | BPF_X:	/* A += X; */  				emit_alu_X(ADD);  				break; -			case BPF_S_ALU_ADD_K:	/* A += K; */ +			case BPF_ALU | BPF_ADD | BPF_K:	/* A += K; */  				emit_alu_K(ADD, K);  				break; -			case BPF_S_ALU_SUB_X:	/* A -= X; */ +			case BPF_ALU | BPF_SUB | BPF_X:	/* A -= X; */  				emit_alu_X(SUB);  				break; -			case BPF_S_ALU_SUB_K:	/* A -= K */ +			case BPF_ALU | BPF_SUB | BPF_K:	/* A -= K */  				emit_alu_K(SUB, K);  				break; -			case BPF_S_ALU_AND_X:	/* A &= X */ +			case BPF_ALU | BPF_AND | BPF_X:	/* A &= X */  				emit_alu_X(AND);  				break; -			case BPF_S_ALU_AND_K:	/* A &= K */ +			case BPF_ALU | BPF_AND | BPF_K:	/* A &= K */  				emit_alu_K(AND, K);  				break; -			case BPF_S_ALU_OR_X:	/* A |= X */ +			case BPF_ALU | BPF_OR | BPF_X:	/* A |= X */  				emit_alu_X(OR);  				break; -			case BPF_S_ALU_OR_K:	/* A |= K */ +			case BPF_ALU | BPF_OR | BPF_K:	/* A |= K */  				emit_alu_K(OR, K);  				break; -			case BPF_S_ANC_ALU_XOR_X: /* A ^= X; */ -			case BPF_S_ALU_XOR_X: +			case BPF_ANC | SKF_AD_ALU_XOR_X: /* A ^= X; */ +			case BPF_ALU | BPF_XOR | BPF_X:  				emit_alu_X(XOR);  				break; -			case BPF_S_ALU_XOR_K:	/* A ^= K */ +			case BPF_ALU | BPF_XOR | BPF_K:	/* A ^= K */  				emit_alu_K(XOR, K);  				break; -			case BPF_S_ALU_LSH_X:	/* A <<= X */ +			case BPF_ALU | BPF_LSH | BPF_X:	/* A <<= X */  				emit_alu_X(SLL);  				break; -			case BPF_S_ALU_LSH_K:	/* A <<= K */ +			case BPF_ALU | BPF_LSH | BPF_K:	/* A <<= K */  				emit_alu_K(SLL, K);  				break; -			case BPF_S_ALU_RSH_X:	/* A >>= X */ +			case BPF_ALU | BPF_RSH | BPF_X:	/* A >>= X */  				emit_alu_X(SRL);  				break; -			case BPF_S_ALU_RSH_K:	/* A >>= K */ +			case BPF_ALU | BPF_RSH | BPF_K:	/* A >>= K */  				emit_alu_K(SRL, K);  				break; -			case BPF_S_ALU_MUL_X:	/* A *= X; */ +			case BPF_ALU | BPF_MUL | BPF_X:	/* A *= X; */  				emit_alu_X(MUL);  				break; -			case BPF_S_ALU_MUL_K:	/* A *= K */ +			case BPF_ALU | BPF_MUL | BPF_K:	/* A *= K */  				emit_alu_K(MUL, K);  				break; -			case BPF_S_ALU_DIV_K:	/* A /= K */ -				emit_alu_K(MUL, K); -				emit_read_y(r_A); +			case BPF_ALU | BPF_DIV | BPF_K:	/* A /= K with K != 0*/ +				if (K == 1) +					break; +				emit_write_y(G0); +#ifdef CONFIG_SPARC32 +				/* The Sparc v8 architecture requires +				 * three instructions between a %y +				 * register write and the first use. +				 */ +				emit_nop(); +				emit_nop(); +				emit_nop(); +#endif +				emit_alu_K(DIV, K);  				break; -			case BPF_S_ALU_DIV_X:	/* A /= X; */ +			case BPF_ALU | BPF_DIV | BPF_X:	/* A /= X; */  				emit_cmpi(r_X, 0);  				if (pc_ret0 > 0) {  					t_offset = addrs[pc_ret0 - 1]; @@ -533,10 +536,10 @@ void bpf_jit_compile(struct sk_filter *fp)  #endif  				emit_alu_X(DIV);  				break; -			case BPF_S_ALU_NEG: +			case BPF_ALU | BPF_NEG:  				emit_neg();  				break; -			case BPF_S_RET_K: +			case BPF_RET | BPF_K:  				if (!K) {  					if (pc_ret0 == -1)  						pc_ret0 = i; @@ -545,7 +548,7 @@ void bpf_jit_compile(struct sk_filter *fp)  					emit_loadimm(K, r_A);  				}  				/* Fallthrough */ -			case BPF_S_RET_A: +			case BPF_RET | BPF_A:  				if (seen_or_pass0) {  					if (i != flen - 1) {  						emit_jump(cleanup_addr); @@ -562,18 +565,18 @@ void bpf_jit_compile(struct sk_filter *fp)  				emit_jmpl(r_saved_O7, 8, G0);  				emit_reg_move(r_A, O0); /* delay slot */  				break; -			case BPF_S_MISC_TAX: +			case BPF_MISC | BPF_TAX:  				seen |= SEEN_XREG;  				emit_reg_move(r_A, r_X);  				break; -			case BPF_S_MISC_TXA: +			case BPF_MISC | BPF_TXA:  				seen |= SEEN_XREG;  				emit_reg_move(r_X, r_A);  				break; -			case BPF_S_ANC_CPU: +			case BPF_ANC | SKF_AD_CPU:  				emit_load_cpu(r_A);  				break; -			case BPF_S_ANC_PROTOCOL: +			case BPF_ANC | SKF_AD_PROTOCOL:  				emit_skb_load16(protocol, r_A);  				break;  #if 0 @@ -581,38 +584,38 @@ void bpf_jit_compile(struct sk_filter *fp)  				 * a bit field even though we very much  				 * know what we are doing here.  				 */ -			case BPF_S_ANC_PKTTYPE: +			case BPF_ANC | SKF_AD_PKTTYPE:  				__emit_skb_load8(pkt_type, r_A);  				emit_alu_K(SRL, 5);  				break;  #endif -			case BPF_S_ANC_IFINDEX: +			case BPF_ANC | SKF_AD_IFINDEX:  				emit_skb_loadptr(dev, r_A);  				emit_cmpi(r_A, 0); -				emit_branch(BNE_PTR, cleanup_addr + 4); +				emit_branch(BE_PTR, cleanup_addr + 4);  				emit_nop();  				emit_load32(r_A, struct net_device, ifindex, r_A);  				break; -			case BPF_S_ANC_MARK: +			case BPF_ANC | SKF_AD_MARK:  				emit_skb_load32(mark, r_A);  				break; -			case BPF_S_ANC_QUEUE: +			case BPF_ANC | SKF_AD_QUEUE:  				emit_skb_load16(queue_mapping, r_A);  				break; -			case BPF_S_ANC_HATYPE: +			case BPF_ANC | SKF_AD_HATYPE:  				emit_skb_loadptr(dev, r_A);  				emit_cmpi(r_A, 0); -				emit_branch(BNE_PTR, cleanup_addr + 4); +				emit_branch(BE_PTR, cleanup_addr + 4);  				emit_nop();  				emit_load16(r_A, struct net_device, type, r_A);  				break; -			case BPF_S_ANC_RXHASH: -				emit_skb_load32(rxhash, r_A); +			case BPF_ANC | SKF_AD_RXHASH: +				emit_skb_load32(hash, r_A);  				break; -			case BPF_S_ANC_VLAN_TAG: -			case BPF_S_ANC_VLAN_TAG_PRESENT: +			case BPF_ANC | SKF_AD_VLAN_TAG: +			case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT:  				emit_skb_load16(vlan_tci, r_A); -				if (filter[i].code == BPF_S_ANC_VLAN_TAG) { +				if (code == (BPF_ANC | SKF_AD_VLAN_TAG)) {  					emit_andi(r_A, VLAN_VID_MASK, r_A);  				} else {  					emit_loadimm(VLAN_TAG_PRESENT, r_TMP); @@ -620,44 +623,44 @@ void bpf_jit_compile(struct sk_filter *fp)  				}  				break; -			case BPF_S_LD_IMM: +			case BPF_LD | BPF_IMM:  				emit_loadimm(K, r_A);  				break; -			case BPF_S_LDX_IMM: +			case BPF_LDX | BPF_IMM:  				emit_loadimm(K, r_X);  				break; -			case BPF_S_LD_MEM: +			case BPF_LD | BPF_MEM:  				emit_ldmem(K * 4, r_A);  				break; -			case BPF_S_LDX_MEM: +			case BPF_LDX | BPF_MEM:  				emit_ldmem(K * 4, r_X);  				break; -			case BPF_S_ST: +			case BPF_ST:  				emit_stmem(K * 4, r_A);  				break; -			case BPF_S_STX: +			case BPF_STX:  				emit_stmem(K * 4, r_X);  				break;  #define CHOOSE_LOAD_FUNC(K, func) \  	((int)K < 0 ? ((int)K >= SKF_LL_OFF ? func##_negative_offset : func) : func##_positive_offset) -			case BPF_S_LD_W_ABS: +			case BPF_LD | BPF_W | BPF_ABS:  				func = CHOOSE_LOAD_FUNC(K, bpf_jit_load_word);  common_load:			seen |= SEEN_DATAREF;  				emit_loadimm(K, r_OFF);  				emit_call(func);  				break; -			case BPF_S_LD_H_ABS: +			case BPF_LD | BPF_H | BPF_ABS:  				func = CHOOSE_LOAD_FUNC(K, bpf_jit_load_half);  				goto common_load; -			case BPF_S_LD_B_ABS: +			case BPF_LD | BPF_B | BPF_ABS:  				func = CHOOSE_LOAD_FUNC(K, bpf_jit_load_byte);  				goto common_load; -			case BPF_S_LDX_B_MSH: +			case BPF_LDX | BPF_B | BPF_MSH:  				func = CHOOSE_LOAD_FUNC(K, bpf_jit_load_byte_msh);  				goto common_load; -			case BPF_S_LD_W_IND: +			case BPF_LD | BPF_W | BPF_IND:  				func = bpf_jit_load_word;  common_load_ind:		seen |= SEEN_DATAREF | SEEN_XREG;  				if (K) { @@ -672,13 +675,13 @@ common_load_ind:		seen |= SEEN_DATAREF | SEEN_XREG;  				}  				emit_call(func);  				break; -			case BPF_S_LD_H_IND: +			case BPF_LD | BPF_H | BPF_IND:  				func = bpf_jit_load_half;  				goto common_load_ind; -			case BPF_S_LD_B_IND: +			case BPF_LD | BPF_B | BPF_IND:  				func = bpf_jit_load_byte;  				goto common_load_ind; -			case BPF_S_JMP_JA: +			case BPF_JMP | BPF_JA:  				emit_jump(addrs[i + K]);  				emit_nop();  				break; @@ -689,14 +692,14 @@ common_load_ind:		seen |= SEEN_DATAREF | SEEN_XREG;  		f_op = FOP;		\  		goto cond_branch -			COND_SEL(BPF_S_JMP_JGT_K, BGU, BLEU); -			COND_SEL(BPF_S_JMP_JGE_K, BGEU, BLU); -			COND_SEL(BPF_S_JMP_JEQ_K, BE, BNE); -			COND_SEL(BPF_S_JMP_JSET_K, BNE, BE); -			COND_SEL(BPF_S_JMP_JGT_X, BGU, BLEU); -			COND_SEL(BPF_S_JMP_JGE_X, BGEU, BLU); -			COND_SEL(BPF_S_JMP_JEQ_X, BE, BNE); -			COND_SEL(BPF_S_JMP_JSET_X, BNE, BE); +			COND_SEL(BPF_JMP | BPF_JGT | BPF_K, BGU, BLEU); +			COND_SEL(BPF_JMP | BPF_JGE | BPF_K, BGEU, BLU); +			COND_SEL(BPF_JMP | BPF_JEQ | BPF_K, BE, BNE); +			COND_SEL(BPF_JMP | BPF_JSET | BPF_K, BNE, BE); +			COND_SEL(BPF_JMP | BPF_JGT | BPF_X, BGU, BLEU); +			COND_SEL(BPF_JMP | BPF_JGE | BPF_X, BGEU, BLU); +			COND_SEL(BPF_JMP | BPF_JEQ | BPF_X, BE, BNE); +			COND_SEL(BPF_JMP | BPF_JSET | BPF_X, BNE, BE);  cond_branch:			f_offset = addrs[i + filter[i].jf];  				t_offset = addrs[i + filter[i].jt]; @@ -708,20 +711,20 @@ cond_branch:			f_offset = addrs[i + filter[i].jf];  					break;  				} -				switch (filter[i].code) { -				case BPF_S_JMP_JGT_X: -				case BPF_S_JMP_JGE_X: -				case BPF_S_JMP_JEQ_X: +				switch (code) { +				case BPF_JMP | BPF_JGT | BPF_X: +				case BPF_JMP | BPF_JGE | BPF_X: +				case BPF_JMP | BPF_JEQ | BPF_X:  					seen |= SEEN_XREG;  					emit_cmp(r_A, r_X);  					break; -				case BPF_S_JMP_JSET_X: +				case BPF_JMP | BPF_JSET | BPF_X:  					seen |= SEEN_XREG;  					emit_btst(r_A, r_X);  					break; -				case BPF_S_JMP_JEQ_K: -				case BPF_S_JMP_JGT_K: -				case BPF_S_JMP_JGE_K: +				case BPF_JMP | BPF_JEQ | BPF_K: +				case BPF_JMP | BPF_JGT | BPF_K: +				case BPF_JMP | BPF_JGE | BPF_K:  					if (is_simm13(K)) {  						emit_cmpi(r_A, K);  					} else { @@ -729,7 +732,7 @@ cond_branch:			f_offset = addrs[i + filter[i].jf];  						emit_cmp(r_A, r_TMP);  					}  					break; -				case BPF_S_JMP_JSET_K: +				case BPF_JMP | BPF_JSET | BPF_K:  					if (is_simm13(K)) {  						emit_btsti(r_A, K);  					} else { @@ -798,6 +801,7 @@ cond_branch:			f_offset = addrs[i + filter[i].jf];  	if (image) {  		bpf_flush_icache(image, image + proglen);  		fp->bpf_func = (void *)image; +		fp->jited = 1;  	}  out:  	kfree(addrs); @@ -806,7 +810,7 @@ out:  void bpf_jit_free(struct sk_filter *fp)  { -	if (fp->bpf_func != sk_run_filter) +	if (fp->jited)  		module_free(NULL, fp->bpf_func);  	kfree(fp);  } diff --git a/arch/sparc/prom/misc_64.c b/arch/sparc/prom/misc_64.c index f178b9dcc7b..53a696d3eb3 100644 --- a/arch/sparc/prom/misc_64.c +++ b/arch/sparc/prom/misc_64.c @@ -81,11 +81,6 @@ void prom_feval(const char *fstring)  }  EXPORT_SYMBOL(prom_feval); -#ifdef CONFIG_SMP -extern void smp_capture(void); -extern void smp_release(void); -#endif -  /* Drop into the prom, with the chance to continue with the 'go'   * prom command.   */ diff --git a/arch/sparc/prom/p1275.c b/arch/sparc/prom/p1275.c index 04a4540509d..e58b8172631 100644 --- a/arch/sparc/prom/p1275.c +++ b/arch/sparc/prom/p1275.c @@ -5,7 +5,6 @@   */  #include <linux/kernel.h> -#include <linux/init.h>  #include <linux/sched.h>  #include <linux/smp.h>  #include <linux/string.h>  | 
