Commit f43a64c5 authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6

parents 5c23804a f7ceba36
...@@ -57,11 +57,11 @@ sys_call_table: ...@@ -57,11 +57,11 @@ sys_call_table:
/*180*/ .long sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_sigpending, sys_ni_syscall /*180*/ .long sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_sigpending, sys_ni_syscall
/*185*/ .long sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname /*185*/ .long sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname
/*190*/ .long sys_init_module, sys_personality, sparc_remap_file_pages, sys_epoll_create, sys_epoll_ctl /*190*/ .long sys_init_module, sys_personality, sparc_remap_file_pages, sys_epoll_create, sys_epoll_ctl
/*195*/ .long sys_epoll_wait, sys_nis_syscall, sys_getppid, sparc_sigaction, sys_sgetmask /*195*/ .long sys_epoll_wait, sys_ioprio_set, sys_getppid, sparc_sigaction, sys_sgetmask
/*200*/ .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, old_readdir /*200*/ .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, old_readdir
/*205*/ .long sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64 /*205*/ .long sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64
/*210*/ .long sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo /*210*/ .long sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo
/*215*/ .long sys_ipc, sys_sigreturn, sys_clone, sys_nis_syscall, sys_adjtimex /*215*/ .long sys_ipc, sys_sigreturn, sys_clone, sys_ioprio_get, sys_adjtimex
/*220*/ .long sys_sigprocmask, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid /*220*/ .long sys_sigprocmask, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid
/*225*/ .long sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid16, sys_setfsgid16 /*225*/ .long sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid16, sys_setfsgid16
/*230*/ .long sys_select, sys_time, sys_nis_syscall, sys_stime, sys_statfs64 /*230*/ .long sys_select, sys_time, sys_nis_syscall, sys_stime, sys_statfs64
......
...@@ -43,6 +43,23 @@ config SPARC64_PAGE_SIZE_4MB ...@@ -43,6 +43,23 @@ config SPARC64_PAGE_SIZE_4MB
endchoice endchoice
config SECCOMP
bool "Enable seccomp to safely compute untrusted bytecode"
depends on PROC_FS
default y
help
This kernel feature is useful for number crunching applications
that may need to compute untrusted bytecode during their
execution. By using pipes or other transports made available to
the process as file descriptors supporting the read/write
syscalls, it's possible to isolate those applications in
their own address space using seccomp. Once seccomp is
enabled via /proc/<pid>/seccomp, it cannot be disabled
and the task is only allowed to execute a few safe syscalls
defined by each seccomp mode.
If unsure, say Y. Only embedded should say N here.
source kernel/Kconfig.hz source kernel/Kconfig.hz
source "init/Kconfig" source "init/Kconfig"
......
...@@ -22,8 +22,6 @@ ...@@ -22,8 +22,6 @@
#include <asm/estate.h> #include <asm/estate.h>
#include <asm/auxio.h> #include <asm/auxio.h>
/* #define SYSCALL_TRACING 1 */
#define curptr g6 #define curptr g6
#define NR_SYSCALLS 284 /* Each OS is different... */ #define NR_SYSCALLS 284 /* Each OS is different... */
...@@ -1554,11 +1552,12 @@ sys_ptrace: add %sp, PTREGS_OFF, %o0 ...@@ -1554,11 +1552,12 @@ sys_ptrace: add %sp, PTREGS_OFF, %o0
nop nop
.align 32 .align 32
1: ldx [%curptr + TI_FLAGS], %l5 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 be,pt %icc, rtrap
clr %l6 clr %l6
add %sp, PTREGS_OFF, %o0
call syscall_trace call syscall_trace
nop mov 1, %o1
ba,pt %xcc, rtrap ba,pt %xcc, rtrap
clr %l6 clr %l6
...@@ -1642,18 +1641,20 @@ linux_sparc_ni_syscall: ...@@ -1642,18 +1641,20 @@ linux_sparc_ni_syscall:
or %l7, %lo(sys_ni_syscall), %l7 or %l7, %lo(sys_ni_syscall), %l7
linux_syscall_trace32: linux_syscall_trace32:
add %sp, PTREGS_OFF, %o0
call syscall_trace call syscall_trace
nop clr %o1
srl %i0, 0, %o0 srl %i0, 0, %o0
mov %i4, %o4 srl %i4, 0, %o4
srl %i1, 0, %o1 srl %i1, 0, %o1
srl %i2, 0, %o2 srl %i2, 0, %o2
b,pt %xcc, 2f b,pt %xcc, 2f
srl %i3, 0, %o3 srl %i3, 0, %o3
linux_syscall_trace: linux_syscall_trace:
add %sp, PTREGS_OFF, %o0
call syscall_trace call syscall_trace
nop clr %o1
mov %i0, %o0 mov %i0, %o0
mov %i1, %o1 mov %i1, %o1
mov %i2, %o2 mov %i2, %o2
...@@ -1671,11 +1672,6 @@ linux_sparc_syscall32: ...@@ -1671,11 +1672,6 @@ linux_sparc_syscall32:
bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI
srl %i0, 0, %o0 ! IEU0 srl %i0, 0, %o0 ! IEU0
sll %g1, 2, %l4 ! IEU0 Group 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 srl %i4, 0, %o4 ! IEU1
lduw [%l7 + %l4], %l7 ! Load lduw [%l7 + %l4], %l7 ! Load
srl %i1, 0, %o1 ! IEU0 Group srl %i1, 0, %o1 ! IEU0 Group
...@@ -1683,7 +1679,7 @@ linux_sparc_syscall32: ...@@ -1683,7 +1679,7 @@ linux_sparc_syscall32:
srl %i5, 0, %o5 ! IEU1 srl %i5, 0, %o5 ! IEU1
srl %i2, 0, %o2 ! IEU0 Group 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 bne,pn %icc, linux_syscall_trace32 ! CTI
mov %i0, %l5 ! IEU1 mov %i0, %l5 ! IEU1
call %l7 ! CTI Group brk forced call %l7 ! CTI Group brk forced
...@@ -1699,11 +1695,6 @@ linux_sparc_syscall: ...@@ -1699,11 +1695,6 @@ linux_sparc_syscall:
bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI
mov %i0, %o0 ! IEU0 mov %i0, %o0 ! IEU0
sll %g1, 2, %l4 ! IEU0 Group 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 mov %i1, %o1 ! IEU1
lduw [%l7 + %l4], %l7 ! Load lduw [%l7 + %l4], %l7 ! Load
4: mov %i2, %o2 ! IEU0 Group 4: mov %i2, %o2 ! IEU0 Group
...@@ -1711,7 +1702,7 @@ linux_sparc_syscall: ...@@ -1711,7 +1702,7 @@ linux_sparc_syscall:
mov %i3, %o3 ! IEU1 mov %i3, %o3 ! IEU1
mov %i4, %o4 ! IEU0 Group 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 bne,pn %icc, linux_syscall_trace ! CTI Group
mov %i0, %l5 ! IEU0 mov %i0, %l5 ! IEU0
2: call %l7 ! CTI Group brk forced 2: call %l7 ! CTI Group brk forced
...@@ -1720,12 +1711,6 @@ linux_sparc_syscall: ...@@ -1720,12 +1711,6 @@ linux_sparc_syscall:
3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] 3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
ret_sys_call: 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_TSTATE], %g3
ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
sra %o0, 0, %o0 sra %o0, 0, %o0
...@@ -1745,7 +1730,7 @@ ret_sys_call: ...@@ -1745,7 +1730,7 @@ ret_sys_call:
1: 1:
cmp %o0, -ERESTART_RESTARTBLOCK cmp %o0, -ERESTART_RESTARTBLOCK
bgeu,pn %xcc, 1f bgeu,pn %xcc, 1f
andcc %l0, _TIF_SYSCALL_TRACE, %l6 andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %l6
80: 80:
/* System call success, clear Carry condition code. */ /* System call success, clear Carry condition code. */
andn %g3, %g2, %g3 andn %g3, %g2, %g3
...@@ -1760,7 +1745,7 @@ ret_sys_call: ...@@ -1760,7 +1745,7 @@ ret_sys_call:
/* System call failure, set Carry condition code. /* System call failure, set Carry condition code.
* Also, get abs(errno) to return to the process. * 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 sub %g0, %o0, %o0
or %g3, %g2, %g3 or %g3, %g2, %g3
stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
...@@ -1773,8 +1758,9 @@ ret_sys_call: ...@@ -1773,8 +1758,9 @@ ret_sys_call:
b,pt %xcc, rtrap b,pt %xcc, rtrap
stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC] stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
linux_syscall_trace2: linux_syscall_trace2:
add %sp, PTREGS_OFF, %o0
call syscall_trace call syscall_trace
nop mov 1, %o1
stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC] stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC]
ba,pt %xcc, rtrap ba,pt %xcc, rtrap
stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC] stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
* Copyright (C) 1999 David S. Miller (davem@redhat.com) * Copyright (C) 1999 David S. Miller (davem@redhat.com)
*/ */
#define __KERNEL_SYSCALLS__
#include <linux/config.h> #include <linux/config.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -17,7 +19,6 @@ ...@@ -17,7 +19,6 @@
#include <asm/ebus.h> #include <asm/ebus.h>
#include <asm/auxio.h> #include <asm/auxio.h>
#define __KERNEL_SYSCALLS__
#include <linux/unistd.h> #include <linux/unistd.h>
/* /*
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/smp_lock.h> #include <linux/smp_lock.h>
#include <linux/security.h> #include <linux/security.h>
#include <linux/seccomp.h>
#include <linux/audit.h>
#include <linux/signal.h> #include <linux/signal.h>
#include <asm/asi.h> #include <asm/asi.h>
...@@ -628,15 +630,27 @@ asmlinkage void do_ptrace(struct pt_regs *regs) ...@@ -628,15 +630,27 @@ asmlinkage void do_ptrace(struct pt_regs *regs)
unlock_kernel(); unlock_kernel();
} }
asmlinkage void syscall_trace(void) asmlinkage void syscall_trace(struct pt_regs *regs, int syscall_exit_p)
{ {
#ifdef DEBUG_PTRACE /* do the secure computing check first */
printk("%s [%d]: syscall_trace\n", current->comm, current->pid); secure_computing(regs->u_regs[UREG_G1]);
#endif
if (!test_thread_flag(TIF_SYSCALL_TRACE)) if (unlikely(current->audit_context) && syscall_exit_p) {
return; 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)) if (!(current->ptrace & PT_PTRACED))
return; goto out;
if (!test_thread_flag(TIF_SYSCALL_TRACE))
goto out;
ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
? 0x80 : 0)); ? 0x80 : 0));
...@@ -645,12 +659,20 @@ asmlinkage void syscall_trace(void) ...@@ -645,12 +659,20 @@ asmlinkage void syscall_trace(void)
* for normal use. strace only continues with a signal if the * for normal use. strace only continues with a signal if the
* stopping signal is not SIGTRAP. -brl * 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) { if (current->exit_code) {
send_sig (current->exit_code, current, 1); send_sig(current->exit_code, current, 1);
current->exit_code = 0; 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]);
} }
...@@ -45,8 +45,8 @@ extern void calibrate_delay(void); ...@@ -45,8 +45,8 @@ extern void calibrate_delay(void);
/* Please don't make this stuff initdata!!! --DaveM */ /* Please don't make this stuff initdata!!! --DaveM */
static unsigned char boot_cpu_id; static unsigned char boot_cpu_id;
cpumask_t cpu_online_map = CPU_MASK_NONE; cpumask_t cpu_online_map = CPU_MASK_NONE __read_mostly;
cpumask_t phys_cpu_present_map = CPU_MASK_NONE; cpumask_t phys_cpu_present_map = CPU_MASK_NONE __read_mostly;
static cpumask_t smp_commenced_mask; static cpumask_t smp_commenced_mask;
static cpumask_t cpu_callout_map; static cpumask_t cpu_callout_map;
...@@ -155,7 +155,7 @@ void cpu_panic(void) ...@@ -155,7 +155,7 @@ void cpu_panic(void)
panic("SMP bolixed\n"); 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 /* This tick register synchronization scheme is taken entirely from
* the ia64 port, see arch/ia64/kernel/smpboot.c for details and credit. * the ia64 port, see arch/ia64/kernel/smpboot.c for details and credit.
...@@ -1193,8 +1193,8 @@ void smp_send_stop(void) ...@@ -1193,8 +1193,8 @@ void smp_send_stop(void)
{ {
} }
unsigned long __per_cpu_base; unsigned long __per_cpu_base __read_mostly;
unsigned long __per_cpu_shift; unsigned long __per_cpu_shift __read_mostly;
EXPORT_SYMBOL(__per_cpu_base); EXPORT_SYMBOL(__per_cpu_base);
EXPORT_SYMBOL(__per_cpu_shift); EXPORT_SYMBOL(__per_cpu_shift);
......
...@@ -79,7 +79,7 @@ extern void linux_sparc_syscall(void); ...@@ -79,7 +79,7 @@ extern void linux_sparc_syscall(void);
extern void rtrap(void); extern void rtrap(void);
extern void show_regs(struct pt_regs *); extern void show_regs(struct pt_regs *);
extern void solaris_syscall(void); 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 u32 sunos_sys_table[], sys_call_table32[];
extern void tl0_solaris(void); extern void tl0_solaris(void);
extern void sys_sigsuspend(void); extern void sys_sigsuspend(void);
......
...@@ -135,6 +135,8 @@ SIGN2(sys32_shutdown, sys_shutdown, %o0, %o1) ...@@ -135,6 +135,8 @@ SIGN2(sys32_shutdown, sys_shutdown, %o0, %o1)
SIGN3(sys32_socketpair, sys_socketpair, %o0, %o1, %o2) SIGN3(sys32_socketpair, sys_socketpair, %o0, %o1, %o2)
SIGN1(sys32_getpeername, sys_getpeername, %o0) SIGN1(sys32_getpeername, sys_getpeername, %o0)
SIGN1(sys32_getsockname, sys_getsockname, %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 .globl sys32_mmap2
sys32_mmap2: sys32_mmap2:
......
...@@ -59,11 +59,11 @@ sys_call_table32: ...@@ -59,11 +59,11 @@ sys_call_table32:
/*180*/ .word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall /*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 .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 /*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 /*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 .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 /*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 /*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 .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 /*230*/ .word sys32_select, compat_sys_time, sys_nis_syscall, compat_sys_stime, compat_sys_statfs64
...@@ -125,11 +125,11 @@ sys_call_table: ...@@ -125,11 +125,11 @@ sys_call_table:
/*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_ni_syscall /*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 .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 /*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 /*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 .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 /*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 /*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 .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 /*230*/ .word sys_select, sys_nis_syscall, sys_nis_syscall, sys_stime, sys_statfs64
......
...@@ -73,7 +73,7 @@ static __initdata struct sparc64_tick_ops dummy_tick_ops = { ...@@ -73,7 +73,7 @@ static __initdata struct sparc64_tick_ops dummy_tick_ops = {
.get_tick = dummy_get_tick, .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) #define TICK_PRIV_BIT (1UL << 63)
...@@ -195,7 +195,7 @@ static unsigned long tick_add_tick(unsigned long adj, unsigned long offset) ...@@ -195,7 +195,7 @@ static unsigned long tick_add_tick(unsigned long adj, unsigned long offset)
return new_tick; return new_tick;
} }
static struct sparc64_tick_ops tick_operations = { static struct sparc64_tick_ops tick_operations __read_mostly = {
.init_tick = tick_init_tick, .init_tick = tick_init_tick,
.get_tick = tick_get_tick, .get_tick = tick_get_tick,
.get_compare = tick_get_compare, .get_compare = tick_get_compare,
...@@ -276,7 +276,7 @@ static unsigned long stick_add_compare(unsigned long adj) ...@@ -276,7 +276,7 @@ static unsigned long stick_add_compare(unsigned long adj)
return new_compare; return new_compare;
} }
static struct sparc64_tick_ops stick_operations = { static struct sparc64_tick_ops stick_operations __read_mostly = {
.init_tick = stick_init_tick, .init_tick = stick_init_tick,
.get_tick = stick_get_tick, .get_tick = stick_get_tick,
.get_compare = stick_get_compare, .get_compare = stick_get_compare,
...@@ -422,7 +422,7 @@ static unsigned long hbtick_add_compare(unsigned long adj) ...@@ -422,7 +422,7 @@ static unsigned long hbtick_add_compare(unsigned long adj)
return val; return val;
} }
static struct sparc64_tick_ops hbtick_operations = { static struct sparc64_tick_ops hbtick_operations __read_mostly = {
.init_tick = hbtick_init_tick, .init_tick = hbtick_init_tick,
.get_tick = hbtick_get_tick, .get_tick = hbtick_get_tick,
.get_compare = hbtick_get_compare, .get_compare = hbtick_get_compare,
...@@ -437,10 +437,9 @@ static struct sparc64_tick_ops hbtick_operations = { ...@@ -437,10 +437,9 @@ static struct sparc64_tick_ops hbtick_operations = {
* NOTE: On SUN5 systems the ticker interrupt comes in using 2 * NOTE: On SUN5 systems the ticker interrupt comes in using 2
* interrupts, one at level14 and one with softint bit 0. * interrupts, one at level14 and one with softint bit 0.
*/ */
unsigned long timer_tick_offset; unsigned long timer_tick_offset __read_mostly;
unsigned long timer_tick_compare;
static unsigned long timer_ticks_per_nsec_quotient; static unsigned long timer_ticks_per_nsec_quotient __read_mostly;
#define TICK_SIZE (tick_nsec / 1000) #define TICK_SIZE (tick_nsec / 1000)
...@@ -464,7 +463,7 @@ static inline void timer_check_rtc(void) ...@@ -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) 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); write_seqlock(&xtime_lock);
...@@ -483,14 +482,14 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs * regs) ...@@ -483,14 +482,14 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)
: "=r" (pstate) : "=r" (pstate)
: "i" (PSTATE_IE)); : "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(); ticks = tick_ops->get_tick();
/* Restore PSTATE_IE. */ /* Restore PSTATE_IE. */
__asm__ __volatile__("wrpr %0, 0x0, %%pstate" __asm__ __volatile__("wrpr %0, 0x0, %%pstate"
: /* no outputs */ : /* no outputs */
: "r" (pstate)); : "r" (pstate));
} while (time_after_eq(ticks, timer_tick_compare)); } while (time_after_eq(ticks, compare));
timer_check_rtc(); timer_check_rtc();
...@@ -506,11 +505,6 @@ void timer_tick_interrupt(struct pt_regs *regs) ...@@ -506,11 +505,6 @@ void timer_tick_interrupt(struct pt_regs *regs)
do_timer(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(); timer_check_rtc();
write_sequnlock(&xtime_lock); write_sequnlock(&xtime_lock);
......
...@@ -32,6 +32,8 @@ SECTIONS ...@@ -32,6 +32,8 @@ SECTIONS
.data1 : { *(.data1) } .data1 : { *(.data1) }
. = ALIGN(64); . = ALIGN(64);
.data.cacheline_aligned : { *(.data.cacheline_aligned) } .data.cacheline_aligned : { *(.data.cacheline_aligned) }
. = ALIGN(64);
.data.read_mostly : { *(.data.read_mostly) }
_edata = .; _edata = .;
PROVIDE (edata = .); PROVIDE (edata = .);
.fixup : { *(.fixup) } .fixup : { *(.fixup) }
......
...@@ -33,22 +33,6 @@ ...@@ -33,22 +33,6 @@
extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS]; extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS];
/*
* To debug kernel during syscall entry.
*/
void syscall_trace_entry(struct pt_regs *regs)
{
printk("scall entry: %s[%d]/cpu%d: %d\n", current->comm, current->pid, smp_processor_id(), (int) regs->u_regs[UREG_G1]);
}
/*
* To debug kernel during syscall exit.
*/
void syscall_trace_exit(struct pt_regs *regs)
{
printk("scall exit: %s[%d]/cpu%d: %d\n", current->comm, current->pid, smp_processor_id(), (int) regs->u_regs[UREG_G1]);
}
/* /*
* To debug kernel to catch accesses to certain virtual/physical addresses. * To debug kernel to catch accesses to certain virtual/physical addresses.
* Mode = 0 selects physical watchpoints, mode = 1 selects virtual watchpoints. * Mode = 0 selects physical watchpoints, mode = 1 selects virtual watchpoints.
......
...@@ -24,8 +24,9 @@ ...@@ -24,8 +24,9 @@
.text .text
solaris_syscall_trace: solaris_syscall_trace:
add %sp, PTREGS_OFF, %o0
call syscall_trace call syscall_trace
nop mov 0, %o1
srl %i0, 0, %o0 srl %i0, 0, %o0
mov %i4, %o4 mov %i4, %o4
srl %i1, 0, %o1 srl %i1, 0, %o1
...@@ -159,8 +160,10 @@ ret_from_solaris: ...@@ -159,8 +160,10 @@ ret_from_solaris:
stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC] !npc = npc+4 stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC] !npc = npc+4
solaris_syscall_trace2: solaris_syscall_trace2:
add %sp, PTREGS_OFF, %o0
call syscall_trace call syscall_trace
add %l1, 0x4, %l2 /* npc = npc+4 */ mov 1, %o1
add %l1, 0x4, %l2 /* npc = npc+4 */
andcc %l1, 1, %g0 andcc %l1, 1, %g0
bne,pn %icc, 2b bne,pn %icc, 2b
nop nop
......
...@@ -212,7 +212,7 @@ ...@@ -212,7 +212,7 @@
#define __NR_epoll_create 193 /* Linux Specific */ #define __NR_epoll_create 193 /* Linux Specific */
#define __NR_epoll_ctl 194 /* Linux Specific */ #define __NR_epoll_ctl 194 /* Linux Specific */
#define __NR_epoll_wait 195 /* Linux Specific */ #define __NR_epoll_wait 195 /* Linux Specific */
/* #define __NR_ulimit 196 Linux Specific */ #define __NR_ioprio_set 196 /* Linux Specific */
#define __NR_getppid 197 /* Linux Specific */ #define __NR_getppid 197 /* Linux Specific */
#define __NR_sigaction 198 /* Linux Specific */ #define __NR_sigaction 198 /* Linux Specific */
#define __NR_sgetmask 199 /* Linux Specific */ #define __NR_sgetmask 199 /* Linux Specific */
...@@ -234,7 +234,7 @@ ...@@ -234,7 +234,7 @@
#define __NR_ipc 215 /* Linux Specific */ #define __NR_ipc 215 /* Linux Specific */
#define __NR_sigreturn 216 /* Linux Specific */ #define __NR_sigreturn 216 /* Linux Specific */
#define __NR_clone 217 /* Linux Specific */ #define __NR_clone 217 /* Linux Specific */
/* #define __NR_modify_ldt 218 Linux Specific - i386 specific, unused */ #define __NR_ioprio_get 218 /* Linux Specific */
#define __NR_adjtimex 219 /* Linux Specific */ #define __NR_adjtimex 219 /* Linux Specific */
#define __NR_sigprocmask 220 /* Linux Specific */ #define __NR_sigprocmask 220 /* Linux Specific */
#define __NR_create_module 221 /* Linux Specific */ #define __NR_create_module 221 /* Linux Specific */
......
...@@ -220,8 +220,8 @@ register struct thread_info *current_thread_info_reg asm("g6"); ...@@ -220,8 +220,8 @@ register struct thread_info *current_thread_info_reg asm("g6");
#define TIF_NEWSIGNALS 6 /* wants new-style signals */ #define TIF_NEWSIGNALS 6 /* wants new-style signals */
#define TIF_32BIT 7 /* 32-bit binary */ #define TIF_32BIT 7 /* 32-bit binary */
#define TIF_NEWCHILD 8 /* just-spawned child process */ #define TIF_NEWCHILD 8 /* just-spawned child process */
/* TIF_* value 9 is available */ #define TIF_SECCOMP 9 /* secure computing */
#define TIF_POLLING_NRFLAG 10 #define TIF_SYSCALL_AUDIT 10 /* syscall auditing active */
#define TIF_SYSCALL_SUCCESS 11 #define TIF_SYSCALL_SUCCESS 11
/* NOTE: Thread flags >= 12 should be ones we have no interest /* NOTE: Thread flags >= 12 should be ones we have no interest
* in using in assembly, else we can't use the mask as * in using in assembly, else we can't use the mask as
...@@ -229,6 +229,7 @@ register struct thread_info *current_thread_info_reg asm("g6"); ...@@ -229,6 +229,7 @@ register struct thread_info *current_thread_info_reg asm("g6");
*/ */
#define TIF_ABI_PENDING 12 #define TIF_ABI_PENDING 12
#define TIF_MEMDIE 13 #define TIF_MEMDIE 13
#define TIF_POLLING_NRFLAG 14
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
...@@ -239,9 +240,11 @@ register struct thread_info *current_thread_info_reg asm("g6"); ...@@ -239,9 +240,11 @@ register struct thread_info *current_thread_info_reg asm("g6");
#define _TIF_NEWSIGNALS (1<<TIF_NEWSIGNALS) #define _TIF_NEWSIGNALS (1<<TIF_NEWSIGNALS)
#define _TIF_32BIT (1<<TIF_32BIT) #define _TIF_32BIT (1<<TIF_32BIT)
#define _TIF_NEWCHILD (1<<TIF_NEWCHILD) #define _TIF_NEWCHILD (1<<TIF_NEWCHILD)
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) #define _TIF_SECCOMP (1<<TIF_SECCOMP)
#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING) #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
#define _TIF_SYSCALL_SUCCESS (1<<TIF_SYSCALL_SUCCESS) #define _TIF_SYSCALL_SUCCESS (1<<TIF_SYSCALL_SUCCESS)
#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING)
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
#define _TIF_USER_WORK_MASK ((0xff << TI_FLAG_WSAVED_SHIFT) | \ #define _TIF_USER_WORK_MASK ((0xff << TI_FLAG_WSAVED_SHIFT) | \
(_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | \ (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | \
......
...@@ -212,7 +212,7 @@ ...@@ -212,7 +212,7 @@
#define __NR_epoll_create 193 /* Linux Specific */ #define __NR_epoll_create 193 /* Linux Specific */
#define __NR_epoll_ctl 194 /* Linux Specific */ #define __NR_epoll_ctl 194 /* Linux Specific */
#define __NR_epoll_wait 195 /* Linux Specific */ #define __NR_epoll_wait 195 /* Linux Specific */
/* #define __NR_ulimit 196 Linux Specific */ #define __NR_ioprio_set 196 /* Linux Specific */
#define __NR_getppid 197 /* Linux Specific */ #define __NR_getppid 197 /* Linux Specific */
#define __NR_sigaction 198 /* Linux Specific */ #define __NR_sigaction 198 /* Linux Specific */
#define __NR_sgetmask 199 /* Linux Specific */ #define __NR_sgetmask 199 /* Linux Specific */
...@@ -234,7 +234,7 @@ ...@@ -234,7 +234,7 @@
#define __NR_ipc 215 /* Linux Specific */ #define __NR_ipc 215 /* Linux Specific */
#define __NR_sigreturn 216 /* Linux Specific */ #define __NR_sigreturn 216 /* Linux Specific */
#define __NR_clone 217 /* Linux Specific */ #define __NR_clone 217 /* Linux Specific */
/* #define __NR_modify_ldt 218 Linux Specific - i386 specific, unused */ #define __NR_ioprio_get 218 /* Linux Specific */
#define __NR_adjtimex 219 /* Linux Specific */ #define __NR_adjtimex 219 /* Linux Specific */
#define __NR_sigprocmask 220 /* Linux Specific */ #define __NR_sigprocmask 220 /* Linux Specific */
#define __NR_create_module 221 /* Linux Specific */ #define __NR_create_module 221 /* Linux Specific */
......
...@@ -165,7 +165,7 @@ ...@@ -165,7 +165,7 @@
#define AUDIT_ARCH_SH64 (EM_SH|__AUDIT_ARCH_64BIT) #define AUDIT_ARCH_SH64 (EM_SH|__AUDIT_ARCH_64BIT)
#define AUDIT_ARCH_SHEL64 (EM_SH|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) #define AUDIT_ARCH_SHEL64 (EM_SH|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
#define AUDIT_ARCH_SPARC (EM_SPARC) #define AUDIT_ARCH_SPARC (EM_SPARC)
#define AUDIT_ARCH_SPARC64 (EM_SPARC64|__AUDIT_ARCH_64BIT) #define AUDIT_ARCH_SPARC64 (EM_SPARCV9|__AUDIT_ARCH_64BIT)
#define AUDIT_ARCH_V850 (EM_V850|__AUDIT_ARCH_LE) #define AUDIT_ARCH_V850 (EM_V850|__AUDIT_ARCH_LE)
#define AUDIT_ARCH_X86_64 (EM_X86_64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) #define AUDIT_ARCH_X86_64 (EM_X86_64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
#define SMP_CACHE_BYTES L1_CACHE_BYTES #define SMP_CACHE_BYTES L1_CACHE_BYTES
#endif #endif
#ifdef CONFIG_X86 #if defined(CONFIG_X86) || defined(CONFIG_SPARC64)
#define __read_mostly __attribute__((__section__(".data.read_mostly"))) #define __read_mostly __attribute__((__section__(".data.read_mostly")))
#else #else
#define __read_mostly #define __read_mostly
......
...@@ -174,7 +174,7 @@ config AUDIT ...@@ -174,7 +174,7 @@ config AUDIT
config AUDITSYSCALL config AUDITSYSCALL
bool "Enable system-call auditing support" bool "Enable system-call auditing support"
depends on AUDIT && (X86 || PPC || PPC64 || ARCH_S390 || IA64 || UML) depends on AUDIT && (X86 || PPC || PPC64 || ARCH_S390 || IA64 || UML || SPARC64)
default y if SECURITY_SELINUX default y if SECURITY_SELINUX
help help
Enable low-overhead system-call auditing infrastructure that Enable low-overhead system-call auditing infrastructure that
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment