diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-11 10:09:59 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-11 10:09:59 -0700 | 
| commit | f43a64c5e1a65d12b9b53a35ed2d5db441fcb64c (patch) | |
| tree | 64e83b3cce9d8e659a48cd706c59c09dc183b6dc /arch/sparc64/kernel | |
| parent | 5c23804a0941a111752fdacefe0bea2db1b4d93f (diff) | |
| parent | f7ceba360cce9af3fbc4e5a5b1bd40b570b7021c (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
Diffstat (limited to 'arch/sparc64/kernel')
| -rw-r--r-- | arch/sparc64/kernel/entry.S | 42 | ||||
| -rw-r--r-- | arch/sparc64/kernel/power.c | 3 | ||||
| -rw-r--r-- | arch/sparc64/kernel/ptrace.c | 46 | ||||
| -rw-r--r-- | arch/sparc64/kernel/smp.c | 10 | ||||
| -rw-r--r-- | arch/sparc64/kernel/sparc64_ksyms.c | 2 | ||||
| -rw-r--r-- | arch/sparc64/kernel/sys32.S | 2 | ||||
| -rw-r--r-- | arch/sparc64/kernel/systbls.S | 8 | ||||
| -rw-r--r-- | arch/sparc64/kernel/time.c | 24 | ||||
| -rw-r--r-- | arch/sparc64/kernel/vmlinux.lds.S | 2 | 
9 files changed, 73 insertions, 66 deletions
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index d3973d8a719..d781f10adc5 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S @@ -22,8 +22,6 @@  #include <asm/estate.h>  #include <asm/auxio.h> -/* #define SYSCALL_TRACING	1 */ -  #define curptr      g6  #define NR_SYSCALLS 284      /* Each OS is different... */ @@ -1554,11 +1552,12 @@ sys_ptrace:	add		%sp, PTREGS_OFF, %o0  		nop  		.align		32  1:		ldx		[%curptr + TI_FLAGS], %l5 -		andcc		%l5, _TIF_SYSCALL_TRACE, %g0 +		andcc		%l5, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %g0  		be,pt		%icc, rtrap  		 clr		%l6 +		add		%sp, PTREGS_OFF, %o0  		call		syscall_trace -		 nop +		 mov		1, %o1  		ba,pt		%xcc, rtrap  		 clr		%l6 @@ -1642,18 +1641,20 @@ linux_sparc_ni_syscall:  	 or		%l7, %lo(sys_ni_syscall), %l7  linux_syscall_trace32: +	add		%sp, PTREGS_OFF, %o0  	call		syscall_trace -	 nop +	 clr		%o1  	srl		%i0, 0, %o0 -	mov		%i4, %o4 +	srl		%i4, 0, %o4  	srl		%i1, 0, %o1  	srl		%i2, 0, %o2  	b,pt		%xcc, 2f  	 srl		%i3, 0, %o3  linux_syscall_trace: +	add		%sp, PTREGS_OFF, %o0  	call		syscall_trace -	 nop +	 clr		%o1  	mov		%i0, %o0  	mov		%i1, %o1  	mov		%i2, %o2 @@ -1671,11 +1672,6 @@ linux_sparc_syscall32:  	bgeu,pn		%xcc, linux_sparc_ni_syscall		! CTI  	 srl		%i0, 0, %o0				! IEU0  	sll		%g1, 2, %l4				! IEU0	Group -#ifdef SYSCALL_TRACING -	call		syscall_trace_entry -	 add		%sp, PTREGS_OFF, %o0 -	srl		%i0, 0, %o0 -#endif  	srl		%i4, 0, %o4				! IEU1  	lduw		[%l7 + %l4], %l7			! Load  	srl		%i1, 0, %o1				! IEU0	Group @@ -1683,7 +1679,7 @@ linux_sparc_syscall32:  	srl		%i5, 0, %o5				! IEU1  	srl		%i2, 0, %o2				! IEU0	Group -	andcc		%l0, _TIF_SYSCALL_TRACE, %g0		! IEU0	Group +	andcc		%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %g0  	bne,pn		%icc, linux_syscall_trace32		! CTI  	 mov		%i0, %l5				! IEU1  	call		%l7					! CTI	Group brk forced @@ -1699,11 +1695,6 @@ linux_sparc_syscall:  	bgeu,pn		%xcc, linux_sparc_ni_syscall		! CTI  	 mov		%i0, %o0				! IEU0  	sll		%g1, 2, %l4				! IEU0	Group -#ifdef SYSCALL_TRACING -	call		syscall_trace_entry -	 add		%sp, PTREGS_OFF, %o0 -	mov		%i0, %o0 -#endif  	mov		%i1, %o1				! IEU1  	lduw		[%l7 + %l4], %l7			! Load  4:	mov		%i2, %o2				! IEU0	Group @@ -1711,7 +1702,7 @@ linux_sparc_syscall:  	mov		%i3, %o3				! IEU1  	mov		%i4, %o4				! IEU0	Group -	andcc		%l0, _TIF_SYSCALL_TRACE, %g0		! IEU1	Group+1 bubble +	andcc		%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %g0  	bne,pn		%icc, linux_syscall_trace		! CTI	Group  	 mov		%i0, %l5				! IEU0  2:	call		%l7					! CTI	Group brk forced @@ -1720,12 +1711,6 @@ linux_sparc_syscall:  3:	stx		%o0, [%sp + PTREGS_OFF + PT_V9_I0]  ret_sys_call: -#ifdef SYSCALL_TRACING -	mov		%o0, %o1 -	call		syscall_trace_exit -	 add		%sp, PTREGS_OFF, %o0 -	mov		%o1, %o0 -#endif  	ldx		[%sp + PTREGS_OFF + PT_V9_TSTATE], %g3  	ldx		[%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc  	sra		%o0, 0, %o0 @@ -1745,7 +1730,7 @@ ret_sys_call:  1:  	cmp		%o0, -ERESTART_RESTARTBLOCK  	bgeu,pn		%xcc, 1f -	 andcc		%l0, _TIF_SYSCALL_TRACE, %l6	 +	 andcc		%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %l6  80:  	/* System call success, clear Carry condition code. */  	andn		%g3, %g2, %g3 @@ -1760,7 +1745,7 @@ ret_sys_call:  	/* System call failure, set Carry condition code.  	 * Also, get abs(errno) to return to the process.  	 */ -	andcc		%l0, _TIF_SYSCALL_TRACE, %l6	 +	andcc		%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %l6	  	sub		%g0, %o0, %o0  	or		%g3, %g2, %g3  	stx		%o0, [%sp + PTREGS_OFF + PT_V9_I0] @@ -1773,8 +1758,9 @@ ret_sys_call:  	b,pt		%xcc, rtrap  	 stx		%l2, [%sp + PTREGS_OFF + PT_V9_TNPC]  linux_syscall_trace2: +	add		%sp, PTREGS_OFF, %o0  	call		syscall_trace -	 nop +	 mov		1, %o1  	stx		%l1, [%sp + PTREGS_OFF + PT_V9_TPC]  	ba,pt		%xcc, rtrap  	 stx		%l2, [%sp + PTREGS_OFF + PT_V9_TNPC] diff --git a/arch/sparc64/kernel/power.c b/arch/sparc64/kernel/power.c index 52f14e399b1..533104c7907 100644 --- a/arch/sparc64/kernel/power.c +++ b/arch/sparc64/kernel/power.c @@ -4,6 +4,8 @@   * Copyright (C) 1999 David S. Miller (davem@redhat.com)   */ +#define __KERNEL_SYSCALLS__ +  #include <linux/config.h>  #include <linux/kernel.h>  #include <linux/module.h> @@ -17,7 +19,6 @@  #include <asm/ebus.h>  #include <asm/auxio.h> -#define __KERNEL_SYSCALLS__  #include <linux/unistd.h>  /* diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c index 80a76e2ad73..23ad839d113 100644 --- a/arch/sparc64/kernel/ptrace.c +++ b/arch/sparc64/kernel/ptrace.c @@ -19,6 +19,8 @@  #include <linux/smp.h>  #include <linux/smp_lock.h>  #include <linux/security.h> +#include <linux/seccomp.h> +#include <linux/audit.h>  #include <linux/signal.h>  #include <asm/asi.h> @@ -628,15 +630,27 @@ out:  	unlock_kernel();  } -asmlinkage void syscall_trace(void) +asmlinkage void syscall_trace(struct pt_regs *regs, int syscall_exit_p)  { -#ifdef DEBUG_PTRACE -	printk("%s [%d]: syscall_trace\n", current->comm, current->pid); -#endif -	if (!test_thread_flag(TIF_SYSCALL_TRACE)) -		return; +	/* do the secure computing check first */ +	secure_computing(regs->u_regs[UREG_G1]); + +	if (unlikely(current->audit_context) && syscall_exit_p) { +		unsigned long tstate = regs->tstate; +		int result = AUDITSC_SUCCESS; + +		if (unlikely(tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) +			result = AUDITSC_FAILURE; + +		audit_syscall_exit(current, result, regs->u_regs[UREG_I0]); +	} +  	if (!(current->ptrace & PT_PTRACED)) -		return; +		goto out; + +	if (!test_thread_flag(TIF_SYSCALL_TRACE)) +		goto out; +  	ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)  				 ? 0x80 : 0)); @@ -645,12 +659,20 @@ asmlinkage void syscall_trace(void)  	 * for normal use.  strace only continues with a signal if the  	 * stopping signal is not SIGTRAP.  -brl  	 */ -#ifdef DEBUG_PTRACE -	printk("%s [%d]: syscall_trace exit= %x\n", current->comm, -		current->pid, current->exit_code); -#endif  	if (current->exit_code) { -		send_sig (current->exit_code, current, 1); +		send_sig(current->exit_code, current, 1);  		current->exit_code = 0;  	} + +out: +	if (unlikely(current->audit_context) && !syscall_exit_p) +		audit_syscall_entry(current, +				    (test_thread_flag(TIF_32BIT) ? +				     AUDIT_ARCH_SPARC : +				     AUDIT_ARCH_SPARC64), +				    regs->u_regs[UREG_G1], +				    regs->u_regs[UREG_I0], +				    regs->u_regs[UREG_I1], +				    regs->u_regs[UREG_I2], +				    regs->u_regs[UREG_I3]);  } diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index e5b9c7a2778..441fc2e52ce 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c @@ -45,8 +45,8 @@ extern void calibrate_delay(void);  /* Please don't make this stuff initdata!!!  --DaveM */  static unsigned char boot_cpu_id; -cpumask_t cpu_online_map = CPU_MASK_NONE; -cpumask_t phys_cpu_present_map = CPU_MASK_NONE; +cpumask_t cpu_online_map = CPU_MASK_NONE __read_mostly; +cpumask_t phys_cpu_present_map = CPU_MASK_NONE __read_mostly;  static cpumask_t smp_commenced_mask;  static cpumask_t cpu_callout_map; @@ -155,7 +155,7 @@ void cpu_panic(void)  	panic("SMP bolixed\n");  } -static unsigned long current_tick_offset; +static unsigned long current_tick_offset __read_mostly;  /* This tick register synchronization scheme is taken entirely from   * the ia64 port, see arch/ia64/kernel/smpboot.c for details and credit. @@ -1193,8 +1193,8 @@ void smp_send_stop(void)  {  } -unsigned long __per_cpu_base; -unsigned long __per_cpu_shift; +unsigned long __per_cpu_base __read_mostly; +unsigned long __per_cpu_shift __read_mostly;  EXPORT_SYMBOL(__per_cpu_base);  EXPORT_SYMBOL(__per_cpu_shift); diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c index 56cd96f4a5c..9202d925a9c 100644 --- a/arch/sparc64/kernel/sparc64_ksyms.c +++ b/arch/sparc64/kernel/sparc64_ksyms.c @@ -79,7 +79,7 @@ extern void linux_sparc_syscall(void);  extern void rtrap(void);  extern void show_regs(struct pt_regs *);  extern void solaris_syscall(void); -extern void syscall_trace(void); +extern void syscall_trace(struct pt_regs *, int);  extern u32 sunos_sys_table[], sys_call_table32[];  extern void tl0_solaris(void);  extern void sys_sigsuspend(void); diff --git a/arch/sparc64/kernel/sys32.S b/arch/sparc64/kernel/sys32.S index 5a95e98c531..5f9e4fae612 100644 --- a/arch/sparc64/kernel/sys32.S +++ b/arch/sparc64/kernel/sys32.S @@ -135,6 +135,8 @@ SIGN2(sys32_shutdown, sys_shutdown, %o0, %o1)  SIGN3(sys32_socketpair, sys_socketpair, %o0, %o1, %o2)  SIGN1(sys32_getpeername, sys_getpeername, %o0)  SIGN1(sys32_getsockname, sys_getsockname, %o0) +SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1) +SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2)  	.globl		sys32_mmap2  sys32_mmap2: diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index a5e36a4c892..bceb91a8a2b 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S @@ -59,11 +59,11 @@ sys_call_table32:  /*180*/	.word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall  	.word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sparc64_newuname  /*190*/	.word sys32_init_module, sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl -	.word sys32_epoll_wait, sys_nis_syscall, sys_getppid, sys32_sigaction, sys_sgetmask +	.word sys32_epoll_wait, sys32_ioprio_set, sys_getppid, sys32_sigaction, sys_sgetmask  /*200*/	.word sys32_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir  	.word sys32_readahead, sys32_socketcall, sys32_syslog, sys32_lookup_dcookie, sys32_fadvise64  /*210*/	.word sys32_fadvise64_64, sys32_tgkill, sys32_waitpid, sys_swapoff, sys32_sysinfo -	.word sys32_ipc, sys32_sigreturn, sys_clone, sys_nis_syscall, sys32_adjtimex +	.word sys32_ipc, sys32_sigreturn, sys_clone, sys32_ioprio_get, sys32_adjtimex  /*220*/	.word sys32_sigprocmask, sys_ni_syscall, sys32_delete_module, sys_ni_syscall, sys32_getpgid  	.word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys32_setfsuid16, sys32_setfsgid16  /*230*/	.word sys32_select, compat_sys_time, sys_nis_syscall, compat_sys_stime, compat_sys_statfs64 @@ -125,11 +125,11 @@ sys_call_table:  /*180*/	.word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_ni_syscall  	.word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sparc64_newuname  /*190*/	.word sys_init_module, sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl -	.word sys_epoll_wait, sys_nis_syscall, sys_getppid, sys_nis_syscall, sys_sgetmask +	.word sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_nis_syscall, sys_sgetmask  /*200*/	.word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall  	.word sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64  /*210*/	.word sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo -	.word sys_ipc, sys_nis_syscall, sys_clone, sys_nis_syscall, sys_adjtimex +	.word sys_ipc, sys_nis_syscall, sys_clone, sys_ioprio_get, sys_adjtimex  /*220*/	.word sys_nis_syscall, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid  	.word sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid, sys_setfsgid  /*230*/	.word sys_select, sys_nis_syscall, sys_nis_syscall, sys_stime, sys_statfs64 diff --git a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c index b40db389f90..362b9c26871 100644 --- a/arch/sparc64/kernel/time.c +++ b/arch/sparc64/kernel/time.c @@ -73,7 +73,7 @@ static __initdata struct sparc64_tick_ops dummy_tick_ops = {  	.get_tick	= dummy_get_tick,  }; -struct sparc64_tick_ops *tick_ops = &dummy_tick_ops; +struct sparc64_tick_ops *tick_ops __read_mostly = &dummy_tick_ops;  #define TICK_PRIV_BIT	(1UL << 63) @@ -195,7 +195,7 @@ static unsigned long tick_add_tick(unsigned long adj, unsigned long offset)  	return new_tick;  } -static struct sparc64_tick_ops tick_operations = { +static struct sparc64_tick_ops tick_operations __read_mostly = {  	.init_tick	=	tick_init_tick,  	.get_tick	=	tick_get_tick,  	.get_compare	=	tick_get_compare, @@ -276,7 +276,7 @@ static unsigned long stick_add_compare(unsigned long adj)  	return new_compare;  } -static struct sparc64_tick_ops stick_operations = { +static struct sparc64_tick_ops stick_operations __read_mostly = {  	.init_tick	=	stick_init_tick,  	.get_tick	=	stick_get_tick,  	.get_compare	=	stick_get_compare, @@ -422,7 +422,7 @@ static unsigned long hbtick_add_compare(unsigned long adj)  	return val;  } -static struct sparc64_tick_ops hbtick_operations = { +static struct sparc64_tick_ops hbtick_operations __read_mostly = {  	.init_tick	=	hbtick_init_tick,  	.get_tick	=	hbtick_get_tick,  	.get_compare	=	hbtick_get_compare, @@ -437,10 +437,9 @@ static struct sparc64_tick_ops hbtick_operations = {   * NOTE: On SUN5 systems the ticker interrupt comes in using 2   *       interrupts, one at level14 and one with softint bit 0.   */ -unsigned long timer_tick_offset; -unsigned long timer_tick_compare; +unsigned long timer_tick_offset __read_mostly; -static unsigned long timer_ticks_per_nsec_quotient; +static unsigned long timer_ticks_per_nsec_quotient __read_mostly;  #define TICK_SIZE (tick_nsec / 1000) @@ -464,7 +463,7 @@ static inline void timer_check_rtc(void)  static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)  { -	unsigned long ticks, pstate; +	unsigned long ticks, compare, pstate;  	write_seqlock(&xtime_lock); @@ -483,14 +482,14 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)  				     : "=r" (pstate)  				     : "i" (PSTATE_IE)); -		timer_tick_compare = tick_ops->add_compare(timer_tick_offset); +		compare = tick_ops->add_compare(timer_tick_offset);  		ticks = tick_ops->get_tick();  		/* Restore PSTATE_IE. */  		__asm__ __volatile__("wrpr	%0, 0x0, %%pstate"  				     : /* no outputs */  				     : "r" (pstate)); -	} while (time_after_eq(ticks, timer_tick_compare)); +	} while (time_after_eq(ticks, compare));  	timer_check_rtc(); @@ -506,11 +505,6 @@ void timer_tick_interrupt(struct pt_regs *regs)  	do_timer(regs); -	/* -	 * Only keep timer_tick_offset uptodate, but don't set TICK_CMPR. -	 */ -	timer_tick_compare = tick_ops->get_compare() + timer_tick_offset; -  	timer_check_rtc();  	write_sequnlock(&xtime_lock); diff --git a/arch/sparc64/kernel/vmlinux.lds.S b/arch/sparc64/kernel/vmlinux.lds.S index 382fd6798bb..950423da8a6 100644 --- a/arch/sparc64/kernel/vmlinux.lds.S +++ b/arch/sparc64/kernel/vmlinux.lds.S @@ -32,6 +32,8 @@ SECTIONS    .data1   : { *(.data1) }    . = ALIGN(64);    .data.cacheline_aligned : { *(.data.cacheline_aligned) } +  . = ALIGN(64); +  .data.read_mostly : { *(.data.read_mostly) }    _edata  =  .;    PROVIDE (edata = .);    .fixup   : { *(.fixup) }  | 
