diff options
Diffstat (limited to 'arch/alpha')
197 files changed, 4311 insertions, 5650 deletions
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 943fe6930f7..b7ff9a318c3 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig @@ -1,13 +1,32 @@  config ALPHA  	bool  	default y +	select ARCH_MIGHT_HAVE_PC_PARPORT +	select ARCH_MIGHT_HAVE_PC_SERIO  	select HAVE_AOUT  	select HAVE_IDE  	select HAVE_OPROFILE -	select HAVE_SYSCALL_WRAPPERS -	select HAVE_IRQ_WORK +	select HAVE_PCSPKR_PLATFORM  	select HAVE_PERF_EVENTS  	select HAVE_DMA_ATTRS +	select VIRT_TO_BUS +	select GENERIC_IRQ_PROBE +	select AUTO_IRQ_AFFINITY if SMP +	select GENERIC_IRQ_SHOW +	select ARCH_WANT_OPTIONAL_GPIOLIB +	select ARCH_WANT_IPC_PARSE_VERSION +	select ARCH_HAVE_NMI_SAFE_CMPXCHG +	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE +	select AUDIT_ARCH +	select GENERIC_CLOCKEVENTS +	select GENERIC_SMP_IDLE_THREAD +	select GENERIC_STRNCPY_FROM_USER +	select GENERIC_STRNLEN_USER +	select HAVE_ARCH_AUDITSYSCALL +	select HAVE_MOD_ARCH_SPECIFIC +	select MODULES_USE_ELF_RELA +	select ODD_RT_SIGACTION +	select OLD_SIGSUSPEND  	help  	  The Alpha is a 64-bit general-purpose processor designed and  	  marketed by the Digital Equipment Corporation of blessed memory, @@ -36,17 +55,10 @@ config ARCH_HAS_ILOG2_U64  	bool  	default n -config GENERIC_FIND_NEXT_BIT -	bool -	default y -  config GENERIC_CALIBRATE_DELAY  	bool  	default y -config GENERIC_CMOS_UPDATE -        def_bool y -  config ZONE_DMA  	bool  	default y @@ -64,26 +76,11 @@ config GENERIC_ISA_DMA  	bool  	default y -config GENERIC_IOMAP -	bool -	default n - -config GENERIC_HARDIRQS -	bool -	default y - -config GENERIC_IRQ_PROBE -	bool -	default y - -config AUTO_IRQ_AFFINITY -	bool -	depends on SMP -	default y -  source "init/Kconfig"  source "kernel/Kconfig.freezer" +config AUDIT_ARCH +	bool  menu "System setup" @@ -131,6 +128,7 @@ choice  config ALPHA_GENERIC  	bool "Generic" +	depends on TTY  	help  	  A generic kernel will run on all supported Alpha hardware. @@ -326,6 +324,7 @@ config ISA_DMA_API  config PCI  	bool  	depends on !ALPHA_JENSEN +	select GENERIC_PCI_IOMAP  	default y  	help  	  Find out whether you have a PCI motherboard. PCI is the name of a @@ -452,11 +451,6 @@ config ALPHA_EV67  	  Is this a machine based on the EV67 core?  If in doubt, select N here  	  and the machine will be treated as an EV6. -config ALPHA_EV7 -	bool -	depends on ALPHA_MARVEL -	default y -  config ALPHA_MCPCIA  	bool  	depends on ALPHA_RAWHIDE @@ -492,15 +486,30 @@ config ALPHA_BROKEN_IRQ_MASK  config VGA_HOSE  	bool -	depends on ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL || ALPHA_TSUNAMI +	depends on VGA_CONSOLE && (ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL || ALPHA_TSUNAMI)  	default y  	help  	  Support VGA on an arbitrary hose; needed for several platforms  	  which always have multiple hoses, and whose consoles support it. +config ALPHA_QEMU +	bool "Run under QEMU emulation" +	depends on !ALPHA_GENERIC +	---help--- +	  Assume the presence of special features supported by QEMU PALcode +	  that reduce the overhead of system emulation. + +	  Generic kernels will auto-detect QEMU.  But when building a +	  system-specific kernel, the assumption is that we want to +	  elimiate as many runtime tests as possible. + +	  If unsure, say N. + +  config ALPHA_SRM  	bool "Use SRM as bootloader" if ALPHA_CABRIOLET || ALPHA_AVANTI_CH || ALPHA_EB64P || ALPHA_PC164 || ALPHA_TAKARA || ALPHA_EB164 || ALPHA_ALCOR || ALPHA_MIATA || ALPHA_LX164 || ALPHA_SX164 || ALPHA_NAUTILUS || ALPHA_NONAME +	depends on TTY  	default y if ALPHA_JENSEN || ALPHA_MIKASA || ALPHA_SABLE || ALPHA_LYNX || ALPHA_NORITAKE || ALPHA_DP264 || ALPHA_RAWHIDE || ALPHA_EIGER || ALPHA_WILDFIRE || ALPHA_TITAN || ALPHA_SHARK || ALPHA_MARVEL  	---help---  	  There are two different types of booting firmware on Alphas: SRM, @@ -533,16 +542,15 @@ config ARCH_MAY_HAVE_PC_FDC  config SMP  	bool "Symmetric multi-processing support"  	depends on ALPHA_SABLE || ALPHA_LYNX || ALPHA_RAWHIDE || ALPHA_DP264 || ALPHA_WILDFIRE || ALPHA_TITAN || ALPHA_GENERIC || ALPHA_SHARK || ALPHA_MARVEL -	select USE_GENERIC_SMP_HELPERS  	---help---  	  This enables support for systems with more than one CPU. If you have -	  a system with only one CPU, like most personal computers, say N. If -	  you have a system with more than one CPU, say Y. +	  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.  	  See also the SMP-HOWTO available at @@ -566,8 +574,7 @@ config NR_CPUS            with working support have a maximum of 4 CPUs.  config ARCH_DISCONTIGMEM_ENABLE -	bool "Discontiguous Memory Support (EXPERIMENTAL)" -	depends on EXPERIMENTAL +	bool "Discontiguous Memory Support"  	help  	  Say Y to support efficient handling of discontiguous physical memory,  	  for architectures which are either NUMA (Non-Uniform Memory Access) @@ -584,6 +591,30 @@ config NUMA  	  Access).  This option is for configuring high-end multiprocessor  	  server machines.  If in doubt, say N. +config ALPHA_WTINT +	bool "Use WTINT" if ALPHA_SRM || ALPHA_GENERIC +	default y if ALPHA_QEMU +	default n if ALPHA_EV5 || ALPHA_EV56 || (ALPHA_EV4 && !ALPHA_LCA) +	default n if !ALPHA_SRM && !ALPHA_GENERIC +	default y if SMP +	---help--- +	  The Wait for Interrupt (WTINT) PALcall attempts to place the CPU +	  to sleep until the next interrupt.  This may reduce the power +	  consumed, and the heat produced by the computer.  However, it has +	  the side effect of making the cycle counter unreliable as a timing +	  device across the sleep. + +	  For emulation under QEMU, definitely say Y here, as we have other +	  mechanisms for measuring time than the cycle counter. + +	  For EV4 (but not LCA), EV5 and EV56 systems, or for systems running +	  MILO, sleep mode is not supported so you might as well say N here. + +	  For SMP systems we cannot use the cycle counter for timing anyway, +	  so you might as well say Y here. + +	  If unsure, say N. +  config NODES_SHIFT  	int  	default "7" @@ -625,9 +656,41 @@ config VERBOSE_MCHECK_ON  	  Take the default (1) unless you want more control or more info. +choice +	prompt "Timer interrupt frequency (HZ)?" +	default HZ_128 if ALPHA_QEMU +	default HZ_1200 if ALPHA_RAWHIDE +	default HZ_1024 +	---help--- +	  The frequency at which timer interrupts occur.  A high frequency +	  minimizes latency, whereas a low frequency minimizes overhead of +	  process accounting.  The later effect is especially significant +	  when being run under QEMU. + +	  Note that some Alpha hardware cannot change the interrupt frequency +	  of the timer.  If unsure, say 1024 (or 1200 for Rawhide). + +	config HZ_32 +		bool "32 Hz" +	config HZ_64 +		bool "64 Hz" +	config HZ_128 +		bool "128 Hz" +	config HZ_256 +		bool "256 Hz" +	config HZ_1024 +		bool "1024 Hz" +	config HZ_1200 +		bool "1200 Hz" +endchoice +  config HZ -	int -	default 1200 if ALPHA_RAWHIDE +	int  +	default 32 if HZ_32 +	default 64 if HZ_64 +	default 128 if HZ_128 +	default 256 if HZ_256 +	default 1200 if HZ_1200  	default 1024  source "drivers/pci/Kconfig" diff --git a/arch/alpha/Makefile b/arch/alpha/Makefile index 4759fe751aa..2cc3cc519c5 100644 --- a/arch/alpha/Makefile +++ b/arch/alpha/Makefile @@ -12,7 +12,7 @@ NM := $(NM) -B  LDFLAGS_vmlinux	:= -static -N #-relax  CHECKFLAGS	+= -D__alpha__ -m64 -cflags-y	:= -pipe -mno-fp-regs -ffixed-8 -msmall-data +cflags-y	:= -pipe -mno-fp-regs -ffixed-8  cflags-y	+= $(call cc-option, -fno-jump-tables)  cpuflags-$(CONFIG_ALPHA_EV4)		:= -mcpu=ev4 diff --git a/arch/alpha/boot/bootp.c b/arch/alpha/boot/bootp.c index be61670d409..2a542a50655 100644 --- a/arch/alpha/boot/bootp.c +++ b/arch/alpha/boot/bootp.c @@ -13,7 +13,6 @@  #include <generated/utsrelease.h>  #include <linux/mm.h> -#include <asm/system.h>  #include <asm/console.h>  #include <asm/hwrpb.h>  #include <asm/pgtable.h> diff --git a/arch/alpha/boot/bootpz.c b/arch/alpha/boot/bootpz.c index c98865f2142..d6ad191698d 100644 --- a/arch/alpha/boot/bootpz.c +++ b/arch/alpha/boot/bootpz.c @@ -15,7 +15,6 @@  #include <generated/utsrelease.h>  #include <linux/mm.h> -#include <asm/system.h>  #include <asm/console.h>  #include <asm/hwrpb.h>  #include <asm/pgtable.h> diff --git a/arch/alpha/boot/head.S b/arch/alpha/boot/head.S index f3d98089b3d..8efb26686d4 100644 --- a/arch/alpha/boot/head.S +++ b/arch/alpha/boot/head.S @@ -4,7 +4,7 @@   * initial bootloader stuff..   */ -#include <asm/system.h> +#include <asm/pal.h>  	.set noreorder  	.globl	__start diff --git a/arch/alpha/boot/main.c b/arch/alpha/boot/main.c index ded57d9a80e..3baf2d1e908 100644 --- a/arch/alpha/boot/main.c +++ b/arch/alpha/boot/main.c @@ -11,7 +11,6 @@  #include <generated/utsrelease.h>  #include <linux/mm.h> -#include <asm/system.h>  #include <asm/console.h>  #include <asm/hwrpb.h>  #include <asm/pgtable.h> diff --git a/arch/alpha/include/asm/8253pit.h b/arch/alpha/include/asm/8253pit.h deleted file mode 100644 index a71c9c1455a..00000000000 --- a/arch/alpha/include/asm/8253pit.h +++ /dev/null @@ -1,3 +0,0 @@ -/* - * 8253/8254 Programmable Interval Timer - */ diff --git a/arch/alpha/include/asm/Kbuild b/arch/alpha/include/asm/Kbuild index e423defed91..96e54bed508 100644 --- a/arch/alpha/include/asm/Kbuild +++ b/arch/alpha/include/asm/Kbuild @@ -1,10 +1,9 @@ -include include/asm-generic/Kbuild.asm -header-y += compiler.h -header-y += console.h -header-y += fpu.h -header-y += gentrap.h -header-y += pal.h -header-y += reg.h -header-y += regdef.h -header-y += sysinfo.h + +generic-y += clkdev.h +generic-y += cputime.h +generic-y += exec.h +generic-y += hash.h +generic-y += mcs_spinlock.h +generic-y += preempt.h +generic-y += trace_clock.h diff --git a/arch/alpha/include/asm/a.out.h b/arch/alpha/include/asm/a.out.h index acdc681231c..9abbd245530 100644 --- a/arch/alpha/include/asm/a.out.h +++ b/arch/alpha/include/asm/a.out.h @@ -1,94 +1,8 @@  #ifndef __ALPHA_A_OUT_H__  #define __ALPHA_A_OUT_H__ -#include <linux/types.h> +#include <uapi/asm/a.out.h> -/* - * OSF/1 ECOFF header structs.  ECOFF files consist of: - * 	- a file header (struct filehdr), - *	- an a.out header (struct aouthdr), - *	- one or more section headers (struct scnhdr).  - *	  The filhdr's "f_nscns" field contains the - *	  number of section headers. - */ - -struct filehdr -{ -	/* OSF/1 "file" header */ -	__u16 f_magic, f_nscns; -	__u32 f_timdat; -	__u64 f_symptr; -	__u32 f_nsyms; -	__u16 f_opthdr, f_flags; -}; - -struct aouthdr -{ -	__u64 info;		/* after that it looks quite normal.. */ -	__u64 tsize; -	__u64 dsize; -	__u64 bsize; -	__u64 entry; -	__u64 text_start;	/* with a few additions that actually make sense */ -	__u64 data_start; -	__u64 bss_start; -	__u32 gprmask, fprmask;	/* bitmask of general & floating point regs used in binary */ -	__u64 gpvalue; -}; - -struct scnhdr -{ -	char	s_name[8]; -	__u64	s_paddr; -	__u64	s_vaddr; -	__u64	s_size; -	__u64	s_scnptr; -	__u64	s_relptr; -	__u64	s_lnnoptr; -	__u16	s_nreloc; -	__u16	s_nlnno; -	__u32	s_flags; -}; - -struct exec -{ -	/* OSF/1 "file" header */ -	struct filehdr		fh; -	struct aouthdr		ah; -}; - -/* - * Define's so that the kernel exec code can access the a.out header - * fields... - */ -#define	a_info		ah.info -#define	a_text		ah.tsize -#define a_data		ah.dsize -#define a_bss		ah.bsize -#define a_entry		ah.entry -#define a_textstart	ah.text_start -#define	a_datastart	ah.data_start -#define	a_bssstart	ah.bss_start -#define	a_gprmask	ah.gprmask -#define a_fprmask	ah.fprmask -#define a_gpvalue	ah.gpvalue - -#define N_TXTADDR(x) ((x).a_textstart) -#define N_DATADDR(x) ((x).a_datastart) -#define N_BSSADDR(x) ((x).a_bssstart) -#define N_DRSIZE(x) 0 -#define N_TRSIZE(x) 0 -#define N_SYMSIZE(x) 0 - -#define AOUTHSZ		sizeof(struct aouthdr) -#define SCNHSZ		sizeof(struct scnhdr) -#define SCNROUND	16 - -#define N_TXTOFF(x) \ -  ((long) N_MAGIC(x) == ZMAGIC ? 0 : \ -   (sizeof(struct exec) + (x).fh.f_nscns*SCNHSZ + SCNROUND - 1) & ~(SCNROUND - 1)) - -#ifdef __KERNEL__  /* Assume that start addresses below 4G belong to a TASO application.     Unfortunately, there is no proper bit in the exec header to check. @@ -98,5 +12,4 @@ struct exec  	set_personality (((BFPM->taso || EX.ah.entry < 0x100000000L \  			   ? ADDR_LIMIT_32BIT : 0) | PER_OSF4)) -#endif /* __KERNEL__ */  #endif /* __A_OUT_GNU_H__ */ diff --git a/arch/alpha/include/asm/atomic.h b/arch/alpha/include/asm/atomic.h index e756d04b6cd..ed60a1ee1ed 100644 --- a/arch/alpha/include/asm/atomic.h +++ b/arch/alpha/include/asm/atomic.h @@ -3,7 +3,7 @@  #include <linux/types.h>  #include <asm/barrier.h> -#include <asm/system.h> +#include <asm/cmpxchg.h>  /*   * Atomic operations that C can't guarantee us.  Useful for @@ -14,8 +14,8 @@   */ -#define ATOMIC_INIT(i)		( (atomic_t) { (i) } ) -#define ATOMIC64_INIT(i)	( (atomic64_t) { (i) } ) +#define ATOMIC_INIT(i)		{ (i) } +#define ATOMIC64_INIT(i)	{ (i) }  #define atomic_read(v)		(*(volatile int *)&(v)->counter)  #define atomic64_read(v)	(*(volatile long *)&(v)->counter) @@ -176,30 +176,36 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v)  #define atomic_xchg(v, new) (xchg(&((v)->counter), new))  /** - * atomic_add_unless - add unless the number is a given value + * __atomic_add_unless - add unless the number is a given value   * @v: pointer of type atomic_t   * @a: the amount to add to v...   * @u: ...unless v is equal to u.   *   * Atomically adds @a to @v, so long as it was not @u. - * Returns non-zero if @v was not @u, and zero otherwise. + * Returns the old value of @v.   */ -static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) +static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u)  { -	int c, old; -	c = atomic_read(v); -	for (;;) { -		if (unlikely(c == (u))) -			break; -		old = atomic_cmpxchg((v), c, c + (a)); -		if (likely(old == c)) -			break; -		c = old; -	} -	return c != (u); +	int c, new, old; +	smp_mb(); +	__asm__ __volatile__( +	"1:	ldl_l	%[old],%[mem]\n" +	"	cmpeq	%[old],%[u],%[c]\n" +	"	addl	%[old],%[a],%[new]\n" +	"	bne	%[c],2f\n" +	"	stl_c	%[new],%[mem]\n" +	"	beq	%[new],3f\n" +	"2:\n" +	".subsection 2\n" +	"3:	br	1b\n" +	".previous" +	: [old] "=&r"(old), [new] "=&r"(new), [c] "=&r"(c) +	: [mem] "m"(*v), [a] "rI"(a), [u] "rI"((long)u) +	: "memory"); +	smp_mb(); +	return old;  } -#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)  /**   * atomic64_add_unless - add unless the number is a given value @@ -208,21 +214,56 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)   * @u: ...unless v is equal to u.   *   * Atomically adds @a to @v, so long as it was not @u. - * Returns non-zero if @v was not @u, and zero otherwise. + * Returns true iff @v was not @u.   */  static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)  { -	long c, old; -	c = atomic64_read(v); -	for (;;) { -		if (unlikely(c == (u))) -			break; -		old = atomic64_cmpxchg((v), c, c + (a)); -		if (likely(old == c)) -			break; -		c = old; -	} -	return c != (u); +	long c, tmp; +	smp_mb(); +	__asm__ __volatile__( +	"1:	ldq_l	%[tmp],%[mem]\n" +	"	cmpeq	%[tmp],%[u],%[c]\n" +	"	addq	%[tmp],%[a],%[tmp]\n" +	"	bne	%[c],2f\n" +	"	stq_c	%[tmp],%[mem]\n" +	"	beq	%[tmp],3f\n" +	"2:\n" +	".subsection 2\n" +	"3:	br	1b\n" +	".previous" +	: [tmp] "=&r"(tmp), [c] "=&r"(c) +	: [mem] "m"(*v), [a] "rI"(a), [u] "rI"(u) +	: "memory"); +	smp_mb(); +	return !c; +} + +/* + * atomic64_dec_if_positive - decrement by 1 if old value positive + * @v: pointer of type atomic_t + * + * The function returns the old value of *v minus 1, even if + * the atomic variable, v, was not decremented. + */ +static inline long atomic64_dec_if_positive(atomic64_t *v) +{ +	long old, tmp; +	smp_mb(); +	__asm__ __volatile__( +	"1:	ldq_l	%[old],%[mem]\n" +	"	subq	%[old],1,%[tmp]\n" +	"	ble	%[old],2f\n" +	"	stq_c	%[tmp],%[mem]\n" +	"	beq	%[tmp],3f\n" +	"2:\n" +	".subsection 2\n" +	"3:	br	1b\n" +	".previous" +	: [old] "=&r"(old), [tmp] "=&r"(tmp) +	: [mem] "m"(*v) +	: "memory"); +	smp_mb(); +	return old - 1;  }  #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) @@ -251,10 +292,4 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)  #define atomic_dec(v) atomic_sub(1,(v))  #define atomic64_dec(v) atomic64_sub(1,(v)) -#define smp_mb__before_atomic_dec()	smp_mb() -#define smp_mb__after_atomic_dec()	smp_mb() -#define smp_mb__before_atomic_inc()	smp_mb() -#define smp_mb__after_atomic_inc()	smp_mb() - -#include <asm-generic/atomic-long.h>  #endif /* _ALPHA_ATOMIC_H */ diff --git a/arch/alpha/include/asm/barrier.h b/arch/alpha/include/asm/barrier.h index ce8860a0b32..3832bdb794f 100644 --- a/arch/alpha/include/asm/barrier.h +++ b/arch/alpha/include/asm/barrier.h @@ -3,33 +3,18 @@  #include <asm/compiler.h> -#define mb() \ -__asm__ __volatile__("mb": : :"memory") +#define mb()	__asm__ __volatile__("mb": : :"memory") +#define rmb()	__asm__ __volatile__("mb": : :"memory") +#define wmb()	__asm__ __volatile__("wmb": : :"memory") -#define rmb() \ -__asm__ __volatile__("mb": : :"memory") - -#define wmb() \ -__asm__ __volatile__("wmb": : :"memory") - -#define read_barrier_depends() \ -__asm__ __volatile__("mb": : :"memory") +#define read_barrier_depends() __asm__ __volatile__("mb": : :"memory")  #ifdef CONFIG_SMP  #define __ASM_SMP_MB	"\tmb\n" -#define smp_mb()	mb() -#define smp_rmb()	rmb() -#define smp_wmb()	wmb() -#define smp_read_barrier_depends()	read_barrier_depends()  #else  #define __ASM_SMP_MB -#define smp_mb()	barrier() -#define smp_rmb()	barrier() -#define smp_wmb()	barrier() -#define smp_read_barrier_depends()	do { } while (0)  #endif -#define set_mb(var, value) \ -do { var = value; mb(); } while (0) +#include <asm-generic/barrier.h>  #endif		/* __BARRIER_H */ diff --git a/arch/alpha/include/asm/bitops.h b/arch/alpha/include/asm/bitops.h index adfab8a21df..4bdfbd444e6 100644 --- a/arch/alpha/include/asm/bitops.h +++ b/arch/alpha/include/asm/bitops.h @@ -53,9 +53,6 @@ __set_bit(unsigned long nr, volatile void * addr)  	*m |= 1 << (nr & 31);  } -#define smp_mb__before_clear_bit()	smp_mb() -#define smp_mb__after_clear_bit()	smp_mb() -  static inline void  clear_bit(unsigned long nr, volatile void * addr)  { @@ -454,12 +451,9 @@ sched_find_first_bit(const unsigned long b[2])  	return __ffs(tmp) + ofs;  } -#include <asm-generic/bitops/ext2-non-atomic.h> - -#define ext2_set_bit_atomic(l,n,a)   test_and_set_bit(n,a) -#define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a) +#include <asm-generic/bitops/le.h> -#include <asm-generic/bitops/minix.h> +#include <asm-generic/bitops/ext2-atomic-setbit.h>  #endif /* __KERNEL__ */ diff --git a/arch/alpha/include/asm/cacheflush.h b/arch/alpha/include/asm/cacheflush.h index 012f1243b1c..a9cb6aa447a 100644 --- a/arch/alpha/include/asm/cacheflush.h +++ b/arch/alpha/include/asm/cacheflush.h @@ -63,7 +63,7 @@ extern void flush_icache_user_range(struct vm_area_struct *vma,  		struct page *page, unsigned long addr, int len);  #endif -/* This is used only in do_no_page and do_swap_page.  */ +/* This is used only in __do_fault and do_swap_page.  */  #define flush_icache_page(vma, page) \    flush_icache_user_range((vma), (page), 0, 0) diff --git a/arch/alpha/include/asm/cmpxchg.h b/arch/alpha/include/asm/cmpxchg.h new file mode 100644 index 00000000000..429e8cd0d78 --- /dev/null +++ b/arch/alpha/include/asm/cmpxchg.h @@ -0,0 +1,71 @@ +#ifndef _ALPHA_CMPXCHG_H +#define _ALPHA_CMPXCHG_H + +/* + * Atomic exchange routines. + */ + +#define __ASM__MB +#define ____xchg(type, args...)		__xchg ## type ## _local(args) +#define ____cmpxchg(type, args...)	__cmpxchg ## type ## _local(args) +#include <asm/xchg.h> + +#define xchg_local(ptr, x)						\ +({									\ +	__typeof__(*(ptr)) _x_ = (x);					\ +	(__typeof__(*(ptr))) __xchg_local((ptr), (unsigned long)_x_,	\ +				       sizeof(*(ptr)));			\ +}) + +#define cmpxchg_local(ptr, o, n)					\ +({									\ +	__typeof__(*(ptr)) _o_ = (o);					\ +	__typeof__(*(ptr)) _n_ = (n);					\ +	(__typeof__(*(ptr))) __cmpxchg_local((ptr), (unsigned long)_o_,	\ +					  (unsigned long)_n_,		\ +					  sizeof(*(ptr)));		\ +}) + +#define cmpxchg64_local(ptr, o, n)					\ +({									\ +	BUILD_BUG_ON(sizeof(*(ptr)) != 8);				\ +	cmpxchg_local((ptr), (o), (n));					\ +}) + +#ifdef CONFIG_SMP +#undef __ASM__MB +#define __ASM__MB	"\tmb\n" +#endif +#undef ____xchg +#undef ____cmpxchg +#define ____xchg(type, args...)		__xchg ##type(args) +#define ____cmpxchg(type, args...)	__cmpxchg ##type(args) +#include <asm/xchg.h> + +#define xchg(ptr, x)							\ +({									\ +	__typeof__(*(ptr)) _x_ = (x);					\ +	(__typeof__(*(ptr))) __xchg((ptr), (unsigned long)_x_,		\ +				 sizeof(*(ptr)));			\ +}) + +#define cmpxchg(ptr, o, n)						\ +({									\ +	__typeof__(*(ptr)) _o_ = (o);					\ +	__typeof__(*(ptr)) _n_ = (n);					\ +	(__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,	\ +				    (unsigned long)_n_,	sizeof(*(ptr)));\ +}) + +#define cmpxchg64(ptr, o, n)						\ +({									\ +	BUILD_BUG_ON(sizeof(*(ptr)) != 8);				\ +	cmpxchg((ptr), (o), (n));					\ +}) + +#undef __ASM__MB +#undef ____cmpxchg + +#define __HAVE_ARCH_CMPXCHG 1 + +#endif /* _ALPHA_CMPXCHG_H */ diff --git a/arch/alpha/include/asm/compiler.h b/arch/alpha/include/asm/compiler.h index da6bb199839..a7720b96bcc 100644 --- a/arch/alpha/include/asm/compiler.h +++ b/arch/alpha/include/asm/compiler.h @@ -1,119 +1,8 @@  #ifndef __ALPHA_COMPILER_H  #define __ALPHA_COMPILER_H -/*  - * Herein are macros we use when describing various patterns we want to GCC. - * In all cases we can get better schedules out of the compiler if we hide - * as little as possible inside inline assembly.  However, we want to be - * able to know what we'll get out before giving up inline assembly.  Thus - * these tests and macros. - */ +#include <uapi/asm/compiler.h> -#if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3 -# define __kernel_insbl(val, shift)	__builtin_alpha_insbl(val, shift) -# define __kernel_inswl(val, shift)	__builtin_alpha_inswl(val, shift) -# define __kernel_insql(val, shift)	__builtin_alpha_insql(val, shift) -# define __kernel_inslh(val, shift)	__builtin_alpha_inslh(val, shift) -# define __kernel_extbl(val, shift)	__builtin_alpha_extbl(val, shift) -# define __kernel_extwl(val, shift)	__builtin_alpha_extwl(val, shift) -# define __kernel_cmpbge(a, b)		__builtin_alpha_cmpbge(a, b) -#else -# define __kernel_insbl(val, shift)					\ -  ({ unsigned long __kir;						\ -     __asm__("insbl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));	\ -     __kir; }) -# define __kernel_inswl(val, shift)					\ -  ({ unsigned long __kir;						\ -     __asm__("inswl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));	\ -     __kir; }) -# define __kernel_insql(val, shift)					\ -  ({ unsigned long __kir;						\ -     __asm__("insql %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));	\ -     __kir; }) -# define __kernel_inslh(val, shift)					\ -  ({ unsigned long __kir;						\ -     __asm__("inslh %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));	\ -     __kir; }) -# define __kernel_extbl(val, shift)					\ -  ({ unsigned long __kir;						\ -     __asm__("extbl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));	\ -     __kir; }) -# define __kernel_extwl(val, shift)					\ -  ({ unsigned long __kir;						\ -     __asm__("extwl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));	\ -     __kir; }) -# define __kernel_cmpbge(a, b)						\ -  ({ unsigned long __kir;						\ -     __asm__("cmpbge %r2,%1,%0" : "=r"(__kir) : "rI"(b), "rJ"(a));	\ -     __kir; }) -#endif - -#ifdef __alpha_cix__ -# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3 -#  define __kernel_cttz(x)		__builtin_ctzl(x) -#  define __kernel_ctlz(x)		__builtin_clzl(x) -#  define __kernel_ctpop(x)		__builtin_popcountl(x) -# else -#  define __kernel_cttz(x)						\ -   ({ unsigned long __kir;						\ -      __asm__("cttz %1,%0" : "=r"(__kir) : "r"(x));			\ -      __kir; }) -#  define __kernel_ctlz(x)						\ -   ({ unsigned long __kir;						\ -      __asm__("ctlz %1,%0" : "=r"(__kir) : "r"(x));			\ -      __kir; }) -#  define __kernel_ctpop(x)						\ -   ({ unsigned long __kir;						\ -      __asm__("ctpop %1,%0" : "=r"(__kir) : "r"(x));			\ -      __kir; }) -# endif -#else -# define __kernel_cttz(x)						\ -  ({ unsigned long __kir;						\ -     __asm__(".arch ev67; cttz %1,%0" : "=r"(__kir) : "r"(x));		\ -     __kir; }) -# define __kernel_ctlz(x)						\ -  ({ unsigned long __kir;						\ -     __asm__(".arch ev67; ctlz %1,%0" : "=r"(__kir) : "r"(x));		\ -     __kir; }) -# define __kernel_ctpop(x)						\ -  ({ unsigned long __kir;						\ -     __asm__(".arch ev67; ctpop %1,%0" : "=r"(__kir) : "r"(x));		\ -     __kir; }) -#endif - - -/*  - * Beginning with EGCS 1.1, GCC defines __alpha_bwx__ when the BWX  - * extension is enabled.  Previous versions did not define anything - * we could test during compilation -- too bad, so sad. - */ - -#if defined(__alpha_bwx__) -#define __kernel_ldbu(mem)	(mem) -#define __kernel_ldwu(mem)	(mem) -#define __kernel_stb(val,mem)	((mem) = (val)) -#define __kernel_stw(val,mem)	((mem) = (val)) -#else -#define __kernel_ldbu(mem)				\ -  ({ unsigned char __kir;				\ -     __asm__(".arch ev56;				\ -	      ldbu %0,%1" : "=r"(__kir) : "m"(mem));	\ -     __kir; }) -#define __kernel_ldwu(mem)				\ -  ({ unsigned short __kir;				\ -     __asm__(".arch ev56;				\ -	      ldwu %0,%1" : "=r"(__kir) : "m"(mem));	\ -     __kir; }) -#define __kernel_stb(val,mem)				\ -  __asm__(".arch ev56;					\ -	   stb %1,%0" : "=m"(mem) : "r"(val)) -#define __kernel_stw(val,mem)				\ -  __asm__(".arch ev56;					\ -	   stw %1,%0" : "=m"(mem) : "r"(val)) -#endif - -#ifdef __KERNEL__  /* Some idiots over in <linux/compiler.h> thought inline should imply     always_inline.  This breaks stuff.  We'll include this file whenever     we run into such problems.  */ @@ -125,6 +14,4 @@  #undef __always_inline  #define __always_inline		inline __attribute__((always_inline)) -#endif /* __KERNEL__ */ -  #endif /* __ALPHA_COMPILER_H */ diff --git a/arch/alpha/include/asm/console.h b/arch/alpha/include/asm/console.h index a3ce4e62249..f2b584fe099 100644 --- a/arch/alpha/include/asm/console.h +++ b/arch/alpha/include/asm/console.h @@ -1,52 +1,8 @@  #ifndef __AXP_CONSOLE_H  #define __AXP_CONSOLE_H -/* - * Console callback routine numbers - */ -#define CCB_GETC		0x01 -#define CCB_PUTS		0x02 -#define CCB_RESET_TERM		0x03 -#define CCB_SET_TERM_INT	0x04 -#define CCB_SET_TERM_CTL	0x05 -#define CCB_PROCESS_KEYCODE	0x06 -#define CCB_OPEN_CONSOLE	0x07 -#define CCB_CLOSE_CONSOLE	0x08 +#include <uapi/asm/console.h> -#define CCB_OPEN		0x10 -#define CCB_CLOSE		0x11 -#define CCB_IOCTL		0x12 -#define CCB_READ		0x13 -#define CCB_WRITE		0x14 - -#define CCB_SET_ENV		0x20 -#define CCB_RESET_ENV		0x21 -#define CCB_GET_ENV		0x22 -#define CCB_SAVE_ENV		0x23 - -#define CCB_PSWITCH		0x30 -#define CCB_BIOS_EMUL		0x32 - -/* - * Environment variable numbers - */ -#define ENV_AUTO_ACTION		0x01 -#define ENV_BOOT_DEV		0x02 -#define ENV_BOOTDEF_DEV		0x03 -#define ENV_BOOTED_DEV		0x04 -#define ENV_BOOT_FILE		0x05 -#define ENV_BOOTED_FILE		0x06 -#define ENV_BOOT_OSFLAGS	0x07 -#define ENV_BOOTED_OSFLAGS	0x08 -#define ENV_BOOT_RESET		0x09 -#define ENV_DUMP_DEV		0x0A -#define ENV_ENABLE_AUDIT	0x0B -#define ENV_LICENSE		0x0C -#define ENV_CHAR_SET		0x0D -#define ENV_LANGUAGE		0x0E -#define ENV_TTY_DEV		0x0F - -#ifdef __KERNEL__  #ifndef __ASSEMBLY__  extern long callback_puts(long unit, const char *s, long length);  extern long callback_getc(long unit); @@ -70,6 +26,4 @@ struct hwrpb_struct;  extern int callback_init_done;  extern void * callback_init(void *);  #endif /* __ASSEMBLY__ */ -#endif /* __KERNEL__ */ -  #endif /* __AXP_CONSOLE_H */ diff --git a/arch/alpha/include/asm/core_lca.h b/arch/alpha/include/asm/core_lca.h index f7cb4b46095..8ee6c516279 100644 --- a/arch/alpha/include/asm/core_lca.h +++ b/arch/alpha/include/asm/core_lca.h @@ -1,8 +1,8 @@  #ifndef __ALPHA_LCA__H__  #define __ALPHA_LCA__H__ -#include <asm/system.h>  #include <asm/compiler.h> +#include <asm/mce.h>  /*   * Low Cost Alpha (LCA) definitions (these apply to 21066 and 21068, diff --git a/arch/alpha/include/asm/core_mcpcia.h b/arch/alpha/include/asm/core_mcpcia.h index 9f67a056b46..ad44bef29fb 100644 --- a/arch/alpha/include/asm/core_mcpcia.h +++ b/arch/alpha/include/asm/core_mcpcia.h @@ -7,6 +7,7 @@  #include <linux/types.h>  #include <asm/compiler.h> +#include <asm/mce.h>  /*   * MCPCIA is the internal name for a core logic chipset which provides diff --git a/arch/alpha/include/asm/core_t2.h b/arch/alpha/include/asm/core_t2.h index 91b46801b29..ade9d92e68b 100644 --- a/arch/alpha/include/asm/core_t2.h +++ b/arch/alpha/include/asm/core_t2.h @@ -7,7 +7,6 @@  #include <linux/types.h>  #include <linux/spinlock.h>  #include <asm/compiler.h> -#include <asm/system.h>  /*   * T2 is the internal name for the core logic chipset which provides diff --git a/arch/alpha/include/asm/cputime.h b/arch/alpha/include/asm/cputime.h deleted file mode 100644 index 19577fd9323..00000000000 --- a/arch/alpha/include/asm/cputime.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __ALPHA_CPUTIME_H -#define __ALPHA_CPUTIME_H - -#include <asm-generic/cputime.h> - -#endif /* __ALPHA_CPUTIME_H */ diff --git a/arch/alpha/include/asm/dma-mapping.h b/arch/alpha/include/asm/dma-mapping.h index 4567aca6fdd..dfa32f06132 100644 --- a/arch/alpha/include/asm/dma-mapping.h +++ b/arch/alpha/include/asm/dma-mapping.h @@ -12,16 +12,22 @@ static inline struct dma_map_ops *get_dma_ops(struct device *dev)  #include <asm-generic/dma-mapping-common.h> -static inline void *dma_alloc_coherent(struct device *dev, size_t size, -				       dma_addr_t *dma_handle, gfp_t gfp) +#define dma_alloc_coherent(d,s,h,f)	dma_alloc_attrs(d,s,h,f,NULL) + +static inline void *dma_alloc_attrs(struct device *dev, size_t size, +				    dma_addr_t *dma_handle, gfp_t gfp, +				    struct dma_attrs *attrs)  { -	return get_dma_ops(dev)->alloc_coherent(dev, size, dma_handle, gfp); +	return get_dma_ops(dev)->alloc(dev, size, dma_handle, gfp, attrs);  } -static inline void dma_free_coherent(struct device *dev, size_t size, -				     void *vaddr, dma_addr_t dma_handle) +#define dma_free_coherent(d,s,c,h) dma_free_attrs(d,s,c,h,NULL) + +static inline void dma_free_attrs(struct device *dev, size_t size, +				  void *vaddr, dma_addr_t dma_handle, +				  struct dma_attrs *attrs)  { -	get_dma_ops(dev)->free_coherent(dev, size, vaddr, dma_handle); +	get_dma_ops(dev)->free(dev, size, vaddr, dma_handle, attrs);  }  static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) diff --git a/arch/alpha/include/asm/elf.h b/arch/alpha/include/asm/elf.h index 9baae8afe8a..968d9991f5e 100644 --- a/arch/alpha/include/asm/elf.h +++ b/arch/alpha/include/asm/elf.h @@ -2,6 +2,7 @@  #define __ASM_ALPHA_ELF_H  #include <asm/auxvec.h> +#include <asm/special_insns.h>  /* Special values for the st_other field in the symbol table.  */ @@ -101,7 +102,7 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];  #define ELF_PLAT_INIT(_r, load_addr)	_r->r0 = 0 -/* The registers are layed out in pt_regs for PAL and syscall +/* The registers are laid out in pt_regs for PAL and syscall     convenience.  Re-order them for the linear elf_gregset_t.  */  struct pt_regs; diff --git a/arch/alpha/include/asm/floppy.h b/arch/alpha/include/asm/floppy.h index 0be50413b2b..bae97eb19d2 100644 --- a/arch/alpha/include/asm/floppy.h +++ b/arch/alpha/include/asm/floppy.h @@ -26,8 +26,8 @@  #define fd_disable_irq()        disable_irq(FLOPPY_IRQ)  #define fd_cacheflush(addr,size) /* nothing */  #define fd_request_irq()        request_irq(FLOPPY_IRQ, floppy_interrupt,\ -					    IRQF_DISABLED, "floppy", NULL) -#define fd_free_irq()           free_irq(FLOPPY_IRQ, NULL); +					    0, "floppy", NULL) +#define fd_free_irq()           free_irq(FLOPPY_IRQ, NULL)  #ifdef CONFIG_PCI diff --git a/arch/alpha/include/asm/fpu.h b/arch/alpha/include/asm/fpu.h index ecb17a72acc..71c20956b90 100644 --- a/arch/alpha/include/asm/fpu.h +++ b/arch/alpha/include/asm/fpu.h @@ -1,124 +1,8 @@  #ifndef __ASM_ALPHA_FPU_H  #define __ASM_ALPHA_FPU_H -/* - * Alpha floating-point control register defines: - */ -#define FPCR_DNOD	(1UL<<47)	/* denorm INV trap disable */ -#define FPCR_DNZ	(1UL<<48)	/* denorms to zero */ -#define FPCR_INVD	(1UL<<49)	/* invalid op disable (opt.) */ -#define FPCR_DZED	(1UL<<50)	/* division by zero disable (opt.) */ -#define FPCR_OVFD	(1UL<<51)	/* overflow disable (optional) */ -#define FPCR_INV	(1UL<<52)	/* invalid operation */ -#define FPCR_DZE	(1UL<<53)	/* division by zero */ -#define FPCR_OVF	(1UL<<54)	/* overflow */ -#define FPCR_UNF	(1UL<<55)	/* underflow */ -#define FPCR_INE	(1UL<<56)	/* inexact */ -#define FPCR_IOV	(1UL<<57)	/* integer overflow */ -#define FPCR_UNDZ	(1UL<<60)	/* underflow to zero (opt.) */ -#define FPCR_UNFD	(1UL<<61)	/* underflow disable (opt.) */ -#define FPCR_INED	(1UL<<62)	/* inexact disable (opt.) */ -#define FPCR_SUM	(1UL<<63)	/* summary bit */ - -#define FPCR_DYN_SHIFT	58		/* first dynamic rounding mode bit */ -#define FPCR_DYN_CHOPPED (0x0UL << FPCR_DYN_SHIFT)	/* towards 0 */ -#define FPCR_DYN_MINUS	 (0x1UL << FPCR_DYN_SHIFT)	/* towards -INF */ -#define FPCR_DYN_NORMAL	 (0x2UL << FPCR_DYN_SHIFT)	/* towards nearest */ -#define FPCR_DYN_PLUS	 (0x3UL << FPCR_DYN_SHIFT)	/* towards +INF */ -#define FPCR_DYN_MASK	 (0x3UL << FPCR_DYN_SHIFT) - -#define FPCR_MASK	0xffff800000000000L - -/* - * IEEE trap enables are implemented in software.  These per-thread - * bits are stored in the "ieee_state" field of "struct thread_info". - * Thus, the bits are defined so as not to conflict with the - * floating-point enable bit (which is architected).  On top of that, - * we want to make these bits compatible with OSF/1 so - * ieee_set_fp_control() etc. can be implemented easily and - * compatibly.  The corresponding definitions are in - * /usr/include/machine/fpu.h under OSF/1. - */ -#define IEEE_TRAP_ENABLE_INV	(1UL<<1)	/* invalid op */ -#define IEEE_TRAP_ENABLE_DZE	(1UL<<2)	/* division by zero */ -#define IEEE_TRAP_ENABLE_OVF	(1UL<<3)	/* overflow */ -#define IEEE_TRAP_ENABLE_UNF	(1UL<<4)	/* underflow */ -#define IEEE_TRAP_ENABLE_INE	(1UL<<5)	/* inexact */ -#define IEEE_TRAP_ENABLE_DNO	(1UL<<6)	/* denorm */ -#define IEEE_TRAP_ENABLE_MASK	(IEEE_TRAP_ENABLE_INV | IEEE_TRAP_ENABLE_DZE |\ -				 IEEE_TRAP_ENABLE_OVF | IEEE_TRAP_ENABLE_UNF |\ -				 IEEE_TRAP_ENABLE_INE | IEEE_TRAP_ENABLE_DNO) - -/* Denorm and Underflow flushing */ -#define IEEE_MAP_DMZ		(1UL<<12)	/* Map denorm inputs to zero */ -#define IEEE_MAP_UMZ		(1UL<<13)	/* Map underflowed outputs to zero */ - -#define IEEE_MAP_MASK		(IEEE_MAP_DMZ | IEEE_MAP_UMZ) - -/* status bits coming from fpcr: */ -#define IEEE_STATUS_INV		(1UL<<17) -#define IEEE_STATUS_DZE		(1UL<<18) -#define IEEE_STATUS_OVF		(1UL<<19) -#define IEEE_STATUS_UNF		(1UL<<20) -#define IEEE_STATUS_INE		(1UL<<21) -#define IEEE_STATUS_DNO		(1UL<<22) - -#define IEEE_STATUS_MASK	(IEEE_STATUS_INV | IEEE_STATUS_DZE |	\ -				 IEEE_STATUS_OVF | IEEE_STATUS_UNF |	\ -				 IEEE_STATUS_INE | IEEE_STATUS_DNO) - -#define IEEE_SW_MASK		(IEEE_TRAP_ENABLE_MASK |		\ -				 IEEE_STATUS_MASK | IEEE_MAP_MASK) - -#define IEEE_CURRENT_RM_SHIFT	32 -#define IEEE_CURRENT_RM_MASK	(3UL<<IEEE_CURRENT_RM_SHIFT) - -#define IEEE_STATUS_TO_EXCSUM_SHIFT	16 - -#define IEEE_INHERIT    (1UL<<63)	/* inherit on thread create? */ - -/* - * Convert the software IEEE trap enable and status bits into the - * hardware fpcr format.  - * - * Digital Unix engineers receive my thanks for not defining the - * software bits identical to the hardware bits.  The chip designers - * receive my thanks for making all the not-implemented fpcr bits - * RAZ forcing us to use system calls to read/write this value. - */ - -static inline unsigned long -ieee_swcr_to_fpcr(unsigned long sw) -{ -	unsigned long fp; -	fp = (sw & IEEE_STATUS_MASK) << 35; -	fp |= (sw & IEEE_MAP_DMZ) << 36; -	fp |= (sw & IEEE_STATUS_MASK ? FPCR_SUM : 0); -	fp |= (~sw & (IEEE_TRAP_ENABLE_INV -		      | IEEE_TRAP_ENABLE_DZE -		      | IEEE_TRAP_ENABLE_OVF)) << 48; -	fp |= (~sw & (IEEE_TRAP_ENABLE_UNF | IEEE_TRAP_ENABLE_INE)) << 57; -	fp |= (sw & IEEE_MAP_UMZ ? FPCR_UNDZ | FPCR_UNFD : 0); -	fp |= (~sw & IEEE_TRAP_ENABLE_DNO) << 41; -	return fp; -} - -static inline unsigned long -ieee_fpcr_to_swcr(unsigned long fp) -{ -	unsigned long sw; -	sw = (fp >> 35) & IEEE_STATUS_MASK; -	sw |= (fp >> 36) & IEEE_MAP_DMZ; -	sw |= (~fp >> 48) & (IEEE_TRAP_ENABLE_INV -			     | IEEE_TRAP_ENABLE_DZE -			     | IEEE_TRAP_ENABLE_OVF); -	sw |= (~fp >> 57) & (IEEE_TRAP_ENABLE_UNF | IEEE_TRAP_ENABLE_INE); -	sw |= (fp >> 47) & IEEE_MAP_UMZ; -	sw |= (~fp >> 41) & IEEE_TRAP_ENABLE_DNO; -	return sw; -} - -#ifdef __KERNEL__ +#include <asm/special_insns.h> +#include <uapi/asm/fpu.h>  /* The following two functions don't need trapb/excb instructions     around the mf_fpcr/mt_fpcr instructions because (a) the kernel @@ -188,6 +72,4 @@ extern void alpha_write_fp_reg (unsigned long reg, unsigned long val);  extern unsigned long alpha_read_fp_reg_s (unsigned long reg);  extern void alpha_write_fp_reg_s (unsigned long reg, unsigned long val); -#endif /* __KERNEL__ */ -  #endif /* __ASM_ALPHA_FPU_H */ diff --git a/arch/alpha/include/asm/futex.h b/arch/alpha/include/asm/futex.h index 945de222ab9..f939794363a 100644 --- a/arch/alpha/include/asm/futex.h +++ b/arch/alpha/include/asm/futex.h @@ -29,7 +29,7 @@  	:	"r" (uaddr), "r"(oparg)				\  	:	"memory") -static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr) +static inline int futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr)  {  	int op = (encoded_op >> 28) & 7;  	int cmp = (encoded_op >> 24) & 15; @@ -39,7 +39,7 @@ static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr)  	if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))  		oparg = 1 << oparg; -	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) +	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))  		return -EFAULT;  	pagefault_disable(); @@ -81,21 +81,23 @@ static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr)  }  static inline int -futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) +futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, +			      u32 oldval, u32 newval)  { -	int prev, cmp; +	int ret = 0, cmp; +	u32 prev; -	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) +	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))  		return -EFAULT;  	__asm__ __volatile__ (  		__ASM_SMP_MB -	"1:	ldl_l	%0,0(%2)\n" -	"	cmpeq	%0,%3,%1\n" -	"	beq	%1,3f\n" -	"	mov	%4,%1\n" -	"2:	stl_c	%1,0(%2)\n" -	"	beq	%1,4f\n" +	"1:	ldl_l	%1,0(%3)\n" +	"	cmpeq	%1,%4,%2\n" +	"	beq	%2,3f\n" +	"	mov	%5,%2\n" +	"2:	stl_c	%2,0(%3)\n" +	"	beq	%2,4f\n"  	"3:	.subsection 2\n"  	"4:	br	1b\n"  	"	.previous\n" @@ -105,11 +107,12 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)  	"	.long	2b-.\n"  	"	lda	$31,3b-2b(%0)\n"  	"	.previous\n" -	:	"=&r"(prev), "=&r"(cmp) -	:	"r"(uaddr), "r"((long)oldval), "r"(newval) +	:	"+r"(ret), "=&r"(prev), "=&r"(cmp) +	:	"r"(uaddr), "r"((long)(int)oldval), "r"(newval)  	:	"memory"); -	return prev; +	*uval = prev; +	return ret;  }  #endif /* __KERNEL__ */ diff --git a/arch/alpha/include/asm/gpio.h b/arch/alpha/include/asm/gpio.h new file mode 100644 index 00000000000..b3799d88ffc --- /dev/null +++ b/arch/alpha/include/asm/gpio.h @@ -0,0 +1,4 @@ +#ifndef __LINUX_GPIO_H +#warning Include linux/gpio.h instead of asm/gpio.h +#include <linux/gpio.h> +#endif diff --git a/arch/alpha/include/asm/io.h b/arch/alpha/include/asm/io.h index eda9b909aa0..5ebab5895ed 100644 --- a/arch/alpha/include/asm/io.h +++ b/arch/alpha/include/asm/io.h @@ -6,7 +6,6 @@  #include <linux/kernel.h>  #include <linux/mm.h>  #include <asm/compiler.h> -#include <asm/system.h>  #include <asm/pgtable.h>  #include <asm/machvec.h>  #include <asm/hwrpb.h> @@ -37,8 +36,9 @@   */  extern inline void __set_hae(unsigned long new_hae)  { -	unsigned long flags; -	local_irq_save(flags); +	unsigned long flags = swpipl(IPL_MAX); + +	barrier();  	alpha_mv.hae_cache = new_hae;  	*alpha_mv.hae_register = new_hae; @@ -46,7 +46,8 @@ extern inline void __set_hae(unsigned long new_hae)  	/* Re-read to make sure it was written.  */  	new_hae = *alpha_mv.hae_register; -	local_irq_restore(flags); +	setipl(flags); +	barrier();  }  extern inline void set_hae(unsigned long new_hae) @@ -488,6 +489,11 @@ extern inline void writeq(u64 b, volatile void __iomem *addr)  }  #endif +#define ioread16be(p) be16_to_cpu(ioread16(p)) +#define ioread32be(p) be32_to_cpu(ioread32(p)) +#define iowrite16be(v,p) iowrite16(cpu_to_be16(v), (p)) +#define iowrite32be(v,p) iowrite32(cpu_to_be32(v), (p)) +  #define inb_p		inb  #define inw_p		inw  #define inl_p		inl diff --git a/arch/alpha/include/asm/ipcbuf.h b/arch/alpha/include/asm/ipcbuf.h deleted file mode 100644 index d9c0e1a5070..00000000000 --- a/arch/alpha/include/asm/ipcbuf.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _ALPHA_IPCBUF_H -#define _ALPHA_IPCBUF_H - -/*  - * The ipc64_perm structure for alpha architecture. - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Pad space is left for: - * - 32-bit seq - * - 2 miscellaneous 64-bit values - */ - -struct ipc64_perm -{ -	__kernel_key_t	key; -	__kernel_uid_t	uid; -	__kernel_gid_t	gid; -	__kernel_uid_t	cuid; -	__kernel_gid_t	cgid; -	__kernel_mode_t	mode;  -	unsigned short	seq; -	unsigned short	__pad1; -	unsigned long	__unused1; -	unsigned long	__unused2; -}; - -#endif /* _ALPHA_IPCBUF_H */ diff --git a/arch/alpha/include/asm/irqflags.h b/arch/alpha/include/asm/irqflags.h index 299bbc7e9d7..ffb1726484a 100644 --- a/arch/alpha/include/asm/irqflags.h +++ b/arch/alpha/include/asm/irqflags.h @@ -1,7 +1,7 @@  #ifndef __ALPHA_IRQFLAGS_H  #define __ALPHA_IRQFLAGS_H -#include <asm/system.h> +#include <asm/pal.h>  #define IPL_MIN		0  #define IPL_SW0		1 diff --git a/arch/alpha/include/asm/linkage.h b/arch/alpha/include/asm/linkage.h index 291c2d01c44..7cfd06e8c93 100644 --- a/arch/alpha/include/asm/linkage.h +++ b/arch/alpha/include/asm/linkage.h @@ -1,6 +1,8 @@  #ifndef __ASM_LINKAGE_H  #define __ASM_LINKAGE_H -/* Nothing to see here... */ +#define cond_syscall(x)  asm(".weak\t" #x "\n" #x " = sys_ni_syscall") +#define SYSCALL_ALIAS(alias, name)					\ +	asm ( #alias " = " #name "\n\t.globl " #alias)  #endif diff --git a/arch/alpha/include/asm/local.h b/arch/alpha/include/asm/local.h index b9e3e331837..9c94b845604 100644 --- a/arch/alpha/include/asm/local.h +++ b/arch/alpha/include/asm/local.h @@ -2,7 +2,7 @@  #define _ALPHA_LOCAL_H  #include <linux/percpu.h> -#include <asm/atomic.h> +#include <linux/atomic.h>  typedef struct  { diff --git a/arch/alpha/include/asm/machvec.h b/arch/alpha/include/asm/machvec.h index 13cd4274381..75cb3641ed2 100644 --- a/arch/alpha/include/asm/machvec.h +++ b/arch/alpha/include/asm/machvec.h @@ -33,6 +33,7 @@ struct alpha_machine_vector  	int nr_irqs;  	int rtc_port; +	int rtc_boot_cpu_only;  	unsigned int max_asn;  	unsigned long max_isa_dma_address;  	unsigned long irq_probe_mask; @@ -90,14 +91,11 @@ struct alpha_machine_vector  	void (*kill_arch)(int);  	u8 (*pci_swizzle)(struct pci_dev *, u8 *); -	int (*pci_map_irq)(struct pci_dev *, u8, u8); +	int (*pci_map_irq)(const struct pci_dev *, u8, u8);  	struct pci_ops *pci_ops;  	struct _alpha_agp_info *(*agp_info)(void); -	unsigned int (*rtc_get_time)(struct rtc_time *); -	int (*rtc_set_time)(struct rtc_time *); -  	const char *vector_name;  	/* NUMA information */ @@ -126,13 +124,19 @@ extern struct alpha_machine_vector alpha_mv;  #ifdef CONFIG_ALPHA_GENERIC  extern int alpha_using_srm; +extern int alpha_using_qemu;  #else -#ifdef CONFIG_ALPHA_SRM -#define alpha_using_srm 1 -#else -#define alpha_using_srm 0 -#endif +# ifdef CONFIG_ALPHA_SRM +#  define alpha_using_srm 1 +# else +#  define alpha_using_srm 0 +# endif +# ifdef CONFIG_ALPHA_QEMU +#  define alpha_using_qemu 1 +# else +#  define alpha_using_qemu 0 +# endif  #endif /* GENERIC */ -#endif +#endif /* __KERNEL__ */  #endif /* __ALPHA_MACHVEC_H */ diff --git a/arch/alpha/include/asm/mce.h b/arch/alpha/include/asm/mce.h new file mode 100644 index 00000000000..660285b9aca --- /dev/null +++ b/arch/alpha/include/asm/mce.h @@ -0,0 +1,83 @@ +#ifndef __ALPHA_MCE_H +#define __ALPHA_MCE_H + +/* + * This is the logout header that should be common to all platforms + * (assuming they are running OSF/1 PALcode, I guess). + */ +struct el_common { +	unsigned int	size;		/* size in bytes of logout area */ +	unsigned int	sbz1	: 30;	/* should be zero */ +	unsigned int	err2	:  1;	/* second error */ +	unsigned int	retry	:  1;	/* retry flag */ +	unsigned int	proc_offset;	/* processor-specific offset */ +	unsigned int	sys_offset;	/* system-specific offset */ +	unsigned int	code;		/* machine check code */ +	unsigned int	frame_rev;	/* frame revision */ +}; + +/* Machine Check Frame for uncorrectable errors (Large format) + *      --- This is used to log uncorrectable errors such as + *          double bit ECC errors. + *      --- These errors are detected by both processor and systems. + */ +struct el_common_EV5_uncorrectable_mcheck { +        unsigned long   shadow[8];        /* Shadow reg. 8-14, 25           */ +        unsigned long   paltemp[24];      /* PAL TEMP REGS.                 */ +        unsigned long   exc_addr;         /* Address of excepting instruction*/ +        unsigned long   exc_sum;          /* Summary of arithmetic traps.   */ +        unsigned long   exc_mask;         /* Exception mask (from exc_sum). */ +        unsigned long   pal_base;         /* Base address for PALcode.      */ +        unsigned long   isr;              /* Interrupt Status Reg.          */ +        unsigned long   icsr;             /* CURRENT SETUP OF EV5 IBOX      */ +        unsigned long   ic_perr_stat;     /* I-CACHE Reg. <11> set Data parity +                                                         <12> set TAG parity*/ +        unsigned long   dc_perr_stat;     /* D-CACHE error Reg. Bits set to 1: +                                                     <2> Data error in bank 0 +                                                     <3> Data error in bank 1 +                                                     <4> Tag error in bank 0 +                                                     <5> Tag error in bank 1 */ +        unsigned long   va;               /* Effective VA of fault or miss. */ +        unsigned long   mm_stat;          /* Holds the reason for D-stream  +                                             fault or D-cache parity errors */ +        unsigned long   sc_addr;          /* Address that was being accessed +                                             when EV5 detected Secondary cache +                                             failure.                 */ +        unsigned long   sc_stat;          /* Helps determine if the error was +                                             TAG/Data parity(Secondary Cache)*/ +        unsigned long   bc_tag_addr;      /* Contents of EV5 BC_TAG_ADDR    */ +        unsigned long   ei_addr;          /* Physical address of any transfer +                                             that is logged in EV5 EI_STAT */ +        unsigned long   fill_syndrome;    /* For correcting ECC errors.     */ +        unsigned long   ei_stat;          /* Helps identify reason of any  +                                             processor uncorrectable error +                                             at its external interface.     */ +        unsigned long   ld_lock;          /* Contents of EV5 LD_LOCK register*/ +}; + +struct el_common_EV6_mcheck { +	unsigned int FrameSize;		/* Bytes, including this field */ +	unsigned int FrameFlags;	/* <31> = Retry, <30> = Second Error */ +	unsigned int CpuOffset;		/* Offset to CPU-specific info */ +	unsigned int SystemOffset;	/* Offset to system-specific info */ +	unsigned int MCHK_Code; +	unsigned int MCHK_Frame_Rev; +	unsigned long I_STAT;		/* EV6 Internal Processor Registers */ +	unsigned long DC_STAT;		/* (See the 21264 Spec) */ +	unsigned long C_ADDR; +	unsigned long DC1_SYNDROME; +	unsigned long DC0_SYNDROME; +	unsigned long C_STAT; +	unsigned long C_STS; +	unsigned long MM_STAT; +	unsigned long EXC_ADDR; +	unsigned long IER_CM; +	unsigned long ISUM; +	unsigned long RESERVED0; +	unsigned long PAL_BASE; +	unsigned long I_CTL; +	unsigned long PCTX; +}; + + +#endif /* __ALPHA_MCE_H */ diff --git a/arch/alpha/include/asm/mmu_context.h b/arch/alpha/include/asm/mmu_context.h index 86c08a02d23..4c51c05333c 100644 --- a/arch/alpha/include/asm/mmu_context.h +++ b/arch/alpha/include/asm/mmu_context.h @@ -7,7 +7,6 @@   * Copyright (C) 1996, Linus Torvalds   */ -#include <asm/system.h>  #include <asm/machvec.h>  #include <asm/compiler.h>  #include <asm-generic/mm_hooks.h> diff --git a/arch/alpha/include/asm/mmzone.h b/arch/alpha/include/asm/mmzone.h index 8af56ce346a..14ce27bccd2 100644 --- a/arch/alpha/include/asm/mmzone.h +++ b/arch/alpha/include/asm/mmzone.h @@ -56,7 +56,6 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)   * Given a kernel address, find the home node of the underlying memory.   */  #define kvaddr_to_nid(kaddr)	pa_to_nid(__pa(kaddr)) -#define node_start_pfn(nid)	(NODE_DATA(nid)->node_start_pfn)  /*   * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory @@ -67,13 +66,11 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)      ((unsigned long)__va(NODE_DATA(kvaddr_to_nid(kaddr))->node_start_pfn  \  			 << PAGE_SHIFT)) -/* XXX: FIXME -- wli */ +/* XXX: FIXME -- nyc */  #define kern_addr_valid(kaddr)	(0)  #define virt_to_page(kaddr)	pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) -#define VALID_PAGE(page)	(((page) - mem_map) < max_mapnr) -  #define pmd_page(pmd)		(pfn_to_page(pmd_val(pmd) >> 32))  #define pgd_page(pgd)		(pfn_to_page(pgd_val(pgd) >> 32))  #define pte_pfn(pte)		(pte_val(pte) >> 32) diff --git a/arch/alpha/include/asm/module.h b/arch/alpha/include/asm/module.h index 7b63743c534..9cd13b55155 100644 --- a/arch/alpha/include/asm/module.h +++ b/arch/alpha/include/asm/module.h @@ -1,19 +1,13 @@  #ifndef _ALPHA_MODULE_H  #define _ALPHA_MODULE_H +#include <asm-generic/module.h> +  struct mod_arch_specific  {  	unsigned int gotsecindex;  }; -#define Elf_Sym Elf64_Sym -#define Elf_Shdr Elf64_Shdr -#define Elf_Ehdr Elf64_Ehdr -#define Elf_Phdr Elf64_Phdr -#define Elf_Dyn Elf64_Dyn -#define Elf_Rel Elf64_Rel -#define Elf_Rela Elf64_Rela -  #define ARCH_SHF_SMALL SHF_ALPHA_GPREL  #ifdef MODULE diff --git a/arch/alpha/include/asm/pal.h b/arch/alpha/include/asm/pal.h index 9b4ba0d6f00..5422a47646f 100644 --- a/arch/alpha/include/asm/pal.h +++ b/arch/alpha/include/asm/pal.h @@ -1,51 +1,186 @@  #ifndef __ALPHA_PAL_H  #define __ALPHA_PAL_H -/* - * Common PAL-code - */ -#define PAL_halt	  0 -#define PAL_cflush	  1 -#define PAL_draina	  2 -#define PAL_bpt		128 -#define PAL_bugchk	129 -#define PAL_chmk	131 -#define PAL_callsys	131 -#define PAL_imb		134 -#define PAL_rduniq	158 -#define PAL_wruniq	159 -#define PAL_gentrap	170 -#define PAL_nphalt	190 +#include <uapi/asm/pal.h> + +#ifndef __ASSEMBLY__ + +extern void halt(void) __attribute__((noreturn)); +#define __halt() __asm__ __volatile__ ("call_pal %0 #halt" : : "i" (PAL_halt)) + +#define imb() \ +__asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory") + +#define draina() \ +__asm__ __volatile__ ("call_pal %0 #draina" : : "i" (PAL_draina) : "memory") + +#define __CALL_PAL_R0(NAME, TYPE)				\ +extern inline TYPE NAME(void)					\ +{								\ +	register TYPE __r0 __asm__("$0");			\ +	__asm__ __volatile__(					\ +		"call_pal %1 # " #NAME				\ +		:"=r" (__r0)					\ +		:"i" (PAL_ ## NAME)				\ +		:"$1", "$16", "$22", "$23", "$24", "$25");	\ +	return __r0;						\ +} + +#define __CALL_PAL_W1(NAME, TYPE0)				\ +extern inline void NAME(TYPE0 arg0)				\ +{								\ +	register TYPE0 __r16 __asm__("$16") = arg0;		\ +	__asm__ __volatile__(					\ +		"call_pal %1 # "#NAME				\ +		: "=r"(__r16)					\ +		: "i"(PAL_ ## NAME), "0"(__r16)			\ +		: "$1", "$22", "$23", "$24", "$25");		\ +} + +#define __CALL_PAL_W2(NAME, TYPE0, TYPE1)			\ +extern inline void NAME(TYPE0 arg0, TYPE1 arg1)			\ +{								\ +	register TYPE0 __r16 __asm__("$16") = arg0;		\ +	register TYPE1 __r17 __asm__("$17") = arg1;		\ +	__asm__ __volatile__(					\ +		"call_pal %2 # "#NAME				\ +		: "=r"(__r16), "=r"(__r17)			\ +		: "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17)	\ +		: "$1", "$22", "$23", "$24", "$25");		\ +} + +#define __CALL_PAL_RW1(NAME, RTYPE, TYPE0)			\ +extern inline RTYPE NAME(TYPE0 arg0)				\ +{								\ +	register RTYPE __r0 __asm__("$0");			\ +	register TYPE0 __r16 __asm__("$16") = arg0;		\ +	__asm__ __volatile__(					\ +		"call_pal %2 # "#NAME				\ +		: "=r"(__r16), "=r"(__r0)			\ +		: "i"(PAL_ ## NAME), "0"(__r16)			\ +		: "$1", "$22", "$23", "$24", "$25");		\ +	return __r0;						\ +} + +#define __CALL_PAL_RW2(NAME, RTYPE, TYPE0, TYPE1)		\ +extern inline RTYPE NAME(TYPE0 arg0, TYPE1 arg1)		\ +{								\ +	register RTYPE __r0 __asm__("$0");			\ +	register TYPE0 __r16 __asm__("$16") = arg0;		\ +	register TYPE1 __r17 __asm__("$17") = arg1;		\ +	__asm__ __volatile__(					\ +		"call_pal %3 # "#NAME				\ +		: "=r"(__r16), "=r"(__r17), "=r"(__r0)		\ +		: "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17)	\ +		: "$1", "$22", "$23", "$24", "$25");		\ +	return __r0;						\ +} + +__CALL_PAL_W1(cflush, unsigned long); +__CALL_PAL_R0(rdmces, unsigned long); +__CALL_PAL_R0(rdps, unsigned long); +__CALL_PAL_R0(rdusp, unsigned long); +__CALL_PAL_RW1(swpipl, unsigned long, unsigned long); +__CALL_PAL_R0(whami, unsigned long); +__CALL_PAL_W2(wrent, void*, unsigned long); +__CALL_PAL_W1(wripir, unsigned long); +__CALL_PAL_W1(wrkgp, unsigned long); +__CALL_PAL_W1(wrmces, unsigned long); +__CALL_PAL_RW2(wrperfmon, unsigned long, unsigned long, unsigned long); +__CALL_PAL_W1(wrusp, unsigned long); +__CALL_PAL_W1(wrvptptr, unsigned long); +__CALL_PAL_RW1(wtint, unsigned long, unsigned long);  /* - * VMS specific PAL-code + * TB routines..   */ -#define PAL_swppal	10 -#define PAL_mfpr_vptb	41 +#define __tbi(nr,arg,arg1...)					\ +({								\ +	register unsigned long __r16 __asm__("$16") = (nr);	\ +	register unsigned long __r17 __asm__("$17"); arg;	\ +	__asm__ __volatile__(					\ +		"call_pal %3 #__tbi"				\ +		:"=r" (__r16),"=r" (__r17)			\ +		:"0" (__r16),"i" (PAL_tbi) ,##arg1		\ +		:"$0", "$1", "$22", "$23", "$24", "$25");	\ +}) + +#define tbi(x,y)	__tbi(x,__r17=(y),"1" (__r17)) +#define tbisi(x)	__tbi(1,__r17=(x),"1" (__r17)) +#define tbisd(x)	__tbi(2,__r17=(x),"1" (__r17)) +#define tbis(x)		__tbi(3,__r17=(x),"1" (__r17)) +#define tbiap()		__tbi(-1, /* no second argument */) +#define tbia()		__tbi(-2, /* no second argument */)  /* - * OSF specific PAL-code + * QEMU Cserv routines..   */ -#define PAL_cserve	 9 -#define PAL_wripir	13 -#define PAL_rdmces	16 -#define PAL_wrmces	17 -#define PAL_wrfen	43 -#define PAL_wrvptptr	45 -#define PAL_jtopal	46 -#define PAL_swpctx	48 -#define PAL_wrval	49 -#define PAL_rdval	50 -#define PAL_tbi		51 -#define PAL_wrent	52 -#define PAL_swpipl	53 -#define PAL_rdps	54 -#define PAL_wrkgp	55 -#define PAL_wrusp	56 -#define PAL_wrperfmon	57 -#define PAL_rdusp	58 -#define PAL_whami	60 -#define PAL_retsys	61 -#define PAL_rti		63 +static inline unsigned long +qemu_get_walltime(void) +{ +	register unsigned long v0 __asm__("$0"); +	register unsigned long a0 __asm__("$16") = 3; + +	asm("call_pal %2 # cserve get_time" +	    : "=r"(v0), "+r"(a0) +	    : "i"(PAL_cserve) +	    : "$17", "$18", "$19", "$20", "$21"); + +	return v0; +} + +static inline unsigned long +qemu_get_alarm(void) +{ +	register unsigned long v0 __asm__("$0"); +	register unsigned long a0 __asm__("$16") = 4; + +	asm("call_pal %2 # cserve get_alarm" +	    : "=r"(v0), "+r"(a0) +	    : "i"(PAL_cserve) +	    : "$17", "$18", "$19", "$20", "$21"); + +	return v0; +} + +static inline void +qemu_set_alarm_rel(unsigned long expire) +{ +	register unsigned long a0 __asm__("$16") = 5; +	register unsigned long a1 __asm__("$17") = expire; + +	asm volatile("call_pal %2 # cserve set_alarm_rel" +		     : "+r"(a0), "+r"(a1) +		     : "i"(PAL_cserve) +		     : "$0", "$18", "$19", "$20", "$21"); +} + +static inline void +qemu_set_alarm_abs(unsigned long expire) +{ +	register unsigned long a0 __asm__("$16") = 6; +	register unsigned long a1 __asm__("$17") = expire; + +	asm volatile("call_pal %2 # cserve set_alarm_abs" +		     : "+r"(a0), "+r"(a1) +		     : "i"(PAL_cserve) +		     : "$0", "$18", "$19", "$20", "$21"); +} + +static inline unsigned long +qemu_get_vmtime(void) +{ +	register unsigned long v0 __asm__("$0"); +	register unsigned long a0 __asm__("$16") = 7; + +	asm("call_pal %2 # cserve get_time" +	    : "=r"(v0), "+r"(a0) +	    : "i"(PAL_cserve) +	    : "$17", "$18", "$19", "$20", "$21"); + +	return v0; +} + +#endif /* !__ASSEMBLY__ */  #endif /* __ALPHA_PAL_H */ diff --git a/arch/alpha/include/asm/param.h b/arch/alpha/include/asm/param.h index e691ecfedb2..a5b68b268bc 100644 --- a/arch/alpha/include/asm/param.h +++ b/arch/alpha/include/asm/param.h @@ -1,27 +1,11 @@  #ifndef _ASM_ALPHA_PARAM_H  #define _ASM_ALPHA_PARAM_H -/* ??? Gross.  I don't want to parameterize this, and supposedly the -   hardware ignores reprogramming.  We also need userland buy-in to the  -   change in HZ, since this is visible in the wait4 resources etc.  */ +#include <uapi/asm/param.h> -#ifdef __KERNEL__ -#define HZ		CONFIG_HZ -#define USER_HZ		HZ -#else -#define HZ		1024 -#endif - -#define EXEC_PAGESIZE	8192 - -#ifndef NOGROUP -#define NOGROUP		(-1) -#endif - -#define MAXHOSTNAMELEN	64	/* max length of hostname */ - -#ifdef __KERNEL__ -# define CLOCKS_PER_SEC	HZ	/* frequency at which times() counts */ -#endif +# undef HZ +# define HZ		CONFIG_HZ +# define USER_HZ	1024 +# define CLOCKS_PER_SEC	USER_HZ	/* frequency at which times() counts */  #endif /* _ASM_ALPHA_PARAM_H */ diff --git a/arch/alpha/include/asm/parport.h b/arch/alpha/include/asm/parport.h index c5ee7cbb2fc..6abd0af11f1 100644 --- a/arch/alpha/include/asm/parport.h +++ b/arch/alpha/include/asm/parport.h @@ -9,8 +9,8 @@  #ifndef _ASM_AXP_PARPORT_H  #define _ASM_AXP_PARPORT_H 1 -static int __devinit parport_pc_find_isa_ports (int autoirq, int autodma); -static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma) +static int parport_pc_find_isa_ports (int autoirq, int autodma); +static int parport_pc_find_nonpci_ports (int autoirq, int autodma)  {  	return parport_pc_find_isa_ports (autoirq, autodma);  } diff --git a/arch/alpha/include/asm/pci.h b/arch/alpha/include/asm/pci.h index 28d0497fd3c..f7f680f7457 100644 --- a/arch/alpha/include/asm/pci.h +++ b/arch/alpha/include/asm/pci.h @@ -7,6 +7,7 @@  #include <linux/dma-mapping.h>  #include <asm/scatterlist.h>  #include <asm/machvec.h> +#include <asm-generic/pci-bridge.h>  /*   * The following structure is used to manage multiple PCI busses. @@ -58,11 +59,6 @@ struct pci_controller {  extern void pcibios_set_master(struct pci_dev *dev); -extern inline void pcibios_penalize_isa_irq(int irq, int active) -{ -	/* We don't do dynamic PCI IRQ allocation */ -} -  /* IOMMU controls.  */  /* The PCI address space does not equal the physical memory address space. @@ -99,12 +95,6 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)  	return channel ? 15 : 14;  } -extern void pcibios_resource_to_bus(struct pci_dev *, struct pci_bus_region *, -				    struct resource *); - -extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, -				    struct pci_bus_region *region); -  #define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index  static inline int pci_proc_domain(struct pci_bus *bus) diff --git a/arch/alpha/include/asm/perf_event.h b/arch/alpha/include/asm/perf_event.h index fe792ca818f..5996e7a6757 100644 --- a/arch/alpha/include/asm/perf_event.h +++ b/arch/alpha/include/asm/perf_event.h @@ -1,10 +1,4 @@  #ifndef __ASM_ALPHA_PERF_EVENT_H  #define __ASM_ALPHA_PERF_EVENT_H -#ifdef CONFIG_PERF_EVENTS -extern void init_hw_perf_events(void); -#else -static inline void init_hw_perf_events(void)    { } -#endif -  #endif /* __ASM_ALPHA_PERF_EVENT_H */ diff --git a/arch/alpha/include/asm/pgalloc.h b/arch/alpha/include/asm/pgalloc.h index bc2a0daf2d9..aab14a019c2 100644 --- a/arch/alpha/include/asm/pgalloc.h +++ b/arch/alpha/include/asm/pgalloc.h @@ -72,7 +72,10 @@ pte_alloc_one(struct mm_struct *mm, unsigned long address)  	if (!pte)  		return NULL;  	page = virt_to_page(pte); -	pgtable_page_ctor(page); +	if (!pgtable_page_ctor(page)) { +		__free_page(page); +		return NULL; +	}  	return page;  } diff --git a/arch/alpha/include/asm/pgtable.h b/arch/alpha/include/asm/pgtable.h index de98a732683..d8f9b7e8923 100644 --- a/arch/alpha/include/asm/pgtable.h +++ b/arch/alpha/include/asm/pgtable.h @@ -15,6 +15,7 @@  #include <asm/page.h>  #include <asm/processor.h>	/* For TASK_SIZE */  #include <asm/machvec.h> +#include <asm/setup.h>  struct mm_struct;  struct vm_area_struct; @@ -353,9 +354,6 @@ extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)  #define kern_addr_valid(addr)	(1)  #endif -#define io_remap_pfn_range(vma, start, pfn, size, prot)	\ -		remap_pfn_range(vma, start, pfn, size, prot) -  #define pte_ERROR(e) \  	printk("%s:%d: bad pte %016lx.\n", __FILE__, __LINE__, pte_val(e))  #define pmd_ERROR(e) \ diff --git a/arch/alpha/include/asm/posix_types.h b/arch/alpha/include/asm/posix_types.h deleted file mode 100644 index db167413300..00000000000 --- a/arch/alpha/include/asm/posix_types.h +++ /dev/null @@ -1,123 +0,0 @@ -#ifndef _ALPHA_POSIX_TYPES_H -#define _ALPHA_POSIX_TYPES_H - -/* - * This file is generally used by user-level software, so you need to - * be a little careful about namespace pollution etc.  Also, we cannot - * assume GCC is being used. - */ - -typedef unsigned int	__kernel_ino_t; -typedef unsigned int	__kernel_mode_t; -typedef unsigned int	__kernel_nlink_t; -typedef long		__kernel_off_t; -typedef long long	__kernel_loff_t; -typedef int		__kernel_pid_t; -typedef int		__kernel_ipc_pid_t; -typedef unsigned int	__kernel_uid_t; -typedef unsigned int	__kernel_gid_t; -typedef unsigned long	__kernel_size_t; -typedef long		__kernel_ssize_t; -typedef long		__kernel_ptrdiff_t; -typedef long		__kernel_time_t; -typedef long		__kernel_suseconds_t; -typedef long		__kernel_clock_t; -typedef int		__kernel_daddr_t; -typedef char *		__kernel_caddr_t; -typedef unsigned long	__kernel_sigset_t;	/* at least 32 bits */ -typedef unsigned short	__kernel_uid16_t; -typedef unsigned short	__kernel_gid16_t; -typedef int		__kernel_clockid_t; -typedef int		__kernel_timer_t; - -typedef struct { -	int	val[2]; -} __kernel_fsid_t; - -typedef __kernel_uid_t __kernel_old_uid_t; -typedef __kernel_gid_t __kernel_old_gid_t; -typedef __kernel_uid_t __kernel_uid32_t; -typedef __kernel_gid_t __kernel_gid32_t; - -typedef unsigned int	__kernel_old_dev_t; - -#ifdef __KERNEL__ - -#ifndef __GNUC__ - -#define	__FD_SET(d, set)	((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) -#define	__FD_CLR(d, set)	((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) -#define	__FD_ISSET(d, set)	(((set)->fds_bits[__FDELT(d)] & __FDMASK(d)) != 0) -#define	__FD_ZERO(set)	\ -  ((void) memset ((void *) (set), 0, sizeof (__kernel_fd_set))) - -#else /* __GNUC__ */ - -/* With GNU C, use inline functions instead so args are evaluated only once: */ - -#undef __FD_SET -static __inline__ void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) -{ -	unsigned long _tmp = fd / __NFDBITS; -	unsigned long _rem = fd % __NFDBITS; -	fdsetp->fds_bits[_tmp] |= (1UL<<_rem); -} - -#undef __FD_CLR -static __inline__ void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) -{ -	unsigned long _tmp = fd / __NFDBITS; -	unsigned long _rem = fd % __NFDBITS; -	fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); -} - -#undef __FD_ISSET -static __inline__ int __FD_ISSET(unsigned long fd, const __kernel_fd_set *p) -{  -	unsigned long _tmp = fd / __NFDBITS; -	unsigned long _rem = fd % __NFDBITS; -	return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; -} - -/* - * This will unroll the loop for the normal constant case (8 ints, - * for a 256-bit fd_set) - */ -#undef __FD_ZERO -static __inline__ void __FD_ZERO(__kernel_fd_set *p) -{ -	unsigned long *tmp = p->fds_bits; -	int i; - -	if (__builtin_constant_p(__FDSET_LONGS)) { -		switch (__FDSET_LONGS) { -		      case 16: -			tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; -			tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; -			tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; -			tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; -			return; - -		      case 8: -			tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; -			tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; -			return; - -		      case 4: -			tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; -			return; -		} -	} -	i = __FDSET_LONGS; -	while (i) { -		i--; -		*tmp = 0; -		tmp++; -	} -} - -#endif /* __GNUC__ */ - -#endif /* __KERNEL__ */ - -#endif /* _ALPHA_POSIX_TYPES_H */ diff --git a/arch/alpha/include/asm/processor.h b/arch/alpha/include/asm/processor.h index 94afe585930..6cb7fe85c4b 100644 --- a/arch/alpha/include/asm/processor.h +++ b/arch/alpha/include/asm/processor.h @@ -49,12 +49,6 @@ extern void start_thread(struct pt_regs *, unsigned long, unsigned long);  /* Free all resources held by a thread. */  extern void release_thread(struct task_struct *); -/* Prepare to copy thread state - unlazy all lazy status */ -#define prepare_to_copy(tsk)	do { } while (0) - -/* Create a kernel thread without removing it from tasklists.  */ -extern long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); -  unsigned long get_wchan(struct task_struct *p);  #define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc) diff --git a/arch/alpha/include/asm/ptrace.h b/arch/alpha/include/asm/ptrace.h index 65cf3e28e2f..9047c2fe8f2 100644 --- a/arch/alpha/include/asm/ptrace.h +++ b/arch/alpha/include/asm/ptrace.h @@ -1,84 +1,27 @@  #ifndef _ASMAXP_PTRACE_H  #define _ASMAXP_PTRACE_H +#include <uapi/asm/ptrace.h> -/* - * This struct defines the way the registers are stored on the - * kernel stack during a system call or other kernel entry - * - * NOTE! I want to minimize the overhead of system calls, so this - * struct has as little information as possible.  I does not have - * - *  - floating point regs: the kernel doesn't change those - *  - r9-15: saved by the C compiler - * - * This makes "fork()" and "exec()" a bit more complex, but should - * give us low system call latency. - */ - -struct pt_regs { -	unsigned long r0; -	unsigned long r1; -	unsigned long r2; -	unsigned long r3; -	unsigned long r4; -	unsigned long r5; -	unsigned long r6; -	unsigned long r7; -	unsigned long r8; -	unsigned long r19; -	unsigned long r20; -	unsigned long r21; -	unsigned long r22; -	unsigned long r23; -	unsigned long r24; -	unsigned long r25; -	unsigned long r26; -	unsigned long r27; -	unsigned long r28; -	unsigned long hae; -/* JRP - These are the values provided to a0-a2 by PALcode */ -	unsigned long trap_a0; -	unsigned long trap_a1; -	unsigned long trap_a2; -/* These are saved by PAL-code: */ -	unsigned long ps; -	unsigned long pc; -	unsigned long gp; -	unsigned long r16; -	unsigned long r17; -	unsigned long r18; -}; - -/* - * This is the extended stack used by signal handlers and the context - * switcher: it's pushed after the normal "struct pt_regs". - */ -struct switch_stack { -	unsigned long r9; -	unsigned long r10; -	unsigned long r11; -	unsigned long r12; -	unsigned long r13; -	unsigned long r14; -	unsigned long r15; -	unsigned long r26; -	unsigned long fp[32];	/* fp[31] is fpcr */ -}; - -#ifdef __KERNEL__  #define arch_has_single_step()		(1)  #define user_mode(regs) (((regs)->ps & 8) != 0)  #define instruction_pointer(regs) ((regs)->pc)  #define profile_pc(regs) instruction_pointer(regs) -extern void show_regs(struct pt_regs *); +#define current_user_stack_pointer() rdusp()  #define task_pt_regs(task) \    ((struct pt_regs *) (task_stack_page(task) + 2*PAGE_SIZE) - 1) -#define force_successful_syscall_return() (task_pt_regs(current)->r0 = 0) +#define current_pt_regs() \ +  ((struct pt_regs *) ((char *)current_thread_info() + 2*PAGE_SIZE) - 1) +#define signal_pt_regs current_pt_regs -#endif +#define force_successful_syscall_return() (current_pt_regs()->r0 = 0) + +static inline unsigned long regs_return_value(struct pt_regs *regs) +{ +	return regs->r0; +}  #endif diff --git a/arch/alpha/include/asm/rtc.h b/arch/alpha/include/asm/rtc.h index 1f7fba671ae..f71c3b0ed36 100644 --- a/arch/alpha/include/asm/rtc.h +++ b/arch/alpha/include/asm/rtc.h @@ -1,16 +1 @@ -#ifndef _ALPHA_RTC_H -#define _ALPHA_RTC_H - -#if defined(CONFIG_ALPHA_GENERIC) -# define get_rtc_time		alpha_mv.rtc_get_time -# define set_rtc_time		alpha_mv.rtc_set_time -#else -# if defined(CONFIG_ALPHA_MARVEL) && defined(CONFIG_SMP) -#  define get_rtc_time		marvel_get_rtc_time -#  define set_rtc_time		marvel_set_rtc_time -# endif -#endif -  #include <asm-generic/rtc.h> - -#endif diff --git a/arch/alpha/include/asm/rwsem.h b/arch/alpha/include/asm/rwsem.h index 1570c0b5433..a83bbea62c6 100644 --- a/arch/alpha/include/asm/rwsem.h +++ b/arch/alpha/include/asm/rwsem.h @@ -13,44 +13,13 @@  #ifdef __KERNEL__  #include <linux/compiler.h> -#include <linux/list.h> -#include <linux/spinlock.h> -struct rwsem_waiter; - -extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem); -extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem); -extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *); -extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem); - -/* - * the semaphore definition - */ -struct rw_semaphore { -	long			count;  #define RWSEM_UNLOCKED_VALUE		0x0000000000000000L  #define RWSEM_ACTIVE_BIAS		0x0000000000000001L  #define RWSEM_ACTIVE_MASK		0x00000000ffffffffL  #define RWSEM_WAITING_BIAS		(-0x0000000100000000L)  #define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS  #define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS) -	spinlock_t		wait_lock; -	struct list_head	wait_list; -}; - -#define __RWSEM_INITIALIZER(name) \ -	{ RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, \ -	LIST_HEAD_INIT((name).wait_list) } - -#define DECLARE_RWSEM(name) \ -	struct rw_semaphore name = __RWSEM_INITIALIZER(name) - -static inline void init_rwsem(struct rw_semaphore *sem) -{ -	sem->count = RWSEM_UNLOCKED_VALUE; -	spin_lock_init(&sem->wait_lock); -	INIT_LIST_HEAD(&sem->wait_list); -}  static inline void __down_read(struct rw_semaphore *sem)  { @@ -250,10 +219,5 @@ static inline long rwsem_atomic_update(long val, struct rw_semaphore *sem)  #endif  } -static inline int rwsem_is_locked(struct rw_semaphore *sem) -{ -	return (sem->count != 0); -} -  #endif /* __KERNEL__ */  #endif /* _ALPHA_RWSEM_H */ diff --git a/arch/alpha/include/asm/setup.h b/arch/alpha/include/asm/setup.h deleted file mode 100644 index 2e023a4aa31..00000000000 --- a/arch/alpha/include/asm/setup.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __ALPHA_SETUP_H -#define __ALPHA_SETUP_H - -#define COMMAND_LINE_SIZE	256 - -#endif diff --git a/arch/alpha/include/asm/signal.h b/arch/alpha/include/asm/signal.h index a9388300abb..963f0494dca 100644 --- a/arch/alpha/include/asm/signal.h +++ b/arch/alpha/include/asm/signal.h @@ -1,12 +1,8 @@  #ifndef _ASMAXP_SIGNAL_H  #define _ASMAXP_SIGNAL_H -#include <linux/types.h> +#include <uapi/asm/signal.h> -/* Avoid too many header ordering problems.  */ -struct siginfo; - -#ifdef __KERNEL__  /* Digital Unix defines 64 signals.  Most things should be clean enough     to redefine this at will, if care is taken to make libc match.  */ @@ -20,153 +16,12 @@ typedef struct {  	unsigned long sig[_NSIG_WORDS];  } sigset_t; -#else -/* Here we must cater to libcs that poke about in kernel headers.  */ - -#define NSIG		32 -typedef unsigned long sigset_t; - -#endif /* __KERNEL__ */ - - -/* - * Linux/AXP has different signal numbers that Linux/i386: I'm trying - * to make it OSF/1 binary compatible, at least for normal binaries. - */ -#define SIGHUP		 1 -#define SIGINT		 2 -#define SIGQUIT		 3 -#define SIGILL		 4 -#define SIGTRAP		 5 -#define SIGABRT		 6 -#define SIGEMT		 7 -#define SIGFPE		 8 -#define SIGKILL		 9 -#define SIGBUS		10 -#define SIGSEGV		11 -#define SIGSYS		12 -#define SIGPIPE		13 -#define SIGALRM		14 -#define SIGTERM		15 -#define SIGURG		16 -#define SIGSTOP		17 -#define SIGTSTP		18 -#define SIGCONT		19 -#define SIGCHLD		20 -#define SIGTTIN		21 -#define SIGTTOU		22 -#define SIGIO		23 -#define SIGXCPU		24 -#define SIGXFSZ		25 -#define SIGVTALRM	26 -#define SIGPROF		27 -#define SIGWINCH	28 -#define SIGINFO		29 -#define SIGUSR1		30 -#define SIGUSR2		31 - -#define SIGPOLL	SIGIO -#define SIGPWR	SIGINFO -#define SIGIOT	SIGABRT - -/* These should not be considered constants from userland.  */ -#define SIGRTMIN	32 -#define SIGRTMAX	_NSIG - -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ - -#define SA_ONSTACK	0x00000001 -#define SA_RESTART	0x00000002 -#define SA_NOCLDSTOP	0x00000004 -#define SA_NODEFER	0x00000008 -#define SA_RESETHAND	0x00000010 -#define SA_NOCLDWAIT	0x00000020 -#define SA_SIGINFO	0x00000040 - -#define SA_ONESHOT	SA_RESETHAND -#define SA_NOMASK	SA_NODEFER - -/*  - * sigaltstack controls - */ -#define SS_ONSTACK	1 -#define SS_DISABLE	2 - -#define MINSIGSTKSZ	4096 -#define SIGSTKSZ	16384 - -#define SIG_BLOCK          1	/* for blocking signals */ -#define SIG_UNBLOCK        2	/* for unblocking signals */ -#define SIG_SETMASK        3	/* for setting the signal mask */ - -#include <asm-generic/signal-defs.h> - -#ifdef __KERNEL__  struct osf_sigaction {  	__sighandler_t	sa_handler;  	old_sigset_t	sa_mask;  	int		sa_flags;  }; -struct sigaction { -	__sighandler_t	sa_handler; -	unsigned long	sa_flags; -	sigset_t	sa_mask;	/* mask last for extensibility */ -}; - -struct k_sigaction { -	struct sigaction sa; -	__sigrestore_t ka_restorer; -}; -#else -/* Here we must cater to libcs that poke about in kernel headers.  */ - -struct sigaction { -	union { -	  __sighandler_t	_sa_handler; -	  void (*_sa_sigaction)(int, struct siginfo *, void *); -	} _u; -	sigset_t	sa_mask; -	int		sa_flags; -}; - -#define sa_handler	_u._sa_handler -#define sa_sigaction	_u._sa_sigaction - -#endif /* __KERNEL__ */ - -typedef struct sigaltstack { -	void __user *ss_sp; -	int ss_flags; -	size_t ss_size; -} stack_t; - -/* sigstack(2) is deprecated, and will be withdrawn in a future version -   of the X/Open CAE Specification.  Use sigaltstack instead.  It is only -   implemented here for OSF/1 compatibility.  */ - -struct sigstack { -	void __user *ss_sp; -	int ss_onstack; -}; - -#ifdef __KERNEL__ +#define __ARCH_HAS_KA_RESTORER  #include <asm/sigcontext.h> - -#define ptrace_signal_deliver(regs, cookie) do { } while (0) - -#endif -  #endif diff --git a/arch/alpha/include/asm/smp.h b/arch/alpha/include/asm/smp.h index 3f390e8cc0b..c46e714aa3e 100644 --- a/arch/alpha/include/asm/smp.h +++ b/arch/alpha/include/asm/smp.h @@ -39,8 +39,6 @@ struct cpuinfo_alpha {  extern struct cpuinfo_alpha cpu_data[NR_CPUS]; -#define PROC_CHANGE_PENALTY     20 -  #define hard_smp_processor_id()	__hard_smp_processor_id()  #define raw_smp_processor_id()	(current_thread_info()->cpu) diff --git a/arch/alpha/include/asm/socket.h b/arch/alpha/include/asm/socket.h index 06edfefc337..8d806d80ed2 100644 --- a/arch/alpha/include/asm/socket.h +++ b/arch/alpha/include/asm/socket.h @@ -1,77 +1,10 @@  #ifndef _ASM_SOCKET_H  #define _ASM_SOCKET_H -#include <asm/sockios.h> - -/* For setsockopt(2) */ -/* - * Note: we only bother about making the SOL_SOCKET options - * same as OSF/1, as that's all that "normal" programs are - * likely to set.  We don't necessarily want to be binary - * compatible with _everything_.  - */ -#define SOL_SOCKET	0xffff - -#define SO_DEBUG	0x0001 -#define SO_REUSEADDR	0x0004 -#define SO_KEEPALIVE	0x0008 -#define SO_DONTROUTE	0x0010 -#define SO_BROADCAST	0x0020 -#define SO_LINGER	0x0080 -#define SO_OOBINLINE	0x0100 -/* To add :#define SO_REUSEPORT 0x0200 */ - -#define SO_TYPE		0x1008 -#define SO_ERROR	0x1007 -#define SO_SNDBUF	0x1001 -#define SO_RCVBUF	0x1002 -#define SO_SNDBUFFORCE	0x100a -#define SO_RCVBUFFORCE	0x100b -#define	SO_RCVLOWAT	0x1010 -#define	SO_SNDLOWAT	0x1011 -#define	SO_RCVTIMEO	0x1012 -#define	SO_SNDTIMEO	0x1013 -#define SO_ACCEPTCONN	0x1014 -#define SO_PROTOCOL	0x1028 -#define SO_DOMAIN	0x1029 - -/* linux-specific, might as well be the same as on i386 */ -#define SO_NO_CHECK	11 -#define SO_PRIORITY	12 -#define SO_BSDCOMPAT	14 - -#define SO_PASSCRED	17 -#define SO_PEERCRED	18 -#define SO_BINDTODEVICE 25 - -/* Socket filtering */ -#define SO_ATTACH_FILTER        26 -#define SO_DETACH_FILTER        27 - -#define SO_PEERNAME		28 -#define SO_TIMESTAMP		29 -#define SCM_TIMESTAMP		SO_TIMESTAMP - -#define SO_PEERSEC		30 -#define SO_PASSSEC		34 -#define SO_TIMESTAMPNS		35 -#define SCM_TIMESTAMPNS		SO_TIMESTAMPNS - -/* Security levels - as per NRL IPv6 - don't actually do anything */ -#define SO_SECURITY_AUTHENTICATION		19 -#define SO_SECURITY_ENCRYPTION_TRANSPORT	20 -#define SO_SECURITY_ENCRYPTION_NETWORK		21 - -#define SO_MARK			36 - -#define SO_TIMESTAMPING		37 -#define SCM_TIMESTAMPING	SO_TIMESTAMPING - -#define SO_RXQ_OVFL             40 +#include <uapi/asm/socket.h>  /* O_NONBLOCK clashes with the bits used for socket types.  Therefore we   * have to define SOCK_NONBLOCK to a different value here.   */  #define SOCK_NONBLOCK	0x40000000 -  #endif /* _ASM_SOCKET_H */ diff --git a/arch/alpha/include/asm/special_insns.h b/arch/alpha/include/asm/special_insns.h new file mode 100644 index 00000000000..88d3452b21f --- /dev/null +++ b/arch/alpha/include/asm/special_insns.h @@ -0,0 +1,41 @@ +#ifndef __ALPHA_SPECIAL_INSNS_H +#define __ALPHA_SPECIAL_INSNS_H + +enum implver_enum { +	IMPLVER_EV4, +	IMPLVER_EV5, +	IMPLVER_EV6 +}; + +#ifdef CONFIG_ALPHA_GENERIC +#define implver()				\ +({ unsigned long __implver;			\ +   __asm__ ("implver %0" : "=r"(__implver));	\ +   (enum implver_enum) __implver; }) +#else +/* Try to eliminate some dead code.  */ +#ifdef CONFIG_ALPHA_EV4 +#define implver() IMPLVER_EV4 +#endif +#ifdef CONFIG_ALPHA_EV5 +#define implver() IMPLVER_EV5 +#endif +#if defined(CONFIG_ALPHA_EV6) +#define implver() IMPLVER_EV6 +#endif +#endif + +enum amask_enum { +	AMASK_BWX = (1UL << 0), +	AMASK_FIX = (1UL << 1), +	AMASK_CIX = (1UL << 2), +	AMASK_MAX = (1UL << 8), +	AMASK_PRECISE_TRAP = (1UL << 9), +}; + +#define amask(mask)						\ +({ unsigned long __amask, __input = (mask);			\ +   __asm__ ("amask %1,%0" : "=r"(__amask) : "rI"(__input));	\ +   __amask; }) + +#endif /* __ALPHA_SPECIAL_INSNS_H */ diff --git a/arch/alpha/include/asm/spinlock.h b/arch/alpha/include/asm/spinlock.h index d0faca1e992..37b570d0120 100644 --- a/arch/alpha/include/asm/spinlock.h +++ b/arch/alpha/include/asm/spinlock.h @@ -1,7 +1,6 @@  #ifndef _ALPHA_SPINLOCK_H  #define _ALPHA_SPINLOCK_H -#include <asm/system.h>  #include <linux/kernel.h>  #include <asm/current.h> @@ -169,8 +168,4 @@ static inline void arch_write_unlock(arch_rwlock_t * lock)  #define arch_read_lock_flags(lock, flags) arch_read_lock(lock)  #define arch_write_lock_flags(lock, flags) arch_write_lock(lock) -#define arch_spin_relax(lock)	cpu_relax() -#define arch_read_relax(lock)	cpu_relax() -#define arch_write_relax(lock)	cpu_relax() -  #endif /* _ALPHA_SPINLOCK_H */ diff --git a/arch/alpha/include/asm/string.h b/arch/alpha/include/asm/string.h index b02b8a28294..c2911f59170 100644 --- a/arch/alpha/include/asm/string.h +++ b/arch/alpha/include/asm/string.h @@ -22,15 +22,27 @@ extern void * __memcpy(void *, const void *, size_t);  #define __HAVE_ARCH_MEMSET  extern void * __constant_c_memset(void *, unsigned long, size_t); +extern void * ___memset(void *, int, size_t);  extern void * __memset(void *, int, size_t);  extern void * memset(void *, int, size_t); -#define memset(s, c, n)							    \ -(__builtin_constant_p(c)						    \ - ? (__builtin_constant_p(n) && (c) == 0					    \ -    ? __builtin_memset((s),0,(n)) 					    \ -    : __constant_c_memset((s),0x0101010101010101UL*(unsigned char)(c),(n))) \ - : __memset((s),(c),(n))) +/* For gcc 3.x, we cannot have the inline function named "memset" because +   the __builtin_memset will attempt to resolve to the inline as well, +   leading to a "sorry" about unimplemented recursive inlining.  */ +extern inline void *__memset(void *s, int c, size_t n) +{ +	if (__builtin_constant_p(c)) { +		if (__builtin_constant_p(n)) { +			return __builtin_memset(s, c, n); +		} else { +			unsigned long c8 = (c & 0xff) * 0x0101010101010101UL; +			return __constant_c_memset(s, c8, n); +		} +	} +	return ___memset(s, c, n); +} + +#define memset __memset  #define __HAVE_ARCH_STRCPY  extern char * strcpy(char *,const char *); diff --git a/arch/alpha/include/asm/switch_to.h b/arch/alpha/include/asm/switch_to.h new file mode 100644 index 00000000000..44c0d4f2c0b --- /dev/null +++ b/arch/alpha/include/asm/switch_to.h @@ -0,0 +1,14 @@ +#ifndef __ALPHA_SWITCH_TO_H +#define __ALPHA_SWITCH_TO_H + + +struct task_struct; +extern struct task_struct *alpha_switch_to(unsigned long, struct task_struct *); + +#define switch_to(P,N,L)						 \ +  do {									 \ +    (L) = alpha_switch_to(virt_to_phys(&task_thread_info(N)->pcb), (P)); \ +    check_mmu_context();						 \ +  } while (0) + +#endif /* __ALPHA_SWITCH_TO_H */ diff --git a/arch/alpha/include/asm/system.h b/arch/alpha/include/asm/system.h deleted file mode 100644 index 9f78e693463..00000000000 --- a/arch/alpha/include/asm/system.h +++ /dev/null @@ -1,354 +0,0 @@ -#ifndef __ALPHA_SYSTEM_H -#define __ALPHA_SYSTEM_H - -#include <asm/pal.h> -#include <asm/page.h> -#include <asm/barrier.h> - -/* - * System defines.. Note that this is included both from .c and .S - * files, so it does only defines, not any C code. - */ - -/* - * We leave one page for the initial stack page, and one page for - * the initial process structure. Also, the console eats 3 MB for - * the initial bootloader (one of which we can reclaim later). - */ -#define BOOT_PCB	0x20000000 -#define BOOT_ADDR	0x20000000 -/* Remove when official MILO sources have ELF support: */ -#define BOOT_SIZE	(16*1024) - -#ifdef CONFIG_ALPHA_LEGACY_START_ADDRESS -#define KERNEL_START_PHYS	0x300000 /* Old bootloaders hardcoded this.  */ -#else -#define KERNEL_START_PHYS	0x1000000 /* required: Wildfire/Titan/Marvel */ -#endif - -#define KERNEL_START	(PAGE_OFFSET+KERNEL_START_PHYS) -#define SWAPPER_PGD	KERNEL_START -#define INIT_STACK	(PAGE_OFFSET+KERNEL_START_PHYS+0x02000) -#define EMPTY_PGT	(PAGE_OFFSET+KERNEL_START_PHYS+0x04000) -#define EMPTY_PGE	(PAGE_OFFSET+KERNEL_START_PHYS+0x08000) -#define ZERO_PGE	(PAGE_OFFSET+KERNEL_START_PHYS+0x0A000) - -#define START_ADDR	(PAGE_OFFSET+KERNEL_START_PHYS+0x10000) - -/* - * This is setup by the secondary bootstrap loader.  Because - * the zero page is zeroed out as soon as the vm system is - * initialized, we need to copy things out into a more permanent - * place. - */ -#define PARAM			ZERO_PGE -#define COMMAND_LINE		((char*)(PARAM + 0x0000)) -#define INITRD_START		(*(unsigned long *) (PARAM+0x100)) -#define INITRD_SIZE		(*(unsigned long *) (PARAM+0x108)) - -#ifndef __ASSEMBLY__ -#include <linux/kernel.h> -#define AT_VECTOR_SIZE_ARCH 4 /* entries in ARCH_DLINFO */ - -/* - * This is the logout header that should be common to all platforms - * (assuming they are running OSF/1 PALcode, I guess). - */ -struct el_common { -	unsigned int	size;		/* size in bytes of logout area */ -	unsigned int	sbz1	: 30;	/* should be zero */ -	unsigned int	err2	:  1;	/* second error */ -	unsigned int	retry	:  1;	/* retry flag */ -	unsigned int	proc_offset;	/* processor-specific offset */ -	unsigned int	sys_offset;	/* system-specific offset */ -	unsigned int	code;		/* machine check code */ -	unsigned int	frame_rev;	/* frame revision */ -}; - -/* Machine Check Frame for uncorrectable errors (Large format) - *      --- This is used to log uncorrectable errors such as - *          double bit ECC errors. - *      --- These errors are detected by both processor and systems. - */ -struct el_common_EV5_uncorrectable_mcheck { -        unsigned long   shadow[8];        /* Shadow reg. 8-14, 25           */ -        unsigned long   paltemp[24];      /* PAL TEMP REGS.                 */ -        unsigned long   exc_addr;         /* Address of excepting instruction*/ -        unsigned long   exc_sum;          /* Summary of arithmetic traps.   */ -        unsigned long   exc_mask;         /* Exception mask (from exc_sum). */ -        unsigned long   pal_base;         /* Base address for PALcode.      */ -        unsigned long   isr;              /* Interrupt Status Reg.          */ -        unsigned long   icsr;             /* CURRENT SETUP OF EV5 IBOX      */ -        unsigned long   ic_perr_stat;     /* I-CACHE Reg. <11> set Data parity -                                                         <12> set TAG parity*/ -        unsigned long   dc_perr_stat;     /* D-CACHE error Reg. Bits set to 1: -                                                     <2> Data error in bank 0 -                                                     <3> Data error in bank 1 -                                                     <4> Tag error in bank 0 -                                                     <5> Tag error in bank 1 */ -        unsigned long   va;               /* Effective VA of fault or miss. */ -        unsigned long   mm_stat;          /* Holds the reason for D-stream  -                                             fault or D-cache parity errors */ -        unsigned long   sc_addr;          /* Address that was being accessed -                                             when EV5 detected Secondary cache -                                             failure.                 */ -        unsigned long   sc_stat;          /* Helps determine if the error was -                                             TAG/Data parity(Secondary Cache)*/ -        unsigned long   bc_tag_addr;      /* Contents of EV5 BC_TAG_ADDR    */ -        unsigned long   ei_addr;          /* Physical address of any transfer -                                             that is logged in EV5 EI_STAT */ -        unsigned long   fill_syndrome;    /* For correcting ECC errors.     */ -        unsigned long   ei_stat;          /* Helps identify reason of any  -                                             processor uncorrectable error -                                             at its external interface.     */ -        unsigned long   ld_lock;          /* Contents of EV5 LD_LOCK register*/ -}; - -struct el_common_EV6_mcheck { -	unsigned int FrameSize;		/* Bytes, including this field */ -	unsigned int FrameFlags;	/* <31> = Retry, <30> = Second Error */ -	unsigned int CpuOffset;		/* Offset to CPU-specific info */ -	unsigned int SystemOffset;	/* Offset to system-specific info */ -	unsigned int MCHK_Code; -	unsigned int MCHK_Frame_Rev; -	unsigned long I_STAT;		/* EV6 Internal Processor Registers */ -	unsigned long DC_STAT;		/* (See the 21264 Spec) */ -	unsigned long C_ADDR; -	unsigned long DC1_SYNDROME; -	unsigned long DC0_SYNDROME; -	unsigned long C_STAT; -	unsigned long C_STS; -	unsigned long MM_STAT; -	unsigned long EXC_ADDR; -	unsigned long IER_CM; -	unsigned long ISUM; -	unsigned long RESERVED0; -	unsigned long PAL_BASE; -	unsigned long I_CTL; -	unsigned long PCTX; -}; - -extern void halt(void) __attribute__((noreturn)); -#define __halt() __asm__ __volatile__ ("call_pal %0 #halt" : : "i" (PAL_halt)) - -#define switch_to(P,N,L)						 \ -  do {									 \ -    (L) = alpha_switch_to(virt_to_phys(&task_thread_info(N)->pcb), (P)); \ -    check_mmu_context();						 \ -  } while (0) - -struct task_struct; -extern struct task_struct *alpha_switch_to(unsigned long, struct task_struct*); - -#define imb() \ -__asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory") - -#define draina() \ -__asm__ __volatile__ ("call_pal %0 #draina" : : "i" (PAL_draina) : "memory") - -enum implver_enum { -	IMPLVER_EV4, -	IMPLVER_EV5, -	IMPLVER_EV6 -}; - -#ifdef CONFIG_ALPHA_GENERIC -#define implver()				\ -({ unsigned long __implver;			\ -   __asm__ ("implver %0" : "=r"(__implver));	\ -   (enum implver_enum) __implver; }) -#else -/* Try to eliminate some dead code.  */ -#ifdef CONFIG_ALPHA_EV4 -#define implver() IMPLVER_EV4 -#endif -#ifdef CONFIG_ALPHA_EV5 -#define implver() IMPLVER_EV5 -#endif -#if defined(CONFIG_ALPHA_EV6) -#define implver() IMPLVER_EV6 -#endif -#endif - -enum amask_enum { -	AMASK_BWX = (1UL << 0), -	AMASK_FIX = (1UL << 1), -	AMASK_CIX = (1UL << 2), -	AMASK_MAX = (1UL << 8), -	AMASK_PRECISE_TRAP = (1UL << 9), -}; - -#define amask(mask)						\ -({ unsigned long __amask, __input = (mask);			\ -   __asm__ ("amask %1,%0" : "=r"(__amask) : "rI"(__input));	\ -   __amask; }) - -#define __CALL_PAL_R0(NAME, TYPE)				\ -extern inline TYPE NAME(void)					\ -{								\ -	register TYPE __r0 __asm__("$0");			\ -	__asm__ __volatile__(					\ -		"call_pal %1 # " #NAME				\ -		:"=r" (__r0)					\ -		:"i" (PAL_ ## NAME)				\ -		:"$1", "$16", "$22", "$23", "$24", "$25");	\ -	return __r0;						\ -} - -#define __CALL_PAL_W1(NAME, TYPE0)				\ -extern inline void NAME(TYPE0 arg0)				\ -{								\ -	register TYPE0 __r16 __asm__("$16") = arg0;		\ -	__asm__ __volatile__(					\ -		"call_pal %1 # "#NAME				\ -		: "=r"(__r16)					\ -		: "i"(PAL_ ## NAME), "0"(__r16)			\ -		: "$1", "$22", "$23", "$24", "$25");		\ -} - -#define __CALL_PAL_W2(NAME, TYPE0, TYPE1)			\ -extern inline void NAME(TYPE0 arg0, TYPE1 arg1)			\ -{								\ -	register TYPE0 __r16 __asm__("$16") = arg0;		\ -	register TYPE1 __r17 __asm__("$17") = arg1;		\ -	__asm__ __volatile__(					\ -		"call_pal %2 # "#NAME				\ -		: "=r"(__r16), "=r"(__r17)			\ -		: "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17)	\ -		: "$1", "$22", "$23", "$24", "$25");		\ -} - -#define __CALL_PAL_RW1(NAME, RTYPE, TYPE0)			\ -extern inline RTYPE NAME(TYPE0 arg0)				\ -{								\ -	register RTYPE __r0 __asm__("$0");			\ -	register TYPE0 __r16 __asm__("$16") = arg0;		\ -	__asm__ __volatile__(					\ -		"call_pal %2 # "#NAME				\ -		: "=r"(__r16), "=r"(__r0)			\ -		: "i"(PAL_ ## NAME), "0"(__r16)			\ -		: "$1", "$22", "$23", "$24", "$25");		\ -	return __r0;						\ -} - -#define __CALL_PAL_RW2(NAME, RTYPE, TYPE0, TYPE1)		\ -extern inline RTYPE NAME(TYPE0 arg0, TYPE1 arg1)		\ -{								\ -	register RTYPE __r0 __asm__("$0");			\ -	register TYPE0 __r16 __asm__("$16") = arg0;		\ -	register TYPE1 __r17 __asm__("$17") = arg1;		\ -	__asm__ __volatile__(					\ -		"call_pal %3 # "#NAME				\ -		: "=r"(__r16), "=r"(__r17), "=r"(__r0)		\ -		: "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17)	\ -		: "$1", "$22", "$23", "$24", "$25");		\ -	return __r0;						\ -} - -__CALL_PAL_W1(cflush, unsigned long); -__CALL_PAL_R0(rdmces, unsigned long); -__CALL_PAL_R0(rdps, unsigned long); -__CALL_PAL_R0(rdusp, unsigned long); -__CALL_PAL_RW1(swpipl, unsigned long, unsigned long); -__CALL_PAL_R0(whami, unsigned long); -__CALL_PAL_W2(wrent, void*, unsigned long); -__CALL_PAL_W1(wripir, unsigned long); -__CALL_PAL_W1(wrkgp, unsigned long); -__CALL_PAL_W1(wrmces, unsigned long); -__CALL_PAL_RW2(wrperfmon, unsigned long, unsigned long, unsigned long); -__CALL_PAL_W1(wrusp, unsigned long); -__CALL_PAL_W1(wrvptptr, unsigned long); - -/* - * TB routines.. - */ -#define __tbi(nr,arg,arg1...)					\ -({								\ -	register unsigned long __r16 __asm__("$16") = (nr);	\ -	register unsigned long __r17 __asm__("$17"); arg;	\ -	__asm__ __volatile__(					\ -		"call_pal %3 #__tbi"				\ -		:"=r" (__r16),"=r" (__r17)			\ -		:"0" (__r16),"i" (PAL_tbi) ,##arg1		\ -		:"$0", "$1", "$22", "$23", "$24", "$25");	\ -}) - -#define tbi(x,y)	__tbi(x,__r17=(y),"1" (__r17)) -#define tbisi(x)	__tbi(1,__r17=(x),"1" (__r17)) -#define tbisd(x)	__tbi(2,__r17=(x),"1" (__r17)) -#define tbis(x)		__tbi(3,__r17=(x),"1" (__r17)) -#define tbiap()		__tbi(-1, /* no second argument */) -#define tbia()		__tbi(-2, /* no second argument */) - -/* - * Atomic exchange routines. - */ - -#define __ASM__MB -#define ____xchg(type, args...)		__xchg ## type ## _local(args) -#define ____cmpxchg(type, args...)	__cmpxchg ## type ## _local(args) -#include <asm/xchg.h> - -#define xchg_local(ptr,x)						\ -  ({									\ -     __typeof__(*(ptr)) _x_ = (x);					\ -     (__typeof__(*(ptr))) __xchg_local((ptr), (unsigned long)_x_,	\ -				       sizeof(*(ptr)));			\ -  }) - -#define cmpxchg_local(ptr, o, n)					\ -  ({									\ -     __typeof__(*(ptr)) _o_ = (o);					\ -     __typeof__(*(ptr)) _n_ = (n);					\ -     (__typeof__(*(ptr))) __cmpxchg_local((ptr), (unsigned long)_o_,	\ -					  (unsigned long)_n_,		\ -					  sizeof(*(ptr)));		\ -  }) - -#define cmpxchg64_local(ptr, o, n)					\ -  ({									\ -	BUILD_BUG_ON(sizeof(*(ptr)) != 8);				\ -	cmpxchg_local((ptr), (o), (n));					\ -  }) - -#ifdef CONFIG_SMP -#undef __ASM__MB -#define __ASM__MB	"\tmb\n" -#endif -#undef ____xchg -#undef ____cmpxchg -#define ____xchg(type, args...)		__xchg ##type(args) -#define ____cmpxchg(type, args...)	__cmpxchg ##type(args) -#include <asm/xchg.h> - -#define xchg(ptr,x)							\ -  ({									\ -     __typeof__(*(ptr)) _x_ = (x);					\ -     (__typeof__(*(ptr))) __xchg((ptr), (unsigned long)_x_,		\ -				 sizeof(*(ptr)));			\ -  }) - -#define cmpxchg(ptr, o, n)						\ -  ({									\ -     __typeof__(*(ptr)) _o_ = (o);					\ -     __typeof__(*(ptr)) _n_ = (n);					\ -     (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,		\ -				    (unsigned long)_n_,	sizeof(*(ptr)));\ -  }) - -#define cmpxchg64(ptr, o, n)						\ -  ({									\ -	BUILD_BUG_ON(sizeof(*(ptr)) != 8);				\ -	cmpxchg((ptr), (o), (n));					\ -  }) - -#undef __ASM__MB -#undef ____cmpxchg - -#define __HAVE_ARCH_CMPXCHG 1 - -#endif /* __ASSEMBLY__ */ - -#define arch_align_stack(x) (x) - -#endif diff --git a/arch/alpha/include/asm/termios.h b/arch/alpha/include/asm/termios.h index fa13716a11c..7fde0f88da8 100644 --- a/arch/alpha/include/asm/termios.h +++ b/arch/alpha/include/asm/termios.h @@ -1,72 +1,8 @@  #ifndef _ALPHA_TERMIOS_H  #define _ALPHA_TERMIOS_H -#include <asm/ioctls.h> -#include <asm/termbits.h> +#include <uapi/asm/termios.h> -struct sgttyb { -	char	sg_ispeed; -	char	sg_ospeed; -	char	sg_erase; -	char	sg_kill; -	short	sg_flags; -}; - -struct tchars { -	char	t_intrc; -	char	t_quitc; -	char	t_startc; -	char	t_stopc; -	char	t_eofc; -	char	t_brkc; -}; - -struct ltchars { -	char	t_suspc; -	char	t_dsuspc; -	char	t_rprntc; -	char	t_flushc; -	char	t_werasc; -	char	t_lnextc; -}; - -struct winsize { -	unsigned short ws_row; -	unsigned short ws_col; -	unsigned short ws_xpixel; -	unsigned short ws_ypixel; -}; - -#define NCC 8 -struct termio { -	unsigned short c_iflag;		/* input mode flags */ -	unsigned short c_oflag;		/* output mode flags */ -	unsigned short c_cflag;		/* control mode flags */ -	unsigned short c_lflag;		/* local mode flags */ -	unsigned char c_line;		/* line discipline */ -	unsigned char c_cc[NCC];	/* control characters */ -}; - -/* - * c_cc characters in the termio structure.  Oh, how I love being - * backwardly compatible.  Notice that character 4 and 5 are - * interpreted differently depending on whether ICANON is set in - * c_lflag.  If it's set, they are used as _VEOF and _VEOL, otherwise - * as _VMIN and V_TIME.  This is for compatibility with OSF/1 (which - * is compatible with sysV)... - */ -#define _VINTR	0 -#define _VQUIT	1 -#define _VERASE	2 -#define _VKILL	3 -#define _VEOF	4 -#define _VMIN	4 -#define _VEOL	5 -#define _VTIME	5 -#define _VEOL2	6 -#define _VSWTC	7 - -#ifdef __KERNEL__  /*	eof=^D		eol=\0		eol2=\0		erase=del  	werase=^W	kill=^U		reprint=^R	sxtc=\0  	intr=^C		quit=^\		susp=^Z		<OSF/1 VDSUSP> @@ -141,6 +77,4 @@ struct termio {  #define kernel_termios_to_user_termios(u, k) \  	copy_to_user(u, k, sizeof(struct termios)) -#endif	/* __KERNEL__ */ -  #endif	/* _ALPHA_TERMIOS_H */ diff --git a/arch/alpha/include/asm/thread_info.h b/arch/alpha/include/asm/thread_info.h index 6f32f9c84a2..48bbea6898b 100644 --- a/arch/alpha/include/asm/thread_info.h +++ b/arch/alpha/include/asm/thread_info.h @@ -7,6 +7,7 @@  #include <asm/processor.h>  #include <asm/types.h>  #include <asm/hwrpb.h> +#include <asm/sysinfo.h>  #endif  #ifndef __ASSEMBLY__ @@ -21,6 +22,7 @@ struct thread_info {  	mm_segment_t		addr_limit;	/* thread address space */  	unsigned		cpu;		/* current CPU */  	int			preempt_count; /* 0 => preemptable, <0 => BUG */ +	unsigned int		status;		/* thread-synchronous flags */  	int bpt_nsaved;  	unsigned long bpt_addr[2];		/* breakpoint handling  */ @@ -56,15 +58,11 @@ register struct thread_info *__current_thread_info __asm__("$8");  #define THREAD_SIZE_ORDER 1  #define THREAD_SIZE (2*PAGE_SIZE) -#define PREEMPT_ACTIVE		0x40000000 -  /*   * Thread information flags:   * - these are process state flags and used from assembly   * - pending work-to-be-done flags come first and must be assigned to be   *   within bits 0 to 7 to fit in and immediate operand. - * - ALPHA_UAC_SHIFT below must be kept consistent with the unaligned - *   control flags.   *   * TIF_SYSCALL_TRACE is known to be 0 via blbs.   */ @@ -72,22 +70,17 @@ register struct thread_info *__current_thread_info __asm__("$8");  #define TIF_NOTIFY_RESUME	1	/* callback before returning to user */  #define TIF_SIGPENDING		2	/* signal pending */  #define TIF_NEED_RESCHED	3	/* rescheduling necessary */ -#define TIF_POLLING_NRFLAG	8	/* poll_idle is polling NEED_RESCHED */ +#define TIF_SYSCALL_AUDIT	4	/* syscall audit active */  #define TIF_DIE_IF_KERNEL	9	/* dik recursion lock */ -#define TIF_UAC_NOPRINT		10	/* see sysinfo.h */ -#define TIF_UAC_NOFIX		11 -#define TIF_UAC_SIGBUS		12  #define TIF_MEMDIE		13	/* is terminating due to OOM killer */ -#define TIF_RESTORE_SIGMASK	14	/* restore signal mask in do_signal */ -#define TIF_FREEZE		16	/* is freezing for suspend */ +#define TIF_POLLING_NRFLAG	14	/* idle is polling for TIF_NEED_RESCHED */  #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)  #define _TIF_SIGPENDING		(1<<TIF_SIGPENDING)  #define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED) -#define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG) -#define _TIF_RESTORE_SIGMASK	(1<<TIF_RESTORE_SIGMASK)  #define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME) -#define _TIF_FREEZE		(1<<TIF_FREEZE) +#define _TIF_SYSCALL_AUDIT	(1<<TIF_SYSCALL_AUDIT) +#define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG)  /* Work to do on interrupt/exception return.  */  #define _TIF_WORK_MASK		(_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ @@ -97,26 +90,58 @@ register struct thread_info *__current_thread_info __asm__("$8");  #define _TIF_ALLWORK_MASK	(_TIF_WORK_MASK		\  				 | _TIF_SYSCALL_TRACE) -#define ALPHA_UAC_SHIFT		10 -#define ALPHA_UAC_MASK		(1 << TIF_UAC_NOPRINT | 1 << TIF_UAC_NOFIX | \ -				 1 << TIF_UAC_SIGBUS) +#define TS_UAC_NOPRINT		0x0001	/* ! Preserve the following three */ +#define TS_UAC_NOFIX		0x0002	/* ! flags as they match          */ +#define TS_UAC_SIGBUS		0x0004	/* ! userspace part of 'osf_sysinfo' */ +#define TS_RESTORE_SIGMASK	0x0008	/* restore signal mask in do_signal() */ + +#ifndef __ASSEMBLY__ +#define HAVE_SET_RESTORE_SIGMASK	1 +static inline void set_restore_sigmask(void) +{ +	struct thread_info *ti = current_thread_info(); +	ti->status |= TS_RESTORE_SIGMASK; +	WARN_ON(!test_bit(TIF_SIGPENDING, (unsigned long *)&ti->flags)); +} +static inline void clear_restore_sigmask(void) +{ +	current_thread_info()->status &= ~TS_RESTORE_SIGMASK; +} +static inline bool test_restore_sigmask(void) +{ +	return current_thread_info()->status & TS_RESTORE_SIGMASK; +} +static inline bool test_and_clear_restore_sigmask(void) +{ +	struct thread_info *ti = current_thread_info(); +	if (!(ti->status & TS_RESTORE_SIGMASK)) +		return false; +	ti->status &= ~TS_RESTORE_SIGMASK; +	return true; +} +#endif -#define SET_UNALIGN_CTL(task,value)	({				     \ -	task_thread_info(task)->flags = ((task_thread_info(task)->flags &    \ -		~ALPHA_UAC_MASK)					     \ -		| (((value) << ALPHA_UAC_SHIFT)       & (1<<TIF_UAC_NOPRINT))\ -		| (((value) << (ALPHA_UAC_SHIFT + 1)) & (1<<TIF_UAC_SIGBUS)) \ -		| (((value) << (ALPHA_UAC_SHIFT - 1)) & (1<<TIF_UAC_NOFIX)));\ +#define SET_UNALIGN_CTL(task,value)	({				\ +	__u32 status = task_thread_info(task)->status & ~UAC_BITMASK;	\ +	if (value & PR_UNALIGN_NOPRINT)					\ +		status |= TS_UAC_NOPRINT;				\ +	if (value & PR_UNALIGN_SIGBUS)					\ +		status |= TS_UAC_SIGBUS;				\ +	if (value & 4)	/* alpha-specific */				\ +		status |= TS_UAC_NOFIX;					\ +	task_thread_info(task)->status = status;			\  	0; })  #define GET_UNALIGN_CTL(task,value)	({				\ -	put_user((task_thread_info(task)->flags & (1 << TIF_UAC_NOPRINT))\ -		  >> ALPHA_UAC_SHIFT					\ -		 | (task_thread_info(task)->flags & (1 << TIF_UAC_SIGBUS))\ -		 >> (ALPHA_UAC_SHIFT + 1)				\ -		 | (task_thread_info(task)->flags & (1 << TIF_UAC_NOFIX))\ -		 >> (ALPHA_UAC_SHIFT - 1),				\ -		 (int __user *)(value));				\ +	__u32 status = task_thread_info(task)->status & ~UAC_BITMASK;	\ +	__u32 res = 0;							\ +	if (status & TS_UAC_NOPRINT)					\ +		res |= PR_UNALIGN_NOPRINT;				\ +	if (status & TS_UAC_SIGBUS)					\ +		res |= PR_UNALIGN_SIGBUS;				\ +	if (status & TS_UAC_NOFIX)					\ +		res |= 4;						\ +	put_user(res, (int __user *)(value));				\  	})  #endif /* __KERNEL__ */ diff --git a/arch/alpha/include/asm/types.h b/arch/alpha/include/asm/types.h index bd621ecd1eb..f61e1a56c37 100644 --- a/arch/alpha/include/asm/types.h +++ b/arch/alpha/include/asm/types.h @@ -1,35 +1,7 @@  #ifndef _ALPHA_TYPES_H  #define _ALPHA_TYPES_H -/* - * This file is never included by application software unless - * explicitly requested (e.g., via linux/types.h) in which case the - * application is Linux specific so (user-) name space pollution is - * not a major issue.  However, for interoperability, libraries still - * need to be careful to avoid a name clashes. - */ - -#ifdef __KERNEL__  #include <asm-generic/int-ll64.h> -#else -#include <asm-generic/int-l64.h> -#endif - -#ifndef __ASSEMBLY__ - -typedef unsigned int umode_t; - -#endif /* __ASSEMBLY__ */ - -/* - * These aren't exported outside the kernel to avoid name space clashes - */ -#ifdef __KERNEL__ -#ifndef __ASSEMBLY__ - -typedef u64 dma_addr_t; -typedef u64 dma64_addr_t; +#include <uapi/asm/types.h> -#endif /* __ASSEMBLY__ */ -#endif /* __KERNEL__ */  #endif /* _ALPHA_TYPES_H */ diff --git a/arch/alpha/include/asm/uaccess.h b/arch/alpha/include/asm/uaccess.h index b49ec2f8d6e..766fdfde2b7 100644 --- a/arch/alpha/include/asm/uaccess.h +++ b/arch/alpha/include/asm/uaccess.h @@ -433,36 +433,12 @@ clear_user(void __user *to, long len)  #undef __module_address  #undef __module_call -/* Returns: -EFAULT if exception before terminator, N if the entire -   buffer filled, else strlen.  */ +#define user_addr_max() \ +        (segment_eq(get_fs(), USER_DS) ? TASK_SIZE : ~0UL) -extern long __strncpy_from_user(char *__to, const char __user *__from, long __to_len); - -extern inline long -strncpy_from_user(char *to, const char __user *from, long n) -{ -	long ret = -EFAULT; -	if (__access_ok((unsigned long)from, 0, get_fs())) -		ret = __strncpy_from_user(to, from, n); -	return ret; -} - -/* Returns: 0 if bad, string length+1 (memory size) of string if ok */ -extern long __strlen_user(const char __user *); - -extern inline long strlen_user(const char __user *str) -{ -	return access_ok(VERIFY_READ,str,0) ? __strlen_user(str) : 0; -} - -/* Returns: 0 if exception before NUL or reaching the supplied limit (N), - * a value greater than N if the limit would be exceeded, else strlen.  */ -extern long __strnlen_user(const char __user *, long); - -extern inline long strnlen_user(const char __user *str, long n) -{ -	return access_ok(VERIFY_READ,str,0) ? __strnlen_user(str, n) : 0; -} +extern long strncpy_from_user(char *dest, const char __user *src, long count); +extern __must_check long strlen_user(const char __user *str); +extern __must_check long strnlen_user(const char __user *str, long n);  /*   * About the exception table: diff --git a/arch/alpha/include/asm/unistd.h b/arch/alpha/include/asm/unistd.h index 058937bf5a7..f2c94402e2c 100644 --- a/arch/alpha/include/asm/unistd.h +++ b/arch/alpha/include/asm/unistd.h @@ -1,463 +1,10 @@  #ifndef _ALPHA_UNISTD_H  #define _ALPHA_UNISTD_H -#define __NR_osf_syscall	  0	/* not implemented */ -#define __NR_exit		  1 -#define __NR_fork		  2 -#define __NR_read		  3 -#define __NR_write		  4 -#define __NR_osf_old_open	  5	/* not implemented */ -#define __NR_close		  6 -#define __NR_osf_wait4		  7 -#define __NR_osf_old_creat	  8	/* not implemented */ -#define __NR_link		  9 -#define __NR_unlink		 10 -#define __NR_osf_execve		 11	/* not implemented */ -#define __NR_chdir		 12 -#define __NR_fchdir		 13 -#define __NR_mknod		 14 -#define __NR_chmod		 15 -#define __NR_chown		 16 -#define __NR_brk		 17 -#define __NR_osf_getfsstat	 18	/* not implemented */ -#define __NR_lseek		 19 -#define __NR_getxpid		 20 -#define __NR_osf_mount		 21 -#define __NR_umount		 22 -#define __NR_setuid		 23 -#define __NR_getxuid		 24 -#define __NR_exec_with_loader	 25	/* not implemented */ -#define __NR_ptrace		 26 -#define __NR_osf_nrecvmsg	 27	/* not implemented */ -#define __NR_osf_nsendmsg	 28	/* not implemented */ -#define __NR_osf_nrecvfrom	 29	/* not implemented */ -#define __NR_osf_naccept	 30	/* not implemented */ -#define __NR_osf_ngetpeername	 31	/* not implemented */ -#define __NR_osf_ngetsockname	 32	/* not implemented */ -#define __NR_access		 33 -#define __NR_osf_chflags	 34	/* not implemented */ -#define __NR_osf_fchflags	 35	/* not implemented */ -#define __NR_sync		 36 -#define __NR_kill		 37 -#define __NR_osf_old_stat	 38	/* not implemented */ -#define __NR_setpgid		 39 -#define __NR_osf_old_lstat	 40	/* not implemented */ -#define __NR_dup		 41 -#define __NR_pipe		 42 -#define __NR_osf_set_program_attributes	43 -#define __NR_osf_profil		 44	/* not implemented */ -#define __NR_open		 45 -#define __NR_osf_old_sigaction	 46	/* not implemented */ -#define __NR_getxgid		 47 -#define __NR_osf_sigprocmask	 48 -#define __NR_osf_getlogin	 49	/* not implemented */ -#define __NR_osf_setlogin	 50	/* not implemented */ -#define __NR_acct		 51 -#define __NR_sigpending		 52 +#include <uapi/asm/unistd.h> -#define __NR_ioctl		 54 -#define __NR_osf_reboot		 55	/* not implemented */ -#define __NR_osf_revoke		 56	/* not implemented */ -#define __NR_symlink		 57 -#define __NR_readlink		 58 -#define __NR_execve		 59 -#define __NR_umask		 60 -#define __NR_chroot		 61 -#define __NR_osf_old_fstat	 62	/* not implemented */ -#define __NR_getpgrp		 63 -#define __NR_getpagesize	 64 -#define __NR_osf_mremap		 65	/* not implemented */ -#define __NR_vfork		 66 -#define __NR_stat		 67 -#define __NR_lstat		 68 -#define __NR_osf_sbrk		 69	/* not implemented */ -#define __NR_osf_sstk		 70	/* not implemented */ -#define __NR_mmap		 71	/* OSF/1 mmap is superset of Linux */ -#define __NR_osf_old_vadvise	 72	/* not implemented */ -#define __NR_munmap		 73 -#define __NR_mprotect		 74 -#define __NR_madvise		 75 -#define __NR_vhangup		 76 -#define __NR_osf_kmodcall	 77	/* not implemented */ -#define __NR_osf_mincore	 78	/* not implemented */ -#define __NR_getgroups		 79 -#define __NR_setgroups		 80 -#define __NR_osf_old_getpgrp	 81	/* not implemented */ -#define __NR_setpgrp		 82	/* BSD alias for setpgid */ -#define __NR_osf_setitimer	 83 -#define __NR_osf_old_wait	 84	/* not implemented */ -#define __NR_osf_table		 85	/* not implemented */ -#define __NR_osf_getitimer	 86 -#define __NR_gethostname	 87 -#define __NR_sethostname	 88 -#define __NR_getdtablesize	 89 -#define __NR_dup2		 90 -#define __NR_fstat		 91 -#define __NR_fcntl		 92 -#define __NR_osf_select		 93 -#define __NR_poll		 94 -#define __NR_fsync		 95 -#define __NR_setpriority	 96 -#define __NR_socket		 97 -#define __NR_connect		 98 -#define __NR_accept		 99 -#define __NR_getpriority	100 -#define __NR_send		101 -#define __NR_recv		102 -#define __NR_sigreturn		103 -#define __NR_bind		104 -#define __NR_setsockopt		105 -#define __NR_listen		106 -#define __NR_osf_plock		107	/* not implemented */ -#define __NR_osf_old_sigvec	108	/* not implemented */ -#define __NR_osf_old_sigblock	109	/* not implemented */ -#define __NR_osf_old_sigsetmask	110	/* not implemented */ -#define __NR_sigsuspend		111 -#define __NR_osf_sigstack	112 -#define __NR_recvmsg		113 -#define __NR_sendmsg		114 -#define __NR_osf_old_vtrace	115	/* not implemented */ -#define __NR_osf_gettimeofday	116 -#define __NR_osf_getrusage	117 -#define __NR_getsockopt		118 +#define NR_SYSCALLS			508 -#define __NR_readv		120 -#define __NR_writev		121 -#define __NR_osf_settimeofday	122 -#define __NR_fchown		123 -#define __NR_fchmod		124 -#define __NR_recvfrom		125 -#define __NR_setreuid		126 -#define __NR_setregid		127 -#define __NR_rename		128 -#define __NR_truncate		129 -#define __NR_ftruncate		130 -#define __NR_flock		131 -#define __NR_setgid		132 -#define __NR_sendto		133 -#define __NR_shutdown		134 -#define __NR_socketpair		135 -#define __NR_mkdir		136 -#define __NR_rmdir		137 -#define __NR_osf_utimes		138 -#define __NR_osf_old_sigreturn	139	/* not implemented */ -#define __NR_osf_adjtime	140	/* not implemented */ -#define __NR_getpeername	141 -#define __NR_osf_gethostid	142	/* not implemented */ -#define __NR_osf_sethostid	143	/* not implemented */ -#define __NR_getrlimit		144 -#define __NR_setrlimit		145 -#define __NR_osf_old_killpg	146	/* not implemented */ -#define __NR_setsid		147 -#define __NR_quotactl		148 -#define __NR_osf_oldquota	149	/* not implemented */ -#define __NR_getsockname	150 - -#define __NR_osf_pid_block	153	/* not implemented */ -#define __NR_osf_pid_unblock	154	/* not implemented */ - -#define __NR_sigaction		156 -#define __NR_osf_sigwaitprim	157	/* not implemented */ -#define __NR_osf_nfssvc		158	/* not implemented */ -#define __NR_osf_getdirentries	159 -#define __NR_osf_statfs		160 -#define __NR_osf_fstatfs	161 - -#define __NR_osf_asynch_daemon	163	/* not implemented */ -#define __NR_osf_getfh		164	/* not implemented */	 -#define __NR_osf_getdomainname	165 -#define __NR_setdomainname	166 - -#define __NR_osf_exportfs	169	/* not implemented */ - -#define __NR_osf_alt_plock	181	/* not implemented */ - -#define __NR_osf_getmnt		184	/* not implemented */ - -#define __NR_osf_alt_sigpending	187	/* not implemented */ -#define __NR_osf_alt_setsid	188	/* not implemented */ - -#define __NR_osf_swapon		199 -#define __NR_msgctl		200 -#define __NR_msgget		201 -#define __NR_msgrcv		202 -#define __NR_msgsnd		203 -#define __NR_semctl		204 -#define __NR_semget		205 -#define __NR_semop		206 -#define __NR_osf_utsname	207 -#define __NR_lchown		208 -#define __NR_osf_shmat		209 -#define __NR_shmctl		210 -#define __NR_shmdt		211 -#define __NR_shmget		212 -#define __NR_osf_mvalid		213	/* not implemented */ -#define __NR_osf_getaddressconf	214	/* not implemented */ -#define __NR_osf_msleep		215	/* not implemented */ -#define __NR_osf_mwakeup	216	/* not implemented */ -#define __NR_msync		217 -#define __NR_osf_signal		218	/* not implemented */ -#define __NR_osf_utc_gettime	219	/* not implemented */ -#define __NR_osf_utc_adjtime	220	/* not implemented */ - -#define __NR_osf_security	222	/* not implemented */ -#define __NR_osf_kloadcall	223	/* not implemented */ - -#define __NR_getpgid		233 -#define __NR_getsid		234 -#define __NR_sigaltstack	235 -#define __NR_osf_waitid		236	/* not implemented */ -#define __NR_osf_priocntlset	237	/* not implemented */ -#define __NR_osf_sigsendset	238	/* not implemented */ -#define __NR_osf_set_speculative	239	/* not implemented */ -#define __NR_osf_msfs_syscall	240	/* not implemented */ -#define __NR_osf_sysinfo	241 -#define __NR_osf_uadmin		242	/* not implemented */ -#define __NR_osf_fuser		243	/* not implemented */ -#define __NR_osf_proplist_syscall    244 -#define __NR_osf_ntp_adjtime	245	/* not implemented */ -#define __NR_osf_ntp_gettime	246	/* not implemented */ -#define __NR_osf_pathconf	247	/* not implemented */ -#define __NR_osf_fpathconf	248	/* not implemented */ - -#define __NR_osf_uswitch	250	/* not implemented */ -#define __NR_osf_usleep_thread	251 -#define __NR_osf_audcntl	252	/* not implemented */ -#define __NR_osf_audgen		253	/* not implemented */ -#define __NR_sysfs		254 -#define __NR_osf_subsys_info	255	/* not implemented */ -#define __NR_osf_getsysinfo	256 -#define __NR_osf_setsysinfo	257 -#define __NR_osf_afs_syscall	258	/* not implemented */ -#define __NR_osf_swapctl	259	/* not implemented */ -#define __NR_osf_memcntl	260	/* not implemented */ -#define __NR_osf_fdatasync	261	/* not implemented */ - -/* - * Ignore legacy syscalls that we don't use. - */ -#define __IGNORE_alarm -#define __IGNORE_creat -#define __IGNORE_getegid -#define __IGNORE_geteuid -#define __IGNORE_getgid -#define __IGNORE_getpid -#define __IGNORE_getppid -#define __IGNORE_getuid -#define __IGNORE_pause -#define __IGNORE_time -#define __IGNORE_utime -#define __IGNORE_umount2 - -/* - * Linux-specific system calls begin at 300 - */ -#define __NR_bdflush		300 -#define __NR_sethae		301 -#define __NR_mount		302 -#define __NR_old_adjtimex	303 -#define __NR_swapoff		304 -#define __NR_getdents		305 -#define __NR_create_module	306 -#define __NR_init_module	307 -#define __NR_delete_module	308 -#define __NR_get_kernel_syms	309 -#define __NR_syslog		310 -#define __NR_reboot		311 -#define __NR_clone		312 -#define __NR_uselib		313 -#define __NR_mlock		314 -#define __NR_munlock		315 -#define __NR_mlockall		316 -#define __NR_munlockall		317 -#define __NR_sysinfo		318 -#define __NR__sysctl		319 -/* 320 was sys_idle.  */ -#define __NR_oldumount		321 -#define __NR_swapon		322 -#define __NR_times		323 -#define __NR_personality	324 -#define __NR_setfsuid		325 -#define __NR_setfsgid		326 -#define __NR_ustat		327 -#define __NR_statfs		328 -#define __NR_fstatfs		329 -#define __NR_sched_setparam		330 -#define __NR_sched_getparam		331 -#define __NR_sched_setscheduler		332 -#define __NR_sched_getscheduler		333 -#define __NR_sched_yield		334 -#define __NR_sched_get_priority_max	335 -#define __NR_sched_get_priority_min	336 -#define __NR_sched_rr_get_interval	337 -#define __NR_afs_syscall		338 -#define __NR_uname			339 -#define __NR_nanosleep			340 -#define __NR_mremap			341 -#define __NR_nfsservctl			342 -#define __NR_setresuid			343 -#define __NR_getresuid			344 -#define __NR_pciconfig_read		345 -#define __NR_pciconfig_write		346 -#define __NR_query_module		347 -#define __NR_prctl			348 -#define __NR_pread64			349 -#define __NR_pwrite64			350 -#define __NR_rt_sigreturn		351 -#define __NR_rt_sigaction		352 -#define __NR_rt_sigprocmask		353 -#define __NR_rt_sigpending		354 -#define __NR_rt_sigtimedwait		355 -#define __NR_rt_sigqueueinfo		356 -#define __NR_rt_sigsuspend		357 -#define __NR_select			358 -#define __NR_gettimeofday		359 -#define __NR_settimeofday		360 -#define __NR_getitimer			361 -#define __NR_setitimer			362 -#define __NR_utimes			363 -#define __NR_getrusage			364 -#define __NR_wait4			365 -#define __NR_adjtimex			366 -#define __NR_getcwd			367 -#define __NR_capget			368 -#define __NR_capset			369 -#define __NR_sendfile			370 -#define __NR_setresgid			371 -#define __NR_getresgid			372 -#define __NR_dipc			373 -#define __NR_pivot_root			374 -#define __NR_mincore			375 -#define __NR_pciconfig_iobase		376 -#define __NR_getdents64			377 -#define __NR_gettid			378 -#define __NR_readahead			379 -/* 380 is unused */ -#define __NR_tkill			381 -#define __NR_setxattr			382 -#define __NR_lsetxattr			383 -#define __NR_fsetxattr			384 -#define __NR_getxattr			385 -#define __NR_lgetxattr			386 -#define __NR_fgetxattr			387 -#define __NR_listxattr			388 -#define __NR_llistxattr			389 -#define __NR_flistxattr			390 -#define __NR_removexattr		391 -#define __NR_lremovexattr		392 -#define __NR_fremovexattr		393 -#define __NR_futex			394 -#define __NR_sched_setaffinity		395      -#define __NR_sched_getaffinity		396 -#define __NR_tuxcall			397 -#define __NR_io_setup			398 -#define __NR_io_destroy			399 -#define __NR_io_getevents		400 -#define __NR_io_submit			401 -#define __NR_io_cancel			402 -#define __NR_exit_group			405 -#define __NR_lookup_dcookie		406 -#define __NR_epoll_create		407 -#define __NR_epoll_ctl			408 -#define __NR_epoll_wait			409 -/* Feb 2007: These three sys_epoll defines shouldn't be here but culling - * them would break userspace apps ... we'll kill them off in 2010 :) */ -#define __NR_sys_epoll_create		__NR_epoll_create -#define __NR_sys_epoll_ctl		__NR_epoll_ctl -#define __NR_sys_epoll_wait		__NR_epoll_wait -#define __NR_remap_file_pages		410 -#define __NR_set_tid_address		411 -#define __NR_restart_syscall		412 -#define __NR_fadvise64			413 -#define __NR_timer_create		414 -#define __NR_timer_settime		415 -#define __NR_timer_gettime		416 -#define __NR_timer_getoverrun		417 -#define __NR_timer_delete		418 -#define __NR_clock_settime		419 -#define __NR_clock_gettime		420 -#define __NR_clock_getres		421 -#define __NR_clock_nanosleep		422 -#define __NR_semtimedop			423 -#define __NR_tgkill			424 -#define __NR_stat64			425 -#define __NR_lstat64			426 -#define __NR_fstat64			427 -#define __NR_vserver			428 -#define __NR_mbind			429 -#define __NR_get_mempolicy		430 -#define __NR_set_mempolicy		431 -#define __NR_mq_open			432 -#define __NR_mq_unlink			433 -#define __NR_mq_timedsend		434 -#define __NR_mq_timedreceive		435 -#define __NR_mq_notify			436 -#define __NR_mq_getsetattr		437 -#define __NR_waitid			438 -#define __NR_add_key			439 -#define __NR_request_key		440 -#define __NR_keyctl			441 -#define __NR_ioprio_set			442 -#define __NR_ioprio_get			443 -#define __NR_inotify_init		444 -#define __NR_inotify_add_watch		445 -#define __NR_inotify_rm_watch		446 -#define __NR_fdatasync			447 -#define __NR_kexec_load			448 -#define __NR_migrate_pages		449 -#define __NR_openat			450 -#define __NR_mkdirat			451 -#define __NR_mknodat			452 -#define __NR_fchownat			453 -#define __NR_futimesat			454 -#define __NR_fstatat64			455 -#define __NR_unlinkat			456 -#define __NR_renameat			457 -#define __NR_linkat			458 -#define __NR_symlinkat			459 -#define __NR_readlinkat			460 -#define __NR_fchmodat			461 -#define __NR_faccessat			462 -#define __NR_pselect6			463 -#define __NR_ppoll			464 -#define __NR_unshare			465 -#define __NR_set_robust_list		466 -#define __NR_get_robust_list		467 -#define __NR_splice			468 -#define __NR_sync_file_range		469 -#define __NR_tee			470 -#define __NR_vmsplice			471 -#define __NR_move_pages			472 -#define __NR_getcpu			473 -#define __NR_epoll_pwait		474 -#define __NR_utimensat			475 -#define __NR_signalfd			476 -#define __NR_timerfd			477 -#define __NR_eventfd			478 -#define __NR_recvmmsg			479 -#define __NR_fallocate			480 -#define __NR_timerfd_create		481 -#define __NR_timerfd_settime		482 -#define __NR_timerfd_gettime		483 -#define __NR_signalfd4			484 -#define __NR_eventfd2			485 -#define __NR_epoll_create1		486 -#define __NR_dup3			487 -#define __NR_pipe2			488 -#define __NR_inotify_init1		489 -#define __NR_preadv			490 -#define __NR_pwritev			491 -#define __NR_rt_tgsigqueueinfo		492 -#define __NR_perf_event_open		493 -#define __NR_fanotify_init		494 -#define __NR_fanotify_mark		495 -#define __NR_prlimit64			496 - -#ifdef __KERNEL__ - -#define NR_SYSCALLS			497 - -#define __ARCH_WANT_IPC_PARSE_VERSION  #define __ARCH_WANT_OLD_READDIR  #define __ARCH_WANT_STAT64  #define __ARCH_WANT_SYS_GETHOSTNAME @@ -466,19 +13,8 @@  #define __ARCH_WANT_SYS_OLD_GETRLIMIT  #define __ARCH_WANT_SYS_OLDUMOUNT  #define __ARCH_WANT_SYS_SIGPENDING -#define __ARCH_WANT_SYS_RT_SIGSUSPEND - -/* "Conditional" syscalls.  What we want is - -	__attribute__((weak,alias("sys_ni_syscall"))) - -   but that raises the problem of what type to give the symbol.  If we use -   a prototype, it'll conflict with the definition given in this file and -   others.  If we use __typeof, we discover that not all symbols actually -   have declarations.  If we use no prototype, then we get warnings from -   -Wstrict-prototypes.  Ho hum.  */ - -#define cond_syscall(x)  asm(".weak\t" #x "\n" #x " = sys_ni_syscall") +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_CLONE -#endif /* __KERNEL__ */  #endif /* _ALPHA_UNISTD_H */ diff --git a/arch/alpha/include/asm/word-at-a-time.h b/arch/alpha/include/asm/word-at-a-time.h new file mode 100644 index 00000000000..6b340d0f152 --- /dev/null +++ b/arch/alpha/include/asm/word-at-a-time.h @@ -0,0 +1,55 @@ +#ifndef _ASM_WORD_AT_A_TIME_H +#define _ASM_WORD_AT_A_TIME_H + +#include <asm/compiler.h> + +/* + * word-at-a-time interface for Alpha. + */ + +/* + * We do not use the word_at_a_time struct on Alpha, but it needs to be + * implemented to humour the generic code. + */ +struct word_at_a_time { +	const unsigned long unused; +}; + +#define WORD_AT_A_TIME_CONSTANTS { 0 } + +/* Return nonzero if val has a zero */ +static inline unsigned long has_zero(unsigned long val, unsigned long *bits, const struct word_at_a_time *c) +{ +	unsigned long zero_locations = __kernel_cmpbge(0, val); +	*bits = zero_locations; +	return zero_locations; +} + +static inline unsigned long prep_zero_mask(unsigned long val, unsigned long bits, const struct word_at_a_time *c) +{ +	return bits; +} + +#define create_zero_mask(bits) (bits) + +static inline unsigned long find_zero(unsigned long bits) +{ +#if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67) +	/* Simple if have CIX instructions */ +	return __kernel_cttz(bits); +#else +	unsigned long t1, t2, t3; +	/* Retain lowest set bit only */ +	bits &= -bits; +	/* Binary search for lowest set bit */ +	t1 = bits & 0xf0; +	t2 = bits & 0xcc; +	t3 = bits & 0xaa; +	if (t1) t1 = 4; +	if (t2) t2 = 2; +	if (t3) t3 = 1; +	return t1 + t2 + t3; +#endif +} + +#endif /* _ASM_WORD_AT_A_TIME_H */ diff --git a/arch/alpha/include/asm/xchg.h b/arch/alpha/include/asm/xchg.h index beba1b803e0..0ca9724597c 100644 --- a/arch/alpha/include/asm/xchg.h +++ b/arch/alpha/include/asm/xchg.h @@ -1,10 +1,10 @@ -#ifndef __ALPHA_SYSTEM_H +#ifndef _ALPHA_CMPXCHG_H  #error Do not include xchg.h directly!  #else  /*   * xchg/xchg_local and cmpxchg/cmpxchg_local share the same code   * except that local version do not have the expensive memory barrier. - * So this file is included twice from asm/system.h. + * So this file is included twice from asm/cmpxchg.h.   */  /* diff --git a/arch/alpha/include/uapi/asm/Kbuild b/arch/alpha/include/uapi/asm/Kbuild new file mode 100644 index 00000000000..d96f2ef5b63 --- /dev/null +++ b/arch/alpha/include/uapi/asm/Kbuild @@ -0,0 +1,43 @@ +# UAPI Header export list +include include/uapi/asm-generic/Kbuild.asm + +header-y += a.out.h +header-y += auxvec.h +header-y += bitsperlong.h +header-y += byteorder.h +header-y += compiler.h +header-y += console.h +header-y += errno.h +header-y += fcntl.h +header-y += fpu.h +header-y += gentrap.h +header-y += ioctl.h +header-y += ioctls.h +header-y += ipcbuf.h +header-y += kvm_para.h +header-y += mman.h +header-y += msgbuf.h +header-y += pal.h +header-y += param.h +header-y += poll.h +header-y += posix_types.h +header-y += ptrace.h +header-y += reg.h +header-y += regdef.h +header-y += resource.h +header-y += sembuf.h +header-y += setup.h +header-y += shmbuf.h +header-y += sigcontext.h +header-y += siginfo.h +header-y += signal.h +header-y += socket.h +header-y += sockios.h +header-y += stat.h +header-y += statfs.h +header-y += swab.h +header-y += sysinfo.h +header-y += termbits.h +header-y += termios.h +header-y += types.h +header-y += unistd.h diff --git a/arch/alpha/include/uapi/asm/a.out.h b/arch/alpha/include/uapi/asm/a.out.h new file mode 100644 index 00000000000..547707246f6 --- /dev/null +++ b/arch/alpha/include/uapi/asm/a.out.h @@ -0,0 +1,91 @@ +#ifndef _UAPI__ALPHA_A_OUT_H__ +#define _UAPI__ALPHA_A_OUT_H__ + +#include <linux/types.h> + +/* + * OSF/1 ECOFF header structs.  ECOFF files consist of: + * 	- a file header (struct filehdr), + *	- an a.out header (struct aouthdr), + *	- one or more section headers (struct scnhdr).  + *	  The filhdr's "f_nscns" field contains the + *	  number of section headers. + */ + +struct filehdr +{ +	/* OSF/1 "file" header */ +	__u16 f_magic, f_nscns; +	__u32 f_timdat; +	__u64 f_symptr; +	__u32 f_nsyms; +	__u16 f_opthdr, f_flags; +}; + +struct aouthdr +{ +	__u64 info;		/* after that it looks quite normal.. */ +	__u64 tsize; +	__u64 dsize; +	__u64 bsize; +	__u64 entry; +	__u64 text_start;	/* with a few additions that actually make sense */ +	__u64 data_start; +	__u64 bss_start; +	__u32 gprmask, fprmask;	/* bitmask of general & floating point regs used in binary */ +	__u64 gpvalue; +}; + +struct scnhdr +{ +	char	s_name[8]; +	__u64	s_paddr; +	__u64	s_vaddr; +	__u64	s_size; +	__u64	s_scnptr; +	__u64	s_relptr; +	__u64	s_lnnoptr; +	__u16	s_nreloc; +	__u16	s_nlnno; +	__u32	s_flags; +}; + +struct exec +{ +	/* OSF/1 "file" header */ +	struct filehdr		fh; +	struct aouthdr		ah; +}; + +/* + * Define's so that the kernel exec code can access the a.out header + * fields... + */ +#define	a_info		ah.info +#define	a_text		ah.tsize +#define a_data		ah.dsize +#define a_bss		ah.bsize +#define a_entry		ah.entry +#define a_textstart	ah.text_start +#define	a_datastart	ah.data_start +#define	a_bssstart	ah.bss_start +#define	a_gprmask	ah.gprmask +#define a_fprmask	ah.fprmask +#define a_gpvalue	ah.gpvalue + +#define N_TXTADDR(x) ((x).a_textstart) +#define N_DATADDR(x) ((x).a_datastart) +#define N_BSSADDR(x) ((x).a_bssstart) +#define N_DRSIZE(x) 0 +#define N_TRSIZE(x) 0 +#define N_SYMSIZE(x) 0 + +#define AOUTHSZ		sizeof(struct aouthdr) +#define SCNHSZ		sizeof(struct scnhdr) +#define SCNROUND	16 + +#define N_TXTOFF(x) \ +  ((long) N_MAGIC(x) == ZMAGIC ? 0 : \ +   (sizeof(struct exec) + (x).fh.f_nscns*SCNHSZ + SCNROUND - 1) & ~(SCNROUND - 1)) + +#endif /* _UAPI__ALPHA_A_OUT_H__ */ diff --git a/arch/alpha/include/asm/auxvec.h b/arch/alpha/include/uapi/asm/auxvec.h index e96fe880e31..a3a579dfdb4 100644 --- a/arch/alpha/include/asm/auxvec.h +++ b/arch/alpha/include/uapi/asm/auxvec.h @@ -21,4 +21,6 @@  #define AT_L2_CACHESHAPE	36  #define AT_L3_CACHESHAPE	37 +#define AT_VECTOR_SIZE_ARCH 4 /* entries in ARCH_DLINFO */ +  #endif /* __ASM_ALPHA_AUXVEC_H */ diff --git a/arch/alpha/include/asm/bitsperlong.h b/arch/alpha/include/uapi/asm/bitsperlong.h index ad57f786820..ad57f786820 100644 --- a/arch/alpha/include/asm/bitsperlong.h +++ b/arch/alpha/include/uapi/asm/bitsperlong.h diff --git a/arch/alpha/include/asm/byteorder.h b/arch/alpha/include/uapi/asm/byteorder.h index 73683093202..73683093202 100644 --- a/arch/alpha/include/asm/byteorder.h +++ b/arch/alpha/include/uapi/asm/byteorder.h diff --git a/arch/alpha/include/uapi/asm/compiler.h b/arch/alpha/include/uapi/asm/compiler.h new file mode 100644 index 00000000000..32cc7833f0c --- /dev/null +++ b/arch/alpha/include/uapi/asm/compiler.h @@ -0,0 +1,117 @@ +#ifndef _UAPI__ALPHA_COMPILER_H +#define _UAPI__ALPHA_COMPILER_H + +/*  + * Herein are macros we use when describing various patterns we want to GCC. + * In all cases we can get better schedules out of the compiler if we hide + * as little as possible inside inline assembly.  However, we want to be + * able to know what we'll get out before giving up inline assembly.  Thus + * these tests and macros. + */ + +#if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3 +# define __kernel_insbl(val, shift)	__builtin_alpha_insbl(val, shift) +# define __kernel_inswl(val, shift)	__builtin_alpha_inswl(val, shift) +# define __kernel_insql(val, shift)	__builtin_alpha_insql(val, shift) +# define __kernel_inslh(val, shift)	__builtin_alpha_inslh(val, shift) +# define __kernel_extbl(val, shift)	__builtin_alpha_extbl(val, shift) +# define __kernel_extwl(val, shift)	__builtin_alpha_extwl(val, shift) +# define __kernel_cmpbge(a, b)		__builtin_alpha_cmpbge(a, b) +#else +# define __kernel_insbl(val, shift)					\ +  ({ unsigned long __kir;						\ +     __asm__("insbl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));	\ +     __kir; }) +# define __kernel_inswl(val, shift)					\ +  ({ unsigned long __kir;						\ +     __asm__("inswl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));	\ +     __kir; }) +# define __kernel_insql(val, shift)					\ +  ({ unsigned long __kir;						\ +     __asm__("insql %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));	\ +     __kir; }) +# define __kernel_inslh(val, shift)					\ +  ({ unsigned long __kir;						\ +     __asm__("inslh %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));	\ +     __kir; }) +# define __kernel_extbl(val, shift)					\ +  ({ unsigned long __kir;						\ +     __asm__("extbl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));	\ +     __kir; }) +# define __kernel_extwl(val, shift)					\ +  ({ unsigned long __kir;						\ +     __asm__("extwl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));	\ +     __kir; }) +# define __kernel_cmpbge(a, b)						\ +  ({ unsigned long __kir;						\ +     __asm__("cmpbge %r2,%1,%0" : "=r"(__kir) : "rI"(b), "rJ"(a));	\ +     __kir; }) +#endif + +#ifdef __alpha_cix__ +# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3 +#  define __kernel_cttz(x)		__builtin_ctzl(x) +#  define __kernel_ctlz(x)		__builtin_clzl(x) +#  define __kernel_ctpop(x)		__builtin_popcountl(x) +# else +#  define __kernel_cttz(x)						\ +   ({ unsigned long __kir;						\ +      __asm__("cttz %1,%0" : "=r"(__kir) : "r"(x));			\ +      __kir; }) +#  define __kernel_ctlz(x)						\ +   ({ unsigned long __kir;						\ +      __asm__("ctlz %1,%0" : "=r"(__kir) : "r"(x));			\ +      __kir; }) +#  define __kernel_ctpop(x)						\ +   ({ unsigned long __kir;						\ +      __asm__("ctpop %1,%0" : "=r"(__kir) : "r"(x));			\ +      __kir; }) +# endif +#else +# define __kernel_cttz(x)						\ +  ({ unsigned long __kir;						\ +     __asm__(".arch ev67; cttz %1,%0" : "=r"(__kir) : "r"(x));		\ +     __kir; }) +# define __kernel_ctlz(x)						\ +  ({ unsigned long __kir;						\ +     __asm__(".arch ev67; ctlz %1,%0" : "=r"(__kir) : "r"(x));		\ +     __kir; }) +# define __kernel_ctpop(x)						\ +  ({ unsigned long __kir;						\ +     __asm__(".arch ev67; ctpop %1,%0" : "=r"(__kir) : "r"(x));		\ +     __kir; }) +#endif + + +/*  + * Beginning with EGCS 1.1, GCC defines __alpha_bwx__ when the BWX  + * extension is enabled.  Previous versions did not define anything + * we could test during compilation -- too bad, so sad. + */ + +#if defined(__alpha_bwx__) +#define __kernel_ldbu(mem)	(mem) +#define __kernel_ldwu(mem)	(mem) +#define __kernel_stb(val,mem)	((mem) = (val)) +#define __kernel_stw(val,mem)	((mem) = (val)) +#else +#define __kernel_ldbu(mem)				\ +  ({ unsigned char __kir;				\ +     __asm__(".arch ev56;				\ +	      ldbu %0,%1" : "=r"(__kir) : "m"(mem));	\ +     __kir; }) +#define __kernel_ldwu(mem)				\ +  ({ unsigned short __kir;				\ +     __asm__(".arch ev56;				\ +	      ldwu %0,%1" : "=r"(__kir) : "m"(mem));	\ +     __kir; }) +#define __kernel_stb(val,mem)				\ +  __asm__(".arch ev56;					\ +	   stb %1,%0" : "=m"(mem) : "r"(val)) +#define __kernel_stw(val,mem)				\ +  __asm__(".arch ev56;					\ +	   stw %1,%0" : "=m"(mem) : "r"(val)) +#endif + + +#endif /* _UAPI__ALPHA_COMPILER_H */ diff --git a/arch/alpha/include/uapi/asm/console.h b/arch/alpha/include/uapi/asm/console.h new file mode 100644 index 00000000000..fd08a191f36 --- /dev/null +++ b/arch/alpha/include/uapi/asm/console.h @@ -0,0 +1,50 @@ +#ifndef _UAPI__AXP_CONSOLE_H +#define _UAPI__AXP_CONSOLE_H + +/* + * Console callback routine numbers + */ +#define CCB_GETC		0x01 +#define CCB_PUTS		0x02 +#define CCB_RESET_TERM		0x03 +#define CCB_SET_TERM_INT	0x04 +#define CCB_SET_TERM_CTL	0x05 +#define CCB_PROCESS_KEYCODE	0x06 +#define CCB_OPEN_CONSOLE	0x07 +#define CCB_CLOSE_CONSOLE	0x08 + +#define CCB_OPEN		0x10 +#define CCB_CLOSE		0x11 +#define CCB_IOCTL		0x12 +#define CCB_READ		0x13 +#define CCB_WRITE		0x14 + +#define CCB_SET_ENV		0x20 +#define CCB_RESET_ENV		0x21 +#define CCB_GET_ENV		0x22 +#define CCB_SAVE_ENV		0x23 + +#define CCB_PSWITCH		0x30 +#define CCB_BIOS_EMUL		0x32 + +/* + * Environment variable numbers + */ +#define ENV_AUTO_ACTION		0x01 +#define ENV_BOOT_DEV		0x02 +#define ENV_BOOTDEF_DEV		0x03 +#define ENV_BOOTED_DEV		0x04 +#define ENV_BOOT_FILE		0x05 +#define ENV_BOOTED_FILE		0x06 +#define ENV_BOOT_OSFLAGS	0x07 +#define ENV_BOOTED_OSFLAGS	0x08 +#define ENV_BOOT_RESET		0x09 +#define ENV_DUMP_DEV		0x0A +#define ENV_ENABLE_AUDIT	0x0B +#define ENV_LICENSE		0x0C +#define ENV_CHAR_SET		0x0D +#define ENV_LANGUAGE		0x0E +#define ENV_TTY_DEV		0x0F + + +#endif /* _UAPI__AXP_CONSOLE_H */ diff --git a/arch/alpha/include/asm/errno.h b/arch/alpha/include/uapi/asm/errno.h index 98099bda937..17f92aa76b2 100644 --- a/arch/alpha/include/asm/errno.h +++ b/arch/alpha/include/uapi/asm/errno.h @@ -43,7 +43,7 @@  #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	ENOLCK		77	/* No record locks available */ @@ -122,4 +122,6 @@  #define	ERFKILL		138	/* Operation not possible due to RF-kill */ +#define EHWPOISON	139	/* Memory page has hardware error */ +  #endif diff --git a/arch/alpha/include/asm/fcntl.h b/arch/alpha/include/uapi/asm/fcntl.h index 70145cbb21c..09f49a6b87d 100644 --- a/arch/alpha/include/asm/fcntl.h +++ b/arch/alpha/include/uapi/asm/fcntl.h @@ -31,6 +31,9 @@  #define __O_SYNC	020000000  #define O_SYNC		(__O_SYNC|O_DSYNC) +#define O_PATH		040000000 +#define __O_TMPFILE	0100000000 +  #define F_GETLK		7  #define F_SETLK		8  #define F_SETLKW	9 @@ -49,8 +52,6 @@  #define F_EXLCK		16	/* or 3 */  #define F_SHLCK		32	/* or 4 */ -#define F_INPROGRESS	64 -  #include <asm-generic/fcntl.h>  #endif diff --git a/arch/alpha/include/uapi/asm/fpu.h b/arch/alpha/include/uapi/asm/fpu.h new file mode 100644 index 00000000000..21a053ca223 --- /dev/null +++ b/arch/alpha/include/uapi/asm/fpu.h @@ -0,0 +1,123 @@ +#ifndef _UAPI__ASM_ALPHA_FPU_H +#define _UAPI__ASM_ALPHA_FPU_H + + +/* + * Alpha floating-point control register defines: + */ +#define FPCR_DNOD	(1UL<<47)	/* denorm INV trap disable */ +#define FPCR_DNZ	(1UL<<48)	/* denorms to zero */ +#define FPCR_INVD	(1UL<<49)	/* invalid op disable (opt.) */ +#define FPCR_DZED	(1UL<<50)	/* division by zero disable (opt.) */ +#define FPCR_OVFD	(1UL<<51)	/* overflow disable (optional) */ +#define FPCR_INV	(1UL<<52)	/* invalid operation */ +#define FPCR_DZE	(1UL<<53)	/* division by zero */ +#define FPCR_OVF	(1UL<<54)	/* overflow */ +#define FPCR_UNF	(1UL<<55)	/* underflow */ +#define FPCR_INE	(1UL<<56)	/* inexact */ +#define FPCR_IOV	(1UL<<57)	/* integer overflow */ +#define FPCR_UNDZ	(1UL<<60)	/* underflow to zero (opt.) */ +#define FPCR_UNFD	(1UL<<61)	/* underflow disable (opt.) */ +#define FPCR_INED	(1UL<<62)	/* inexact disable (opt.) */ +#define FPCR_SUM	(1UL<<63)	/* summary bit */ + +#define FPCR_DYN_SHIFT	58		/* first dynamic rounding mode bit */ +#define FPCR_DYN_CHOPPED (0x0UL << FPCR_DYN_SHIFT)	/* towards 0 */ +#define FPCR_DYN_MINUS	 (0x1UL << FPCR_DYN_SHIFT)	/* towards -INF */ +#define FPCR_DYN_NORMAL	 (0x2UL << FPCR_DYN_SHIFT)	/* towards nearest */ +#define FPCR_DYN_PLUS	 (0x3UL << FPCR_DYN_SHIFT)	/* towards +INF */ +#define FPCR_DYN_MASK	 (0x3UL << FPCR_DYN_SHIFT) + +#define FPCR_MASK	0xffff800000000000L + +/* + * IEEE trap enables are implemented in software.  These per-thread + * bits are stored in the "ieee_state" field of "struct thread_info". + * Thus, the bits are defined so as not to conflict with the + * floating-point enable bit (which is architected).  On top of that, + * we want to make these bits compatible with OSF/1 so + * ieee_set_fp_control() etc. can be implemented easily and + * compatibly.  The corresponding definitions are in + * /usr/include/machine/fpu.h under OSF/1. + */ +#define IEEE_TRAP_ENABLE_INV	(1UL<<1)	/* invalid op */ +#define IEEE_TRAP_ENABLE_DZE	(1UL<<2)	/* division by zero */ +#define IEEE_TRAP_ENABLE_OVF	(1UL<<3)	/* overflow */ +#define IEEE_TRAP_ENABLE_UNF	(1UL<<4)	/* underflow */ +#define IEEE_TRAP_ENABLE_INE	(1UL<<5)	/* inexact */ +#define IEEE_TRAP_ENABLE_DNO	(1UL<<6)	/* denorm */ +#define IEEE_TRAP_ENABLE_MASK	(IEEE_TRAP_ENABLE_INV | IEEE_TRAP_ENABLE_DZE |\ +				 IEEE_TRAP_ENABLE_OVF | IEEE_TRAP_ENABLE_UNF |\ +				 IEEE_TRAP_ENABLE_INE | IEEE_TRAP_ENABLE_DNO) + +/* Denorm and Underflow flushing */ +#define IEEE_MAP_DMZ		(1UL<<12)	/* Map denorm inputs to zero */ +#define IEEE_MAP_UMZ		(1UL<<13)	/* Map underflowed outputs to zero */ + +#define IEEE_MAP_MASK		(IEEE_MAP_DMZ | IEEE_MAP_UMZ) + +/* status bits coming from fpcr: */ +#define IEEE_STATUS_INV		(1UL<<17) +#define IEEE_STATUS_DZE		(1UL<<18) +#define IEEE_STATUS_OVF		(1UL<<19) +#define IEEE_STATUS_UNF		(1UL<<20) +#define IEEE_STATUS_INE		(1UL<<21) +#define IEEE_STATUS_DNO		(1UL<<22) + +#define IEEE_STATUS_MASK	(IEEE_STATUS_INV | IEEE_STATUS_DZE |	\ +				 IEEE_STATUS_OVF | IEEE_STATUS_UNF |	\ +				 IEEE_STATUS_INE | IEEE_STATUS_DNO) + +#define IEEE_SW_MASK		(IEEE_TRAP_ENABLE_MASK |		\ +				 IEEE_STATUS_MASK | IEEE_MAP_MASK) + +#define IEEE_CURRENT_RM_SHIFT	32 +#define IEEE_CURRENT_RM_MASK	(3UL<<IEEE_CURRENT_RM_SHIFT) + +#define IEEE_STATUS_TO_EXCSUM_SHIFT	16 + +#define IEEE_INHERIT    (1UL<<63)	/* inherit on thread create? */ + +/* + * Convert the software IEEE trap enable and status bits into the + * hardware fpcr format.  + * + * Digital Unix engineers receive my thanks for not defining the + * software bits identical to the hardware bits.  The chip designers + * receive my thanks for making all the not-implemented fpcr bits + * RAZ forcing us to use system calls to read/write this value. + */ + +static inline unsigned long +ieee_swcr_to_fpcr(unsigned long sw) +{ +	unsigned long fp; +	fp = (sw & IEEE_STATUS_MASK) << 35; +	fp |= (sw & IEEE_MAP_DMZ) << 36; +	fp |= (sw & IEEE_STATUS_MASK ? FPCR_SUM : 0); +	fp |= (~sw & (IEEE_TRAP_ENABLE_INV +		      | IEEE_TRAP_ENABLE_DZE +		      | IEEE_TRAP_ENABLE_OVF)) << 48; +	fp |= (~sw & (IEEE_TRAP_ENABLE_UNF | IEEE_TRAP_ENABLE_INE)) << 57; +	fp |= (sw & IEEE_MAP_UMZ ? FPCR_UNDZ | FPCR_UNFD : 0); +	fp |= (~sw & IEEE_TRAP_ENABLE_DNO) << 41; +	return fp; +} + +static inline unsigned long +ieee_fpcr_to_swcr(unsigned long fp) +{ +	unsigned long sw; +	sw = (fp >> 35) & IEEE_STATUS_MASK; +	sw |= (fp >> 36) & IEEE_MAP_DMZ; +	sw |= (~fp >> 48) & (IEEE_TRAP_ENABLE_INV +			     | IEEE_TRAP_ENABLE_DZE +			     | IEEE_TRAP_ENABLE_OVF); +	sw |= (~fp >> 57) & (IEEE_TRAP_ENABLE_UNF | IEEE_TRAP_ENABLE_INE); +	sw |= (fp >> 47) & IEEE_MAP_UMZ; +	sw |= (~fp >> 41) & IEEE_TRAP_ENABLE_DNO; +	return sw; +} + + +#endif /* _UAPI__ASM_ALPHA_FPU_H */ diff --git a/arch/alpha/include/asm/gentrap.h b/arch/alpha/include/uapi/asm/gentrap.h index ae50cc3192c..ae50cc3192c 100644 --- a/arch/alpha/include/asm/gentrap.h +++ b/arch/alpha/include/uapi/asm/gentrap.h diff --git a/arch/alpha/include/asm/ioctl.h b/arch/alpha/include/uapi/asm/ioctl.h index fc63727f417..fc63727f417 100644 --- a/arch/alpha/include/asm/ioctl.h +++ b/arch/alpha/include/uapi/asm/ioctl.h diff --git a/arch/alpha/include/asm/ioctls.h b/arch/alpha/include/uapi/asm/ioctls.h index 59617c3c2be..92c557be49f 100644 --- a/arch/alpha/include/asm/ioctls.h +++ b/arch/alpha/include/uapi/asm/ioctls.h @@ -92,7 +92,12 @@  #define TIOCGSID	0x5429  /* Return the session ID of FD */  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */ +#define TIOCGDEV	_IOR('T',0x32, unsigned int) /* Get primary device node of /dev/console */  #define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */ +#define TIOCVHANGUP	0x5437 +#define TIOCGPKT	_IOR('T', 0x38, int) /* Get packet mode state */ +#define TIOCGPTLCK	_IOR('T', 0x39, int) /* Get Pty lock state */ +#define TIOCGEXCL	_IOR('T', 0x40, int) /* Get exclusive mode state */  #define TIOCSERCONFIG	0x5453  #define TIOCSERGWILD	0x5454 diff --git a/arch/alpha/include/uapi/asm/ipcbuf.h b/arch/alpha/include/uapi/asm/ipcbuf.h new file mode 100644 index 00000000000..84c7e51cb6d --- /dev/null +++ b/arch/alpha/include/uapi/asm/ipcbuf.h @@ -0,0 +1 @@ +#include <asm-generic/ipcbuf.h> diff --git a/arch/alpha/include/uapi/asm/kvm_para.h b/arch/alpha/include/uapi/asm/kvm_para.h new file mode 100644 index 00000000000..14fab8f0b95 --- /dev/null +++ b/arch/alpha/include/uapi/asm/kvm_para.h @@ -0,0 +1 @@ +#include <asm-generic/kvm_para.h> diff --git a/arch/alpha/include/asm/mman.h b/arch/alpha/include/uapi/asm/mman.h index 99c56d47879..0086b472bc2 100644 --- a/arch/alpha/include/asm/mman.h +++ b/arch/alpha/include/uapi/asm/mman.h @@ -53,7 +53,25 @@  #define MADV_MERGEABLE   12		/* KSM may merge identical pages */  #define MADV_UNMERGEABLE 13		/* KSM may not merge identical pages */ +#define MADV_HUGEPAGE	14		/* Worth backing with hugepages */ +#define MADV_NOHUGEPAGE	15		/* Not worth backing with hugepages */ + +#define MADV_DONTDUMP   16		/* Explicity exclude from the core dump, +					   overrides the coredump filter bits */ +#define MADV_DODUMP	17		/* Clear the MADV_NODUMP flag */ +  /* compatibility flags */  #define MAP_FILE	0 +/* + * When MAP_HUGETLB is set bits [26:31] encode the log2 of the huge page size. + * This gives us 6 bits, which is enough until someone invents 128 bit address + * spaces. + * + * Assume these are all power of twos. + * When 0 use the default page size. + */ +#define MAP_HUGE_SHIFT	26 +#define MAP_HUGE_MASK	0x3f +  #endif /* __ALPHA_MMAN_H__ */ diff --git a/arch/alpha/include/asm/msgbuf.h b/arch/alpha/include/uapi/asm/msgbuf.h index 98496501a2b..98496501a2b 100644 --- a/arch/alpha/include/asm/msgbuf.h +++ b/arch/alpha/include/uapi/asm/msgbuf.h diff --git a/arch/alpha/include/uapi/asm/pal.h b/arch/alpha/include/uapi/asm/pal.h new file mode 100644 index 00000000000..dfc8140b908 --- /dev/null +++ b/arch/alpha/include/uapi/asm/pal.h @@ -0,0 +1,53 @@ +#ifndef _UAPI__ALPHA_PAL_H +#define _UAPI__ALPHA_PAL_H + +/* + * Common PAL-code + */ +#define PAL_halt	  0 +#define PAL_cflush	  1 +#define PAL_draina	  2 +#define PAL_bpt		128 +#define PAL_bugchk	129 +#define PAL_chmk	131 +#define PAL_callsys	131 +#define PAL_imb		134 +#define PAL_rduniq	158 +#define PAL_wruniq	159 +#define PAL_gentrap	170 +#define PAL_nphalt	190 + +/* + * VMS specific PAL-code + */ +#define PAL_swppal	10 +#define PAL_mfpr_vptb	41 + +/* + * OSF specific PAL-code + */ +#define PAL_cserve	 9 +#define PAL_wripir	13 +#define PAL_rdmces	16 +#define PAL_wrmces	17 +#define PAL_wrfen	43 +#define PAL_wrvptptr	45 +#define PAL_jtopal	46 +#define PAL_swpctx	48 +#define PAL_wrval	49 +#define PAL_rdval	50 +#define PAL_tbi		51 +#define PAL_wrent	52 +#define PAL_swpipl	53 +#define PAL_rdps	54 +#define PAL_wrkgp	55 +#define PAL_wrusp	56 +#define PAL_wrperfmon	57 +#define PAL_rdusp	58 +#define PAL_whami	60 +#define PAL_retsys	61 +#define PAL_wtint	62 +#define PAL_rti		63 + + +#endif /* _UAPI__ALPHA_PAL_H */ diff --git a/arch/alpha/include/uapi/asm/param.h b/arch/alpha/include/uapi/asm/param.h new file mode 100644 index 00000000000..dbcd9834af6 --- /dev/null +++ b/arch/alpha/include/uapi/asm/param.h @@ -0,0 +1,14 @@ +#ifndef _UAPI_ASM_ALPHA_PARAM_H +#define _UAPI_ASM_ALPHA_PARAM_H + +#define HZ		1024 + +#define EXEC_PAGESIZE	8192 + +#ifndef NOGROUP +#define NOGROUP		(-1) +#endif + +#define MAXHOSTNAMELEN	64	/* max length of hostname */ + +#endif /* _UAPI_ASM_ALPHA_PARAM_H */ diff --git a/arch/alpha/include/asm/poll.h b/arch/alpha/include/uapi/asm/poll.h index c98509d3149..c98509d3149 100644 --- a/arch/alpha/include/asm/poll.h +++ b/arch/alpha/include/uapi/asm/poll.h diff --git a/arch/alpha/include/uapi/asm/posix_types.h b/arch/alpha/include/uapi/asm/posix_types.h new file mode 100644 index 00000000000..5a8a48320ef --- /dev/null +++ b/arch/alpha/include/uapi/asm/posix_types.h @@ -0,0 +1,17 @@ +#ifndef _ALPHA_POSIX_TYPES_H +#define _ALPHA_POSIX_TYPES_H + +/* + * This file is generally used by user-level software, so you need to + * be a little careful about namespace pollution etc.  Also, we cannot + * assume GCC is being used. + */ + +typedef unsigned int	__kernel_ino_t; +#define __kernel_ino_t __kernel_ino_t + +typedef unsigned long	__kernel_sigset_t;	/* at least 32 bits */ + +#include <asm-generic/posix_types.h> + +#endif /* _ALPHA_POSIX_TYPES_H */ diff --git a/arch/alpha/include/uapi/asm/ptrace.h b/arch/alpha/include/uapi/asm/ptrace.h new file mode 100644 index 00000000000..5ce83fa9a05 --- /dev/null +++ b/arch/alpha/include/uapi/asm/ptrace.h @@ -0,0 +1,70 @@ +#ifndef _UAPI_ASMAXP_PTRACE_H +#define _UAPI_ASMAXP_PTRACE_H + + +/* + * This struct defines the way the registers are stored on the + * kernel stack during a system call or other kernel entry + * + * NOTE! I want to minimize the overhead of system calls, so this + * struct has as little information as possible.  I does not have + * + *  - floating point regs: the kernel doesn't change those + *  - r9-15: saved by the C compiler + * + * This makes "fork()" and "exec()" a bit more complex, but should + * give us low system call latency. + */ + +struct pt_regs { +	unsigned long r0; +	unsigned long r1; +	unsigned long r2; +	unsigned long r3; +	unsigned long r4; +	unsigned long r5; +	unsigned long r6; +	unsigned long r7; +	unsigned long r8; +	unsigned long r19; +	unsigned long r20; +	unsigned long r21; +	unsigned long r22; +	unsigned long r23; +	unsigned long r24; +	unsigned long r25; +	unsigned long r26; +	unsigned long r27; +	unsigned long r28; +	unsigned long hae; +/* JRP - These are the values provided to a0-a2 by PALcode */ +	unsigned long trap_a0; +	unsigned long trap_a1; +	unsigned long trap_a2; +/* These are saved by PAL-code: */ +	unsigned long ps; +	unsigned long pc; +	unsigned long gp; +	unsigned long r16; +	unsigned long r17; +	unsigned long r18; +}; + +/* + * This is the extended stack used by signal handlers and the context + * switcher: it's pushed after the normal "struct pt_regs". + */ +struct switch_stack { +	unsigned long r9; +	unsigned long r10; +	unsigned long r11; +	unsigned long r12; +	unsigned long r13; +	unsigned long r14; +	unsigned long r15; +	unsigned long r26; +	unsigned long fp[32];	/* fp[31] is fpcr */ +}; + + +#endif /* _UAPI_ASMAXP_PTRACE_H */ diff --git a/arch/alpha/include/asm/reg.h b/arch/alpha/include/uapi/asm/reg.h index 86ff916fb06..86ff916fb06 100644 --- a/arch/alpha/include/asm/reg.h +++ b/arch/alpha/include/uapi/asm/reg.h diff --git a/arch/alpha/include/asm/regdef.h b/arch/alpha/include/uapi/asm/regdef.h index 142df9c4f8b..142df9c4f8b 100644 --- a/arch/alpha/include/asm/regdef.h +++ b/arch/alpha/include/uapi/asm/regdef.h diff --git a/arch/alpha/include/asm/resource.h b/arch/alpha/include/uapi/asm/resource.h index c10874ff597..c10874ff597 100644 --- a/arch/alpha/include/asm/resource.h +++ b/arch/alpha/include/uapi/asm/resource.h diff --git a/arch/alpha/include/asm/sembuf.h b/arch/alpha/include/uapi/asm/sembuf.h index 7b38b153478..7b38b153478 100644 --- a/arch/alpha/include/asm/sembuf.h +++ b/arch/alpha/include/uapi/asm/sembuf.h diff --git a/arch/alpha/include/uapi/asm/setup.h b/arch/alpha/include/uapi/asm/setup.h new file mode 100644 index 00000000000..b50014b3090 --- /dev/null +++ b/arch/alpha/include/uapi/asm/setup.h @@ -0,0 +1,42 @@ +#ifndef __ALPHA_SETUP_H +#define __ALPHA_SETUP_H + +#define COMMAND_LINE_SIZE	256 + +/* + * We leave one page for the initial stack page, and one page for + * the initial process structure. Also, the console eats 3 MB for + * the initial bootloader (one of which we can reclaim later). + */ +#define BOOT_PCB	0x20000000 +#define BOOT_ADDR	0x20000000 +/* Remove when official MILO sources have ELF support: */ +#define BOOT_SIZE	(16*1024) + +#ifdef CONFIG_ALPHA_LEGACY_START_ADDRESS +#define KERNEL_START_PHYS	0x300000 /* Old bootloaders hardcoded this.  */ +#else +#define KERNEL_START_PHYS	0x1000000 /* required: Wildfire/Titan/Marvel */ +#endif + +#define KERNEL_START	(PAGE_OFFSET+KERNEL_START_PHYS) +#define SWAPPER_PGD	KERNEL_START +#define INIT_STACK	(PAGE_OFFSET+KERNEL_START_PHYS+0x02000) +#define EMPTY_PGT	(PAGE_OFFSET+KERNEL_START_PHYS+0x04000) +#define EMPTY_PGE	(PAGE_OFFSET+KERNEL_START_PHYS+0x08000) +#define ZERO_PGE	(PAGE_OFFSET+KERNEL_START_PHYS+0x0A000) + +#define START_ADDR	(PAGE_OFFSET+KERNEL_START_PHYS+0x10000) + +/* + * This is setup by the secondary bootstrap loader.  Because + * the zero page is zeroed out as soon as the vm system is + * initialized, we need to copy things out into a more permanent + * place. + */ +#define PARAM			ZERO_PGE +#define COMMAND_LINE		((char*)(PARAM + 0x0000)) +#define INITRD_START		(*(unsigned long *) (PARAM+0x100)) +#define INITRD_SIZE		(*(unsigned long *) (PARAM+0x108)) + +#endif diff --git a/arch/alpha/include/asm/shmbuf.h b/arch/alpha/include/uapi/asm/shmbuf.h index 37ee84f0508..37ee84f0508 100644 --- a/arch/alpha/include/asm/shmbuf.h +++ b/arch/alpha/include/uapi/asm/shmbuf.h diff --git a/arch/alpha/include/asm/sigcontext.h b/arch/alpha/include/uapi/asm/sigcontext.h index 323cdb02619..323cdb02619 100644 --- a/arch/alpha/include/asm/sigcontext.h +++ b/arch/alpha/include/uapi/asm/sigcontext.h diff --git a/arch/alpha/include/asm/siginfo.h b/arch/alpha/include/uapi/asm/siginfo.h index 9822362a842..9822362a842 100644 --- a/arch/alpha/include/asm/siginfo.h +++ b/arch/alpha/include/uapi/asm/siginfo.h diff --git a/arch/alpha/include/uapi/asm/signal.h b/arch/alpha/include/uapi/asm/signal.h new file mode 100644 index 00000000000..dd4ca4bcbb4 --- /dev/null +++ b/arch/alpha/include/uapi/asm/signal.h @@ -0,0 +1,129 @@ +#ifndef _UAPI_ASMAXP_SIGNAL_H +#define _UAPI_ASMAXP_SIGNAL_H + +#include <linux/types.h> + +/* Avoid too many header ordering problems.  */ +struct siginfo; + +#ifndef __KERNEL__ +/* Here we must cater to libcs that poke about in kernel headers.  */ + +#define NSIG		32 +typedef unsigned long sigset_t; + +#endif /* __KERNEL__ */ + + +/* + * Linux/AXP has different signal numbers that Linux/i386: I'm trying + * to make it OSF/1 binary compatible, at least for normal binaries. + */ +#define SIGHUP		 1 +#define SIGINT		 2 +#define SIGQUIT		 3 +#define SIGILL		 4 +#define SIGTRAP		 5 +#define SIGABRT		 6 +#define SIGEMT		 7 +#define SIGFPE		 8 +#define SIGKILL		 9 +#define SIGBUS		10 +#define SIGSEGV		11 +#define SIGSYS		12 +#define SIGPIPE		13 +#define SIGALRM		14 +#define SIGTERM		15 +#define SIGURG		16 +#define SIGSTOP		17 +#define SIGTSTP		18 +#define SIGCONT		19 +#define SIGCHLD		20 +#define SIGTTIN		21 +#define SIGTTOU		22 +#define SIGIO		23 +#define SIGXCPU		24 +#define SIGXFSZ		25 +#define SIGVTALRM	26 +#define SIGPROF		27 +#define SIGWINCH	28 +#define SIGINFO		29 +#define SIGUSR1		30 +#define SIGUSR2		31 + +#define SIGPOLL	SIGIO +#define SIGPWR	SIGINFO +#define SIGIOT	SIGABRT + +/* These should not be considered constants from userland.  */ +#define SIGRTMIN	32 +#define SIGRTMAX	_NSIG + +/* + * SA_FLAGS values: + * + * SA_ONSTACK indicates that a registered stack_t will be used. + * SA_RESTART flag to get restarting signals (which were the default long ago) + * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. + * SA_RESETHAND clears the handler when the signal is delivered. + * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. + * SA_NODEFER prevents the current signal from being masked in the handler. + * + * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single + * Unix names RESETHAND and NODEFER respectively. + */ + +#define SA_ONSTACK	0x00000001 +#define SA_RESTART	0x00000002 +#define SA_NOCLDSTOP	0x00000004 +#define SA_NODEFER	0x00000008 +#define SA_RESETHAND	0x00000010 +#define SA_NOCLDWAIT	0x00000020 +#define SA_SIGINFO	0x00000040 + +#define SA_ONESHOT	SA_RESETHAND +#define SA_NOMASK	SA_NODEFER + +#define MINSIGSTKSZ	4096 +#define SIGSTKSZ	16384 + +#define SIG_BLOCK          1	/* for blocking signals */ +#define SIG_UNBLOCK        2	/* for unblocking signals */ +#define SIG_SETMASK        3	/* for setting the signal mask */ + +#include <asm-generic/signal-defs.h> + +#ifndef __KERNEL__ +/* Here we must cater to libcs that poke about in kernel headers.  */ + +struct sigaction { +	union { +	  __sighandler_t	_sa_handler; +	  void (*_sa_sigaction)(int, struct siginfo *, void *); +	} _u; +	sigset_t	sa_mask; +	int		sa_flags; +}; + +#define sa_handler	_u._sa_handler +#define sa_sigaction	_u._sa_sigaction + +#endif /* __KERNEL__ */ + +typedef struct sigaltstack { +	void __user *ss_sp; +	int ss_flags; +	size_t ss_size; +} stack_t; + +/* sigstack(2) is deprecated, and will be withdrawn in a future version +   of the X/Open CAE Specification.  Use sigaltstack instead.  It is only +   implemented here for OSF/1 compatibility.  */ + +struct sigstack { +	void __user *ss_sp; +	int ss_onstack; +}; + + +#endif /* _UAPI_ASMAXP_SIGNAL_H */ diff --git a/arch/alpha/include/uapi/asm/socket.h b/arch/alpha/include/uapi/asm/socket.h new file mode 100644 index 00000000000..3de1394bcab --- /dev/null +++ b/arch/alpha/include/uapi/asm/socket.h @@ -0,0 +1,90 @@ +#ifndef _UAPI_ASM_SOCKET_H +#define _UAPI_ASM_SOCKET_H + +#include <asm/sockios.h> + +/* For setsockopt(2) */ +/* + * Note: we only bother about making the SOL_SOCKET options + * same as OSF/1, as that's all that "normal" programs are + * likely to set.  We don't necessarily want to be binary + * compatible with _everything_.  + */ +#define SOL_SOCKET	0xffff + +#define SO_DEBUG	0x0001 +#define SO_REUSEADDR	0x0004 +#define SO_KEEPALIVE	0x0008 +#define SO_DONTROUTE	0x0010 +#define SO_BROADCAST	0x0020 +#define SO_LINGER	0x0080 +#define SO_OOBINLINE	0x0100 +#define SO_REUSEPORT	0x0200 + +#define SO_TYPE		0x1008 +#define SO_ERROR	0x1007 +#define SO_SNDBUF	0x1001 +#define SO_RCVBUF	0x1002 +#define SO_SNDBUFFORCE	0x100a +#define SO_RCVBUFFORCE	0x100b +#define	SO_RCVLOWAT	0x1010 +#define	SO_SNDLOWAT	0x1011 +#define	SO_RCVTIMEO	0x1012 +#define	SO_SNDTIMEO	0x1013 +#define SO_ACCEPTCONN	0x1014 +#define SO_PROTOCOL	0x1028 +#define SO_DOMAIN	0x1029 + +/* linux-specific, might as well be the same as on i386 */ +#define SO_NO_CHECK	11 +#define SO_PRIORITY	12 +#define SO_BSDCOMPAT	14 + +#define SO_PASSCRED	17 +#define SO_PEERCRED	18 +#define SO_BINDTODEVICE 25 + +/* Socket filtering */ +#define SO_ATTACH_FILTER        26 +#define SO_DETACH_FILTER        27 +#define SO_GET_FILTER		SO_ATTACH_FILTER + +#define SO_PEERNAME		28 +#define SO_TIMESTAMP		29 +#define SCM_TIMESTAMP		SO_TIMESTAMP + +#define SO_PEERSEC		30 +#define SO_PASSSEC		34 +#define SO_TIMESTAMPNS		35 +#define SCM_TIMESTAMPNS		SO_TIMESTAMPNS + +/* Security levels - as per NRL IPv6 - don't actually do anything */ +#define SO_SECURITY_AUTHENTICATION		19 +#define SO_SECURITY_ENCRYPTION_TRANSPORT	20 +#define SO_SECURITY_ENCRYPTION_NETWORK		21 + +#define SO_MARK			36 + +#define SO_TIMESTAMPING		37 +#define SCM_TIMESTAMPING	SO_TIMESTAMPING + +#define SO_RXQ_OVFL             40 + +#define SO_WIFI_STATUS		41 +#define SCM_WIFI_STATUS		SO_WIFI_STATUS +#define SO_PEEK_OFF		42 + +/* Instruct lower device to use last 4-bytes of skb data as FCS */ +#define SO_NOFCS		43 + +#define SO_LOCK_FILTER		44 + +#define SO_SELECT_ERR_QUEUE	45 + +#define SO_BUSY_POLL		46 + +#define SO_MAX_PACING_RATE	47 + +#define SO_BPF_EXTENSIONS	48 + +#endif /* _UAPI_ASM_SOCKET_H */ diff --git a/arch/alpha/include/asm/sockios.h b/arch/alpha/include/uapi/asm/sockios.h index 7932c7ab4a4..7932c7ab4a4 100644 --- a/arch/alpha/include/asm/sockios.h +++ b/arch/alpha/include/uapi/asm/sockios.h diff --git a/arch/alpha/include/asm/stat.h b/arch/alpha/include/uapi/asm/stat.h index 07ad3e6b3f3..07ad3e6b3f3 100644 --- a/arch/alpha/include/asm/stat.h +++ b/arch/alpha/include/uapi/asm/stat.h diff --git a/arch/alpha/include/asm/statfs.h b/arch/alpha/include/uapi/asm/statfs.h index ccd2e186bfd..ccd2e186bfd 100644 --- a/arch/alpha/include/asm/statfs.h +++ b/arch/alpha/include/uapi/asm/statfs.h diff --git a/arch/alpha/include/asm/swab.h b/arch/alpha/include/uapi/asm/swab.h index 4d682b16c7c..4d682b16c7c 100644 --- a/arch/alpha/include/asm/swab.h +++ b/arch/alpha/include/uapi/asm/swab.h diff --git a/arch/alpha/include/asm/sysinfo.h b/arch/alpha/include/uapi/asm/sysinfo.h index 086aba284df..0b80e79d75e 100644 --- a/arch/alpha/include/asm/sysinfo.h +++ b/arch/alpha/include/uapi/asm/sysinfo.h @@ -15,6 +15,7 @@  #define GSI_GET_HWRPB			101  #define SSI_NVPAIRS			1 +#define SSI_LMF				7  #define SSI_IEEE_FP_CONTROL		14  #define SSI_IEEE_STATE_AT_SIGNAL	15  #define SSI_IEEE_IGNORE_STATE_AT_SIGNAL	16 @@ -27,13 +28,4 @@  #define UAC_NOFIX			2  #define UAC_SIGBUS			4 - -#ifdef __KERNEL__ - -/* This is the shift that is applied to the UAC bits as stored in the -   per-thread flags.  See thread_info.h.  */ -#define UAC_SHIFT			6 - -#endif -  #endif /* __ASM_ALPHA_SYSINFO_H */ diff --git a/arch/alpha/include/asm/termbits.h b/arch/alpha/include/uapi/asm/termbits.h index 879dd358992..879dd358992 100644 --- a/arch/alpha/include/asm/termbits.h +++ b/arch/alpha/include/uapi/asm/termbits.h diff --git a/arch/alpha/include/uapi/asm/termios.h b/arch/alpha/include/uapi/asm/termios.h new file mode 100644 index 00000000000..580ed1e4854 --- /dev/null +++ b/arch/alpha/include/uapi/asm/termios.h @@ -0,0 +1,70 @@ +#ifndef _UAPI_ALPHA_TERMIOS_H +#define _UAPI_ALPHA_TERMIOS_H + +#include <asm/ioctls.h> +#include <asm/termbits.h> + +struct sgttyb { +	char	sg_ispeed; +	char	sg_ospeed; +	char	sg_erase; +	char	sg_kill; +	short	sg_flags; +}; + +struct tchars { +	char	t_intrc; +	char	t_quitc; +	char	t_startc; +	char	t_stopc; +	char	t_eofc; +	char	t_brkc; +}; + +struct ltchars { +	char	t_suspc; +	char	t_dsuspc; +	char	t_rprntc; +	char	t_flushc; +	char	t_werasc; +	char	t_lnextc; +}; + +struct winsize { +	unsigned short ws_row; +	unsigned short ws_col; +	unsigned short ws_xpixel; +	unsigned short ws_ypixel; +}; + +#define NCC 8 +struct termio { +	unsigned short c_iflag;		/* input mode flags */ +	unsigned short c_oflag;		/* output mode flags */ +	unsigned short c_cflag;		/* control mode flags */ +	unsigned short c_lflag;		/* local mode flags */ +	unsigned char c_line;		/* line discipline */ +	unsigned char c_cc[NCC];	/* control characters */ +}; + +/* + * c_cc characters in the termio structure.  Oh, how I love being + * backwardly compatible.  Notice that character 4 and 5 are + * interpreted differently depending on whether ICANON is set in + * c_lflag.  If it's set, they are used as _VEOF and _VEOL, otherwise + * as _VMIN and V_TIME.  This is for compatibility with OSF/1 (which + * is compatible with sysV)... + */ +#define _VINTR	0 +#define _VQUIT	1 +#define _VERASE	2 +#define _VKILL	3 +#define _VEOF	4 +#define _VMIN	4 +#define _VEOL	5 +#define _VTIME	5 +#define _VEOL2	6 +#define _VSWTC	7 + + +#endif /* _UAPI_ALPHA_TERMIOS_H */ diff --git a/arch/alpha/include/uapi/asm/types.h b/arch/alpha/include/uapi/asm/types.h new file mode 100644 index 00000000000..9fd3cd45977 --- /dev/null +++ b/arch/alpha/include/uapi/asm/types.h @@ -0,0 +1,16 @@ +#ifndef _UAPI_ALPHA_TYPES_H +#define _UAPI_ALPHA_TYPES_H + +/* + * This file is never included by application software unless + * explicitly requested (e.g., via linux/types.h) in which case the + * application is Linux specific so (user-) name space pollution is + * not a major issue.  However, for interoperability, libraries still + * need to be careful to avoid a name clashes. + */ + +#ifndef __KERNEL__ +#include <asm-generic/int-l64.h> +#endif + +#endif /* _UAPI_ALPHA_TYPES_H */ diff --git a/arch/alpha/include/uapi/asm/unistd.h b/arch/alpha/include/uapi/asm/unistd.h new file mode 100644 index 00000000000..53ae7bb1bfd --- /dev/null +++ b/arch/alpha/include/uapi/asm/unistd.h @@ -0,0 +1,473 @@ +#ifndef _UAPI_ALPHA_UNISTD_H +#define _UAPI_ALPHA_UNISTD_H + +#define __NR_osf_syscall	  0	/* not implemented */ +#define __NR_exit		  1 +#define __NR_fork		  2 +#define __NR_read		  3 +#define __NR_write		  4 +#define __NR_osf_old_open	  5	/* not implemented */ +#define __NR_close		  6 +#define __NR_osf_wait4		  7 +#define __NR_osf_old_creat	  8	/* not implemented */ +#define __NR_link		  9 +#define __NR_unlink		 10 +#define __NR_osf_execve		 11	/* not implemented */ +#define __NR_chdir		 12 +#define __NR_fchdir		 13 +#define __NR_mknod		 14 +#define __NR_chmod		 15 +#define __NR_chown		 16 +#define __NR_brk		 17 +#define __NR_osf_getfsstat	 18	/* not implemented */ +#define __NR_lseek		 19 +#define __NR_getxpid		 20 +#define __NR_osf_mount		 21 +#define __NR_umount		 22 +#define __NR_setuid		 23 +#define __NR_getxuid		 24 +#define __NR_exec_with_loader	 25	/* not implemented */ +#define __NR_ptrace		 26 +#define __NR_osf_nrecvmsg	 27	/* not implemented */ +#define __NR_osf_nsendmsg	 28	/* not implemented */ +#define __NR_osf_nrecvfrom	 29	/* not implemented */ +#define __NR_osf_naccept	 30	/* not implemented */ +#define __NR_osf_ngetpeername	 31	/* not implemented */ +#define __NR_osf_ngetsockname	 32	/* not implemented */ +#define __NR_access		 33 +#define __NR_osf_chflags	 34	/* not implemented */ +#define __NR_osf_fchflags	 35	/* not implemented */ +#define __NR_sync		 36 +#define __NR_kill		 37 +#define __NR_osf_old_stat	 38	/* not implemented */ +#define __NR_setpgid		 39 +#define __NR_osf_old_lstat	 40	/* not implemented */ +#define __NR_dup		 41 +#define __NR_pipe		 42 +#define __NR_osf_set_program_attributes	43 +#define __NR_osf_profil		 44	/* not implemented */ +#define __NR_open		 45 +#define __NR_osf_old_sigaction	 46	/* not implemented */ +#define __NR_getxgid		 47 +#define __NR_osf_sigprocmask	 48 +#define __NR_osf_getlogin	 49	/* not implemented */ +#define __NR_osf_setlogin	 50	/* not implemented */ +#define __NR_acct		 51 +#define __NR_sigpending		 52 + +#define __NR_ioctl		 54 +#define __NR_osf_reboot		 55	/* not implemented */ +#define __NR_osf_revoke		 56	/* not implemented */ +#define __NR_symlink		 57 +#define __NR_readlink		 58 +#define __NR_execve		 59 +#define __NR_umask		 60 +#define __NR_chroot		 61 +#define __NR_osf_old_fstat	 62	/* not implemented */ +#define __NR_getpgrp		 63 +#define __NR_getpagesize	 64 +#define __NR_osf_mremap		 65	/* not implemented */ +#define __NR_vfork		 66 +#define __NR_stat		 67 +#define __NR_lstat		 68 +#define __NR_osf_sbrk		 69	/* not implemented */ +#define __NR_osf_sstk		 70	/* not implemented */ +#define __NR_mmap		 71	/* OSF/1 mmap is superset of Linux */ +#define __NR_osf_old_vadvise	 72	/* not implemented */ +#define __NR_munmap		 73 +#define __NR_mprotect		 74 +#define __NR_madvise		 75 +#define __NR_vhangup		 76 +#define __NR_osf_kmodcall	 77	/* not implemented */ +#define __NR_osf_mincore	 78	/* not implemented */ +#define __NR_getgroups		 79 +#define __NR_setgroups		 80 +#define __NR_osf_old_getpgrp	 81	/* not implemented */ +#define __NR_setpgrp		 82	/* BSD alias for setpgid */ +#define __NR_osf_setitimer	 83 +#define __NR_osf_old_wait	 84	/* not implemented */ +#define __NR_osf_table		 85	/* not implemented */ +#define __NR_osf_getitimer	 86 +#define __NR_gethostname	 87 +#define __NR_sethostname	 88 +#define __NR_getdtablesize	 89 +#define __NR_dup2		 90 +#define __NR_fstat		 91 +#define __NR_fcntl		 92 +#define __NR_osf_select		 93 +#define __NR_poll		 94 +#define __NR_fsync		 95 +#define __NR_setpriority	 96 +#define __NR_socket		 97 +#define __NR_connect		 98 +#define __NR_accept		 99 +#define __NR_getpriority	100 +#define __NR_send		101 +#define __NR_recv		102 +#define __NR_sigreturn		103 +#define __NR_bind		104 +#define __NR_setsockopt		105 +#define __NR_listen		106 +#define __NR_osf_plock		107	/* not implemented */ +#define __NR_osf_old_sigvec	108	/* not implemented */ +#define __NR_osf_old_sigblock	109	/* not implemented */ +#define __NR_osf_old_sigsetmask	110	/* not implemented */ +#define __NR_sigsuspend		111 +#define __NR_osf_sigstack	112 +#define __NR_recvmsg		113 +#define __NR_sendmsg		114 +#define __NR_osf_old_vtrace	115	/* not implemented */ +#define __NR_osf_gettimeofday	116 +#define __NR_osf_getrusage	117 +#define __NR_getsockopt		118 + +#define __NR_readv		120 +#define __NR_writev		121 +#define __NR_osf_settimeofday	122 +#define __NR_fchown		123 +#define __NR_fchmod		124 +#define __NR_recvfrom		125 +#define __NR_setreuid		126 +#define __NR_setregid		127 +#define __NR_rename		128 +#define __NR_truncate		129 +#define __NR_ftruncate		130 +#define __NR_flock		131 +#define __NR_setgid		132 +#define __NR_sendto		133 +#define __NR_shutdown		134 +#define __NR_socketpair		135 +#define __NR_mkdir		136 +#define __NR_rmdir		137 +#define __NR_osf_utimes		138 +#define __NR_osf_old_sigreturn	139	/* not implemented */ +#define __NR_osf_adjtime	140	/* not implemented */ +#define __NR_getpeername	141 +#define __NR_osf_gethostid	142	/* not implemented */ +#define __NR_osf_sethostid	143	/* not implemented */ +#define __NR_getrlimit		144 +#define __NR_setrlimit		145 +#define __NR_osf_old_killpg	146	/* not implemented */ +#define __NR_setsid		147 +#define __NR_quotactl		148 +#define __NR_osf_oldquota	149	/* not implemented */ +#define __NR_getsockname	150 + +#define __NR_osf_pid_block	153	/* not implemented */ +#define __NR_osf_pid_unblock	154	/* not implemented */ + +#define __NR_sigaction		156 +#define __NR_osf_sigwaitprim	157	/* not implemented */ +#define __NR_osf_nfssvc		158	/* not implemented */ +#define __NR_osf_getdirentries	159 +#define __NR_osf_statfs		160 +#define __NR_osf_fstatfs	161 + +#define __NR_osf_asynch_daemon	163	/* not implemented */ +#define __NR_osf_getfh		164	/* not implemented */	 +#define __NR_osf_getdomainname	165 +#define __NR_setdomainname	166 + +#define __NR_osf_exportfs	169	/* not implemented */ + +#define __NR_osf_alt_plock	181	/* not implemented */ + +#define __NR_osf_getmnt		184	/* not implemented */ + +#define __NR_osf_alt_sigpending	187	/* not implemented */ +#define __NR_osf_alt_setsid	188	/* not implemented */ + +#define __NR_osf_swapon		199 +#define __NR_msgctl		200 +#define __NR_msgget		201 +#define __NR_msgrcv		202 +#define __NR_msgsnd		203 +#define __NR_semctl		204 +#define __NR_semget		205 +#define __NR_semop		206 +#define __NR_osf_utsname	207 +#define __NR_lchown		208 +#define __NR_osf_shmat		209 +#define __NR_shmctl		210 +#define __NR_shmdt		211 +#define __NR_shmget		212 +#define __NR_osf_mvalid		213	/* not implemented */ +#define __NR_osf_getaddressconf	214	/* not implemented */ +#define __NR_osf_msleep		215	/* not implemented */ +#define __NR_osf_mwakeup	216	/* not implemented */ +#define __NR_msync		217 +#define __NR_osf_signal		218	/* not implemented */ +#define __NR_osf_utc_gettime	219	/* not implemented */ +#define __NR_osf_utc_adjtime	220	/* not implemented */ + +#define __NR_osf_security	222	/* not implemented */ +#define __NR_osf_kloadcall	223	/* not implemented */ + +#define __NR_osf_stat		224 +#define __NR_osf_lstat		225 +#define __NR_osf_fstat		226 +#define __NR_osf_statfs64	227 +#define __NR_osf_fstatfs64	228 + +#define __NR_getpgid		233 +#define __NR_getsid		234 +#define __NR_sigaltstack	235 +#define __NR_osf_waitid		236	/* not implemented */ +#define __NR_osf_priocntlset	237	/* not implemented */ +#define __NR_osf_sigsendset	238	/* not implemented */ +#define __NR_osf_set_speculative	239	/* not implemented */ +#define __NR_osf_msfs_syscall	240	/* not implemented */ +#define __NR_osf_sysinfo	241 +#define __NR_osf_uadmin		242	/* not implemented */ +#define __NR_osf_fuser		243	/* not implemented */ +#define __NR_osf_proplist_syscall    244 +#define __NR_osf_ntp_adjtime	245	/* not implemented */ +#define __NR_osf_ntp_gettime	246	/* not implemented */ +#define __NR_osf_pathconf	247	/* not implemented */ +#define __NR_osf_fpathconf	248	/* not implemented */ + +#define __NR_osf_uswitch	250	/* not implemented */ +#define __NR_osf_usleep_thread	251 +#define __NR_osf_audcntl	252	/* not implemented */ +#define __NR_osf_audgen		253	/* not implemented */ +#define __NR_sysfs		254 +#define __NR_osf_subsys_info	255	/* not implemented */ +#define __NR_osf_getsysinfo	256 +#define __NR_osf_setsysinfo	257 +#define __NR_osf_afs_syscall	258	/* not implemented */ +#define __NR_osf_swapctl	259	/* not implemented */ +#define __NR_osf_memcntl	260	/* not implemented */ +#define __NR_osf_fdatasync	261	/* not implemented */ + +/* + * Ignore legacy syscalls that we don't use. + */ +#define __IGNORE_alarm +#define __IGNORE_creat +#define __IGNORE_getegid +#define __IGNORE_geteuid +#define __IGNORE_getgid +#define __IGNORE_getpid +#define __IGNORE_getppid +#define __IGNORE_getuid +#define __IGNORE_pause +#define __IGNORE_time +#define __IGNORE_utime +#define __IGNORE_umount2 + +/* + * Linux-specific system calls begin at 300 + */ +#define __NR_bdflush		300 +#define __NR_sethae		301 +#define __NR_mount		302 +#define __NR_old_adjtimex	303 +#define __NR_swapoff		304 +#define __NR_getdents		305 +#define __NR_create_module	306 +#define __NR_init_module	307 +#define __NR_delete_module	308 +#define __NR_get_kernel_syms	309 +#define __NR_syslog		310 +#define __NR_reboot		311 +#define __NR_clone		312 +#define __NR_uselib		313 +#define __NR_mlock		314 +#define __NR_munlock		315 +#define __NR_mlockall		316 +#define __NR_munlockall		317 +#define __NR_sysinfo		318 +#define __NR__sysctl		319 +/* 320 was sys_idle.  */ +#define __NR_oldumount		321 +#define __NR_swapon		322 +#define __NR_times		323 +#define __NR_personality	324 +#define __NR_setfsuid		325 +#define __NR_setfsgid		326 +#define __NR_ustat		327 +#define __NR_statfs		328 +#define __NR_fstatfs		329 +#define __NR_sched_setparam		330 +#define __NR_sched_getparam		331 +#define __NR_sched_setscheduler		332 +#define __NR_sched_getscheduler		333 +#define __NR_sched_yield		334 +#define __NR_sched_get_priority_max	335 +#define __NR_sched_get_priority_min	336 +#define __NR_sched_rr_get_interval	337 +#define __NR_afs_syscall		338 +#define __NR_uname			339 +#define __NR_nanosleep			340 +#define __NR_mremap			341 +#define __NR_nfsservctl			342 +#define __NR_setresuid			343 +#define __NR_getresuid			344 +#define __NR_pciconfig_read		345 +#define __NR_pciconfig_write		346 +#define __NR_query_module		347 +#define __NR_prctl			348 +#define __NR_pread64			349 +#define __NR_pwrite64			350 +#define __NR_rt_sigreturn		351 +#define __NR_rt_sigaction		352 +#define __NR_rt_sigprocmask		353 +#define __NR_rt_sigpending		354 +#define __NR_rt_sigtimedwait		355 +#define __NR_rt_sigqueueinfo		356 +#define __NR_rt_sigsuspend		357 +#define __NR_select			358 +#define __NR_gettimeofday		359 +#define __NR_settimeofday		360 +#define __NR_getitimer			361 +#define __NR_setitimer			362 +#define __NR_utimes			363 +#define __NR_getrusage			364 +#define __NR_wait4			365 +#define __NR_adjtimex			366 +#define __NR_getcwd			367 +#define __NR_capget			368 +#define __NR_capset			369 +#define __NR_sendfile			370 +#define __NR_setresgid			371 +#define __NR_getresgid			372 +#define __NR_dipc			373 +#define __NR_pivot_root			374 +#define __NR_mincore			375 +#define __NR_pciconfig_iobase		376 +#define __NR_getdents64			377 +#define __NR_gettid			378 +#define __NR_readahead			379 +/* 380 is unused */ +#define __NR_tkill			381 +#define __NR_setxattr			382 +#define __NR_lsetxattr			383 +#define __NR_fsetxattr			384 +#define __NR_getxattr			385 +#define __NR_lgetxattr			386 +#define __NR_fgetxattr			387 +#define __NR_listxattr			388 +#define __NR_llistxattr			389 +#define __NR_flistxattr			390 +#define __NR_removexattr		391 +#define __NR_lremovexattr		392 +#define __NR_fremovexattr		393 +#define __NR_futex			394 +#define __NR_sched_setaffinity		395      +#define __NR_sched_getaffinity		396 +#define __NR_tuxcall			397 +#define __NR_io_setup			398 +#define __NR_io_destroy			399 +#define __NR_io_getevents		400 +#define __NR_io_submit			401 +#define __NR_io_cancel			402 +#define __NR_exit_group			405 +#define __NR_lookup_dcookie		406 +#define __NR_epoll_create		407 +#define __NR_epoll_ctl			408 +#define __NR_epoll_wait			409 +/* Feb 2007: These three sys_epoll defines shouldn't be here but culling + * them would break userspace apps ... we'll kill them off in 2010 :) */ +#define __NR_sys_epoll_create		__NR_epoll_create +#define __NR_sys_epoll_ctl		__NR_epoll_ctl +#define __NR_sys_epoll_wait		__NR_epoll_wait +#define __NR_remap_file_pages		410 +#define __NR_set_tid_address		411 +#define __NR_restart_syscall		412 +#define __NR_fadvise64			413 +#define __NR_timer_create		414 +#define __NR_timer_settime		415 +#define __NR_timer_gettime		416 +#define __NR_timer_getoverrun		417 +#define __NR_timer_delete		418 +#define __NR_clock_settime		419 +#define __NR_clock_gettime		420 +#define __NR_clock_getres		421 +#define __NR_clock_nanosleep		422 +#define __NR_semtimedop			423 +#define __NR_tgkill			424 +#define __NR_stat64			425 +#define __NR_lstat64			426 +#define __NR_fstat64			427 +#define __NR_vserver			428 +#define __NR_mbind			429 +#define __NR_get_mempolicy		430 +#define __NR_set_mempolicy		431 +#define __NR_mq_open			432 +#define __NR_mq_unlink			433 +#define __NR_mq_timedsend		434 +#define __NR_mq_timedreceive		435 +#define __NR_mq_notify			436 +#define __NR_mq_getsetattr		437 +#define __NR_waitid			438 +#define __NR_add_key			439 +#define __NR_request_key		440 +#define __NR_keyctl			441 +#define __NR_ioprio_set			442 +#define __NR_ioprio_get			443 +#define __NR_inotify_init		444 +#define __NR_inotify_add_watch		445 +#define __NR_inotify_rm_watch		446 +#define __NR_fdatasync			447 +#define __NR_kexec_load			448 +#define __NR_migrate_pages		449 +#define __NR_openat			450 +#define __NR_mkdirat			451 +#define __NR_mknodat			452 +#define __NR_fchownat			453 +#define __NR_futimesat			454 +#define __NR_fstatat64			455 +#define __NR_unlinkat			456 +#define __NR_renameat			457 +#define __NR_linkat			458 +#define __NR_symlinkat			459 +#define __NR_readlinkat			460 +#define __NR_fchmodat			461 +#define __NR_faccessat			462 +#define __NR_pselect6			463 +#define __NR_ppoll			464 +#define __NR_unshare			465 +#define __NR_set_robust_list		466 +#define __NR_get_robust_list		467 +#define __NR_splice			468 +#define __NR_sync_file_range		469 +#define __NR_tee			470 +#define __NR_vmsplice			471 +#define __NR_move_pages			472 +#define __NR_getcpu			473 +#define __NR_epoll_pwait		474 +#define __NR_utimensat			475 +#define __NR_signalfd			476 +#define __NR_timerfd			477 +#define __NR_eventfd			478 +#define __NR_recvmmsg			479 +#define __NR_fallocate			480 +#define __NR_timerfd_create		481 +#define __NR_timerfd_settime		482 +#define __NR_timerfd_gettime		483 +#define __NR_signalfd4			484 +#define __NR_eventfd2			485 +#define __NR_epoll_create1		486 +#define __NR_dup3			487 +#define __NR_pipe2			488 +#define __NR_inotify_init1		489 +#define __NR_preadv			490 +#define __NR_pwritev			491 +#define __NR_rt_tgsigqueueinfo		492 +#define __NR_perf_event_open		493 +#define __NR_fanotify_init		494 +#define __NR_fanotify_mark		495 +#define __NR_prlimit64			496 +#define __NR_name_to_handle_at		497 +#define __NR_open_by_handle_at		498 +#define __NR_clock_adjtime		499 +#define __NR_syncfs			500 +#define __NR_setns			501 +#define __NR_accept4			502 +#define __NR_sendmmsg			503 +#define __NR_process_vm_readv		504 +#define __NR_process_vm_writev		505 +#define __NR_kcmp			506 +#define __NR_finit_module		507 + +#endif /* _UAPI_ALPHA_UNISTD_H */ diff --git a/arch/alpha/kernel/Makefile b/arch/alpha/kernel/Makefile index 1ee9b5b629b..3ecac0106c8 100644 --- a/arch/alpha/kernel/Makefile +++ b/arch/alpha/kernel/Makefile @@ -3,10 +3,10 @@  #  extra-y		:= head.o vmlinux.lds -EXTRA_AFLAGS	:= $(KBUILD_CFLAGS) -EXTRA_CFLAGS	:= -Werror -Wno-sign-compare +asflags-y	:= $(KBUILD_CFLAGS) +ccflags-y	:= -Wno-sign-compare -obj-y    := entry.o traps.o process.o init_task.o osf_sys.o irq.o \ +obj-y    := entry.o traps.o process.o osf_sys.o irq.o \  	    irq_alpha.o signal.o setup.o ptrace.o time.o \  	    alpha_ksyms.o systbls.o err_common.o io.o @@ -16,6 +16,8 @@ obj-$(CONFIG_PCI)	+= pci.o pci_iommu.o pci-sysfs.o  obj-$(CONFIG_SRM_ENV)	+= srm_env.o  obj-$(CONFIG_MODULES)	+= module.o  obj-$(CONFIG_PERF_EVENTS) += perf_event.o +obj-$(CONFIG_RTC_DRV_ALPHA) += rtc.o +obj-$(CONFIG_AUDIT)	+= audit.o  ifdef CONFIG_ALPHA_GENERIC diff --git a/arch/alpha/kernel/alpha_ksyms.c b/arch/alpha/kernel/alpha_ksyms.c index d96e742d4dc..f4c7ab6f43b 100644 --- a/arch/alpha/kernel/alpha_ksyms.c +++ b/arch/alpha/kernel/alpha_ksyms.c @@ -40,6 +40,7 @@ EXPORT_SYMBOL(strrchr);  EXPORT_SYMBOL(memmove);  EXPORT_SYMBOL(__memcpy);  EXPORT_SYMBOL(__memset); +EXPORT_SYMBOL(___memset);  EXPORT_SYMBOL(__memsetw);  EXPORT_SYMBOL(__constant_c_memset);  EXPORT_SYMBOL(copy_page); @@ -50,10 +51,6 @@ EXPORT_SYMBOL(alpha_read_fp_reg_s);  EXPORT_SYMBOL(alpha_write_fp_reg);  EXPORT_SYMBOL(alpha_write_fp_reg_s); -/* entry.S */ -EXPORT_SYMBOL(kernel_thread); -EXPORT_SYMBOL(kernel_execve); -  /* Networking helper routines. */  EXPORT_SYMBOL(csum_tcpudp_magic);  EXPORT_SYMBOL(ip_compute_csum); @@ -74,8 +71,6 @@ EXPORT_SYMBOL(alpha_fp_emul);   */  EXPORT_SYMBOL(__copy_user);  EXPORT_SYMBOL(__do_clear_user); -EXPORT_SYMBOL(__strncpy_from_user); -EXPORT_SYMBOL(__strnlen_user);  /*    * SMP-specific symbols. diff --git a/arch/alpha/kernel/audit.c b/arch/alpha/kernel/audit.c new file mode 100644 index 00000000000..96a9d18ff4c --- /dev/null +++ b/arch/alpha/kernel/audit.c @@ -0,0 +1,60 @@ +#include <linux/init.h> +#include <linux/types.h> +#include <linux/audit.h> +#include <asm/unistd.h> + +static unsigned dir_class[] = { +#include <asm-generic/audit_dir_write.h> +~0U +}; + +static unsigned read_class[] = { +#include <asm-generic/audit_read.h> +~0U +}; + +static unsigned write_class[] = { +#include <asm-generic/audit_write.h> +~0U +}; + +static unsigned chattr_class[] = { +#include <asm-generic/audit_change_attr.h> +~0U +}; + +static unsigned signal_class[] = { +#include <asm-generic/audit_signal.h> +~0U +}; + +int audit_classify_arch(int arch) +{ +	return 0; +} + +int audit_classify_syscall(int abi, unsigned syscall) +{ +	switch(syscall) { +	case __NR_open: +		return 2; +	case __NR_openat: +		return 3; +	case __NR_execve: +		return 5; +	default: +		return 0; +	} +} + +static int __init audit_classes_init(void) +{ +	audit_register_class(AUDIT_CLASS_WRITE, write_class); +	audit_register_class(AUDIT_CLASS_READ, read_class); +	audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class); +	audit_register_class(AUDIT_CLASS_CHATTR, chattr_class); +	audit_register_class(AUDIT_CLASS_SIGNAL, signal_class); +	return 0; +} + +__initcall(audit_classes_init); diff --git a/arch/alpha/kernel/binfmt_loader.c b/arch/alpha/kernel/binfmt_loader.c index 3fcfad41013..9525660c93c 100644 --- a/arch/alpha/kernel/binfmt_loader.c +++ b/arch/alpha/kernel/binfmt_loader.c @@ -5,7 +5,7 @@  #include <linux/binfmts.h>  #include <linux/a.out.h> -static int load_binary(struct linux_binprm *bprm, struct pt_regs *regs) +static int load_binary(struct linux_binprm *bprm)  {  	struct exec *eh = (struct exec *)bprm->buf;  	unsigned long loader; @@ -37,7 +37,7 @@ static int load_binary(struct linux_binprm *bprm, struct pt_regs *regs)  	retval = prepare_binprm(bprm);  	if (retval < 0)  		return retval; -	return search_binary_handler(bprm,regs); +	return search_binary_handler(bprm);  }  static struct linux_binfmt loader_format = { @@ -46,6 +46,7 @@ static struct linux_binfmt loader_format = {  static int __init init_loader_binfmt(void)  { -	return insert_binfmt(&loader_format); +	insert_binfmt(&loader_format); +	return 0;  }  arch_initcall(init_loader_binfmt); diff --git a/arch/alpha/kernel/console.c b/arch/alpha/kernel/console.c index da711e37fc9..6a61deed4a8 100644 --- a/arch/alpha/kernel/console.c +++ b/arch/alpha/kernel/console.c @@ -61,7 +61,9 @@ locate_and_init_vga(void *(*sel_func)(void *, void *))  	/* Set the VGA hose and init the new console. */  	pci_vga_hose = hose; -	take_over_console(&vga_con, 0, MAX_NR_CONSOLES-1, 1); +	console_lock(); +	do_take_over_console(&vga_con, 0, MAX_NR_CONSOLES-1, 1); +	console_unlock();  }  void __init diff --git a/arch/alpha/kernel/core_apecs.c b/arch/alpha/kernel/core_apecs.c index ca46b2c2445..708c831efa7 100644 --- a/arch/alpha/kernel/core_apecs.c +++ b/arch/alpha/kernel/core_apecs.c @@ -21,6 +21,7 @@  #include <asm/ptrace.h>  #include <asm/smp.h> +#include <asm/mce.h>  #include "proto.h"  #include "pci_impl.h" diff --git a/arch/alpha/kernel/core_cia.c b/arch/alpha/kernel/core_cia.c index 1d6ee6c985f..c44339e176c 100644 --- a/arch/alpha/kernel/core_cia.c +++ b/arch/alpha/kernel/core_cia.c @@ -23,6 +23,7 @@  #include <linux/bootmem.h>  #include <asm/ptrace.h> +#include <asm/mce.h>  #include "proto.h"  #include "pci_impl.h" diff --git a/arch/alpha/kernel/core_irongate.c b/arch/alpha/kernel/core_irongate.c index a872078497b..00096df0f6a 100644 --- a/arch/alpha/kernel/core_irongate.c +++ b/arch/alpha/kernel/core_irongate.c @@ -303,6 +303,7 @@ irongate_init_arch(void)  #include <linux/vmalloc.h>  #include <linux/agp_backend.h>  #include <linux/agpgart.h> +#include <linux/export.h>  #include <asm/pgalloc.h>  #define GET_PAGE_DIR_OFF(addr) (addr >> 22) diff --git a/arch/alpha/kernel/core_lca.c b/arch/alpha/kernel/core_lca.c index 4843f6ec9f3..cb2801cfd3d 100644 --- a/arch/alpha/kernel/core_lca.c +++ b/arch/alpha/kernel/core_lca.c @@ -133,7 +133,7 @@ conf_read(unsigned long addr)  	local_irq_save(flags); -	/* Reset status register to avoid loosing errors.  */ +	/* Reset status register to avoid losing errors.  */  	stat0 = *(vulp)LCA_IOC_STAT0;  	*(vulp)LCA_IOC_STAT0 = stat0;  	mb(); @@ -170,7 +170,7 @@ conf_write(unsigned long addr, unsigned int value)  	local_irq_save(flags);	/* avoid getting hit by machine check */ -	/* Reset status register to avoid loosing errors.  */ +	/* Reset status register to avoid losing errors.  */  	stat0 = *(vulp)LCA_IOC_STAT0;  	*(vulp)LCA_IOC_STAT0 = stat0;  	mb(); diff --git a/arch/alpha/kernel/core_mcpcia.c b/arch/alpha/kernel/core_mcpcia.c index 381fec0af52..da7bcc372f1 100644 --- a/arch/alpha/kernel/core_mcpcia.c +++ b/arch/alpha/kernel/core_mcpcia.c @@ -88,7 +88,7 @@ conf_read(unsigned long addr, unsigned char type1,  {  	unsigned long flags;  	unsigned long mid = MCPCIA_HOSE2MID(hose->index); -	unsigned int stat0, value, temp, cpu; +	unsigned int stat0, value, cpu;  	cpu = smp_processor_id(); @@ -101,7 +101,7 @@ conf_read(unsigned long addr, unsigned char type1,  	stat0 = *(vuip)MCPCIA_CAP_ERR(mid);  	*(vuip)MCPCIA_CAP_ERR(mid) = stat0;  	mb(); -	temp = *(vuip)MCPCIA_CAP_ERR(mid); +	*(vuip)MCPCIA_CAP_ERR(mid);  	DBG_CFG(("conf_read: MCPCIA_CAP_ERR(%d) was 0x%x\n", mid, stat0));  	mb(); @@ -136,7 +136,7 @@ conf_write(unsigned long addr, unsigned int value, unsigned char type1,  {  	unsigned long flags;  	unsigned long mid = MCPCIA_HOSE2MID(hose->index); -	unsigned int stat0, temp, cpu; +	unsigned int stat0, cpu;  	cpu = smp_processor_id(); @@ -145,7 +145,7 @@ conf_write(unsigned long addr, unsigned int value, unsigned char type1,  	/* Reset status register to avoid losing errors.  */  	stat0 = *(vuip)MCPCIA_CAP_ERR(mid);  	*(vuip)MCPCIA_CAP_ERR(mid) = stat0; mb(); -	temp = *(vuip)MCPCIA_CAP_ERR(mid); +	*(vuip)MCPCIA_CAP_ERR(mid);  	DBG_CFG(("conf_write: MCPCIA CAP_ERR(%d) was 0x%x\n", mid, stat0));  	draina(); @@ -157,7 +157,7 @@ conf_write(unsigned long addr, unsigned int value, unsigned char type1,  	*((vuip)addr) = value;  	mb();  	mb();  /* magic */ -	temp = *(vuip)MCPCIA_CAP_ERR(mid); /* read to force the write */ +	*(vuip)MCPCIA_CAP_ERR(mid); /* read to force the write */  	mcheck_expected(cpu) = 0;  	mb(); @@ -572,12 +572,10 @@ mcpcia_print_system_area(unsigned long la_ptr)  void  mcpcia_machine_check(unsigned long vector, unsigned long la_ptr)  { -	struct el_common *mchk_header;  	struct el_MCPCIA_uncorrected_frame_mcheck *mchk_logout;  	unsigned int cpu = smp_processor_id();  	int expected; -	mchk_header = (struct el_common *)la_ptr;  	mchk_logout = (struct el_MCPCIA_uncorrected_frame_mcheck *)la_ptr;  	expected = mcheck_expected(cpu); diff --git a/arch/alpha/kernel/core_t2.c b/arch/alpha/kernel/core_t2.c index 2f770e99428..3ada4f7b085 100644 --- a/arch/alpha/kernel/core_t2.c +++ b/arch/alpha/kernel/core_t2.c @@ -21,6 +21,7 @@  #include <asm/ptrace.h>  #include <asm/delay.h> +#include <asm/mce.h>  #include "proto.h"  #include "pci_impl.h" diff --git a/arch/alpha/kernel/core_tsunami.c b/arch/alpha/kernel/core_tsunami.c index 5e7c28f92f1..61893d7bdda 100644 --- a/arch/alpha/kernel/core_tsunami.c +++ b/arch/alpha/kernel/core_tsunami.c @@ -11,6 +11,7 @@  #include <asm/core_tsunami.h>  #undef __EXTERN_INLINE +#include <linux/module.h>  #include <linux/types.h>  #include <linux/pci.h>  #include <linux/sched.h> diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index 6d159cee5f2..98703d99b56 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S @@ -12,11 +12,32 @@  	.text  	.set noat +	.cfi_sections	.debug_frame  /* Stack offsets.  */  #define SP_OFF			184  #define SWITCH_STACK_SIZE	320 +.macro	CFI_START_OSF_FRAME	func +	.align	4 +	.globl	\func +	.type	\func,@function +\func: +	.cfi_startproc simple +	.cfi_return_column 64 +	.cfi_def_cfa	$sp, 48 +	.cfi_rel_offset	64, 8 +	.cfi_rel_offset	$gp, 16 +	.cfi_rel_offset	$16, 24 +	.cfi_rel_offset	$17, 32 +	.cfi_rel_offset	$18, 40 +.endm + +.macro	CFI_END_OSF_FRAME	func +	.cfi_endproc +	.size	\func, . - \func +.endm +  /*   * This defines the normal kernel pt-regs layout.   * @@ -27,100 +48,158 @@   * the palcode-provided values are available to the signal handler.   */ -#define SAVE_ALL			\ -	subq	$sp, SP_OFF, $sp;	\ -	stq	$0, 0($sp);		\ -	stq	$1, 8($sp);		\ -	stq	$2, 16($sp);		\ -	stq	$3, 24($sp);		\ -	stq	$4, 32($sp);		\ -	stq	$28, 144($sp);		\ -	lda	$2, alpha_mv;		\ -	stq	$5, 40($sp);		\ -	stq	$6, 48($sp);		\ -	stq	$7, 56($sp);		\ -	stq	$8, 64($sp);		\ -	stq	$19, 72($sp);		\ -	stq	$20, 80($sp);		\ -	stq	$21, 88($sp);		\ -	ldq	$2, HAE_CACHE($2);	\ -	stq	$22, 96($sp);		\ -	stq	$23, 104($sp);		\ -	stq	$24, 112($sp);		\ -	stq	$25, 120($sp);		\ -	stq	$26, 128($sp);		\ -	stq	$27, 136($sp);		\ -	stq	$2, 152($sp);		\ -	stq	$16, 160($sp);		\ -	stq	$17, 168($sp);		\ +.macro	SAVE_ALL +	subq	$sp, SP_OFF, $sp +	.cfi_adjust_cfa_offset	SP_OFF +	stq	$0, 0($sp) +	stq	$1, 8($sp) +	stq	$2, 16($sp) +	stq	$3, 24($sp) +	stq	$4, 32($sp) +	stq	$28, 144($sp) +	.cfi_rel_offset	$0, 0 +	.cfi_rel_offset $1, 8 +	.cfi_rel_offset	$2, 16 +	.cfi_rel_offset	$3, 24 +	.cfi_rel_offset	$4, 32 +	.cfi_rel_offset	$28, 144 +	lda	$2, alpha_mv +	stq	$5, 40($sp) +	stq	$6, 48($sp) +	stq	$7, 56($sp) +	stq	$8, 64($sp) +	stq	$19, 72($sp) +	stq	$20, 80($sp) +	stq	$21, 88($sp) +	ldq	$2, HAE_CACHE($2) +	stq	$22, 96($sp) +	stq	$23, 104($sp) +	stq	$24, 112($sp) +	stq	$25, 120($sp) +	stq	$26, 128($sp) +	stq	$27, 136($sp) +	stq	$2, 152($sp) +	stq	$16, 160($sp) +	stq	$17, 168($sp)  	stq	$18, 176($sp) - -#define RESTORE_ALL			\ -	lda	$19, alpha_mv;		\ -	ldq	$0, 0($sp);		\ -	ldq	$1, 8($sp);		\ -	ldq	$2, 16($sp);		\ -	ldq	$3, 24($sp);		\ -	ldq	$21, 152($sp);		\ -	ldq	$20, HAE_CACHE($19);	\ -	ldq	$4, 32($sp);		\ -	ldq	$5, 40($sp);		\ -	ldq	$6, 48($sp);		\ -	ldq	$7, 56($sp);		\ -	subq	$20, $21, $20;		\ -	ldq	$8, 64($sp);		\ -	beq	$20, 99f;		\ -	ldq	$20, HAE_REG($19);	\ -	stq	$21, HAE_CACHE($19);	\ -	stq	$21, 0($20);		\ -99:;					\ -	ldq	$19, 72($sp);		\ -	ldq	$20, 80($sp);		\ -	ldq	$21, 88($sp);		\ -	ldq	$22, 96($sp);		\ -	ldq	$23, 104($sp);		\ -	ldq	$24, 112($sp);		\ -	ldq	$25, 120($sp);		\ -	ldq	$26, 128($sp);		\ -	ldq	$27, 136($sp);		\ -	ldq	$28, 144($sp);		\ +	.cfi_rel_offset	$5, 40 +	.cfi_rel_offset	$6, 48 +	.cfi_rel_offset	$7, 56 +	.cfi_rel_offset	$8, 64 +	.cfi_rel_offset $19, 72 +	.cfi_rel_offset	$20, 80 +	.cfi_rel_offset	$21, 88 +	.cfi_rel_offset $22, 96 +	.cfi_rel_offset	$23, 104 +	.cfi_rel_offset	$24, 112 +	.cfi_rel_offset	$25, 120 +	.cfi_rel_offset	$26, 128 +	.cfi_rel_offset	$27, 136 +.endm + +.macro	RESTORE_ALL +	lda	$19, alpha_mv +	ldq	$0, 0($sp) +	ldq	$1, 8($sp) +	ldq	$2, 16($sp) +	ldq	$3, 24($sp) +	ldq	$21, 152($sp) +	ldq	$20, HAE_CACHE($19) +	ldq	$4, 32($sp) +	ldq	$5, 40($sp) +	ldq	$6, 48($sp) +	ldq	$7, 56($sp) +	subq	$20, $21, $20 +	ldq	$8, 64($sp) +	beq	$20, 99f +	ldq	$20, HAE_REG($19) +	stq	$21, HAE_CACHE($19) +	stq	$21, 0($20) +99:	ldq	$19, 72($sp) +	ldq	$20, 80($sp) +	ldq	$21, 88($sp) +	ldq	$22, 96($sp) +	ldq	$23, 104($sp) +	ldq	$24, 112($sp) +	ldq	$25, 120($sp) +	ldq	$26, 128($sp) +	ldq	$27, 136($sp) +	ldq	$28, 144($sp)  	addq	$sp, SP_OFF, $sp +	.cfi_restore	$0 +	.cfi_restore	$1 +	.cfi_restore	$2 +	.cfi_restore	$3 +	.cfi_restore	$4 +	.cfi_restore	$5 +	.cfi_restore	$6 +	.cfi_restore	$7 +	.cfi_restore	$8 +	.cfi_restore	$19 +	.cfi_restore	$20 +	.cfi_restore	$21 +	.cfi_restore	$22 +	.cfi_restore	$23 +	.cfi_restore	$24 +	.cfi_restore	$25 +	.cfi_restore	$26 +	.cfi_restore	$27 +	.cfi_restore	$28 +	.cfi_adjust_cfa_offset	-SP_OFF +.endm + +.macro	DO_SWITCH_STACK +	bsr	$1, do_switch_stack +	.cfi_adjust_cfa_offset	SWITCH_STACK_SIZE +	.cfi_rel_offset	$9, 0 +	.cfi_rel_offset	$10, 8 +	.cfi_rel_offset	$11, 16 +	.cfi_rel_offset	$12, 24 +	.cfi_rel_offset	$13, 32 +	.cfi_rel_offset	$14, 40 +	.cfi_rel_offset	$15, 48 +	/* We don't really care about the FP registers for debugging.  */ +.endm + +.macro	UNDO_SWITCH_STACK +	bsr	$1, undo_switch_stack +	.cfi_restore	$9 +	.cfi_restore	$10 +	.cfi_restore	$11 +	.cfi_restore	$12 +	.cfi_restore	$13 +	.cfi_restore	$14 +	.cfi_restore	$15 +	.cfi_adjust_cfa_offset	-SWITCH_STACK_SIZE +.endm  /*   * Non-syscall kernel entry points.   */ -	.align	4 -	.globl	entInt -	.ent	entInt -entInt: +CFI_START_OSF_FRAME entInt  	SAVE_ALL  	lda	$8, 0x3fff  	lda	$26, ret_from_sys_call  	bic	$sp, $8, $8  	mov	$sp, $19  	jsr	$31, do_entInt -.end entInt +CFI_END_OSF_FRAME entInt -	.align	4 -	.globl	entArith -	.ent	entArith -entArith: +CFI_START_OSF_FRAME entArith  	SAVE_ALL  	lda	$8, 0x3fff  	lda	$26, ret_from_sys_call  	bic	$sp, $8, $8  	mov	$sp, $18  	jsr	$31, do_entArith -.end entArith +CFI_END_OSF_FRAME entArith -	.align	4 -	.globl	entMM -	.ent	entMM -entMM: +CFI_START_OSF_FRAME entMM  	SAVE_ALL  /* save $9 - $15 so the inline exception code can manipulate them.  */  	subq	$sp, 56, $sp +	.cfi_adjust_cfa_offset	56  	stq	$9, 0($sp)  	stq	$10, 8($sp)  	stq	$11, 16($sp) @@ -128,6 +207,13 @@ entMM:  	stq	$13, 32($sp)  	stq	$14, 40($sp)  	stq	$15, 48($sp) +	.cfi_rel_offset	$9, 0 +	.cfi_rel_offset	$10, 8 +	.cfi_rel_offset	$11, 16 +	.cfi_rel_offset	$12, 24 +	.cfi_rel_offset	$13, 32 +	.cfi_rel_offset	$14, 40 +	.cfi_rel_offset	$15, 48  	addq	$sp, 56, $19  /* handle the fault */  	lda	$8, 0x3fff @@ -142,28 +228,33 @@ entMM:  	ldq	$14, 40($sp)  	ldq	$15, 48($sp)  	addq	$sp, 56, $sp +	.cfi_restore	$9 +	.cfi_restore	$10 +	.cfi_restore	$11 +	.cfi_restore	$12 +	.cfi_restore	$13 +	.cfi_restore	$14 +	.cfi_restore	$15 +	.cfi_adjust_cfa_offset	-56  /* finish up the syscall as normal.  */  	br	ret_from_sys_call -.end entMM +CFI_END_OSF_FRAME entMM -	.align	4 -	.globl	entIF -	.ent	entIF -entIF: +CFI_START_OSF_FRAME entIF  	SAVE_ALL  	lda	$8, 0x3fff  	lda	$26, ret_from_sys_call  	bic	$sp, $8, $8  	mov	$sp, $17  	jsr	$31, do_entIF -.end entIF +CFI_END_OSF_FRAME entIF -	.align	4 -	.globl	entUna -	.ent	entUna -entUna: +CFI_START_OSF_FRAME entUna  	lda	$sp, -256($sp) +	.cfi_adjust_cfa_offset	256  	stq	$0, 0($sp) +	.cfi_rel_offset	$0, 0 +	.cfi_remember_state  	ldq	$0, 256($sp)	/* get PS */  	stq	$1, 8($sp)  	stq	$2, 16($sp) @@ -195,6 +286,32 @@ entUna:  	stq	$28, 224($sp)  	mov	$sp, $19  	stq	$gp, 232($sp) +	.cfi_rel_offset	$1, 1*8 +	.cfi_rel_offset	$2, 2*8 +	.cfi_rel_offset	$3, 3*8 +	.cfi_rel_offset	$4, 4*8 +	.cfi_rel_offset	$5, 5*8 +	.cfi_rel_offset	$6, 6*8 +	.cfi_rel_offset	$7, 7*8 +	.cfi_rel_offset	$8, 8*8 +	.cfi_rel_offset	$9, 9*8 +	.cfi_rel_offset	$10, 10*8 +	.cfi_rel_offset	$11, 11*8 +	.cfi_rel_offset	$12, 12*8 +	.cfi_rel_offset	$13, 13*8 +	.cfi_rel_offset	$14, 14*8 +	.cfi_rel_offset	$15, 15*8 +	.cfi_rel_offset	$19, 19*8 +	.cfi_rel_offset	$20, 20*8 +	.cfi_rel_offset	$21, 21*8 +	.cfi_rel_offset	$22, 22*8 +	.cfi_rel_offset	$23, 23*8 +	.cfi_rel_offset	$24, 24*8 +	.cfi_rel_offset	$25, 25*8 +	.cfi_rel_offset	$26, 26*8 +	.cfi_rel_offset	$27, 27*8 +	.cfi_rel_offset	$28, 28*8 +	.cfi_rel_offset	$29, 29*8  	lda	$8, 0x3fff  	stq	$31, 248($sp)  	bic	$sp, $8, $8 @@ -228,16 +345,45 @@ entUna:  	ldq	$28, 224($sp)  	ldq	$gp, 232($sp)  	lda	$sp, 256($sp) +	.cfi_restore	$1 +	.cfi_restore	$2 +	.cfi_restore	$3 +	.cfi_restore	$4 +	.cfi_restore	$5 +	.cfi_restore	$6 +	.cfi_restore	$7 +	.cfi_restore	$8 +	.cfi_restore	$9 +	.cfi_restore	$10 +	.cfi_restore	$11 +	.cfi_restore	$12 +	.cfi_restore	$13 +	.cfi_restore	$14 +	.cfi_restore	$15 +	.cfi_restore	$19 +	.cfi_restore	$20 +	.cfi_restore	$21 +	.cfi_restore	$22 +	.cfi_restore	$23 +	.cfi_restore	$24 +	.cfi_restore	$25 +	.cfi_restore	$26 +	.cfi_restore	$27 +	.cfi_restore	$28 +	.cfi_restore	$29 +	.cfi_adjust_cfa_offset	-256  	call_pal PAL_rti -.end entUna  	.align	4 -	.ent	entUnaUser  entUnaUser: +	.cfi_restore_state  	ldq	$0, 0($sp)	/* restore original $0 */  	lda	$sp, 256($sp)	/* pop entUna's stack frame */ +	.cfi_restore	$0 +	.cfi_adjust_cfa_offset	-256  	SAVE_ALL		/* setup normal kernel stack */  	lda	$sp, -56($sp) +	.cfi_adjust_cfa_offset	56  	stq	$9, 0($sp)  	stq	$10, 8($sp)  	stq	$11, 16($sp) @@ -245,6 +391,13 @@ entUnaUser:  	stq	$13, 32($sp)  	stq	$14, 40($sp)  	stq	$15, 48($sp) +	.cfi_rel_offset	$9, 0 +	.cfi_rel_offset	$10, 8 +	.cfi_rel_offset	$11, 16 +	.cfi_rel_offset	$12, 24 +	.cfi_rel_offset	$13, 32 +	.cfi_rel_offset	$14, 40 +	.cfi_rel_offset	$15, 48  	lda	$8, 0x3fff  	addq	$sp, 56, $19  	bic	$sp, $8, $8 @@ -257,20 +410,25 @@ entUnaUser:  	ldq	$14, 40($sp)  	ldq	$15, 48($sp)  	lda	$sp, 56($sp) +	.cfi_restore	$9 +	.cfi_restore	$10 +	.cfi_restore	$11 +	.cfi_restore	$12 +	.cfi_restore	$13 +	.cfi_restore	$14 +	.cfi_restore	$15 +	.cfi_adjust_cfa_offset	-56  	br	ret_from_sys_call -.end entUnaUser +CFI_END_OSF_FRAME entUna -	.align	4 -	.globl	entDbg -	.ent	entDbg -entDbg: +CFI_START_OSF_FRAME entDbg  	SAVE_ALL  	lda	$8, 0x3fff  	lda	$26, ret_from_sys_call  	bic	$sp, $8, $8  	mov	$sp, $16  	jsr	$31, do_entDbg -.end entDbg +CFI_END_OSF_FRAME entDbg  /*   * The system call entry point is special.  Most importantly, it looks @@ -285,8 +443,12 @@ entDbg:  	.align	4  	.globl	entSys -	.globl	ret_from_sys_call -	.ent	entSys +	.type	entSys, @function +	.cfi_startproc simple +	.cfi_return_column 64 +	.cfi_def_cfa	$sp, 48 +	.cfi_rel_offset	64, 8 +	.cfi_rel_offset	$gp, 16  entSys:  	SAVE_ALL  	lda	$8, 0x3fff @@ -300,7 +462,14 @@ entSys:  	stq	$17, SP_OFF+32($sp)  	s8addq	$0, $5, $5  	stq	$18, SP_OFF+40($sp) -	blbs	$3, strace +	.cfi_rel_offset	$16, SP_OFF+24 +	.cfi_rel_offset	$17, SP_OFF+32 +	.cfi_rel_offset	$18, SP_OFF+40 +#ifdef CONFIG_AUDITSYSCALL +	lda     $6, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT +	and     $3, $6, $3 +#endif +	bne     $3, strace  	beq	$4, 1f  	ldq	$27, 0($5)  1:	jsr	$26, ($27), alpha_ni_syscall @@ -310,8 +479,9 @@ entSys:  	stq	$31, 72($sp)		/* a3=0 => no error */  	.align	4 +	.globl	ret_from_sys_call  ret_from_sys_call: -	cmovne	$26, 0, $19		/* $19 = 0 => non-restartable */ +	cmovne	$26, 0, $18		/* $18 = 0 => non-restartable */  	ldq	$0, SP_OFF($sp)  	and	$0, 8, $0  	beq	$0, ret_to_kernel @@ -320,14 +490,16 @@ ret_to_user:  		sampling and the rti.  */  	lda	$16, 7  	call_pal PAL_swpipl -	ldl	$5, TI_FLAGS($8) -	and	$5, _TIF_WORK_MASK, $2 +	ldl	$17, TI_FLAGS($8) +	and	$17, _TIF_WORK_MASK, $2  	bne	$2, work_pending  restore_all: +	.cfi_remember_state  	RESTORE_ALL  	call_pal PAL_rti  ret_to_kernel: +	.cfi_restore_state  	lda	$16, 7  	call_pal PAL_swpipl  	br restore_all @@ -341,10 +513,10 @@ $syscall_error:  	 * frame to indicate that a negative return value wasn't an  	 * error number..  	 */ -	ldq	$19, 0($sp)	/* old syscall nr (zero if success) */ -	beq	$19, $ret_success +	ldq	$18, 0($sp)	/* old syscall nr (zero if success) */ +	beq	$18, $ret_success -	ldq	$20, 72($sp)	/* .. and this a3 */ +	ldq	$19, 72($sp)	/* .. and this a3 */  	subq	$31, $0, $0	/* with error in v0 */  	addq	$31, 1, $1	/* set a3 for errno return */  	stq	$0, 0($sp) @@ -356,73 +528,54 @@ $ret_success:  	stq	$0, 0($sp)  	stq	$31, 72($sp)	/* a3=0 => no error */  	br	ret_from_sys_call -.end entSys  /*   * Do all cleanup when returning from all interrupts and system calls.   *   * Arguments: - *       $5: TI_FLAGS.   *       $8: current. - *      $19: The old syscall number, or zero if this is not a return + *      $17: TI_FLAGS. + *      $18: The old syscall number, or zero if this is not a return   *           from a syscall that errored and is possibly restartable. - *      $20: The old a3 value + *      $19: The old a3 value   */  	.align	4 -	.ent	work_pending +	.type	work_pending, @function  work_pending: -	and	$5, _TIF_NEED_RESCHED, $2 -	beq	$2, $work_notifysig +	and	$17, _TIF_NOTIFY_RESUME | _TIF_SIGPENDING, $2 +	bne	$2, $work_notifysig  $work_resched: -	subq	$sp, 16, $sp -	stq	$19, 0($sp)              /* save syscall nr */ -	stq	$20, 8($sp)              /* and error indication (a3) */ +	/* +	 * We can get here only if we returned from syscall without SIGPENDING +	 * or got through work_notifysig already.  Either case means no syscall +	 * restarts for us, so let $18 and $19 burn. +	 */  	jsr	$26, schedule -	ldq	$19, 0($sp) -	ldq	$20, 8($sp) -	addq	$sp, 16, $sp -	/* Make sure need_resched and sigpending don't change between -		sampling and the rti.  */ -	lda	$16, 7 -	call_pal PAL_swpipl -	ldl	$5, TI_FLAGS($8) -	and	$5, _TIF_WORK_MASK, $2 -	beq	$2, restore_all -	and	$5, _TIF_NEED_RESCHED, $2 -	bne	$2, $work_resched +	mov	0, $18 +	br	ret_to_user  $work_notifysig:  	mov	$sp, $16 -	bsr	$1, do_switch_stack -	mov	$sp, $17 -	mov	$5, $18 -	mov	$19, $9		/* save old syscall number */ -	mov	$20, $10	/* save old a3 */ -	and	$5, _TIF_SIGPENDING, $2 -	cmovne	$2, 0, $9	/* we don't want double syscall restarts */ -	jsr	$26, do_notify_resume -	mov	$9, $19 -	mov	$10, $20 -	bsr	$1, undo_switch_stack -	br	ret_to_user -.end work_pending +	DO_SWITCH_STACK +	jsr	$26, do_work_pending +	UNDO_SWITCH_STACK +	br	restore_all  /*   * PTRACE syscall handler   */  	.align	4 -	.ent	strace +	.type	strace, @function  strace:  	/* set up signal stack, call syscall_trace */ -	bsr	$1, do_switch_stack -	jsr	$26, syscall_trace -	bsr	$1, undo_switch_stack +	DO_SWITCH_STACK +	jsr	$26, syscall_trace_enter /* returns the syscall number */ +	UNDO_SWITCH_STACK -	/* get the system call number and the arguments back.. */ -	ldq	$0, 0($sp) +	/* get the arguments back.. */  	ldq	$16, SP_OFF+24($sp)  	ldq	$17, SP_OFF+32($sp)  	ldq	$18, SP_OFF+40($sp) @@ -448,42 +601,47 @@ ret_from_straced:  $strace_success:  	stq	$0, 0($sp)		/* save return value */ -	bsr	$1, do_switch_stack -	jsr	$26, syscall_trace -	bsr	$1, undo_switch_stack +	DO_SWITCH_STACK +	jsr	$26, syscall_trace_leave +	UNDO_SWITCH_STACK  	br	$31, ret_from_sys_call  	.align	3  $strace_error: -	ldq	$19, 0($sp)	/* old syscall nr (zero if success) */ -	beq	$19, $strace_success -	ldq	$20, 72($sp)	/* .. and this a3 */ +	ldq	$18, 0($sp)	/* old syscall nr (zero if success) */ +	beq	$18, $strace_success +	ldq	$19, 72($sp)	/* .. and this a3 */  	subq	$31, $0, $0	/* with error in v0 */  	addq	$31, 1, $1	/* set a3 for errno return */  	stq	$0, 0($sp)  	stq	$1, 72($sp)	/* a3 for return */ -	bsr	$1, do_switch_stack -	mov	$19, $9		/* save old syscall number */ -	mov	$20, $10	/* save old a3 */ -	jsr	$26, syscall_trace -	mov	$9, $19 -	mov	$10, $20 -	bsr	$1, undo_switch_stack +	DO_SWITCH_STACK +	mov	$18, $9		/* save old syscall number */ +	mov	$19, $10	/* save old a3 */ +	jsr	$26, syscall_trace_leave +	mov	$9, $18 +	mov	$10, $19 +	UNDO_SWITCH_STACK  	mov	$31, $26	/* tell "ret_from_sys_call" we can restart */  	br	ret_from_sys_call -.end strace +CFI_END_OSF_FRAME entSys  /*   * Save and restore the switch stack -- aka the balance of the user context.   */  	.align	4 -	.ent	do_switch_stack +	.type	do_switch_stack, @function +	.cfi_startproc simple +	.cfi_return_column 64 +	.cfi_def_cfa $sp, 0 +	.cfi_register 64, $1  do_switch_stack:  	lda	$sp, -SWITCH_STACK_SIZE($sp) +	.cfi_adjust_cfa_offset	SWITCH_STACK_SIZE  	stq	$9, 0($sp)  	stq	$10, 8($sp)  	stq	$11, 16($sp) @@ -527,10 +685,14 @@ do_switch_stack:  	stt	$f0, 312($sp)	# save fpcr in slot of $f31  	ldt	$f0, 64($sp)	# dont let "do_switch_stack" change fp state.  	ret	$31, ($1), 1 -.end do_switch_stack +	.cfi_endproc +	.size	do_switch_stack, .-do_switch_stack  	.align	4 -	.ent	undo_switch_stack +	.type	undo_switch_stack, @function +	.cfi_startproc simple +	.cfi_def_cfa $sp, 0 +	.cfi_register 64, $1  undo_switch_stack:  	ldq	$9, 0($sp)  	ldq	$10, 8($sp) @@ -575,7 +737,8 @@ undo_switch_stack:  	ldt	$f30, 304($sp)  	lda	$sp, SWITCH_STACK_SIZE($sp)  	ret	$31, ($1), 1 -.end undo_switch_stack +	.cfi_endproc +	.size	undo_switch_stack, .-undo_switch_stack  /*   * The meat of the context switch code. @@ -583,17 +746,18 @@ undo_switch_stack:  	.align	4  	.globl	alpha_switch_to -	.ent	alpha_switch_to +	.type	alpha_switch_to, @function +	.cfi_startproc  alpha_switch_to: -	.prologue 0 -	bsr	$1, do_switch_stack +	DO_SWITCH_STACK  	call_pal PAL_swpctx  	lda	$8, 0x3fff -	bsr	$1, undo_switch_stack +	UNDO_SWITCH_STACK  	bic	$sp, $8, $8  	mov	$17, $0  	ret -.end alpha_switch_to +	.cfi_endproc +	.size	alpha_switch_to, .-alpha_switch_to  /*   * New processes begin life here. @@ -609,158 +773,44 @@ ret_from_fork:  .end ret_from_fork  /* - * kernel_thread(fn, arg, clone_flags) + * ... and new kernel threads - here   */  	.align 4 -	.globl	kernel_thread -	.ent	kernel_thread -kernel_thread: -	/* We can be called from a module.  */ -	ldgp	$gp, 0($27) -	.prologue 1 -	subq	$sp, SP_OFF+6*8, $sp -	br	$1, 2f		/* load start address */ - -	/* We've now "returned" from a fake system call.  */ -	unop -	blt	$0, 1f		/* error?  */ -	ldi	$1, 0x3fff -	beq	$20, 1f		/* parent or child?  */ - -	bic	$sp, $1, $8	/* in child.  */ -	jsr	$26, ($27) -	ldgp	$gp, 0($26) -	mov	$0, $16 -	mov	$31, $26 -	jmp	$31, sys_exit - -1:	ret			/* in parent.  */ - -	.align 4 -2:	/* Fake a system call stack frame, as we can't do system calls -	   from kernel space.  Note that we store FN and ARG as they -	   need to be set up in the child for the call.  Also store $8 -	   and $26 for use in the parent.  */ -	stq	$31, SP_OFF($sp)	/* ps */ -	stq	$1, SP_OFF+8($sp)	/* pc */ -	stq	$gp, SP_OFF+16($sp)	/* gp */ -	stq	$16, 136($sp)		/* $27; FN for child */ -	stq	$17, SP_OFF+24($sp)	/* $16; ARG for child */ -	stq	$8, 64($sp)		/* $8 */ -	stq	$26, 128($sp)		/* $26 */ -	/* Avoid the HAE being gratuitously wrong, to avoid restoring it.  */ -	ldq	$2, alpha_mv+HAE_CACHE -	stq	$2, 152($sp)		/* HAE */ - -	/* Shuffle FLAGS to the front; add CLONE_VM.  */ -	ldi	$1, CLONE_VM|CLONE_UNTRACED -	or	$18, $1, $16 -	bsr	$26, sys_clone - -	/* We don't actually care for a3 success widgetry in the kernel. -	   Not for positive errno values.  */ -	stq	$0, 0($sp)		/* $0 */ -	br	ret_to_kernel -.end kernel_thread - -/* - * kernel_execve(path, argv, envp) - */ -	.align	4 -	.globl	kernel_execve -	.ent	kernel_execve -kernel_execve: -	/* We can be called from a module.  */ -	ldgp	$gp, 0($27) -	lda	$sp, -(32+SIZEOF_PT_REGS+8)($sp) -	.frame	$sp, 32+SIZEOF_PT_REGS+8, $26, 0 -	stq	$26, 0($sp) -	stq	$16, 8($sp) -	stq	$17, 16($sp) -	stq	$18, 24($sp) -	.prologue 1 - -	lda	$16, 32($sp) -	lda	$17, 0 -	lda	$18, SIZEOF_PT_REGS -	bsr	$26, memset		!samegp - -	/* Avoid the HAE being gratuitously wrong, which would cause us -	   to do the whole turn off interrupts thing and restore it.  */ -	ldq	$2, alpha_mv+HAE_CACHE -	stq	$2, 152+32($sp) - -	ldq	$16, 8($sp) -	ldq	$17, 16($sp) -	ldq	$18, 24($sp) -	lda	$19, 32($sp) -	bsr	$26, do_execve		!samegp - -	ldq	$26, 0($sp) -	bne	$0, 1f			/* error! */ - -	/* Move the temporary pt_regs struct from its current location -	   to the top of the kernel stack frame.  See copy_thread for -	   details for a normal process.  */ -	lda	$16, 0x4000 - SIZEOF_PT_REGS($8) -	lda	$17, 32($sp) -	lda	$18, SIZEOF_PT_REGS -	bsr	$26, memmove		!samegp - -	/* Take that over as our new stack frame and visit userland!  */ -	lda	$sp, 0x4000 - SIZEOF_PT_REGS($8) -	br	$31, ret_from_sys_call - -1:	lda	$sp, 32+SIZEOF_PT_REGS+8($sp) -	ret -.end kernel_execve +	.globl	ret_from_kernel_thread +	.ent	ret_from_kernel_thread +ret_from_kernel_thread: +	mov	$17, $16 +	jsr	$26, schedule_tail +	mov	$9, $27 +	mov	$10, $16 +	jsr	$26, ($9) +	mov	$31, $19		/* to disable syscall restarts */ +	br	$31, ret_to_user +.end ret_from_kernel_thread  /*   * Special system calls.  Most of these are special in that they either   * have to play switch_stack games or in some way use the pt_regs struct.   */ -	.align	4 -	.globl	sys_fork -	.ent	sys_fork -sys_fork: -	.prologue 0 -	mov	$sp, $21 -	bsr	$1, do_switch_stack -	bis	$31, SIGCHLD, $16 -	mov	$31, $17 -	mov	$31, $18 -	mov	$31, $19 -	mov	$31, $20 -	jsr	$26, alpha_clone -	bsr	$1, undo_switch_stack -	ret -.end sys_fork +.macro	fork_like name  	.align	4 -	.globl	sys_clone -	.ent	sys_clone -sys_clone: +	.globl	alpha_\name +	.ent	alpha_\name +alpha_\name:  	.prologue 0 -	mov	$sp, $21  	bsr	$1, do_switch_stack -	/* $16, $17, $18, $19, $20 come from the user.  */ -	jsr	$26, alpha_clone -	bsr	$1, undo_switch_stack +	jsr	$26, sys_\name +	ldq	$26, 56($sp) +	lda	$sp, SWITCH_STACK_SIZE($sp)  	ret -.end sys_clone +.end	alpha_\name +.endm -	.align	4 -	.globl	sys_vfork -	.ent	sys_vfork -sys_vfork: -	.prologue 0 -	mov	$sp, $16 -	bsr	$1, do_switch_stack -	jsr	$26, alpha_vfork -	bsr	$1, undo_switch_stack -	ret -.end sys_vfork +fork_like fork +fork_like vfork +fork_like clone  	.align	4  	.globl	sys_sigreturn @@ -769,12 +819,10 @@ sys_sigreturn:  	.prologue 0  	lda	$9, ret_from_straced  	cmpult	$26, $9, $9 -	mov	$sp, $17 -	lda	$18, -SWITCH_STACK_SIZE($sp)  	lda	$sp, -SWITCH_STACK_SIZE($sp)  	jsr	$26, do_sigreturn  	bne	$9, 1f -	jsr	$26, syscall_trace +	jsr	$26, syscall_trace_leave  1:	br	$1, undo_switch_stack  	br	ret_from_sys_call  .end sys_sigreturn @@ -786,135 +834,15 @@ sys_rt_sigreturn:  	.prologue 0  	lda	$9, ret_from_straced  	cmpult	$26, $9, $9 -	mov	$sp, $17 -	lda	$18, -SWITCH_STACK_SIZE($sp)  	lda	$sp, -SWITCH_STACK_SIZE($sp)  	jsr	$26, do_rt_sigreturn  	bne	$9, 1f -	jsr	$26, syscall_trace +	jsr	$26, syscall_trace_leave  1:	br	$1, undo_switch_stack  	br	ret_from_sys_call  .end sys_rt_sigreturn  	.align	4 -	.globl	sys_sethae -	.ent	sys_sethae -sys_sethae: -	.prologue 0 -	stq	$16, 152($sp) -	ret -.end sys_sethae - -	.align	4 -	.globl	osf_getpriority -	.ent	osf_getpriority -osf_getpriority: -	lda	$sp, -16($sp) -	stq	$26, 0($sp) -	.prologue 0 - -	jsr	$26, sys_getpriority - -	ldq	$26, 0($sp) -	blt	$0, 1f - -	/* Return value is the unbiased priority, i.e. 20 - prio. -	   This does result in negative return values, so signal -	   no error by writing into the R0 slot.  */ -	lda	$1, 20 -	stq	$31, 16($sp) -	subl	$1, $0, $0 -	unop - -1:	lda	$sp, 16($sp) -	ret -.end osf_getpriority - -	.align	4 -	.globl	sys_getxuid -	.ent	sys_getxuid -sys_getxuid: -	.prologue 0 -	ldq	$2, TI_TASK($8) -	ldq	$3, TASK_CRED($2) -	ldl	$0, CRED_UID($3) -	ldl	$1, CRED_EUID($3) -	stq	$1, 80($sp) -	ret -.end sys_getxuid - -	.align	4 -	.globl	sys_getxgid -	.ent	sys_getxgid -sys_getxgid: -	.prologue 0 -	ldq	$2, TI_TASK($8) -	ldq	$3, TASK_CRED($2) -	ldl	$0, CRED_GID($3) -	ldl	$1, CRED_EGID($3) -	stq	$1, 80($sp) -	ret -.end sys_getxgid - -	.align	4 -	.globl	sys_getxpid -	.ent	sys_getxpid -sys_getxpid: -	.prologue 0 -	ldq	$2, TI_TASK($8) - -	/* See linux/kernel/timer.c sys_getppid for discussion -	   about this loop.  */ -	ldq	$3, TASK_GROUP_LEADER($2) -	ldq	$4, TASK_REAL_PARENT($3) -	ldl	$0, TASK_TGID($2) -1:	ldl	$1, TASK_TGID($4) -#ifdef CONFIG_SMP -	mov	$4, $5 -	mb -	ldq	$3, TASK_GROUP_LEADER($2) -	ldq	$4, TASK_REAL_PARENT($3) -	cmpeq	$4, $5, $5 -	beq	$5, 1b -#endif -	stq	$1, 80($sp) -	ret -.end sys_getxpid - -	.align	4 -	.globl	sys_alpha_pipe -	.ent	sys_alpha_pipe -sys_alpha_pipe: -	lda	$sp, -16($sp) -	stq	$26, 0($sp) -	.prologue 0 - -	mov	$31, $17 -	lda	$16, 8($sp) -	jsr	$26, do_pipe_flags - -	ldq	$26, 0($sp) -	bne	$0, 1f - -	/* The return values are in $0 and $20.  */ -	ldl	$1, 12($sp) -	ldl	$0, 8($sp) - -	stq	$1, 80+16($sp) -1:	lda	$sp, 16($sp) -	ret -.end sys_alpha_pipe - -	.align	4 -	.globl	sys_execve -	.ent	sys_execve -sys_execve: -	.prologue 0 -	mov	$sp, $19 -	jmp	$31, do_sys_execve -.end sys_execve - -	.align	4  	.globl	alpha_ni_syscall  	.ent	alpha_ni_syscall  alpha_ni_syscall: diff --git a/arch/alpha/kernel/err_impl.h b/arch/alpha/kernel/err_impl.h index 0c010ca4611..ae529c41603 100644 --- a/arch/alpha/kernel/err_impl.h +++ b/arch/alpha/kernel/err_impl.h @@ -7,6 +7,8 @@   * 	implementations.   */ +#include <asm/mce.h> +  union el_timestamp;  struct el_subpacket;  struct ev7_lf_subpackets; diff --git a/arch/alpha/kernel/err_marvel.c b/arch/alpha/kernel/err_marvel.c index 648ae88aeb8..ae54ad91e18 100644 --- a/arch/alpha/kernel/err_marvel.c +++ b/arch/alpha/kernel/err_marvel.c @@ -1027,7 +1027,7 @@ marvel_process_logout_frame(struct ev7_lf_subpackets *lf_subpackets, int print)  	 * normal operation, dismiss them.  	 *  	 * Dismiss if: -	 *	C_STAT		= 0x14 		(Error Reponse) +	 *	C_STAT		= 0x14 		(Error Response)  	 *	C_STS<3>	= 0    		(C_ADDR valid)  	 *	C_ADDR<42>	= 1    		(I/O)  	 *	C_ADDR<31:22>	= 111110xxb	(PCI Config space) diff --git a/arch/alpha/kernel/err_titan.c b/arch/alpha/kernel/err_titan.c index c3b3781a03d..14b26c466c8 100644 --- a/arch/alpha/kernel/err_titan.c +++ b/arch/alpha/kernel/err_titan.c @@ -533,8 +533,6 @@ static struct el_subpacket_annotation el_titan_annotations[] = {  static struct el_subpacket *  el_process_regatta_subpacket(struct el_subpacket *header)  { -	int status; -  	if (header->class != EL_CLASS__REGATTA_FAMILY) {  		printk("%s  ** Unexpected header CLASS %d TYPE %d, aborting\n",  		       err_print_prefix, @@ -551,7 +549,7 @@ el_process_regatta_subpacket(struct el_subpacket *header)  		printk("%s  ** Occurred on CPU %d:\n",   		       err_print_prefix,  		       (int)header->by_type.regatta_frame.cpuid); -		status = privateer_process_logout_frame((struct el_common *) +		privateer_process_logout_frame((struct el_common *)  			header->by_type.regatta_frame.data_start, 1);  		break;  	default: diff --git a/arch/alpha/kernel/head.S b/arch/alpha/kernel/head.S index 4bdd1d2ff35..c352499ab9f 100644 --- a/arch/alpha/kernel/head.S +++ b/arch/alpha/kernel/head.S @@ -8,14 +8,12 @@   */  #include <linux/init.h> -#include <asm/system.h>  #include <asm/asm-offsets.h> +#include <asm/pal.h> +#include <asm/setup.h>  __HEAD -.globl swapper_pg_dir  .globl _stext -swapper_pg_dir=SWAPPER_PGD -  	.set noreorder  	.globl	__start  	.ent	__start diff --git a/arch/alpha/kernel/init_task.c b/arch/alpha/kernel/init_task.c deleted file mode 100644 index 6f80ca4f976..00000000000 --- a/arch/alpha/kernel/init_task.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <linux/mm.h> -#include <linux/module.h> -#include <linux/sched.h> -#include <linux/init.h> -#include <linux/init_task.h> -#include <linux/fs.h> -#include <linux/mqueue.h> -#include <asm/uaccess.h> - - -static struct signal_struct init_signals = INIT_SIGNALS(init_signals); -static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); -struct task_struct init_task = INIT_TASK(init_task); -EXPORT_SYMBOL(init_task); - -union thread_union init_thread_union __init_task_data = -	{ INIT_THREAD_INFO(init_task) }; diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index fe912984d9b..7b2be251c30 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c @@ -26,7 +26,6 @@  #include <linux/profile.h>  #include <linux/bitops.h> -#include <asm/system.h>  #include <asm/io.h>  #include <asm/uaccess.h> @@ -44,10 +43,16 @@ static char irq_user_affinity[NR_IRQS];  int irq_select_affinity(unsigned int irq)  { +	struct irq_data *data = irq_get_irq_data(irq); +	struct irq_chip *chip;  	static int last_cpu;  	int cpu = last_cpu + 1; -	if (!irq_desc[irq].chip->set_affinity || irq_user_affinity[irq]) +	if (!data) +		return 1; +	chip = irq_data_get_irq_chip(data); + +	if (!chip->irq_set_affinity || irq_user_affinity[irq])  		return 1;  	while (!cpu_possible(cpu) || @@ -55,68 +60,27 @@ int irq_select_affinity(unsigned int irq)  		cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0);  	last_cpu = cpu; -	cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); -	irq_desc[irq].chip->set_affinity(irq, cpumask_of(cpu)); +	cpumask_copy(data->affinity, cpumask_of(cpu)); +	chip->irq_set_affinity(data, cpumask_of(cpu), false);  	return 0;  }  #endif /* CONFIG_SMP */ -int -show_interrupts(struct seq_file *p, void *v) +int arch_show_interrupts(struct seq_file *p, int prec)  {  	int j; -	int irq = *(loff_t *) v; -	struct irqaction * action; -	unsigned long flags;  #ifdef CONFIG_SMP -	if (irq == 0) { -		seq_puts(p, "           "); -		for_each_online_cpu(j) -			seq_printf(p, "CPU%d       ", j); -		seq_putc(p, '\n'); -	} -#endif - -	if (irq < ACTUAL_NR_IRQS) { -		raw_spin_lock_irqsave(&irq_desc[irq].lock, flags); -		action = irq_desc[irq].action; -		if (!action)  -			goto unlock; -		seq_printf(p, "%3d: ", irq); -#ifndef CONFIG_SMP -		seq_printf(p, "%10u ", kstat_irqs(irq)); -#else -		for_each_online_cpu(j) -			seq_printf(p, "%10u ", kstat_irqs_cpu(irq, j)); +	seq_puts(p, "IPI: "); +	for_each_online_cpu(j) +		seq_printf(p, "%10lu ", cpu_data[j].ipi_count); +	seq_putc(p, '\n');  #endif -		seq_printf(p, " %14s", irq_desc[irq].chip->name); -		seq_printf(p, "  %c%s", -			(action->flags & IRQF_DISABLED)?'+':' ', -			action->name); - -		for (action=action->next; action; action = action->next) { -			seq_printf(p, ", %c%s", -				  (action->flags & IRQF_DISABLED)?'+':' ', -				   action->name); -		} - -		seq_putc(p, '\n'); -unlock: -		raw_spin_unlock_irqrestore(&irq_desc[irq].lock, flags); -	} else if (irq == ACTUAL_NR_IRQS) { -#ifdef CONFIG_SMP -		seq_puts(p, "IPI: "); -		for_each_online_cpu(j) -			seq_printf(p, "%10lu ", cpu_data[j].ipi_count); -		seq_putc(p, '\n'); -#endif -		seq_puts(p, "PMI: "); -		for_each_online_cpu(j) -			seq_printf(p, "%10lu ", per_cpu(irq_pmi_count, j)); -		seq_puts(p, "          Performance Monitoring\n"); -		seq_printf(p, "ERR: %10lu\n", irq_err_count); -	} +	seq_puts(p, "PMI: "); +	for_each_online_cpu(j) +		seq_printf(p, "%10lu ", per_cpu(irq_pmi_count, j)); +	seq_puts(p, "          Performance Monitoring\n"); +	seq_printf(p, "ERR: %10lu\n", irq_err_count);  	return 0;  } @@ -142,8 +106,10 @@ handle_irq(int irq)  	 * handled by some other CPU. (or is disabled)  	 */  	static unsigned int illegal_count=0; +	struct irq_desc *desc = irq_to_desc(irq); -	if ((unsigned) irq > ACTUAL_NR_IRQS && illegal_count < MAX_ILLEGAL_IRQS ) { +	if (!desc || ((unsigned) irq > ACTUAL_NR_IRQS && +	    illegal_count < MAX_ILLEGAL_IRQS)) {  		irq_err_count++;  		illegal_count++;  		printk(KERN_CRIT "device_interrupt: invalid interrupt %d\n", @@ -152,13 +118,6 @@ handle_irq(int irq)  	}  	irq_enter(); -	/* -	 * __do_IRQ() must be called with IPL_MAX. Note that we do not -	 * explicitly enable interrupts afterwards - some MILO PALcode -	 * (namely LX164 one) seems to have severe problems with RTI -	 * at IPL 0. -	 */ -	local_irq_disable(); -	__do_IRQ(irq); +	generic_handle_irq_desc(irq, desc);  	irq_exit();  } diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c index 5f77afb88e8..1c8625cb0e2 100644 --- a/arch/alpha/kernel/irq_alpha.c +++ b/arch/alpha/kernel/irq_alpha.c @@ -11,6 +11,7 @@  #include <asm/machvec.h>  #include <asm/dma.h>  #include <asm/perf_event.h> +#include <asm/mce.h>  #include "proto.h"  #include "irq_impl.h" @@ -44,6 +45,14 @@ do_entInt(unsigned long type, unsigned long vector,  	  unsigned long la_ptr, struct pt_regs *regs)  {  	struct pt_regs *old_regs; + +	/* +	 * Disable interrupts during IRQ handling. +	 * Note that there is no matching local_irq_enable() due to +	 * severe problems with RTI at IPL0 and some MILO PALcode +	 * (namely LX164). +	 */ +	local_irq_disable();  	switch (type) {  	case 0:  #ifdef CONFIG_SMP @@ -57,22 +66,7 @@ do_entInt(unsigned long type, unsigned long vector,  		break;  	case 1:  		old_regs = set_irq_regs(regs); -#ifdef CONFIG_SMP -	  { -		long cpu; - -		local_irq_disable(); -		smp_percpu_timer_interrupt(regs); -		cpu = smp_processor_id(); -		if (cpu != boot_cpuid) { -		        kstat_incr_irqs_this_cpu(RTC_IRQ, irq_to_desc(RTC_IRQ)); -		} else { -			handle_irq(RTC_IRQ); -		} -	  } -#else  		handle_irq(RTC_IRQ); -#endif  		set_irq_regs(old_regs);  		return;  	case 2: @@ -112,8 +106,6 @@ init_IRQ(void)  	wrent(entInt, 0);  	alpha_mv.init_irq(); - -	init_hw_perf_events();  }  /* @@ -221,30 +213,16 @@ process_mcheck_info(unsigned long vector, unsigned long la_ptr,   * processed by PALcode, and comes in via entInt vector 1.   */ -static void rtc_enable_disable(unsigned int irq) { } -static unsigned int rtc_startup(unsigned int irq) { return 0; } -  struct irqaction timer_irqaction = { -	.handler	= timer_interrupt, -	.flags		= IRQF_DISABLED, +	.handler	= rtc_timer_interrupt,  	.name		= "timer",  }; -static struct irq_chip rtc_irq_type = { -	.name		= "RTC", -	.startup	= rtc_startup, -	.shutdown	= rtc_enable_disable, -	.enable		= rtc_enable_disable, -	.disable	= rtc_enable_disable, -	.ack		= rtc_enable_disable, -	.end		= rtc_enable_disable, -}; -  void __init  init_rtc_irq(void)  { -	irq_desc[RTC_IRQ].status = IRQ_DISABLED; -	irq_desc[RTC_IRQ].chip = &rtc_irq_type; +	irq_set_chip_and_handler_name(RTC_IRQ, &dummy_irq_chip, +				      handle_percpu_irq, "RTC");  	setup_irq(RTC_IRQ, &timer_irqaction);  } diff --git a/arch/alpha/kernel/irq_i8259.c b/arch/alpha/kernel/irq_i8259.c index 83a9ac28089..e1861c77dab 100644 --- a/arch/alpha/kernel/irq_i8259.c +++ b/arch/alpha/kernel/irq_i8259.c @@ -33,10 +33,10 @@ i8259_update_irq_hw(unsigned int irq, unsigned long mask)  }  inline void -i8259a_enable_irq(unsigned int irq) +i8259a_enable_irq(struct irq_data *d)  {  	spin_lock(&i8259_irq_lock); -	i8259_update_irq_hw(irq, cached_irq_mask &= ~(1 << irq)); +	i8259_update_irq_hw(d->irq, cached_irq_mask &= ~(1 << d->irq));  	spin_unlock(&i8259_irq_lock);  } @@ -47,16 +47,18 @@ __i8259a_disable_irq(unsigned int irq)  }  void -i8259a_disable_irq(unsigned int irq) +i8259a_disable_irq(struct irq_data *d)  {  	spin_lock(&i8259_irq_lock); -	__i8259a_disable_irq(irq); +	__i8259a_disable_irq(d->irq);  	spin_unlock(&i8259_irq_lock);  }  void -i8259a_mask_and_ack_irq(unsigned int irq) +i8259a_mask_and_ack_irq(struct irq_data *d)  { +	unsigned int irq = d->irq; +  	spin_lock(&i8259_irq_lock);  	__i8259a_disable_irq(irq); @@ -69,28 +71,11 @@ i8259a_mask_and_ack_irq(unsigned int irq)  	spin_unlock(&i8259_irq_lock);  } -unsigned int -i8259a_startup_irq(unsigned int irq) -{ -	i8259a_enable_irq(irq); -	return 0; /* never anything pending */ -} - -void -i8259a_end_irq(unsigned int irq) -{ -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		i8259a_enable_irq(irq); -} -  struct irq_chip i8259a_irq_type = {  	.name		= "XT-PIC", -	.startup	= i8259a_startup_irq, -	.shutdown	= i8259a_disable_irq, -	.enable		= i8259a_enable_irq, -	.disable	= i8259a_disable_irq, -	.ack		= i8259a_mask_and_ack_irq, -	.end		= i8259a_end_irq, +	.irq_unmask	= i8259a_enable_irq, +	.irq_mask	= i8259a_disable_irq, +	.irq_mask_ack	= i8259a_mask_and_ack_irq,  };  void __init @@ -107,8 +92,7 @@ init_i8259a_irqs(void)  	outb(0xff, 0xA1);	/* mask all of 8259A-2 */  	for (i = 0; i < 16; i++) { -		irq_desc[i].status = IRQ_DISABLED; -		irq_desc[i].chip = &i8259a_irq_type; +		irq_set_chip_and_handler(i, &i8259a_irq_type, handle_level_irq);  	}  	setup_irq(2, &cascade); diff --git a/arch/alpha/kernel/irq_impl.h b/arch/alpha/kernel/irq_impl.h index b63ccd7386f..d507a234b05 100644 --- a/arch/alpha/kernel/irq_impl.h +++ b/arch/alpha/kernel/irq_impl.h @@ -31,11 +31,9 @@ extern void init_rtc_irq(void);  extern void common_init_isa_dma(void); -extern void i8259a_enable_irq(unsigned int); -extern void i8259a_disable_irq(unsigned int); -extern void i8259a_mask_and_ack_irq(unsigned int); -extern unsigned int i8259a_startup_irq(unsigned int); -extern void i8259a_end_irq(unsigned int); +extern void i8259a_enable_irq(struct irq_data *d); +extern void i8259a_disable_irq(struct irq_data *d); +extern void i8259a_mask_and_ack_irq(struct irq_data *d);  extern struct irq_chip i8259a_irq_type;  extern void init_i8259a_irqs(void); diff --git a/arch/alpha/kernel/irq_pyxis.c b/arch/alpha/kernel/irq_pyxis.c index 989ce46a0cf..13c97a5b31e 100644 --- a/arch/alpha/kernel/irq_pyxis.c +++ b/arch/alpha/kernel/irq_pyxis.c @@ -29,35 +29,21 @@ pyxis_update_irq_hw(unsigned long mask)  }  static inline void -pyxis_enable_irq(unsigned int irq) +pyxis_enable_irq(struct irq_data *d)  { -	pyxis_update_irq_hw(cached_irq_mask |= 1UL << (irq - 16)); +	pyxis_update_irq_hw(cached_irq_mask |= 1UL << (d->irq - 16));  }  static void -pyxis_disable_irq(unsigned int irq) +pyxis_disable_irq(struct irq_data *d)  { -	pyxis_update_irq_hw(cached_irq_mask &= ~(1UL << (irq - 16))); -} - -static unsigned int -pyxis_startup_irq(unsigned int irq) -{ -	pyxis_enable_irq(irq); -	return 0; -} - -static void -pyxis_end_irq(unsigned int irq) -{ -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		pyxis_enable_irq(irq); +	pyxis_update_irq_hw(cached_irq_mask &= ~(1UL << (d->irq - 16)));  }  static void -pyxis_mask_and_ack_irq(unsigned int irq) +pyxis_mask_and_ack_irq(struct irq_data *d)  { -	unsigned long bit = 1UL << (irq - 16); +	unsigned long bit = 1UL << (d->irq - 16);  	unsigned long mask = cached_irq_mask &= ~bit;  	/* Disable the interrupt.  */ @@ -72,12 +58,9 @@ pyxis_mask_and_ack_irq(unsigned int irq)  static struct irq_chip pyxis_irq_type = {  	.name		= "PYXIS", -	.startup	= pyxis_startup_irq, -	.shutdown	= pyxis_disable_irq, -	.enable		= pyxis_enable_irq, -	.disable	= pyxis_disable_irq, -	.ack		= pyxis_mask_and_ack_irq, -	.end		= pyxis_end_irq, +	.irq_mask_ack	= pyxis_mask_and_ack_irq, +	.irq_mask	= pyxis_disable_irq, +	.irq_unmask	= pyxis_enable_irq,  };  void  @@ -119,8 +102,8 @@ init_pyxis_irqs(unsigned long ignore_mask)  	for (i = 16; i < 48; ++i) {  		if ((ignore_mask >> i) & 1)  			continue; -		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i].chip = &pyxis_irq_type; +		irq_set_chip_and_handler(i, &pyxis_irq_type, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	setup_irq(16+7, &isa_cascade_irqaction); diff --git a/arch/alpha/kernel/irq_srm.c b/arch/alpha/kernel/irq_srm.c index d63e93e1e8b..a79fa30e755 100644 --- a/arch/alpha/kernel/irq_srm.c +++ b/arch/alpha/kernel/irq_srm.c @@ -18,44 +18,27 @@  DEFINE_SPINLOCK(srm_irq_lock);  static inline void -srm_enable_irq(unsigned int irq) +srm_enable_irq(struct irq_data *d)  {  	spin_lock(&srm_irq_lock); -	cserve_ena(irq - 16); +	cserve_ena(d->irq - 16);  	spin_unlock(&srm_irq_lock);  }  static void -srm_disable_irq(unsigned int irq) +srm_disable_irq(struct irq_data *d)  {  	spin_lock(&srm_irq_lock); -	cserve_dis(irq - 16); +	cserve_dis(d->irq - 16);  	spin_unlock(&srm_irq_lock);  } -static unsigned int -srm_startup_irq(unsigned int irq) -{ -	srm_enable_irq(irq); -	return 0; -} - -static void -srm_end_irq(unsigned int irq) -{ -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		srm_enable_irq(irq); -} -  /* Handle interrupts from the SRM, assuming no additional weirdness.  */  static struct irq_chip srm_irq_type = {  	.name		= "SRM", -	.startup	= srm_startup_irq, -	.shutdown	= srm_disable_irq, -	.enable		= srm_enable_irq, -	.disable	= srm_disable_irq, -	.ack		= srm_disable_irq, -	.end		= srm_end_irq, +	.irq_unmask	= srm_enable_irq, +	.irq_mask	= srm_disable_irq, +	.irq_mask_ack	= srm_disable_irq,  };  void __init @@ -68,8 +51,8 @@ init_srm_irqs(long max, unsigned long ignore_mask)  	for (i = 16; i < max; ++i) {  		if (i < 64 && ((ignore_mask >> i) & 1))  			continue; -		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i].chip = &srm_irq_type; +		irq_set_chip_and_handler(i, &srm_irq_type, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  } diff --git a/arch/alpha/kernel/machvec_impl.h b/arch/alpha/kernel/machvec_impl.h index 7fa62488bd1..f54bdf658cd 100644 --- a/arch/alpha/kernel/machvec_impl.h +++ b/arch/alpha/kernel/machvec_impl.h @@ -43,10 +43,7 @@  #define CAT1(x,y)  x##y  #define CAT(x,y)   CAT1(x,y) -#define DO_DEFAULT_RTC \ -	.rtc_port = 0x70, \ -	.rtc_get_time = common_get_rtc_time, \ -	.rtc_set_time = common_set_rtc_time +#define DO_DEFAULT_RTC			.rtc_port = 0x70  #define DO_EV4_MMU							\  	.max_asn =			EV4_MAX_ASN,			\ diff --git a/arch/alpha/kernel/module.c b/arch/alpha/kernel/module.c index ebc3c894b5a..2fd00b7077e 100644 --- a/arch/alpha/kernel/module.c +++ b/arch/alpha/kernel/module.c @@ -29,20 +29,6 @@  #define DEBUGP(fmt...)  #endif -void * -module_alloc(unsigned long size) -{ -	if (size == 0) -		return NULL; -	return vmalloc(size); -} - -void -module_free(struct module *mod, void *module_region) -{ -	vfree(module_region); -} -  /* Allocate the GOT at the end of the core sections.  */  struct got_entry { @@ -156,14 +142,6 @@ module_frob_arch_sections(Elf64_Ehdr *hdr, Elf64_Shdr *sechdrs,  }  int -apply_relocate(Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex, -	       unsigned int relsec, struct module *me) -{ -	printk(KERN_ERR "module %s: REL relocation unsupported\n", me->name); -	return -ENOEXEC; -} - -int  apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab,  		   unsigned int symindex, unsigned int relsec,  		   struct module *me) @@ -302,15 +280,3 @@ apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab,  	return 0;  } - -int -module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, -		struct module *me) -{ -	return 0; -} - -void -module_arch_cleanup(struct module *mod) -{ -} diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 547e8b84b2f..1402fcc11c2 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c @@ -40,8 +40,8 @@  #include <asm/fpu.h>  #include <asm/io.h>  #include <asm/uaccess.h> -#include <asm/system.h>  #include <asm/sysinfo.h> +#include <asm/thread_info.h>  #include <asm/hwrpb.h>  #include <asm/processor.h> @@ -96,6 +96,7 @@ struct osf_dirent {  };  struct osf_dirent_callback { +	struct dir_context ctx;  	struct osf_dirent __user *dirent;  	long __user *basep;  	unsigned int count; @@ -145,27 +146,24 @@ SYSCALL_DEFINE4(osf_getdirentries, unsigned int, fd,  		long __user *, basep)  {  	int error; -	struct file *file; -	struct osf_dirent_callback buf; - -	error = -EBADF; -	file = fget(fd); -	if (!file) -		goto out; +	struct fd arg = fdget(fd); +	struct osf_dirent_callback buf = { +		.ctx.actor = osf_filldir, +		.dirent = dirent, +		.basep = basep, +		.count = count +	}; -	buf.dirent = dirent; -	buf.basep = basep; -	buf.count = count; -	buf.error = 0; +	if (!arg.file) +		return -EBADF; -	error = vfs_readdir(file, osf_filldir, &buf); +	error = iterate_dir(arg.file, &buf.ctx);  	if (error >= 0)  		error = buf.error;  	if (count != buf.count)  		error = count - buf.count; -	fput(file); - out: +	fdput(arg);  	return error;  } @@ -191,6 +189,39 @@ SYSCALL_DEFINE6(osf_mmap, unsigned long, addr, unsigned long, len,  	return ret;  } +struct osf_stat { +	int		st_dev; +	int		st_pad1; +	unsigned	st_mode; +	unsigned short	st_nlink; +	short		st_nlink_reserved; +	unsigned	st_uid; +	unsigned	st_gid; +	int		st_rdev; +	int		st_ldev; +	long		st_size; +	int		st_pad2; +	int		st_uatime; +	int		st_pad3; +	int		st_umtime; +	int		st_pad4; +	int		st_uctime; +	int		st_pad5; +	int		st_pad6; +	unsigned	st_flags; +	unsigned	st_gen; +	long		st_spare[4]; +	unsigned	st_ino; +	int		st_ino_reserved; +	int		st_atime; +	int		st_atime_reserved; +	int		st_mtime; +	int		st_mtime_reserved; +	int		st_ctime; +	int		st_ctime_reserved; +	long		st_blksize; +	long		st_blocks; +};  /*   * The OSF/1 statfs structure is much larger, but this should @@ -209,6 +240,60 @@ struct osf_statfs {  	__kernel_fsid_t f_fsid;  }; +struct osf_statfs64 { +	short f_type; +	short f_flags; +	int f_pad1; +	int f_pad2; +	int f_pad3; +	int f_pad4; +	int f_pad5; +	int f_pad6; +	int f_pad7; +	__kernel_fsid_t f_fsid; +	u_short f_namemax; +	short f_reserved1; +	int f_spare[8]; +	char f_pad8[90]; +	char f_pad9[90]; +	long mount_info[10]; +	u_long f_flags2; +	long f_spare2[14]; +	long f_fsize; +	long f_bsize; +	long f_blocks; +	long f_bfree; +	long f_bavail; +	long f_files; +	long f_ffree; +}; + +static int +linux_to_osf_stat(struct kstat *lstat, struct osf_stat __user *osf_stat) +{ +	struct osf_stat tmp = { 0 }; + +	tmp.st_dev	= lstat->dev; +	tmp.st_mode	= lstat->mode; +	tmp.st_nlink	= lstat->nlink; +	tmp.st_uid	= from_kuid_munged(current_user_ns(), lstat->uid); +	tmp.st_gid	= from_kgid_munged(current_user_ns(), lstat->gid); +	tmp.st_rdev	= lstat->rdev; +	tmp.st_ldev	= lstat->rdev; +	tmp.st_size	= lstat->size; +	tmp.st_uatime	= lstat->atime.tv_nsec / 1000; +	tmp.st_umtime	= lstat->mtime.tv_nsec / 1000; +	tmp.st_uctime	= lstat->ctime.tv_nsec / 1000; +	tmp.st_ino	= lstat->ino; +	tmp.st_atime	= lstat->atime.tv_sec; +	tmp.st_mtime	= lstat->mtime.tv_sec; +	tmp.st_ctime	= lstat->ctime.tv_sec; +	tmp.st_blksize	= lstat->blksize; +	tmp.st_blocks	= lstat->blocks; + +	return copy_to_user(osf_stat, &tmp, sizeof(tmp)) ? -EFAULT : 0; +} +  static int  linux_to_osf_statfs(struct kstatfs *linux_stat, struct osf_statfs __user *osf_stat,  		    unsigned long bufsiz) @@ -231,43 +316,99 @@ linux_to_osf_statfs(struct kstatfs *linux_stat, struct osf_statfs __user *osf_st  }  static int -do_osf_statfs(struct path *path, struct osf_statfs __user *buffer, -	      unsigned long bufsiz) +linux_to_osf_statfs64(struct kstatfs *linux_stat, struct osf_statfs64 __user *osf_stat, +		      unsigned long bufsiz) +{ +	struct osf_statfs64 tmp_stat = { 0 }; + +	tmp_stat.f_type = linux_stat->f_type; +	tmp_stat.f_fsize = linux_stat->f_frsize; +	tmp_stat.f_bsize = linux_stat->f_bsize; +	tmp_stat.f_blocks = linux_stat->f_blocks; +	tmp_stat.f_bfree = linux_stat->f_bfree; +	tmp_stat.f_bavail = linux_stat->f_bavail; +	tmp_stat.f_files = linux_stat->f_files; +	tmp_stat.f_ffree = linux_stat->f_ffree; +	tmp_stat.f_fsid = linux_stat->f_fsid; +	if (bufsiz > sizeof(tmp_stat)) +		bufsiz = sizeof(tmp_stat); +	return copy_to_user(osf_stat, &tmp_stat, bufsiz) ? -EFAULT : 0; +} + +SYSCALL_DEFINE3(osf_statfs, const char __user *, pathname, +		struct osf_statfs __user *, buffer, unsigned long, bufsiz)  {  	struct kstatfs linux_stat; -	int error = vfs_statfs(path, &linux_stat); +	int error = user_statfs(pathname, &linux_stat);  	if (!error)  		error = linux_to_osf_statfs(&linux_stat, buffer, bufsiz);  	return error;	  } -SYSCALL_DEFINE3(osf_statfs, const char __user *, pathname, -		struct osf_statfs __user *, buffer, unsigned long, bufsiz) +SYSCALL_DEFINE2(osf_stat, char __user *, name, struct osf_stat __user *, buf)  { -	struct path path; -	int retval; +	struct kstat stat; +	int error; -	retval = user_path(pathname, &path); -	if (!retval) { -		retval = do_osf_statfs(&path, buffer, bufsiz); -		path_put(&path); -	} -	return retval; +	error = vfs_stat(name, &stat); +	if (error) +		return error; + +	return linux_to_osf_stat(&stat, buf); +} + +SYSCALL_DEFINE2(osf_lstat, char __user *, name, struct osf_stat __user *, buf) +{ +	struct kstat stat; +	int error; + +	error = vfs_lstat(name, &stat); +	if (error) +		return error; + +	return linux_to_osf_stat(&stat, buf); +} + +SYSCALL_DEFINE2(osf_fstat, int, fd, struct osf_stat __user *, buf) +{ +	struct kstat stat; +	int error; + +	error = vfs_fstat(fd, &stat); +	if (error) +		return error; + +	return linux_to_osf_stat(&stat, buf);  }  SYSCALL_DEFINE3(osf_fstatfs, unsigned long, fd,  		struct osf_statfs __user *, buffer, unsigned long, bufsiz)  { -	struct file *file; -	int retval; +	struct kstatfs linux_stat; +	int error = fd_statfs(fd, &linux_stat); +	if (!error) +		error = linux_to_osf_statfs(&linux_stat, buffer, bufsiz); +	return error; +} -	retval = -EBADF; -	file = fget(fd); -	if (file) { -		retval = do_osf_statfs(&file->f_path, buffer, bufsiz); -		fput(file); -	} -	return retval; +SYSCALL_DEFINE3(osf_statfs64, char __user *, pathname, +		struct osf_statfs64 __user *, buffer, unsigned long, bufsiz) +{ +	struct kstatfs linux_stat; +	int error = user_statfs(pathname, &linux_stat); +	if (!error) +		error = linux_to_osf_statfs64(&linux_stat, buffer, bufsiz); +	return error; +} + +SYSCALL_DEFINE3(osf_fstatfs64, unsigned long, fd, +		struct osf_statfs64 __user *, buffer, unsigned long, bufsiz) +{ +	struct kstatfs linux_stat; +	int error = fd_statfs(fd, &linux_stat); +	if (!error) +		error = linux_to_osf_statfs64(&linux_stat, buffer, bufsiz); +	return error;  }  /* @@ -305,11 +446,11 @@ struct procfs_args {   * unhappy with OSF UFS. [CHECKME]   */  static int -osf_ufs_mount(char *dirname, struct ufs_args __user *args, int flags) +osf_ufs_mount(const char *dirname, struct ufs_args __user *args, int flags)  {  	int retval;  	struct cdfs_args tmp; -	char *devname; +	struct filename *devname;  	retval = -EFAULT;  	if (copy_from_user(&tmp, args, sizeof(tmp))) @@ -318,18 +459,18 @@ osf_ufs_mount(char *dirname, struct ufs_args __user *args, int flags)  	retval = PTR_ERR(devname);  	if (IS_ERR(devname))  		goto out; -	retval = do_mount(devname, dirname, "ext2", flags, NULL); +	retval = do_mount(devname->name, dirname, "ext2", flags, NULL);  	putname(devname);   out:  	return retval;  }  static int -osf_cdfs_mount(char *dirname, struct cdfs_args __user *args, int flags) +osf_cdfs_mount(const char *dirname, struct cdfs_args __user *args, int flags)  {  	int retval;  	struct cdfs_args tmp; -	char *devname; +	struct filename *devname;  	retval = -EFAULT;  	if (copy_from_user(&tmp, args, sizeof(tmp))) @@ -338,14 +479,14 @@ osf_cdfs_mount(char *dirname, struct cdfs_args __user *args, int flags)  	retval = PTR_ERR(devname);  	if (IS_ERR(devname))  		goto out; -	retval = do_mount(devname, dirname, "iso9660", flags, NULL); +	retval = do_mount(devname->name, dirname, "iso9660", flags, NULL);  	putname(devname);   out:  	return retval;  }  static int -osf_procfs_mount(char *dirname, struct procfs_args __user *args, int flags) +osf_procfs_mount(const char *dirname, struct procfs_args __user *args, int flags)  {  	struct procfs_args tmp; @@ -359,7 +500,7 @@ SYSCALL_DEFINE4(osf_mount, unsigned long, typenr, const char __user *, path,  		int, flag, void __user *, data)  {  	int retval; -	char *name; +	struct filename *name;  	name = getname(path);  	retval = PTR_ERR(name); @@ -367,13 +508,13 @@ SYSCALL_DEFINE4(osf_mount, unsigned long, typenr, const char __user *, path,  		goto out;  	switch (typenr) {  	case 1: -		retval = osf_ufs_mount(name, data, flag); +		retval = osf_ufs_mount(name->name, data, flag);  		break;  	case 6: -		retval = osf_cdfs_mount(name, data, flag); +		retval = osf_cdfs_mount(name->name, data, flag);  		break;  	case 9: -		retval = osf_procfs_mount(name, data, flag); +		retval = osf_procfs_mount(name->name, data, flag);  		break;  	default:  		retval = -EINVAL; @@ -429,7 +570,7 @@ SYSCALL_DEFINE2(osf_getdomainname, char __user *, name, int, namelen)  		return -EFAULT;  	len = namelen; -	if (namelen > 32) +	if (len > 32)  		len = 32;  	down_read(&uts_sem); @@ -614,7 +755,7 @@ SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)  	down_read(&uts_sem);  	res = sysinfo_table[offset];  	len = strlen(res)+1; -	if (len > count) +	if ((unsigned long)len > (unsigned long)count)  		len = count;  	if (copy_to_user(buf, res, len))  		err = -EFAULT; @@ -653,9 +794,9 @@ SYSCALL_DEFINE5(osf_getsysinfo, unsigned long, op, void __user *, buffer,   	case GSI_UACPROC:  		if (nbytes < sizeof(unsigned int))  			return -EINVAL; - 		w = (current_thread_info()->flags >> UAC_SHIFT) & UAC_BITMASK; - 		if (put_user(w, (unsigned int __user *)buffer)) - 			return -EFAULT; +		w = current_thread_info()->status & UAC_BITMASK; +		if (put_user(w, (unsigned int __user *)buffer)) +			return -EFAULT;   		return 1;  	case GSI_PROC_TYPE: @@ -669,7 +810,7 @@ SYSCALL_DEFINE5(osf_getsysinfo, unsigned long, op, void __user *, buffer,  		return 1;  	case GSI_GET_HWRPB: -		if (nbytes < sizeof(*hwrpb)) +		if (nbytes > sizeof(*hwrpb))  			return -EINVAL;  		if (copy_to_user(buffer, hwrpb, nbytes) != 0)  			return -EFAULT; @@ -763,24 +904,20 @@ SYSCALL_DEFINE5(osf_setsysinfo, unsigned long, op, void __user *, buffer,  		break;   	case SSI_NVPAIRS: { -		unsigned long v, w, i; -		unsigned int old, new; +		unsigned __user *p = buffer; +		unsigned i; - 		for (i = 0; i < nbytes; ++i) { +		for (i = 0, p = buffer; i < nbytes; ++i, p += 2) { +			unsigned v, w, status; - 			if (get_user(v, 2*i + (unsigned int __user *)buffer)) - 				return -EFAULT; - 			if (get_user(w, 2*i + 1 + (unsigned int __user *)buffer)) +			if (get_user(v, p) || get_user(w, p + 1))   				return -EFAULT;   			switch (v) {   			case SSIN_UACPROC: -			again: -				old = current_thread_info()->flags; -				new = old & ~(UAC_BITMASK << UAC_SHIFT); -				new = new | (w & UAC_BITMASK) << UAC_SHIFT; -				if (cmpxchg(¤t_thread_info()->flags, -					    old, new) != old) -					goto again; +				w &= UAC_BITMASK; +				status = current_thread_info()->status; +				status = (status & ~UAC_BITMASK) | w; +				current_thread_info()->status = status;   				break;   			default: @@ -790,6 +927,9 @@ SYSCALL_DEFINE5(osf_setsysinfo, unsigned long, op, void __user *, buffer,   		return 0;  	} +	case SSI_LMF: +		return 0; +  	default:  		break;  	} @@ -951,9 +1091,6 @@ SYSCALL_DEFINE2(osf_utimes, const char __user *, filename,  	return do_utimes(AT_FDCWD, filename, tvs ? tv : NULL, 0);  } -#define MAX_SELECT_SECONDS \ -	((unsigned long) (MAX_SCHEDULE_TIMEOUT / HZ)-1) -  SYSCALL_DEFINE5(osf_select, int, n, fd_set __user *, inp, fd_set __user *, outp,  		fd_set __user *, exp, struct timeval32 __user *, tvp)  { @@ -1003,6 +1140,7 @@ struct rusage32 {  SYSCALL_DEFINE2(osf_getrusage, int, who, struct rusage32 __user *, ru)  {  	struct rusage32 r; +	cputime_t utime, stime;  	if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN)  		return -EINVAL; @@ -1010,8 +1148,9 @@ SYSCALL_DEFINE2(osf_getrusage, int, who, struct rusage32 __user *, ru)  	memset(&r, 0, sizeof(r));  	switch (who) {  	case RUSAGE_SELF: -		jiffies_to_timeval32(current->utime, &r.ru_utime); -		jiffies_to_timeval32(current->stime, &r.ru_stime); +		task_cputime(current, &utime, &stime); +		jiffies_to_timeval32(utime, &r.ru_utime); +		jiffies_to_timeval32(stime, &r.ru_stime);  		r.ru_minflt = current->min_flt;  		r.ru_majflt = current->maj_flt;  		break; @@ -1031,6 +1170,7 @@ SYSCALL_DEFINE4(osf_wait4, pid_t, pid, int __user *, ustatus, int, options,  {  	struct rusage r;  	long ret, err; +	unsigned int status = 0;  	mm_segment_t old_fs;  	if (!ur) @@ -1039,13 +1179,15 @@ SYSCALL_DEFINE4(osf_wait4, pid_t, pid, int __user *, ustatus, int, options,  	old_fs = get_fs();  	set_fs (KERNEL_DS); -	ret = sys_wait4(pid, ustatus, options, (struct rusage __user *) &r); +	ret = sys_wait4(pid, (unsigned int __user *) &status, options, +			(struct rusage __user *) &r);  	set_fs (old_fs);  	if (!access_ok(VERIFY_WRITE, ur, sizeof(*ur)))  		return -EFAULT;  	err = 0; +	err |= put_user(status, ustatus);  	err |= __put_user(r.ru_utime.tv_sec, &ur->ru_utime.tv_sec);  	err |= __put_user(r.ru_utime.tv_usec, &ur->ru_utime.tv_usec);  	err |= __put_user(r.ru_stime.tv_sec, &ur->ru_stime.tv_sec); @@ -1159,17 +1301,15 @@ static unsigned long  arch_get_unmapped_area_1(unsigned long addr, unsigned long len,  		         unsigned long limit)  { -	struct vm_area_struct *vma = find_vma(current->mm, addr); - -	while (1) { -		/* At this point:  (!vma || addr < vma->vm_end). */ -		if (limit - len < addr) -			return -ENOMEM; -		if (!vma || addr + len <= vma->vm_start) -			return addr; -		addr = vma->vm_end; -		vma = vma->vm_next; -	} +	struct vm_unmapped_area_info info; + +	info.flags = 0; +	info.length = len; +	info.low_limit = addr; +	info.high_limit = limit; +	info.align_mask = 0; +	info.align_offset = 0; +	return vm_unmapped_area(&info);  }  unsigned long @@ -1257,3 +1397,52 @@ SYSCALL_DEFINE3(osf_writev, unsigned long, fd,  }  #endif + +SYSCALL_DEFINE2(osf_getpriority, int, which, int, who) +{ +	int prio = sys_getpriority(which, who); +	if (prio >= 0) { +		/* Return value is the unbiased priority, i.e. 20 - prio. +		   This does result in negative return values, so signal +		   no error */ +		force_successful_syscall_return(); +		prio = 20 - prio; +	} +	return prio; +} + +SYSCALL_DEFINE0(getxuid) +{ +	current_pt_regs()->r20 = sys_geteuid(); +	return sys_getuid(); +} + +SYSCALL_DEFINE0(getxgid) +{ +	current_pt_regs()->r20 = sys_getegid(); +	return sys_getgid(); +} + +SYSCALL_DEFINE0(getxpid) +{ +	current_pt_regs()->r20 = sys_getppid(); +	return sys_getpid(); +} + +SYSCALL_DEFINE0(alpha_pipe) +{ +	int fd[2]; +	int res = do_pipe_flags(fd, 0); +	if (!res) { +		/* The return values are in $0 and $20.  */ +		current_pt_regs()->r20 = fd[1]; +		res = fd[0]; +	} +	return res; +} + +SYSCALL_DEFINE1(sethae, unsigned long, val) +{ +	current_pt_regs()->hae = val; +	return 0; +} diff --git a/arch/alpha/kernel/pci-noop.c b/arch/alpha/kernel/pci-noop.c index 246100ef07c..df24b76f924 100644 --- a/arch/alpha/kernel/pci-noop.c +++ b/arch/alpha/kernel/pci-noop.c @@ -108,7 +108,8 @@ sys_pciconfig_write(unsigned long bus, unsigned long dfn,  }  static void *alpha_noop_alloc_coherent(struct device *dev, size_t size, -				       dma_addr_t *dma_handle, gfp_t gfp) +				       dma_addr_t *dma_handle, gfp_t gfp, +				       struct dma_attrs *attrs)  {  	void *ret; @@ -123,7 +124,8 @@ static void *alpha_noop_alloc_coherent(struct device *dev, size_t size,  }  static void alpha_noop_free_coherent(struct device *dev, size_t size, -				     void *cpu_addr, dma_addr_t dma_addr) +				     void *cpu_addr, dma_addr_t dma_addr, +				     struct dma_attrs *attrs)  {  	free_pages((unsigned long)cpu_addr, get_order(size));  } @@ -174,8 +176,8 @@ static int alpha_noop_set_mask(struct device *dev, u64 mask)  }  struct dma_map_ops alpha_noop_ops = { -	.alloc_coherent		= alpha_noop_alloc_coherent, -	.free_coherent		= alpha_noop_free_coherent, +	.alloc			= alpha_noop_alloc_coherent, +	.free			= alpha_noop_free_coherent,  	.map_page		= alpha_noop_map_page,  	.map_sg			= alpha_noop_map_sg,  	.mapping_error		= alpha_noop_mapping_error, @@ -185,15 +187,3 @@ struct dma_map_ops alpha_noop_ops = {  struct dma_map_ops *dma_ops = &alpha_noop_ops;  EXPORT_SYMBOL(dma_ops); - -void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) -{ -	return NULL; -} - -void pci_iounmap(struct pci_dev *dev, void __iomem * addr) -{ -} - -EXPORT_SYMBOL(pci_iomap); -EXPORT_SYMBOL(pci_iounmap); diff --git a/arch/alpha/kernel/pci-sysfs.c b/arch/alpha/kernel/pci-sysfs.c index b899e95f79f..99e8d4796c9 100644 --- a/arch/alpha/kernel/pci-sysfs.c +++ b/arch/alpha/kernel/pci-sysfs.c @@ -10,6 +10,7 @@   */  #include <linux/sched.h> +#include <linux/stat.h>  #include <linux/slab.h>  #include <linux/pci.h> @@ -25,7 +26,6 @@ static int hose_mmap_page_range(struct pci_controller *hose,  		base = sparse ? hose->sparse_io_base : hose->dense_io_base;  	vma->vm_pgoff += base >> PAGE_SHIFT; -	vma->vm_flags |= (VM_IO | VM_RESERVED);  	return io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,  				  vma->vm_end - vma->vm_start, @@ -83,7 +83,7 @@ static int pci_mmap_resource(struct kobject *kobj,  	if (iomem_is_exclusive(res->start))  		return -EINVAL; -	pcibios_resource_to_bus(pdev, &bar, res); +	pcibios_resource_to_bus(pdev->bus, &bar, res);  	vma->vm_pgoff += bar.start >> (PAGE_SHIFT - (sparse ? 5 : 0));  	mmap_type = res->flags & IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io; @@ -139,7 +139,7 @@ static int sparse_mem_mmap_fits(struct pci_dev *pdev, int num)  	long dense_offset;  	unsigned long sparse_size; -	pcibios_resource_to_bus(pdev, &bar, &pdev->resource[num]); +	pcibios_resource_to_bus(pdev->bus, &bar, &pdev->resource[num]);  	/* All core logic chips have 4G sparse address space, except  	   CIA which has 16G (see xxx_SPARSE_MEM and xxx_DENSE_MEM diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index c9ab94ee1ca..076c35cd6cd 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c @@ -43,12 +43,10 @@ const char *const pci_mem_names[] = {  const char pci_hae0_name[] = "HAE0"; -/* Indicate whether we respect the PCI setup left by console. */  /* - * Make this long-lived  so that we know when shutting down - * whether we probed only or not. + * If PCI_PROBE_ONLY in pci_flags is set, we don't change any PCI resource + * assignments.   */ -int pci_probe_only;  /*   * The PCI controller list. @@ -61,15 +59,13 @@ struct pci_controller *pci_isa_hose;   * Quirks.   */ -static void __init -quirk_isa_bridge(struct pci_dev *dev) +static void quirk_isa_bridge(struct pci_dev *dev)  {  	dev->class = PCI_CLASS_BRIDGE_ISA << 8;  }  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82378, quirk_isa_bridge); -static void __init -quirk_cypress(struct pci_dev *dev) +static void quirk_cypress(struct pci_dev *dev)  {  	/* The Notorious Cy82C693 chip.  */ @@ -108,8 +104,7 @@ quirk_cypress(struct pci_dev *dev)  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CONTAQ, PCI_DEVICE_ID_CONTAQ_82C693, quirk_cypress);  /* Called for each device after PCI setup is done. */ -static void __init -pcibios_fixup_final(struct pci_dev *dev) +static void pcibios_fixup_final(struct pci_dev *dev)  {  	unsigned int class = dev->class >> 8; @@ -200,22 +195,15 @@ pcibios_init(void)  subsys_initcall(pcibios_init); -char * __devinit -pcibios_setup(char *str) -{ -	return str; -} -  #ifdef ALPHA_RESTORE_SRM_SETUP  static struct pdev_srm_saved_conf *srm_saved_configs; -void __devinit -pdev_save_srm_config(struct pci_dev *dev) +void pdev_save_srm_config(struct pci_dev *dev)  {  	struct pdev_srm_saved_conf *tmp;  	static int printed = 0; -	if (!alpha_using_srm || pci_probe_only) +	if (!alpha_using_srm || pci_has_flag(PCI_PROBE_ONLY))  		return;  	if (!printed) { @@ -242,7 +230,7 @@ pci_restore_srm_config(void)  	struct pdev_srm_saved_conf *tmp;  	/* No need to restore if probed only. */ -	if (pci_probe_only) +	if (pci_has_flag(PCI_PROBE_ONLY))  		return;  	/* Restore SRM config. */ @@ -252,116 +240,20 @@ pci_restore_srm_config(void)  }  #endif -void __devinit -pcibios_fixup_resource(struct resource *res, struct resource *root) -{ -	res->start += root->start; -	res->end += root->start; -} - -void __devinit -pcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  { -	/* Update device resources.  */ -	struct pci_controller *hose = (struct pci_controller *)bus->sysdata; -	int i; - -	for (i = 0; i < PCI_NUM_RESOURCES; i++) { -		if (!dev->resource[i].start) -			continue; -		if (dev->resource[i].flags & IORESOURCE_IO) -			pcibios_fixup_resource(&dev->resource[i], -					       hose->io_space); -		else if (dev->resource[i].flags & IORESOURCE_MEM) -			pcibios_fixup_resource(&dev->resource[i], -					       hose->mem_space); -	} -} - -void __devinit -pcibios_fixup_bus(struct pci_bus *bus) -{ -	/* Propagate hose info into the subordinate devices.  */ - -	struct pci_controller *hose = bus->sysdata;  	struct pci_dev *dev = bus->self; -	if (!dev) { -		/* Root bus. */ -		u32 pci_mem_end; -		u32 sg_base = hose->sg_pci ? hose->sg_pci->dma_base : ~0; -		unsigned long end; - -		bus->resource[0] = hose->io_space; -		bus->resource[1] = hose->mem_space; - -		/* Adjust hose mem_space limit to prevent PCI allocations -		   in the iommu windows. */ -		pci_mem_end = min((u32)__direct_map_base, sg_base) - 1; -		end = hose->mem_space->start + pci_mem_end; -		if (hose->mem_space->end > end) -			hose->mem_space->end = end; - 	} else if (pci_probe_only && +	if (pci_has_flag(PCI_PROBE_ONLY) && dev &&   		   (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {   		pci_read_bridge_bases(bus); - 		pcibios_fixup_device_resources(dev, bus);  	}   	list_for_each_entry(dev, &bus->devices, bus_list) {  		pdev_save_srm_config(dev); -		if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI) -			pcibios_fixup_device_resources(dev, bus);  	}  } -void __init -pcibios_update_irq(struct pci_dev *dev, int irq) -{ -	pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); -} - -void -pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, -			 struct resource *res) -{ -	struct pci_controller *hose = (struct pci_controller *)dev->sysdata; -	unsigned long offset = 0; - -	if (res->flags & IORESOURCE_IO) -		offset = hose->io_space->start; -	else if (res->flags & IORESOURCE_MEM) -		offset = hose->mem_space->start; - -	region->start = res->start - offset; -	region->end = res->end - offset; -} - -void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, -			     struct pci_bus_region *region) -{ -	struct pci_controller *hose = (struct pci_controller *)dev->sysdata; -	unsigned long offset = 0; - -	if (res->flags & IORESOURCE_IO) -		offset = hose->io_space->start; -	else if (res->flags & IORESOURCE_MEM) -		offset = hose->mem_space->start; - -	res->start = region->start + offset; -	res->end = region->end + offset; -} - -#ifdef CONFIG_HOTPLUG -EXPORT_SYMBOL(pcibios_resource_to_bus); -EXPORT_SYMBOL(pcibios_bus_to_resource); -#endif - -int -pcibios_enable_device(struct pci_dev *dev, int mask) -{ -	return pci_enable_resources(dev, mask); -} -  /*   *  If we set up a device for bus mastering, we need to check the latency   *  timer as certain firmware forgets to set it properly, as seen @@ -392,7 +284,8 @@ pcibios_claim_one_bus(struct pci_bus *b)  			if (r->parent || !r->start || !r->flags)  				continue; -			if (pci_probe_only || (r->flags & IORESOURCE_PCI_FIXED)) +			if (pci_has_flag(PCI_PROBE_ONLY) || +			    (r->flags & IORESOURCE_PCI_FIXED))  				pci_claim_resource(dev, i);  		}  	} @@ -414,16 +307,36 @@ void __init  common_init_pci(void)  {  	struct pci_controller *hose; +	struct list_head resources;  	struct pci_bus *bus;  	int next_busno;  	int need_domain_info = 0; +	u32 pci_mem_end; +	u32 sg_base; +	unsigned long end;  	/* Scan all of the recorded PCI controllers.  */  	for (next_busno = 0, hose = hose_head; hose; hose = hose->next) { -		bus = pci_scan_bus(next_busno, alpha_mv.pci_ops, hose); +		sg_base = hose->sg_pci ? hose->sg_pci->dma_base : ~0; + +		/* Adjust hose mem_space limit to prevent PCI allocations +		   in the iommu windows. */ +		pci_mem_end = min((u32)__direct_map_base, sg_base) - 1; +		end = hose->mem_space->start + pci_mem_end; +		if (hose->mem_space->end > end) +			hose->mem_space->end = end; + +		INIT_LIST_HEAD(&resources); +		pci_add_resource_offset(&resources, hose->io_space, +					hose->io_space->start); +		pci_add_resource_offset(&resources, hose->mem_space, +					hose->mem_space->start); + +		bus = pci_scan_root_bus(NULL, next_busno, alpha_mv.pci_ops, +					hose, &resources);  		hose->bus = bus;  		hose->need_domain_info = need_domain_info; -		next_busno = bus->subordinate + 1; +		next_busno = bus->busn_res.end + 1;  		/* Don't allow 8-bit bus number overflow inside the hose -  		   reserve some space for bridges. */   		if (next_busno > 224) { @@ -508,30 +421,7 @@ sys_pciconfig_iobase(long which, unsigned long bus, unsigned long dfn)  	return -EOPNOTSUPP;  } -/* Create an __iomem token from a PCI BAR.  Copied from lib/iomap.c with -   no changes, since we don't want the other things in that object file.  */ - -void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) -{ -	resource_size_t start = pci_resource_start(dev, bar); -	resource_size_t len = pci_resource_len(dev, bar); -	unsigned long flags = pci_resource_flags(dev, bar); - -	if (!len || !start) -		return NULL; -	if (maxlen && len > maxlen) -		len = maxlen; -	if (flags & IORESOURCE_IO) -		return ioport_map(start, len); -	if (flags & IORESOURCE_MEM) { -		/* Not checking IORESOURCE_CACHEABLE because alpha does -		   not distinguish between ioremap and ioremap_nocache.  */ -		return ioremap(start, len); -	} -	return NULL; -} - -/* Destroy that token.  Not copied from lib/iomap.c.  */ +/* Destroy an __iomem token.  Not copied from lib/iomap.c.  */  void pci_iounmap(struct pci_dev *dev, void __iomem * addr)  { @@ -539,7 +429,6 @@ void pci_iounmap(struct pci_dev *dev, void __iomem * addr)  		iounmap(addr);  } -EXPORT_SYMBOL(pci_iomap);  EXPORT_SYMBOL(pci_iounmap);  /* FIXME: Some boxes have multiple ISA bridges! */ diff --git a/arch/alpha/kernel/pci_impl.h b/arch/alpha/kernel/pci_impl.h index 85457b2d451..2b0ac429f5e 100644 --- a/arch/alpha/kernel/pci_impl.h +++ b/arch/alpha/kernel/pci_impl.h @@ -173,9 +173,6 @@ extern void pci_restore_srm_config(void);  extern struct pci_controller *hose_head, **hose_tail;  extern struct pci_controller *pci_isa_hose; -/* Indicate that we trust the console to configure things properly.  */ -extern int pci_probe_only; -  extern unsigned long alpha_agpgart_size;  extern void common_init_pci(void); diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c index 022c2748fa4..eddee772034 100644 --- a/arch/alpha/kernel/pci_iommu.c +++ b/arch/alpha/kernel/pci_iommu.c @@ -7,6 +7,7 @@  #include <linux/pci.h>  #include <linux/gfp.h>  #include <linux/bootmem.h> +#include <linux/export.h>  #include <linux/scatterlist.h>  #include <linux/log2.h>  #include <linux/dma-mapping.h> @@ -235,7 +236,7 @@ static int pci_dac_dma_supported(struct pci_dev *dev, u64 mask)  		ok = 0;  	/* If both conditions above are met, we are fine. */ -	DBGA("pci_dac_dma_supported %s from %p\n", +	DBGA("pci_dac_dma_supported %s from %pf\n",  	     ok ? "yes" : "no", __builtin_return_address(0));  	return ok; @@ -267,7 +268,7 @@ pci_map_single_1(struct pci_dev *pdev, void *cpu_addr, size_t size,  	    && paddr + size <= __direct_map_size) {  		ret = paddr + __direct_map_base; -		DBGA2("pci_map_single: [%p,%zx] -> direct %llx from %p\n", +		DBGA2("pci_map_single: [%p,%zx] -> direct %llx from %pf\n",  		      cpu_addr, size, ret, __builtin_return_address(0));  		return ret; @@ -278,7 +279,7 @@ pci_map_single_1(struct pci_dev *pdev, void *cpu_addr, size_t size,  	if (dac_allowed) {  		ret = paddr + alpha_mv.pci_dac_offset; -		DBGA2("pci_map_single: [%p,%zx] -> DAC %llx from %p\n", +		DBGA2("pci_map_single: [%p,%zx] -> DAC %llx from %pf\n",  		      cpu_addr, size, ret, __builtin_return_address(0));  		return ret; @@ -315,7 +316,7 @@ pci_map_single_1(struct pci_dev *pdev, void *cpu_addr, size_t size,  	ret = arena->dma_base + dma_ofs * PAGE_SIZE;  	ret += (unsigned long)cpu_addr & ~PAGE_MASK; -	DBGA2("pci_map_single: [%p,%zx] np %ld -> sg %llx from %p\n", +	DBGA2("pci_map_single: [%p,%zx] np %ld -> sg %llx from %pf\n",  	      cpu_addr, size, npages, ret, __builtin_return_address(0));  	return ret; @@ -324,7 +325,7 @@ pci_map_single_1(struct pci_dev *pdev, void *cpu_addr, size_t size,  /* Helper for generic DMA-mapping functions. */  static struct pci_dev *alpha_gendev_to_pci(struct device *dev)  { -	if (dev && dev->bus == &pci_bus_type) +	if (dev && dev_is_pci(dev))  		return to_pci_dev(dev);  	/* Assume that non-PCI devices asking for DMA are either ISA or EISA, @@ -353,8 +354,7 @@ static dma_addr_t alpha_pci_map_page(struct device *dev, struct page *page,  	struct pci_dev *pdev = alpha_gendev_to_pci(dev);  	int dac_allowed; -	if (dir == PCI_DMA_NONE) -		BUG(); +	BUG_ON(dir == PCI_DMA_NONE);  	dac_allowed = pdev ? pci_dac_dma_supported(pdev, pdev->dma_mask) : 0;   	return pci_map_single_1(pdev, (char *)page_address(page) + offset,  @@ -377,21 +377,20 @@ static void alpha_pci_unmap_page(struct device *dev, dma_addr_t dma_addr,  	struct pci_iommu_arena *arena;  	long dma_ofs, npages; -	if (dir == PCI_DMA_NONE) -		BUG(); +	BUG_ON(dir == PCI_DMA_NONE);  	if (dma_addr >= __direct_map_base  	    && dma_addr < __direct_map_base + __direct_map_size) {  		/* Nothing to do.  */ -		DBGA2("pci_unmap_single: direct [%llx,%zx] from %p\n", +		DBGA2("pci_unmap_single: direct [%llx,%zx] from %pf\n",  		      dma_addr, size, __builtin_return_address(0));  		return;  	}  	if (dma_addr > 0xffffffff) { -		DBGA2("pci64_unmap_single: DAC [%llx,%zx] from %p\n", +		DBGA2("pci64_unmap_single: DAC [%llx,%zx] from %pf\n",  		      dma_addr, size, __builtin_return_address(0));  		return;  	} @@ -423,7 +422,7 @@ static void alpha_pci_unmap_page(struct device *dev, dma_addr_t dma_addr,  	spin_unlock_irqrestore(&arena->lock, flags); -	DBGA2("pci_unmap_single: sg [%llx,%zx] np %ld from %p\n", +	DBGA2("pci_unmap_single: sg [%llx,%zx] np %ld from %pf\n",  	      dma_addr, size, npages, __builtin_return_address(0));  } @@ -433,7 +432,8 @@ static void alpha_pci_unmap_page(struct device *dev, dma_addr_t dma_addr,     else DMA_ADDRP is undefined.  */  static void *alpha_pci_alloc_coherent(struct device *dev, size_t size, -				      dma_addr_t *dma_addrp, gfp_t gfp) +				      dma_addr_t *dma_addrp, gfp_t gfp, +				      struct dma_attrs *attrs)  {  	struct pci_dev *pdev = alpha_gendev_to_pci(dev);  	void *cpu_addr; @@ -445,7 +445,7 @@ try_again:  	cpu_addr = (void *)__get_free_pages(gfp, order);  	if (! cpu_addr) {  		printk(KERN_INFO "pci_alloc_consistent: " -		       "get_free_pages failed from %p\n", +		       "get_free_pages failed from %pf\n",  			__builtin_return_address(0));  		/* ??? Really atomic allocation?  Otherwise we could play  		   with vmalloc and sg if we can't find contiguous memory.  */ @@ -464,7 +464,7 @@ try_again:  		goto try_again;  	} -	DBGA2("pci_alloc_consistent: %zx -> [%p,%llx] from %p\n", +	DBGA2("pci_alloc_consistent: %zx -> [%p,%llx] from %pf\n",  	      size, cpu_addr, *dma_addrp, __builtin_return_address(0));  	return cpu_addr; @@ -477,13 +477,14 @@ try_again:     DMA_ADDR past this call are illegal.  */  static void alpha_pci_free_coherent(struct device *dev, size_t size, -				    void *cpu_addr, dma_addr_t dma_addr) +				    void *cpu_addr, dma_addr_t dma_addr, +				    struct dma_attrs *attrs)  {  	struct pci_dev *pdev = alpha_gendev_to_pci(dev);  	pci_unmap_single(pdev, dma_addr, size, PCI_DMA_BIDIRECTIONAL);  	free_pages((unsigned long)cpu_addr, get_order(size)); -	DBGA2("pci_free_consistent: [%llx,%zx] from %p\n", +	DBGA2("pci_free_consistent: [%llx,%zx] from %pf\n",  	      dma_addr, size, __builtin_return_address(0));  } @@ -659,8 +660,7 @@ static int alpha_pci_map_sg(struct device *dev, struct scatterlist *sg,  	dma_addr_t max_dma;  	int dac_allowed; -	if (dir == PCI_DMA_NONE) -		BUG(); +	BUG_ON(dir == PCI_DMA_NONE);  	dac_allowed = dev ? pci_dac_dma_supported(pdev, pdev->dma_mask) : 0; @@ -739,8 +739,7 @@ static void alpha_pci_unmap_sg(struct device *dev, struct scatterlist *sg,  	dma_addr_t max_dma;  	dma_addr_t fbeg, fend; -	if (dir == PCI_DMA_NONE) -		BUG(); +	BUG_ON(dir == PCI_DMA_NONE);  	if (! alpha_mv.mv_pci_tbi)  		return; @@ -951,8 +950,8 @@ static int alpha_pci_set_mask(struct device *dev, u64 mask)  }  struct dma_map_ops alpha_pci_ops = { -	.alloc_coherent		= alpha_pci_alloc_coherent, -	.free_coherent		= alpha_pci_free_coherent, +	.alloc			= alpha_pci_alloc_coherent, +	.free			= alpha_pci_free_coherent,  	.map_page		= alpha_pci_map_page,  	.unmap_page		= alpha_pci_unmap_page,  	.map_sg			= alpha_pci_map_sg, diff --git a/arch/alpha/kernel/perf_event.c b/arch/alpha/kernel/perf_event.c index 1cc49683fb6..c52e7f0ee5f 100644 --- a/arch/alpha/kernel/perf_event.c +++ b/arch/alpha/kernel/perf_event.c @@ -14,9 +14,10 @@  #include <linux/kernel.h>  #include <linux/kdebug.h>  #include <linux/mutex.h> +#include <linux/init.h>  #include <asm/hwrpb.h> -#include <asm/atomic.h> +#include <linux/atomic.h>  #include <asm/irq.h>  #include <asm/irq_regs.h>  #include <asm/pal.h> @@ -82,6 +83,8 @@ struct alpha_pmu_t {  	long pmc_left[3];  	 /* Subroutine for allocation of PMCs.  Enforces constraints. */  	int (*check_constraints)(struct perf_event **, unsigned long *, int); +	/* Subroutine for checking validity of a raw event for this PMU. */ +	int (*raw_event_valid)(u64 config);  };  /* @@ -202,6 +205,12 @@ success:  } +static int ev67_raw_event_valid(u64 config) +{ +	return config >= EV67_CYCLES && config < EV67_LAST_ET; +}; + +  static const struct alpha_pmu_t ev67_pmu = {  	.event_map = ev67_perfmon_event_map,  	.max_events = ARRAY_SIZE(ev67_perfmon_event_map), @@ -210,7 +219,8 @@ static const struct alpha_pmu_t ev67_pmu = {  	.pmc_count_mask = {EV67_PCTR_0_COUNT_MASK,  EV67_PCTR_1_COUNT_MASK,  0},  	.pmc_max_period = {(1UL<<20) - 1, (1UL<<20) - 1, 0},  	.pmc_left = {16, 4, 0}, -	.check_constraints = ev67_check_constraints +	.check_constraints = ev67_check_constraints, +	.raw_event_valid = ev67_raw_event_valid,  }; @@ -608,7 +618,9 @@ static int __hw_perf_event_init(struct perf_event *event)  	} else if (attr->type == PERF_TYPE_HW_CACHE) {  		return -EOPNOTSUPP;  	} else if (attr->type == PERF_TYPE_RAW) { -		ev = attr->config & 0xff; +		if (!alpha_pmu->raw_event_valid(attr->config)) +			return -EINVAL; +		ev = attr->config;  	} else {  		return -EOPNOTSUPP;  	} @@ -684,6 +696,10 @@ static int alpha_pmu_event_init(struct perf_event *event)  {  	int err; +	/* does not support taken branch sampling */ +	if (has_branch_stack(event)) +		return -EOPNOTSUPP; +  	switch (event->attr.type) {  	case PERF_TYPE_RAW:  	case PERF_TYPE_HARDWARE: @@ -819,7 +835,6 @@ static void alpha_perf_event_irq_handler(unsigned long la_ptr,  	idx = la_ptr; -	perf_sample_data_init(&data, 0);  	for (j = 0; j < cpuc->n_events; j++) {  		if (cpuc->current_idx[j] == idx)  			break; @@ -843,10 +858,10 @@ static void alpha_perf_event_irq_handler(unsigned long la_ptr,  	hwc = &event->hw;  	alpha_perf_event_update(event, hwc, idx, alpha_pmu->pmc_max_period[idx]+1); -	data.period = event->hw.last_period; +	perf_sample_data_init(&data, 0, hwc->last_period);  	if (alpha_perf_event_set_period(event, hwc, idx)) { -		if (perf_event_overflow(event, 1, &data, regs)) { +		if (perf_event_overflow(event, &data, regs)) {  			/* Interrupts coming too quickly; "throttle" the  			 * counter, i.e., disable it for a little while.  			 */ @@ -863,13 +878,13 @@ static void alpha_perf_event_irq_handler(unsigned long la_ptr,  /*   * Init call to initialise performance events at kernel startup.   */ -void __init init_hw_perf_events(void) +int __init init_hw_perf_events(void)  {  	pr_info("Performance events: ");  	if (!supported_cpu()) {  		pr_cont("No support for your CPU.\n"); -		return; +		return 0;  	}  	pr_cont("Supported CPU type!\n"); @@ -881,6 +896,8 @@ void __init init_hw_perf_events(void)  	/* And set up PMU specification */  	alpha_pmu = &ev67_pmu; -	perf_pmu_register(&pmu); -} +	perf_pmu_register(&pmu, "cpu", PERF_TYPE_RAW); +	return 0; +} +early_initcall(init_hw_perf_events); diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c index 3ec35066f1d..1941a07b581 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c @@ -28,10 +28,10 @@  #include <linux/tty.h>  #include <linux/console.h>  #include <linux/slab.h> +#include <linux/rcupdate.h>  #include <asm/reg.h>  #include <asm/uaccess.h> -#include <asm/system.h>  #include <asm/io.h>  #include <asm/pgtable.h>  #include <asm/hwrpb.h> @@ -46,21 +46,22 @@  void (*pm_power_off)(void) = machine_power_off;  EXPORT_SYMBOL(pm_power_off); -void -cpu_idle(void) +#ifdef CONFIG_ALPHA_WTINT +/* + * Sleep the CPU. + * EV6, LCA45 and QEMU know how to power down, skipping N timer interrupts. + */ +void arch_cpu_idle(void)  { -	set_thread_flag(TIF_POLLING_NRFLAG); - -	while (1) { -		/* FIXME -- EV6 and LCA45 know how to power down -		   the CPU.  */ - -		while (!need_resched()) -			cpu_relax(); -		schedule(); -	} +	wtint(0); +	local_irq_enable();  } +void arch_cpu_idle_dead(void) +{ +	wtint(INT_MAX); +} +#endif /* ALPHA_WTINT */  struct halt_info {  	int mode; @@ -121,7 +122,7 @@ common_shutdown_1(void *generic_ptr)  	/* Wait for the secondaries to halt. */  	set_cpu_present(boot_cpuid, false);  	set_cpu_possible(boot_cpuid, false); -	while (cpus_weight(cpu_present_map)) +	while (cpumask_weight(cpu_present_mask))  		barrier();  #endif @@ -133,7 +134,9 @@ common_shutdown_1(void *generic_ptr)  		if (in_interrupt())  			irq_exit();  		/* This has the effect of resetting the VGA video origin.  */ -		take_over_console(&dummy_con, 0, MAX_NR_CONSOLES-1, 1); +		console_lock(); +		do_take_over_console(&dummy_con, 0, MAX_NR_CONSOLES-1, 1); +		console_unlock();  #endif  		pci_restore_srm_config();  		set_hae(srm_hae); @@ -191,6 +194,7 @@ machine_power_off(void)  void  show_regs(struct pt_regs *regs)  { +	show_regs_print_info(KERN_DEFAULT);  	dik_show_regs(regs, NULL);  } @@ -200,7 +204,6 @@ show_regs(struct pt_regs *regs)  void  start_thread(struct pt_regs * regs, unsigned long pc, unsigned long sp)  { -	set_fs(USER_DS);  	regs->pc = pc;  	regs->ps = 8;  	wrusp(sp); @@ -233,87 +236,53 @@ release_thread(struct task_struct *dead_task)  }  /* - * "alpha_clone()".. By the time we get here, the - * non-volatile registers have also been saved on the - * stack. We do some ugly pointer stuff here.. (see - * also copy_thread) - * - * Notice that "fork()" is implemented in terms of clone, - * with parameters (SIGCHLD, 0). - */ -int -alpha_clone(unsigned long clone_flags, unsigned long usp, -	    int __user *parent_tid, int __user *child_tid, -	    unsigned long tls_value, struct pt_regs *regs) -{ -	if (!usp) -		usp = rdusp(); - -	return do_fork(clone_flags, usp, regs, 0, parent_tid, child_tid); -} - -int -alpha_vfork(struct pt_regs *regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), -		       regs, 0, NULL, NULL); -} - -/*   * Copy an alpha thread.. - * - * Note the "stack_offset" stuff: when returning to kernel mode, we need - * to have some extra stack-space for the kernel stack that still exists - * after the "ret_from_fork".  When returning to user mode, we only want - * the space needed by the syscall stack frame (ie "struct pt_regs"). - * Use the passed "regs" pointer to determine how much space we need - * for a kernel fork().   */  int  copy_thread(unsigned long clone_flags, unsigned long usp, -	    unsigned long unused, -	    struct task_struct * p, struct pt_regs * regs) +	    unsigned long arg, +	    struct task_struct *p)  {  	extern void ret_from_fork(void); +	extern void ret_from_kernel_thread(void);  	struct thread_info *childti = task_thread_info(p); -	struct pt_regs * childregs; -	struct switch_stack * childstack, *stack; -	unsigned long stack_offset, settls; - -	stack_offset = PAGE_SIZE - sizeof(struct pt_regs); -	if (!(regs->ps & 8)) -		stack_offset = (PAGE_SIZE-1) & (unsigned long) regs; -	childregs = (struct pt_regs *) -	  (stack_offset + PAGE_SIZE + task_stack_page(p)); -		 -	*childregs = *regs; -	settls = regs->r20; -	childregs->r0 = 0; -	childregs->r19 = 0; -	childregs->r20 = 1;	/* OSF/1 has some strange fork() semantics.  */ -	regs->r20 = 0; -	stack = ((struct switch_stack *) regs) - 1; +	struct pt_regs *childregs = task_pt_regs(p); +	struct pt_regs *regs = current_pt_regs(); +	struct switch_stack *childstack, *stack; +  	childstack = ((struct switch_stack *) childregs) - 1; -	*childstack = *stack; -	childstack->r26 = (unsigned long) ret_from_fork; -	childti->pcb.usp = usp;  	childti->pcb.ksp = (unsigned long) childstack;  	childti->pcb.flags = 1;	/* set FEN, clear everything else */ -	/* Set a new TLS for the child thread?  Peek back into the -	   syscall arguments that we saved on syscall entry.  Oops, -	   except we'd have clobbered it with the parent/child set -	   of r20.  Read the saved copy.  */ +	if (unlikely(p->flags & PF_KTHREAD)) { +		/* kernel thread */ +		memset(childstack, 0, +			sizeof(struct switch_stack) + sizeof(struct pt_regs)); +		childstack->r26 = (unsigned long) ret_from_kernel_thread; +		childstack->r9 = usp;	/* function */ +		childstack->r10 = arg; +		childregs->hae = alpha_mv.hae_cache, +		childti->pcb.usp = 0; +		return 0; +	}  	/* Note: if CLONE_SETTLS is not set, then we must inherit the  	   value from the parent, which will have been set by the block  	   copy in dup_task_struct.  This is non-intuitive, but is  	   required for proper operation in the case of a threaded  	   application calling fork.  */  	if (clone_flags & CLONE_SETTLS) -		childti->pcb.unique = settls; - +		childti->pcb.unique = regs->r20; +	childti->pcb.usp = usp ?: rdusp(); +	*childregs = *regs; +	childregs->r0 = 0; +	childregs->r19 = 0; +	childregs->r20 = 1;	/* OSF/1 has some strange fork() semantics.  */ +	regs->r20 = 0; +	stack = ((struct switch_stack *) regs) - 1; +	*childstack = *stack; +	childstack->r26 = (unsigned long) ret_from_fork;  	return 0;  } @@ -384,27 +353,6 @@ dump_elf_task_fp(elf_fpreg_t *dest, struct task_struct *task)  EXPORT_SYMBOL(dump_elf_task_fp);  /* - * sys_execve() executes a new program. - */ -asmlinkage int -do_sys_execve(const char __user *ufilename, -	      const char __user *const __user *argv, -	      const char __user *const __user *envp, struct pt_regs *regs) -{ -	int error; -	char *filename; - -	filename = getname(ufilename); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = do_execve(filename, argv, envp, regs); -	putname(filename); -out: -	return error; -} - -/*   * Return saved PC of a blocked thread.  This assumes the frame   * pointer is the 6th saved long on the kernel stack and that the   * saved return address is the first long in the frame.  This all diff --git a/arch/alpha/kernel/proto.h b/arch/alpha/kernel/proto.h index d3e52d3fd59..da2d6ec9c37 100644 --- a/arch/alpha/kernel/proto.h +++ b/arch/alpha/kernel/proto.h @@ -135,17 +135,15 @@ extern void unregister_srm_console(void);  /* smp.c */  extern void setup_smp(void);  extern void handle_ipi(struct pt_regs *); -extern void smp_percpu_timer_interrupt(struct pt_regs *);  /* bios32.c */  /* extern void reset_for_srm(void); */  /* time.c */ -extern irqreturn_t timer_interrupt(int irq, void *dev); +extern irqreturn_t rtc_timer_interrupt(int irq, void *dev); +extern void init_clockevent(void);  extern void common_init_rtc(void);  extern unsigned long est_cycle_freq; -extern unsigned int common_get_rtc_time(struct rtc_time *time); -extern int common_set_rtc_time(struct rtc_time *time);  /* smc37c93x.c */  extern void SMC93x_Init(void); diff --git a/arch/alpha/kernel/ptrace.c b/arch/alpha/kernel/ptrace.c index e2af5eb59bb..86d835157b5 100644 --- a/arch/alpha/kernel/ptrace.c +++ b/arch/alpha/kernel/ptrace.c @@ -13,10 +13,11 @@  #include <linux/user.h>  #include <linux/security.h>  #include <linux/signal.h> +#include <linux/tracehook.h> +#include <linux/audit.h>  #include <asm/uaccess.h>  #include <asm/pgtable.h> -#include <asm/system.h>  #include <asm/fpu.h>  #include "proto.h" @@ -313,25 +314,21 @@ long arch_ptrace(struct task_struct *child, long request,  	return ret;  } +asmlinkage unsigned long syscall_trace_enter(void) +{ +	unsigned long ret = 0; +	struct pt_regs *regs = current_pt_regs(); +	if (test_thread_flag(TIF_SYSCALL_TRACE) && +	    tracehook_report_syscall_entry(current_pt_regs())) +		ret = -1UL; +	audit_syscall_entry(AUDIT_ARCH_ALPHA, regs->r0, regs->r16, regs->r17, regs->r18, regs->r19); +	return ret ?: current_pt_regs()->r0; +} +  asmlinkage void -syscall_trace(void) +syscall_trace_leave(void)  { -	if (!test_thread_flag(TIF_SYSCALL_TRACE)) -		return; -	if (!(current->ptrace & PT_PTRACED)) -		return; -	/* The 0x80 provides a way for the tracing parent to distinguish -	   between a syscall stop and SIGTRAP delivery */ -	ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) -				 ? 0x80 : 0)); - -	/* -	 * This isn't the same as continuing with a signal, but it will do -	 * for normal use.  strace only continues with a signal if the -	 * stopping signal is not SIGTRAP.  -brl -	 */ -	if (current->exit_code) { -		send_sig(current->exit_code, current, 1); -		current->exit_code = 0; -	} +	audit_syscall_exit(current_pt_regs()); +	if (test_thread_flag(TIF_SYSCALL_TRACE)) +		tracehook_report_syscall_exit(current_pt_regs(), 0);  } diff --git a/arch/alpha/kernel/rtc.c b/arch/alpha/kernel/rtc.c new file mode 100644 index 00000000000..c8d284d8521 --- /dev/null +++ b/arch/alpha/kernel/rtc.c @@ -0,0 +1,323 @@ +/* + *  linux/arch/alpha/kernel/rtc.c + * + *  Copyright (C) 1991, 1992, 1995, 1999, 2000  Linus Torvalds + * + * This file contains date handling. + */ +#include <linux/errno.h> +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/param.h> +#include <linux/string.h> +#include <linux/mc146818rtc.h> +#include <linux/bcd.h> +#include <linux/rtc.h> +#include <linux/platform_device.h> + +#include <asm/rtc.h> + +#include "proto.h" + + +/* + * Support for the RTC device. + * + * We don't want to use the rtc-cmos driver, because we don't want to support + * alarms, as that would be indistinguishable from timer interrupts. + * + * Further, generic code is really, really tied to a 1900 epoch.  This is + * true in __get_rtc_time as well as the users of struct rtc_time e.g. + * rtc_tm_to_time.  Thankfully all of the other epochs in use are later + * than 1900, and so it's easy to adjust. + */ + +static unsigned long rtc_epoch; + +static int __init +specifiy_epoch(char *str) +{ +	unsigned long epoch = simple_strtoul(str, NULL, 0); +	if (epoch < 1900) +		printk("Ignoring invalid user specified epoch %lu\n", epoch); +	else +		rtc_epoch = epoch; +	return 1; +} +__setup("epoch=", specifiy_epoch); + +static void __init +init_rtc_epoch(void) +{ +	int epoch, year, ctrl; + +	if (rtc_epoch != 0) { +		/* The epoch was specified on the command-line.  */ +		return; +	} + +	/* Detect the epoch in use on this computer.  */ +	ctrl = CMOS_READ(RTC_CONTROL); +	year = CMOS_READ(RTC_YEAR); +	if (!(ctrl & RTC_DM_BINARY) || RTC_ALWAYS_BCD) +		year = bcd2bin(year); + +	/* PC-like is standard; used for year >= 70 */ +	epoch = 1900; +	if (year < 20) { +		epoch = 2000; +	} else if (year >= 20 && year < 48) { +		/* NT epoch */ +		epoch = 1980; +	} else if (year >= 48 && year < 70) { +		/* Digital UNIX epoch */ +		epoch = 1952; +	} +	rtc_epoch = epoch; + +	printk(KERN_INFO "Using epoch %d for rtc year %d\n", epoch, year); +} + +static int +alpha_rtc_read_time(struct device *dev, struct rtc_time *tm) +{ +	__get_rtc_time(tm); + +	/* Adjust for non-default epochs.  It's easier to depend on the +	   generic __get_rtc_time and adjust the epoch here than create +	   a copy of __get_rtc_time with the edits we need.  */ +	if (rtc_epoch != 1900) { +		int year = tm->tm_year; +		/* Undo the century adjustment made in __get_rtc_time.  */ +		if (year >= 100) +			year -= 100; +		year += rtc_epoch - 1900; +		/* Redo the century adjustment with the epoch in place.  */ +		if (year <= 69) +			year += 100; +		tm->tm_year = year; +	} + +	return rtc_valid_tm(tm); +} + +static int +alpha_rtc_set_time(struct device *dev, struct rtc_time *tm) +{ +	struct rtc_time xtm; + +	if (rtc_epoch != 1900) { +		xtm = *tm; +		xtm.tm_year -= rtc_epoch - 1900; +		tm = &xtm; +	} + +	return __set_rtc_time(tm); +} + +static int +alpha_rtc_set_mmss(struct device *dev, unsigned long nowtime) +{ +	int retval = 0; +	int real_seconds, real_minutes, cmos_minutes; +	unsigned char save_control, save_freq_select; + +	/* Note: This code only updates minutes and seconds.  Comments +	   indicate this was to avoid messing with unknown time zones, +	   and with the epoch nonsense described above.  In order for +	   this to work, the existing clock cannot be off by more than +	   15 minutes. + +	   ??? This choice is may be out of date.  The x86 port does +	   not have problems with timezones, and the epoch processing has +	   now been fixed in alpha_set_rtc_time. + +	   In either case, one can always force a full rtc update with +	   the userland hwclock program, so surely 15 minute accuracy +	   is no real burden.  */ + +	/* In order to set the CMOS clock precisely, we have to be called +	   500 ms after the second nowtime has started, because when +	   nowtime is written into the registers of the CMOS clock, it will +	   jump to the next second precisely 500 ms later. Check the Motorola +	   MC146818A or Dallas DS12887 data sheet for details.  */ + +	/* irq are locally disabled here */ +	spin_lock(&rtc_lock); +	/* Tell the clock it's being set */ +	save_control = CMOS_READ(RTC_CONTROL); +	CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL); + +	/* Stop and reset prescaler */ +	save_freq_select = CMOS_READ(RTC_FREQ_SELECT); +	CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT); + +	cmos_minutes = CMOS_READ(RTC_MINUTES); +	if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) +		cmos_minutes = bcd2bin(cmos_minutes); + +	real_seconds = nowtime % 60; +	real_minutes = nowtime / 60; +	if (((abs(real_minutes - cmos_minutes) + 15) / 30) & 1) { +		/* correct for half hour time zone */ +		real_minutes += 30; +	} +	real_minutes %= 60; + +	if (abs(real_minutes - cmos_minutes) < 30) { +		if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { +			real_seconds = bin2bcd(real_seconds); +			real_minutes = bin2bcd(real_minutes); +		} +		CMOS_WRITE(real_seconds,RTC_SECONDS); +		CMOS_WRITE(real_minutes,RTC_MINUTES); +	} else { +		printk_once(KERN_NOTICE +			    "set_rtc_mmss: can't update from %d to %d\n", +			    cmos_minutes, real_minutes); +		retval = -1; +	} + +	/* The following flags have to be released exactly in this order, +	 * otherwise the DS12887 (popular MC146818A clone with integrated +	 * battery and quartz) will not reset the oscillator and will not +	 * update precisely 500 ms later. You won't find this mentioned in +	 * the Dallas Semiconductor data sheets, but who believes data +	 * sheets anyway ...                           -- Markus Kuhn +	 */ +	CMOS_WRITE(save_control, RTC_CONTROL); +	CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT); +	spin_unlock(&rtc_lock); + +	return retval; +} + +static int +alpha_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) +{ +	switch (cmd) { +	case RTC_EPOCH_READ: +		return put_user(rtc_epoch, (unsigned long __user *)arg); +	case RTC_EPOCH_SET: +		if (arg < 1900) +			return -EINVAL; +		rtc_epoch = arg; +		return 0; +	default: +		return -ENOIOCTLCMD; +	} +} + +static const struct rtc_class_ops alpha_rtc_ops = { +	.read_time = alpha_rtc_read_time, +	.set_time = alpha_rtc_set_time, +	.set_mmss = alpha_rtc_set_mmss, +	.ioctl = alpha_rtc_ioctl, +}; + +/* + * Similarly, except do the actual CMOS access on the boot cpu only. + * This requires marshalling the data across an interprocessor call. + */ + +#if defined(CONFIG_SMP) && \ +    (defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_MARVEL)) +# define HAVE_REMOTE_RTC 1 + +union remote_data { +	struct rtc_time *tm; +	unsigned long now; +	long retval; +}; + +static void +do_remote_read(void *data) +{ +	union remote_data *x = data; +	x->retval = alpha_rtc_read_time(NULL, x->tm); +} + +static int +remote_read_time(struct device *dev, struct rtc_time *tm) +{ +	union remote_data x; +	if (smp_processor_id() != boot_cpuid) { +		x.tm = tm; +		smp_call_function_single(boot_cpuid, do_remote_read, &x, 1); +		return x.retval; +	} +	return alpha_rtc_read_time(NULL, tm); +} + +static void +do_remote_set(void *data) +{ +	union remote_data *x = data; +	x->retval = alpha_rtc_set_time(NULL, x->tm); +} + +static int +remote_set_time(struct device *dev, struct rtc_time *tm) +{ +	union remote_data x; +	if (smp_processor_id() != boot_cpuid) { +		x.tm = tm; +		smp_call_function_single(boot_cpuid, do_remote_set, &x, 1); +		return x.retval; +	} +	return alpha_rtc_set_time(NULL, tm); +} + +static void +do_remote_mmss(void *data) +{ +	union remote_data *x = data; +	x->retval = alpha_rtc_set_mmss(NULL, x->now); +} + +static int +remote_set_mmss(struct device *dev, unsigned long now) +{ +	union remote_data x; +	if (smp_processor_id() != boot_cpuid) { +		x.now = now; +		smp_call_function_single(boot_cpuid, do_remote_mmss, &x, 1); +		return x.retval; +	} +	return alpha_rtc_set_mmss(NULL, now); +} + +static const struct rtc_class_ops remote_rtc_ops = { +	.read_time = remote_read_time, +	.set_time = remote_set_time, +	.set_mmss = remote_set_mmss, +	.ioctl = alpha_rtc_ioctl, +}; +#endif + +static int __init +alpha_rtc_init(void) +{ +	const struct rtc_class_ops *ops; +	struct platform_device *pdev; +	struct rtc_device *rtc; +	const char *name; + +	init_rtc_epoch(); +	name = "rtc-alpha"; +	ops = &alpha_rtc_ops; + +#ifdef HAVE_REMOTE_RTC +	if (alpha_mv.rtc_boot_cpu_only) +		ops = &remote_rtc_ops; +#endif + +	pdev = platform_device_register_simple(name, -1, NULL, 0); +	rtc = devm_rtc_device_register(&pdev->dev, name, ops, THIS_MODULE); +	if (IS_ERR(rtc)) +		return PTR_ERR(rtc); + +	platform_set_drvdata(pdev, rtc); +	return 0; +} +device_initcall(alpha_rtc_init); diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c index d2634e4476b..b20af76f12c 100644 --- a/arch/alpha/kernel/setup.c +++ b/arch/alpha/kernel/setup.c @@ -43,6 +43,7 @@  #include <asm/setup.h>  #include <asm/io.h>  #include <linux/log2.h> +#include <linux/export.h>  extern struct atomic_notifier_head panic_notifier_list;  static int alpha_panic_event(struct notifier_block *, unsigned long, void *); @@ -54,7 +55,6 @@ static struct notifier_block alpha_panic_block = {  #include <asm/uaccess.h>  #include <asm/pgtable.h> -#include <asm/system.h>  #include <asm/hwrpb.h>  #include <asm/dma.h>  #include <asm/mmu_context.h> @@ -115,10 +115,17 @@ unsigned long alpha_agpgart_size = DEFAULT_AGP_APER_SIZE;  #ifdef CONFIG_ALPHA_GENERIC  struct alpha_machine_vector alpha_mv; +#endif + +#ifndef alpha_using_srm  int alpha_using_srm;  EXPORT_SYMBOL(alpha_using_srm);  #endif +#ifndef alpha_using_qemu +int alpha_using_qemu; +#endif +  static struct alpha_machine_vector *get_sysvec(unsigned long, unsigned long,  					       unsigned long);  static struct alpha_machine_vector *get_sysvec_byname(const char *); @@ -529,11 +536,15 @@ setup_arch(char **cmdline_p)  	atomic_notifier_chain_register(&panic_notifier_list,  			&alpha_panic_block); -#ifdef CONFIG_ALPHA_GENERIC +#ifndef alpha_using_srm  	/* Assume that we've booted from SRM if we haven't booted from MILO.  	   Detect the later by looking for "MILO" in the system serial nr.  */  	alpha_using_srm = strncmp((const char *)hwrpb->ssn, "MILO", 4) != 0;  #endif +#ifndef alpha_using_qemu +	/* Similarly, look for QEMU.  */ +	alpha_using_qemu = strstr((const char *)hwrpb->ssn, "QEMU") != 0; +#endif  	/* If we are using SRM, we want to allow callbacks  	   as early as possible, so do this NOW, and then @@ -1207,6 +1218,7 @@ show_cpuinfo(struct seq_file *f, void *slot)  	char *systype_name;  	char *sysvariation_name;  	int nr_processors; +	unsigned long timer_freq;  	cpu_index = (unsigned) (cpu->type - 1);  	cpu_name = "Unknown"; @@ -1218,6 +1230,12 @@ show_cpuinfo(struct seq_file *f, void *slot)  	nr_processors = get_nr_processors(cpu, hwrpb->nr_processors); +#if CONFIG_HZ == 1024 || CONFIG_HZ == 1200 +	timer_freq = (100UL * hwrpb->intr_freq) / 4096; +#else +	timer_freq = 100UL * CONFIG_HZ; +#endif +  	seq_printf(f, "cpu\t\t\t: Alpha\n"  		      "cpu model\t\t: %s\n"  		      "cpu variation\t\t: %ld\n" @@ -1243,8 +1261,7 @@ show_cpuinfo(struct seq_file *f, void *slot)  		       (char*)hwrpb->ssn,  		       est_cycle_freq ? : hwrpb->cycle_freq,  		       est_cycle_freq ? "est." : "", -		       hwrpb->intr_freq / 4096, -		       (100 * hwrpb->intr_freq / 4096) % 100, +		       timer_freq / 100, timer_freq % 100,  		       hwrpb->pagesize,  		       hwrpb->pa_bits,  		       hwrpb->max_asn, @@ -1257,7 +1274,7 @@ show_cpuinfo(struct seq_file *f, void *slot)  #ifdef CONFIG_SMP  	seq_printf(f, "cpus active\t\t: %u\n"  		      "cpu active mask\t\t: %016lx\n", -		       num_online_cpus(), cpus_addr(cpu_possible_map)[0]); +		       num_online_cpus(), cpumask_bits(cpu_possible_mask)[0]);  #endif  	show_cache_size (f, "L1 Icache", alpha_l1i_cacheshape); @@ -1404,8 +1421,6 @@ determine_cpu_caches (unsigned int cpu_type)  	case PCA56_CPU:  	case PCA57_CPU:  	  { -		unsigned long cbox_config, size; -  		if (cpu_type == PCA56_CPU) {  			L1I = CSHAPE(16*1024, 6, 1);  			L1D = CSHAPE(8*1024, 5, 1); @@ -1415,10 +1430,12 @@ determine_cpu_caches (unsigned int cpu_type)  		}  		L3 = -1; +#if 0 +		unsigned long cbox_config, size; +  		cbox_config = *(vulp) phys_to_virt (0xfffff00008UL);  		size = 512*1024 * (1 << ((cbox_config >> 12) & 3)); -#if 0  		L2 = ((cbox_config >> 31) & 1 ? CSHAPE (size, 6, 1) : -1);  #else  		L2 = external_cache_probe(512*1024, 6); diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 6f7feb5db27..6cec2881acb 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c @@ -34,9 +34,6 @@  #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))  asmlinkage void ret_from_sys_call(void); -static void do_signal(struct pt_regs *, struct switch_stack *, -		      unsigned long, unsigned long); -  /*   * The OSF/1 sigprocmask calling sequence is different from the @@ -116,30 +113,6 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,  }  /* - * Atomically swap in the new signal mask, and wait for a signal. - */ -SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask) -{ -	mask &= _BLOCKABLE; -	spin_lock_irq(¤t->sighand->siglock); -	current->saved_sigmask = current->blocked; -	siginitset(¤t->blocked, mask); -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); -	return -ERESTARTNOHAND; -} - -asmlinkage int -sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss) -{ -	return do_sigaltstack(uss, uoss, rdusp()); -} - -/*   * Do a signal return; undo the signal stack.   */ @@ -171,10 +144,10 @@ extern char compile_time_assert  #define INSN_CALLSYS		0x00000083  static long -restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, -		   struct switch_stack *sw) +restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs)  {  	unsigned long usp; +	struct switch_stack *sw = (struct switch_stack *)regs - 1;  	long i, err = __get_user(regs->pc, &sc->sc_pc);  	current_thread_info()->restart_block.fn = do_no_restart_syscall; @@ -226,9 +199,9 @@ restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,     registers and transfer control from userland.  */  asmlinkage void -do_sigreturn(struct sigcontext __user *sc, struct pt_regs *regs, -	     struct switch_stack *sw) +do_sigreturn(struct sigcontext __user *sc)  { +	struct pt_regs *regs = current_pt_regs();  	sigset_t set;  	/* Verify that it's a good sigcontext before using it */ @@ -237,13 +210,9 @@ do_sigreturn(struct sigcontext __user *sc, struct pt_regs *regs,  	if (__get_user(set.sig[0], &sc->sc_mask))  		goto give_sigsegv; -	sigdelsetmask(&set, ~_BLOCKABLE); -	spin_lock_irq(¤t->sighand->siglock); -	current->blocked = set; -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); +	set_current_blocked(&set); -	if (restore_sigcontext(sc, regs, sw)) +	if (restore_sigcontext(sc, regs))  		goto give_sigsegv;  	/* Send SIGTRAP if we're single-stepping: */ @@ -264,9 +233,9 @@ give_sigsegv:  }  asmlinkage void -do_rt_sigreturn(struct rt_sigframe __user *frame, struct pt_regs *regs, -		struct switch_stack *sw) +do_rt_sigreturn(struct rt_sigframe __user *frame)  { +	struct pt_regs *regs = current_pt_regs();  	sigset_t set;  	/* Verify that it's a good ucontext_t before using it */ @@ -275,13 +244,9 @@ do_rt_sigreturn(struct rt_sigframe __user *frame, struct pt_regs *regs,  	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))  		goto give_sigsegv; -	sigdelsetmask(&set, ~_BLOCKABLE); -	spin_lock_irq(¤t->sighand->siglock); -	current->blocked = set; -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); +	set_current_blocked(&set); -	if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw)) +	if (restore_sigcontext(&frame->uc.uc_mcontext, regs))  		goto give_sigsegv;  	/* Send SIGTRAP if we're single-stepping: */ @@ -307,18 +272,16 @@ give_sigsegv:   */  static inline void __user * -get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size) +get_sigframe(struct ksignal *ksig, unsigned long sp, size_t frame_size)  { -	if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp)) -		sp = current->sas_ss_sp + current->sas_ss_size; - -	return (void __user *)((sp - frame_size) & -32ul); +	return (void __user *)((sigsp(sp, ksig) - frame_size) & -32ul);  }  static long  setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,  -		 struct switch_stack *sw, unsigned long mask, unsigned long sp) +		 unsigned long mask, unsigned long sp)  { +	struct switch_stack *sw = (struct switch_stack *)regs - 1;  	long i, err = 0;  	err |= __put_user(on_sig_stack((unsigned long)sc), &sc->sc_onstack); @@ -372,26 +335,24 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,  }  static int -setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, -	    struct pt_regs *regs, struct switch_stack * sw) +setup_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)  {  	unsigned long oldsp, r26, err = 0;  	struct sigframe __user *frame;  	oldsp = rdusp(); -	frame = get_sigframe(ka, oldsp, sizeof(*frame)); +	frame = get_sigframe(ksig, oldsp, sizeof(*frame));  	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) -		goto give_sigsegv; +		return -EFAULT; -	err |= setup_sigcontext(&frame->sc, regs, sw, set->sig[0], oldsp); +	err |= setup_sigcontext(&frame->sc, regs, set->sig[0], oldsp);  	if (err) -		goto give_sigsegv; +		return -EFAULT;  	/* Set up to return from userspace.  If provided, use a stub  	   already in userspace.  */ -	if (ka->ka_restorer) { -		r26 = (unsigned long) ka->ka_restorer; -	} else { +	r26 = (unsigned long) ksig->ka.ka_restorer; +	if (!r26) {  		err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0);  		err |= __put_user(INSN_LDI_R0+__NR_sigreturn, frame->retcode+1);  		err |= __put_user(INSN_CALLSYS, frame->retcode+2); @@ -401,12 +362,12 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,  	/* Check that everything was written properly.  */  	if (err) -		goto give_sigsegv; +		return err;  	/* "Return" to the handler */  	regs->r26 = r26; -	regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler; -	regs->r16 = sig;			/* a0: signal number */ +	regs->r27 = regs->pc = (unsigned long) ksig->ka.sa.sa_handler; +	regs->r16 = ksig->sig;			/* a0: signal number */  	regs->r17 = 0;				/* a1: exception code */  	regs->r18 = (unsigned long) &frame->sc;	/* a2: sigcontext pointer */  	wrusp((unsigned long) frame); @@ -415,46 +376,37 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,  	printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",  		current->comm, current->pid, frame, regs->pc, regs->r26);  #endif -  	return 0; - -give_sigsegv: -	force_sigsegv(sig, current); -	return -EFAULT;  }  static int -setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, -	       sigset_t *set, struct pt_regs *regs, struct switch_stack * sw) +setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)  {  	unsigned long oldsp, r26, err = 0;  	struct rt_sigframe __user *frame;  	oldsp = rdusp(); -	frame = get_sigframe(ka, oldsp, sizeof(*frame)); +	frame = get_sigframe(ksig, oldsp, sizeof(*frame));  	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) -		goto give_sigsegv; +		return -EFAULT; -	err |= copy_siginfo_to_user(&frame->info, info); +	err |= copy_siginfo_to_user(&frame->info, &ksig->info);  	/* Create the ucontext.  */  	err |= __put_user(0, &frame->uc.uc_flags);  	err |= __put_user(0, &frame->uc.uc_link);  	err |= __put_user(set->sig[0], &frame->uc.uc_osf_sigmask); -	err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); -	err |= __put_user(sas_ss_flags(oldsp), &frame->uc.uc_stack.ss_flags); -	err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); -	err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, sw, +	err |= __save_altstack(&frame->uc.uc_stack, oldsp); +	err |= setup_sigcontext(&frame->uc.uc_mcontext, regs,   				set->sig[0], oldsp);  	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));  	if (err) -		goto give_sigsegv; +		return -EFAULT;  	/* Set up to return from userspace.  If provided, use a stub  	   already in userspace.  */ -	if (ka->ka_restorer) { -		r26 = (unsigned long) ka->ka_restorer; -	} else { +	r26 = (unsigned long) ksig->ka.ka_restorer; +	if (!r26) {  		err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0);  		err |= __put_user(INSN_LDI_R0+__NR_rt_sigreturn,  				  frame->retcode+1); @@ -464,12 +416,12 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  	}  	if (err) -		goto give_sigsegv; +		return -EFAULT;  	/* "Return" to the handler */  	regs->r26 = r26; -	regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler; -	regs->r16 = sig;			  /* a0: signal number */ +	regs->r27 = regs->pc = (unsigned long) ksig->ka.sa.sa_handler; +	regs->r16 = ksig->sig;			  /* a0: signal number */  	regs->r17 = (unsigned long) &frame->info; /* a1: siginfo pointer */  	regs->r18 = (unsigned long) &frame->uc;	  /* a2: ucontext pointer */  	wrusp((unsigned long) frame); @@ -480,37 +432,24 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  #endif  	return 0; - -give_sigsegv: -	force_sigsegv(sig, current); -	return -EFAULT;  }  /*   * OK, we're invoking a handler.   */ -static inline int -handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, -	      sigset_t *oldset, struct pt_regs * regs, struct switch_stack *sw) +static inline void +handle_signal(struct ksignal *ksig, struct pt_regs *regs)  { +	sigset_t *oldset = sigmask_to_save();  	int ret; -	if (ka->sa.sa_flags & SA_SIGINFO) -		ret = setup_rt_frame(sig, ka, info, oldset, regs, sw); +	if (ksig->ka.sa.sa_flags & SA_SIGINFO) +		ret = setup_rt_frame(ksig, oldset, regs);  	else -		ret = setup_frame(sig, ka, oldset, regs, sw); - -	if (ret == 0) { -		spin_lock_irq(¤t->sighand->siglock); -		sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); -		if (!(ka->sa.sa_flags & SA_NODEFER))  -			sigaddset(¤t->blocked,sig); -		recalc_sigpending(); -		spin_unlock_irq(¤t->sighand->siglock); -	} +		ret = setup_frame(ksig, oldset, regs); -	return ret; +	signal_setup_done(ret, ksig, 0);  }  static inline void @@ -551,83 +490,62 @@ syscall_restart(unsigned long r0, unsigned long r19,   * all (if we get here from anything but a syscall return, it will be 0)   */  static void -do_signal(struct pt_regs * regs, struct switch_stack * sw, -	  unsigned long r0, unsigned long r19) +do_signal(struct pt_regs *regs, unsigned long r0, unsigned long r19)  { -	siginfo_t info; -	int signr;  	unsigned long single_stepping = ptrace_cancel_bpt(current); -	struct k_sigaction ka; -	sigset_t *oldset; - -	if (test_thread_flag(TIF_RESTORE_SIGMASK)) -		oldset = ¤t->saved_sigmask; -	else -		oldset = ¤t->blocked; +	struct ksignal ksig;  	/* This lets the debugger run, ... */ -	signr = get_signal_to_deliver(&info, &ka, regs, NULL); - -	/* ... so re-check the single stepping. */ -	single_stepping |= ptrace_cancel_bpt(current); - -	if (signr > 0) { +	if (get_signal(&ksig)) { +		/* ... so re-check the single stepping. */ +		single_stepping |= ptrace_cancel_bpt(current);  		/* Whee!  Actually deliver the signal.  */  		if (r0) -			syscall_restart(r0, r19, regs, &ka); -		if (handle_signal(signr, &ka, &info, oldset, regs, sw) == 0) { -			/* A signal was successfully delivered, and the -			   saved sigmask was stored on the signal frame, -			   and will be restored by sigreturn.  So we can -			   simply clear the restore sigmask flag.  */ -			if (test_thread_flag(TIF_RESTORE_SIGMASK)) -				clear_thread_flag(TIF_RESTORE_SIGMASK); -		} -		if (single_stepping)  -			ptrace_set_bpt(current); /* re-set bpt */ -		return; -	} - -	if (r0) { -	  	switch (regs->r0) { -		case ERESTARTNOHAND: -		case ERESTARTSYS: -		case ERESTARTNOINTR: -			/* Reset v0 and a3 and replay syscall.  */ -			regs->r0 = r0; -			regs->r19 = r19; -			regs->pc -= 4; -			break; -		case ERESTART_RESTARTBLOCK: -			/* Force v0 to the restart syscall and reply.  */ -			regs->r0 = __NR_restart_syscall; -			regs->pc -= 4; -			break; +			syscall_restart(r0, r19, regs, &ksig.ka); +		handle_signal(&ksig, regs); +	} else { +		single_stepping |= ptrace_cancel_bpt(current); +		if (r0) { +			switch (regs->r0) { +			case ERESTARTNOHAND: +			case ERESTARTSYS: +			case ERESTARTNOINTR: +				/* Reset v0 and a3 and replay syscall.  */ +				regs->r0 = r0; +				regs->r19 = r19; +				regs->pc -= 4; +				break; +			case ERESTART_RESTARTBLOCK: +				/* Set v0 to the restart_syscall and replay */ +				regs->r0 = __NR_restart_syscall; +				regs->pc -= 4; +				break; +			}  		} +		restore_saved_sigmask();  	} - -	/* If there's no signal to deliver, we just restore the saved mask.  */ -	if (test_thread_flag(TIF_RESTORE_SIGMASK)) { -		clear_thread_flag(TIF_RESTORE_SIGMASK); -		sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); -	} -  	if (single_stepping)  		ptrace_set_bpt(current);	/* re-set breakpoint */  }  void -do_notify_resume(struct pt_regs *regs, struct switch_stack *sw, -		 unsigned long thread_info_flags, +do_work_pending(struct pt_regs *regs, unsigned long thread_flags,  		 unsigned long r0, unsigned long r19)  { -	if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) -		do_signal(regs, sw, r0, r19); - -	if (thread_info_flags & _TIF_NOTIFY_RESUME) { -		clear_thread_flag(TIF_NOTIFY_RESUME); -		tracehook_notify_resume(regs); -		if (current->replacement_session_keyring) -			key_replace_session_keyring(); -	} +	do { +		if (thread_flags & _TIF_NEED_RESCHED) { +			schedule(); +		} else { +			local_irq_enable(); +			if (thread_flags & _TIF_SIGPENDING) { +				do_signal(regs, r0, r19); +				r0 = 0; +			} else { +				clear_thread_flag(TIF_NOTIFY_RESUME); +				tracehook_notify_resume(regs); +			} +		} +		local_irq_disable(); +		thread_flags = current_thread_info()->flags; +	} while (thread_flags & _TIF_WORK_MASK);  } diff --git a/arch/alpha/kernel/smc37c669.c b/arch/alpha/kernel/smc37c669.c index 0435921d41c..c803fc76ae4 100644 --- a/arch/alpha/kernel/smc37c669.c +++ b/arch/alpha/kernel/smc37c669.c @@ -933,18 +933,6 @@ void SMC37c669_display_device_info(   *   *--   */ -#if 0 -/* $INCLUDE_OPTIONS$ */ -#include    "cp$inc:platform_io.h" -/* $INCLUDE_OPTIONS_END$ */ -#include    "cp$src:common.h" -#include    "cp$inc:prototypes.h" -#include    "cp$src:kernel_def.h" -#include    "cp$src:msg_def.h" -#include    "cp$src:smcc669_def.h" -/* Platform-specific includes */ -#include    "cp$src:platform.h" -#endif  #ifndef TRUE  #define TRUE 1 diff --git a/arch/alpha/kernel/smc37c93x.c b/arch/alpha/kernel/smc37c93x.c index 3e6a2893af9..6886b834f48 100644 --- a/arch/alpha/kernel/smc37c93x.c +++ b/arch/alpha/kernel/smc37c93x.c @@ -79,7 +79,6 @@  static unsigned long __init SMCConfigState(unsigned long baseAddr)  {  	unsigned char devId; -	unsigned char devRev;  	unsigned long configPort;  	unsigned long indexPort; @@ -100,7 +99,7 @@ static unsigned long __init SMCConfigState(unsigned long baseAddr)  		devId = inb(dataPort);  		if (devId == VALID_DEVICE_ID) {  			outb(DEVICE_REV, indexPort); -			devRev = inb(dataPort); +			/* unsigned char devRev = */ inb(dataPort);  			break;  		}  		else diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c index 42aa078a5e4..99ac36d5de4 100644 --- a/arch/alpha/kernel/smp.c +++ b/arch/alpha/kernel/smp.c @@ -31,7 +31,7 @@  #include <asm/hwrpb.h>  #include <asm/ptrace.h> -#include <asm/atomic.h> +#include <linux/atomic.h>  #include <asm/io.h>  #include <asm/irq.h> @@ -68,7 +68,7 @@ enum ipi_message_type {  };  /* Set to a secondary's cpuid when it comes online.  */ -static int smp_secondary_alive __devinitdata = 0; +static int smp_secondary_alive = 0;  int smp_num_probed;		/* Internal processor count */  int smp_num_cpus = 1;		/* Number that came online.  */ @@ -116,7 +116,7 @@ wait_boot_cpu_to_stop(int cpuid)  /*   * Where secondaries begin a life of C.   */ -void __cpuinit +void  smp_callin(void)  {  	int cpuid = hard_smp_processor_id(); @@ -138,9 +138,11 @@ smp_callin(void)  	/* Get our local ticker going. */  	smp_setup_percpu_timer(cpuid); +	init_clockevent();  	/* Call platform-specific callin, if specified */ -	if (alpha_mv.smp_callin) alpha_mv.smp_callin(); +	if (alpha_mv.smp_callin) +		alpha_mv.smp_callin();  	/* All kernel threads share the same mm context.  */  	atomic_inc(&init_mm.mm_count); @@ -166,12 +168,12 @@ smp_callin(void)  	DBGS(("smp_callin: commencing CPU %d current %p active_mm %p\n",  	      cpuid, current, current->active_mm)); -	/* Do nothing.  */ -	cpu_idle(); +	preempt_disable(); +	cpu_startup_entry(CPUHP_ONLINE);  }  /* Wait until hwrpb->txrdy is clear for cpu.  Return -1 on timeout.  */ -static int __devinit +static int  wait_for_txrdy (unsigned long cpumask)  {  	unsigned long timeout; @@ -194,7 +196,7 @@ wait_for_txrdy (unsigned long cpumask)   * Send a message to a secondary's console.  "START" is one such   * interesting message.  ;-)   */ -static void __cpuinit +static void  send_secondary_console_msg(char *str, int cpuid)  {  	struct percpu_struct *cpu; @@ -264,9 +266,10 @@ recv_secondary_console_msg(void)  		if (cnt <= 0 || cnt >= 80)  			strcpy(buf, "<<< BOGUS MSG >>>");  		else { -			cp1 = (char *) &cpu->ipc_buffer[11]; +			cp1 = (char *) &cpu->ipc_buffer[1];  			cp2 = buf; -			strcpy(cp2, cp1); +			memcpy(cp2, cp1, cnt); +			cp2[cnt] = '\0';  			while ((cp2 = strchr(cp2, '\r')) != 0) {  				*cp2 = ' '; @@ -285,7 +288,7 @@ recv_secondary_console_msg(void)  /*   * Convince the console to have a secondary cpu begin execution.   */ -static int __cpuinit +static int  secondary_cpu_start(int cpuid, struct task_struct *idle)  {  	struct percpu_struct *cpu; @@ -356,25 +359,11 @@ secondary_cpu_start(int cpuid, struct task_struct *idle)  /*   * Bring one cpu online.   */ -static int __cpuinit -smp_boot_one_cpu(int cpuid) +static int +smp_boot_one_cpu(int cpuid, struct task_struct *idle)  { -	struct task_struct *idle;  	unsigned long timeout; -	/* Cook up an idler for this guy.  Note that the address we -	   give to kernel_thread is irrelevant -- it's going to start -	   where HWRPB.CPU_restart says to start.  But this gets all -	   the other task-y sort of data structures set up like we -	   wish.  We can't use kernel_thread since we must avoid -	   rescheduling the child.  */ -	idle = fork_idle(cpuid); -	if (IS_ERR(idle)) -		panic("failed fork for CPU %d", cpuid); - -	DBGS(("smp_boot_one_cpu: CPU %d state 0x%lx flags 0x%lx\n", -	      cpuid, idle->state, idle->flags)); -  	/* Signal the secondary to wait a moment.  */  	smp_secondary_alive = -1; @@ -450,8 +439,8 @@ setup_smp(void)  		smp_num_probed = 1;  	} -	printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_map = %lx\n", -	       smp_num_probed, cpu_present_map.bits[0]); +	printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n", +	       smp_num_probed, cpumask_bits(cpu_present_mask)[0]);  }  /* @@ -481,15 +470,15 @@ smp_prepare_cpus(unsigned int max_cpus)  	smp_num_cpus = smp_num_probed;  } -void __devinit +void  smp_prepare_boot_cpu(void)  {  } -int __cpuinit -__cpu_up(unsigned int cpu) +int +__cpu_up(unsigned int cpu, struct task_struct *tidle)  { -	smp_boot_one_cpu(cpu); +	smp_boot_one_cpu(cpu, tidle);  	return cpu_online(cpu) ? 0 : -ENOSYS;  } @@ -511,35 +500,6 @@ smp_cpus_done(unsigned int max_cpus)  	       ((bogosum + 2500) / (5000/HZ)) % 100);  } - -void -smp_percpu_timer_interrupt(struct pt_regs *regs) -{ -	struct pt_regs *old_regs; -	int cpu = smp_processor_id(); -	unsigned long user = user_mode(regs); -	struct cpuinfo_alpha *data = &cpu_data[cpu]; - -	old_regs = set_irq_regs(regs); - -	/* Record kernel PC.  */ -	profile_tick(CPU_PROFILING); - -	if (!--data->prof_counter) { -		/* We need to make like a normal interrupt -- otherwise -		   timer interrupts ignore the global interrupt lock, -		   which would be a Bad Thing.  */ -		irq_enter(); - -		update_process_times(user); - -		data->prof_counter = data->prof_multiplier; - -		irq_exit(); -	} -	set_irq_regs(old_regs); -} -  int  setup_profiling_timer(unsigned int multiplier)  { @@ -585,8 +545,7 @@ handle_ipi(struct pt_regs *regs)  		switch (which) {  		case IPI_RESCHEDULE: -			/* Reschedule callback.  Everything to be done -			   is done by the interrupt return path.  */ +			scheduler_ipi();  			break;  		case IPI_CALL_FUNC: @@ -630,8 +589,9 @@ smp_send_reschedule(int cpu)  void  smp_send_stop(void)  { -	cpumask_t to_whom = cpu_possible_map; -	cpu_clear(smp_processor_id(), to_whom); +	cpumask_t to_whom; +	cpumask_copy(&to_whom, cpu_possible_mask); +	cpumask_clear_cpu(smp_processor_id(), &to_whom);  #ifdef DEBUG_IPI_MSG  	if (hard_smp_processor_id() != boot_cpu_id)  		printk(KERN_WARNING "smp_send_stop: Not on boot cpu.\n"); diff --git a/arch/alpha/kernel/srm_env.c b/arch/alpha/kernel/srm_env.c index f0df3fbd840..ffe996a54fa 100644 --- a/arch/alpha/kernel/srm_env.c +++ b/arch/alpha/kernel/srm_env.c @@ -4,9 +4,8 @@   *   * (C) 2001,2002,2006 by Jan-Benedict Glaw <jbglaw@lug-owl.de>   * - * This driver is at all a modified version of Erik Mouw's - * Documentation/DocBook/procfs_example.c, so: thank - * you, Erik! He can be reached via email at + * This driver is a modified version of Erik Mouw's example proc + * interface, so: thank you, Erik! He can be reached via email at   * <J.A.K.Mouw@its.tudelft.nl>. It is based on an idea   * provided by DEC^WCompaq^WIntel's "Jumpstart" CD. They   * included a patch like this as well. Thanks for idea! @@ -52,13 +51,11 @@ MODULE_LICENSE("GPL");  typedef struct _srm_env {  	char			*name;  	unsigned long		id; -	struct proc_dir_entry	*proc_entry;  } srm_env_t;  static struct proc_dir_entry	*base_dir;  static struct proc_dir_entry	*named_dir;  static struct proc_dir_entry	*numbered_dir; -static char			number[256][4];  static srm_env_t	srm_named_entries[] = {  	{ "auto_action",	ENV_AUTO_ACTION		}, @@ -78,21 +75,18 @@ static srm_env_t	srm_named_entries[] = {  	{ "tty_dev",		ENV_TTY_DEV		},  	{ NULL,			0			},  }; -static srm_env_t	srm_numbered_entries[256]; -  static int srm_env_proc_show(struct seq_file *m, void *v)  {  	unsigned long	ret; -	srm_env_t	*entry; +	unsigned long	id = (unsigned long)m->private;  	char		*page; -	entry = m->private;  	page = (char *)__get_free_page(GFP_USER);  	if (!page)  		return -ENOMEM; -	ret = callback_getenv(entry->id, page, PAGE_SIZE); +	ret = callback_getenv(id, page, PAGE_SIZE);  	if ((ret >> 61) == 0) {  		seq_write(m, page, ret); @@ -105,14 +99,14 @@ static int srm_env_proc_show(struct seq_file *m, void *v)  static int srm_env_proc_open(struct inode *inode, struct file *file)  { -	return single_open(file, srm_env_proc_show, PDE(inode)->data); +	return single_open(file, srm_env_proc_show, PDE_DATA(inode));  }  static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer,  				  size_t count, loff_t *pos)  {  	int res; -	srm_env_t	*entry = PDE(file->f_path.dentry->d_inode)->data; +	unsigned long	id = (unsigned long)PDE_DATA(file_inode(file));  	char		*buf = (char *) __get_free_page(GFP_USER);  	unsigned long	ret1, ret2; @@ -128,7 +122,7 @@ static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer,  		goto out;  	buf[count] = '\0'; -	ret1 = callback_setenv(entry->id, buf, count); +	ret1 = callback_setenv(id, buf, count);  	if ((ret1 >> 61) == 0) {  		do  			ret2 = callback_save_env(); @@ -150,52 +144,6 @@ static const struct file_operations srm_env_proc_fops = {  	.write		= srm_env_proc_write,  }; -static void -srm_env_cleanup(void) -{ -	srm_env_t	*entry; -	unsigned long	var_num; - -	if (base_dir) { -		/* -		 * Remove named entries -		 */ -		if (named_dir) { -			entry = srm_named_entries; -			while (entry->name != NULL && entry->id != 0) { -				if (entry->proc_entry) { -					remove_proc_entry(entry->name, -							named_dir); -					entry->proc_entry = NULL; -				} -				entry++; -			} -			remove_proc_entry(NAMED_DIR, base_dir); -		} - -		/* -		 * Remove numbered entries -		 */ -		if (numbered_dir) { -			for (var_num = 0; var_num <= 255; var_num++) { -				entry =	&srm_numbered_entries[var_num]; - -				if (entry->proc_entry) { -					remove_proc_entry(entry->name, -							numbered_dir); -					entry->proc_entry	= NULL; -					entry->name		= NULL; -				} -			} -			remove_proc_entry(NUMBERED_DIR, base_dir); -		} - -		remove_proc_entry(BASE_DIR, NULL); -	} - -	return; -} -  static int __init  srm_env_init(void)  { @@ -214,19 +162,13 @@ srm_env_init(void)  	}  	/* -	 * Init numbers -	 */ -	for (var_num = 0; var_num <= 255; var_num++) -		sprintf(number[var_num], "%ld", var_num); - -	/*  	 * Create base directory  	 */  	base_dir = proc_mkdir(BASE_DIR, NULL);  	if (!base_dir) {  		printk(KERN_ERR "Couldn't create base dir /proc/%s\n",  				BASE_DIR); -		goto cleanup; +		return -ENOMEM;  	}  	/* @@ -255,9 +197,8 @@ srm_env_init(void)  	 */  	entry = srm_named_entries;  	while (entry->name && entry->id) { -		entry->proc_entry = proc_create_data(entry->name, 0644, named_dir, -						     &srm_env_proc_fops, entry); -		if (!entry->proc_entry) +		if (!proc_create_data(entry->name, 0644, named_dir, +			     &srm_env_proc_fops, (void *)entry->id))  			goto cleanup;  		entry++;  	} @@ -266,15 +207,11 @@ srm_env_init(void)  	 * Create all numbered nodes  	 */  	for (var_num = 0; var_num <= 255; var_num++) { -		entry = &srm_numbered_entries[var_num]; -		entry->name = number[var_num]; - -		entry->proc_entry = proc_create_data(entry->name, 0644, numbered_dir, -						     &srm_env_proc_fops, entry); -		if (!entry->proc_entry) +		char name[4]; +		sprintf(name, "%ld", var_num); +		if (!proc_create_data(name, 0644, numbered_dir, +			     &srm_env_proc_fops, (void *)var_num))  			goto cleanup; - -		entry->id			= var_num;  	}  	printk(KERN_INFO "%s: version %s loaded successfully\n", NAME, @@ -283,18 +220,15 @@ srm_env_init(void)  	return 0;  cleanup: -	srm_env_cleanup(); - +	remove_proc_subtree(BASE_DIR, NULL);  	return -ENOMEM;  }  static void __exit  srm_env_exit(void)  { -	srm_env_cleanup(); +	remove_proc_subtree(BASE_DIR, NULL);  	printk(KERN_INFO "%s: unloaded successfully\n", NAME); - -	return;  }  module_init(srm_env_init); diff --git a/arch/alpha/kernel/srmcons.c b/arch/alpha/kernel/srmcons.c index 783f4e50c11..6f01d9ad7b8 100644 --- a/arch/alpha/kernel/srmcons.c +++ b/arch/alpha/kernel/srmcons.c @@ -30,10 +30,9 @@ static int srm_is_registered_console = 0;  #define MAX_SRM_CONSOLE_DEVICES 1	/* only support 1 console device */  struct srmcons_private { -	struct tty_struct *tty; +	struct tty_port port;  	struct timer_list timer; -	spinlock_t lock; -}; +} srmcons_singleton;  typedef union _srmcons_result {  	struct { @@ -45,7 +44,7 @@ typedef union _srmcons_result {  /* called with callback_lock held */  static int -srmcons_do_receive_chars(struct tty_struct *tty) +srmcons_do_receive_chars(struct tty_port *port)  {  	srmcons_result result;  	int count = 0, loops = 0; @@ -53,13 +52,13 @@ srmcons_do_receive_chars(struct tty_struct *tty)  	do {  		result.as_long = callback_getc(0);  		if (result.bits.status < 2) { -			tty_insert_flip_char(tty, (char)result.bits.c, 0); +			tty_insert_flip_char(port, (char)result.bits.c, 0);  			count++;  		}  	} while((result.bits.status & 1) && (++loops < 10));  	if (count) -		tty_schedule_flip(tty); +		tty_schedule_flip(port);  	return count;  } @@ -68,29 +67,28 @@ static void  srmcons_receive_chars(unsigned long data)  {  	struct srmcons_private *srmconsp = (struct srmcons_private *)data; +	struct tty_port *port = &srmconsp->port;  	unsigned long flags;  	int incr = 10;  	local_irq_save(flags);  	if (spin_trylock(&srmcons_callback_lock)) { -		if (!srmcons_do_receive_chars(srmconsp->tty)) +		if (!srmcons_do_receive_chars(port))  			incr = 100;  		spin_unlock(&srmcons_callback_lock);  	}  -	spin_lock(&srmconsp->lock); -	if (srmconsp->tty) { -		srmconsp->timer.expires = jiffies + incr; -		add_timer(&srmconsp->timer); -	} -	spin_unlock(&srmconsp->lock); +	spin_lock(&port->lock); +	if (port->tty) +		mod_timer(&srmconsp->timer, jiffies + incr); +	spin_unlock(&port->lock);  	local_irq_restore(flags);  }  /* called with callback_lock held */  static int -srmcons_do_write(struct tty_struct *tty, const char *buf, int count) +srmcons_do_write(struct tty_port *port, const char *buf, int count)  {  	static char str_cr[1] = "\r";  	long c, remaining = count; @@ -115,10 +113,10 @@ srmcons_do_write(struct tty_struct *tty, const char *buf, int count)  			cur += result.bits.c;  			/* -			 * Check for pending input iff a tty was provided +			 * Check for pending input iff a tty port was provided  			 */ -			if (tty) -				srmcons_do_receive_chars(tty); +			if (port) +				srmcons_do_receive_chars(port);  		}  		while (need_cr) { @@ -137,7 +135,7 @@ srmcons_write(struct tty_struct *tty,  	unsigned long flags;  	spin_lock_irqsave(&srmcons_callback_lock, flags); -	srmcons_do_write(tty, (const char *) buf, count); +	srmcons_do_write(tty->port, (const char *) buf, count);  	spin_unlock_irqrestore(&srmcons_callback_lock, flags);  	return count; @@ -156,56 +154,22 @@ srmcons_chars_in_buffer(struct tty_struct *tty)  }  static int -srmcons_get_private_struct(struct srmcons_private **ps) -{ -	static struct srmcons_private *srmconsp = NULL; -	static DEFINE_SPINLOCK(srmconsp_lock); -	unsigned long flags; -	int retval = 0; - -	if (srmconsp == NULL) { -		srmconsp = kmalloc(sizeof(*srmconsp), GFP_KERNEL); -		spin_lock_irqsave(&srmconsp_lock, flags); - -		if (srmconsp == NULL) -			retval = -ENOMEM; -		else { -			srmconsp->tty = NULL; -			spin_lock_init(&srmconsp->lock); -			init_timer(&srmconsp->timer); -		} - -		spin_unlock_irqrestore(&srmconsp_lock, flags); -	} - -	*ps = srmconsp; -	return retval; -} - -static int  srmcons_open(struct tty_struct *tty, struct file *filp)  { -	struct srmcons_private *srmconsp; +	struct srmcons_private *srmconsp = &srmcons_singleton; +	struct tty_port *port = &srmconsp->port;  	unsigned long flags; -	int retval; - -	retval = srmcons_get_private_struct(&srmconsp); -	if (retval) -		return retval; -	spin_lock_irqsave(&srmconsp->lock, flags); +	spin_lock_irqsave(&port->lock, flags); -	if (!srmconsp->tty) { +	if (!port->tty) {  		tty->driver_data = srmconsp; - -		srmconsp->tty = tty; -		srmconsp->timer.function = srmcons_receive_chars; -		srmconsp->timer.data = (unsigned long)srmconsp; -		srmconsp->timer.expires = jiffies + 10; -		add_timer(&srmconsp->timer); +		tty->port = port; +		port->tty = tty; /* XXX proper refcounting */ +		mod_timer(&srmconsp->timer, jiffies + 10);  	} -	spin_unlock_irqrestore(&srmconsp->lock, flags); +	spin_unlock_irqrestore(&port->lock, flags);  	return 0;  } @@ -214,16 +178,17 @@ static void  srmcons_close(struct tty_struct *tty, struct file *filp)  {  	struct srmcons_private *srmconsp = tty->driver_data; +	struct tty_port *port = &srmconsp->port;  	unsigned long flags; -	spin_lock_irqsave(&srmconsp->lock, flags); +	spin_lock_irqsave(&port->lock, flags);  	if (tty->count == 1) { -		srmconsp->tty = NULL; +		port->tty = NULL;  		del_timer(&srmconsp->timer);  	} -	spin_unlock_irqrestore(&srmconsp->lock, flags); +	spin_unlock_irqrestore(&port->lock, flags);  } @@ -240,6 +205,8 @@ static const struct tty_operations srmcons_ops = {  static int __init  srmcons_init(void)  { +	setup_timer(&srmcons_singleton.timer, srmcons_receive_chars, +			(unsigned long)&srmcons_singleton);  	if (srm_is_registered_console) {  		struct tty_driver *driver;  		int err; @@ -247,6 +214,9 @@ srmcons_init(void)  		driver = alloc_tty_driver(MAX_SRM_CONSOLE_DEVICES);  		if (!driver)  			return -ENOMEM; + +		tty_port_init(&srmcons_singleton.port); +  		driver->driver_name = "srm";  		driver->name = "srm";  		driver->major = 0; 	/* dynamic */ @@ -255,9 +225,11 @@ srmcons_init(void)  		driver->subtype = SYSTEM_TYPE_SYSCONS;  		driver->init_termios = tty_std_termios;  		tty_set_operations(driver, &srmcons_ops); +		tty_port_link_device(&srmcons_singleton.port, driver, 0);  		err = tty_register_driver(driver);  		if (err) {  			put_tty_driver(driver); +			tty_port_destroy(&srmcons_singleton.port);  			return err;  		}  		srmcons_driver = driver; diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c index 20a30b8b965..118dc6af180 100644 --- a/arch/alpha/kernel/sys_alcor.c +++ b/arch/alpha/kernel/sys_alcor.c @@ -18,7 +18,6 @@  #include <linux/bitops.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/io.h>  #include <asm/dma.h>  #include <asm/mmu_context.h> @@ -44,59 +43,42 @@ alcor_update_irq_hw(unsigned long mask)  }  static inline void -alcor_enable_irq(unsigned int irq) +alcor_enable_irq(struct irq_data *d)  { -	alcor_update_irq_hw(cached_irq_mask |= 1UL << (irq - 16)); +	alcor_update_irq_hw(cached_irq_mask |= 1UL << (d->irq - 16));  }  static void -alcor_disable_irq(unsigned int irq) +alcor_disable_irq(struct irq_data *d)  { -	alcor_update_irq_hw(cached_irq_mask &= ~(1UL << (irq - 16))); +	alcor_update_irq_hw(cached_irq_mask &= ~(1UL << (d->irq - 16)));  }  static void -alcor_mask_and_ack_irq(unsigned int irq) +alcor_mask_and_ack_irq(struct irq_data *d)  { -	alcor_disable_irq(irq); +	alcor_disable_irq(d);  	/* On ALCOR/XLT, need to dismiss interrupt via GRU. */ -	*(vuip)GRU_INT_CLEAR = 1 << (irq - 16); mb(); +	*(vuip)GRU_INT_CLEAR = 1 << (d->irq - 16); mb();  	*(vuip)GRU_INT_CLEAR = 0; mb();  } -static unsigned int -alcor_startup_irq(unsigned int irq) -{ -	alcor_enable_irq(irq); -	return 0; -} -  static void -alcor_isa_mask_and_ack_irq(unsigned int irq) +alcor_isa_mask_and_ack_irq(struct irq_data *d)  { -	i8259a_mask_and_ack_irq(irq); +	i8259a_mask_and_ack_irq(d);  	/* On ALCOR/XLT, need to dismiss interrupt via GRU. */  	*(vuip)GRU_INT_CLEAR = 0x80000000; mb();  	*(vuip)GRU_INT_CLEAR = 0; mb();  } -static void -alcor_end_irq(unsigned int irq) -{ -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		alcor_enable_irq(irq); -} -  static struct irq_chip alcor_irq_type = {  	.name		= "ALCOR", -	.startup	= alcor_startup_irq, -	.shutdown	= alcor_disable_irq, -	.enable		= alcor_enable_irq, -	.disable	= alcor_disable_irq, -	.ack		= alcor_mask_and_ack_irq, -	.end		= alcor_end_irq, +	.irq_unmask	= alcor_enable_irq, +	.irq_mask	= alcor_disable_irq, +	.irq_mask_ack	= alcor_mask_and_ack_irq,  };  static void @@ -142,10 +124,10 @@ alcor_init_irq(void)  		   on while IRQ probing.  */  		if (i >= 16+20 && i <= 16+30)  			continue; -		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i].chip = &alcor_irq_type; +		irq_set_chip_and_handler(i, &alcor_irq_type, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	} -	i8259a_irq_type.ack = alcor_isa_mask_and_ack_irq; +	i8259a_irq_type.irq_ack = alcor_isa_mask_and_ack_irq;  	init_i8259a_irqs();  	common_init_isa_dma(); @@ -200,7 +182,7 @@ alcor_init_irq(void)   */  static int __init -alcor_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +alcor_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[7][5] __initdata = {  		/*INT    INTA   INTB   INTC   INTD */ diff --git a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c index 14c8898d19e..4c50f8f40cb 100644 --- a/arch/alpha/kernel/sys_cabriolet.c +++ b/arch/alpha/kernel/sys_cabriolet.c @@ -18,7 +18,6 @@  #include <linux/bitops.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -46,39 +45,22 @@ cabriolet_update_irq_hw(unsigned int irq, unsigned long mask)  }  static inline void -cabriolet_enable_irq(unsigned int irq) +cabriolet_enable_irq(struct irq_data *d)  { -	cabriolet_update_irq_hw(irq, cached_irq_mask &= ~(1UL << irq)); +	cabriolet_update_irq_hw(d->irq, cached_irq_mask &= ~(1UL << d->irq));  }  static void -cabriolet_disable_irq(unsigned int irq) +cabriolet_disable_irq(struct irq_data *d)  { -	cabriolet_update_irq_hw(irq, cached_irq_mask |= 1UL << irq); -} - -static unsigned int -cabriolet_startup_irq(unsigned int irq) -{  -	cabriolet_enable_irq(irq); -	return 0; /* never anything pending */ -} - -static void -cabriolet_end_irq(unsigned int irq) -{  -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		cabriolet_enable_irq(irq); +	cabriolet_update_irq_hw(d->irq, cached_irq_mask |= 1UL << d->irq);  }  static struct irq_chip cabriolet_irq_type = {  	.name		= "CABRIOLET", -	.startup	= cabriolet_startup_irq, -	.shutdown	= cabriolet_disable_irq, -	.enable		= cabriolet_enable_irq, -	.disable	= cabriolet_disable_irq, -	.ack		= cabriolet_disable_irq, -	.end		= cabriolet_end_irq, +	.irq_unmask	= cabriolet_enable_irq, +	.irq_mask	= cabriolet_disable_irq, +	.irq_mask_ack	= cabriolet_disable_irq,  };  static void  @@ -122,8 +104,9 @@ common_init_irq(void (*srm_dev_int)(unsigned long v))  		outb(0xff, 0x806);  		for (i = 16; i < 35; ++i) { -			irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -			irq_desc[i].chip = &cabriolet_irq_type; +			irq_set_chip_and_handler(i, &cabriolet_irq_type, +						 handle_level_irq); +			irq_set_status_flags(i, IRQ_LEVEL);  		}  	} @@ -191,7 +174,7 @@ pc164_init_irq(void)   */  static inline int __init -eb66p_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +eb66p_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[5][5] __initdata = {  		/*INT  INTA  INTB  INTC   INTD */ @@ -221,7 +204,7 @@ eb66p_map_irq(struct pci_dev *dev, u8 slot, u8 pin)   */  static inline int __init -cabriolet_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +cabriolet_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[5][5] __initdata = {  		/*INT   INTA  INTB  INTC   INTD */ @@ -305,7 +288,7 @@ cia_cab_init_pci(void)   */  static inline int __init -alphapc164_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +alphapc164_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[7][5] __initdata = {  		/*INT   INTA  INTB   INTC   INTD */ diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index 4026502ab70..6c35159bc00 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c @@ -21,7 +21,6 @@  #include <linux/bitops.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -98,69 +97,41 @@ tsunami_update_irq_hw(unsigned long mask)  }  static void -dp264_enable_irq(unsigned int irq) +dp264_enable_irq(struct irq_data *d)  {  	spin_lock(&dp264_irq_lock); -	cached_irq_mask |= 1UL << irq; +	cached_irq_mask |= 1UL << d->irq;  	tsunami_update_irq_hw(cached_irq_mask);  	spin_unlock(&dp264_irq_lock);  }  static void -dp264_disable_irq(unsigned int irq) +dp264_disable_irq(struct irq_data *d)  {  	spin_lock(&dp264_irq_lock); -	cached_irq_mask &= ~(1UL << irq); +	cached_irq_mask &= ~(1UL << d->irq);  	tsunami_update_irq_hw(cached_irq_mask);  	spin_unlock(&dp264_irq_lock);  } -static unsigned int -dp264_startup_irq(unsigned int irq) -{  -	dp264_enable_irq(irq); -	return 0; /* never anything pending */ -} - -static void -dp264_end_irq(unsigned int irq) -{  -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		dp264_enable_irq(irq); -} -  static void -clipper_enable_irq(unsigned int irq) +clipper_enable_irq(struct irq_data *d)  {  	spin_lock(&dp264_irq_lock); -	cached_irq_mask |= 1UL << (irq - 16); +	cached_irq_mask |= 1UL << (d->irq - 16);  	tsunami_update_irq_hw(cached_irq_mask);  	spin_unlock(&dp264_irq_lock);  }  static void -clipper_disable_irq(unsigned int irq) +clipper_disable_irq(struct irq_data *d)  {  	spin_lock(&dp264_irq_lock); -	cached_irq_mask &= ~(1UL << (irq - 16)); +	cached_irq_mask &= ~(1UL << (d->irq - 16));  	tsunami_update_irq_hw(cached_irq_mask);  	spin_unlock(&dp264_irq_lock);  } -static unsigned int -clipper_startup_irq(unsigned int irq) -{  -	clipper_enable_irq(irq); -	return 0; /* never anything pending */ -} - -static void -clipper_end_irq(unsigned int irq) -{  -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		clipper_enable_irq(irq); -} -  static void  cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity)  { @@ -168,7 +139,7 @@ cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity)  	for (cpu = 0; cpu < 4; cpu++) {  		unsigned long aff = cpu_irq_affinity[cpu]; -		if (cpu_isset(cpu, affinity)) +		if (cpumask_test_cpu(cpu, &affinity))  			aff |= 1UL << irq;  		else  			aff &= ~(1UL << irq); @@ -177,10 +148,11 @@ cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity)  }  static int -dp264_set_affinity(unsigned int irq, const struct cpumask *affinity) -{  +dp264_set_affinity(struct irq_data *d, const struct cpumask *affinity, +		   bool force) +{  	spin_lock(&dp264_irq_lock); -	cpu_set_irq_affinity(irq, *affinity); +	cpu_set_irq_affinity(d->irq, *affinity);  	tsunami_update_irq_hw(cached_irq_mask);  	spin_unlock(&dp264_irq_lock); @@ -188,10 +160,11 @@ dp264_set_affinity(unsigned int irq, const struct cpumask *affinity)  }  static int -clipper_set_affinity(unsigned int irq, const struct cpumask *affinity) -{  +clipper_set_affinity(struct irq_data *d, const struct cpumask *affinity, +		     bool force) +{  	spin_lock(&dp264_irq_lock); -	cpu_set_irq_affinity(irq - 16, *affinity); +	cpu_set_irq_affinity(d->irq - 16, *affinity);  	tsunami_update_irq_hw(cached_irq_mask);  	spin_unlock(&dp264_irq_lock); @@ -199,33 +172,24 @@ clipper_set_affinity(unsigned int irq, const struct cpumask *affinity)  }  static struct irq_chip dp264_irq_type = { -	.name		= "DP264", -	.startup	= dp264_startup_irq, -	.shutdown	= dp264_disable_irq, -	.enable		= dp264_enable_irq, -	.disable	= dp264_disable_irq, -	.ack		= dp264_disable_irq, -	.end		= dp264_end_irq, -	.set_affinity	= dp264_set_affinity, +	.name			= "DP264", +	.irq_unmask		= dp264_enable_irq, +	.irq_mask		= dp264_disable_irq, +	.irq_mask_ack		= dp264_disable_irq, +	.irq_set_affinity	= dp264_set_affinity,  };  static struct irq_chip clipper_irq_type = { -	.name		= "CLIPPER", -	.startup	= clipper_startup_irq, -	.shutdown	= clipper_disable_irq, -	.enable		= clipper_enable_irq, -	.disable	= clipper_disable_irq, -	.ack		= clipper_disable_irq, -	.end		= clipper_end_irq, -	.set_affinity	= clipper_set_affinity, +	.name			= "CLIPPER", +	.irq_unmask		= clipper_enable_irq, +	.irq_mask		= clipper_disable_irq, +	.irq_mask_ack		= clipper_disable_irq, +	.irq_set_affinity	= clipper_set_affinity,  };  static void  dp264_device_interrupt(unsigned long vector)  { -#if 1 -	printk("dp264_device_interrupt: NOT IMPLEMENTED YET!!\n"); -#else  	unsigned long pld;  	unsigned int i; @@ -243,12 +207,7 @@ dp264_device_interrupt(unsigned long vector)  			isa_device_interrupt(vector);  		else  			handle_irq(16 + i); -#if 0 -		TSUNAMI_cchip->dir0.csr = 1UL << i; mb(); -		tmp = TSUNAMI_cchip->dir0.csr; -#endif  	} -#endif  }  static void  @@ -302,8 +261,8 @@ init_tsunami_irqs(struct irq_chip * ops, int imin, int imax)  {  	long i;  	for (i = imin; i <= imax; ++i) { -		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i].chip = ops; +		irq_set_chip_and_handler(i, ops, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  } @@ -398,7 +357,7 @@ clipper_init_irq(void)   */  static int __init -isa_irq_fixup(struct pci_dev *dev, int irq) +isa_irq_fixup(const struct pci_dev *dev, int irq)  {  	u8 irq8; @@ -414,7 +373,7 @@ isa_irq_fixup(struct pci_dev *dev, int irq)  }  static int __init -dp264_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +dp264_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[6][5] __initdata = {  		/*INT    INTA   INTB   INTC   INTD */ @@ -436,7 +395,7 @@ dp264_map_irq(struct pci_dev *dev, u8 slot, u8 pin)  }  static int __init -monet_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +monet_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[13][5] __initdata = {  		/*INT    INTA   INTB   INTC   INTD */ @@ -498,7 +457,7 @@ monet_swizzle(struct pci_dev *dev, u8 *pinp)  }  static int __init -webbrick_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +webbrick_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[13][5] __initdata = {  		/*INT    INTA   INTB   INTC   INTD */ @@ -520,7 +479,7 @@ webbrick_map_irq(struct pci_dev *dev, u8 slot, u8 pin)  }  static int __init -clipper_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +clipper_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[7][5] __initdata = {  		/*INT    INTA   INTB   INTC   INTD */ diff --git a/arch/alpha/kernel/sys_eb64p.c b/arch/alpha/kernel/sys_eb64p.c index df2090ce5e7..ad40a425e84 100644 --- a/arch/alpha/kernel/sys_eb64p.c +++ b/arch/alpha/kernel/sys_eb64p.c @@ -17,7 +17,6 @@  #include <linux/bitops.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -44,39 +43,22 @@ eb64p_update_irq_hw(unsigned int irq, unsigned long mask)  }  static inline void -eb64p_enable_irq(unsigned int irq) +eb64p_enable_irq(struct irq_data *d)  { -	eb64p_update_irq_hw(irq, cached_irq_mask &= ~(1 << irq)); +	eb64p_update_irq_hw(d->irq, cached_irq_mask &= ~(1 << d->irq));  }  static void -eb64p_disable_irq(unsigned int irq) +eb64p_disable_irq(struct irq_data *d)  { -	eb64p_update_irq_hw(irq, cached_irq_mask |= 1 << irq); -} - -static unsigned int -eb64p_startup_irq(unsigned int irq) -{ -	eb64p_enable_irq(irq); -	return 0; /* never anything pending */ -} - -static void -eb64p_end_irq(unsigned int irq) -{ -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		eb64p_enable_irq(irq); +	eb64p_update_irq_hw(d->irq, cached_irq_mask |= 1 << d->irq);  }  static struct irq_chip eb64p_irq_type = {  	.name		= "EB64P", -	.startup	= eb64p_startup_irq, -	.shutdown	= eb64p_disable_irq, -	.enable		= eb64p_enable_irq, -	.disable	= eb64p_disable_irq, -	.ack		= eb64p_disable_irq, -	.end		= eb64p_end_irq, +	.irq_unmask	= eb64p_enable_irq, +	.irq_mask	= eb64p_disable_irq, +	.irq_mask_ack	= eb64p_disable_irq,  };  static void  @@ -135,9 +117,9 @@ eb64p_init_irq(void)  	init_i8259a_irqs();  	for (i = 16; i < 32; ++i) { -		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i].chip = &eb64p_irq_type; -	}		 +		irq_set_chip_and_handler(i, &eb64p_irq_type, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL); +	}  	common_init_isa_dma();  	setup_irq(16+5, &isa_cascade_irqaction); @@ -186,7 +168,7 @@ eb64p_init_irq(void)   */  static int __init -eb64p_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +eb64p_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[5][5] __initdata = {  		/*INT  INTA  INTB  INTC   INTD */ diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c index 3ca1dbcf404..79d69d7f63f 100644 --- a/arch/alpha/kernel/sys_eiger.c +++ b/arch/alpha/kernel/sys_eiger.c @@ -18,7 +18,6 @@  #include <linux/bitops.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -51,43 +50,28 @@ eiger_update_irq_hw(unsigned long irq, unsigned long mask)  }  static inline void -eiger_enable_irq(unsigned int irq) +eiger_enable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq;  	unsigned long mask;  	mask = (cached_irq_mask[irq >= 64] &= ~(1UL << (irq & 63)));  	eiger_update_irq_hw(irq, mask);  }  static void -eiger_disable_irq(unsigned int irq) +eiger_disable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq;  	unsigned long mask;  	mask = (cached_irq_mask[irq >= 64] |= 1UL << (irq & 63));  	eiger_update_irq_hw(irq, mask);  } -static unsigned int -eiger_startup_irq(unsigned int irq) -{ -	eiger_enable_irq(irq); -	return 0; /* never anything pending */ -} - -static void -eiger_end_irq(unsigned int irq) -{ -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		eiger_enable_irq(irq); -} -  static struct irq_chip eiger_irq_type = {  	.name		= "EIGER", -	.startup	= eiger_startup_irq, -	.shutdown	= eiger_disable_irq, -	.enable		= eiger_enable_irq, -	.disable	= eiger_disable_irq, -	.ack		= eiger_disable_irq, -	.end		= eiger_end_irq, +	.irq_unmask	= eiger_enable_irq, +	.irq_mask	= eiger_disable_irq, +	.irq_mask_ack	= eiger_disable_irq,  };  static void @@ -153,13 +137,13 @@ eiger_init_irq(void)  	init_i8259a_irqs();  	for (i = 16; i < 128; ++i) { -		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i].chip = &eiger_irq_type; +		irq_set_chip_and_handler(i, &eiger_irq_type, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  }  static int __init -eiger_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +eiger_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	u8 irq_orig; diff --git a/arch/alpha/kernel/sys_jensen.c b/arch/alpha/kernel/sys_jensen.c index 7a7ae36fff9..608f2a7fa0a 100644 --- a/arch/alpha/kernel/sys_jensen.c +++ b/arch/alpha/kernel/sys_jensen.c @@ -15,7 +15,6 @@  #include <linux/init.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #define __EXTERN_INLINE inline  #include <asm/io.h> @@ -62,70 +61,35 @@   * world.   */ -static unsigned int -jensen_local_startup(unsigned int irq) -{ -	/* the parport is really hw IRQ 1, silly Jensen.  */ -	if (irq == 7) -		i8259a_startup_irq(1); -	else -		/* -		 * For all true local interrupts, set the flag that prevents -		 * the IPL from being dropped during handler processing. -		 */ -		if (irq_desc[irq].action) -			irq_desc[irq].action->flags |= IRQF_DISABLED; -	return 0; -} - -static void -jensen_local_shutdown(unsigned int irq) -{ -	/* the parport is really hw IRQ 1, silly Jensen.  */ -	if (irq == 7) -		i8259a_disable_irq(1); -} - -static void -jensen_local_enable(unsigned int irq) -{ -	/* the parport is really hw IRQ 1, silly Jensen.  */ -	if (irq == 7) -		i8259a_enable_irq(1); -} -  static void -jensen_local_disable(unsigned int irq) +jensen_local_enable(struct irq_data *d)  {  	/* the parport is really hw IRQ 1, silly Jensen.  */ -	if (irq == 7) -		i8259a_disable_irq(1); +	if (d->irq == 7) +		i8259a_enable_irq(d);  }  static void -jensen_local_ack(unsigned int irq) +jensen_local_disable(struct irq_data *d)  {  	/* the parport is really hw IRQ 1, silly Jensen.  */ -	if (irq == 7) -		i8259a_mask_and_ack_irq(1); +	if (d->irq == 7) +		i8259a_disable_irq(d);  }  static void -jensen_local_end(unsigned int irq) +jensen_local_mask_ack(struct irq_data *d)  {  	/* the parport is really hw IRQ 1, silly Jensen.  */ -	if (irq == 7) -		i8259a_end_irq(1); +	if (d->irq == 7) +		i8259a_mask_and_ack_irq(d);  }  static struct irq_chip jensen_local_irq_type = {  	.name		= "LOCAL", -	.startup	= jensen_local_startup, -	.shutdown	= jensen_local_shutdown, -	.enable		= jensen_local_enable, -	.disable	= jensen_local_disable, -	.ack		= jensen_local_ack, -	.end		= jensen_local_end, +	.irq_unmask	= jensen_local_enable, +	.irq_mask	= jensen_local_disable, +	.irq_mask_ack	= jensen_local_mask_ack,  };  static void  @@ -158,7 +122,7 @@ jensen_device_interrupt(unsigned long vector)  	}  	/* If there is no handler yet... */ -	if (irq_desc[irq].action == NULL) { +	if (!irq_has_action(irq)) {  	    /* If it is a local interrupt that cannot be masked... */  	    if (vector >= 0x900)  	    { @@ -206,11 +170,11 @@ jensen_init_irq(void)  {  	init_i8259a_irqs(); -	irq_desc[1].chip = &jensen_local_irq_type; -	irq_desc[4].chip = &jensen_local_irq_type; -	irq_desc[3].chip = &jensen_local_irq_type; -	irq_desc[7].chip = &jensen_local_irq_type; -	irq_desc[9].chip = &jensen_local_irq_type; +	irq_set_chip_and_handler(1, &jensen_local_irq_type, handle_level_irq); +	irq_set_chip_and_handler(4, &jensen_local_irq_type, handle_level_irq); +	irq_set_chip_and_handler(3, &jensen_local_irq_type, handle_level_irq); +	irq_set_chip_and_handler(7, &jensen_local_irq_type, handle_level_irq); +	irq_set_chip_and_handler(9, &jensen_local_irq_type, handle_level_irq);  	common_init_isa_dma();  } @@ -260,8 +224,6 @@ struct alpha_machine_vector jensen_mv __initmv = {  	.machine_check		= jensen_machine_check,  	.max_isa_dma_address	= ALPHA_MAX_ISA_DMA_ADDRESS,  	.rtc_port		= 0x170, -	.rtc_get_time		= common_get_rtc_time, -	.rtc_set_time		= common_set_rtc_time,  	.nr_irqs		= 16,  	.device_interrupt	= jensen_device_interrupt, diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index 0bb3b5c4f69..f21d61fab67 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c @@ -13,7 +13,6 @@  #include <linux/bitops.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -23,7 +22,6 @@  #include <asm/hwrpb.h>  #include <asm/tlbflush.h>  #include <asm/vga.h> -#include <asm/rtc.h>  #include "proto.h"  #include "err_impl.h" @@ -104,9 +102,10 @@ io7_get_irq_ctl(unsigned int irq, struct io7 **pio7)  }  static void -io7_enable_irq(unsigned int irq) +io7_enable_irq(struct irq_data *d)  {  	volatile unsigned long *ctl; +	unsigned int irq = d->irq;  	struct io7 *io7;  	ctl = io7_get_irq_ctl(irq, &io7); @@ -115,7 +114,7 @@ io7_enable_irq(unsigned int irq)  		       __func__, irq);  		return;  	} -		 +  	spin_lock(&io7->irq_lock);  	*ctl |= 1UL << 24;  	mb(); @@ -124,9 +123,10 @@ io7_enable_irq(unsigned int irq)  }  static void -io7_disable_irq(unsigned int irq) +io7_disable_irq(struct irq_data *d)  {  	volatile unsigned long *ctl; +	unsigned int irq = d->irq;  	struct io7 *io7;  	ctl = io7_get_irq_ctl(irq, &io7); @@ -135,7 +135,7 @@ io7_disable_irq(unsigned int irq)  		       __func__, irq);  		return;  	} -		 +  	spin_lock(&io7->irq_lock);  	*ctl &= ~(1UL << 24);  	mb(); @@ -143,60 +143,30 @@ io7_disable_irq(unsigned int irq)  	spin_unlock(&io7->irq_lock);  } -static unsigned int -io7_startup_irq(unsigned int irq) -{ -	io7_enable_irq(irq); -	return 0;	/* never anything pending */ -} -  static void -io7_end_irq(unsigned int irq) +marvel_irq_noop(struct irq_data *d)  { -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		io7_enable_irq(irq); -} - -static void -marvel_irq_noop(unsigned int irq)  -{  -	return;  -} - -static unsigned int -marvel_irq_noop_return(unsigned int irq)  -{  -	return 0;  +	return;  }  static struct irq_chip marvel_legacy_irq_type = {  	.name		= "LEGACY", -	.startup	= marvel_irq_noop_return, -	.shutdown	= marvel_irq_noop, -	.enable		= marvel_irq_noop, -	.disable	= marvel_irq_noop, -	.ack		= marvel_irq_noop, -	.end		= marvel_irq_noop, +	.irq_mask	= marvel_irq_noop, +	.irq_unmask	= marvel_irq_noop,  };  static struct irq_chip io7_lsi_irq_type = {  	.name		= "LSI", -	.startup	= io7_startup_irq, -	.shutdown	= io7_disable_irq, -	.enable		= io7_enable_irq, -	.disable	= io7_disable_irq, -	.ack		= io7_disable_irq, -	.end		= io7_end_irq, +	.irq_unmask	= io7_enable_irq, +	.irq_mask	= io7_disable_irq, +	.irq_mask_ack	= io7_disable_irq,  };  static struct irq_chip io7_msi_irq_type = {  	.name		= "MSI", -	.startup	= io7_startup_irq, -	.shutdown	= io7_disable_irq, -	.enable		= io7_enable_irq, -	.disable	= io7_disable_irq, -	.ack		= marvel_irq_noop, -	.end		= io7_end_irq, +	.irq_unmask	= io7_enable_irq, +	.irq_mask	= io7_disable_irq, +	.irq_ack	= marvel_irq_noop,  };  static void @@ -304,8 +274,8 @@ init_io7_irqs(struct io7 *io7,  	/* Set up the lsi irqs.  */  	for (i = 0; i < 128; ++i) { -		irq_desc[base + i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[base + i].chip = lsi_ops; +		irq_set_chip_and_handler(base + i, lsi_ops, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	/* Disable the implemented irqs in hardware.  */ @@ -318,8 +288,8 @@ init_io7_irqs(struct io7 *io7,  	/* Set up the msi irqs.  */  	for (i = 128; i < (128 + 512); ++i) { -		irq_desc[base + i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[base + i].chip = msi_ops; +		irq_set_chip_and_handler(base + i, msi_ops, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	for (i = 0; i < 16; ++i) @@ -336,8 +306,8 @@ marvel_init_irq(void)  	/* Reserve the legacy irqs.  */  	for (i = 0; i < 16; ++i) { -		irq_desc[i].status = IRQ_DISABLED; -		irq_desc[i].chip = &marvel_legacy_irq_type; +		irq_set_chip_and_handler(i, &marvel_legacy_irq_type, +					 handle_level_irq);  	}  	/* Init the io7 irqs.  */ @@ -346,8 +316,9 @@ marvel_init_irq(void)  }  static int  -marvel_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +marvel_map_irq(const struct pci_dev *cdev, u8 slot, u8 pin)  { +	struct pci_dev *dev = (struct pci_dev *)cdev;  	struct pci_controller *hose = dev->sysdata;  	struct io7_port *io7_port = hose->sysdata;  	struct io7 *io7 = io7_port->io7; @@ -412,7 +383,8 @@ marvel_init_pci(void)  	marvel_register_error_handlers(); -	pci_probe_only = 1; +	/* Indicate that we trust the console to configure things properly */ +	pci_set_flags(PCI_PROBE_ONLY);  	common_init_pci();  	locate_and_init_vga(NULL); @@ -427,57 +399,6 @@ marvel_init_rtc(void)  	init_rtc_irq();  } -struct marvel_rtc_time { -	struct rtc_time *time; -	int retval; -}; - -#ifdef CONFIG_SMP -static void -smp_get_rtc_time(void *data) -{ -	struct marvel_rtc_time *mrt = data; -	mrt->retval = __get_rtc_time(mrt->time); -} - -static void -smp_set_rtc_time(void *data) -{ -	struct marvel_rtc_time *mrt = data; -	mrt->retval = __set_rtc_time(mrt->time); -} -#endif - -static unsigned int -marvel_get_rtc_time(struct rtc_time *time) -{ -#ifdef CONFIG_SMP -	struct marvel_rtc_time mrt; - -	if (smp_processor_id() != boot_cpuid) { -		mrt.time = time; -		smp_call_function_single(boot_cpuid, smp_get_rtc_time, &mrt, 1); -		return mrt.retval; -	} -#endif -	return __get_rtc_time(time); -} - -static int -marvel_set_rtc_time(struct rtc_time *time) -{ -#ifdef CONFIG_SMP -	struct marvel_rtc_time mrt; - -	if (smp_processor_id() != boot_cpuid) { -		mrt.time = time; -		smp_call_function_single(boot_cpuid, smp_set_rtc_time, &mrt, 1); -		return mrt.retval; -	} -#endif -	return __set_rtc_time(time); -} -  static void  marvel_smp_callin(void)  { @@ -519,8 +440,7 @@ struct alpha_machine_vector marvel_ev7_mv __initmv = {  	.vector_name		= "MARVEL/EV7",  	DO_EV7_MMU,  	.rtc_port		= 0x70, -	.rtc_get_time		= marvel_get_rtc_time, -	.rtc_set_time		= marvel_set_rtc_time, +	.rtc_boot_cpu_only	= 1,  	DO_MARVEL_IO,  	.machine_check		= marvel_machine_check,  	.max_isa_dma_address	= ALPHA_MAX_ISA_DMA_ADDRESS, diff --git a/arch/alpha/kernel/sys_miata.c b/arch/alpha/kernel/sys_miata.c index 61ccd95579e..d5b9776a608 100644 --- a/arch/alpha/kernel/sys_miata.c +++ b/arch/alpha/kernel/sys_miata.c @@ -17,7 +17,6 @@  #include <linux/reboot.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -151,7 +150,7 @@ miata_init_irq(void)   */  static int __init -miata_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +miata_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {          static char irq_tab[18][5] __initdata = {  		/*INT    INTA   INTB   INTC   INTD */ diff --git a/arch/alpha/kernel/sys_mikasa.c b/arch/alpha/kernel/sys_mikasa.c index ee886516981..5e82dc1ad6f 100644 --- a/arch/alpha/kernel/sys_mikasa.c +++ b/arch/alpha/kernel/sys_mikasa.c @@ -17,7 +17,7 @@  #include <linux/bitops.h>  #include <asm/ptrace.h> -#include <asm/system.h> +#include <asm/mce.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -43,39 +43,22 @@ mikasa_update_irq_hw(int mask)  }  static inline void -mikasa_enable_irq(unsigned int irq) +mikasa_enable_irq(struct irq_data *d)  { -	mikasa_update_irq_hw(cached_irq_mask |= 1 << (irq - 16)); +	mikasa_update_irq_hw(cached_irq_mask |= 1 << (d->irq - 16));  }  static void -mikasa_disable_irq(unsigned int irq) +mikasa_disable_irq(struct irq_data *d)  { -	mikasa_update_irq_hw(cached_irq_mask &= ~(1 << (irq - 16))); -} - -static unsigned int -mikasa_startup_irq(unsigned int irq) -{ -	mikasa_enable_irq(irq); -	return 0; -} - -static void -mikasa_end_irq(unsigned int irq) -{ -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		mikasa_enable_irq(irq); +	mikasa_update_irq_hw(cached_irq_mask &= ~(1 << (d->irq - 16)));  }  static struct irq_chip mikasa_irq_type = {  	.name		= "MIKASA", -	.startup	= mikasa_startup_irq, -	.shutdown	= mikasa_disable_irq, -	.enable		= mikasa_enable_irq, -	.disable	= mikasa_disable_irq, -	.ack		= mikasa_disable_irq, -	.end		= mikasa_end_irq, +	.irq_unmask	= mikasa_enable_irq, +	.irq_mask	= mikasa_disable_irq, +	.irq_mask_ack	= mikasa_disable_irq,  };  static void  @@ -115,8 +98,9 @@ mikasa_init_irq(void)  	mikasa_update_irq_hw(0);  	for (i = 16; i < 32; ++i) { -		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i].chip = &mikasa_irq_type; +		irq_set_chip_and_handler(i, &mikasa_irq_type, +					 handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	init_i8259a_irqs(); @@ -162,7 +146,7 @@ mikasa_init_irq(void)   */  static int __init -mikasa_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +mikasa_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[8][5] __initdata = {  		/*INT    INTA   INTB   INTC   INTD */ diff --git a/arch/alpha/kernel/sys_nautilus.c b/arch/alpha/kernel/sys_nautilus.c index 99c0f46f6b9..837c0fa5831 100644 --- a/arch/alpha/kernel/sys_nautilus.c +++ b/arch/alpha/kernel/sys_nautilus.c @@ -35,7 +35,6 @@  #include <linux/bitops.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -65,7 +64,7 @@ nautilus_init_irq(void)  }  static int __init -nautilus_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +nautilus_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	/* Preserve the IRQ set up by the console.  */ @@ -186,9 +185,12 @@ nautilus_machine_check(unsigned long vector, unsigned long la_ptr)  	mb();  } -extern void free_reserved_mem(void *, void *);  extern void pcibios_claim_one_bus(struct pci_bus *); +static struct resource irongate_io = { +	.name	= "Irongate PCI IO", +	.flags	= IORESOURCE_IO, +};  static struct resource irongate_mem = {  	.name	= "Irongate PCI MEM",  	.flags	= IORESOURCE_MEM, @@ -210,6 +212,7 @@ nautilus_init_pci(void)  	irongate = pci_get_bus_and_slot(0, 0);  	bus->self = irongate; +	bus->resource[0] = &irongate_io;  	bus->resource[1] = &irongate_mem;  	pci_bus_size_bridges(bus); @@ -235,8 +238,8 @@ nautilus_init_pci(void)  	if (pci_mem < memtop)  		memtop = pci_mem;  	if (memtop > alpha_mv.min_mem_address) { -		free_reserved_mem(__va(alpha_mv.min_mem_address), -				  __va(memtop)); +		free_reserved_area(__va(alpha_mv.min_mem_address), +				   __va(memtop), -1, NULL);  		printk("nautilus_init_pci: %ldk freed\n",  			(memtop - alpha_mv.min_mem_address) >> 10);  	} diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c index 86503fe73a8..063e594fd96 100644 --- a/arch/alpha/kernel/sys_noritake.c +++ b/arch/alpha/kernel/sys_noritake.c @@ -18,7 +18,7 @@  #include <linux/bitops.h>  #include <asm/ptrace.h> -#include <asm/system.h> +#include <asm/mce.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -48,39 +48,22 @@ noritake_update_irq_hw(int irq, int mask)  }  static void -noritake_enable_irq(unsigned int irq) +noritake_enable_irq(struct irq_data *d)  { -	noritake_update_irq_hw(irq, cached_irq_mask |= 1 << (irq - 16)); +	noritake_update_irq_hw(d->irq, cached_irq_mask |= 1 << (d->irq - 16));  }  static void -noritake_disable_irq(unsigned int irq) +noritake_disable_irq(struct irq_data *d)  { -	noritake_update_irq_hw(irq, cached_irq_mask &= ~(1 << (irq - 16))); -} - -static unsigned int -noritake_startup_irq(unsigned int irq) -{ -	noritake_enable_irq(irq); -	return 0; -} - -static void -noritake_end_irq(unsigned int irq) -{ -        if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -                noritake_enable_irq(irq); +	noritake_update_irq_hw(d->irq, cached_irq_mask &= ~(1 << (d->irq - 16)));  }  static struct irq_chip noritake_irq_type = {  	.name		= "NORITAKE", -	.startup	= noritake_startup_irq, -	.shutdown	= noritake_disable_irq, -	.enable		= noritake_enable_irq, -	.disable	= noritake_disable_irq, -	.ack		= noritake_disable_irq, -	.end		= noritake_end_irq, +	.irq_unmask	= noritake_enable_irq, +	.irq_mask	= noritake_disable_irq, +	.irq_mask_ack	= noritake_disable_irq,  };  static void  @@ -144,8 +127,9 @@ noritake_init_irq(void)  	outw(0, 0x54c);  	for (i = 16; i < 48; ++i) { -		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i].chip = &noritake_irq_type; +		irq_set_chip_and_handler(i, &noritake_irq_type, +					 handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	init_i8259a_irqs(); @@ -210,7 +194,7 @@ noritake_init_irq(void)   */  static int __init -noritake_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +noritake_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[15][5] __initdata = {  		/*INT    INTA   INTB   INTC   INTD */ diff --git a/arch/alpha/kernel/sys_rawhide.c b/arch/alpha/kernel/sys_rawhide.c index 26c322bf89e..dfd510ae5d8 100644 --- a/arch/alpha/kernel/sys_rawhide.c +++ b/arch/alpha/kernel/sys_rawhide.c @@ -16,7 +16,6 @@  #include <linux/init.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -56,9 +55,10 @@ rawhide_update_irq_hw(int hose, int mask)    (((h) < MCPCIA_MAX_HOSES) && (cached_irq_masks[(h)] != 0))  static inline void  -rawhide_enable_irq(unsigned int irq) +rawhide_enable_irq(struct irq_data *d)  {  	unsigned int mask, hose; +	unsigned int irq = d->irq;  	irq -= 16;  	hose = irq / 24; @@ -76,9 +76,10 @@ rawhide_enable_irq(unsigned int irq)  }  static void  -rawhide_disable_irq(unsigned int irq) +rawhide_disable_irq(struct irq_data *d)  {  	unsigned int mask, hose; +	unsigned int irq = d->irq;  	irq -= 16;  	hose = irq / 24; @@ -96,9 +97,10 @@ rawhide_disable_irq(unsigned int irq)  }  static void -rawhide_mask_and_ack_irq(unsigned int irq) +rawhide_mask_and_ack_irq(struct irq_data *d)  {  	unsigned int mask, mask1, hose; +	unsigned int irq = d->irq;  	irq -= 16;  	hose = irq / 24; @@ -121,28 +123,11 @@ rawhide_mask_and_ack_irq(unsigned int irq)  	spin_unlock(&rawhide_irq_lock);  } -static unsigned int -rawhide_startup_irq(unsigned int irq) -{ -	rawhide_enable_irq(irq); -	return 0; -} - -static void -rawhide_end_irq(unsigned int irq) -{ -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		rawhide_enable_irq(irq); -} -  static struct irq_chip rawhide_irq_type = {  	.name		= "RAWHIDE", -	.startup	= rawhide_startup_irq, -	.shutdown	= rawhide_disable_irq, -	.enable		= rawhide_enable_irq, -	.disable	= rawhide_disable_irq, -	.ack		= rawhide_mask_and_ack_irq, -	.end		= rawhide_end_irq, +	.irq_unmask	= rawhide_enable_irq, +	.irq_mask	= rawhide_disable_irq, +	.irq_mask_ack	= rawhide_mask_and_ack_irq,  };  static void  @@ -194,8 +179,9 @@ rawhide_init_irq(void)  	}  	for (i = 16; i < 128; ++i) { -		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i].chip = &rawhide_irq_type; +		irq_set_chip_and_handler(i, &rawhide_irq_type, +					 handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	init_i8259a_irqs(); @@ -236,7 +222,7 @@ rawhide_init_irq(void)   */  static int __init -rawhide_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +rawhide_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[5][5] __initdata = {  		/*INT    INTA   INTB   INTC   INTD */ diff --git a/arch/alpha/kernel/sys_ruffian.c b/arch/alpha/kernel/sys_ruffian.c index 8de1046fe91..a3f48525717 100644 --- a/arch/alpha/kernel/sys_ruffian.c +++ b/arch/alpha/kernel/sys_ruffian.c @@ -18,7 +18,6 @@  #include <linux/init.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -26,7 +25,6 @@  #include <asm/pgtable.h>  #include <asm/core_cia.h>  #include <asm/tlbflush.h> -#include <asm/8253pit.h>  #include "proto.h"  #include "irq_impl.h" @@ -120,7 +118,7 @@ ruffian_kill_arch (int mode)   */  static int __init -ruffian_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +ruffian_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {          static char irq_tab[11][5] __initdata = {  	      /*INT  INTA INTB INTC INTD */ diff --git a/arch/alpha/kernel/sys_rx164.c b/arch/alpha/kernel/sys_rx164.c index be161129eab..08ee737d4fb 100644 --- a/arch/alpha/kernel/sys_rx164.c +++ b/arch/alpha/kernel/sys_rx164.c @@ -17,7 +17,6 @@  #include <linux/bitops.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -47,39 +46,22 @@ rx164_update_irq_hw(unsigned long mask)  }  static inline void -rx164_enable_irq(unsigned int irq) +rx164_enable_irq(struct irq_data *d)  { -	rx164_update_irq_hw(cached_irq_mask |= 1UL << (irq - 16)); +	rx164_update_irq_hw(cached_irq_mask |= 1UL << (d->irq - 16));  }  static void -rx164_disable_irq(unsigned int irq) +rx164_disable_irq(struct irq_data *d)  { -	rx164_update_irq_hw(cached_irq_mask &= ~(1UL << (irq - 16))); -} - -static unsigned int -rx164_startup_irq(unsigned int irq) -{ -	rx164_enable_irq(irq); -	return 0; -} - -static void -rx164_end_irq(unsigned int irq) -{ -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		rx164_enable_irq(irq); +	rx164_update_irq_hw(cached_irq_mask &= ~(1UL << (d->irq - 16)));  }  static struct irq_chip rx164_irq_type = {  	.name		= "RX164", -	.startup	= rx164_startup_irq, -	.shutdown	= rx164_disable_irq, -	.enable		= rx164_enable_irq, -	.disable	= rx164_disable_irq, -	.ack		= rx164_disable_irq, -	.end		= rx164_end_irq, +	.irq_unmask	= rx164_enable_irq, +	.irq_mask	= rx164_disable_irq, +	.irq_mask_ack	= rx164_disable_irq,  };  static void  @@ -116,8 +98,8 @@ rx164_init_irq(void)  	rx164_update_irq_hw(0);  	for (i = 16; i < 40; ++i) { -		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i].chip = &rx164_irq_type; +		irq_set_chip_and_handler(i, &rx164_irq_type, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	init_i8259a_irqs(); @@ -161,7 +143,7 @@ rx164_init_irq(void)   */  static int __init -rx164_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +rx164_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  #if 0  	static char irq_tab_pass1[6][5] __initdata = { diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c index b2abe27a23c..8a0aa6d67b5 100644 --- a/arch/alpha/kernel/sys_sable.c +++ b/arch/alpha/kernel/sys_sable.c @@ -16,7 +16,6 @@  #include <linux/init.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -194,7 +193,7 @@ sable_init_irq(void)   */  static int __init -sable_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +sable_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[9][5] __initdata = {  		/*INT    INTA   INTB   INTC   INTD */ @@ -376,7 +375,7 @@ lynx_init_irq(void)   */  static int __init -lynx_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +lynx_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[19][5] __initdata = {  		/*INT    INTA   INTB   INTC   INTD */ @@ -443,11 +442,11 @@ lynx_swizzle(struct pci_dev *dev, u8 *pinp)  /* GENERIC irq routines */  static inline void -sable_lynx_enable_irq(unsigned int irq) +sable_lynx_enable_irq(struct irq_data *d)  {  	unsigned long bit, mask; -	bit = sable_lynx_irq_swizzle->irq_to_mask[irq]; +	bit = sable_lynx_irq_swizzle->irq_to_mask[d->irq];  	spin_lock(&sable_lynx_irq_lock);  	mask = sable_lynx_irq_swizzle->shadow_mask &= ~(1UL << bit);  	sable_lynx_irq_swizzle->update_irq_hw(bit, mask); @@ -459,11 +458,11 @@ sable_lynx_enable_irq(unsigned int irq)  }  static void -sable_lynx_disable_irq(unsigned int irq) +sable_lynx_disable_irq(struct irq_data *d)  {  	unsigned long bit, mask; -	bit = sable_lynx_irq_swizzle->irq_to_mask[irq]; +	bit = sable_lynx_irq_swizzle->irq_to_mask[d->irq];  	spin_lock(&sable_lynx_irq_lock);  	mask = sable_lynx_irq_swizzle->shadow_mask |= 1UL << bit;  	sable_lynx_irq_swizzle->update_irq_hw(bit, mask); @@ -474,26 +473,12 @@ sable_lynx_disable_irq(unsigned int irq)  #endif  } -static unsigned int -sable_lynx_startup_irq(unsigned int irq) -{ -	sable_lynx_enable_irq(irq); -	return 0; -} - -static void -sable_lynx_end_irq(unsigned int irq) -{ -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		sable_lynx_enable_irq(irq); -} -  static void -sable_lynx_mask_and_ack_irq(unsigned int irq) +sable_lynx_mask_and_ack_irq(struct irq_data *d)  {  	unsigned long bit, mask; -	bit = sable_lynx_irq_swizzle->irq_to_mask[irq]; +	bit = sable_lynx_irq_swizzle->irq_to_mask[d->irq];  	spin_lock(&sable_lynx_irq_lock);  	mask = sable_lynx_irq_swizzle->shadow_mask |= 1UL << bit;  	sable_lynx_irq_swizzle->update_irq_hw(bit, mask); @@ -503,12 +488,9 @@ sable_lynx_mask_and_ack_irq(unsigned int irq)  static struct irq_chip sable_lynx_irq_type = {  	.name		= "SABLE/LYNX", -	.startup	= sable_lynx_startup_irq, -	.shutdown	= sable_lynx_disable_irq, -	.enable		= sable_lynx_enable_irq, -	.disable	= sable_lynx_disable_irq, -	.ack		= sable_lynx_mask_and_ack_irq, -	.end		= sable_lynx_end_irq, +	.irq_unmask	= sable_lynx_enable_irq, +	.irq_mask	= sable_lynx_disable_irq, +	.irq_mask_ack	= sable_lynx_mask_and_ack_irq,  };  static void  @@ -535,8 +517,9 @@ sable_lynx_init_irq(int nr_of_irqs)  	long i;  	for (i = 0; i < nr_of_irqs; ++i) { -		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i].chip = &sable_lynx_irq_type; +		irq_set_chip_and_handler(i, &sable_lynx_irq_type, +					 handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	common_init_isa_dma(); diff --git a/arch/alpha/kernel/sys_sio.c b/arch/alpha/kernel/sys_sio.c index 85b4aea01ef..febd24eba7a 100644 --- a/arch/alpha/kernel/sys_sio.c +++ b/arch/alpha/kernel/sys_sio.c @@ -20,7 +20,6 @@  #include <asm/compiler.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -146,7 +145,7 @@ sio_fixup_irq_levels(unsigned int level_bits)  }  static inline int __init -noname_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +noname_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	/*  	 * The Noname board has 5 PCI slots with each of the 4 @@ -185,7 +184,7 @@ noname_map_irq(struct pci_dev *dev, u8 slot, u8 pin)  }  static inline int __init -p2k_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +p2k_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[][5] __initdata = {  		/*INT A   B   C   D */ diff --git a/arch/alpha/kernel/sys_sx164.c b/arch/alpha/kernel/sys_sx164.c index 41d4ad4c7c4..d063b360efe 100644 --- a/arch/alpha/kernel/sys_sx164.c +++ b/arch/alpha/kernel/sys_sx164.c @@ -17,7 +17,6 @@  #include <linux/bitops.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -26,6 +25,7 @@  #include <asm/core_cia.h>  #include <asm/hwrpb.h>  #include <asm/tlbflush.h> +#include <asm/special_insns.h>  #include "proto.h"  #include "irq_impl.h" @@ -95,7 +95,7 @@ sx164_init_irq(void)   */  static int __init -sx164_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +sx164_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[5][5] __initdata = {  		/*INT    INTA   INTB   INTC   INTD */ diff --git a/arch/alpha/kernel/sys_takara.c b/arch/alpha/kernel/sys_takara.c index 4da596b6adb..dd0f1eae3c6 100644 --- a/arch/alpha/kernel/sys_takara.c +++ b/arch/alpha/kernel/sys_takara.c @@ -16,7 +16,6 @@  #include <linux/init.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -45,43 +44,28 @@ takara_update_irq_hw(unsigned long irq, unsigned long mask)  }  static inline void -takara_enable_irq(unsigned int irq) +takara_enable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq;  	unsigned long mask;  	mask = (cached_irq_mask[irq >= 64] &= ~(1UL << (irq & 63)));  	takara_update_irq_hw(irq, mask);  }  static void -takara_disable_irq(unsigned int irq) +takara_disable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq;  	unsigned long mask;  	mask = (cached_irq_mask[irq >= 64] |= 1UL << (irq & 63));  	takara_update_irq_hw(irq, mask);  } -static unsigned int -takara_startup_irq(unsigned int irq) -{ -	takara_enable_irq(irq); -	return 0; /* never anything pending */ -} - -static void -takara_end_irq(unsigned int irq) -{ -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		takara_enable_irq(irq); -} -  static struct irq_chip takara_irq_type = {  	.name		= "TAKARA", -	.startup	= takara_startup_irq, -	.shutdown	= takara_disable_irq, -	.enable		= takara_enable_irq, -	.disable	= takara_disable_irq, -	.ack		= takara_disable_irq, -	.end		= takara_end_irq, +	.irq_unmask	= takara_enable_irq, +	.irq_mask	= takara_disable_irq, +	.irq_mask_ack	= takara_disable_irq,  };  static void @@ -153,8 +137,9 @@ takara_init_irq(void)  		takara_update_irq_hw(i, -1);  	for (i = 16; i < 128; ++i) { -		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i].chip = &takara_irq_type; +		irq_set_chip_and_handler(i, &takara_irq_type, +					 handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	common_init_isa_dma(); @@ -171,7 +156,7 @@ takara_init_irq(void)   */  static int __init -takara_map_irq_srm(struct pci_dev *dev, u8 slot, u8 pin) +takara_map_irq_srm(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[15][5] __initdata = {  		{ 16+3, 16+3, 16+3, 16+3, 16+3},   /* slot  6 == device 3 */ @@ -202,7 +187,7 @@ takara_map_irq_srm(struct pci_dev *dev, u8 slot, u8 pin)  }  static int __init -takara_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +takara_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[15][5] __initdata = {  		{ 16+3, 16+3, 16+3, 16+3, 16+3},   /* slot  6 == device 3 */ diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index 9008d0f20c5..a53cf03f49d 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c @@ -21,7 +21,6 @@  #include <linux/bitops.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -65,10 +64,11 @@ titan_update_irq_hw(unsigned long mask)  	register int bcpu = boot_cpuid;  #ifdef CONFIG_SMP -	cpumask_t cpm = cpu_present_map; +	cpumask_t cpm;  	volatile unsigned long *dim0, *dim1, *dim2, *dim3;  	unsigned long mask0, mask1, mask2, mask3, dummy; +	cpumask_copy(&cpm, cpu_present_mask);  	mask &= ~isa_enable;  	mask0 = mask & titan_cpu_irq_affinity[0];  	mask1 = mask & titan_cpu_irq_affinity[1]; @@ -84,10 +84,10 @@ titan_update_irq_hw(unsigned long mask)  	dim1 = &cchip->dim1.csr;  	dim2 = &cchip->dim2.csr;  	dim3 = &cchip->dim3.csr; -	if (!cpu_isset(0, cpm)) dim0 = &dummy; -	if (!cpu_isset(1, cpm)) dim1 = &dummy; -	if (!cpu_isset(2, cpm)) dim2 = &dummy; -	if (!cpu_isset(3, cpm)) dim3 = &dummy; +	if (!cpumask_test_cpu(0, &cpm)) dim0 = &dummy; +	if (!cpumask_test_cpu(1, &cpm)) dim1 = &dummy; +	if (!cpumask_test_cpu(2, &cpm)) dim2 = &dummy; +	if (!cpumask_test_cpu(3, &cpm)) dim3 = &dummy;  	*dim0 = mask0;  	*dim1 = mask1; @@ -112,8 +112,9 @@ titan_update_irq_hw(unsigned long mask)  }  static inline void -titan_enable_irq(unsigned int irq) +titan_enable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq;  	spin_lock(&titan_irq_lock);  	titan_cached_irq_mask |= 1UL << (irq - 16);  	titan_update_irq_hw(titan_cached_irq_mask); @@ -121,35 +122,22 @@ titan_enable_irq(unsigned int irq)  }  static inline void -titan_disable_irq(unsigned int irq) +titan_disable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq;  	spin_lock(&titan_irq_lock);  	titan_cached_irq_mask &= ~(1UL << (irq - 16));  	titan_update_irq_hw(titan_cached_irq_mask);  	spin_unlock(&titan_irq_lock);  } -static unsigned int -titan_startup_irq(unsigned int irq) -{ -	titan_enable_irq(irq); -	return 0;	/* never anything pending */ -} - -static void -titan_end_irq(unsigned int irq) -{ -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		titan_enable_irq(irq); -} -  static void  titan_cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity)  {  	int cpu;  	for (cpu = 0; cpu < 4; cpu++) { -		if (cpu_isset(cpu, affinity)) +		if (cpumask_test_cpu(cpu, &affinity))  			titan_cpu_irq_affinity[cpu] |= 1UL << irq;  		else  			titan_cpu_irq_affinity[cpu] &= ~(1UL << irq); @@ -158,8 +146,10 @@ titan_cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity)  }  static int -titan_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) +titan_set_irq_affinity(struct irq_data *d, const struct cpumask *affinity, +		       bool force)  {  +	unsigned int irq = d->irq;  	spin_lock(&titan_irq_lock);  	titan_cpu_set_irq_affinity(irq - 16, *affinity);  	titan_update_irq_hw(titan_cached_irq_mask); @@ -189,20 +179,17 @@ init_titan_irqs(struct irq_chip * ops, int imin, int imax)  {  	long i;  	for (i = imin; i <= imax; ++i) { -		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i].chip = ops; +		irq_set_chip_and_handler(i, ops, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  }  static struct irq_chip titan_irq_type = { -       .name	       = "TITAN", -       .startup        = titan_startup_irq, -       .shutdown       = titan_disable_irq, -       .enable         = titan_enable_irq, -       .disable        = titan_disable_irq, -       .ack            = titan_disable_irq, -       .end            = titan_end_irq, -       .set_affinity   = titan_set_irq_affinity, +       .name			= "TITAN", +       .irq_unmask		= titan_enable_irq, +       .irq_mask		= titan_disable_irq, +       .irq_mask_ack		= titan_disable_irq, +       .irq_set_affinity	= titan_set_irq_affinity,  };  static irqreturn_t @@ -293,15 +280,15 @@ titan_late_init(void)  	 * all reported to the kernel as machine checks, so the handler  	 * is a nop so it can be called to count the individual events.  	 */ -	titan_request_irq(63+16, titan_intr_nop, IRQF_DISABLED, +	titan_request_irq(63+16, titan_intr_nop, 0,  		    "CChip Error", NULL); -	titan_request_irq(62+16, titan_intr_nop, IRQF_DISABLED, +	titan_request_irq(62+16, titan_intr_nop, 0,  		    "PChip 0 H_Error", NULL); -	titan_request_irq(61+16, titan_intr_nop, IRQF_DISABLED, +	titan_request_irq(61+16, titan_intr_nop, 0,  		    "PChip 1 H_Error", NULL); -	titan_request_irq(60+16, titan_intr_nop, IRQF_DISABLED, +	titan_request_irq(60+16, titan_intr_nop, 0,  		    "PChip 0 C_Error", NULL); -	titan_request_irq(59+16, titan_intr_nop, IRQF_DISABLED, +	titan_request_irq(59+16, titan_intr_nop, 0,  		    "PChip 1 C_Error", NULL);  	/*  @@ -316,8 +303,8 @@ titan_late_init(void)  } -static int __devinit -titan_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +static int +titan_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	u8 intline;  	int irq; @@ -343,7 +330,8 @@ titan_init_pci(void)   	 */   	titan_late_init(); -	pci_probe_only = 1; +	/* Indicate that we trust the console to configure things properly */ +	pci_set_flags(PCI_PROBE_ONLY);  	common_init_pci();  	SMC669_Init(0);  	locate_and_init_vga(NULL); @@ -360,9 +348,9 @@ privateer_init_pci(void)  	 * Hook a couple of extra err interrupts that the  	 * common titan code won't.  	 */ -	titan_request_irq(53+16, titan_intr_nop, IRQF_DISABLED, +	titan_request_irq(53+16, titan_intr_nop, 0,  		    "NMI", NULL); -	titan_request_irq(50+16, titan_intr_nop, IRQF_DISABLED, +	titan_request_irq(50+16, titan_intr_nop, 0,  		    "Temperature Warning", NULL);  	/* diff --git a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c index 62fd972e18e..ee187488777 100644 --- a/arch/alpha/kernel/sys_wildfire.c +++ b/arch/alpha/kernel/sys_wildfire.c @@ -15,7 +15,6 @@  #include <linux/bitops.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/dma.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> @@ -104,10 +103,12 @@ wildfire_init_irq_hw(void)  }  static void -wildfire_enable_irq(unsigned int irq) +wildfire_enable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq; +  	if (irq < 16) -		i8259a_enable_irq(irq); +		i8259a_enable_irq(d);  	spin_lock(&wildfire_irq_lock);  	set_bit(irq, &cached_irq_mask); @@ -116,10 +117,12 @@ wildfire_enable_irq(unsigned int irq)  }  static void -wildfire_disable_irq(unsigned int irq) +wildfire_disable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq; +  	if (irq < 16) -		i8259a_disable_irq(irq); +		i8259a_disable_irq(d);  	spin_lock(&wildfire_irq_lock);  	clear_bit(irq, &cached_irq_mask); @@ -128,10 +131,12 @@ wildfire_disable_irq(unsigned int irq)  }  static void -wildfire_mask_and_ack_irq(unsigned int irq) +wildfire_mask_and_ack_irq(struct irq_data *d)  { +	unsigned int irq = d->irq; +  	if (irq < 16) -		i8259a_mask_and_ack_irq(irq); +		i8259a_mask_and_ack_irq(d);  	spin_lock(&wildfire_irq_lock);  	clear_bit(irq, &cached_irq_mask); @@ -139,39 +144,17 @@ wildfire_mask_and_ack_irq(unsigned int irq)  	spin_unlock(&wildfire_irq_lock);  } -static unsigned int -wildfire_startup_irq(unsigned int irq) -{  -	wildfire_enable_irq(irq); -	return 0; /* never anything pending */ -} - -static void -wildfire_end_irq(unsigned int irq) -{  -#if 0 -	if (!irq_desc[irq].action) -		printk("got irq %d\n", irq); -#endif -	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) -		wildfire_enable_irq(irq); -} -  static struct irq_chip wildfire_irq_type = {  	.name		= "WILDFIRE", -	.startup	= wildfire_startup_irq, -	.shutdown	= wildfire_disable_irq, -	.enable		= wildfire_enable_irq, -	.disable	= wildfire_disable_irq, -	.ack		= wildfire_mask_and_ack_irq, -	.end		= wildfire_end_irq, +	.irq_unmask	= wildfire_enable_irq, +	.irq_mask	= wildfire_disable_irq, +	.irq_mask_ack	= wildfire_mask_and_ack_irq,  };  static void __init  wildfire_init_irq_per_pca(int qbbno, int pcano)  {  	int i, irq_bias; -	unsigned long io_bias;  	static struct irqaction isa_enable = {  		.handler	= no_action,  		.name		= "isa_enable", @@ -180,10 +163,12 @@ wildfire_init_irq_per_pca(int qbbno, int pcano)  	irq_bias = qbbno * (WILDFIRE_PCA_PER_QBB * WILDFIRE_IRQ_PER_PCA)  		 + pcano * WILDFIRE_IRQ_PER_PCA; +#if 0 +	unsigned long io_bias; +  	/* Only need the following for first PCI bus per PCA. */  	io_bias = WILDFIRE_IO(qbbno, pcano<<1) - WILDFIRE_IO_BIAS; -#if 0  	outb(0, DMA1_RESET_REG + io_bias);  	outb(0, DMA2_RESET_REG + io_bias);  	outb(DMA_MODE_CASCADE, DMA2_MODE_REG + io_bias); @@ -198,18 +183,21 @@ wildfire_init_irq_per_pca(int qbbno, int pcano)  	for (i = 0; i < 16; ++i) {  		if (i == 2)  			continue; -		irq_desc[i+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i+irq_bias].chip = &wildfire_irq_type; +		irq_set_chip_and_handler(i + irq_bias, &wildfire_irq_type, +					 handle_level_irq); +		irq_set_status_flags(i + irq_bias, IRQ_LEVEL);  	} -	irq_desc[36+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; -	irq_desc[36+irq_bias].chip = &wildfire_irq_type; +	irq_set_chip_and_handler(36 + irq_bias, &wildfire_irq_type, +				 handle_level_irq); +	irq_set_status_flags(36 + irq_bias, IRQ_LEVEL);  	for (i = 40; i < 64; ++i) { -		irq_desc[i+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; -		irq_desc[i+irq_bias].chip = &wildfire_irq_type; +		irq_set_chip_and_handler(i + irq_bias, &wildfire_irq_type, +					 handle_level_irq); +		irq_set_status_flags(i + irq_bias, IRQ_LEVEL);  	} -	setup_irq(32+irq_bias, &isa_enable);	 +	setup_irq(32+irq_bias, &isa_enable);  }  static void __init @@ -301,7 +289,7 @@ wildfire_device_interrupt(unsigned long vector)   */  static int __init -wildfire_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +wildfire_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	static char irq_tab[8][5] __initdata = {  		/*INT    INTA   INTB   INTC   INTD */ diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S index a6a1de9db16..dca9b3fb007 100644 --- a/arch/alpha/kernel/systbls.S +++ b/arch/alpha/kernel/systbls.S @@ -12,7 +12,7 @@  sys_call_table:  	.quad alpha_ni_syscall			/* 0 */  	.quad sys_exit -	.quad sys_fork +	.quad alpha_fork  	.quad sys_read  	.quad sys_write  	.quad alpha_ni_syscall			/* 5 */ @@ -76,7 +76,7 @@ sys_call_table:  	.quad sys_getpgrp  	.quad sys_getpagesize  	.quad alpha_ni_syscall			/* 65 */ -	.quad sys_vfork +	.quad alpha_vfork  	.quad sys_newstat  	.quad sys_newlstat  	.quad alpha_ni_syscall @@ -111,7 +111,7 @@ sys_call_table:  	.quad sys_socket  	.quad sys_connect  	.quad sys_accept -	.quad osf_getpriority			/* 100 */ +	.quad sys_osf_getpriority			/* 100 */  	.quad sys_send  	.quad sys_recv  	.quad sys_sigreturn @@ -241,11 +241,11 @@ sys_call_table:  	.quad alpha_ni_syscall  	.quad alpha_ni_syscall  	.quad alpha_ni_syscall -	.quad alpha_ni_syscall -	.quad alpha_ni_syscall			/* 225 */ -	.quad alpha_ni_syscall -	.quad alpha_ni_syscall -	.quad alpha_ni_syscall +	.quad sys_osf_stat +	.quad sys_osf_lstat			/* 225 */ +	.quad sys_osf_fstat +	.quad sys_osf_statfs64 +	.quad sys_osf_fstatfs64  	.quad alpha_ni_syscall  	.quad alpha_ni_syscall			/* 230 */  	.quad alpha_ni_syscall @@ -330,7 +330,7 @@ sys_call_table:  	.quad sys_ni_syscall			/* 309: old get_kernel_syms */  	.quad sys_syslog			/* 310 */  	.quad sys_reboot -	.quad sys_clone +	.quad alpha_clone  	.quad sys_uselib  	.quad sys_mlock  	.quad sys_munlock			/* 315 */ @@ -360,7 +360,7 @@ sys_call_table:  	.quad sys_newuname  	.quad sys_nanosleep			/* 340 */  	.quad sys_mremap -	.quad sys_nfsservctl +	.quad sys_ni_syscall			/* old nfsservctl */  	.quad sys_setresuid  	.quad sys_getresuid  	.quad sys_pciconfig_read		/* 345 */ @@ -498,23 +498,34 @@ sys_call_table:  	.quad sys_ni_syscall			/* sys_timerfd */  	.quad sys_eventfd  	.quad sys_recvmmsg -	.quad sys_fallocate				/* 480 */ +	.quad sys_fallocate			/* 480 */  	.quad sys_timerfd_create  	.quad sys_timerfd_settime  	.quad sys_timerfd_gettime  	.quad sys_signalfd4 -	.quad sys_eventfd2				/* 485 */ +	.quad sys_eventfd2			/* 485 */  	.quad sys_epoll_create1  	.quad sys_dup3  	.quad sys_pipe2  	.quad sys_inotify_init1 -	.quad sys_preadv				/* 490 */ +	.quad sys_preadv			/* 490 */  	.quad sys_pwritev  	.quad sys_rt_tgsigqueueinfo  	.quad sys_perf_event_open  	.quad sys_fanotify_init -	.quad sys_fanotify_mark				/* 495 */ +	.quad sys_fanotify_mark			/* 495 */  	.quad sys_prlimit64 +	.quad sys_name_to_handle_at +	.quad sys_open_by_handle_at +	.quad sys_clock_adjtime +	.quad sys_syncfs			/* 500 */ +	.quad sys_setns +	.quad sys_accept4 +	.quad sys_sendmmsg +	.quad sys_process_vm_readv +	.quad sys_process_vm_writev		/* 505 */ +	.quad sys_kcmp +	.quad sys_finit_module  	.size sys_call_table, . - sys_call_table  	.type sys_call_table, @object diff --git a/arch/alpha/kernel/time.c b/arch/alpha/kernel/time.c index 0f1d8493cfc..ee39cee8064 100644 --- a/arch/alpha/kernel/time.c +++ b/arch/alpha/kernel/time.c @@ -3,13 +3,7 @@   *   *  Copyright (C) 1991, 1992, 1995, 1999, 2000  Linus Torvalds   * - * This file contains the PC-specific time handling details: - * reading the RTC at bootup, etc.. - * 1994-07-02    Alan Modra - *	fixed set_rtc_mmss, fixed time.year for >= 2000, new mktime - * 1995-03-26    Markus Kuhn - *      fixed 500 ms bug at call to set_rtc_mmss, fixed DS12887 - *      precision CMOS clock update + * This file contains the clocksource time handling.   * 1997-09-10	Updated NTP code according to technical memorandum Jan '96   *		"A Kernel Model for Precision Timekeeping" by Dave Mills   * 1997-01-09    Adrian Sun @@ -21,9 +15,6 @@   * 1999-04-16	Thorsten Kranzkowski (dl8bcu@gmx.net)   *	fixed algorithm in do_gettimeofday() for calculating the precise time   *	from processor cycle counter (now taking lost_ticks into account) - * 2000-08-13	Jan-Benedict Glaw <jbglaw@lug-owl.de> - * 	Fixed time_init to be aware of epoches != 1900. This prevents - * 	booting up in 2048 for me;) Code is stolen from rtc.c.   * 2003-06-03	R. Scott Bailey <scott.bailey@eds.com>   *	Tighten sanity in time_init from 1% (10,000 PPM) to 250 PPM   */ @@ -46,41 +37,19 @@  #include <asm/uaccess.h>  #include <asm/io.h>  #include <asm/hwrpb.h> -#include <asm/8253pit.h> -#include <asm/rtc.h>  #include <linux/mc146818rtc.h>  #include <linux/time.h>  #include <linux/timex.h>  #include <linux/clocksource.h> +#include <linux/clockchips.h>  #include "proto.h"  #include "irq_impl.h" -static int set_rtc_mmss(unsigned long); -  DEFINE_SPINLOCK(rtc_lock);  EXPORT_SYMBOL(rtc_lock); -#define TICK_SIZE (tick_nsec / 1000) - -/* - * Shift amount by which scaled_ticks_per_cycle is scaled.  Shifting - * by 48 gives us 16 bits for HZ while keeping the accuracy good even - * for large CPU clock rates. - */ -#define FIX_SHIFT	48 - -/* lump static variables together for more efficient access: */ -static struct { -	/* cycle counter last time it got invoked */ -	__u32 last_time; -	/* ticks/cycle * 2^48 */ -	unsigned long scaled_ticks_per_cycle; -	/* partial unused tick */ -	unsigned long partial_tick; -} state; -  unsigned long est_cycle_freq;  #ifdef CONFIG_IRQ_WORK @@ -91,7 +60,7 @@ DEFINE_PER_CPU(u8, irq_work_pending);  #define test_irq_work_pending()      __get_cpu_var(irq_work_pending)  #define clear_irq_work_pending()     __get_cpu_var(irq_work_pending) = 0 -void set_irq_work_pending(void) +void arch_irq_work_raise(void)  {  	set_irq_work_pending_flag();  } @@ -106,117 +75,159 @@ void set_irq_work_pending(void)  static inline __u32 rpcc(void)  { -    __u32 result; -    asm volatile ("rpcc %0" : "=r"(result)); -    return result; +	return __builtin_alpha_rpcc();  } -int update_persistent_clock(struct timespec now) -{ -	return set_rtc_mmss(now.tv_sec); -} -void read_persistent_clock(struct timespec *ts) + +/* + * The RTC as a clock_event_device primitive. + */ + +static DEFINE_PER_CPU(struct clock_event_device, cpu_ce); + +irqreturn_t +rtc_timer_interrupt(int irq, void *dev)  { -	unsigned int year, mon, day, hour, min, sec, epoch; - -	sec = CMOS_READ(RTC_SECONDS); -	min = CMOS_READ(RTC_MINUTES); -	hour = CMOS_READ(RTC_HOURS); -	day = CMOS_READ(RTC_DAY_OF_MONTH); -	mon = CMOS_READ(RTC_MONTH); -	year = CMOS_READ(RTC_YEAR); - -	if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { -		sec = bcd2bin(sec); -		min = bcd2bin(min); -		hour = bcd2bin(hour); -		day = bcd2bin(day); -		mon = bcd2bin(mon); -		year = bcd2bin(year); -	} +	int cpu = smp_processor_id(); +	struct clock_event_device *ce = &per_cpu(cpu_ce, cpu); -	/* PC-like is standard; used for year >= 70 */ -	epoch = 1900; -	if (year < 20) -		epoch = 2000; -	else if (year >= 20 && year < 48) -		/* NT epoch */ -		epoch = 1980; -	else if (year >= 48 && year < 70) -		/* Digital UNIX epoch */ -		epoch = 1952; +	/* Don't run the hook for UNUSED or SHUTDOWN.  */ +	if (likely(ce->mode == CLOCK_EVT_MODE_PERIODIC)) +		ce->event_handler(ce); -	printk(KERN_INFO "Using epoch = %d\n", epoch); +	if (test_irq_work_pending()) { +		clear_irq_work_pending(); +		irq_work_run(); +	} -	if ((year += epoch) < 1970) -		year += 100; +	return IRQ_HANDLED; +} -	ts->tv_sec = mktime(year, mon, day, hour, min, sec); +static void +rtc_ce_set_mode(enum clock_event_mode mode, struct clock_event_device *ce) +{ +	/* The mode member of CE is updated in generic code. +	   Since we only support periodic events, nothing to do.  */ +} + +static int +rtc_ce_set_next_event(unsigned long evt, struct clock_event_device *ce) +{ +	/* This hook is for oneshot mode, which we don't support.  */ +	return -EINVAL;  } +static void __init +init_rtc_clockevent(void) +{ +	int cpu = smp_processor_id(); +	struct clock_event_device *ce = &per_cpu(cpu_ce, cpu); + +	*ce = (struct clock_event_device){ +		.name = "rtc", +		.features = CLOCK_EVT_FEAT_PERIODIC, +		.rating = 100, +		.cpumask = cpumask_of(cpu), +		.set_mode = rtc_ce_set_mode, +		.set_next_event = rtc_ce_set_next_event, +	}; +	clockevents_config_and_register(ce, CONFIG_HZ, 0, 0); +} +  /* - * timer_interrupt() needs to keep up the real-time clock, - * as well as call the "do_timer()" routine every clocktick + * The QEMU clock as a clocksource primitive.   */ -irqreturn_t timer_interrupt(int irq, void *dev) -{ -	unsigned long delta; -	__u32 now; -	long nticks; -#ifndef CONFIG_SMP -	/* Not SMP, do kernel PC profiling here.  */ -	profile_tick(CPU_PROFILING); -#endif +static cycle_t +qemu_cs_read(struct clocksource *cs) +{ +	return qemu_get_vmtime(); +} -	write_seqlock(&xtime_lock); +static struct clocksource qemu_cs = { +	.name                   = "qemu", +	.rating                 = 400, +	.read                   = qemu_cs_read, +	.mask                   = CLOCKSOURCE_MASK(64), +	.flags                  = CLOCK_SOURCE_IS_CONTINUOUS, +	.max_idle_ns		= LONG_MAX +}; -	/* -	 * Calculate how many ticks have passed since the last update, -	 * including any previous partial leftover.  Save any resulting -	 * fraction for the next pass. -	 */ -	now = rpcc(); -	delta = now - state.last_time; -	state.last_time = now; -	delta = delta * state.scaled_ticks_per_cycle + state.partial_tick; -	state.partial_tick = delta & ((1UL << FIX_SHIFT) - 1);  -	nticks = delta >> FIX_SHIFT; -	if (nticks) -		do_timer(nticks); +/* + * The QEMU alarm as a clock_event_device primitive. + */ -	write_sequnlock(&xtime_lock); +static void +qemu_ce_set_mode(enum clock_event_mode mode, struct clock_event_device *ce) +{ +	/* The mode member of CE is updated for us in generic code. +	   Just make sure that the event is disabled.  */ +	qemu_set_alarm_abs(0); +} -	if (test_irq_work_pending()) { -		clear_irq_work_pending(); -		irq_work_run(); -	} +static int +qemu_ce_set_next_event(unsigned long evt, struct clock_event_device *ce) +{ +	qemu_set_alarm_rel(evt); +	return 0; +} -#ifndef CONFIG_SMP -	while (nticks--) -		update_process_times(user_mode(get_irq_regs())); -#endif +static irqreturn_t +qemu_timer_interrupt(int irq, void *dev) +{ +	int cpu = smp_processor_id(); +	struct clock_event_device *ce = &per_cpu(cpu_ce, cpu); +	ce->event_handler(ce);  	return IRQ_HANDLED;  } +static void __init +init_qemu_clockevent(void) +{ +	int cpu = smp_processor_id(); +	struct clock_event_device *ce = &per_cpu(cpu_ce, cpu); + +	*ce = (struct clock_event_device){ +		.name = "qemu", +		.features = CLOCK_EVT_FEAT_ONESHOT, +		.rating = 400, +		.cpumask = cpumask_of(cpu), +		.set_mode = qemu_ce_set_mode, +		.set_next_event = qemu_ce_set_next_event, +	}; + +	clockevents_config_and_register(ce, NSEC_PER_SEC, 1000, LONG_MAX); +} + +  void __init  common_init_rtc(void)  { -	unsigned char x; +	unsigned char x, sel = 0;  	/* Reset periodic interrupt frequency.  */ -	x = CMOS_READ(RTC_FREQ_SELECT) & 0x3f; -        /* Test includes known working values on various platforms -           where 0x26 is wrong; we refuse to change those. */ -	if (x != 0x26 && x != 0x25 && x != 0x19 && x != 0x06) { -		printk("Setting RTC_FREQ to 1024 Hz (%x)\n", x); -		CMOS_WRITE(0x26, RTC_FREQ_SELECT); +#if CONFIG_HZ == 1024 || CONFIG_HZ == 1200 + 	x = CMOS_READ(RTC_FREQ_SELECT) & 0x3f; +	/* Test includes known working values on various platforms +	   where 0x26 is wrong; we refuse to change those. */ + 	if (x != 0x26 && x != 0x25 && x != 0x19 && x != 0x06) { +		sel = RTC_REF_CLCK_32KHZ + 6;  	} +#elif CONFIG_HZ == 256 || CONFIG_HZ == 128 || CONFIG_HZ == 64 || CONFIG_HZ == 32 +	sel = RTC_REF_CLCK_32KHZ + __builtin_ffs(32768 / CONFIG_HZ); +#else +# error "Unknown HZ from arch/alpha/Kconfig" +#endif +	if (sel) { +		printk(KERN_INFO "Setting RTC_FREQ to %d Hz (%x)\n", +		       CONFIG_HZ, sel); +		CMOS_WRITE(sel, RTC_FREQ_SELECT); + 	}  	/* Turn on periodic interrupts.  */  	x = CMOS_READ(RTC_CONTROL); @@ -239,16 +250,37 @@ common_init_rtc(void)  	init_rtc_irq();  } -unsigned int common_get_rtc_time(struct rtc_time *time) -{ -	return __get_rtc_time(time); -} + +#ifndef CONFIG_ALPHA_WTINT +/* + * The RPCC as a clocksource primitive. + * + * While we have free-running timecounters running on all CPUs, and we make + * a half-hearted attempt in init_rtc_rpcc_info to sync the timecounter + * with the wall clock, that initialization isn't kept up-to-date across + * different time counters in SMP mode.  Therefore we can only use this + * method when there's only one CPU enabled. + * + * When using the WTINT PALcall, the RPCC may shift to a lower frequency, + * or stop altogether, while waiting for the interrupt.  Therefore we cannot + * use this method when WTINT is in use. + */ -int common_set_rtc_time(struct rtc_time *time) +static cycle_t read_rpcc(struct clocksource *cs)  { -	return __set_rtc_time(time); +	return rpcc();  } +static struct clocksource clocksource_rpcc = { +	.name                   = "rpcc", +	.rating                 = 300, +	.read                   = read_rpcc, +	.mask                   = CLOCKSOURCE_MASK(32), +	.flags                  = CLOCK_SOURCE_IS_CONTINUOUS +}; +#endif /* ALPHA_WTINT */ + +  /* Validate a computed cycle counter result against the known bounds for     the given processor core.  There's too much brokenness in the way of     timing hardware for any one method to work everywhere.  :-( @@ -359,34 +391,6 @@ rpcc_after_update_in_progress(void)  	return rpcc();  } -#ifndef CONFIG_SMP -/* Until and unless we figure out how to get cpu cycle counters -   in sync and keep them there, we can't use the rpcc.  */ -static cycle_t read_rpcc(struct clocksource *cs) -{ -	cycle_t ret = (cycle_t)rpcc(); -	return ret; -} - -static struct clocksource clocksource_rpcc = { -	.name                   = "rpcc", -	.rating                 = 300, -	.read                   = read_rpcc, -	.mask                   = CLOCKSOURCE_MASK(32), -	.flags                  = CLOCK_SOURCE_IS_CONTINUOUS -}; - -static inline void register_rpcc_clocksource(long cycle_freq) -{ -	clocksource_calc_mult_shift(&clocksource_rpcc, cycle_freq, 4); -	clocksource_register(&clocksource_rpcc); -} -#else /* !CONFIG_SMP */ -static inline void register_rpcc_clocksource(long cycle_freq) -{ -} -#endif /* !CONFIG_SMP */ -  void __init  time_init(void)  { @@ -394,6 +398,15 @@ time_init(void)  	unsigned long cycle_freq, tolerance;  	long diff; +	if (alpha_using_qemu) { +		clocksource_register_hz(&qemu_cs, NSEC_PER_SEC); +		init_qemu_clockevent(); + +		timer_irqaction.handler = qemu_timer_interrupt; +		init_rtc_irq(); +		return; +	} +  	/* Calibrate CPU clock -- attempt #1.  */  	if (!est_cycle_freq)  		est_cycle_freq = validate_cc_value(calibrate_cc_with_pit()); @@ -428,100 +441,25 @@ time_init(void)  		       "and unable to estimate a proper value!\n");  	} -	/* From John Bowman <bowman@math.ualberta.ca>: allow the values -	   to settle, as the Update-In-Progress bit going low isn't good -	   enough on some hardware.  2ms is our guess; we haven't found  -	   bogomips yet, but this is close on a 500Mhz box.  */ -	__delay(1000000); - - -	if (HZ > (1<<16)) { -		extern void __you_loose (void); -		__you_loose(); -	} - -	register_rpcc_clocksource(cycle_freq); - -	state.last_time = cc1; -	state.scaled_ticks_per_cycle -		= ((unsigned long) HZ << FIX_SHIFT) / cycle_freq; -	state.partial_tick = 0L; +	/* See above for restrictions on using clocksource_rpcc.  */ +#ifndef CONFIG_ALPHA_WTINT +	if (hwrpb->nr_processors == 1) +		clocksource_register_hz(&clocksource_rpcc, cycle_freq); +#endif  	/* Startup the timer source. */  	alpha_mv.init_rtc(); +	init_rtc_clockevent();  } -/* - * In order to set the CMOS clock precisely, set_rtc_mmss has to be - * called 500 ms after the second nowtime has started, because when - * nowtime is written into the registers of the CMOS clock, it will - * jump to the next second precisely 500 ms later. Check the Motorola - * MC146818A or Dallas DS12887 data sheet for details. - * - * BUG: This routine does not handle hour overflow properly; it just - *      sets the minutes. Usually you won't notice until after reboot! - */ - - -static int -set_rtc_mmss(unsigned long nowtime) +/* Initialize the clock_event_device for secondary cpus.  */ +#ifdef CONFIG_SMP +void __init +init_clockevent(void)  { -	int retval = 0; -	int real_seconds, real_minutes, cmos_minutes; -	unsigned char save_control, save_freq_select; - -	/* irq are locally disabled here */ -	spin_lock(&rtc_lock); -	/* Tell the clock it's being set */ -	save_control = CMOS_READ(RTC_CONTROL); -	CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL); - -	/* Stop and reset prescaler */ -	save_freq_select = CMOS_READ(RTC_FREQ_SELECT); -	CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT); - -	cmos_minutes = CMOS_READ(RTC_MINUTES); -	if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) -		cmos_minutes = bcd2bin(cmos_minutes); - -	/* -	 * since we're only adjusting minutes and seconds, -	 * don't interfere with hour overflow. This avoids -	 * messing with unknown time zones but requires your -	 * RTC not to be off by more than 15 minutes -	 */ -	real_seconds = nowtime % 60; -	real_minutes = nowtime / 60; -	if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1) { -		/* correct for half hour time zone */ -		real_minutes += 30; -	} -	real_minutes %= 60; - -	if (abs(real_minutes - cmos_minutes) < 30) { -		if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { -			real_seconds = bin2bcd(real_seconds); -			real_minutes = bin2bcd(real_minutes); -		} -		CMOS_WRITE(real_seconds,RTC_SECONDS); -		CMOS_WRITE(real_minutes,RTC_MINUTES); -	} else { -		printk(KERN_WARNING -		       "set_rtc_mmss: can't update from %d to %d\n", -		       cmos_minutes, real_minutes); - 		retval = -1; -	} - -	/* The following flags have to be released exactly in this order, -	 * otherwise the DS12887 (popular MC146818A clone with integrated -	 * battery and quartz) will not reset the oscillator and will not -	 * update precisely 500 ms later. You won't find this mentioned in -	 * the Dallas Semiconductor data sheets, but who believes data -	 * sheets anyway ...                           -- Markus Kuhn -	 */ -	CMOS_WRITE(save_control, RTC_CONTROL); -	CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT); -	spin_unlock(&rtc_lock); - -	return retval; +	if (alpha_using_qemu) +		init_qemu_clockevent(); +	else +		init_rtc_clockevent();  } +#endif diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c index 0414e021a91..9c4c189eb22 100644 --- a/arch/alpha/kernel/traps.c +++ b/arch/alpha/kernel/traps.c @@ -24,6 +24,7 @@  #include <asm/sysinfo.h>  #include <asm/hwrpb.h>  #include <asm/mmu_context.h> +#include <asm/special_insns.h>  #include "proto.h" @@ -31,7 +32,7 @@  static int opDEC_fix; -static void __cpuinit +static void  opDEC_check(void)  {  	__asm__ __volatile__ ( @@ -65,8 +66,8 @@ dik_show_regs(struct pt_regs *regs, unsigned long *r9_15)  {  	printk("pc = [<%016lx>]  ra = [<%016lx>]  ps = %04lx    %s\n",  	       regs->pc, regs->r26, regs->ps, print_tainted()); -	print_symbol("pc is at %s\n", regs->pc); -	print_symbol("ra is at %s\n", regs->r26 ); +	printk("pc is at %pSR\n", (void *)regs->pc); +	printk("ra is at %pSR\n", (void *)regs->r26);  	printk("v0 = %016lx  t0 = %016lx  t1 = %016lx\n",  	       regs->r0, regs->r1, regs->r2);  	printk("t2 = %016lx  t3 = %016lx  t4 = %016lx\n", @@ -131,9 +132,7 @@ dik_show_trace(unsigned long *sp)  			continue;  		if (tmp >= (unsigned long) &_etext)  			continue; -		printk("[<%lx>]", tmp); -		print_symbol(" %s", tmp); -		printk("\n"); +		printk("[<%lx>] %pSR\n", tmp, (void *)tmp);  		if (i > 40) {  			printk(" ...");  			break; @@ -168,13 +167,6 @@ void show_stack(struct task_struct *task, unsigned long *sp)  	dik_show_trace(sp);  } -void dump_stack(void) -{ -	show_stack(NULL, NULL); -} - -EXPORT_SYMBOL(dump_stack); -  void  die_if_kernel(char * str, struct pt_regs *regs, long err, unsigned long *r9_15)  { @@ -185,7 +177,7 @@ die_if_kernel(char * str, struct pt_regs *regs, long err, unsigned long *r9_15)  #endif  	printk("%s(%d): %s %ld\n", current->comm, task_pid_nr(current), str, err);  	dik_show_regs(regs, r9_15); -	add_taint(TAINT_DIE); +	add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);  	dik_show_trace((unsigned long *)(regs+1));  	dik_show_code((unsigned int *)regs->pc); @@ -249,6 +241,21 @@ do_entIF(unsigned long type, struct pt_regs *regs)  			       (const char *)(data[1] | (long)data[2] << 32),   			       data[0]);  		} +#ifdef CONFIG_ALPHA_WTINT +		if (type == 4) { +			/* If CALL_PAL WTINT is totally unsupported by the +			   PALcode, e.g. MILO, "emulate" it by overwriting +			   the insn.  */ +			unsigned int *pinsn +			  = (unsigned int *) regs->pc - 1; +			if (*pinsn == PAL_wtint) { +				*pinsn = 0x47e01400; /* mov 0,$0 */ +				imb(); +				regs->r0 = 0; +				return; +			} +		} +#endif /* ALPHA_WTINT */  		die_if_kernel((type == 1 ? "Kernel Bug" : "Instruction fault"),  			      regs, type, NULL);  	} @@ -779,17 +786,17 @@ do_entUnaUser(void __user * va, unsigned long opcode,  	/* Check the UAC bits to decide what the user wants us to do  	   with the unaliged access.  */ -	if (!test_thread_flag (TIF_UAC_NOPRINT)) { +	if (!(current_thread_info()->status & TS_UAC_NOPRINT)) {  		if (__ratelimit(&ratelimit)) {  			printk("%s(%d): unaligned trap at %016lx: %p %lx %ld\n",  			       current->comm, task_pid_nr(current),  			       regs->pc - 4, va, opcode, reg);  		}  	} -	if (test_thread_flag (TIF_UAC_SIGBUS)) +	if ((current_thread_info()->status & TS_UAC_SIGBUS))  		goto give_sigbus;  	/* Not sure why you'd want to use this, but... */ -	if (test_thread_flag (TIF_UAC_NOFIX)) +	if ((current_thread_info()->status & TS_UAC_NOFIX))  		return;  	/* Don't bother reading ds in the access check since we already @@ -1065,7 +1072,7 @@ give_sigbus:  	return;  } -void __cpuinit +void  trap_init(void)  {  	/* Tell PAL-code what global pointer we want in the kernel.  */ diff --git a/arch/alpha/kernel/vmlinux.lds.S b/arch/alpha/kernel/vmlinux.lds.S index 003ef4c0258..647b84c1538 100644 --- a/arch/alpha/kernel/vmlinux.lds.S +++ b/arch/alpha/kernel/vmlinux.lds.S @@ -1,6 +1,8 @@  #include <asm-generic/vmlinux.lds.h>  #include <asm/thread_info.h> +#include <asm/cache.h>  #include <asm/page.h> +#include <asm/setup.h>  OUTPUT_FORMAT("elf64-alpha")  OUTPUT_ARCH(alpha) @@ -24,6 +26,7 @@ SECTIONS  		*(.fixup)  		*(.gnu.warning)  	} :kernel +	swapper_pg_dir = SWAPPER_PGD;  	_etext = .;	/* End of text section */  	NOTES :kernel :note @@ -38,15 +41,16 @@ SECTIONS  	__init_begin = ALIGN(PAGE_SIZE);  	INIT_TEXT_SECTION(PAGE_SIZE)  	INIT_DATA_SECTION(16) -	PERCPU(PAGE_SIZE) +	PERCPU_SECTION(L1_CACHE_BYTES)  	/* Align to THREAD_SIZE rather than PAGE_SIZE here so any padding page  	   needed for the THREAD_SIZE aligned init_task gets freed after init */  	. = ALIGN(THREAD_SIZE);  	__init_end = .;  	/* Freed after init ends here */ +	_sdata = .;	/* Start of rw data section */  	_data = .; -	RW_DATA_SECTION(64, PAGE_SIZE, THREAD_SIZE) +	RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)  	.got : {  		*(.got) diff --git a/arch/alpha/lib/Makefile b/arch/alpha/lib/Makefile index 9b72c59c95b..59660743237 100644 --- a/arch/alpha/lib/Makefile +++ b/arch/alpha/lib/Makefile @@ -2,8 +2,8 @@  # Makefile for alpha-specific library files..  # -EXTRA_AFLAGS := $(KBUILD_CFLAGS) -EXTRA_CFLAGS := -Werror +asflags-y := $(KBUILD_CFLAGS) +ccflags-y := -Werror  # Many of these routines have implementations tuned for ev6.  # Choose them iff we're targeting ev6 specifically. @@ -31,8 +31,6 @@ lib-y =	__divqu.o __remqu.o __divlu.o __remlu.o \  	$(ev6-y)memchr.o \  	$(ev6-y)copy_user.o \  	$(ev6-y)clear_user.o \ -	$(ev6-y)strncpy_from_user.o \ -	$(ev67-y)strlen_user.o \  	$(ev6-y)csum_ipv6_magic.o \  	$(ev6-y)clear_page.o \  	$(ev6-y)copy_page.o \ diff --git a/arch/alpha/lib/csum_partial_copy.c b/arch/alpha/lib/csum_partial_copy.c index 40736da9bea..5675dca8dbb 100644 --- a/arch/alpha/lib/csum_partial_copy.c +++ b/arch/alpha/lib/csum_partial_copy.c @@ -130,7 +130,7 @@ csum_partial_cfu_aligned(const unsigned long __user *src, unsigned long *dst,  		*dst = word | tmp;  		checksum += carry;  	} -	if (err) *errp = err; +	if (err && errp) *errp = err;  	return checksum;  } @@ -185,7 +185,7 @@ csum_partial_cfu_dest_aligned(const unsigned long __user *src,  		*dst = word | tmp;  		checksum += carry;  	} -	if (err) *errp = err; +	if (err && errp) *errp = err;  	return checksum;  } @@ -242,7 +242,7 @@ csum_partial_cfu_src_aligned(const unsigned long __user *src,  	stq_u(partial_dest | second_dest, dst);  out:  	checksum += carry; -	if (err) *errp = err; +	if (err && errp) *errp = err;  	return checksum;  } @@ -325,7 +325,7 @@ csum_partial_cfu_unaligned(const unsigned long __user * src,  		stq_u(partial_dest | word | second_dest, dst);  		checksum += carry;  	} -	if (err) *errp = err; +	if (err && errp) *errp = err;  	return checksum;  } @@ -338,6 +338,11 @@ csum_partial_copy_from_user(const void __user *src, void *dst, int len,  	unsigned long doff = 7 & (unsigned long) dst;  	if (len) { +		if (!access_ok(VERIFY_READ, src, len)) { +			if (errp) *errp = -EFAULT; +			memset(dst, 0, len); +			return sum; +		}  		if (!doff) {  			if (!soff)  				checksum = csum_partial_cfu_aligned( @@ -373,6 +378,11 @@ csum_partial_copy_from_user(const void __user *src, void *dst, int len,  __wsum  csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)  { -	return csum_partial_copy_from_user((__force const void __user *)src, -			dst, len, sum, NULL); +	__wsum checksum; +	mm_segment_t oldfs = get_fs(); +	set_fs(KERNEL_DS); +	checksum = csum_partial_copy_from_user((__force const void __user *)src, +						dst, len, sum, NULL); +	set_fs(oldfs); +	return checksum;  } diff --git a/arch/alpha/lib/dec_and_lock.c b/arch/alpha/lib/dec_and_lock.c index 0f5520d2f45..f9f5fe830e9 100644 --- a/arch/alpha/lib/dec_and_lock.c +++ b/arch/alpha/lib/dec_and_lock.c @@ -6,7 +6,7 @@   */  #include <linux/spinlock.h> -#include <asm/atomic.h> +#include <linux/atomic.h>    asm (".text					\n\  	.global _atomic_dec_and_lock		\n\ diff --git a/arch/alpha/lib/ev6-memset.S b/arch/alpha/lib/ev6-memset.S index d8b94e1c7fc..356bb2fdd70 100644 --- a/arch/alpha/lib/ev6-memset.S +++ b/arch/alpha/lib/ev6-memset.S @@ -30,14 +30,15 @@  	.set noat  	.set noreorder  .text +	.globl memset  	.globl __memset +	.globl ___memset  	.globl __memsetw  	.globl __constant_c_memset -	.globl memset -	.ent __memset +	.ent ___memset  .align 5 -__memset: +___memset:  	.frame $30,0,$26,0  	.prologue 0 @@ -227,7 +228,7 @@ end_b:  	nop  	nop  	ret $31,($26),1		# L0 : -	.end __memset +	.end ___memset  	/*  	 * This is the original body of code, prior to replication and @@ -594,4 +595,5 @@ end_w:  	.end __memsetw -memset = __memset +memset = ___memset +__memset = ___memset diff --git a/arch/alpha/lib/ev6-strncpy_from_user.S b/arch/alpha/lib/ev6-strncpy_from_user.S deleted file mode 100644 index d2e28178cac..00000000000 --- a/arch/alpha/lib/ev6-strncpy_from_user.S +++ /dev/null @@ -1,424 +0,0 @@ -/* - * arch/alpha/lib/ev6-strncpy_from_user.S - * 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com> - * - * Just like strncpy except in the return value: - * - * -EFAULT       if an exception occurs before the terminator is copied. - * N             if the buffer filled. - * - * Otherwise the length of the string is returned. - * - * Much of the information about 21264 scheduling/coding comes from: - *	Compiler Writer's Guide for the Alpha 21264 - *	abbreviated as 'CWG' in other comments here - *	ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html - * Scheduling notation: - *	E	- either cluster - *	U	- upper subcluster; U0 - subcluster U0; U1 - subcluster U1 - *	L	- lower subcluster; L0 - subcluster L0; L1 - subcluster L1 - * A bunch of instructions got moved and temp registers were changed - * to aid in scheduling.  Control flow was also re-arranged to eliminate - * branches, and to provide longer code sequences to enable better scheduling. - * A total rewrite (using byte load/stores for start & tail sequences) - * is desirable, but very difficult to do without a from-scratch rewrite. - * Save that for the future. - */ - - -#include <asm/errno.h> -#include <asm/regdef.h> - - -/* Allow an exception for an insn; exit if we get one.  */ -#define EX(x,y...)			\ -	99: x,##y;			\ -	.section __ex_table,"a";	\ -	.long 99b - .;			\ -	lda $31, $exception-99b($0); 	\ -	.previous - - -	.set noat -	.set noreorder -	.text - -	.globl __strncpy_from_user -	.ent __strncpy_from_user -	.frame $30, 0, $26 -	.prologue 0 - -	.align 4 -__strncpy_from_user: -	and	a0, 7, t3	# E : find dest misalignment -	beq	a2, $zerolength	# U : - -	/* Are source and destination co-aligned?  */ -	mov	a0, v0		# E : save the string start -	xor	a0, a1, t4	# E : -	EX( ldq_u t1, 0(a1) )	# L : Latency=3 load first quadword -	ldq_u	t0, 0(a0)	# L : load first (partial) aligned dest quadword - -	addq	a2, t3, a2	# E : bias count by dest misalignment -	subq	a2, 1, a3	# E : -	addq	zero, 1, t10	# E : -	and	t4, 7, t4	# E : misalignment between the two - -	and	a3, 7, t6	# E : number of tail bytes -	sll	t10, t6, t10	# E : t10 = bitmask of last count byte -	bne	t4, $unaligned	# U : -	lda	t2, -1		# E : build a mask against false zero - -	/* -	 * We are co-aligned; take care of a partial first word. -	 * On entry to this basic block: -	 * t0 == the first destination word for masking back in -	 * t1 == the first source word. -	 */ - -	srl	a3, 3, a2	# E : a2 = loop counter = (count - 1)/8 -	addq	a1, 8, a1	# E : -	mskqh	t2, a1, t2	# U :   detection in the src word -	nop - -	/* Create the 1st output word and detect 0's in the 1st input word.  */ -	mskqh	t1, a1, t3	# U : -	mskql	t0, a1, t0	# U : assemble the first output word -	ornot	t1, t2, t2	# E : -	nop - -	cmpbge	zero, t2, t8	# E : bits set iff null found -	or	t0, t3, t0	# E : -	beq	a2, $a_eoc	# U : -	bne	t8, $a_eos	# U : 2nd branch in a quad.  Bad. - -	/* On entry to this basic block: -	 * t0 == a source quad not containing a null. -	 * a0 - current aligned destination address -	 * a1 - current aligned source address -	 * a2 - count of quadwords to move. -	 * NOTE: Loop improvement - unrolling this is going to be -	 *	a huge win, since we're going to stall otherwise. -	 *	Fix this later.  For _really_ large copies, look -	 *	at using wh64 on a look-ahead basis.  See the code -	 *	in clear_user.S and copy_user.S. -	 * Presumably, since (a0) and (a1) do not overlap (by C definition) -	 * Lots of nops here: -	 *	- Separate loads from stores -	 *	- Keep it to 1 branch/quadpack so the branch predictor -	 *	  can train. -	 */ -$a_loop: -	stq_u	t0, 0(a0)	# L : -	addq	a0, 8, a0	# E : -	nop -	subq	a2, 1, a2	# E : - -	EX( ldq_u t0, 0(a1) )	# L : -	addq	a1, 8, a1	# E : -	cmpbge	zero, t0, t8	# E : Stall 2 cycles on t0 -	beq	a2, $a_eoc      # U : - -	beq	t8, $a_loop	# U : -	nop -	nop -	nop - -	/* Take care of the final (partial) word store.  At this point -	 * the end-of-count bit is set in t8 iff it applies. -	 * -	 * On entry to this basic block we have: -	 * t0 == the source word containing the null -	 * t8 == the cmpbge mask that found it. -	 */ -$a_eos: -	negq	t8, t12		# E : find low bit set -	and	t8, t12, t12	# E :  - -	/* We're doing a partial word store and so need to combine -	   our source and original destination words.  */ -	ldq_u	t1, 0(a0)	# L : -	subq	t12, 1, t6	# E : - -	or	t12, t6, t8	# E : -	zapnot	t0, t8, t0	# U : clear src bytes > null -	zap	t1, t8, t1	# U : clear dst bytes <= null -	or	t0, t1, t0	# E : - -	stq_u	t0, 0(a0)	# L : -	br	$finish_up	# L0 : -	nop -	nop - -	/* Add the end-of-count bit to the eos detection bitmask.  */ -	.align 4 -$a_eoc: -	or	t10, t8, t8 -	br	$a_eos -	nop -	nop - - -/* The source and destination are not co-aligned.  Align the destination -   and cope.  We have to be very careful about not reading too much and -   causing a SEGV.  */ - -	.align 4 -$u_head: -	/* We know just enough now to be able to assemble the first -	   full source word.  We can still find a zero at the end of it -	   that prevents us from outputting the whole thing. - -	   On entry to this basic block: -	   t0 == the first dest word, unmasked -	   t1 == the shifted low bits of the first source word -	   t6 == bytemask that is -1 in dest word bytes */ - -	EX( ldq_u t2, 8(a1) )	# L : load second src word -	addq	a1, 8, a1	# E : -	mskql	t0, a0, t0	# U : mask trailing garbage in dst -	extqh	t2, a1, t4	# U : - -	or	t1, t4, t1	# E : first aligned src word complete -	mskqh	t1, a0, t1	# U : mask leading garbage in src -	or	t0, t1, t0	# E : first output word complete -	or	t0, t6, t6	# E : mask original data for zero test - -	cmpbge	zero, t6, t8	# E : -	beq	a2, $u_eocfin	# U : -	bne	t8, $u_final	# U : bad news - 2nd branch in a quad -	lda	t6, -1		# E : mask out the bits we have - -	mskql	t6, a1, t6	# U :   already seen -	stq_u	t0, 0(a0)	# L : store first output word -	or      t6, t2, t2	# E : -	cmpbge	zero, t2, t8	# E : find nulls in second partial - -	addq	a0, 8, a0		# E : -	subq	a2, 1, a2		# E : -	bne	t8, $u_late_head_exit	# U : -	nop - -	/* Finally, we've got all the stupid leading edge cases taken care -	   of and we can set up to enter the main loop.  */ - -	extql	t2, a1, t1	# U : position hi-bits of lo word -	EX( ldq_u t2, 8(a1) )	# L : read next high-order source word -	addq	a1, 8, a1	# E : -	cmpbge	zero, t2, t8	# E : - -	beq	a2, $u_eoc	# U : -	bne	t8, $u_eos	# U : -	nop -	nop - -	/* Unaligned copy main loop.  In order to avoid reading too much, -	   the loop is structured to detect zeros in aligned source words. -	   This has, unfortunately, effectively pulled half of a loop -	   iteration out into the head and half into the tail, but it does -	   prevent nastiness from accumulating in the very thing we want -	   to run as fast as possible. - -	   On entry to this basic block: -	   t1 == the shifted high-order bits from the previous source word -	   t2 == the unshifted current source word - -	   We further know that t2 does not contain a null terminator.  */ - -	/* -	 * Extra nops here: -	 *	separate load quads from store quads -	 *	only one branch/quad to permit predictor training -	 */ - -	.align 4 -$u_loop: -	extqh	t2, a1, t0	# U : extract high bits for current word -	addq	a1, 8, a1	# E : -	extql	t2, a1, t3	# U : extract low bits for next time -	addq	a0, 8, a0	# E : - -	or	t0, t1, t0	# E : current dst word now complete -	EX( ldq_u t2, 0(a1) )	# L : load high word for next time -	subq	a2, 1, a2	# E : -	nop - -	stq_u	t0, -8(a0)	# L : save the current word -	mov	t3, t1		# E : -	cmpbge	zero, t2, t8	# E : test new word for eos -	beq	a2, $u_eoc	# U : - -	beq	t8, $u_loop	# U : -	nop -	nop -	nop - -	/* We've found a zero somewhere in the source word we just read. -	   If it resides in the lower half, we have one (probably partial) -	   word to write out, and if it resides in the upper half, we -	   have one full and one partial word left to write out. - -	   On entry to this basic block: -	   t1 == the shifted high-order bits from the previous source word -	   t2 == the unshifted current source word.  */ -	.align 4 -$u_eos: -	extqh	t2, a1, t0	# U : -	or	t0, t1, t0	# E : first (partial) source word complete -	cmpbge	zero, t0, t8	# E : is the null in this first bit? -	nop - -	bne	t8, $u_final	# U : -	stq_u	t0, 0(a0)	# L : the null was in the high-order bits -	addq	a0, 8, a0	# E : -	subq	a2, 1, a2	# E : - -	.align 4 -$u_late_head_exit: -	extql	t2, a1, t0	# U : -	cmpbge	zero, t0, t8	# E : -	or	t8, t10, t6	# E : -	cmoveq	a2, t6, t8	# E : - -	/* Take care of a final (probably partial) result word. -	   On entry to this basic block: -	   t0 == assembled source word -	   t8 == cmpbge mask that found the null.  */ -	.align 4 -$u_final: -	negq	t8, t6		# E : isolate low bit set -	and	t6, t8, t12	# E : -	ldq_u	t1, 0(a0)	# L : -	subq	t12, 1, t6	# E : - -	or	t6, t12, t8	# E : -	zapnot	t0, t8, t0	# U : kill source bytes > null -	zap	t1, t8, t1	# U : kill dest bytes <= null -	or	t0, t1, t0	# E : - -	stq_u	t0, 0(a0)	# E : -	br	$finish_up	# U : -	nop -	nop - -	.align 4 -$u_eoc:				# end-of-count -	extqh	t2, a1, t0	# U : -	or	t0, t1, t0	# E : -	cmpbge	zero, t0, t8	# E : -	nop - -	.align 4 -$u_eocfin:			# end-of-count, final word -	or	t10, t8, t8	# E : -	br	$u_final	# U : -	nop -	nop - -	/* Unaligned copy entry point.  */ -	.align 4 -$unaligned: - -	srl	a3, 3, a2	# U : a2 = loop counter = (count - 1)/8 -	and	a0, 7, t4	# E : find dest misalignment -	and	a1, 7, t5	# E : find src misalignment -	mov	zero, t0	# E : - -	/* Conditionally load the first destination word and a bytemask -	   with 0xff indicating that the destination byte is sacrosanct.  */ - -	mov	zero, t6	# E : -	beq	t4, 1f		# U : -	ldq_u	t0, 0(a0)	# L : -	lda	t6, -1		# E : - -	mskql	t6, a0, t6	# E : -	nop -	nop -	nop - -	.align 4 -1: -	subq	a1, t4, a1	# E : sub dest misalignment from src addr -	/* If source misalignment is larger than dest misalignment, we need -	   extra startup checks to avoid SEGV.  */ -	cmplt	t4, t5, t12	# E : -	extql	t1, a1, t1	# U : shift src into place -	lda	t2, -1		# E : for creating masks later - -	beq	t12, $u_head	# U : -	mskqh	t2, t5, t2	# U : begin src byte validity mask -	cmpbge	zero, t1, t8	# E : is there a zero? -	nop - -	extql	t2, a1, t2	# U : -	or	t8, t10, t5	# E : test for end-of-count too -	cmpbge	zero, t2, t3	# E : -	cmoveq	a2, t5, t8	# E : Latency=2, extra map slot - -	nop			# E : goes with cmov -	andnot	t8, t3, t8	# E : -	beq	t8, $u_head	# U : -	nop - -	/* At this point we've found a zero in the first partial word of -	   the source.  We need to isolate the valid source data and mask -	   it into the original destination data.  (Incidentally, we know -	   that we'll need at least one byte of that original dest word.) */ - -	ldq_u	t0, 0(a0)	# L : -	negq	t8, t6		# E : build bitmask of bytes <= zero -	mskqh	t1, t4, t1	# U : -	and	t6, t8, t12	# E : - -	subq	t12, 1, t6	# E : -	or	t6, t12, t8	# E : -	zapnot	t2, t8, t2	# U : prepare source word; mirror changes -	zapnot	t1, t8, t1	# U : to source validity mask - -	andnot	t0, t2, t0	# E : zero place for source to reside -	or	t0, t1, t0	# E : and put it there -	stq_u	t0, 0(a0)	# L : -	nop - -	.align 4 -$finish_up: -	zapnot	t0, t12, t4	# U : was last byte written null? -	and	t12, 0xf0, t3	# E : binary search for the address of the -	cmovne	t4, 1, t4	# E : Latency=2, extra map slot -	nop			# E : with cmovne - -	and	t12, 0xcc, t2	# E : last byte written -	and	t12, 0xaa, t1	# E : -	cmovne	t3, 4, t3	# E : Latency=2, extra map slot -	nop			# E : with cmovne - -	bic	a0, 7, t0 -	cmovne	t2, 2, t2	# E : Latency=2, extra map slot -	nop			# E : with cmovne -	nop - -	cmovne	t1, 1, t1	# E : Latency=2, extra map slot -	nop			# E : with cmovne -	addq	t0, t3, t0	# E : -	addq	t1, t2, t1	# E : - -	addq	t0, t1, t0	# E : -	addq	t0, t4, t0	# add one if we filled the buffer -	subq	t0, v0, v0	# find string length -	ret			# L0 : - -	.align 4 -$zerolength: -	nop -	nop -	nop -	clr	v0 - -$exception: -	nop -	nop -	nop -	ret - -	.end __strncpy_from_user diff --git a/arch/alpha/lib/ev67-strlen_user.S b/arch/alpha/lib/ev67-strlen_user.S deleted file mode 100644 index 57e0d77b81a..00000000000 --- a/arch/alpha/lib/ev67-strlen_user.S +++ /dev/null @@ -1,107 +0,0 @@ -/* - * arch/alpha/lib/ev67-strlen_user.S - * 21264 version contributed by Rick Gorton <rick.gorton@api-networks.com> - * - * Return the length of the string including the NULL terminator - * (strlen+1) or zero if an error occurred. - * - * In places where it is critical to limit the processing time, - * and the data is not trusted, strnlen_user() should be used. - * It will return a value greater than its second argument if - * that limit would be exceeded. This implementation is allowed - * to access memory beyond the limit, but will not cross a page - * boundary when doing so. - * - * Much of the information about 21264 scheduling/coding comes from: - *      Compiler Writer's Guide for the Alpha 21264 - *      abbreviated as 'CWG' in other comments here - *      ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html - * Scheduling notation: - *      E       - either cluster - *      U       - upper subcluster; U0 - subcluster U0; U1 - subcluster U1 - *      L       - lower subcluster; L0 - subcluster L0; L1 - subcluster L1 - * Try not to change the actual algorithm if possible for consistency. - */ - -#include <asm/regdef.h> - - -/* Allow an exception for an insn; exit if we get one.  */ -#define EX(x,y...)			\ -	99: x,##y;			\ -	.section __ex_table,"a";	\ -	.long 99b - .;			\ -	lda v0, $exception-99b(zero);	\ -	.previous - - -	.set noreorder -	.set noat -	.text - -	.globl __strlen_user -	.ent __strlen_user -	.frame sp, 0, ra - -	.align 4 -__strlen_user: -	ldah	a1, 32767(zero)	# do not use plain strlen_user() for strings -				# that might be almost 2 GB long; you should -				# be using strnlen_user() instead -	nop -	nop -	nop - -	.globl __strnlen_user - -	.align 4 -__strnlen_user: -	.prologue 0 -	EX( ldq_u t0, 0(a0) )	# L : load first quadword (a0 may be misaligned) -	lda     t1, -1(zero)	# E : - -	insqh   t1, a0, t1	# U : -	andnot  a0, 7, v0	# E : -	or      t1, t0, t0	# E : -	subq	a0, 1, a0	# E : get our +1 for the return  - -	cmpbge  zero, t0, t1	# E : t1 <- bitmask: bit i == 1 <==> i-th byte == 0 -	subq	a1, 7, t2	# E : -	subq	a0, v0, t0	# E : -	bne     t1, $found	# U : - -	addq	t2, t0, t2	# E : -	addq	a1, 1, a1	# E : -	nop			# E : -	nop			# E : - -	.align 4 -$loop:	ble	t2, $limit	# U : -	EX( ldq t0, 8(v0) )	# L : -	nop			# E : -	nop			# E : - -	cmpbge  zero, t0, t1	# E : -	subq	t2, 8, t2	# E : -	addq    v0, 8, v0	# E : addr += 8 -	beq     t1, $loop	# U : - -$found: cttz	t1, t2		# U0 : -	addq	v0, t2, v0	# E : -	subq    v0, a0, v0	# E : -	ret			# L0 : - -$exception: -	nop -	nop -	nop -	ret - -	.align 4		# currently redundant -$limit: -	nop -	nop -	subq	a1, t2, v0 -	ret - -	.end __strlen_user diff --git a/arch/alpha/lib/ev67-strrchr.S b/arch/alpha/lib/ev67-strrchr.S index 3fd8bf414c7..dd0d8c6b9f5 100644 --- a/arch/alpha/lib/ev67-strrchr.S +++ b/arch/alpha/lib/ev67-strrchr.S @@ -82,7 +82,7 @@ $loop:  $eos:  	negq	t1, t4		# E : isolate first null byte match  	and	t1, t4, t4	# E : -	subq	t4, 1, t5	# E : build a mask of the bytes upto... +	subq	t4, 1, t5	# E : build a mask of the bytes up to...  	or	t4, t5, t4	# E : ... and including the null  	and	t3, t4, t3	# E : mask out char matches after null diff --git a/arch/alpha/lib/fls.c b/arch/alpha/lib/fls.c index 32afaa3fa68..ddd048c0d82 100644 --- a/arch/alpha/lib/fls.c +++ b/arch/alpha/lib/fls.c @@ -6,7 +6,7 @@  #include <linux/bitops.h>  /* This is fls(x)-1, except zero is held to zero.  This allows most -   efficent input into extbl, plus it allows easy handling of fls(0)=0.  */ +   efficient input into extbl, plus it allows easy handling of fls(0)=0.  */  const unsigned char __flsm1_tab[256] =   { diff --git a/arch/alpha/lib/memset.S b/arch/alpha/lib/memset.S index 311b8cfc691..76ccc6d1f36 100644 --- a/arch/alpha/lib/memset.S +++ b/arch/alpha/lib/memset.S @@ -19,11 +19,13 @@  .text  	.globl memset  	.globl __memset +	.globl ___memset  	.globl __memsetw  	.globl __constant_c_memset -	.ent __memset + +	.ent ___memset  .align 5 -__memset: +___memset:  	.frame $30,0,$26,0  	.prologue 0 @@ -103,7 +105,7 @@ within_one_quad:  end:  	ret $31,($26),1		/* E1 */ -	.end __memset +	.end ___memset  	.align 5  	.ent __memsetw @@ -121,4 +123,5 @@ __memsetw:  	.end __memsetw -memset = __memset +memset = ___memset +__memset = ___memset diff --git a/arch/alpha/lib/stacktrace.c b/arch/alpha/lib/stacktrace.c index 6d432e42aed..5e832161e6d 100644 --- a/arch/alpha/lib/stacktrace.c +++ b/arch/alpha/lib/stacktrace.c @@ -1,5 +1,4 @@  #include <linux/kernel.h> -#include <asm/system.h>  typedef unsigned int instr; diff --git a/arch/alpha/lib/strlen_user.S b/arch/alpha/lib/strlen_user.S deleted file mode 100644 index 508a18e9647..00000000000 --- a/arch/alpha/lib/strlen_user.S +++ /dev/null @@ -1,91 +0,0 @@ -/* - * arch/alpha/lib/strlen_user.S - * - * Return the length of the string including the NUL terminator - * (strlen+1) or zero if an error occurred. - * - * In places where it is critical to limit the processing time, - * and the data is not trusted, strnlen_user() should be used. - * It will return a value greater than its second argument if - * that limit would be exceeded. This implementation is allowed - * to access memory beyond the limit, but will not cross a page - * boundary when doing so. - */ - -#include <asm/regdef.h> - - -/* Allow an exception for an insn; exit if we get one.  */ -#define EX(x,y...)			\ -	99: x,##y;			\ -	.section __ex_table,"a";	\ -	.long 99b - .;			\ -	lda v0, $exception-99b(zero);	\ -	.previous - - -	.set noreorder -	.set noat -	.text - -	.globl __strlen_user -	.ent __strlen_user -	.frame sp, 0, ra - -	.align 3 -__strlen_user: -	ldah	a1, 32767(zero)	# do not use plain strlen_user() for strings -				# that might be almost 2 GB long; you should -				# be using strnlen_user() instead - -	.globl __strnlen_user - -	.align 3 -__strnlen_user: -	.prologue 0 - -	EX( ldq_u t0, 0(a0) )	# load first quadword (a0 may be misaligned) -	lda     t1, -1(zero) -	insqh   t1, a0, t1 -	andnot  a0, 7, v0 -	or      t1, t0, t0 -	subq	a0, 1, a0	# get our +1 for the return  -	cmpbge  zero, t0, t1	# t1 <- bitmask: bit i == 1 <==> i-th byte == 0 -	subq	a1, 7, t2 -	subq	a0, v0, t0 -	bne     t1, $found - -	addq	t2, t0, t2 -	addq	a1, 1, a1 - -	.align 3 -$loop:	ble	t2, $limit -	EX( ldq t0, 8(v0) ) -	subq	t2, 8, t2 -	addq    v0, 8, v0	# addr += 8 -	cmpbge  zero, t0, t1 -	beq     t1, $loop - -$found:	negq    t1, t2		# clear all but least set bit -	and     t1, t2, t1 - -	and     t1, 0xf0, t2	# binary search for that set bit -	and	t1, 0xcc, t3 -	and	t1, 0xaa, t4 -	cmovne	t2, 4, t2 -	cmovne	t3, 2, t3 -	cmovne	t4, 1, t4 -	addq	t2, t3, t2 -	addq	v0, t4, v0 -	addq	v0, t2, v0 -	nop			# dual issue next two on ev4 and ev5 -	subq    v0, a0, v0 -$exception: -	ret - -	.align 3		# currently redundant -$limit: -	subq	a1, t2, v0 -	ret - -	.end __strlen_user diff --git a/arch/alpha/lib/strncpy_from_user.S b/arch/alpha/lib/strncpy_from_user.S deleted file mode 100644 index 73ee21160ff..00000000000 --- a/arch/alpha/lib/strncpy_from_user.S +++ /dev/null @@ -1,339 +0,0 @@ -/* - * arch/alpha/lib/strncpy_from_user.S - * Contributed by Richard Henderson (rth@tamu.edu) - * - * Just like strncpy except in the return value: - * - * -EFAULT       if an exception occurs before the terminator is copied. - * N             if the buffer filled. - * - * Otherwise the length of the string is returned. - */ - - -#include <asm/errno.h> -#include <asm/regdef.h> - - -/* Allow an exception for an insn; exit if we get one.  */ -#define EX(x,y...)			\ -	99: x,##y;			\ -	.section __ex_table,"a";	\ -	.long 99b - .;			\ -	lda $31, $exception-99b($0); 	\ -	.previous - - -	.set noat -	.set noreorder -	.text - -	.globl __strncpy_from_user -	.ent __strncpy_from_user -	.frame $30, 0, $26 -	.prologue 0 - -	.align 3 -$aligned: -	/* On entry to this basic block: -	   t0 == the first destination word for masking back in -	   t1 == the first source word.  */ - -	/* Create the 1st output word and detect 0's in the 1st input word.  */ -	lda	t2, -1		# e1    : build a mask against false zero -	mskqh	t2, a1, t2	# e0    :   detection in the src word -	mskqh	t1, a1, t3	# e0    : -	ornot	t1, t2, t2	# .. e1 : -	mskql	t0, a1, t0	# e0    : assemble the first output word -	cmpbge	zero, t2, t8	# .. e1 : bits set iff null found -	or	t0, t3, t0	# e0    : -	beq	a2, $a_eoc	# .. e1 : -	bne	t8, $a_eos	# .. e1 : - -	/* On entry to this basic block: -	   t0 == a source word not containing a null.  */ - -$a_loop: -	stq_u	t0, 0(a0)	# e0    : -	addq	a0, 8, a0	# .. e1 : -	EX( ldq_u t0, 0(a1) )	# e0    : -	addq	a1, 8, a1	# .. e1 : -	subq	a2, 1, a2	# e0    : -	cmpbge	zero, t0, t8	# .. e1 (stall) -	beq	a2, $a_eoc      # e1    : -	beq	t8, $a_loop	# e1    : - -	/* Take care of the final (partial) word store.  At this point -	   the end-of-count bit is set in t8 iff it applies. - -	   On entry to this basic block we have: -	   t0 == the source word containing the null -	   t8 == the cmpbge mask that found it.  */ - -$a_eos: -	negq	t8, t12		# e0    : find low bit set -	and	t8, t12, t12	# e1 (stall) - -	/* For the sake of the cache, don't read a destination word -	   if we're not going to need it.  */ -	and	t12, 0x80, t6	# e0    : -	bne	t6, 1f		# .. e1 (zdb) - -	/* We're doing a partial word store and so need to combine -	   our source and original destination words.  */ -	ldq_u	t1, 0(a0)	# e0    : -	subq	t12, 1, t6	# .. e1 : -	or	t12, t6, t8	# e0    : -	unop			# -	zapnot	t0, t8, t0	# e0    : clear src bytes > null -	zap	t1, t8, t1	# .. e1 : clear dst bytes <= null -	or	t0, t1, t0	# e1    : - -1:	stq_u	t0, 0(a0) -	br	$finish_up - -	/* Add the end-of-count bit to the eos detection bitmask.  */ -$a_eoc: -	or	t10, t8, t8 -	br	$a_eos - -	/*** The Function Entry Point ***/ -	.align 3 -__strncpy_from_user: -	mov	a0, v0		# save the string start -	beq	a2, $zerolength - -	/* Are source and destination co-aligned?  */ -	xor	a0, a1, t1	# e0    : -	and	a0, 7, t0	# .. e1 : find dest misalignment -	and	t1, 7, t1	# e0    : -	addq	a2, t0, a2	# .. e1 : bias count by dest misalignment -	subq	a2, 1, a2	# e0    : -	and	a2, 7, t2	# e1    : -	srl	a2, 3, a2	# e0    : a2 = loop counter = (count - 1)/8 -	addq	zero, 1, t10	# .. e1 : -	sll	t10, t2, t10	# e0    : t10 = bitmask of last count byte -	bne	t1, $unaligned	# .. e1 : - -	/* We are co-aligned; take care of a partial first word.  */ - -	EX( ldq_u t1, 0(a1) )	# e0    : load first src word -	addq	a1, 8, a1	# .. e1 : - -	beq	t0, $aligned	# avoid loading dest word if not needed -	ldq_u	t0, 0(a0)	# e0    : -	br	$aligned	# .. e1 : - - -/* The source and destination are not co-aligned.  Align the destination -   and cope.  We have to be very careful about not reading too much and -   causing a SEGV.  */ - -	.align 3 -$u_head: -	/* We know just enough now to be able to assemble the first -	   full source word.  We can still find a zero at the end of it -	   that prevents us from outputting the whole thing. - -	   On entry to this basic block: -	   t0 == the first dest word, unmasked -	   t1 == the shifted low bits of the first source word -	   t6 == bytemask that is -1 in dest word bytes */ - -	EX( ldq_u t2, 8(a1) )	# e0    : load second src word -	addq	a1, 8, a1	# .. e1 : -	mskql	t0, a0, t0	# e0    : mask trailing garbage in dst -	extqh	t2, a1, t4	# e0    : -	or	t1, t4, t1	# e1    : first aligned src word complete -	mskqh	t1, a0, t1	# e0    : mask leading garbage in src -	or	t0, t1, t0	# e0    : first output word complete -	or	t0, t6, t6	# e1    : mask original data for zero test -	cmpbge	zero, t6, t8	# e0    : -	beq	a2, $u_eocfin	# .. e1 : -	bne	t8, $u_final	# e1    : - -	lda	t6, -1			# e1    : mask out the bits we have -	mskql	t6, a1, t6		# e0    :   already seen -	stq_u	t0, 0(a0)		# e0    : store first output word -	or      t6, t2, t2		# .. e1 : -	cmpbge	zero, t2, t8		# e0    : find nulls in second partial -	addq	a0, 8, a0		# .. e1 : -	subq	a2, 1, a2		# e0    : -	bne	t8, $u_late_head_exit	# .. e1 : - -	/* Finally, we've got all the stupid leading edge cases taken care -	   of and we can set up to enter the main loop.  */ - -	extql	t2, a1, t1	# e0    : position hi-bits of lo word -	EX( ldq_u t2, 8(a1) )	# .. e1 : read next high-order source word -	addq	a1, 8, a1	# e0    : -	cmpbge	zero, t2, t8	# e1 (stall) -	beq	a2, $u_eoc	# e1    : -	bne	t8, $u_eos	# e1    : - -	/* Unaligned copy main loop.  In order to avoid reading too much, -	   the loop is structured to detect zeros in aligned source words. -	   This has, unfortunately, effectively pulled half of a loop -	   iteration out into the head and half into the tail, but it does -	   prevent nastiness from accumulating in the very thing we want -	   to run as fast as possible. - -	   On entry to this basic block: -	   t1 == the shifted high-order bits from the previous source word -	   t2 == the unshifted current source word - -	   We further know that t2 does not contain a null terminator.  */ - -	.align 3 -$u_loop: -	extqh	t2, a1, t0	# e0    : extract high bits for current word -	addq	a1, 8, a1	# .. e1 : -	extql	t2, a1, t3	# e0    : extract low bits for next time -	addq	a0, 8, a0	# .. e1 : -	or	t0, t1, t0	# e0    : current dst word now complete -	EX( ldq_u t2, 0(a1) )	# .. e1 : load high word for next time -	stq_u	t0, -8(a0)	# e0    : save the current word -	mov	t3, t1		# .. e1 : -	subq	a2, 1, a2	# e0    : -	cmpbge	zero, t2, t8	# .. e1 : test new word for eos -	beq	a2, $u_eoc	# e1    : -	beq	t8, $u_loop	# e1    : - -	/* We've found a zero somewhere in the source word we just read. -	   If it resides in the lower half, we have one (probably partial) -	   word to write out, and if it resides in the upper half, we -	   have one full and one partial word left to write out. - -	   On entry to this basic block: -	   t1 == the shifted high-order bits from the previous source word -	   t2 == the unshifted current source word.  */ -$u_eos: -	extqh	t2, a1, t0	# e0    : -	or	t0, t1, t0	# e1    : first (partial) source word complete - -	cmpbge	zero, t0, t8	# e0    : is the null in this first bit? -	bne	t8, $u_final	# .. e1 (zdb) - -	stq_u	t0, 0(a0)	# e0    : the null was in the high-order bits -	addq	a0, 8, a0	# .. e1 : -	subq	a2, 1, a2	# e1    : - -$u_late_head_exit: -	extql	t2, a1, t0	# .. e0 : -	cmpbge	zero, t0, t8	# e0    : -	or	t8, t10, t6	# e1    : -	cmoveq	a2, t6, t8	# e0    : -	nop			# .. e1 : - -	/* Take care of a final (probably partial) result word. -	   On entry to this basic block: -	   t0 == assembled source word -	   t8 == cmpbge mask that found the null.  */ -$u_final: -	negq	t8, t6		# e0    : isolate low bit set -	and	t6, t8, t12	# e1    : - -	and	t12, 0x80, t6	# e0    : avoid dest word load if we can -	bne	t6, 1f		# .. e1 (zdb) - -	ldq_u	t1, 0(a0)	# e0    : -	subq	t12, 1, t6	# .. e1 : -	or	t6, t12, t8	# e0    : -	zapnot	t0, t8, t0	# .. e1 : kill source bytes > null -	zap	t1, t8, t1	# e0    : kill dest bytes <= null -	or	t0, t1, t0	# e1    : - -1:	stq_u	t0, 0(a0)	# e0    : -	br	$finish_up - -$u_eoc:				# end-of-count -	extqh	t2, a1, t0 -	or	t0, t1, t0 -	cmpbge	zero, t0, t8 - -$u_eocfin:			# end-of-count, final word -	or	t10, t8, t8 -	br	$u_final - -	/* Unaligned copy entry point.  */ -	.align 3 -$unaligned: - -	EX( ldq_u t1, 0(a1) )	# e0    : load first source word - -	and	a0, 7, t4	# .. e1 : find dest misalignment -	and	a1, 7, t5	# e0    : find src misalignment - -	/* Conditionally load the first destination word and a bytemask -	   with 0xff indicating that the destination byte is sacrosanct.  */ - -	mov	zero, t0	# .. e1 : -	mov	zero, t6	# e0    : -	beq	t4, 1f		# .. e1 : -	ldq_u	t0, 0(a0)	# e0    : -	lda	t6, -1		# .. e1 : -	mskql	t6, a0, t6	# e0    : -1: -	subq	a1, t4, a1	# .. e1 : sub dest misalignment from src addr - -	/* If source misalignment is larger than dest misalignment, we need -	   extra startup checks to avoid SEGV.  */ - -	cmplt	t4, t5, t12	# e1    : -	extql	t1, a1, t1	# .. e0 : shift src into place -	lda	t2, -1		# e0    : for creating masks later -	beq	t12, $u_head	# e1    : - -	mskqh	t2, t5, t2	# e0    : begin src byte validity mask -	cmpbge	zero, t1, t8	# .. e1 : is there a zero? -	extql	t2, a1, t2	# e0    : -	or	t8, t10, t5	# .. e1 : test for end-of-count too -	cmpbge	zero, t2, t3	# e0    : -	cmoveq	a2, t5, t8	# .. e1 : -	andnot	t8, t3, t8	# e0    : -	beq	t8, $u_head	# .. e1 (zdb) - -	/* At this point we've found a zero in the first partial word of -	   the source.  We need to isolate the valid source data and mask -	   it into the original destination data.  (Incidentally, we know -	   that we'll need at least one byte of that original dest word.) */ - -	ldq_u	t0, 0(a0)	# e0    : -	negq	t8, t6		# .. e1 : build bitmask of bytes <= zero -	mskqh	t1, t4, t1	# e0    : -	and	t6, t8, t12	# .. e1 : -	subq	t12, 1, t6	# e0    : -	or	t6, t12, t8	# e1    : - -	zapnot	t2, t8, t2	# e0    : prepare source word; mirror changes -	zapnot	t1, t8, t1	# .. e1 : to source validity mask - -	andnot	t0, t2, t0	# e0    : zero place for source to reside -	or	t0, t1, t0	# e1    : and put it there -	stq_u	t0, 0(a0)	# e0    : - -$finish_up: -	zapnot	t0, t12, t4	# was last byte written null? -	cmovne	t4, 1, t4 - -	and	t12, 0xf0, t3	# binary search for the address of the -	and	t12, 0xcc, t2	# last byte written -	and	t12, 0xaa, t1 -	bic	a0, 7, t0 -	cmovne	t3, 4, t3 -	cmovne	t2, 2, t2 -	cmovne	t1, 1, t1 -	addq	t0, t3, t0 -	addq	t1, t2, t1 -	addq	t0, t1, t0 -	addq	t0, t4, t0	# add one if we filled the buffer - -	subq	t0, v0, v0	# find string length -	ret - -$zerolength: -	clr	v0 -$exception: -	ret - -	.end __strncpy_from_user diff --git a/arch/alpha/lib/strrchr.S b/arch/alpha/lib/strrchr.S index 82cfd0ac907..1970dc07cfd 100644 --- a/arch/alpha/lib/strrchr.S +++ b/arch/alpha/lib/strrchr.S @@ -54,7 +54,7 @@ $loop:  $eos:  	negq	t1, t4		# e0    : isolate first null byte match  	and	t1, t4, t4	# e1    : -	subq	t4, 1, t5	# e0    : build a mask of the bytes upto... +	subq	t4, 1, t5	# e0    : build a mask of the bytes up to...  	or	t4, t5, t4	# e1    : ... and including the null  	and	t3, t4, t3	# e0    : mask out char matches after null diff --git a/arch/alpha/math-emu/Makefile b/arch/alpha/math-emu/Makefile index 359ef087e69..7f467199524 100644 --- a/arch/alpha/math-emu/Makefile +++ b/arch/alpha/math-emu/Makefile @@ -2,7 +2,7 @@  # Makefile for the FPU instruction emulation.  # -EXTRA_CFLAGS := -w +ccflags-y := -w  obj-$(CONFIG_MATHEMU) += math-emu.o diff --git a/arch/alpha/mm/Makefile b/arch/alpha/mm/Makefile index 09399c5386c..c993d3f93cf 100644 --- a/arch/alpha/mm/Makefile +++ b/arch/alpha/mm/Makefile @@ -2,7 +2,7 @@  # Makefile for the linux alpha-specific parts of the memory manager.  # -EXTRA_CFLAGS := -Werror +ccflags-y := -Werror  obj-y	:= init.o fault.o extable.o diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c index fadd5f882ff..98838a05ba6 100644 --- a/arch/alpha/mm/fault.c +++ b/arch/alpha/mm/fault.c @@ -24,7 +24,6 @@  #include <linux/interrupt.h>  #include <linux/module.h> -#include <asm/system.h>  #include <asm/uaccess.h>  extern void die_if_kernel(char *,struct pt_regs *,long, unsigned long *); @@ -90,6 +89,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr,  	const struct exception_table_entry *fixup;  	int fault, si_code = SEGV_MAPERR;  	siginfo_t info; +	unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;  	/* As of EV6, a load into $31/$f31 is a prefetch, and never faults  	   (or is suppressed by the PALcode).  Support that for older CPUs @@ -114,7 +114,9 @@ do_page_fault(unsigned long address, unsigned long mmcsr,  	if (address >= TASK_SIZE)  		goto vmalloc_fault;  #endif - +	if (user_mode(regs)) +		flags |= FAULT_FLAG_USER; +retry:  	down_read(&mm->mmap_sem);  	vma = find_vma(mm, address);  	if (!vma) @@ -140,13 +142,17 @@ do_page_fault(unsigned long address, unsigned long mmcsr,  	} else {  		if (!(vma->vm_flags & VM_WRITE))  			goto bad_area; +		flags |= FAULT_FLAG_WRITE;  	}  	/* If for any reason at all we couldn't handle the fault,  	   make sure we exit gracefully rather than endlessly redo  	   the fault.  */ -	fault = handle_mm_fault(mm, vma, address, cause > 0 ? FAULT_FLAG_WRITE : 0); -	up_read(&mm->mmap_sem); +	fault = handle_mm_fault(mm, vma, address, flags); + +	if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) +		return; +  	if (unlikely(fault & VM_FAULT_ERROR)) {  		if (fault & VM_FAULT_OOM)  			goto out_of_memory; @@ -154,10 +160,26 @@ do_page_fault(unsigned long address, unsigned long mmcsr,  			goto do_sigbus;  		BUG();  	} -	if (fault & VM_FAULT_MAJOR) -		current->maj_flt++; -	else -		current->min_flt++; + +	if (flags & FAULT_FLAG_ALLOW_RETRY) { +		if (fault & VM_FAULT_MAJOR) +			current->maj_flt++; +		else +			current->min_flt++; +		if (fault & VM_FAULT_RETRY) { +			flags &= ~FAULT_FLAG_ALLOW_RETRY; + +			 /* No need to up_read(&mm->mmap_sem) as we would +			 * have already released it in __lock_page_or_retry +			 * in mm/filemap.c. +			 */ + +			goto retry; +		} +	} + +	up_read(&mm->mmap_sem); +  	return;  	/* Something tried to access memory that isn't in our memory map. @@ -187,12 +209,14 @@ do_page_fault(unsigned long address, unsigned long mmcsr,  	/* We ran out of memory, or some other thing happened to us that  	   made us unable to handle the page fault gracefully.  */   out_of_memory: +	up_read(&mm->mmap_sem);  	if (!user_mode(regs))  		goto no_context;  	pagefault_out_of_memory();  	return;   do_sigbus: +	up_read(&mm->mmap_sem);  	/* Send a sigbus, regardless of whether we were in kernel  	   or user mode.  */  	info.si_signo = SIGBUS; diff --git a/arch/alpha/mm/init.c b/arch/alpha/mm/init.c index 86425ab53bf..a1bea91df56 100644 --- a/arch/alpha/mm/init.c +++ b/arch/alpha/mm/init.c @@ -22,7 +22,6 @@  #include <linux/vmalloc.h>  #include <linux/gfp.h> -#include <asm/system.h>  #include <asm/uaccess.h>  #include <asm/pgtable.h>  #include <asm/pgalloc.h> @@ -31,8 +30,8 @@  #include <asm/mmu_context.h>  #include <asm/console.h>  #include <asm/tlb.h> - -DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); +#include <asm/setup.h> +#include <asm/sections.h>  extern void die_if_kernel(char *,struct pt_regs *,long); @@ -277,75 +276,25 @@ srm_paging_stop (void)  }  #endif -#ifndef CONFIG_DISCONTIGMEM -static void __init -printk_memory_info(void) -{ -	unsigned long codesize, reservedpages, datasize, initsize, tmp; -	extern int page_is_ram(unsigned long) __init; -	extern char _text, _etext, _data, _edata; -	extern char __init_begin, __init_end; - -	/* printk all informations */ -	reservedpages = 0; -	for (tmp = 0; tmp < max_low_pfn; tmp++) -		/* -		 * Only count reserved RAM pages -		 */ -		if (page_is_ram(tmp) && PageReserved(mem_map+tmp)) -			reservedpages++; - -	codesize =  (unsigned long) &_etext - (unsigned long) &_text; -	datasize =  (unsigned long) &_edata - (unsigned long) &_data; -	initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin; - -	printk("Memory: %luk/%luk available (%luk kernel code, %luk reserved, %luk data, %luk init)\n", -	       nr_free_pages() << (PAGE_SHIFT-10), -	       max_mapnr << (PAGE_SHIFT-10), -	       codesize >> 10, -	       reservedpages << (PAGE_SHIFT-10), -	       datasize >> 10, -	       initsize >> 10); -} -  void __init  mem_init(void)  { -	max_mapnr = num_physpages = max_low_pfn; -	totalram_pages += free_all_bootmem(); +	set_max_mapnr(max_low_pfn);  	high_memory = (void *) __va(max_low_pfn * PAGE_SIZE); - -	printk_memory_info(); -} -#endif /* CONFIG_DISCONTIGMEM */ - -void -free_reserved_mem(void *start, void *end) -{ -	void *__start = start; -	for (; __start < end; __start += PAGE_SIZE) { -		ClearPageReserved(virt_to_page(__start)); -		init_page_count(virt_to_page(__start)); -		free_page((long)__start); -		totalram_pages++; -	} +	free_all_bootmem(); +	mem_init_print_info(NULL);  }  void  free_initmem(void)  { -	extern char __init_begin, __init_end; - -	free_reserved_mem(&__init_begin, &__init_end); -	printk ("Freeing unused kernel memory: %ldk freed\n", -		(&__init_end - &__init_begin) >> 10); +	free_initmem_default(-1);  }  #ifdef CONFIG_BLK_DEV_INITRD  void  free_initrd_mem(unsigned long start, unsigned long end)  { -	free_reserved_mem((void *)start, (void *)end); -	printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); +	free_reserved_area((void *)start, (void *)end, -1, "initrd");  }  #endif diff --git a/arch/alpha/mm/numa.c b/arch/alpha/mm/numa.c index 7b2c56d8f93..d543d71c28b 100644 --- a/arch/alpha/mm/numa.c +++ b/arch/alpha/mm/numa.c @@ -17,6 +17,7 @@  #include <asm/hwrpb.h>  #include <asm/pgalloc.h> +#include <asm/sections.h>  pg_data_t node_data[MAX_NUMNODES];  EXPORT_SYMBOL(node_data); @@ -128,8 +129,6 @@ setup_memory_node(int nid, void *kernel_end)  	if (node_max_pfn > max_low_pfn)  		max_pfn = max_low_pfn = node_max_pfn; -	num_physpages += node_max_pfn - node_min_pfn; -  #if 0 /* we'll try this one again in a little while */  	/* Cute trick to make sure our local node data is on local memory */  	node_data[nid] = (pg_data_t *)(__va(node_min_pfn << PAGE_SHIFT)); @@ -313,49 +312,10 @@ void __init paging_init(void)  			zones_size[ZONE_DMA] = dma_local_pfn;  			zones_size[ZONE_NORMAL] = (end_pfn - start_pfn) - dma_local_pfn;  		} +		node_set_state(nid, N_NORMAL_MEMORY);  		free_area_init_node(nid, zones_size, start_pfn, NULL);  	}  	/* Initialize the kernel's ZERO_PGE. */  	memset((void *)ZERO_PGE, 0, PAGE_SIZE);  } - -void __init mem_init(void) -{ -	unsigned long codesize, reservedpages, datasize, initsize, pfn; -	extern int page_is_ram(unsigned long) __init; -	extern char _text, _etext, _data, _edata; -	extern char __init_begin, __init_end; -	unsigned long nid, i; -	high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT); - -	reservedpages = 0; -	for_each_online_node(nid) { -		/* -		 * This will free up the bootmem, ie, slot 0 memory -		 */ -		totalram_pages += free_all_bootmem_node(NODE_DATA(nid)); - -		pfn = NODE_DATA(nid)->node_start_pfn; -		for (i = 0; i < node_spanned_pages(nid); i++, pfn++) -			if (page_is_ram(pfn) && -			    PageReserved(nid_page_nr(nid, i))) -				reservedpages++; -	} - -	codesize =  (unsigned long) &_etext - (unsigned long) &_text; -	datasize =  (unsigned long) &_edata - (unsigned long) &_data; -	initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin; - -	printk("Memory: %luk/%luk available (%luk kernel code, %luk reserved, " -	       "%luk data, %luk init)\n", -	       nr_free_pages() << (PAGE_SHIFT-10), -	       num_physpages << (PAGE_SHIFT-10), -	       codesize >> 10, -	       reservedpages << (PAGE_SHIFT-10), -	       datasize >> 10, -	       initsize >> 10); -#if 0 -	mem_stress(); -#endif -} diff --git a/arch/alpha/oprofile/Makefile b/arch/alpha/oprofile/Makefile index 4aa56247bdc..3473de751b0 100644 --- a/arch/alpha/oprofile/Makefile +++ b/arch/alpha/oprofile/Makefile @@ -1,4 +1,4 @@ -EXTRA_CFLAGS := -Werror -Wno-sign-compare +ccflags-y := -Werror -Wno-sign-compare  obj-$(CONFIG_OPROFILE) += oprofile.o diff --git a/arch/alpha/oprofile/common.c b/arch/alpha/oprofile/common.c index bd8ac533a50..310a4ce1dcc 100644 --- a/arch/alpha/oprofile/common.c +++ b/arch/alpha/oprofile/common.c @@ -12,7 +12,7 @@  #include <linux/smp.h>  #include <linux/errno.h>  #include <asm/ptrace.h> -#include <asm/system.h> +#include <asm/special_insns.h>  #include "op_impl.h" @@ -106,7 +106,7 @@ op_axp_stop(void)  }  static int -op_axp_create_files(struct super_block *sb, struct dentry *root) +op_axp_create_files(struct dentry *root)  {  	int i; @@ -115,23 +115,23 @@ op_axp_create_files(struct super_block *sb, struct dentry *root)  		char buf[4];  		snprintf(buf, sizeof buf, "%d", i); -		dir = oprofilefs_mkdir(sb, root, buf); +		dir = oprofilefs_mkdir(root, buf); -		oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); -                oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); -		oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); +		oprofilefs_create_ulong(dir, "enabled", &ctr[i].enabled); +                oprofilefs_create_ulong(dir, "event", &ctr[i].event); +		oprofilefs_create_ulong(dir, "count", &ctr[i].count);  		/* Dummies.  */ -		oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); -		oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); -		oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); +		oprofilefs_create_ulong(dir, "kernel", &ctr[i].kernel); +		oprofilefs_create_ulong(dir, "user", &ctr[i].user); +		oprofilefs_create_ulong(dir, "unit_mask", &ctr[i].unit_mask);  	}  	if (model->can_set_proc_mode) { -		oprofilefs_create_ulong(sb, root, "enable_pal", +		oprofilefs_create_ulong(root, "enable_pal",  					&sys.enable_pal); -		oprofilefs_create_ulong(sb, root, "enable_kernel", +		oprofilefs_create_ulong(root, "enable_kernel",  					&sys.enable_kernel); -		oprofilefs_create_ulong(sb, root, "enable_user", +		oprofilefs_create_ulong(root, "enable_user",  					&sys.enable_user);  	} diff --git a/arch/alpha/oprofile/op_model_ev4.c b/arch/alpha/oprofile/op_model_ev4.c index 80d764dbf22..18aa9b4f94f 100644 --- a/arch/alpha/oprofile/op_model_ev4.c +++ b/arch/alpha/oprofile/op_model_ev4.c @@ -11,7 +11,6 @@  #include <linux/init.h>  #include <linux/smp.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include "op_impl.h" diff --git a/arch/alpha/oprofile/op_model_ev5.c b/arch/alpha/oprofile/op_model_ev5.c index ceea6e1ad79..c32f8a0ad92 100644 --- a/arch/alpha/oprofile/op_model_ev5.c +++ b/arch/alpha/oprofile/op_model_ev5.c @@ -11,7 +11,6 @@  #include <linux/init.h>  #include <linux/smp.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include "op_impl.h" diff --git a/arch/alpha/oprofile/op_model_ev6.c b/arch/alpha/oprofile/op_model_ev6.c index 0869f85f574..1c84cc257fc 100644 --- a/arch/alpha/oprofile/op_model_ev6.c +++ b/arch/alpha/oprofile/op_model_ev6.c @@ -11,7 +11,6 @@  #include <linux/init.h>  #include <linux/smp.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include "op_impl.h" diff --git a/arch/alpha/oprofile/op_model_ev67.c b/arch/alpha/oprofile/op_model_ev67.c index 70302086283..34a57a12655 100644 --- a/arch/alpha/oprofile/op_model_ev67.c +++ b/arch/alpha/oprofile/op_model_ev67.c @@ -12,7 +12,6 @@  #include <linux/init.h>  #include <linux/smp.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include "op_impl.h" @@ -192,7 +191,7 @@ ev67_handle_interrupt(unsigned long which, struct pt_regs *regs,  		case TRAP_INVALID1:  		case TRAP_INVALID2:  		case TRAP_INVALID3: -			/* Pipeline redirection ocurred. PMPC points +			/* Pipeline redirection occurred. PMPC points  			   to PALcode. Recognize ITB miss by PALcode  			   offset address, and get actual PC from  			   EXC_ADDR.  */  | 
