Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal

Pull signal handling cleanups from Al Viro:
 "This is the first pile; another one will come a bit later and will
  contain SYSCALL_DEFINE-related patches.

   - a bunch of signal-related syscalls (both native and compat)
     unified.

   - a bunch of compat syscalls switched to COMPAT_SYSCALL_DEFINE
     (fixing several potential problems with missing argument
     validation, while we are at it)

   - a lot of now-pointless wrappers killed

   - a couple of architectures (cris and hexagon) forgot to save
     altstack settings into sigframe, even though they used the
     (uninitialized) values in sigreturn; fixed.

   - microblaze fixes for delivery of multiple signals arriving at once

   - saner set of helpers for signal delivery introduced, several
     architectures switched to using those."

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal: (143 commits)
  x86: convert to ksignal
  sparc: convert to ksignal
  arm: switch to struct ksignal * passing
  alpha: pass k_sigaction and siginfo_t using ksignal pointer
  burying unused conditionals
  make do_sigaltstack() static
  arm64: switch to generic old sigaction() (compat-only)
  arm64: switch to generic compat rt_sigaction()
  arm64: switch compat to generic old sigsuspend
  arm64: switch to generic compat rt_sigqueueinfo()
  arm64: switch to generic compat rt_sigpending()
  arm64: switch to generic compat rt_sigprocmask()
  arm64: switch to generic sigaltstack
  sparc: switch to generic old sigsuspend
  sparc: COMPAT_SYSCALL_DEFINE does all sign-extension as well as SYSCALL_DEFINE
  sparc: kill sign-extending wrappers for native syscalls
  kill sparc32_open()
  sparc: switch to use of generic old sigaction
  sparc: switch sys_compat_rt_sigaction() to COMPAT_SYSCALL_DEFINE
  mips: switch to generic sys_fork() and sys_clone()
  ...
This commit is contained in:
Linus Torvalds 2013-02-23 18:50:11 -08:00
commit 9e2d59ad58
185 changed files with 1361 additions and 4823 deletions

View File

@ -368,9 +368,6 @@ config MODULES_USE_ELF_REL
Modules only use ELF REL relocations. Modules with ELF RELA Modules only use ELF REL relocations. Modules with ELF RELA
relocations will give an error. relocations will give an error.
config GENERIC_SIGALTSTACK
bool
# #
# ABI hall of shame # ABI hall of shame
# #
@ -385,4 +382,30 @@ config CLONE_BACKWARDS2
help help
Architecture has the first two arguments of clone(2) swapped. Architecture has the first two arguments of clone(2) swapped.
config ODD_RT_SIGACTION
bool
help
Architecture has unusual rt_sigaction(2) arguments
config OLD_SIGSUSPEND
bool
help
Architecture has old sigsuspend(2) syscall, of one-argument variety
config OLD_SIGSUSPEND3
bool
help
Even weirder antique ABI - three-argument sigsuspend(2)
config OLD_SIGACTION
bool
help
Architecture has old sigaction(2) syscall. Nope, not the same
as OLD_SIGSUSPEND | OLD_SIGSUSPEND3 - alpha has sigsuspend(2),
but fairly different variant of sigaction(2), thanks to OSF/1
compatibility...
config COMPAT_OLD_SIGACTION
bool
source "kernel/gcov/Kconfig" source "kernel/gcov/Kconfig"

View File

@ -21,7 +21,8 @@ config ALPHA
select GENERIC_STRNLEN_USER select GENERIC_STRNLEN_USER
select HAVE_MOD_ARCH_SPECIFIC select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_RELA select MODULES_USE_ELF_RELA
select GENERIC_SIGALTSTACK select ODD_RT_SIGACTION
select OLD_SIGSUSPEND
help help
The Alpha is a 64-bit general-purpose processor designed and The Alpha is a 64-bit general-purpose processor designed and
marketed by the Digital Equipment Corporation of blessed memory, marketed by the Digital Equipment Corporation of blessed memory,

View File

@ -22,15 +22,6 @@ struct osf_sigaction {
int sa_flags; int sa_flags;
}; };
struct sigaction { #define __ARCH_HAS_KA_RESTORER
__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;
};
#include <asm/sigcontext.h> #include <asm/sigcontext.h>
#endif #endif

View File

@ -14,7 +14,6 @@
#define __ARCH_WANT_SYS_OLD_GETRLIMIT #define __ARCH_WANT_SYS_OLD_GETRLIMIT
#define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_CLONE

View File

@ -250,7 +250,6 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
struct pt_regs *childregs = task_pt_regs(p); struct pt_regs *childregs = task_pt_regs(p);
struct pt_regs *regs = current_pt_regs(); struct pt_regs *regs = current_pt_regs();
struct switch_stack *childstack, *stack; struct switch_stack *childstack, *stack;
unsigned long settls;
childstack = ((struct switch_stack *) childregs) - 1; childstack = ((struct switch_stack *) childregs) - 1;
childti->pcb.ksp = (unsigned long) childstack; childti->pcb.ksp = (unsigned long) childstack;

View File

@ -112,16 +112,6 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,
return ret; return ret;
} }
/*
* Atomically swap in the new signal mask, and wait for a signal.
*/
SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask)
{
sigset_t blocked;
siginitset(&blocked, mask);
return sigsuspend(&blocked);
}
/* /*
* Do a signal return; undo the signal stack. * Do a signal return; undo the signal stack.
*/ */
@ -282,12 +272,9 @@ give_sigsegv:
*/ */
static inline void __user * 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)) return (void __user *)((sigsp(sp, ksig) - frame_size) & -32ul);
sp = current->sas_ss_sp + current->sas_ss_size;
return (void __user *)((sp - frame_size) & -32ul);
} }
static long static long
@ -348,14 +335,13 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
} }
static int static int
setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, setup_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
struct pt_regs *regs)
{ {
unsigned long oldsp, r26, err = 0; unsigned long oldsp, r26, err = 0;
struct sigframe __user *frame; struct sigframe __user *frame;
oldsp = rdusp(); oldsp = rdusp();
frame = get_sigframe(ka, oldsp, sizeof(*frame)); frame = get_sigframe(ksig, oldsp, sizeof(*frame));
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
return -EFAULT; return -EFAULT;
@ -365,9 +351,8 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
/* Set up to return from userspace. If provided, use a stub /* Set up to return from userspace. If provided, use a stub
already in userspace. */ already in userspace. */
if (ka->ka_restorer) { r26 = (unsigned long) ksig->ka.ka_restorer;
r26 = (unsigned long) ka->ka_restorer; if (!r26) {
} else {
err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0); 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_LDI_R0+__NR_sigreturn, frame->retcode+1);
err |= __put_user(INSN_CALLSYS, frame->retcode+2); err |= __put_user(INSN_CALLSYS, frame->retcode+2);
@ -381,8 +366,8 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
/* "Return" to the handler */ /* "Return" to the handler */
regs->r26 = r26; regs->r26 = r26;
regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler; regs->r27 = regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
regs->r16 = sig; /* a0: signal number */ regs->r16 = ksig->sig; /* a0: signal number */
regs->r17 = 0; /* a1: exception code */ regs->r17 = 0; /* a1: exception code */
regs->r18 = (unsigned long) &frame->sc; /* a2: sigcontext pointer */ regs->r18 = (unsigned long) &frame->sc; /* a2: sigcontext pointer */
wrusp((unsigned long) frame); wrusp((unsigned long) frame);
@ -395,18 +380,17 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
} }
static int static int
setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
sigset_t *set, struct pt_regs *regs)
{ {
unsigned long oldsp, r26, err = 0; unsigned long oldsp, r26, err = 0;
struct rt_sigframe __user *frame; struct rt_sigframe __user *frame;
oldsp = rdusp(); oldsp = rdusp();
frame = get_sigframe(ka, oldsp, sizeof(*frame)); frame = get_sigframe(ksig, oldsp, sizeof(*frame));
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
return -EFAULT; return -EFAULT;
err |= copy_siginfo_to_user(&frame->info, info); err |= copy_siginfo_to_user(&frame->info, &ksig->info);
/* Create the ucontext. */ /* Create the ucontext. */
err |= __put_user(0, &frame->uc.uc_flags); err |= __put_user(0, &frame->uc.uc_flags);
@ -421,9 +405,8 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/* Set up to return from userspace. If provided, use a stub /* Set up to return from userspace. If provided, use a stub
already in userspace. */ already in userspace. */
if (ka->ka_restorer) { r26 = (unsigned long) ksig->ka.ka_restorer;
r26 = (unsigned long) ka->ka_restorer; if (!r26) {
} else {
err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0); err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0);
err |= __put_user(INSN_LDI_R0+__NR_rt_sigreturn, err |= __put_user(INSN_LDI_R0+__NR_rt_sigreturn,
frame->retcode+1); frame->retcode+1);
@ -437,8 +420,8 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/* "Return" to the handler */ /* "Return" to the handler */
regs->r26 = r26; regs->r26 = r26;
regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler; regs->r27 = regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
regs->r16 = sig; /* a0: signal number */ regs->r16 = ksig->sig; /* a0: signal number */
regs->r17 = (unsigned long) &frame->info; /* a1: siginfo pointer */ regs->r17 = (unsigned long) &frame->info; /* a1: siginfo pointer */
regs->r18 = (unsigned long) &frame->uc; /* a2: ucontext pointer */ regs->r18 = (unsigned long) &frame->uc; /* a2: ucontext pointer */
wrusp((unsigned long) frame); wrusp((unsigned long) frame);
@ -456,22 +439,17 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
* OK, we're invoking a handler. * OK, we're invoking a handler.
*/ */
static inline void static inline void
handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, handle_signal(struct ksignal *ksig, struct pt_regs *regs)
struct pt_regs * regs)
{ {
sigset_t *oldset = sigmask_to_save(); sigset_t *oldset = sigmask_to_save();
int ret; int ret;
if (ka->sa.sa_flags & SA_SIGINFO) if (ksig->ka.sa.sa_flags & SA_SIGINFO)
ret = setup_rt_frame(sig, ka, info, oldset, regs); ret = setup_rt_frame(ksig, oldset, regs);
else else
ret = setup_frame(sig, ka, oldset, regs); ret = setup_frame(ksig, oldset, regs);
if (ret) { signal_setup_done(ret, ksig, 0);
force_sigsegv(sig, current);
return;
}
signal_delivered(sig, info, ka, regs, 0);
} }
static inline void static inline void
@ -514,27 +492,19 @@ syscall_restart(unsigned long r0, unsigned long r19,
static void static void
do_signal(struct pt_regs *regs, 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); unsigned long single_stepping = ptrace_cancel_bpt(current);
struct k_sigaction ka; struct ksignal ksig;
/* This lets the debugger run, ... */ /* This lets the debugger run, ... */
signr = get_signal_to_deliver(&info, &ka, regs, NULL); if (get_signal(&ksig)) {
/* ... so re-check the single stepping. */ /* ... so re-check the single stepping. */
single_stepping |= ptrace_cancel_bpt(current); single_stepping |= ptrace_cancel_bpt(current);
if (signr > 0) {
/* Whee! Actually deliver the signal. */ /* Whee! Actually deliver the signal. */
if (r0) if (r0)
syscall_restart(r0, r19, regs, &ka); syscall_restart(r0, r19, regs, &ksig.ka);
handle_signal(signr, &ka, &info, regs); handle_signal(&ksig, regs);
if (single_stepping) } else {
ptrace_set_bpt(current); /* re-set bpt */ single_stepping |= ptrace_cancel_bpt(current);
return;
}
if (r0) { if (r0) {
switch (regs->r0) { switch (regs->r0) {
case ERESTARTNOHAND: case ERESTARTNOHAND:
@ -546,15 +516,14 @@ do_signal(struct pt_regs *regs, unsigned long r0, unsigned long r19)
regs->pc -= 4; regs->pc -= 4;
break; break;
case ERESTART_RESTARTBLOCK: case ERESTART_RESTARTBLOCK:
/* Force v0 to the restart syscall and reply. */ /* Set v0 to the restart_syscall and replay */
regs->r0 = __NR_restart_syscall; regs->r0 = __NR_restart_syscall;
regs->pc -= 4; regs->pc -= 4;
break; break;
} }
} }
/* If there's no signal to deliver, we just restore the saved mask. */
restore_saved_sigmask(); restore_saved_sigmask();
}
if (single_stepping) if (single_stepping)
ptrace_set_bpt(current); /* re-set breakpoint */ ptrace_set_bpt(current); /* re-set breakpoint */
} }

View File

@ -56,6 +56,8 @@ config ARM
select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND
select MODULES_USE_ELF_REL select MODULES_USE_ELF_REL
select CLONE_BACKWARDS select CLONE_BACKWARDS
select OLD_SIGSUSPEND3
select OLD_SIGACTION
help help
The ARM series is a line of low-power-consumption RISC chip designs The ARM series is a line of low-power-consumption RISC chip designs
licensed by ARM Ltd and targeted at embedded applications and licensed by ARM Ltd and targeted at embedded applications and

View File

@ -16,23 +16,7 @@ typedef struct {
unsigned long sig[_NSIG_WORDS]; unsigned long sig[_NSIG_WORDS];
} sigset_t; } sigset_t;
struct old_sigaction { #define __ARCH_HAS_SA_RESTORER
__sighandler_t sa_handler;
old_sigset_t sa_mask;
unsigned long sa_flags;
__sigrestore_t sa_restorer;
};
struct sigaction {
__sighandler_t sa_handler;
unsigned long sa_flags;
__sigrestore_t sa_restorer;
sigset_t sa_mask; /* mask last for extensibility */
};
struct k_sigaction {
struct sigaction sa;
};
#include <asm/sigcontext.h> #include <asm/sigcontext.h>
#endif #endif

View File

@ -26,8 +26,6 @@
#define __ARCH_WANT_SYS_NICE #define __ARCH_WANT_SYS_NICE
#define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_OLD_MMAP #define __ARCH_WANT_SYS_OLD_MMAP
#define __ARCH_WANT_SYS_OLD_SELECT #define __ARCH_WANT_SYS_OLD_SELECT

View File

@ -195,7 +195,7 @@
CALL(sys_getcwd) CALL(sys_getcwd)
CALL(sys_capget) CALL(sys_capget)
/* 185 */ CALL(sys_capset) /* 185 */ CALL(sys_capset)
CALL(sys_sigaltstack_wrapper) CALL(sys_sigaltstack)
CALL(sys_sendfile) CALL(sys_sendfile)
CALL(sys_ni_syscall) /* getpmsg */ CALL(sys_ni_syscall) /* getpmsg */
CALL(sys_ni_syscall) /* putpmsg */ CALL(sys_ni_syscall) /* putpmsg */

View File

@ -514,11 +514,6 @@ sys_rt_sigreturn_wrapper:
b sys_rt_sigreturn b sys_rt_sigreturn
ENDPROC(sys_rt_sigreturn_wrapper) ENDPROC(sys_rt_sigreturn_wrapper)
sys_sigaltstack_wrapper:
ldr r2, [sp, #S_OFF + S_SP]
b do_sigaltstack
ENDPROC(sys_sigaltstack_wrapper)
sys_statfs64_wrapper: sys_statfs64_wrapper:
teq r1, #88 teq r1, #88
moveq r1, #84 moveq r1, #84

View File

@ -45,48 +45,6 @@ const unsigned long sigreturn_codes[7] = {
MOV_R7_NR_RT_SIGRETURN, SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN, MOV_R7_NR_RT_SIGRETURN, SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN,
}; };
/*
* atomically swap in the new signal mask, and wait for a signal.
*/
asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask)
{
sigset_t blocked;
siginitset(&blocked, mask);
return sigsuspend(&blocked);
}
asmlinkage int
sys_sigaction(int sig, const struct old_sigaction __user *act,
struct old_sigaction __user *oact)
{
struct k_sigaction new_ka, old_ka;
int ret;
if (act) {
old_sigset_t mask;
if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
__get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
__get_user(new_ka.sa.sa_restorer, &act->sa_restorer) ||
__get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
__get_user(mask, &act->sa_mask))
return -EFAULT;
siginitset(&new_ka.sa.sa_mask, mask);
}
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
if (!ret && oact) {
if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
__put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
__put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) ||
__put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
return -EFAULT;
}
return ret;
}
#ifdef CONFIG_CRUNCH #ifdef CONFIG_CRUNCH
static int preserve_crunch_context(struct crunch_sigframe __user *frame) static int preserve_crunch_context(struct crunch_sigframe __user *frame)
{ {
@ -300,7 +258,7 @@ asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
if (restore_sigframe(regs, &frame->sig)) if (restore_sigframe(regs, &frame->sig))
goto badframe; goto badframe;
if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->ARM_sp) == -EFAULT) if (restore_altstack(&frame->sig.uc.uc_stack))
goto badframe; goto badframe;
return regs->ARM_r0; return regs->ARM_r0;
@ -360,17 +318,11 @@ setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set)
} }
static inline void __user * static inline void __user *
get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, int framesize) get_sigframe(struct ksignal *ksig, struct pt_regs *regs, int framesize)
{ {
unsigned long sp = regs->ARM_sp; unsigned long sp = sigsp(regs->ARM_sp, ksig);
void __user *frame; void __user *frame;
/*
* This is the X/Open sanctioned signal stack switching.
*/
if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
sp = current->sas_ss_sp + current->sas_ss_size;
/* /*
* ATPCS B01 mandates 8-byte alignment * ATPCS B01 mandates 8-byte alignment
*/ */
@ -385,11 +337,22 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, int framesize)
return frame; return frame;
} }
static int /*
setup_return(struct pt_regs *regs, struct k_sigaction *ka, * translate the signal
unsigned long __user *rc, void __user *frame, int usig) */
static inline int map_sig(int sig)
{ {
unsigned long handler = (unsigned long)ka->sa.sa_handler; struct thread_info *thread = current_thread_info();
if (sig < 32 && thread->exec_domain && thread->exec_domain->signal_invmap)
sig = thread->exec_domain->signal_invmap[sig];
return sig;
}
static int
setup_return(struct pt_regs *regs, struct ksignal *ksig,
unsigned long __user *rc, void __user *frame)
{
unsigned long handler = (unsigned long)ksig->ka.sa.sa_handler;
unsigned long retcode; unsigned long retcode;
int thumb = 0; int thumb = 0;
unsigned long cpsr = regs->ARM_cpsr & ~(PSR_f | PSR_E_BIT); unsigned long cpsr = regs->ARM_cpsr & ~(PSR_f | PSR_E_BIT);
@ -399,7 +362,7 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
/* /*
* Maybe we need to deliver a 32-bit signal to a 26-bit task. * Maybe we need to deliver a 32-bit signal to a 26-bit task.
*/ */
if (ka->sa.sa_flags & SA_THIRTYTWO) if (ksig->ka.sa.sa_flags & SA_THIRTYTWO)
cpsr = (cpsr & ~MODE_MASK) | USR_MODE; cpsr = (cpsr & ~MODE_MASK) | USR_MODE;
#ifdef CONFIG_ARM_THUMB #ifdef CONFIG_ARM_THUMB
@ -421,12 +384,12 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
} }
#endif #endif
if (ka->sa.sa_flags & SA_RESTORER) { if (ksig->ka.sa.sa_flags & SA_RESTORER) {
retcode = (unsigned long)ka->sa.sa_restorer; retcode = (unsigned long)ksig->ka.sa.sa_restorer;
} else { } else {
unsigned int idx = thumb << 1; unsigned int idx = thumb << 1;
if (ka->sa.sa_flags & SA_SIGINFO) if (ksig->ka.sa.sa_flags & SA_SIGINFO)
idx += 3; idx += 3;
if (__put_user(sigreturn_codes[idx], rc) || if (__put_user(sigreturn_codes[idx], rc) ||
@ -451,7 +414,7 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
} }
} }
regs->ARM_r0 = usig; regs->ARM_r0 = map_sig(ksig->sig);
regs->ARM_sp = (unsigned long)frame; regs->ARM_sp = (unsigned long)frame;
regs->ARM_lr = retcode; regs->ARM_lr = retcode;
regs->ARM_pc = handler; regs->ARM_pc = handler;
@ -461,9 +424,9 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
} }
static int static int
setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs) setup_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
{ {
struct sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame)); struct sigframe __user *frame = get_sigframe(ksig, regs, sizeof(*frame));
int err = 0; int err = 0;
if (!frame) if (!frame)
@ -476,36 +439,29 @@ setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *reg
err |= setup_sigframe(frame, regs, set); err |= setup_sigframe(frame, regs, set);
if (err == 0) if (err == 0)
err = setup_return(regs, ka, frame->retcode, frame, usig); err = setup_return(regs, ksig, frame->retcode, frame);
return err; return err;
} }
static int static int
setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
sigset_t *set, struct pt_regs *regs)
{ {
struct rt_sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame)); struct rt_sigframe __user *frame = get_sigframe(ksig, regs, sizeof(*frame));
stack_t stack;
int err = 0; int err = 0;
if (!frame) if (!frame)
return 1; return 1;
err |= copy_siginfo_to_user(&frame->info, info); err |= copy_siginfo_to_user(&frame->info, &ksig->info);
__put_user_error(0, &frame->sig.uc.uc_flags, err); __put_user_error(0, &frame->sig.uc.uc_flags, err);
__put_user_error(NULL, &frame->sig.uc.uc_link, err); __put_user_error(NULL, &frame->sig.uc.uc_link, err);
memset(&stack, 0, sizeof(stack)); err |= __save_altstack(&frame->sig.uc.uc_stack, regs->ARM_sp);
stack.ss_sp = (void __user *)current->sas_ss_sp;
stack.ss_flags = sas_ss_flags(regs->ARM_sp);
stack.ss_size = current->sas_ss_size;
err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack));
err |= setup_sigframe(&frame->sig, regs, set); err |= setup_sigframe(&frame->sig, regs, set);
if (err == 0) if (err == 0)
err = setup_return(regs, ka, frame->sig.retcode, frame, usig); err = setup_return(regs, ksig, frame->sig.retcode, frame);
if (err == 0) { if (err == 0) {
/* /*
@ -523,40 +479,25 @@ setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
/* /*
* OK, we're invoking a handler * OK, we're invoking a handler
*/ */
static void static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
handle_signal(unsigned long sig, struct k_sigaction *ka,
siginfo_t *info, struct pt_regs *regs)
{ {
struct thread_info *thread = current_thread_info();
struct task_struct *tsk = current;
sigset_t *oldset = sigmask_to_save(); sigset_t *oldset = sigmask_to_save();
int usig = sig;
int ret; int ret;
/*
* translate the signal
*/
if (usig < 32 && thread->exec_domain && thread->exec_domain->signal_invmap)
usig = thread->exec_domain->signal_invmap[usig];
/* /*
* Set up the stack frame * Set up the stack frame
*/ */
if (ka->sa.sa_flags & SA_SIGINFO) if (ksig->ka.sa.sa_flags & SA_SIGINFO)
ret = setup_rt_frame(usig, ka, info, oldset, regs); ret = setup_rt_frame(ksig, oldset, regs);
else else
ret = setup_frame(usig, ka, oldset, regs); ret = setup_frame(ksig, oldset, regs);
/* /*
* Check that the resulting registers are actually sane. * Check that the resulting registers are actually sane.
*/ */
ret |= !valid_user_regs(regs); ret |= !valid_user_regs(regs);
if (ret != 0) { signal_setup_done(ret, ksig, 0);
force_sigsegv(sig, tsk);
return;
}
signal_delivered(sig, info, ka, regs, 0);
} }
/* /*
@ -571,9 +512,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
static int do_signal(struct pt_regs *regs, int syscall) static int do_signal(struct pt_regs *regs, int syscall)
{ {
unsigned int retval = 0, continue_addr = 0, restart_addr = 0; unsigned int retval = 0, continue_addr = 0, restart_addr = 0;
struct k_sigaction ka; struct ksignal ksig;
siginfo_t info;
int signr;
int restart = 0; int restart = 0;
/* /*
@ -605,34 +544,33 @@ static int do_signal(struct pt_regs *regs, int syscall)
* Get the signal to deliver. When running under ptrace, at this * Get the signal to deliver. When running under ptrace, at this
* point the debugger may change all our registers ... * point the debugger may change all our registers ...
*/ */
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
/* /*
* Depending on the signal settings we may need to revert the * Depending on the signal settings we may need to revert the
* decision to restart the system call. But skip this if a * decision to restart the system call. But skip this if a
* debugger has chosen to restart at a different PC. * debugger has chosen to restart at a different PC.
*/ */
if (regs->ARM_pc != restart_addr) if (get_signal(&ksig)) {
restart = 0; /* handler */
if (signr > 0) { if (unlikely(restart) && regs->ARM_pc == restart_addr) {
if (unlikely(restart)) {
if (retval == -ERESTARTNOHAND || if (retval == -ERESTARTNOHAND ||
retval == -ERESTART_RESTARTBLOCK retval == -ERESTART_RESTARTBLOCK
|| (retval == -ERESTARTSYS || (retval == -ERESTARTSYS
&& !(ka.sa.sa_flags & SA_RESTART))) { && !(ksig.ka.sa.sa_flags & SA_RESTART))) {
regs->ARM_r0 = -EINTR; regs->ARM_r0 = -EINTR;
regs->ARM_pc = continue_addr; regs->ARM_pc = continue_addr;
} }
} }
handle_signal(&ksig, regs);
handle_signal(signr, &ka, &info, regs); } else {
return 0; /* no handler */
}
restore_saved_sigmask(); restore_saved_sigmask();
if (unlikely(restart)) if (unlikely(restart) && regs->ARM_pc == restart_addr) {
regs->ARM_pc = continue_addr; regs->ARM_pc = continue_addr;
return restart; return restart;
} }
}
return 0;
}
asmlinkage int asmlinkage int
do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall) do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)

View File

@ -205,6 +205,8 @@ config COMPAT
depends on !ARM64_64K_PAGES depends on !ARM64_64K_PAGES
select COMPAT_BINFMT_ELF select COMPAT_BINFMT_ELF
select HAVE_UID16 select HAVE_UID16
select OLD_SIGSUSPEND3
select COMPAT_OLD_SIGACTION
help help
This option enables support for a 32-bit EL0 running under a 64-bit This option enables support for a 32-bit EL0 running under a 64-bit
kernel at EL1. AArch32-specific components such as system calls, kernel at EL1. AArch32-specific components such as system calls,

View File

@ -24,8 +24,6 @@
* System call wrappers implemented in kernel/entry.S. * System call wrappers implemented in kernel/entry.S.
*/ */
asmlinkage long sys_rt_sigreturn_wrapper(void); asmlinkage long sys_rt_sigreturn_wrapper(void);
asmlinkage long sys_sigaltstack_wrapper(const stack_t __user *uss,
stack_t __user *uoss);
#include <asm-generic/syscalls.h> #include <asm-generic/syscalls.h>

View File

@ -20,10 +20,8 @@
#define __ARCH_WANT_SYS_GETPGRP #define __ARCH_WANT_SYS_GETPGRP
#define __ARCH_WANT_SYS_LLSEEK #define __ARCH_WANT_SYS_LLSEEK
#define __ARCH_WANT_SYS_NICE #define __ARCH_WANT_SYS_NICE
#define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
#define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_COMPAT_SYS_SENDFILE #define __ARCH_WANT_COMPAT_SYS_SENDFILE
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK

View File

@ -93,7 +93,7 @@ __SYSCALL(68, sys_ni_syscall) /* 68 was sys_sgetmask */
__SYSCALL(69, sys_ni_syscall) /* 69 was sys_ssetmask */ __SYSCALL(69, sys_ni_syscall) /* 69 was sys_ssetmask */
__SYSCALL(70, sys_setreuid16) __SYSCALL(70, sys_setreuid16)
__SYSCALL(71, sys_setregid16) __SYSCALL(71, sys_setregid16)
__SYSCALL(72, compat_sys_sigsuspend) __SYSCALL(72, sys_sigsuspend)
__SYSCALL(73, compat_sys_sigpending) __SYSCALL(73, compat_sys_sigpending)
__SYSCALL(74, sys_sethostname) __SYSCALL(74, sys_sethostname)
__SYSCALL(75, compat_sys_setrlimit) __SYSCALL(75, compat_sys_setrlimit)
@ -207,7 +207,7 @@ __SYSCALL(182, sys_chown16)
__SYSCALL(183, sys_getcwd) __SYSCALL(183, sys_getcwd)
__SYSCALL(184, sys_capget) __SYSCALL(184, sys_capget)
__SYSCALL(185, sys_capset) __SYSCALL(185, sys_capset)
__SYSCALL(186, compat_sys_sigaltstack_wrapper) __SYSCALL(186, compat_sys_sigaltstack)
__SYSCALL(187, compat_sys_sendfile) __SYSCALL(187, compat_sys_sendfile)
__SYSCALL(188, sys_ni_syscall) /* 188 reserved */ __SYSCALL(188, sys_ni_syscall) /* 188 reserved */
__SYSCALL(189, sys_ni_syscall) /* 189 reserved */ __SYSCALL(189, sys_ni_syscall) /* 189 reserved */

View File

@ -677,10 +677,5 @@ ENTRY(sys_rt_sigreturn_wrapper)
b sys_rt_sigreturn b sys_rt_sigreturn
ENDPROC(sys_rt_sigreturn_wrapper) ENDPROC(sys_rt_sigreturn_wrapper)
ENTRY(sys_sigaltstack_wrapper)
ldr x2, [sp, #S_SP]
b sys_sigaltstack
ENDPROC(sys_sigaltstack_wrapper)
ENTRY(handle_arch_irq) ENTRY(handle_arch_irq)
.quad 0 .quad 0

View File

@ -149,8 +149,7 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)
if (restore_sigframe(regs, frame)) if (restore_sigframe(regs, frame))
goto badframe; goto badframe;
if (do_sigaltstack(&frame->uc.uc_stack, if (restore_altstack(&frame->uc.uc_stack))
NULL, regs->sp) == -EFAULT)
goto badframe; goto badframe;
return regs->regs[0]; return regs->regs[0];
@ -164,12 +163,6 @@ badframe:
return 0; return 0;
} }
asmlinkage long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
unsigned long sp)
{
return do_sigaltstack(uss, uoss, sp);
}
static int setup_sigframe(struct rt_sigframe __user *sf, static int setup_sigframe(struct rt_sigframe __user *sf,
struct pt_regs *regs, sigset_t *set) struct pt_regs *regs, sigset_t *set)
{ {
@ -250,7 +243,6 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
sigset_t *set, struct pt_regs *regs) sigset_t *set, struct pt_regs *regs)
{ {
struct rt_sigframe __user *frame; struct rt_sigframe __user *frame;
stack_t stack;
int err = 0; int err = 0;
frame = get_sigframe(ka, regs); frame = get_sigframe(ka, regs);
@ -260,12 +252,7 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
__put_user_error(0, &frame->uc.uc_flags, err); __put_user_error(0, &frame->uc.uc_flags, err);
__put_user_error(NULL, &frame->uc.uc_link, err); __put_user_error(NULL, &frame->uc.uc_link, err);
memset(&stack, 0, sizeof(stack)); err |= __save_altstack(&frame->uc.uc_stack, regs->sp);
stack.ss_sp = (void __user *)current->sas_ss_sp;
stack.ss_flags = sas_ss_flags(regs->sp);
stack.ss_size = current->sas_ss_size;
err |= __copy_to_user(&frame->uc.uc_stack, &stack, sizeof(stack));
err |= setup_sigframe(frame, regs, set); err |= setup_sigframe(frame, regs, set);
if (err == 0) { if (err == 0) {
setup_return(regs, ka, frame, usig); setup_return(regs, ka, frame, usig);

View File

@ -28,26 +28,6 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/unistd32.h> #include <asm/unistd32.h>
struct compat_sigaction {
compat_uptr_t sa_handler;
compat_ulong_t sa_flags;
compat_uptr_t sa_restorer;
compat_sigset_t sa_mask;
};
struct compat_old_sigaction {
compat_uptr_t sa_handler;
compat_old_sigset_t sa_mask;
compat_ulong_t sa_flags;
compat_uptr_t sa_restorer;
};
typedef struct compat_sigaltstack {
compat_uptr_t ss_sp;
int ss_flags;
compat_size_t ss_size;
} compat_stack_t;
struct compat_sigcontext { struct compat_sigcontext {
/* We always set these two fields to 0 */ /* We always set these two fields to 0 */
compat_ulong_t trap_no; compat_ulong_t trap_no;
@ -339,127 +319,6 @@ static int compat_restore_vfp_context(struct compat_vfp_sigframe __user *frame)
return err ? -EFAULT : 0; return err ? -EFAULT : 0;
} }
/*
* atomically swap in the new signal mask, and wait for a signal.
*/
asmlinkage int compat_sys_sigsuspend(int restart, compat_ulong_t oldmask,
compat_old_sigset_t mask)
{
sigset_t blocked;
siginitset(&current->blocked, mask);
return sigsuspend(&blocked);
}
asmlinkage int compat_sys_sigaction(int sig,
const struct compat_old_sigaction __user *act,
struct compat_old_sigaction __user *oact)
{
struct k_sigaction new_ka, old_ka;
int ret;
compat_old_sigset_t mask;
compat_uptr_t handler, restorer;
if (act) {
if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
__get_user(handler, &act->sa_handler) ||
__get_user(restorer, &act->sa_restorer) ||
__get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
__get_user(mask, &act->sa_mask))
return -EFAULT;
new_ka.sa.sa_handler = compat_ptr(handler);
new_ka.sa.sa_restorer = compat_ptr(restorer);
siginitset(&new_ka.sa.sa_mask, mask);
}
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
if (!ret && oact) {
if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
__put_user(ptr_to_compat(old_ka.sa.sa_handler),
&oact->sa_handler) ||
__put_user(ptr_to_compat(old_ka.sa.sa_restorer),
&oact->sa_restorer) ||
__put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
return -EFAULT;
}
return ret;
}
asmlinkage int compat_sys_rt_sigaction(int sig,
const struct compat_sigaction __user *act,
struct compat_sigaction __user *oact,
compat_size_t sigsetsize)
{
struct k_sigaction new_ka, old_ka;
int ret;
/* XXX: Don't preclude handling different sized sigset_t's. */
if (sigsetsize != sizeof(compat_sigset_t))
return -EINVAL;
if (act) {
compat_uptr_t handler, restorer;
ret = get_user(handler, &act->sa_handler);
new_ka.sa.sa_handler = compat_ptr(handler);
ret |= get_user(restorer, &act->sa_restorer);
new_ka.sa.sa_restorer = compat_ptr(restorer);
ret |= get_sigset_t(&new_ka.sa.sa_mask, &act->sa_mask);
ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
if (ret)
return -EFAULT;
}
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
if (!ret && oact) {
ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler);
ret |= put_sigset_t(&oact->sa_mask, &old_ka.sa.sa_mask);
ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
}
return ret;
}
int compat_do_sigaltstack(compat_uptr_t compat_uss, compat_uptr_t compat_uoss,
compat_ulong_t sp)
{
compat_stack_t __user *newstack = compat_ptr(compat_uss);
compat_stack_t __user *oldstack = compat_ptr(compat_uoss);
compat_uptr_t ss_sp;
int ret;
mm_segment_t old_fs;
stack_t uss, uoss;
/* Marshall the compat new stack into a stack_t */
if (newstack) {
if (get_user(ss_sp, &newstack->ss_sp) ||
__get_user(uss.ss_flags, &newstack->ss_flags) ||
__get_user(uss.ss_size, &newstack->ss_size))
return -EFAULT;
uss.ss_sp = compat_ptr(ss_sp);
}
old_fs = get_fs();
set_fs(KERNEL_DS);
/* The __user pointer casts are valid because of the set_fs() */
ret = do_sigaltstack(
newstack ? (stack_t __user *) &uss : NULL,
oldstack ? (stack_t __user *) &uoss : NULL,
(unsigned long)sp);
set_fs(old_fs);
/* Convert the old stack_t into a compat stack. */
if (!ret && oldstack &&
(put_user(ptr_to_compat(uoss.ss_sp), &oldstack->ss_sp) ||
__put_user(uoss.ss_flags, &oldstack->ss_flags) ||
__put_user(uoss.ss_size, &oldstack->ss_size)))
return -EFAULT;
return ret;
}
static int compat_restore_sigframe(struct pt_regs *regs, static int compat_restore_sigframe(struct pt_regs *regs,
struct compat_sigframe __user *sf) struct compat_sigframe __user *sf)
{ {
@ -562,9 +421,7 @@ asmlinkage int compat_sys_rt_sigreturn(struct pt_regs *regs)
if (compat_restore_sigframe(regs, &frame->sig)) if (compat_restore_sigframe(regs, &frame->sig))
goto badframe; goto badframe;
if (compat_do_sigaltstack(ptr_to_compat(&frame->sig.uc.uc_stack), if (compat_restore_altstack(&frame->sig.uc.uc_stack))
ptr_to_compat((void __user *)NULL),
regs->compat_sp) == -EFAULT)
goto badframe; goto badframe;
return regs->regs[0]; return regs->regs[0];
@ -705,11 +562,7 @@ int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
__put_user_error(0, &frame->sig.uc.uc_flags, err); __put_user_error(0, &frame->sig.uc.uc_flags, err);
__put_user_error(0, &frame->sig.uc.uc_link, err); __put_user_error(0, &frame->sig.uc.uc_link, err);
memset(&stack, 0, sizeof(stack)); err |= __compat_save_altstack(&frame->sig.uc.uc_stack, regs->compat_sp);
stack.ss_sp = (compat_uptr_t)current->sas_ss_sp;
stack.ss_flags = sas_ss_flags(regs->compat_sp);
stack.ss_size = current->sas_ss_size;
err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack));
err |= compat_setup_sigframe(&frame->sig, regs, set); err |= compat_setup_sigframe(&frame->sig, regs, set);
@ -742,75 +595,6 @@ int compat_setup_frame(int usig, struct k_sigaction *ka, sigset_t *set,
return err; return err;
} }
/*
* RT signals don't have generic compat wrappers.
* See arch/powerpc/kernel/signal_32.c
*/
asmlinkage int compat_sys_rt_sigprocmask(int how, compat_sigset_t __user *set,
compat_sigset_t __user *oset,
compat_size_t sigsetsize)
{
sigset_t s;
sigset_t __user *up;
int ret;
mm_segment_t old_fs = get_fs();
if (set) {
if (get_sigset_t(&s, set))
return -EFAULT;
}
set_fs(KERNEL_DS);
/* This is valid because of the set_fs() */
up = (sigset_t __user *) &s;
ret = sys_rt_sigprocmask(how, set ? up : NULL, oset ? up : NULL,
sigsetsize);
set_fs(old_fs);
if (ret)
return ret;
if (oset) {
if (put_sigset_t(oset, &s))
return -EFAULT;
}
return 0;
}
asmlinkage int compat_sys_rt_sigpending(compat_sigset_t __user *set,
compat_size_t sigsetsize)
{
sigset_t s;
int ret;
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);
/* The __user pointer cast is valid because of the set_fs() */
ret = sys_rt_sigpending((sigset_t __user *) &s, sigsetsize);
set_fs(old_fs);
if (!ret) {
if (put_sigset_t(set, &s))
return -EFAULT;
}
return ret;
}
asmlinkage int compat_sys_rt_sigqueueinfo(int pid, int sig,
compat_siginfo_t __user *uinfo)
{
siginfo_t info;
int ret;
mm_segment_t old_fs = get_fs();
ret = copy_siginfo_from_user32(&info, uinfo);
if (unlikely(ret))
return ret;
set_fs (KERNEL_DS);
/* The __user pointer cast is valid because of the set_fs() */
ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *) &info);
set_fs (old_fs);
return ret;
}
void compat_setup_restart_syscall(struct pt_regs *regs) void compat_setup_restart_syscall(struct pt_regs *regs)
{ {
regs->regs[7] = __NR_compat_restart_syscall; regs->regs[7] = __NR_compat_restart_syscall;

View File

@ -40,7 +40,6 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
* Wrappers to pass the pt_regs argument. * Wrappers to pass the pt_regs argument.
*/ */
#define sys_rt_sigreturn sys_rt_sigreturn_wrapper #define sys_rt_sigreturn sys_rt_sigreturn_wrapper
#define sys_sigaltstack sys_sigaltstack_wrapper
#include <asm/syscalls.h> #include <asm/syscalls.h>

View File

@ -39,11 +39,6 @@ compat_sys_rt_sigreturn_wrapper:
b compat_sys_rt_sigreturn b compat_sys_rt_sigreturn
ENDPROC(compat_sys_rt_sigreturn_wrapper) ENDPROC(compat_sys_rt_sigreturn_wrapper)
compat_sys_sigaltstack_wrapper:
ldr x2, [sp, #S_COMPAT_SP]
b compat_do_sigaltstack
ENDPROC(compat_sys_sigaltstack_wrapper)
compat_sys_statfs64_wrapper: compat_sys_statfs64_wrapper:
mov w3, #84 mov w3, #84
cmp w1, #88 cmp w1, #88

View File

@ -23,16 +23,7 @@ typedef struct {
unsigned long sig[_NSIG_WORDS]; unsigned long sig[_NSIG_WORDS];
} sigset_t; } sigset_t;
struct sigaction { #define __ARCH_HAS_SA_RESTORER
__sighandler_t sa_handler;
unsigned long sa_flags;
__sigrestore_t sa_restorer;
sigset_t sa_mask; /* mask last for extensibility */
};
struct k_sigaction {
struct sigaction sa;
};
#include <asm/sigcontext.h> #include <asm/sigcontext.h>
#undef __HAVE_ARCH_SIG_BITOPS #undef __HAVE_ARCH_SIG_BITOPS

View File

@ -37,8 +37,6 @@
#define __ARCH_WANT_SYS_GETPGRP #define __ARCH_WANT_SYS_GETPGRP
#define __ARCH_WANT_SYS_LLSEEK #define __ARCH_WANT_SYS_LLSEEK
#define __ARCH_WANT_SYS_GETPGRP #define __ARCH_WANT_SYS_GETPGRP
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_CLONE

View File

@ -21,12 +21,6 @@
#include <asm/ucontext.h> #include <asm/ucontext.h>
#include <asm/syscalls.h> #include <asm/syscalls.h>
asmlinkage int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
struct pt_regs *regs)
{
return do_sigaltstack(uss, uoss, regs->sp);
}
struct rt_sigframe struct rt_sigframe
{ {
struct siginfo info; struct siginfo info;
@ -91,7 +85,7 @@ asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
goto badframe; goto badframe;
if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT) if (restore_altstack(&frame->uc.uc_stack))
goto badframe; goto badframe;
pr_debug("Context restored: pc = %08lx, lr = %08lx, sp = %08lx\n", pr_debug("Context restored: pc = %08lx, lr = %08lx, sp = %08lx\n",
@ -175,12 +169,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/* Set up the ucontext */ /* Set up the ucontext */
err |= __put_user(0, &frame->uc.uc_flags); err |= __put_user(0, &frame->uc.uc_flags);
err |= __put_user(NULL, &frame->uc.uc_link); err |= __put_user(NULL, &frame->uc.uc_link);
err |= __put_user((void __user *)current->sas_ss_sp, err |= __save_altstack(&frame->uc.uc_stack, regs->sp);
&frame->uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(regs->sp),
&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); err |= setup_sigcontext(&frame->uc.uc_mcontext, regs);
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));

View File

@ -20,12 +20,6 @@ __sys_rt_sigsuspend:
mov r10, sp mov r10, sp
rjmp sys_rt_sigsuspend rjmp sys_rt_sigsuspend
.global __sys_sigaltstack
.type __sys_sigaltstack,@function
__sys_sigaltstack:
mov r10, sp
rjmp sys_sigaltstack
.global __sys_rt_sigreturn .global __sys_rt_sigreturn
.type __sys_rt_sigreturn,@function .type __sys_rt_sigreturn,@function
__sys_rt_sigreturn: __sys_rt_sigreturn:

View File

@ -115,7 +115,7 @@ sys_call_table:
.long sys_statfs .long sys_statfs
.long sys_fstatfs /* 100 */ .long sys_fstatfs /* 100 */
.long sys_vhangup .long sys_vhangup
.long __sys_sigaltstack .long sys_sigaltstack
.long sys_syslog .long sys_syslog
.long sys_setitimer .long sys_setitimer
.long sys_getitimer /* 105 */ .long sys_getitimer /* 105 */

View File

@ -18,8 +18,6 @@
#define __ARCH_WANT_SYS_GETPGRP #define __ARCH_WANT_SYS_GETPGRP
#define __ARCH_WANT_SYS_LLSEEK #define __ARCH_WANT_SYS_LLSEEK
#define __ARCH_WANT_SYS_NICE #define __ARCH_WANT_SYS_NICE
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
/* /*

View File

@ -37,11 +37,6 @@ struct rt_sigframe {
struct ucontext uc; struct ucontext uc;
}; };
asmlinkage int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
{
return do_sigaltstack(uss, uoss, rdusp());
}
static inline int static inline int
rt_restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *pr0) rt_restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *pr0)
{ {
@ -100,7 +95,7 @@ asmlinkage int sys_rt_sigreturn(void)
if (rt_restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0)) if (rt_restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0))
goto badframe; goto badframe;
if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->usp) == -EFAULT) if (restore_altstack(&frame->uc.uc_stack))
goto badframe; goto badframe;
return r0; return r0;
@ -178,10 +173,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t * info,
/* Create the ucontext. */ /* Create the ucontext. */
err |= __put_user(0, &frame->uc.uc_flags); err |= __put_user(0, &frame->uc.uc_flags);
err |= __put_user(0, &frame->uc.uc_link); err |= __put_user(0, &frame->uc.uc_link);
err |= err |= __save_altstack(&frame->uc.uc_stack, rdusp());
__put_user((void *)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(rdusp()), &frame->uc.uc_stack.ss_flags);
err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
err |= rt_setup_sigcontext(&frame->uc.uc_mcontext, regs); err |= rt_setup_sigcontext(&frame->uc.uc_mcontext, regs);
err |= copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); err |= copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));

View File

@ -598,18 +598,6 @@ ENTRY(enable_exception)
NOP 5 NOP 5
ENDPROC(enable_exception) ENDPROC(enable_exception)
ENTRY(sys_sigaltstack)
#ifdef CONFIG_C6X_BIG_KERNEL
MVKL .S1 do_sigaltstack,A0 ; branch to do_sigaltstack
MVKH .S1 do_sigaltstack,A0
B .S2X A0
#else
B .S2 do_sigaltstack
#endif
LDW .D2T1 *+SP(REGS_SP+8),A6
NOP 4
ENDPROC(sys_sigaltstack)
;; ;;
;; Special system calls ;; Special system calls
;; return address is in B3 ;; return address is in B3

View File

@ -50,6 +50,8 @@ config CRIS
select GENERIC_CMOS_UPDATE select GENERIC_CMOS_UPDATE
select MODULES_USE_ELF_RELA select MODULES_USE_ELF_RELA
select CLONE_BACKWARDS2 select CLONE_BACKWARDS2
select OLD_SIGSUSPEND
select OLD_SIGACTION
config HZ config HZ
int int

View File

@ -41,55 +41,6 @@
void do_signal(int canrestart, struct pt_regs *regs); void do_signal(int canrestart, struct pt_regs *regs);
/*
* Atomically swap in the new signal mask, and wait for a signal. Define
* dummy arguments to be able to reach the regs argument. (Note that this
* arrangement relies on old_sigset_t occupying one register.)
*/
int sys_sigsuspend(old_sigset_t mask)
{
sigset_t blocked;
siginitset(&blocked, mask);
return sigsuspend(&blocked);
}
int sys_sigaction(int sig, const struct old_sigaction __user *act,
struct old_sigaction *oact)
{
struct k_sigaction new_ka, old_ka;
int ret;
if (act) {
old_sigset_t mask;
if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
__get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
__get_user(new_ka.sa.sa_restorer, &act->sa_restorer) ||
__get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
__get_user(mask, &act->sa_mask))
return -EFAULT;
siginitset(&new_ka.sa.sa_mask, mask);
}
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
if (!ret && oact) {
if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
__put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
__put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) ||
__put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
return -EFAULT;
}
return ret;
}
int sys_sigaltstack(const stack_t *uss, stack_t __user *uoss)
{
return do_sigaltstack(uss, uoss, rdusp());
}
/* /*
* Do a signal return; undo the signal stack. * Do a signal return; undo the signal stack.
*/ */
@ -150,11 +101,9 @@ badframe:
return 1; return 1;
} }
/* Define dummy arguments to be able to reach the regs argument. */ asmlinkage int sys_sigreturn(void)
asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
long srp, struct pt_regs *regs)
{ {
struct pt_regs *regs = current_pt_regs();
struct sigframe __user *frame = (struct sigframe *)rdusp(); struct sigframe __user *frame = (struct sigframe *)rdusp();
sigset_t set; sigset_t set;
@ -188,11 +137,9 @@ badframe:
return 0; return 0;
} }
/* Define dummy arguments to be able to reach the regs argument. */ asmlinkage int sys_rt_sigreturn(void)
asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
long mof, long srp, struct pt_regs *regs)
{ {
struct pt_regs *regs = current_pt_regs();
struct rt_sigframe __user *frame = (struct rt_sigframe *)rdusp(); struct rt_sigframe __user *frame = (struct rt_sigframe *)rdusp();
sigset_t set; sigset_t set;
@ -214,7 +161,7 @@ asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
goto badframe; goto badframe;
if (do_sigaltstack(&frame->uc.uc_stack, NULL, rdusp()) == -EFAULT) if (restore_altstack(&frame->uc.uc_stack))
goto badframe; goto badframe;
return regs->r10; return regs->r10;
@ -362,6 +309,8 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
err |= __save_altstack(&frame->uc.uc_stack, rdusp());
if (err) if (err)
goto give_sigsegv; goto give_sigsegv;

View File

@ -51,59 +51,6 @@ struct rt_signal_frame {
void do_signal(int restart, struct pt_regs *regs); void do_signal(int restart, struct pt_regs *regs);
void keep_debug_flags(unsigned long oldccs, unsigned long oldspc, void keep_debug_flags(unsigned long oldccs, unsigned long oldspc,
struct pt_regs *regs); struct pt_regs *regs);
/*
* Swap in the new signal mask, and wait for a signal. Define some
* dummy arguments to be able to reach the regs argument.
*/
int
sys_sigsuspend(old_sigset_t mask)
{
sigset_t blocked;
siginitset(&blocked, mask);
return sigsuspend(&blocked);
}
int
sys_sigaction(int signal, const struct old_sigaction *act,
struct old_sigaction *oact)
{
int retval;
struct k_sigaction newk;
struct k_sigaction oldk;
if (act) {
old_sigset_t mask;
if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
__get_user(newk.sa.sa_handler, &act->sa_handler) ||
__get_user(newk.sa.sa_restorer, &act->sa_restorer) ||
__get_user(newk.sa.sa_flags, &act->sa_flags) ||
__get_user(mask, &act->sa_mask))
return -EFAULT;
siginitset(&newk.sa.sa_mask, mask);
}
retval = do_sigaction(signal, act ? &newk : NULL, oact ? &oldk : NULL);
if (!retval && oact) {
if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
__put_user(oldk.sa.sa_handler, &oact->sa_handler) ||
__put_user(oldk.sa.sa_restorer, &oact->sa_restorer) ||
__put_user(oldk.sa.sa_flags, &oact->sa_flags) ||
__put_user(oldk.sa.sa_mask.sig[0], &oact->sa_mask))
return -EFAULT;
}
return retval;
}
int
sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
{
return do_sigaltstack(uss, uoss, rdusp());
}
static int static int
restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
@ -135,11 +82,9 @@ badframe:
return 1; return 1;
} }
/* Define some dummy arguments to be able to reach the regs argument. */ asmlinkage int sys_sigreturn(void)
asmlinkage int
sys_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp,
struct pt_regs *regs)
{ {
struct pt_regs *regs = current_pt_regs();
sigset_t set; sigset_t set;
struct signal_frame __user *frame; struct signal_frame __user *frame;
unsigned long oldspc = regs->spc; unsigned long oldspc = regs->spc;
@ -178,11 +123,9 @@ badframe:
return 0; return 0;
} }
/* Define some dummy variables to be able to reach the regs argument. */ asmlinkage int sys_rt_sigreturn(void)
asmlinkage int
sys_rt_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp,
struct pt_regs *regs)
{ {
struct pt_regs *regs = current_pt_regs();
sigset_t set; sigset_t set;
struct rt_signal_frame __user *frame; struct rt_signal_frame __user *frame;
unsigned long oldspc = regs->spc; unsigned long oldspc = regs->spc;
@ -209,7 +152,7 @@ sys_rt_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp,
if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
goto badframe; goto badframe;
if (do_sigaltstack(&frame->uc.uc_stack, NULL, rdusp()) == -EFAULT) if (restore_altstack(&frame->uc.uc_stack))
goto badframe; goto badframe;
keep_debug_flags(oldccs, oldspc, regs); keep_debug_flags(oldccs, oldspc, regs);
@ -371,6 +314,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext)); err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]); err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
err |= __save_altstack(&frame->uc.uc_stack, rdusp());
if (err) if (err)
goto give_sigsegv; goto give_sigsegv;

View File

@ -16,23 +16,8 @@ typedef struct {
unsigned long sig[_NSIG_WORDS]; unsigned long sig[_NSIG_WORDS];
} sigset_t; } sigset_t;
struct old_sigaction { #define __ARCH_HAS_SA_RESTORER
__sighandler_t sa_handler;
old_sigset_t sa_mask;
unsigned long sa_flags;
void (*sa_restorer)(void);
};
struct sigaction {
__sighandler_t sa_handler;
unsigned long sa_flags;
void (*sa_restorer)(void);
sigset_t sa_mask; /* mask last for extensibility */
};
struct k_sigaction {
struct sigaction sa;
};
#include <asm/sigcontext.h> #include <asm/sigcontext.h>
#endif #endif

View File

@ -30,8 +30,6 @@
#define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_CLONE

View File

@ -11,6 +11,8 @@ config FRV
select ARCH_HAVE_NMI_SAFE_CMPXCHG select ARCH_HAVE_NMI_SAFE_CMPXCHG
select GENERIC_CPU_DEVICES select GENERIC_CPU_DEVICES
select ARCH_WANT_IPC_PARSE_VERSION select ARCH_WANT_IPC_PARSE_VERSION
select OLD_SIGSUSPEND3
select OLD_SIGACTION
config ZONE_DMA config ZONE_DMA
bool bool

View File

@ -3,11 +3,4 @@
#include <uapi/asm/signal.h> #include <uapi/asm/signal.h>
struct old_sigaction {
__sighandler_t sa_handler;
old_sigset_t sa_mask;
unsigned long sa_flags;
__sigrestore_t sa_restorer;
};
#endif /* _ASM_SIGNAL_H */ #endif /* _ASM_SIGNAL_H */

View File

@ -27,8 +27,6 @@
#define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_OLDUMOUNT
/* #define __ARCH_WANT_SYS_SIGPENDING */ /* #define __ARCH_WANT_SYS_SIGPENDING */
#define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_CLONE

View File

@ -32,55 +32,6 @@ struct fdpic_func_descriptor {
unsigned long GOT; unsigned long GOT;
}; };
/*
* Atomically swap in the new signal mask, and wait for a signal.
*/
asmlinkage int sys_sigsuspend(int history0, int history1, old_sigset_t mask)
{
sigset_t blocked;
siginitset(&blocked, mask);
return sigsuspend(&blocked);
}
asmlinkage int sys_sigaction(int sig,
const struct old_sigaction __user *act,
struct old_sigaction __user *oact)
{
struct k_sigaction new_ka, old_ka;
int ret;
if (act) {
old_sigset_t mask;
if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
__get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
__get_user(new_ka.sa.sa_restorer, &act->sa_restorer) ||
__get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
__get_user(mask, &act->sa_mask))
return -EFAULT;
siginitset(&new_ka.sa.sa_mask, mask);
}
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
if (!ret && oact) {
if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
__put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
__put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) ||
__put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
return -EFAULT;
}
return ret;
}
asmlinkage
int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
{
return do_sigaltstack(uss, uoss, __frame->sp);
}
/* /*
* Do a signal return; undo the signal stack. * Do a signal return; undo the signal stack.
*/ */
@ -173,7 +124,7 @@ asmlinkage int sys_rt_sigreturn(void)
if (restore_sigcontext(&frame->uc.uc_mcontext, &gr8)) if (restore_sigcontext(&frame->uc.uc_mcontext, &gr8))
goto badframe; goto badframe;
if (do_sigaltstack(&frame->uc.uc_stack, NULL, __frame->sp) == -EFAULT) if (restore_altstack(&frame->uc.uc_stack))
goto badframe; goto badframe;
return gr8; return gr8;
@ -345,9 +296,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/* Create the ucontext. */ /* Create the ucontext. */
if (__put_user(0, &frame->uc.uc_flags) || if (__put_user(0, &frame->uc.uc_flags) ||
__put_user(NULL, &frame->uc.uc_link) || __put_user(NULL, &frame->uc.uc_link) ||
__put_user((void __user *)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp) || __save_altstack(&frame->uc.uc_stack, __frame->sp))
__put_user(sas_ss_flags(__frame->sp), &frame->uc.uc_stack.ss_flags) ||
__put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size))
goto give_sigsegv; goto give_sigsegv;
if (setup_sigcontext(&frame->uc.uc_mcontext, set->sig[0])) if (setup_sigcontext(&frame->uc.uc_mcontext, set->sig[0]))

View File

@ -9,6 +9,8 @@ config H8300
select GENERIC_IRQ_SHOW select GENERIC_IRQ_SHOW
select GENERIC_CPU_DEVICES select GENERIC_CPU_DEVICES
select MODULES_USE_ELF_RELA select MODULES_USE_ELF_RELA
select OLD_SIGSUSPEND3
select OLD_SIGACTION
config SYMBOL_PREFIX config SYMBOL_PREFIX
string string

View File

@ -16,23 +16,7 @@ typedef struct {
unsigned long sig[_NSIG_WORDS]; unsigned long sig[_NSIG_WORDS];
} sigset_t; } sigset_t;
struct old_sigaction { #define __ARCH_HAS_SA_RESTORER
__sighandler_t sa_handler;
old_sigset_t sa_mask;
unsigned long sa_flags;
void (*sa_restorer)(void);
};
struct sigaction {
__sighandler_t sa_handler;
unsigned long sa_flags;
void (*sa_restorer)(void);
sigset_t sa_mask; /* mask last for extensibility */
};
struct k_sigaction {
struct sigaction sa;
};
#include <asm/sigcontext.h> #include <asm/sigcontext.h>
#undef __HAVE_ARCH_SIG_BITOPS #undef __HAVE_ARCH_SIG_BITOPS

View File

@ -29,8 +29,6 @@
#define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_CLONE

View File

@ -46,56 +46,6 @@
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/ucontext.h> #include <asm/ucontext.h>
/*
* Atomically swap in the new signal mask, and wait for a signal.
*/
asmlinkage int
sys_sigsuspend(int unused1, int unused2, old_sigset_t mask)
{
sigset_t blocked;
siginitset(&blocked, mask);
return sigsuspend(&blocked);
}
asmlinkage int
sys_sigaction(int sig, const struct old_sigaction *act,
struct old_sigaction *oact)
{
struct k_sigaction new_ka, old_ka;
int ret;
if (act) {
old_sigset_t mask;
if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
__get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
__get_user(new_ka.sa.sa_restorer, &act->sa_restorer) ||
__get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
__get_user(mask, &act->sa_mask))
return -EFAULT;
siginitset(&new_ka.sa.sa_mask, mask);
}
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
if (!ret && oact) {
if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
__put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
__put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) ||
__put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
return -EFAULT;
}
return ret;
}
asmlinkage int
sys_sigaltstack(const stack_t *uss, stack_t *uoss)
{
return do_sigaltstack(uss, uoss, rdusp());
}
/* /*
* Do a signal return; undo the signal stack. * Do a signal return; undo the signal stack.
* *
@ -136,9 +86,9 @@ struct rt_sigframe
} __attribute__((aligned(2),packed)); } __attribute__((aligned(2),packed));
static inline int static inline int
restore_sigcontext(struct pt_regs *regs, struct sigcontext *usc, restore_sigcontext(struct sigcontext *usc, int *pd0)
int *pd0)
{ {
struct pt_regs *regs = current_pt_regs();
int err = 0; int err = 0;
unsigned int ccr; unsigned int ccr;
unsigned int usp; unsigned int usp;
@ -167,9 +117,8 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *usc,
return err; return err;
} }
asmlinkage int do_sigreturn(unsigned long __unused,...) asmlinkage int sys_sigreturn(void)
{ {
struct pt_regs *regs = (struct pt_regs *) (&__unused - 1);
unsigned long usp = rdusp(); unsigned long usp = rdusp();
struct sigframe *frame = (struct sigframe *)(usp - 4); struct sigframe *frame = (struct sigframe *)(usp - 4);
sigset_t set; sigset_t set;
@ -185,7 +134,7 @@ asmlinkage int do_sigreturn(unsigned long __unused,...)
set_current_blocked(&set); set_current_blocked(&set);
if (restore_sigcontext(regs, &frame->sc, &er0)) if (restore_sigcontext(&frame->sc, &er0))
goto badframe; goto badframe;
return er0; return er0;
@ -194,9 +143,8 @@ badframe:
return 0; return 0;
} }
asmlinkage int do_rt_sigreturn(unsigned long __unused,...) asmlinkage int sys_rt_sigreturn(void)
{ {
struct pt_regs *regs = (struct pt_regs *) &__unused;
unsigned long usp = rdusp(); unsigned long usp = rdusp();
struct rt_sigframe *frame = (struct rt_sigframe *)(usp - 4); struct rt_sigframe *frame = (struct rt_sigframe *)(usp - 4);
sigset_t set; sigset_t set;
@ -209,10 +157,10 @@ asmlinkage int do_rt_sigreturn(unsigned long __unused,...)
set_current_blocked(&set); set_current_blocked(&set);
if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &er0)) if (restore_sigcontext(&frame->uc.uc_mcontext, &er0))
goto badframe; goto badframe;
if (do_sigaltstack(&frame->uc.uc_stack, NULL, usp) == -EFAULT) if (restore_altstack(&frame->uc.uc_stack))
goto badframe; goto badframe;
return er0; return er0;
@ -358,11 +306,7 @@ static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
/* Create the ucontext. */ /* Create the ucontext. */
err |= __put_user(0, &frame->uc.uc_flags); err |= __put_user(0, &frame->uc.uc_flags);
err |= __put_user(0, &frame->uc.uc_link); err |= __put_user(0, &frame->uc.uc_link);
err |= __put_user((void *)current->sas_ss_sp, err |= __save_altstack(&frame->uc.uc_stack, rdusp());
&frame->uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(rdusp()),
&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, set->sig[0]); err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set)); err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set));
if (err) if (err)

View File

@ -334,18 +334,3 @@ SYMBOL_NAME_LABEL(sys_call_table)
.long SYMBOL_NAME(sys_getcpu) .long SYMBOL_NAME(sys_getcpu)
.long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_pwait */ .long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_pwait */
.long SYMBOL_NAME(sys_setns) /* 320 */ .long SYMBOL_NAME(sys_setns) /* 320 */
.macro call_sp addr
mov.l #SYMBOL_NAME(\addr),er6
bra SYMBOL_NAME(syscall_trampoline):8
.endm
SYMBOL_NAME_LABEL(sys_sigreturn)
call_sp do_sigreturn
SYMBOL_NAME_LABEL(sys_rt_sigreturn)
call_sp do_rt_sigreturn
SYMBOL_NAME_LABEL(syscall_trampoline)
mov.l sp,er0
jmp @er6

View File

@ -125,6 +125,7 @@ static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info,
err |= __put_user(0x5400c004, &frame->tramp[1]); err |= __put_user(0x5400c004, &frame->tramp[1]);
err |= setup_sigcontext(regs, &frame->uc.uc_mcontext); err |= setup_sigcontext(regs, &frame->uc.uc_mcontext);
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
err |= __save_altstack(&frame->uc.uc_stack, user_stack_pointer(regs));
if (err) if (err)
goto sigsegv; goto sigsegv;
@ -247,12 +248,6 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
/* /*
* Architecture-specific wrappers for signal-related system calls * Architecture-specific wrappers for signal-related system calls
*/ */
asmlinkage int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
{
struct pt_regs *regs = current_pt_regs();
return do_sigaltstack(uss, uoss, regs->r29);
}
asmlinkage int sys_rt_sigreturn(void) asmlinkage int sys_rt_sigreturn(void)
{ {
@ -288,14 +283,7 @@ asmlinkage int sys_rt_sigreturn(void)
*/ */
regs->syscall_nr = __NR_rt_sigreturn; regs->syscall_nr = __NR_rt_sigreturn;
/* if (restore_altstack(&frame->uc.uc_stack))
* If we were meticulous, we'd only call this if we knew that
* we were actually going to use an alternate stack, and we'd
* consider any error to be fatal. What we do here, in common
* with many other architectures, is call it blindly and only
* consider the -EFAULT return case to be proof of a problem.
*/
if (do_sigaltstack(&frame->uc.uc_stack, NULL, pt_psp(regs)) == -EFAULT)
goto badframe; goto badframe;
return 0; return 0;

View File

@ -26,16 +26,6 @@ typedef struct {
unsigned long sig[_NSIG_WORDS]; unsigned long sig[_NSIG_WORDS];
} sigset_t; } sigset_t;
struct sigaction {
__sighandler_t sa_handler;
unsigned long sa_flags;
sigset_t sa_mask; /* mask last for extensibility */
};
struct k_sigaction {
struct sigaction sa;
};
# include <asm/sigcontext.h> # include <asm/sigcontext.h>
# endif /* !__ASSEMBLY__ */ # endif /* !__ASSEMBLY__ */

View File

@ -27,9 +27,6 @@
#define __IGNORE_vfork /* clone() */ #define __IGNORE_vfork /* clone() */
#define __IGNORE_umount2 /* umount() */ #define __IGNORE_umount2 /* umount() */
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#if !defined(__ASSEMBLY__) && !defined(ASSEMBLER) #if !defined(__ASSEMBLY__) && !defined(ASSEMBLER)
#include <linux/types.h> #include <linux/types.h>
@ -47,12 +44,7 @@ asmlinkage unsigned long sys_mmap2(
int prot, int flags, int prot, int flags,
int fd, long pgoff); int fd, long pgoff);
struct pt_regs; struct pt_regs;
struct sigaction;
asmlinkage long sys_ia64_pipe(void); asmlinkage long sys_ia64_pipe(void);
asmlinkage long sys_rt_sigaction(int sig,
const struct sigaction __user *act,
struct sigaction __user *oact,
size_t sigsetsize);
/* /*
* "Conditional" syscalls * "Conditional" syscalls

View File

@ -39,14 +39,6 @@
# define GET_SIGSET(k,u) __get_user((k)->sig[0], &(u)->sig[0]) # define GET_SIGSET(k,u) __get_user((k)->sig[0], &(u)->sig[0])
#endif #endif
asmlinkage long
sys_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, long arg2,
long arg3, long arg4, long arg5, long arg6, long arg7,
struct pt_regs regs)
{
return do_sigaltstack(uss, uoss, regs.r12);
}
static long static long
restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr) restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
{ {
@ -208,11 +200,8 @@ ia64_rt_sigreturn (struct sigscratch *scr)
printk("SIG return (%s:%d): sp=%lx ip=%lx\n", printk("SIG return (%s:%d): sp=%lx ip=%lx\n",
current->comm, current->pid, scr->pt.r12, scr->pt.cr_iip); current->comm, current->pid, scr->pt.r12, scr->pt.cr_iip);
#endif #endif
/* if (restore_altstack(&sc->sc_stack))
* It is more difficult to avoid calling this function than to goto give_sigsegv;
* call it and ignore errors.
*/
do_sigaltstack(&sc->sc_stack, NULL, scr->pt.r12);
return retval; return retval;
give_sigsegv: give_sigsegv:
@ -376,9 +365,7 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set,
err |= copy_siginfo_to_user(&frame->info, info); err |= copy_siginfo_to_user(&frame->info, info);
err |= __put_user(current->sas_ss_sp, &frame->sc.sc_stack.ss_sp); err |= __save_altstack(&frame->sc.sc_stack, scr->pt.r12);
err |= __put_user(current->sas_ss_size, &frame->sc.sc_stack.ss_size);
err |= __put_user(sas_ss_flags(scr->pt.r12), &frame->sc.sc_stack.ss_flags);
err |= setup_sigcontext(&frame->sc, set, scr); err |= setup_sigcontext(&frame->sc, set, scr);
if (unlikely(err)) if (unlikely(err))

View File

@ -16,16 +16,7 @@ typedef struct {
unsigned long sig[_NSIG_WORDS]; unsigned long sig[_NSIG_WORDS];
} sigset_t; } sigset_t;
struct sigaction { #define __ARCH_HAS_SA_RESTORER
__sighandler_t sa_handler;
unsigned long sa_flags;
__sigrestore_t sa_restorer;
sigset_t sa_mask; /* mask last for extensibility */
};
struct k_sigaction {
struct sigaction sa;
};
#include <asm/sigcontext.h> #include <asm/sigcontext.h>
#undef __HAVE_ARCH_SIG_BITOPS #undef __HAVE_ARCH_SIG_BITOPS

View File

@ -20,8 +20,6 @@
#define __ARCH_WANT_SYS_LLSEEK #define __ARCH_WANT_SYS_LLSEEK
#define __ARCH_WANT_SYS_OLD_GETRLIMIT /*will be unused*/ #define __ARCH_WANT_SYS_OLD_GETRLIMIT /*will be unused*/
#define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_CLONE
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK

View File

@ -27,15 +27,6 @@
#define DEBUG_SIG 0 #define DEBUG_SIG 0
asmlinkage int
sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
unsigned long r2, unsigned long r3, unsigned long r4,
unsigned long r5, unsigned long r6, struct pt_regs *regs)
{
return do_sigaltstack(uss, uoss, regs->spu);
}
/* /*
* Do a signal return; undo the signal stack. * Do a signal return; undo the signal stack.
*/ */
@ -113,7 +104,7 @@ sys_rt_sigreturn(unsigned long r0, unsigned long r1,
if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &result)) if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &result))
goto badframe; goto badframe;
if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->spu) == -EFAULT) if (restore_altstack(&frame->uc.uc_stack))
goto badframe; goto badframe;
return result; return result;
@ -213,10 +204,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/* Create the ucontext. */ /* Create the ucontext. */
err |= __put_user(0, &frame->uc.uc_flags); err |= __put_user(0, &frame->uc.uc_flags);
err |= __put_user(0, &frame->uc.uc_link); err |= __put_user(0, &frame->uc.uc_link);
err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); err |= __save_altstack(&frame->uc.uc_stack, regs->spu);
err |= __put_user(sas_ss_flags(regs->spu),
&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, set->sig[0]); err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
if (err) if (err)

View File

@ -18,6 +18,8 @@ config M68K
select HAVE_MOD_ARCH_SPECIFIC select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_REL select MODULES_USE_ELF_REL
select MODULES_USE_ELF_RELA select MODULES_USE_ELF_RELA
select OLD_SIGSUSPEND3
select OLD_SIGACTION
config RWSEM_GENERIC_SPINLOCK config RWSEM_GENERIC_SPINLOCK
bool bool

View File

@ -16,23 +16,8 @@ typedef struct {
unsigned long sig[_NSIG_WORDS]; unsigned long sig[_NSIG_WORDS];
} sigset_t; } sigset_t;
struct old_sigaction { #define __ARCH_HAS_SA_RESTORER
__sighandler_t sa_handler;
old_sigset_t sa_mask;
unsigned long sa_flags;
__sigrestore_t sa_restorer;
};
struct sigaction {
__sighandler_t sa_handler;
unsigned long sa_flags;
__sigrestore_t sa_restorer;
sigset_t sa_mask; /* mask last for extensibility */
};
struct k_sigaction {
struct sigaction sa;
};
#include <asm/sigcontext.h> #include <asm/sigcontext.h>
#ifndef CONFIG_CPU_HAS_NO_BITFIELDS #ifndef CONFIG_CPU_HAS_NO_BITFIELDS

View File

@ -29,8 +29,6 @@
#define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK

View File

@ -224,56 +224,6 @@ static inline void push_cache(unsigned long vaddr)
#endif /* CONFIG_MMU */ #endif /* CONFIG_MMU */
/*
* Atomically swap in the new signal mask, and wait for a signal.
*/
asmlinkage int
sys_sigsuspend(int unused0, int unused1, old_sigset_t mask)
{
sigset_t blocked;
siginitset(&blocked, mask);
return sigsuspend(&blocked);
}
asmlinkage int
sys_sigaction(int sig, const struct old_sigaction __user *act,
struct old_sigaction __user *oact)
{
struct k_sigaction new_ka, old_ka;
int ret;
if (act) {
old_sigset_t mask;
if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
__get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
__get_user(new_ka.sa.sa_restorer, &act->sa_restorer) ||
__get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
__get_user(mask, &act->sa_mask))
return -EFAULT;
siginitset(&new_ka.sa.sa_mask, mask);
}
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
if (!ret && oact) {
if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
__put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
__put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) ||
__put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
return -EFAULT;
}
return ret;
}
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. * Do a signal return; undo the signal stack.
* *
@ -765,8 +715,9 @@ rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
err |= __get_user(temp, &uc->uc_formatvec); err |= __get_user(temp, &uc->uc_formatvec);
err |= rt_restore_fpu_state(uc); err |= rt_restore_fpu_state(uc);
err |= restore_altstack(&uc->uc_stack);
if (err || do_sigaltstack(&uc->uc_stack, NULL, usp) == -EFAULT) if (err)
goto badframe; goto badframe;
if (mangle_kernel_stack(regs, temp, &uc->uc_extra)) if (mangle_kernel_stack(regs, temp, &uc->uc_extra))
@ -1014,11 +965,7 @@ static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
/* Create the ucontext. */ /* Create the ucontext. */
err |= __put_user(0, &frame->uc.uc_flags); err |= __put_user(0, &frame->uc.uc_flags);
err |= __put_user(NULL, &frame->uc.uc_link); err |= __put_user(NULL, &frame->uc.uc_link);
err |= __put_user((void __user *)current->sas_ss_sp, err |= __save_altstack(&frame->uc.uc_stack, rdusp());
&frame->uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(rdusp()),
&frame->uc.uc_stack.ss_flags);
err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
err |= rt_setup_ucontext(&frame->uc, regs); err |= rt_setup_ucontext(&frame->uc, regs);
err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set)); err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set));

View File

@ -33,8 +33,6 @@
#define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_CLONE
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK

View File

@ -124,6 +124,7 @@ ret_from_intr:
lwi r11, r1, PT_MODE lwi r11, r1, PT_MODE
bneid r11, no_intr_resched bneid r11, no_intr_resched
3:
lwi r6, r31, TS_THREAD_INFO /* get thread info */ lwi r6, r31, TS_THREAD_INFO /* get thread info */
lwi r19, r6, TI_FLAGS /* get flags in thread info */ lwi r19, r6, TI_FLAGS /* get flags in thread info */
/* do an extra work if any bits are set */ /* do an extra work if any bits are set */
@ -132,11 +133,13 @@ ret_from_intr:
beqi r11, 1f beqi r11, 1f
bralid r15, schedule bralid r15, schedule
nop nop
bri 3b
1: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME 1: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME
beqid r11, no_intr_resched beqid r11, no_intr_resched
addk r5, r1, r0 addk r5, r1, r0
bralid r15, do_notify_resume bralid r15, do_notify_resume
addk r6, r0, r0 addk r6, r0, r0
bri 3b
no_intr_resched: no_intr_resched:
/* Disable interrupts, we are now committed to the state restore */ /* Disable interrupts, we are now committed to the state restore */
@ -280,6 +283,7 @@ ENTRY(_user_exception)
/* Figure out which function to use for this system call. */ /* Figure out which function to use for this system call. */
/* Note Microblaze barrel shift is optional, so don't rely on it */ /* Note Microblaze barrel shift is optional, so don't rely on it */
add r12, r12, r12 /* convert num -> ptr */ add r12, r12, r12 /* convert num -> ptr */
addik r30, r0, 1 /* restarts allowed */
add r12, r12, r12 add r12, r12, r12
lwi r12, r12, sys_call_table /* Get function pointer */ lwi r12, r12, sys_call_table /* Get function pointer */
addik r15, r0, ret_to_user-8 /* set return address */ addik r15, r0, ret_to_user-8 /* set return address */
@ -369,6 +373,7 @@ ENTRY(_debug_exception)
bralid r15, send_sig bralid r15, send_sig
add r7, r0, r0 /* 3rd param zero */ add r7, r0, r0 /* 3rd param zero */
addik r30, r0, 1 /* restarts allowed ??? */
/* Restore r3/r4 to work around how ret_to_user works */ /* Restore r3/r4 to work around how ret_to_user works */
lwi r3, r1, PT_R3 lwi r3, r1, PT_R3
lwi r4, r1, PT_R4 lwi r4, r1, PT_R4
@ -482,18 +487,26 @@ ENTRY(ret_from_kernel_thread)
addk r3, r0, r0 addk r3, r0, r0
work_pending: work_pending:
lwi r11, r1, PT_MODE
bneid r11, 2f
3:
enable_irq enable_irq
andi r11, r19, _TIF_NEED_RESCHED andi r11, r19, _TIF_NEED_RESCHED
beqi r11, 1f beqi r11, 1f
bralid r15, schedule bralid r15, schedule
nop nop
bri 4f
1: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME 1: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME
beqi r11, no_work_pending beqi r11, no_work_pending
addk r5, r1, r0 addk r5, r30, r0
bralid r15, do_notify_resume bralid r15, do_notify_resume
addik r6, r0, 1 addik r6, r0, 1
bri no_work_pending addk r30, r0, r0 /* no restarts from now on */
4:
disable_irq
lwi r6, r31, TS_THREAD_INFO /* get thread info */
lwi r19, r6, TI_FLAGS /* get flags in thread info */
bri 3b
ENTRY(ret_to_user) ENTRY(ret_to_user)
disable_irq disable_irq
@ -507,6 +520,7 @@ ENTRY(ret_to_user)
no_work_pending: no_work_pending:
disable_irq disable_irq
2:
/* save r31 */ /* save r31 */
swi r31, r0, PER_CPU(CURRENT_SAVE) swi r31, r0, PER_CPU(CURRENT_SAVE)
/* save mode indicator */ /* save mode indicator */
@ -559,6 +573,7 @@ no_work_pending:
nop nop
sys_rt_sigreturn_wrapper: sys_rt_sigreturn_wrapper:
addk r30, r0, r0 /* no restarts for this one */
brid sys_rt_sigreturn brid sys_rt_sigreturn
addk r5, r1, r0 addk r5, r1, r0

View File

@ -354,6 +354,7 @@ C_ENTRY(_user_exception):
/* Note Microblaze barrel shift is optional, so don't rely on it */ /* Note Microblaze barrel shift is optional, so don't rely on it */
add r12, r12, r12; /* convert num -> ptr */ add r12, r12, r12; /* convert num -> ptr */
add r12, r12, r12; add r12, r12, r12;
addi r30, r0, 1 /* restarts allowed */
#ifdef DEBUG #ifdef DEBUG
/* Trac syscalls and stored them to syscall_debug_table */ /* Trac syscalls and stored them to syscall_debug_table */
@ -401,26 +402,27 @@ C_ENTRY(ret_from_trap):
* trigger rescheduling. */ * trigger rescheduling. */
/* get thread info from current task */ /* get thread info from current task */
lwi r11, CURRENT_TASK, TS_THREAD_INFO; lwi r11, CURRENT_TASK, TS_THREAD_INFO;
lwi r11, r11, TI_FLAGS; /* get flags in thread info */ lwi r19, r11, TI_FLAGS; /* get flags in thread info */
andi r11, r11, _TIF_NEED_RESCHED; andi r11, r19, _TIF_NEED_RESCHED;
beqi r11, 5f; beqi r11, 5f;
bralid r15, schedule; /* Call scheduler */ bralid r15, schedule; /* Call scheduler */
nop; /* delay slot */ nop; /* delay slot */
bri 1b
/* Maybe handle a signal */ /* Maybe handle a signal */
5: /* get thread info from current task*/ 5:
lwi r11, CURRENT_TASK, TS_THREAD_INFO; andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
lwi r11, r11, TI_FLAGS; /* get flags in thread info */ beqi r11, 4f; /* Signals to handle, handle them */
andi r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
beqi r11, 1f; /* Signals to handle, handle them */
addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */
bralid r15, do_notify_resume; /* Handle any signals */ bralid r15, do_notify_resume; /* Handle any signals */
addi r6, r0, 1; /* Arg 2: int in_syscall */ add r6, r30, r0; /* Arg 2: int in_syscall */
add r30, r0, r0 /* no more restarts */
bri 1b
/* Finally, return to user state. */ /* Finally, return to user state. */
1: set_bip; /* Ints masked for state restore */ 4: set_bip; /* Ints masked for state restore */
swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */
VM_OFF; VM_OFF;
tophys(r1,r1); tophys(r1,r1);
@ -464,6 +466,7 @@ C_ENTRY(ret_from_kernel_thread):
add r3, r0, r0 add r3, r0, r0
C_ENTRY(sys_rt_sigreturn_wrapper): C_ENTRY(sys_rt_sigreturn_wrapper):
addik r30, r0, 0 /* no restarts */
brid sys_rt_sigreturn /* Do real work */ brid sys_rt_sigreturn /* Do real work */
addik r5, r1, 0; /* add user context as 1st arg */ addik r5, r1, 0; /* add user context as 1st arg */
@ -571,20 +574,20 @@ C_ENTRY(ret_from_exc):
/* We're returning to user mode, so check for various conditions that /* We're returning to user mode, so check for various conditions that
trigger rescheduling. */ trigger rescheduling. */
1:
lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */
lwi r11, r11, TI_FLAGS; /* get flags in thread info */ lwi r19, r11, TI_FLAGS; /* get flags in thread info */
andi r11, r11, _TIF_NEED_RESCHED; andi r11, r19, _TIF_NEED_RESCHED;
beqi r11, 5f; beqi r11, 5f;
/* Call the scheduler before returning from a syscall/trap. */ /* Call the scheduler before returning from a syscall/trap. */
bralid r15, schedule; /* Call scheduler */ bralid r15, schedule; /* Call scheduler */
nop; /* delay slot */ nop; /* delay slot */
bri 1b
/* Maybe handle a signal */ /* Maybe handle a signal */
5: lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ 5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
lwi r11, r11, TI_FLAGS; /* get flags in thread info */ beqi r11, 4f; /* Signals to handle, handle them */
andi r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
beqi r11, 1f; /* Signals to handle, handle them */
/* /*
* Handle a signal return; Pending signals should be in r18. * Handle a signal return; Pending signals should be in r18.
@ -600,9 +603,10 @@ C_ENTRY(ret_from_exc):
addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */
bralid r15, do_notify_resume; /* Handle any signals */ bralid r15, do_notify_resume; /* Handle any signals */
addi r6, r0, 0; /* Arg 2: int in_syscall */ addi r6, r0, 0; /* Arg 2: int in_syscall */
bri 1b
/* Finally, return to user state. */ /* Finally, return to user state. */
1: set_bip; /* Ints masked for state restore */ 4: set_bip; /* Ints masked for state restore */
swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */
VM_OFF; VM_OFF;
tophys(r1,r1); tophys(r1,r1);
@ -682,22 +686,23 @@ ret_from_irq:
lwi r11, r1, PT_MODE; lwi r11, r1, PT_MODE;
bnei r11, 2f; bnei r11, 2f;
1:
lwi r11, CURRENT_TASK, TS_THREAD_INFO; lwi r11, CURRENT_TASK, TS_THREAD_INFO;
lwi r11, r11, TI_FLAGS; /* MS: get flags from thread info */ lwi r19, r11, TI_FLAGS; /* MS: get flags from thread info */
andi r11, r11, _TIF_NEED_RESCHED; andi r11, r19, _TIF_NEED_RESCHED;
beqi r11, 5f beqi r11, 5f
bralid r15, schedule; bralid r15, schedule;
nop; /* delay slot */ nop; /* delay slot */
bri 1b
/* Maybe handle a signal */ /* Maybe handle a signal */
5: lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* MS: get thread info */ 5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
lwi r11, r11, TI_FLAGS; /* get flags in thread info */
andi r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
beqid r11, no_intr_resched beqid r11, no_intr_resched
/* Handle a signal return; Pending signals should be in r18. */ /* Handle a signal return; Pending signals should be in r18. */
addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */
bralid r15, do_notify_resume; /* Handle any signals */ bralid r15, do_notify_resume; /* Handle any signals */
addi r6, r0, 0; /* Arg 2: int in_syscall */ addi r6, r0, 0; /* Arg 2: int in_syscall */
bri 1b
/* Finally, return to user state. */ /* Finally, return to user state. */
no_intr_resched: no_intr_resched:
@ -815,28 +820,29 @@ dbtrap_call: /* Return point for kernel/user entry + 8 because of rtsd r15, 8 */
lwi r11, r1, PT_MODE; lwi r11, r1, PT_MODE;
bnei r11, 2f; bnei r11, 2f;
/* MS: Return to user space - gdb */ /* MS: Return to user space - gdb */
1:
/* Get current task ptr into r11 */ /* Get current task ptr into r11 */
lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */
lwi r11, r11, TI_FLAGS; /* get flags in thread info */ lwi r19, r11, TI_FLAGS; /* get flags in thread info */
andi r11, r11, _TIF_NEED_RESCHED; andi r11, r19, _TIF_NEED_RESCHED;
beqi r11, 5f; beqi r11, 5f;
/* Call the scheduler before returning from a syscall/trap. */ /* Call the scheduler before returning from a syscall/trap. */
bralid r15, schedule; /* Call scheduler */ bralid r15, schedule; /* Call scheduler */
nop; /* delay slot */ nop; /* delay slot */
bri 1b
/* Maybe handle a signal */ /* Maybe handle a signal */
5: lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ 5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
lwi r11, r11, TI_FLAGS; /* get flags in thread info */ beqi r11, 4f; /* Signals to handle, handle them */
andi r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
beqi r11, 1f; /* Signals to handle, handle them */
addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */
bralid r15, do_notify_resume; /* Handle any signals */ bralid r15, do_notify_resume; /* Handle any signals */
addi r6, r0, 0; /* Arg 2: int in_syscall */ addi r6, r0, 0; /* Arg 2: int in_syscall */
bri 1b
/* Finally, return to user state. */ /* Finally, return to user state. */
1: swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ 4: swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */
VM_OFF; VM_OFF;
tophys(r1,r1); tophys(r1,r1);
/* MS: Restore all regs */ /* MS: Restore all regs */

View File

@ -164,29 +164,6 @@ asmlinkage void do_syscall_trace_leave(struct pt_regs *regs)
tracehook_report_syscall_exit(regs, step); tracehook_report_syscall_exit(regs, step);
} }
#if 0
static asmlinkage void syscall_trace(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;
}
}
#endif
void ptrace_disable(struct task_struct *child) void ptrace_disable(struct task_struct *child)
{ {
/* nothing to do */ /* nothing to do */

View File

@ -41,13 +41,6 @@
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/syscalls.h> #include <asm/syscalls.h>
asmlinkage long
sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
struct pt_regs *regs)
{
return do_sigaltstack(uss, uoss, regs->r1);
}
/* /*
* Do a signal return; undo the signal stack. * Do a signal return; undo the signal stack.
*/ */
@ -109,9 +102,7 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)
if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &rval)) if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &rval))
goto badframe; goto badframe;
/* It is more difficult to avoid calling this function than to if (restore_altstack(&frame->uc.uc_stack))
call it and ignore errors. */
if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->r1) == -EFAULT)
goto badframe; goto badframe;
return rval; return rval;
@ -194,11 +185,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/* Create the ucontext. */ /* Create the ucontext. */
err |= __put_user(0, &frame->uc.uc_flags); err |= __put_user(0, &frame->uc.uc_flags);
err |= __put_user(NULL, &frame->uc.uc_link); err |= __put_user(NULL, &frame->uc.uc_link);
err |= __put_user((void __user *)current->sas_ss_sp, err |= __save_altstack(&frame->uc.uc_stack, regs->r1);
&frame->uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(regs->r1),
&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, err |= setup_sigcontext(&frame->uc.uc_mcontext,
regs, set->sig[0]); regs, set->sig[0]);
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
@ -356,15 +343,6 @@ static void do_signal(struct pt_regs *regs, int in_syscall)
asmlinkage void do_notify_resume(struct pt_regs *regs, int in_syscall) asmlinkage void do_notify_resume(struct pt_regs *regs, int in_syscall)
{ {
/*
* We want the common case to go fast, which
* is why we may in certain cases get here from
* kernel mode. Just return without doing anything
* if so.
*/
if (kernel_mode(regs))
return;
if (test_thread_flag(TIF_SIGPENDING)) if (test_thread_flag(TIF_SIGPENDING))
do_signal(regs, in_syscall); do_signal(regs, in_syscall);

View File

@ -40,6 +40,7 @@ config MIPS
select HAVE_MOD_ARCH_SPECIFIC select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_REL if MODULES select MODULES_USE_ELF_REL if MODULES
select MODULES_USE_ELF_RELA if MODULES && 64BIT select MODULES_USE_ELF_RELA if MODULES && 64BIT
select CLONE_BACKWARDS
menu "Machine selection" menu "Machine selection"

View File

@ -288,6 +288,14 @@ struct compat_shmid64_ds {
compat_ulong_t __unused2; compat_ulong_t __unused2;
}; };
/* MIPS has unusual order of fields in stack_t */
typedef struct compat_sigaltstack {
compat_uptr_t ss_sp;
compat_size_t ss_size;
int ss_flags;
} compat_stack_t;
#define compat_sigaltstack compat_sigaltstack
static inline int is_compat_task(void) static inline int is_compat_task(void)
{ {
return test_thread_flag(TIF_32BIT_ADDR); return test_thread_flag(TIF_32BIT_ADDR);

View File

@ -21,4 +21,6 @@
#include <asm/sigcontext.h> #include <asm/sigcontext.h>
#include <asm/siginfo.h> #include <asm/siginfo.h>
#define __ARCH_HAS_ODD_SIGACTION
#endif /* _ASM_SIGNAL_H */ #endif /* _ASM_SIGNAL_H */

View File

@ -20,10 +20,10 @@
#define save_static_function(symbol) \ #define save_static_function(symbol) \
__asm__( \ __asm__( \
".text\n\t" \ ".text\n\t" \
".globl\t" #symbol "\n\t" \ ".globl\t__" #symbol "\n\t" \
".align\t2\n\t" \ ".align\t2\n\t" \
".type\t" #symbol ", @function\n\t" \ ".type\t__" #symbol ", @function\n\t" \
".ent\t" #symbol ", 0\n" \ ".ent\t__" #symbol ", 0\n__" \
#symbol":\n\t" \ #symbol":\n\t" \
".frame\t$29, 0, $31\n\t" \ ".frame\t$29, 0, $31\n\t" \
"sw\t$16,"__str(PT_R16)"($29)\t\t\t# save_static_function\n\t" \ "sw\t$16,"__str(PT_R16)"($29)\t\t\t# save_static_function\n\t" \
@ -35,9 +35,9 @@ __asm__( \
"sw\t$22,"__str(PT_R22)"($29)\n\t" \ "sw\t$22,"__str(PT_R22)"($29)\n\t" \
"sw\t$23,"__str(PT_R23)"($29)\n\t" \ "sw\t$23,"__str(PT_R23)"($29)\n\t" \
"sw\t$30,"__str(PT_R30)"($29)\n\t" \ "sw\t$30,"__str(PT_R30)"($29)\n\t" \
"j\t_" #symbol "\n\t" \ "j\t" #symbol "\n\t" \
".end\t" #symbol "\n\t" \ ".end\t__" #symbol "\n\t" \
".size\t" #symbol",. - " #symbol) ".size\t__" #symbol",. - __" #symbol)
#define nabi_no_regargs #define nabi_no_regargs
@ -48,10 +48,10 @@ __asm__( \
#define save_static_function(symbol) \ #define save_static_function(symbol) \
__asm__( \ __asm__( \
".text\n\t" \ ".text\n\t" \
".globl\t" #symbol "\n\t" \ ".globl\t__" #symbol "\n\t" \
".align\t2\n\t" \ ".align\t2\n\t" \
".type\t" #symbol ", @function\n\t" \ ".type\t__" #symbol ", @function\n\t" \
".ent\t" #symbol ", 0\n" \ ".ent\t__" #symbol ", 0\n__" \
#symbol":\n\t" \ #symbol":\n\t" \
".frame\t$29, 0, $31\n\t" \ ".frame\t$29, 0, $31\n\t" \
"sd\t$16,"__str(PT_R16)"($29)\t\t\t# save_static_function\n\t" \ "sd\t$16,"__str(PT_R16)"($29)\t\t\t# save_static_function\n\t" \
@ -63,9 +63,9 @@ __asm__( \
"sd\t$22,"__str(PT_R22)"($29)\n\t" \ "sd\t$22,"__str(PT_R22)"($29)\n\t" \
"sd\t$23,"__str(PT_R23)"($29)\n\t" \ "sd\t$23,"__str(PT_R23)"($29)\n\t" \
"sd\t$30,"__str(PT_R30)"($29)\n\t" \ "sd\t$30,"__str(PT_R30)"($29)\n\t" \
"j\t_" #symbol "\n\t" \ "j\t" #symbol "\n\t" \
".end\t" #symbol "\n\t" \ ".end\t__" #symbol "\n\t" \
".size\t" #symbol",. - " #symbol) ".size\t__" #symbol",. - __" #symbol)
#define nabi_no_regargs \ #define nabi_no_regargs \
unsigned long __dummy0, \ unsigned long __dummy0, \

View File

@ -35,7 +35,6 @@
#define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_RT_SIGACTION
# ifdef CONFIG_32BIT # ifdef CONFIG_32BIT
# define __ARCH_WANT_STAT64 # define __ARCH_WANT_STAT64
# define __ARCH_WANT_SYS_TIME # define __ARCH_WANT_SYS_TIME
@ -43,6 +42,8 @@
# ifdef CONFIG_MIPS32_O32 # ifdef CONFIG_MIPS32_O32
# define __ARCH_WANT_COMPAT_SYS_TIME # define __ARCH_WANT_COMPAT_SYS_TIME
# endif # endif
#define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_CLONE
/* whitelists for checksyscalls */ /* whitelists for checksyscalls */
#define __IGNORE_select #define __IGNORE_select

View File

@ -96,15 +96,13 @@ typedef unsigned long old_sigset_t; /* at least 32 bits */
#include <asm-generic/signal-defs.h> #include <asm-generic/signal-defs.h>
#ifndef __KERNEL__
struct sigaction { struct sigaction {
unsigned int sa_flags; unsigned int sa_flags;
__sighandler_t sa_handler; __sighandler_t sa_handler;
sigset_t sa_mask; sigset_t sa_mask;
}; };
#endif
struct k_sigaction {
struct sigaction sa;
};
/* IRIX compatible stack_t */ /* IRIX compatible stack_t */
typedef struct sigaltstack { typedef struct sigaltstack {

View File

@ -119,22 +119,6 @@ SYSCALL_DEFINE6(32_pwrite, unsigned int, fd, const char __user *, buf,
return sys_pwrite64(fd, buf, count, merge_64(a4, a5)); return sys_pwrite64(fd, buf, count, merge_64(a4, a5));
} }
SYSCALL_DEFINE2(32_sched_rr_get_interval, compat_pid_t, pid,
struct compat_timespec __user *, interval)
{
struct timespec t;
int ret;
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);
ret = sys_sched_rr_get_interval(pid, (struct timespec __user *)&t);
set_fs(old_fs);
if (put_user (t.tv_sec, &interval->tv_sec) ||
__put_user(t.tv_nsec, &interval->tv_nsec))
return -EFAULT;
return ret;
}
#ifdef CONFIG_SYSVIPC #ifdef CONFIG_SYSVIPC
SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third, SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third,
@ -295,27 +279,6 @@ asmlinkage long sys32_fallocate(int fd, int mode, unsigned offset_a2,
merge_64(len_a4, len_a5)); merge_64(len_a4, len_a5));
} }
save_static_function(sys32_clone);
static int noinline __used
_sys32_clone(nabi_no_regargs struct pt_regs regs)
{
unsigned long clone_flags;
unsigned long newsp;
int __user *parent_tidptr, *child_tidptr;
clone_flags = regs.regs[4];
newsp = regs.regs[5];
if (!newsp)
newsp = regs.regs[29];
parent_tidptr = (int __user *) regs.regs[6];
/* Use __dummy4 instead of getting it off the stack, so that
syscall() works. */
child_tidptr = (int __user *) __dummy4;
return do_fork(clone_flags, newsp, 0,
parent_tidptr, child_tidptr);
}
asmlinkage long sys32_lookup_dcookie(u32 a0, u32 a1, char __user *buf, asmlinkage long sys32_lookup_dcookie(u32 a0, u32 a1, char __user *buf,
size_t len) size_t len)
{ {
@ -328,10 +291,3 @@ SYSCALL_DEFINE6(32_fanotify_mark, int, fanotify_fd, unsigned int, flags,
return sys_fanotify_mark(fanotify_fd, flags, merge_64(a3, a4), return sys_fanotify_mark(fanotify_fd, flags, merge_64(a3, a4),
dfd, pathname); dfd, pathname);
} }
SYSCALL_DEFINE6(32_futex, u32 __user *, uaddr, int, op, u32, val,
struct compat_timespec __user *, utime, u32 __user *, uaddr2,
u32, val3)
{
return compat_sys_futex(uaddr, op, val, utime, uaddr2, val3);
}

View File

@ -156,6 +156,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
*childregs = *regs; *childregs = *regs;
childregs->regs[7] = 0; /* Clear error flag */ childregs->regs[7] = 0; /* Clear error flag */
childregs->regs[2] = 0; /* Child gets zero as return value */ childregs->regs[2] = 0; /* Child gets zero as return value */
if (usp)
childregs->regs[29] = usp; childregs->regs[29] = usp;
ti->addr_limit = USER_DS; ti->addr_limit = USER_DS;

View File

@ -226,7 +226,7 @@ einval: li v0, -ENOSYS
.macro syscalltable .macro syscalltable
sys sys_syscall 8 /* 4000 */ sys sys_syscall 8 /* 4000 */
sys sys_exit 1 sys sys_exit 1
sys sys_fork 0 sys __sys_fork 0
sys sys_read 3 sys sys_read 3
sys sys_write 3 sys sys_write 3
sys sys_open 3 /* 4005 */ sys sys_open 3 /* 4005 */
@ -344,7 +344,7 @@ einval: li v0, -ENOSYS
sys sys_ipc 6 sys sys_ipc 6
sys sys_fsync 1 sys sys_fsync 1
sys sys_sigreturn 0 sys sys_sigreturn 0
sys sys_clone 0 /* 4120 */ sys __sys_clone 6 /* 4120 */
sys sys_setdomainname 2 sys sys_setdomainname 2
sys sys_newuname 1 sys sys_newuname 1
sys sys_ni_syscall 0 /* sys_modify_ldt */ sys sys_ni_syscall 0 /* sys_modify_ldt */

View File

@ -170,8 +170,8 @@ sys_call_table:
PTR sys_socketpair PTR sys_socketpair
PTR sys_setsockopt PTR sys_setsockopt
PTR sys_getsockopt PTR sys_getsockopt
PTR sys_clone /* 5055 */ PTR __sys_clone /* 5055 */
PTR sys_fork PTR __sys_fork
PTR sys_execve PTR sys_execve
PTR sys_exit PTR sys_exit
PTR sys_wait4 PTR sys_wait4

View File

@ -117,8 +117,8 @@ EXPORT(sysn32_call_table)
PTR sys_mprotect /* 6010 */ PTR sys_mprotect /* 6010 */
PTR sys_munmap PTR sys_munmap
PTR sys_brk PTR sys_brk
PTR sys_32_rt_sigaction PTR compat_sys_rt_sigaction
PTR sys_32_rt_sigprocmask PTR compat_sys_rt_sigprocmask
PTR compat_sys_ioctl /* 6015 */ PTR compat_sys_ioctl /* 6015 */
PTR sys_pread64 PTR sys_pread64
PTR sys_pwrite64 PTR sys_pwrite64
@ -159,8 +159,8 @@ EXPORT(sysn32_call_table)
PTR sys_socketpair PTR sys_socketpair
PTR compat_sys_setsockopt PTR compat_sys_setsockopt
PTR sys_getsockopt PTR sys_getsockopt
PTR sys_clone /* 6055 */ PTR __sys_clone /* 6055 */
PTR sys_fork PTR __sys_fork
PTR compat_sys_execve PTR compat_sys_execve
PTR sys_exit PTR sys_exit
PTR compat_sys_wait4 PTR compat_sys_wait4
@ -229,11 +229,11 @@ EXPORT(sysn32_call_table)
PTR sys_getsid PTR sys_getsid
PTR sys_capget PTR sys_capget
PTR sys_capset PTR sys_capset
PTR sys_32_rt_sigpending /* 6125 */ PTR compat_sys_rt_sigpending /* 6125 */
PTR compat_sys_rt_sigtimedwait PTR compat_sys_rt_sigtimedwait
PTR sys_32_rt_sigqueueinfo PTR compat_sys_rt_sigqueueinfo
PTR sysn32_rt_sigsuspend PTR compat_sys_rt_sigsuspend
PTR sys32_sigaltstack PTR compat_sys_sigaltstack
PTR compat_sys_utime /* 6130 */ PTR compat_sys_utime /* 6130 */
PTR sys_mknod PTR sys_mknod
PTR sys_32_personality PTR sys_32_personality
@ -249,7 +249,7 @@ EXPORT(sysn32_call_table)
PTR sys_sched_getscheduler PTR sys_sched_getscheduler
PTR sys_sched_get_priority_max PTR sys_sched_get_priority_max
PTR sys_sched_get_priority_min PTR sys_sched_get_priority_min
PTR sys_32_sched_rr_get_interval /* 6145 */ PTR compat_sys_sched_rr_get_interval /* 6145 */
PTR sys_mlock PTR sys_mlock
PTR sys_munlock PTR sys_munlock
PTR sys_mlockall PTR sys_mlockall
@ -298,7 +298,7 @@ EXPORT(sysn32_call_table)
PTR sys_fremovexattr PTR sys_fremovexattr
PTR sys_tkill PTR sys_tkill
PTR sys_ni_syscall PTR sys_ni_syscall
PTR sys_32_futex PTR compat_sys_futex
PTR compat_sys_sched_setaffinity /* 6195 */ PTR compat_sys_sched_setaffinity /* 6195 */
PTR compat_sys_sched_getaffinity PTR compat_sys_sched_getaffinity
PTR sys_cacheflush PTR sys_cacheflush

View File

@ -194,7 +194,7 @@ einval: li v0, -ENOSYS
sys_call_table: sys_call_table:
PTR sys32_syscall /* 4000 */ PTR sys32_syscall /* 4000 */
PTR sys_exit PTR sys_exit
PTR sys_fork PTR __sys_fork
PTR sys_read PTR sys_read
PTR sys_write PTR sys_write
PTR compat_sys_open /* 4005 */ PTR compat_sys_open /* 4005 */
@ -312,7 +312,7 @@ sys_call_table:
PTR sys_32_ipc PTR sys_32_ipc
PTR sys_fsync PTR sys_fsync
PTR sys32_sigreturn PTR sys32_sigreturn
PTR sys32_clone /* 4120 */ PTR __sys_clone /* 4120 */
PTR sys_setdomainname PTR sys_setdomainname
PTR sys_newuname PTR sys_newuname
PTR sys_ni_syscall /* sys_modify_ldt */ PTR sys_ni_syscall /* sys_modify_ldt */
@ -357,7 +357,7 @@ sys_call_table:
PTR sys_sched_yield PTR sys_sched_yield
PTR sys_sched_get_priority_max PTR sys_sched_get_priority_max
PTR sys_sched_get_priority_min PTR sys_sched_get_priority_min
PTR sys_32_sched_rr_get_interval /* 4165 */ PTR compat_sys_sched_rr_get_interval /* 4165 */
PTR compat_sys_nanosleep PTR compat_sys_nanosleep
PTR sys_mremap PTR sys_mremap
PTR sys_accept PTR sys_accept
@ -386,19 +386,19 @@ sys_call_table:
PTR sys_getresgid PTR sys_getresgid
PTR sys_prctl PTR sys_prctl
PTR sys32_rt_sigreturn PTR sys32_rt_sigreturn
PTR sys_32_rt_sigaction PTR compat_sys_rt_sigaction
PTR sys_32_rt_sigprocmask /* 4195 */ PTR compat_sys_rt_sigprocmask /* 4195 */
PTR sys_32_rt_sigpending PTR compat_sys_rt_sigpending
PTR compat_sys_rt_sigtimedwait PTR compat_sys_rt_sigtimedwait
PTR sys_32_rt_sigqueueinfo PTR compat_sys_rt_sigqueueinfo
PTR sys32_rt_sigsuspend PTR compat_sys_rt_sigsuspend
PTR sys_32_pread /* 4200 */ PTR sys_32_pread /* 4200 */
PTR sys_32_pwrite PTR sys_32_pwrite
PTR sys_chown PTR sys_chown
PTR sys_getcwd PTR sys_getcwd
PTR sys_capget PTR sys_capget
PTR sys_capset /* 4205 */ PTR sys_capset /* 4205 */
PTR sys32_sigaltstack PTR compat_sys_sigaltstack
PTR sys_32_sendfile PTR sys_32_sendfile
PTR sys_ni_syscall PTR sys_ni_syscall
PTR sys_ni_syscall PTR sys_ni_syscall
@ -430,7 +430,7 @@ sys_call_table:
PTR sys_fremovexattr /* 4235 */ PTR sys_fremovexattr /* 4235 */
PTR sys_tkill PTR sys_tkill
PTR sys_sendfile64 PTR sys_sendfile64
PTR sys_32_futex PTR compat_sys_futex
PTR compat_sys_sched_setaffinity PTR compat_sys_sched_setaffinity
PTR compat_sys_sched_getaffinity /* 4240 */ PTR compat_sys_sched_getaffinity /* 4240 */
PTR compat_sys_io_setup PTR compat_sys_io_setup
@ -470,7 +470,7 @@ sys_call_table:
PTR compat_sys_mq_notify /* 4275 */ PTR compat_sys_mq_notify /* 4275 */
PTR compat_sys_mq_getsetattr PTR compat_sys_mq_getsetattr
PTR sys_ni_syscall /* sys_vserver */ PTR sys_ni_syscall /* sys_vserver */
PTR sys_32_waitid PTR compat_sys_waitid
PTR sys_ni_syscall /* available, was setaltroot */ PTR sys_ni_syscall /* available, was setaltroot */
PTR sys_add_key /* 4280 */ PTR sys_add_key /* 4280 */
PTR sys_request_key PTR sys_request_key

View File

@ -247,35 +247,12 @@ void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
*/ */
#ifdef CONFIG_TRAD_SIGNALS #ifdef CONFIG_TRAD_SIGNALS
asmlinkage int sys_sigsuspend(nabi_no_regargs struct pt_regs regs) SYSCALL_DEFINE1(sigsuspend, sigset_t __user *, uset)
{ {
sigset_t newset; return sys_rt_sigsuspend(uset, sizeof(sigset_t));
sigset_t __user *uset;
uset = (sigset_t __user *) regs.regs[4];
if (copy_from_user(&newset, uset, sizeof(sigset_t)))
return -EFAULT;
return sigsuspend(&newset);
} }
#endif #endif
asmlinkage int sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
{
sigset_t newset;
sigset_t __user *unewset;
size_t sigsetsize;
/* XXX Don't preclude handling different sized sigset_t's. */
sigsetsize = regs.regs[5];
if (sigsetsize != sizeof(sigset_t))
return -EINVAL;
unewset = (sigset_t __user *) regs.regs[4];
if (copy_from_user(&newset, unewset, sizeof(newset)))
return -EFAULT;
return sigsuspend(&newset);
}
#ifdef CONFIG_TRAD_SIGNALS #ifdef CONFIG_TRAD_SIGNALS
SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act, SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act,
struct sigaction __user *, oact) struct sigaction __user *, oact)
@ -317,15 +294,6 @@ SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act,
} }
#endif #endif
asmlinkage int sys_sigaltstack(nabi_no_regargs struct pt_regs regs)
{
const stack_t __user *uss = (const stack_t __user *) regs.regs[4];
stack_t __user *uoss = (stack_t __user *) regs.regs[5];
unsigned long usp = regs.regs[29];
return do_sigaltstack(uss, uoss, usp);
}
#ifdef CONFIG_TRAD_SIGNALS #ifdef CONFIG_TRAD_SIGNALS
asmlinkage void sys_sigreturn(nabi_no_regargs struct pt_regs regs) asmlinkage void sys_sigreturn(nabi_no_regargs struct pt_regs regs)
{ {
@ -382,9 +350,8 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
else if (sig) else if (sig)
force_sig(sig, current); force_sig(sig, current);
/* It is more difficult to avoid calling this function than to if (restore_altstack(&frame->rs_uc.uc_stack))
call it and ignore errors. */ goto badframe;
do_sigaltstack(&frame->rs_uc.uc_stack, NULL, regs.regs[29]);
/* /*
* Don't let your children do this ... * Don't let your children do this ...
@ -461,12 +428,7 @@ static int setup_rt_frame(void *sig_return, struct k_sigaction *ka,
/* Create the ucontext. */ /* Create the ucontext. */
err |= __put_user(0, &frame->rs_uc.uc_flags); err |= __put_user(0, &frame->rs_uc.uc_flags);
err |= __put_user(NULL, &frame->rs_uc.uc_link); err |= __put_user(NULL, &frame->rs_uc.uc_link);
err |= __put_user((void __user *)current->sas_ss_sp, err |= __save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]);
&frame->rs_uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(regs->regs[29]),
&frame->rs_uc.uc_stack.ss_flags);
err |= __put_user(current->sas_ss_size,
&frame->rs_uc.uc_stack.ss_size);
err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext); err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext);
err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set)); err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));

View File

@ -55,23 +55,10 @@ extern asmlinkage int fpu_emulator_restore_context32(struct sigcontext32 __user
typedef unsigned int __sighandler32_t; typedef unsigned int __sighandler32_t;
typedef void (*vfptr_t)(void); typedef void (*vfptr_t)(void);
struct sigaction32 {
unsigned int sa_flags;
__sighandler32_t sa_handler;
compat_sigset_t sa_mask;
};
/* IRIX compatible stack_t */
typedef struct sigaltstack32 {
s32 ss_sp;
compat_size_t ss_size;
int ss_flags;
} stack32_t;
struct ucontext32 { struct ucontext32 {
u32 uc_flags; u32 uc_flags;
s32 uc_link; s32 uc_link;
stack32_t uc_stack; compat_stack_t uc_stack;
struct sigcontext32 uc_mcontext; struct sigcontext32 uc_mcontext;
compat_sigset_t uc_sigmask; /* mask last for extensibility */ compat_sigset_t uc_sigmask; /* mask last for extensibility */
}; };
@ -280,36 +267,13 @@ static inline int get_sigset(sigset_t *kbuf, const compat_sigset_t __user *ubuf)
* Atomically swap in the new signal mask, and wait for a signal. * Atomically swap in the new signal mask, and wait for a signal.
*/ */
asmlinkage int sys32_sigsuspend(nabi_no_regargs struct pt_regs regs) asmlinkage int sys32_sigsuspend(compat_sigset_t __user *uset)
{ {
compat_sigset_t __user *uset; return compat_sys_rt_sigsuspend(uset, sizeof(compat_sigset_t));
sigset_t newset;
uset = (compat_sigset_t __user *) regs.regs[4];
if (get_sigset(&newset, uset))
return -EFAULT;
return sigsuspend(&newset);
} }
asmlinkage int sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) SYSCALL_DEFINE3(32_sigaction, long, sig, const struct compat_sigaction __user *, act,
{ struct compat_sigaction __user *, oact)
compat_sigset_t __user *uset;
sigset_t newset;
size_t sigsetsize;
/* XXX Don't preclude handling different sized sigset_t's. */
sigsetsize = regs.regs[5];
if (sigsetsize != sizeof(compat_sigset_t))
return -EINVAL;
uset = (compat_sigset_t __user *) regs.regs[4];
if (get_sigset(&newset, uset))
return -EFAULT;
return sigsuspend(&newset);
}
SYSCALL_DEFINE3(32_sigaction, long, sig, const struct sigaction32 __user *, act,
struct sigaction32 __user *, oact)
{ {
struct k_sigaction new_ka, old_ka; struct k_sigaction new_ka, old_ka;
int ret; int ret;
@ -350,45 +314,6 @@ SYSCALL_DEFINE3(32_sigaction, long, sig, const struct sigaction32 __user *, act,
return ret; return ret;
} }
asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
{
const stack32_t __user *uss = (const stack32_t __user *) regs.regs[4];
stack32_t __user *uoss = (stack32_t __user *) regs.regs[5];
unsigned long usp = regs.regs[29];
stack_t kss, koss;
int ret, err = 0;
mm_segment_t old_fs = get_fs();
s32 sp;
if (uss) {
if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
return -EFAULT;
err |= __get_user(sp, &uss->ss_sp);
kss.ss_sp = (void __user *) (long) sp;
err |= __get_user(kss.ss_size, &uss->ss_size);
err |= __get_user(kss.ss_flags, &uss->ss_flags);
if (err)
return -EFAULT;
}
set_fs(KERNEL_DS);
ret = do_sigaltstack(uss ? (stack_t __user *)&kss : NULL,
uoss ? (stack_t __user *)&koss : NULL, usp);
set_fs(old_fs);
if (!ret && uoss) {
if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
return -EFAULT;
sp = (int) (unsigned long) koss.ss_sp;
err |= __put_user(sp, &uoss->ss_sp);
err |= __put_user(koss.ss_size, &uoss->ss_size);
err |= __put_user(koss.ss_flags, &uoss->ss_flags);
if (err)
return -EFAULT;
}
return ret;
}
int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
{ {
int err; int err;
@ -490,10 +415,7 @@ badframe:
asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
{ {
struct rt_sigframe32 __user *frame; struct rt_sigframe32 __user *frame;
mm_segment_t old_fs;
sigset_t set; sigset_t set;
stack_t st;
s32 sp;
int sig; int sig;
frame = (struct rt_sigframe32 __user *) regs.regs[29]; frame = (struct rt_sigframe32 __user *) regs.regs[29];
@ -510,21 +432,8 @@ asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
else if (sig) else if (sig)
force_sig(sig, current); force_sig(sig, current);
/* The ucontext contains a stack32_t, so we must convert! */ if (compat_restore_altstack(&frame->rs_uc.uc_stack))
if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp))
goto badframe; goto badframe;
st.ss_sp = (void __user *)(long) sp;
if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size))
goto badframe;
if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags))
goto badframe;
/* It is more difficult to avoid calling this function than to
call it and ignore errors. */
old_fs = get_fs();
set_fs(KERNEL_DS);
do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
set_fs(old_fs);
/* /*
* Don't let your children do this ... * Don't let your children do this ...
@ -590,7 +499,6 @@ static int setup_rt_frame_32(void *sig_return, struct k_sigaction *ka,
{ {
struct rt_sigframe32 __user *frame; struct rt_sigframe32 __user *frame;
int err = 0; int err = 0;
s32 sp;
frame = get_sigframe(ka, regs, sizeof(*frame)); frame = get_sigframe(ka, regs, sizeof(*frame));
if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
@ -602,13 +510,7 @@ static int setup_rt_frame_32(void *sig_return, struct k_sigaction *ka,
/* Create the ucontext. */ /* Create the ucontext. */
err |= __put_user(0, &frame->rs_uc.uc_flags); err |= __put_user(0, &frame->rs_uc.uc_flags);
err |= __put_user(0, &frame->rs_uc.uc_link); err |= __put_user(0, &frame->rs_uc.uc_link);
sp = (int) (long) current->sas_ss_sp; err |= __compat_save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]);
err |= __put_user(sp,
&frame->rs_uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(regs->regs[29]),
&frame->rs_uc.uc_stack.ss_flags);
err |= __put_user(current->sas_ss_size,
&frame->rs_uc.uc_stack.ss_size);
err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext); err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext);
err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set); err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set);
@ -656,131 +558,6 @@ struct mips_abi mips_abi_32 = {
.restart = __NR_O32_restart_syscall .restart = __NR_O32_restart_syscall
}; };
SYSCALL_DEFINE4(32_rt_sigaction, int, sig,
const struct sigaction32 __user *, act,
struct sigaction32 __user *, oact, unsigned int, sigsetsize)
{
struct k_sigaction new_sa, old_sa;
int ret = -EINVAL;
/* XXX: Don't preclude handling different sized sigset_t's. */
if (sigsetsize != sizeof(sigset_t))
goto out;
if (act) {
s32 handler;
int err = 0;
if (!access_ok(VERIFY_READ, act, sizeof(*act)))
return -EFAULT;
err |= __get_user(handler, &act->sa_handler);
new_sa.sa.sa_handler = (void __user *)(s64)handler;
err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags);
err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask);
if (err)
return -EFAULT;
}
ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
if (!ret && oact) {
int err = 0;
if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
return -EFAULT;
err |= __put_user((u32)(u64)old_sa.sa.sa_handler,
&oact->sa_handler);
err |= __put_user(old_sa.sa.sa_flags, &oact->sa_flags);
err |= put_sigset(&old_sa.sa.sa_mask, &oact->sa_mask);
if (err)
return -EFAULT;
}
out:
return ret;
}
SYSCALL_DEFINE4(32_rt_sigprocmask, int, how, compat_sigset_t __user *, set,
compat_sigset_t __user *, oset, unsigned int, sigsetsize)
{
sigset_t old_set, new_set;
int ret;
mm_segment_t old_fs = get_fs();
if (set && get_sigset(&new_set, set))
return -EFAULT;
set_fs(KERNEL_DS);
ret = sys_rt_sigprocmask(how, set ? (sigset_t __user *)&new_set : NULL,
oset ? (sigset_t __user *)&old_set : NULL,
sigsetsize);
set_fs(old_fs);
if (!ret && oset && put_sigset(&old_set, oset))
return -EFAULT;
return ret;
}
SYSCALL_DEFINE2(32_rt_sigpending, compat_sigset_t __user *, uset,
unsigned int, sigsetsize)
{
int ret;
sigset_t set;
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);
ret = sys_rt_sigpending((sigset_t __user *)&set, sigsetsize);
set_fs(old_fs);
if (!ret && put_sigset(&set, uset))
return -EFAULT;
return ret;
}
SYSCALL_DEFINE3(32_rt_sigqueueinfo, int, pid, int, sig,
compat_siginfo_t __user *, uinfo)
{
siginfo_t info;
int ret;
mm_segment_t old_fs = get_fs();
if (copy_from_user(&info, uinfo, 3*sizeof(int)) ||
copy_from_user(info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
return -EFAULT;
set_fs(KERNEL_DS);
ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *)&info);
set_fs(old_fs);
return ret;
}
SYSCALL_DEFINE5(32_waitid, int, which, compat_pid_t, pid,
compat_siginfo_t __user *, uinfo, int, options,
struct compat_rusage __user *, uru)
{
siginfo_t info;
struct rusage ru;
long ret;
mm_segment_t old_fs = get_fs();
info.si_signo = 0;
set_fs(KERNEL_DS);
ret = sys_waitid(which, pid, (siginfo_t __user *) &info, options,
uru ? (struct rusage __user *) &ru : NULL);
set_fs(old_fs);
if (ret < 0 || info.si_signo == 0)
return ret;
if (uru && (ret = put_compat_rusage(&ru, uru)))
return ret;
BUG_ON(info.si_code & __SI_MASK);
info.si_code |= __SI_CHLD;
return copy_siginfo_to_user32(uinfo, &info);
}
static int signal32_init(void) static int signal32_init(void)
{ {
if (cpu_has_fpu) { if (cpu_has_fpu) {

View File

@ -50,18 +50,10 @@
extern int setup_sigcontext(struct pt_regs *, struct sigcontext __user *); extern int setup_sigcontext(struct pt_regs *, struct sigcontext __user *);
extern int restore_sigcontext(struct pt_regs *, struct sigcontext __user *); extern int restore_sigcontext(struct pt_regs *, struct sigcontext __user *);
/* IRIX compatible stack_t */
typedef struct sigaltstack32 {
s32 ss_sp;
compat_size_t ss_size;
int ss_flags;
} stack32_t;
struct ucontextn32 { struct ucontextn32 {
u32 uc_flags; u32 uc_flags;
s32 uc_link; s32 uc_link;
stack32_t uc_stack; compat_stack_t uc_stack;
struct sigcontext uc_mcontext; struct sigcontext uc_mcontext;
compat_sigset_t uc_sigmask; /* mask last for extensibility */ compat_sigset_t uc_sigmask; /* mask last for extensibility */
}; };
@ -73,34 +65,10 @@ struct rt_sigframe_n32 {
struct ucontextn32 rs_uc; struct ucontextn32 rs_uc;
}; };
extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat);
asmlinkage int sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
{
compat_sigset_t __user *unewset;
compat_sigset_t uset;
size_t sigsetsize;
sigset_t newset;
/* XXX Don't preclude handling different sized sigset_t's. */
sigsetsize = regs.regs[5];
if (sigsetsize != sizeof(sigset_t))
return -EINVAL;
unewset = (compat_sigset_t __user *) regs.regs[4];
if (copy_from_user(&uset, unewset, sizeof(uset)))
return -EFAULT;
sigset_from_compat(&newset, &uset);
return sigsuspend(&newset);
}
asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
{ {
struct rt_sigframe_n32 __user *frame; struct rt_sigframe_n32 __user *frame;
mm_segment_t old_fs;
sigset_t set; sigset_t set;
stack_t st;
s32 sp;
int sig; int sig;
frame = (struct rt_sigframe_n32 __user *) regs.regs[29]; frame = (struct rt_sigframe_n32 __user *) regs.regs[29];
@ -117,22 +85,8 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
else if (sig) else if (sig)
force_sig(sig, current); force_sig(sig, current);
/* The ucontext contains a stack32_t, so we must convert! */ if (compat_restore_altstack(&frame->rs_uc.uc_stack))
if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp))
goto badframe; goto badframe;
st.ss_sp = (void __user *)(long) sp;
if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size))
goto badframe;
if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags))
goto badframe;
/* It is more difficult to avoid calling this function than to
call it and ignore errors. */
old_fs = get_fs();
set_fs(KERNEL_DS);
do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
set_fs(old_fs);
/* /*
* Don't let your children do this ... * Don't let your children do this ...
@ -153,7 +107,6 @@ static int setup_rt_frame_n32(void *sig_return, struct k_sigaction *ka,
{ {
struct rt_sigframe_n32 __user *frame; struct rt_sigframe_n32 __user *frame;
int err = 0; int err = 0;
s32 sp;
frame = get_sigframe(ka, regs, sizeof(*frame)); frame = get_sigframe(ka, regs, sizeof(*frame));
if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
@ -165,13 +118,7 @@ static int setup_rt_frame_n32(void *sig_return, struct k_sigaction *ka,
/* Create the ucontext. */ /* Create the ucontext. */
err |= __put_user(0, &frame->rs_uc.uc_flags); err |= __put_user(0, &frame->rs_uc.uc_flags);
err |= __put_user(0, &frame->rs_uc.uc_link); err |= __put_user(0, &frame->rs_uc.uc_link);
sp = (int) (long) current->sas_ss_sp; err |= __compat_save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]);
err |= __put_user(sp,
&frame->rs_uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(regs->regs[29]),
&frame->rs_uc.uc_stack.ss_flags);
err |= __put_user(current->sas_ss_size,
&frame->rs_uc.uc_stack.ss_size);
err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext); err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext);
err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set); err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set);

View File

@ -46,20 +46,14 @@
* argument. Historically that used to be expensive in Linux. These days * argument. Historically that used to be expensive in Linux. These days
* the performance advantage is negligible. * the performance advantage is negligible.
*/ */
asmlinkage int sysm_pipe(nabi_no_regargs volatile struct pt_regs regs) asmlinkage int sysm_pipe(void)
{ {
int fd[2]; int fd[2];
int error, res; int error = do_pipe_flags(fd, 0);
if (error)
error = do_pipe_flags(fd, 0); return error;
if (error) { current_pt_regs()->regs[3] = fd[1];
res = error; return fd[0];
goto out;
}
regs.regs[3] = fd[1];
res = fd[0];
out:
return res;
} }
SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len, SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len,
@ -89,43 +83,7 @@ SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len,
} }
save_static_function(sys_fork); save_static_function(sys_fork);
static int __used noinline
_sys_fork(nabi_no_regargs struct pt_regs regs)
{
return do_fork(SIGCHLD, regs.regs[29], 0, NULL, NULL);
}
save_static_function(sys_clone); save_static_function(sys_clone);
static int __used noinline
_sys_clone(nabi_no_regargs struct pt_regs regs)
{
unsigned long clone_flags;
unsigned long newsp;
int __user *parent_tidptr, *child_tidptr;
clone_flags = regs.regs[4];
newsp = regs.regs[5];
if (!newsp)
newsp = regs.regs[29];
parent_tidptr = (int __user *) regs.regs[6];
#ifdef CONFIG_32BIT
/* We need to fetch the fifth argument off the stack. */
child_tidptr = NULL;
if (clone_flags & (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)) {
int __user *__user *usp = (int __user *__user *) regs.regs[29];
if (regs.regs[2] == __NR_syscall) {
if (get_user (child_tidptr, &usp[5]))
return -EFAULT;
}
else if (get_user (child_tidptr, &usp[4]))
return -EFAULT;
}
#else
child_tidptr = (int __user *) regs.regs[8];
#endif
return do_fork(clone_flags, newsp, 0,
parent_tidptr, child_tidptr);
}
SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) SYSCALL_DEFINE1(set_thread_area, unsigned long, addr)
{ {
@ -138,10 +96,10 @@ SYSCALL_DEFINE1(set_thread_area, unsigned long, addr)
return 0; return 0;
} }
static inline int mips_atomic_set(struct pt_regs *regs, static inline int mips_atomic_set(unsigned long addr, unsigned long new)
unsigned long addr, unsigned long new)
{ {
unsigned long old, tmp; unsigned long old, tmp;
struct pt_regs *regs;
unsigned int err; unsigned int err;
if (unlikely(addr & 3)) if (unlikely(addr & 3))
@ -222,6 +180,7 @@ static inline int mips_atomic_set(struct pt_regs *regs,
if (unlikely(err)) if (unlikely(err))
return err; return err;
regs = current_pt_regs();
regs->regs[2] = old; regs->regs[2] = old;
regs->regs[7] = 0; /* No error */ regs->regs[7] = 0; /* No error */
@ -235,22 +194,14 @@ static inline int mips_atomic_set(struct pt_regs *regs,
: "r" (regs)); : "r" (regs));
/* unreached. Honestly. */ /* unreached. Honestly. */
while (1); unreachable();
} }
save_static_function(sys_sysmips); SYSCALL_DEFINE3(sysmips, long, cmd, long, arg1, long, arg2)
static int __used noinline
_sys_sysmips(nabi_no_regargs struct pt_regs regs)
{ {
long cmd, arg1, arg2;
cmd = regs.regs[4];
arg1 = regs.regs[5];
arg2 = regs.regs[6];
switch (cmd) { switch (cmd) {
case MIPS_ATOMIC_SET: case MIPS_ATOMIC_SET:
return mips_atomic_set(&regs, arg1, arg2); return mips_atomic_set(arg1, arg2);
case MIPS_FIXADE: case MIPS_FIXADE:
if (arg1 & ~3) if (arg1 & ~3)

View File

@ -10,6 +10,8 @@ config MN10300
select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select MODULES_USE_ELF_RELA select MODULES_USE_ELF_RELA
select OLD_SIGSUSPEND3
select OLD_SIGACTION
config AM33_2 config AM33_2
def_bool n def_bool n

View File

@ -26,23 +26,8 @@ typedef struct {
unsigned long sig[_NSIG_WORDS]; unsigned long sig[_NSIG_WORDS];
} sigset_t; } sigset_t;
struct old_sigaction { #define __ARCH_HAS_SA_RESTORER
__sighandler_t sa_handler;
old_sigset_t sa_mask;
unsigned long sa_flags;
__sigrestore_t sa_restorer;
};
struct sigaction {
__sighandler_t sa_handler;
unsigned long sa_flags;
__sigrestore_t sa_restorer;
sigset_t sa_mask; /* mask last for extensibility */
};
struct k_sigaction {
struct sigaction sa;
};
#include <asm/sigcontext.h> #include <asm/sigcontext.h>
#endif /* _ASM_SIGNAL_H */ #endif /* _ASM_SIGNAL_H */

View File

@ -41,8 +41,6 @@
#define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_CLONE

View File

@ -31,59 +31,6 @@
#define DEBUG_SIG 0 #define DEBUG_SIG 0
/*
* atomically swap in the new signal mask, and wait for a signal.
*/
asmlinkage long sys_sigsuspend(int history0, int history1, old_sigset_t mask)
{
sigset_t blocked;
siginitset(&blocked, mask);
return sigsuspend(&blocked);
}
/*
* set signal action syscall
*/
asmlinkage long sys_sigaction(int sig,
const struct old_sigaction __user *act,
struct old_sigaction __user *oact)
{
struct k_sigaction new_ka, old_ka;
int ret;
if (act) {
old_sigset_t mask;
if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
__get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
__get_user(new_ka.sa.sa_restorer, &act->sa_restorer) ||
__get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
__get_user(mask, &act->sa_mask))
return -EFAULT;
siginitset(&new_ka.sa.sa_mask, mask);
}
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
if (!ret && oact) {
if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
__put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
__put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) ||
__put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
return -EFAULT;
}
return ret;
}
/*
* set alternate signal stack syscall
*/
asmlinkage long sys_sigaltstack(const stack_t __user *uss, stack_t *uoss)
{
return do_sigaltstack(uss, uoss, current_frame()->sp);
}
/* /*
* do a signal return; undo the signal stack. * do a signal return; undo the signal stack.
*/ */
@ -193,8 +140,7 @@ asmlinkage long sys_rt_sigreturn(void)
if (restore_sigcontext(current_frame(), &frame->uc.uc_mcontext, &d0)) if (restore_sigcontext(current_frame(), &frame->uc.uc_mcontext, &d0))
goto badframe; goto badframe;
if (do_sigaltstack(&frame->uc.uc_stack, NULL, current_frame()->sp) == if (restore_altstack(&frame->uc.uc_stack))
-EFAULT)
goto badframe; goto badframe;
return d0; return d0;
@ -359,9 +305,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/* create the ucontext. */ /* create the ucontext. */
if (__put_user(0, &frame->uc.uc_flags) || if (__put_user(0, &frame->uc.uc_flags) ||
__put_user(0, &frame->uc.uc_link) || __put_user(0, &frame->uc.uc_link) ||
__put_user((void *)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp) || __save_altstack(&frame->uc.uc_stack, regs->sp) ||
__put_user(sas_ss_flags(regs->sp), &frame->uc.uc_stack.ss_flags) ||
__put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size) ||
setup_sigcontext(&frame->uc.uc_mcontext, setup_sigcontext(&frame->uc.uc_mcontext,
&frame->fpuctx, regs, set->sig[0]) || &frame->fpuctx, regs, set->sig[0]) ||
__copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set))) __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)))

View File

@ -1083,10 +1083,6 @@ ENTRY(__sys_fork)
l.j _fork_save_extra_regs_and_call l.j _fork_save_extra_regs_and_call
l.addi r3,r1,0 l.addi r3,r1,0
ENTRY(sys_sigaltstack)
l.j _sys_sigaltstack
l.addi r5,r1,0
ENTRY(sys_rt_sigreturn) ENTRY(sys_rt_sigreturn)
l.j _sys_rt_sigreturn l.j _sys_rt_sigreturn
l.addi r3,r1,0 l.addi r3,r1,0

View File

@ -33,12 +33,6 @@
#define DEBUG_SIG 0 #define DEBUG_SIG 0
asmlinkage long
_sys_sigaltstack(const stack_t *uss, stack_t *uoss, struct pt_regs *regs)
{
return do_sigaltstack(uss, uoss, regs->sp);
}
struct rt_sigframe { struct rt_sigframe {
struct siginfo *pinfo; struct siginfo *pinfo;
void *puc; void *puc;
@ -103,9 +97,7 @@ asmlinkage long _sys_rt_sigreturn(struct pt_regs *regs)
if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
goto badframe; goto badframe;
/* It is more difficult to avoid calling this function than to if (restore_altstack(&frame->uc.uc_stack))
call it and ignore errors. */
if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT)
goto badframe; goto badframe;
return regs->gpr[11]; return regs->gpr[11];
@ -205,10 +197,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext)); err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
err |= __put_user(0, &frame->uc.uc_flags); err |= __put_user(0, &frame->uc.uc_flags);
err |= __put_user(NULL, &frame->uc.uc_link); err |= __put_user(NULL, &frame->uc.uc_link);
err |= __put_user((void *)current->sas_ss_sp, err |= __save_altstack(&frame->uc.uc_stack, regs->sp);
&frame->uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(regs->sp), &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, set->sig[0]); err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));

View File

@ -20,15 +20,13 @@ typedef struct {
unsigned long sig[_NSIG_WORDS]; unsigned long sig[_NSIG_WORDS];
} sigset_t; } sigset_t;
#ifndef __KERNEL__
struct sigaction { struct sigaction {
__sighandler_t sa_handler; __sighandler_t sa_handler;
unsigned long sa_flags; unsigned long sa_flags;
sigset_t sa_mask; /* mask last for extensibility */ sigset_t sa_mask; /* mask last for extensibility */
}; };
#endif
struct k_sigaction {
struct sigaction sa;
};
#include <asm/sigcontext.h> #include <asm/sigcontext.h>

View File

@ -161,9 +161,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
#define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_CLONE

View File

@ -1748,44 +1748,6 @@ ENTRY(sys_rt_sigreturn_wrapper)
LDREG PT_GR28(%r1),%r28 /* reload original r28 for syscall_exit */ LDREG PT_GR28(%r1),%r28 /* reload original r28 for syscall_exit */
ENDPROC(sys_rt_sigreturn_wrapper) ENDPROC(sys_rt_sigreturn_wrapper)
ENTRY(sys_sigaltstack_wrapper)
/* Get the user stack pointer */
LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1
ldo TASK_REGS(%r1),%r24 /* get pt regs */
LDREG TASK_PT_GR30(%r24),%r24
STREG %r2, -RP_OFFSET(%r30)
#ifdef CONFIG_64BIT
ldo FRAME_SIZE(%r30), %r30
BL do_sigaltstack,%r2
ldo -16(%r30),%r29 /* Reference param save area */
#else
BL do_sigaltstack,%r2
ldo FRAME_SIZE(%r30), %r30
#endif
ldo -FRAME_SIZE(%r30), %r30
LDREG -RP_OFFSET(%r30), %r2
bv %r0(%r2)
nop
ENDPROC(sys_sigaltstack_wrapper)
#ifdef CONFIG_64BIT
ENTRY(sys32_sigaltstack_wrapper)
/* Get the user stack pointer */
LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r24
LDREG TASK_PT_GR30(%r24),%r24
STREG %r2, -RP_OFFSET(%r30)
ldo FRAME_SIZE(%r30), %r30
BL do_sigaltstack32,%r2
ldo -16(%r30),%r29 /* Reference param save area */
ldo -FRAME_SIZE(%r30), %r30
LDREG -RP_OFFSET(%r30), %r2
bv %r0(%r2)
nop
ENDPROC(sys32_sigaltstack_wrapper)
#endif
ENTRY(syscall_exit) ENTRY(syscall_exit)
/* NOTE: HP-UX syscalls also come through here /* NOTE: HP-UX syscalls also come through here
* after hpux_syscall_exit fixes up return * after hpux_syscall_exit fixes up return

View File

@ -143,7 +143,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
goto give_sigsegv; goto give_sigsegv;
DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n",
usp, &compat_frame->uc.uc_stack); usp, &compat_frame->uc.uc_stack);
if (do_sigaltstack32(&compat_frame->uc.uc_stack, NULL, usp) == -EFAULT) if (compat_restore_altstack(&compat_frame->uc.uc_stack))
goto give_sigsegv; goto give_sigsegv;
} else } else
#endif #endif
@ -154,7 +154,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
goto give_sigsegv; goto give_sigsegv;
DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n",
usp, &frame->uc.uc_stack); usp, &frame->uc.uc_stack);
if (do_sigaltstack(&frame->uc.uc_stack, NULL, usp) == -EFAULT) if (restore_altstack(&frame->uc.uc_stack))
goto give_sigsegv; goto give_sigsegv;
} }
@ -262,15 +262,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
if (is_compat_task()) { if (is_compat_task()) {
DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info); DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info);
err |= copy_siginfo_to_user32(&compat_frame->info, info); err |= copy_siginfo_to_user32(&compat_frame->info, info);
DBG(1,"SETUP_RT_FRAME: 1\n"); err |= __compat_save_altstack( &compat_frame->uc.uc_stack, regs->gr[30]);
compat_val = (compat_int_t)current->sas_ss_sp;
err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_sp);
DBG(1,"SETUP_RT_FRAME: 2\n");
compat_val = (compat_int_t)current->sas_ss_size;
err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_size);
DBG(1,"SETUP_RT_FRAME: 3\n");
compat_val = sas_ss_flags(regs->gr[30]);
err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_flags);
DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc); DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc);
DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext); DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext);
err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext, err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext,
@ -282,10 +274,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
{ {
DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info); DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info);
err |= copy_siginfo_to_user(&frame->info, info); err |= copy_siginfo_to_user(&frame->info, info);
err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); err |= __save_altstack(&frame->uc.uc_stack, regs->gr[30]);
err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
err |= __put_user(sas_ss_flags(regs->gr[30]),
&frame->uc.uc_stack.ss_flags);
DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc); DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc);
DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext); DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext);
err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall); err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall);

View File

@ -60,136 +60,6 @@ sigset_64to32(compat_sigset_t *s32, sigset_t *s64)
s32->sig[1] = (s64->sig[0] >> 32) & 0xffffffffUL; s32->sig[1] = (s64->sig[0] >> 32) & 0xffffffffUL;
} }
static int
put_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz)
{
compat_sigset_t s;
if (sz != sizeof(compat_sigset_t))
return -EINVAL;
sigset_64to32(&s, set);
return copy_to_user(up, &s, sizeof s);
}
static int
get_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz)
{
compat_sigset_t s;
int r;
if (sz != sizeof(compat_sigset_t))
return -EINVAL;
if ((r = copy_from_user(&s, up, sz)) == 0) {
sigset_32to64(set, &s);
}
return r;
}
int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set, compat_sigset_t __user *oset,
unsigned int sigsetsize)
{
sigset_t old_set, new_set;
int ret;
if (set) {
ret = get_sigset32(set, &new_set, sigsetsize);
if (ret)
return ret;
}
KERNEL_SYSCALL(ret, sys_rt_sigprocmask, how, set ? (sigset_t __user *)&new_set : NULL,
oset ? (sigset_t __user *)&old_set : NULL, sigsetsize);
if (!ret && oset && put_sigset32(oset, &old_set, sigsetsize))
return -EFAULT;
return ret;
}
int sys32_rt_sigpending(compat_sigset_t __user *uset, unsigned int sigsetsize)
{
int ret;
sigset_t set;
KERNEL_SYSCALL(ret, sys_rt_sigpending, (sigset_t __user *)&set, sigsetsize);
if (!ret && put_sigset32(uset, &set, sigsetsize))
return -EFAULT;
return ret;
}
long
sys32_rt_sigaction(int sig, const struct sigaction32 __user *act, struct sigaction32 __user *oact,
size_t sigsetsize)
{
struct k_sigaction32 new_sa32, old_sa32;
struct k_sigaction new_sa, old_sa;
int ret = -EINVAL;
/* XXX: Don't preclude handling different sized sigset_t's. */
if (sigsetsize != sizeof(compat_sigset_t))
return -EINVAL;
if (act) {
if (copy_from_user(&new_sa32.sa, act, sizeof new_sa32.sa))
return -EFAULT;
new_sa.sa.sa_handler = (__sighandler_t)(unsigned long)new_sa32.sa.sa_handler;
new_sa.sa.sa_flags = new_sa32.sa.sa_flags;
sigset_32to64(&new_sa.sa.sa_mask, &new_sa32.sa.sa_mask);
}
ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
if (!ret && oact) {
sigset_64to32(&old_sa32.sa.sa_mask, &old_sa.sa.sa_mask);
old_sa32.sa.sa_flags = old_sa.sa.sa_flags;
old_sa32.sa.sa_handler = (__sighandler_t32)(unsigned long)old_sa.sa.sa_handler;
if (copy_to_user(oact, &old_sa32.sa, sizeof old_sa32.sa))
return -EFAULT;
}
return ret;
}
int
do_sigaltstack32 (const compat_stack_t __user *uss32, compat_stack_t __user *uoss32, unsigned long sp)
{
compat_stack_t ss32, oss32;
stack_t ss, oss;
stack_t *ssp = NULL, *ossp = NULL;
int ret;
if (uss32) {
if (copy_from_user(&ss32, uss32, sizeof ss32))
return -EFAULT;
ss.ss_sp = (void __user *)(unsigned long)ss32.ss_sp;
ss.ss_flags = ss32.ss_flags;
ss.ss_size = ss32.ss_size;
ssp = &ss;
}
if (uoss32)
ossp = &oss;
KERNEL_SYSCALL(ret, do_sigaltstack, (const stack_t __user *)ssp, (stack_t __user *)ossp, sp);
if (!ret && uoss32) {
oss32.ss_sp = (unsigned int)(unsigned long)oss.ss_sp;
oss32.ss_flags = oss.ss_flags;
oss32.ss_size = oss.ss_size;
if (copy_to_user(uoss32, &oss32, sizeof *uoss32))
return -EFAULT;
}
return ret;
}
long long
restore_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __user * rf, restore_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __user * rf,
struct pt_regs *regs) struct pt_regs *regs)
@ -506,22 +376,3 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from)
} }
return err; return err;
} }
asmlinkage long compat_sys_rt_sigqueueinfo(int pid, int sig,
struct compat_siginfo __user *uinfo)
{
siginfo_t info;
if (copy_siginfo_from_user32(&info, uinfo))
return -EFAULT;
/* Not even root can pretend to send signals from the kernel.
Nor can they impersonate a kill(), which adds source info. */
if (info.si_code >= 0)
return -EPERM;
info.si_signo = sig;
/* POSIX.1b doesn't mention process groups. */
return kill_proc_info(sig, &info, pid);
}

View File

@ -21,23 +21,6 @@
#include <linux/compat.h> #include <linux/compat.h>
typedef compat_uptr_t compat_sighandler_t;
typedef struct compat_sigaltstack {
compat_uptr_t ss_sp;
compat_int_t ss_flags;
compat_size_t ss_size;
} compat_stack_t;
/* Most things should be clean enough to redefine this at will, if care
is taken to make libc match. */
struct compat_sigaction {
compat_sighandler_t sa_handler;
compat_uint_t sa_flags;
compat_sigset_t sa_mask; /* mask last for extensibility */
};
/* 32-bit ucontext as seen from an 64-bit kernel */ /* 32-bit ucontext as seen from an 64-bit kernel */
struct compat_ucontext { struct compat_ucontext {
compat_uint_t uc_flags; compat_uint_t uc_flags;
@ -51,10 +34,6 @@ struct compat_ucontext {
/* ELF32 signal handling */ /* ELF32 signal handling */
struct k_sigaction32 {
struct compat_sigaction sa;
};
int copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from); int copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from);
int copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from); int copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from);
@ -102,8 +81,6 @@ struct compat_rt_sigframe {
void sigset_32to64(sigset_t *s64, compat_sigset_t *s32); void sigset_32to64(sigset_t *s64, compat_sigset_t *s32);
void sigset_64to32(compat_sigset_t *s32, sigset_t *s64); void sigset_64to32(compat_sigset_t *s32, sigset_t *s64);
int do_sigaltstack32 (const compat_stack_t __user *uss32,
compat_stack_t __user *uoss32, unsigned long sp);
long restore_sigcontext32(struct compat_sigcontext __user *sc, long restore_sigcontext32(struct compat_sigcontext __user *sc,
struct compat_regfile __user *rf, struct compat_regfile __user *rf,
struct pt_regs *regs); struct pt_regs *regs);

View File

@ -33,16 +33,4 @@
set_fs (old_fs); \ set_fs (old_fs); \
} }
#ifdef CONFIG_COMPAT
typedef __u32 __sighandler_t32;
struct sigaction32 {
__sighandler_t32 sa_handler;
unsigned int sa_flags;
compat_sigset_t sa_mask; /* mask last for extensibility */
};
#endif
#endif #endif

View File

@ -252,7 +252,7 @@
ENTRY_SAME(mremap) ENTRY_SAME(mremap)
ENTRY_SAME(setresuid) ENTRY_SAME(setresuid)
ENTRY_SAME(getresuid) /* 165 */ ENTRY_SAME(getresuid) /* 165 */
ENTRY_DIFF(sigaltstack_wrapper) ENTRY_COMP(sigaltstack)
ENTRY_SAME(ni_syscall) /* query_module */ ENTRY_SAME(ni_syscall) /* query_module */
ENTRY_SAME(poll) ENTRY_SAME(poll)
/* structs contain pointers and an in_addr... */ /* structs contain pointers and an in_addr... */
@ -262,9 +262,9 @@
ENTRY_SAME(prctl) ENTRY_SAME(prctl)
/* signals need a careful review */ /* signals need a careful review */
ENTRY_SAME(rt_sigreturn_wrapper) ENTRY_SAME(rt_sigreturn_wrapper)
ENTRY_DIFF(rt_sigaction) ENTRY_COMP(rt_sigaction)
ENTRY_DIFF(rt_sigprocmask) /* 175 */ ENTRY_COMP(rt_sigprocmask) /* 175 */
ENTRY_DIFF(rt_sigpending) ENTRY_COMP(rt_sigpending)
ENTRY_COMP(rt_sigtimedwait) ENTRY_COMP(rt_sigtimedwait)
/* even though the struct siginfo_t is different, it appears like /* even though the struct siginfo_t is different, it appears like
* all the paths use values which should be same wide and narrow. * all the paths use values which should be same wide and narrow.

View File

@ -143,6 +143,8 @@ config PPC
select MODULES_USE_ELF_RELA select MODULES_USE_ELF_RELA
select CLONE_BACKWARDS select CLONE_BACKWARDS
select ARCH_USE_BUILTIN_BSWAP select ARCH_USE_BUILTIN_BSWAP
select OLD_SIGSUSPEND
select OLD_SIGACTION if PPC32
config EARLY_PRINTK config EARLY_PRINTK
bool bool
@ -153,6 +155,7 @@ config COMPAT
default y if PPC64 default y if PPC64
select COMPAT_BINFMT_ELF select COMPAT_BINFMT_ELF
select ARCH_WANT_OLD_COMPAT_IPC select ARCH_WANT_OLD_COMPAT_IPC
select COMPAT_OLD_SIGACTION
config SYSVIPC_COMPAT config SYSVIPC_COMPAT
bool bool

View File

@ -1,6 +1,7 @@
#ifndef _ASM_POWERPC_SIGNAL_H #ifndef _ASM_POWERPC_SIGNAL_H
#define _ASM_POWERPC_SIGNAL_H #define _ASM_POWERPC_SIGNAL_H
#define __ARCH_HAS_SA_RESTORER
#include <uapi/asm/signal.h> #include <uapi/asm/signal.h>
#endif /* _ASM_POWERPC_SIGNAL_H */ #endif /* _ASM_POWERPC_SIGNAL_H */

View File

@ -5,11 +5,8 @@
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/types.h> #include <linux/types.h>
#include <asm/signal.h>
struct pt_regs;
struct rtas_args; struct rtas_args;
struct sigaction;
asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len, asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len,
unsigned long prot, unsigned long flags, unsigned long prot, unsigned long flags,
@ -17,20 +14,8 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len,
asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len, asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len,
unsigned long prot, unsigned long flags, unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long pgoff); unsigned long fd, unsigned long pgoff);
asmlinkage long sys_pipe(int __user *fildes);
asmlinkage long sys_pipe2(int __user *fildes, int flags);
asmlinkage long sys_rt_sigaction(int sig,
const struct sigaction __user *act,
struct sigaction __user *oact, size_t sigsetsize);
asmlinkage long ppc64_personality(unsigned long personality); asmlinkage long ppc64_personality(unsigned long personality);
asmlinkage int ppc_rtas(struct rtas_args __user *uargs); asmlinkage int ppc_rtas(struct rtas_args __user *uargs);
asmlinkage time_t sys64_time(time_t __user * tloc);
asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset,
size_t sigsetsize);
asmlinkage long sys_sigaltstack(const stack_t __user *uss,
stack_t __user *uoss, unsigned long r5, unsigned long r6,
unsigned long r7, unsigned long r8, struct pt_regs *regs);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* __ASM_POWERPC_SYSCALLS_H */ #endif /* __ASM_POWERPC_SYSCALLS_H */

View File

@ -10,8 +10,8 @@ SYSCALL_SPU(read)
SYSCALL_SPU(write) SYSCALL_SPU(write)
COMPAT_SYS_SPU(open) COMPAT_SYS_SPU(open)
SYSCALL_SPU(close) SYSCALL_SPU(close)
COMPAT_SYS_SPU(waitpid) SYSCALL_SPU(waitpid)
COMPAT_SYS_SPU(creat) SYSCALL_SPU(creat)
SYSCALL_SPU(link) SYSCALL_SPU(link)
SYSCALL_SPU(unlink) SYSCALL_SPU(unlink)
COMPAT_SYS(execve) COMPAT_SYS(execve)
@ -36,13 +36,13 @@ SYSCALL(pause)
COMPAT_SYS(utime) COMPAT_SYS(utime)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
COMPAT_SYS_SPU(access) SYSCALL_SPU(access)
COMPAT_SYS_SPU(nice) SYSCALL_SPU(nice)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
SYSCALL_SPU(sync) SYSCALL_SPU(sync)
COMPAT_SYS_SPU(kill) SYSCALL_SPU(kill)
SYSCALL_SPU(rename) SYSCALL_SPU(rename)
COMPAT_SYS_SPU(mkdir) SYSCALL_SPU(mkdir)
SYSCALL_SPU(rmdir) SYSCALL_SPU(rmdir)
SYSCALL_SPU(dup) SYSCALL_SPU(dup)
SYSCALL_SPU(pipe) SYSCALL_SPU(pipe)
@ -60,10 +60,10 @@ SYSCALL(ni_syscall)
COMPAT_SYS_SPU(ioctl) COMPAT_SYS_SPU(ioctl)
COMPAT_SYS_SPU(fcntl) COMPAT_SYS_SPU(fcntl)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
COMPAT_SYS_SPU(setpgid) SYSCALL_SPU(setpgid)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
SYSX(sys_ni_syscall,sys_olduname, sys_olduname) SYSX(sys_ni_syscall,sys_olduname, sys_olduname)
COMPAT_SYS_SPU(umask) SYSCALL_SPU(umask)
SYSCALL_SPU(chroot) SYSCALL_SPU(chroot)
COMPAT_SYS(ustat) COMPAT_SYS(ustat)
SYSCALL_SPU(dup2) SYSCALL_SPU(dup2)
@ -72,23 +72,24 @@ SYSCALL_SPU(getpgrp)
SYSCALL_SPU(setsid) SYSCALL_SPU(setsid)
SYS32ONLY(sigaction) SYS32ONLY(sigaction)
SYSCALL_SPU(sgetmask) SYSCALL_SPU(sgetmask)
COMPAT_SYS_SPU(ssetmask) SYSCALL_SPU(ssetmask)
SYSCALL_SPU(setreuid) SYSCALL_SPU(setreuid)
SYSCALL_SPU(setregid) SYSCALL_SPU(setregid)
#define compat_sys_sigsuspend sys_sigsuspend
SYS32ONLY(sigsuspend) SYS32ONLY(sigsuspend)
COMPAT_SYS(sigpending) COMPAT_SYS(sigpending)
COMPAT_SYS_SPU(sethostname) SYSCALL_SPU(sethostname)
COMPAT_SYS_SPU(setrlimit) COMPAT_SYS_SPU(setrlimit)
COMPAT_SYS(old_getrlimit) COMPAT_SYS(old_getrlimit)
COMPAT_SYS_SPU(getrusage) COMPAT_SYS_SPU(getrusage)
COMPAT_SYS_SPU(gettimeofday) COMPAT_SYS_SPU(gettimeofday)
COMPAT_SYS_SPU(settimeofday) COMPAT_SYS_SPU(settimeofday)
COMPAT_SYS_SPU(getgroups) SYSCALL_SPU(getgroups)
COMPAT_SYS_SPU(setgroups) SYSCALL_SPU(setgroups)
SYSX(sys_ni_syscall,sys_ni_syscall,ppc_select) SYSX(sys_ni_syscall,sys_ni_syscall,ppc_select)
SYSCALL_SPU(symlink) SYSCALL_SPU(symlink)
OLDSYS(lstat) OLDSYS(lstat)
COMPAT_SYS_SPU(readlink) SYSCALL_SPU(readlink)
SYSCALL(uselib) SYSCALL(uselib)
SYSCALL(swapon) SYSCALL(swapon)
SYSCALL(reboot) SYSCALL(reboot)
@ -99,14 +100,14 @@ COMPAT_SYS_SPU(truncate)
COMPAT_SYS_SPU(ftruncate) COMPAT_SYS_SPU(ftruncate)
SYSCALL_SPU(fchmod) SYSCALL_SPU(fchmod)
SYSCALL_SPU(fchown) SYSCALL_SPU(fchown)
COMPAT_SYS_SPU(getpriority) SYSCALL_SPU(getpriority)
COMPAT_SYS_SPU(setpriority) SYSCALL_SPU(setpriority)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
COMPAT_SYS(statfs) COMPAT_SYS(statfs)
COMPAT_SYS(fstatfs) COMPAT_SYS(fstatfs)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
COMPAT_SYS_SPU(socketcall) COMPAT_SYS_SPU(socketcall)
COMPAT_SYS_SPU(syslog) SYSCALL_SPU(syslog)
COMPAT_SYS_SPU(setitimer) COMPAT_SYS_SPU(setitimer)
COMPAT_SYS_SPU(getitimer) COMPAT_SYS_SPU(getitimer)
COMPAT_SYS_SPU(newstat) COMPAT_SYS_SPU(newstat)
@ -124,7 +125,7 @@ COMPAT_SYS(ipc)
SYSCALL_SPU(fsync) SYSCALL_SPU(fsync)
SYS32ONLY(sigreturn) SYS32ONLY(sigreturn)
PPC_SYS(clone) PPC_SYS(clone)
COMPAT_SYS_SPU(setdomainname) SYSCALL_SPU(setdomainname)
SYSCALL_SPU(newuname) SYSCALL_SPU(newuname)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
COMPAT_SYS_SPU(adjtimex) COMPAT_SYS_SPU(adjtimex)
@ -135,10 +136,10 @@ SYSCALL(init_module)
SYSCALL(delete_module) SYSCALL(delete_module)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
SYSCALL(quotactl) SYSCALL(quotactl)
COMPAT_SYS_SPU(getpgid) SYSCALL_SPU(getpgid)
SYSCALL_SPU(fchdir) SYSCALL_SPU(fchdir)
SYSCALL_SPU(bdflush) SYSCALL_SPU(bdflush)
COMPAT_SYS(sysfs) SYSCALL_SPU(sysfs)
SYSX_SPU(ppc64_personality,ppc64_personality,sys_personality) SYSX_SPU(ppc64_personality,ppc64_personality,sys_personality)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
SYSCALL_SPU(setfsuid) SYSCALL_SPU(setfsuid)
@ -150,21 +151,21 @@ SYSCALL_SPU(flock)
SYSCALL_SPU(msync) SYSCALL_SPU(msync)
COMPAT_SYS_SPU(readv) COMPAT_SYS_SPU(readv)
COMPAT_SYS_SPU(writev) COMPAT_SYS_SPU(writev)
COMPAT_SYS_SPU(getsid) SYSCALL_SPU(getsid)
SYSCALL_SPU(fdatasync) SYSCALL_SPU(fdatasync)
COMPAT_SYS(sysctl) COMPAT_SYS(sysctl)
SYSCALL_SPU(mlock) SYSCALL_SPU(mlock)
SYSCALL_SPU(munlock) SYSCALL_SPU(munlock)
SYSCALL_SPU(mlockall) SYSCALL_SPU(mlockall)
SYSCALL_SPU(munlockall) SYSCALL_SPU(munlockall)
COMPAT_SYS_SPU(sched_setparam) SYSCALL_SPU(sched_setparam)
COMPAT_SYS_SPU(sched_getparam) SYSCALL_SPU(sched_getparam)
COMPAT_SYS_SPU(sched_setscheduler) SYSCALL_SPU(sched_setscheduler)
COMPAT_SYS_SPU(sched_getscheduler) SYSCALL_SPU(sched_getscheduler)
SYSCALL_SPU(sched_yield) SYSCALL_SPU(sched_yield)
COMPAT_SYS_SPU(sched_get_priority_max) SYSCALL_SPU(sched_get_priority_max)
COMPAT_SYS_SPU(sched_get_priority_min) SYSCALL_SPU(sched_get_priority_min)
SYSX_SPU(sys_sched_rr_get_interval,compat_sys_sched_rr_get_interval_wrapper,sys_sched_rr_get_interval) COMPAT_SYS_SPU(sched_rr_get_interval)
COMPAT_SYS_SPU(nanosleep) COMPAT_SYS_SPU(nanosleep)
SYSCALL_SPU(mremap) SYSCALL_SPU(mremap)
SYSCALL_SPU(setresuid) SYSCALL_SPU(setresuid)
@ -174,7 +175,7 @@ SYSCALL_SPU(poll)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
SYSCALL_SPU(setresgid) SYSCALL_SPU(setresgid)
SYSCALL_SPU(getresgid) SYSCALL_SPU(getresgid)
COMPAT_SYS_SPU(prctl) SYSCALL_SPU(prctl)
COMPAT_SYS(rt_sigreturn) COMPAT_SYS(rt_sigreturn)
COMPAT_SYS(rt_sigaction) COMPAT_SYS(rt_sigaction)
COMPAT_SYS(rt_sigprocmask) COMPAT_SYS(rt_sigprocmask)
@ -253,7 +254,7 @@ COMPAT_SYS_SPU(clock_gettime)
COMPAT_SYS_SPU(clock_getres) COMPAT_SYS_SPU(clock_getres)
COMPAT_SYS_SPU(clock_nanosleep) COMPAT_SYS_SPU(clock_nanosleep)
SYSX(ppc64_swapcontext,ppc32_swapcontext,ppc_swapcontext) SYSX(ppc64_swapcontext,ppc32_swapcontext,ppc_swapcontext)
COMPAT_SYS_SPU(tgkill) SYSCALL_SPU(tgkill)
COMPAT_SYS_SPU(utimes) COMPAT_SYS_SPU(utimes)
COMPAT_SYS_SPU(statfs64) COMPAT_SYS_SPU(statfs64)
COMPAT_SYS_SPU(fstatfs64) COMPAT_SYS_SPU(fstatfs64)
@ -276,8 +277,8 @@ COMPAT_SYS(add_key)
COMPAT_SYS(request_key) COMPAT_SYS(request_key)
COMPAT_SYS(keyctl) COMPAT_SYS(keyctl)
COMPAT_SYS(waitid) COMPAT_SYS(waitid)
COMPAT_SYS(ioprio_set) SYSCALL(ioprio_set)
COMPAT_SYS(ioprio_get) SYSCALL(ioprio_get)
SYSCALL(inotify_init) SYSCALL(inotify_init)
SYSCALL(inotify_add_watch) SYSCALL(inotify_add_watch)
SYSCALL(inotify_rm_watch) SYSCALL(inotify_rm_watch)

View File

@ -44,17 +44,13 @@
#define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#ifdef CONFIG_PPC32 #ifdef CONFIG_PPC32
#define __ARCH_WANT_OLD_STAT #define __ARCH_WANT_OLD_STAT
#endif #endif
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
#define __ARCH_WANT_COMPAT_SYS_TIME #define __ARCH_WANT_COMPAT_SYS_TIME
#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_NEWFSTATAT #define __ARCH_WANT_SYS_NEWFSTATAT
#define __ARCH_WANT_COMPAT_SYS_SENDFILE #define __ARCH_WANT_COMPAT_SYS_SENDFILE
#define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
#endif #endif
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK

View File

@ -90,6 +90,7 @@ typedef struct {
#include <asm-generic/signal-defs.h> #include <asm-generic/signal-defs.h>
#ifndef __KERNEL__
struct old_sigaction { struct old_sigaction {
__sighandler_t sa_handler; __sighandler_t sa_handler;
old_sigset_t sa_mask; old_sigset_t sa_mask;
@ -103,10 +104,7 @@ struct sigaction {
__sigrestore_t sa_restorer; __sigrestore_t sa_restorer;
sigset_t sa_mask; /* mask last for extensibility */ sigset_t sa_mask; /* mask last for extensibility */
}; };
#endif
struct k_sigaction {
struct sigaction sa;
};
typedef struct sigaltstack { typedef struct sigaltstack {
void __user *ss_sp; void __user *ss_sp;

View File

@ -16,30 +16,6 @@
/* These are here to support 32-bit syscalls on a 64-bit kernel. */ /* These are here to support 32-bit syscalls on a 64-bit kernel. */
#define __old_sigaction32 old_sigaction32
struct __old_sigaction32 {
compat_uptr_t sa_handler;
compat_old_sigset_t sa_mask;
unsigned int sa_flags;
compat_uptr_t sa_restorer; /* not used by Linux/SPARC yet */
};
struct sigaction32 {
compat_uptr_t sa_handler; /* Really a pointer, but need to deal with 32 bits */
unsigned int sa_flags;
compat_uptr_t sa_restorer; /* Another 32 bit pointer */
compat_sigset_t sa_mask; /* A 32 bit mask */
};
typedef struct sigaltstack_32 {
unsigned int ss_sp;
int ss_flags;
compat_size_t ss_size;
} stack_32_t;
struct pt_regs32 { struct pt_regs32 {
unsigned int gpr[32]; unsigned int gpr[32];
unsigned int nip; unsigned int nip;
@ -75,7 +51,7 @@ struct mcontext32 {
struct ucontext32 { struct ucontext32 {
unsigned int uc_flags; unsigned int uc_flags;
unsigned int uc_link; unsigned int uc_link;
stack_32_t uc_stack; compat_stack_t uc_stack;
int uc_pad[7]; int uc_pad[7];
compat_uptr_t uc_regs; /* points to uc_mcontext field */ compat_uptr_t uc_regs; /* points to uc_mcontext field */
compat_sigset_t uc_sigmask; /* mask last for extensibility */ compat_sigset_t uc_sigmask; /* mask last for extensibility */

View File

@ -170,10 +170,3 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
tracehook_notify_resume(regs); tracehook_notify_resume(regs);
} }
} }
long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
unsigned long r5, unsigned long r6, unsigned long r7,
unsigned long r8, struct pt_regs *regs)
{
return do_sigaltstack(uss, uoss, regs->gpr[1]);
}

View File

@ -57,10 +57,7 @@
#undef DEBUG_SIG #undef DEBUG_SIG
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
#define sys_sigsuspend compat_sys_sigsuspend
#define sys_rt_sigsuspend compat_sys_rt_sigsuspend
#define sys_rt_sigreturn compat_sys_rt_sigreturn #define sys_rt_sigreturn compat_sys_rt_sigreturn
#define sys_sigaction compat_sys_sigaction
#define sys_swapcontext compat_sys_swapcontext #define sys_swapcontext compat_sys_swapcontext
#define sys_sigreturn compat_sys_sigreturn #define sys_sigreturn compat_sys_sigreturn
@ -69,6 +66,8 @@
#define mcontext mcontext32 #define mcontext mcontext32
#define ucontext ucontext32 #define ucontext ucontext32
#define __save_altstack __compat_save_altstack
/* /*
* Userspace code may pass a ucontext which doesn't include VSX added * Userspace code may pass a ucontext which doesn't include VSX added
* at the end. We need to check for this case. * at the end. We need to check for this case.
@ -131,23 +130,6 @@ static inline int get_sigset_t(sigset_t *set,
return 0; return 0;
} }
static inline int get_old_sigaction(struct k_sigaction *new_ka,
struct old_sigaction __user *act)
{
compat_old_sigset_t mask;
compat_uptr_t handler, restorer;
if (get_user(handler, &act->sa_handler) ||
__get_user(restorer, &act->sa_restorer) ||
__get_user(new_ka->sa.sa_flags, &act->sa_flags) ||
__get_user(mask, &act->sa_mask))
return -EFAULT;
new_ka->sa.sa_handler = compat_ptr(handler);
new_ka->sa.sa_restorer = compat_ptr(restorer);
siginitset(&new_ka->sa.sa_mask, mask);
return 0;
}
#define to_user_ptr(p) ptr_to_compat(p) #define to_user_ptr(p) ptr_to_compat(p)
#define from_user_ptr(p) compat_ptr(p) #define from_user_ptr(p) compat_ptr(p)
@ -197,21 +179,6 @@ static inline int get_sigset_t(sigset_t *set, const sigset_t __user *uset)
return copy_from_user(set, uset, sizeof(*uset)); return copy_from_user(set, uset, sizeof(*uset));
} }
static inline int get_old_sigaction(struct k_sigaction *new_ka,
struct old_sigaction __user *act)
{
old_sigset_t mask;
if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
__get_user(new_ka->sa.sa_handler, &act->sa_handler) ||
__get_user(new_ka->sa.sa_restorer, &act->sa_restorer) ||
__get_user(new_ka->sa.sa_flags, &act->sa_flags) ||
__get_user(mask, &act->sa_mask))
return -EFAULT;
siginitset(&new_ka->sa.sa_mask, mask);
return 0;
}
#define to_user_ptr(p) ((unsigned long)(p)) #define to_user_ptr(p) ((unsigned long)(p))
#define from_user_ptr(p) ((void __user *)(p)) #define from_user_ptr(p) ((void __user *)(p))
@ -235,50 +202,8 @@ static inline int restore_general_regs(struct pt_regs *regs,
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
#endif /* CONFIG_PPC64 */
/*
* Atomically swap in the new signal mask, and wait for a signal.
*/
long sys_sigsuspend(old_sigset_t mask)
{
sigset_t blocked;
siginitset(&blocked, mask);
return sigsuspend(&blocked);
}
long sys_sigaction(int sig, struct old_sigaction __user *act,
struct old_sigaction __user *oact)
{
struct k_sigaction new_ka, old_ka;
int ret;
#ifdef CONFIG_PPC64
if (sig < 0)
sig = -sig;
#endif #endif
if (act) {
if (get_old_sigaction(&new_ka, act))
return -EFAULT;
}
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
if (!ret && oact) {
if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
__put_user(to_user_ptr(old_ka.sa.sa_handler),
&oact->sa_handler) ||
__put_user(to_user_ptr(old_ka.sa.sa_restorer),
&oact->sa_restorer) ||
__put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
return -EFAULT;
}
return ret;
}
/* /*
* When we have signals to deliver, we set up on the * When we have signals to deliver, we set up on the
* user stack, going down from the original stack pointer: * user stack, going down from the original stack pointer:
@ -951,89 +876,6 @@ static long restore_tm_user_regs(struct pt_regs *regs,
#endif #endif
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
long compat_sys_rt_sigaction(int sig, const struct sigaction32 __user *act,
struct sigaction32 __user *oact, size_t sigsetsize)
{
struct k_sigaction new_ka, old_ka;
int ret;
/* XXX: Don't preclude handling different sized sigset_t's. */
if (sigsetsize != sizeof(compat_sigset_t))
return -EINVAL;
if (act) {
compat_uptr_t handler;
ret = get_user(handler, &act->sa_handler);
new_ka.sa.sa_handler = compat_ptr(handler);
ret |= get_sigset_t(&new_ka.sa.sa_mask, &act->sa_mask);
ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
if (ret)
return -EFAULT;
}
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
if (!ret && oact) {
ret = put_user(to_user_ptr(old_ka.sa.sa_handler), &oact->sa_handler);
ret |= put_sigset_t(&oact->sa_mask, &old_ka.sa.sa_mask);
ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
}
return ret;
}
/*
* Note: it is necessary to treat how as an unsigned int, with the
* corresponding cast to a signed int to insure that the proper
* conversion (sign extension) between the register representation
* of a signed int (msr in 32-bit mode) and the register representation
* of a signed int (msr in 64-bit mode) is performed.
*/
long compat_sys_rt_sigprocmask(u32 how, compat_sigset_t __user *set,
compat_sigset_t __user *oset, size_t sigsetsize)
{
sigset_t s;
sigset_t __user *up;
int ret;
mm_segment_t old_fs = get_fs();
if (set) {
if (get_sigset_t(&s, set))
return -EFAULT;
}
set_fs(KERNEL_DS);
/* This is valid because of the set_fs() */
up = (sigset_t __user *) &s;
ret = sys_rt_sigprocmask((int)how, set ? up : NULL, oset ? up : NULL,
sigsetsize);
set_fs(old_fs);
if (ret)
return ret;
if (oset) {
if (put_sigset_t(oset, &s))
return -EFAULT;
}
return 0;
}
long compat_sys_rt_sigpending(compat_sigset_t __user *set, compat_size_t sigsetsize)
{
sigset_t s;
int ret;
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);
/* The __user pointer cast is valid because of the set_fs() */
ret = sys_rt_sigpending((sigset_t __user *) &s, sigsetsize);
set_fs(old_fs);
if (!ret) {
if (put_sigset_t(set, &s))
return -EFAULT;
}
return ret;
}
int copy_siginfo_to_user32(struct compat_siginfo __user *d, siginfo_t *s) int copy_siginfo_to_user32(struct compat_siginfo __user *d, siginfo_t *s)
{ {
int err; int err;
@ -1102,79 +944,6 @@ int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from)
return 0; return 0;
} }
/*
* Note: it is necessary to treat pid and sig as unsigned ints, with the
* corresponding cast to a signed int to insure that the proper conversion
* (sign extension) between the register representation of a signed int
* (msr in 32-bit mode) and the register representation of a signed int
* (msr in 64-bit mode) is performed.
*/
long compat_sys_rt_sigqueueinfo(u32 pid, u32 sig, compat_siginfo_t __user *uinfo)
{
siginfo_t info;
int ret;
mm_segment_t old_fs = get_fs();
ret = copy_siginfo_from_user32(&info, uinfo);
if (unlikely(ret))
return ret;
set_fs (KERNEL_DS);
/* The __user pointer cast is valid becasuse of the set_fs() */
ret = sys_rt_sigqueueinfo((int)pid, (int)sig, (siginfo_t __user *) &info);
set_fs (old_fs);
return ret;
}
/*
* Start Alternate signal stack support
*
* System Calls
* sigaltatck compat_sys_sigaltstack
*/
int compat_sys_sigaltstack(u32 __new, u32 __old, int r5,
int r6, int r7, int r8, struct pt_regs *regs)
{
stack_32_t __user * newstack = compat_ptr(__new);
stack_32_t __user * oldstack = compat_ptr(__old);
stack_t uss, uoss;
int ret;
mm_segment_t old_fs;
unsigned long sp;
compat_uptr_t ss_sp;
/*
* set sp to the user stack on entry to the system call
* the system call router sets R9 to the saved registers
*/
sp = regs->gpr[1];
/* Put new stack info in local 64 bit stack struct */
if (newstack) {
if (get_user(ss_sp, &newstack->ss_sp) ||
__get_user(uss.ss_flags, &newstack->ss_flags) ||
__get_user(uss.ss_size, &newstack->ss_size))
return -EFAULT;
uss.ss_sp = compat_ptr(ss_sp);
}
old_fs = get_fs();
set_fs(KERNEL_DS);
/* The __user pointer casts are valid because of the set_fs() */
ret = do_sigaltstack(
newstack ? (stack_t __user *) &uss : NULL,
oldstack ? (stack_t __user *) &uoss : NULL,
sp);
set_fs(old_fs);
/* Copy the stack information to the user output buffer */
if (!ret && oldstack &&
(put_user(ptr_to_compat(uoss.ss_sp), &oldstack->ss_sp) ||
__put_user(uoss.ss_flags, &oldstack->ss_flags) ||
__put_user(uoss.ss_size, &oldstack->ss_size)))
return -EFAULT;
return ret;
}
#endif /* CONFIG_PPC64 */ #endif /* CONFIG_PPC64 */
/* /*
@ -1202,10 +971,7 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
/* Put the siginfo & fill in most of the ucontext */ /* Put the siginfo & fill in most of the ucontext */
if (copy_siginfo_to_user(&rt_sf->info, info) if (copy_siginfo_to_user(&rt_sf->info, info)
|| __put_user(0, &rt_sf->uc.uc_flags) || __put_user(0, &rt_sf->uc.uc_flags)
|| __put_user(current->sas_ss_sp, &rt_sf->uc.uc_stack.ss_sp) || __save_altstack(&rt_sf->uc.uc_stack, regs->gpr[1])
|| __put_user(sas_ss_flags(regs->gpr[1]),
&rt_sf->uc.uc_stack.ss_flags)
|| __put_user(current->sas_ss_size, &rt_sf->uc.uc_stack.ss_size)
|| __put_user(to_user_ptr(&rt_sf->uc.uc_mcontext), || __put_user(to_user_ptr(&rt_sf->uc.uc_mcontext),
&rt_sf->uc.uc_regs) &rt_sf->uc.uc_regs)
|| put_sigset_t(&rt_sf->uc.uc_sigmask, oldset)) || put_sigset_t(&rt_sf->uc.uc_sigmask, oldset))
@ -1494,14 +1260,11 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
* change it. -- paulus * change it. -- paulus
*/ */
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
/* if (compat_restore_altstack(&rt_sf->uc.uc_stack))
* We use the compat_sys_ version that does the 32/64 bits conversion goto bad;
* and takes userland pointer directly. What about error checking ?
* nobody does any...
*/
compat_sys_sigaltstack((u32)(u64)&rt_sf->uc.uc_stack, 0, 0, 0, 0, 0, regs);
#else #else
do_sigaltstack(&rt_sf->uc.uc_stack, NULL, regs->gpr[1]); if (restore_altstack(&rt_sf->uc.uc_stack))
goto bad;
#endif #endif
set_thread_flag(TIF_RESTOREALL); set_thread_flag(TIF_RESTOREALL);
return 0; return 0;
@ -1617,7 +1380,7 @@ int sys_debug_setcontext(struct ucontext __user *ctx,
* always done it up until now so it is probably better not to * always done it up until now so it is probably better not to
* change it. -- paulus * change it. -- paulus
*/ */
do_sigaltstack(&ctx->uc_stack, NULL, regs->gpr[1]); restore_altstack(&ctx->uc_stack);
set_thread_flag(TIF_RESTOREALL); set_thread_flag(TIF_RESTOREALL);
out: out:

View File

@ -676,10 +676,8 @@ int sys_rt_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5,
if (restore_sigcontext(regs, NULL, 1, &uc->uc_mcontext)) if (restore_sigcontext(regs, NULL, 1, &uc->uc_mcontext))
goto badframe; goto badframe;
/* do_sigaltstack expects a __user pointer and won't modify if (restore_altstack(&uc->uc_stack))
* what's in there anyway goto badframe;
*/
do_sigaltstack(&uc->uc_stack, NULL, regs->gpr[1]);
set_thread_flag(TIF_RESTOREALL); set_thread_flag(TIF_RESTOREALL);
return 0; return 0;
@ -723,10 +721,7 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info,
/* Create the ucontext. */ /* Create the ucontext. */
err |= __put_user(0, &frame->uc.uc_flags); err |= __put_user(0, &frame->uc.uc_flags);
err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); err |= __save_altstack(&frame->uc.uc_stack, regs->gpr[1]);
err |= __put_user(sas_ss_flags(regs->gpr[1]),
&frame->uc.uc_stack.ss_flags);
err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
if (MSR_TM_ACTIVE(regs->msr)) { if (MSR_TM_ACTIVE(regs->msr)) {
/* The ucontext_t passed to userland points to the second /* The ucontext_t passed to userland points to the second

View File

@ -61,16 +61,6 @@ asmlinkage long ppc32_select(u32 n, compat_ulong_t __user *inp,
return compat_sys_select((int)n, inp, outp, exp, compat_ptr(tvp_x)); return compat_sys_select((int)n, inp, outp, exp, compat_ptr(tvp_x));
} }
/* Note: it is necessary to treat option as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_sysfs(u32 option, u32 arg1, u32 arg2)
{
return sys_sysfs((int)option, arg1, arg2);
}
#ifdef CONFIG_SYSVIPC #ifdef CONFIG_SYSVIPC
long compat_sys_ipc(u32 call, u32 first, u32 second, u32 third, compat_uptr_t ptr, long compat_sys_ipc(u32 call, u32 first, u32 second, u32 third, compat_uptr_t ptr,
u32 fifth) u32 fifth)
@ -156,125 +146,6 @@ asmlinkage long compat_sys_sendfile64_wrapper(u32 out_fd, u32 in_fd,
(off_t __user *)offset, count); (off_t __user *)offset, count);
} }
/* Note: it is necessary to treat option as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_prctl(u32 option, u32 arg2, u32 arg3, u32 arg4, u32 arg5)
{
return sys_prctl((int)option,
(unsigned long) arg2,
(unsigned long) arg3,
(unsigned long) arg4,
(unsigned long) arg5);
}
/* Note: it is necessary to treat pid as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_sched_rr_get_interval_wrapper(u32 pid,
struct compat_timespec __user *interval)
{
return compat_sys_sched_rr_get_interval((int)pid, interval);
}
/* Note: it is necessary to treat mode as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_access(const char __user * filename, u32 mode)
{
return sys_access(filename, (int)mode);
}
/* Note: it is necessary to treat mode as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_creat(const char __user * pathname, u32 mode)
{
return sys_creat(pathname, (int)mode);
}
/* Note: it is necessary to treat pid and options as unsigned ints,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_waitpid(u32 pid, unsigned int __user * stat_addr, u32 options)
{
return sys_waitpid((int)pid, stat_addr, (int)options);
}
/* Note: it is necessary to treat gidsetsize as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_getgroups(u32 gidsetsize, gid_t __user *grouplist)
{
return sys_getgroups((int)gidsetsize, grouplist);
}
/* Note: it is necessary to treat pid as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_getpgid(u32 pid)
{
return sys_getpgid((int)pid);
}
/* Note: it is necessary to treat pid as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_getsid(u32 pid)
{
return sys_getsid((int)pid);
}
/* Note: it is necessary to treat pid and sig as unsigned ints,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_kill(u32 pid, u32 sig)
{
return sys_kill((int)pid, (int)sig);
}
/* Note: it is necessary to treat mode as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_mkdir(const char __user * pathname, u32 mode)
{
return sys_mkdir(pathname, (int)mode);
}
long compat_sys_nice(u32 increment)
{
/* sign extend increment */
return sys_nice((int)increment);
}
off_t ppc32_lseek(unsigned int fd, u32 offset, unsigned int origin) off_t ppc32_lseek(unsigned int fd, u32 offset, unsigned int origin)
{ {
/* sign extend n */ /* sign extend n */
@ -293,172 +164,6 @@ long compat_sys_ftruncate(int fd, u32 length)
return sys_ftruncate(fd, (int)length); return sys_ftruncate(fd, (int)length);
} }
/* Note: it is necessary to treat bufsiz as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_readlink(const char __user * path, char __user * buf, u32 bufsiz)
{
return sys_readlink(path, buf, (int)bufsiz);
}
/* Note: it is necessary to treat option as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_sched_get_priority_max(u32 policy)
{
return sys_sched_get_priority_max((int)policy);
}
/* Note: it is necessary to treat policy as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_sched_get_priority_min(u32 policy)
{
return sys_sched_get_priority_min((int)policy);
}
/* Note: it is necessary to treat pid as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_sched_getparam(u32 pid, struct sched_param __user *param)
{
return sys_sched_getparam((int)pid, param);
}
/* Note: it is necessary to treat pid as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_sched_getscheduler(u32 pid)
{
return sys_sched_getscheduler((int)pid);
}
/* Note: it is necessary to treat pid as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_sched_setparam(u32 pid, struct sched_param __user *param)
{
return sys_sched_setparam((int)pid, param);
}
/* Note: it is necessary to treat pid and policy as unsigned ints,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_sched_setscheduler(u32 pid, u32 policy, struct sched_param __user *param)
{
return sys_sched_setscheduler((int)pid, (int)policy, param);
}
/* Note: it is necessary to treat len as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_setdomainname(char __user *name, u32 len)
{
return sys_setdomainname(name, (int)len);
}
/* Note: it is necessary to treat gidsetsize as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_setgroups(u32 gidsetsize, gid_t __user *grouplist)
{
return sys_setgroups((int)gidsetsize, grouplist);
}
asmlinkage long compat_sys_sethostname(char __user *name, u32 len)
{
/* sign extend len */
return sys_sethostname(name, (int)len);
}
/* Note: it is necessary to treat pid and pgid as unsigned ints,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_setpgid(u32 pid, u32 pgid)
{
return sys_setpgid((int)pid, (int)pgid);
}
long compat_sys_getpriority(u32 which, u32 who)
{
/* sign extend which and who */
return sys_getpriority((int)which, (int)who);
}
long compat_sys_setpriority(u32 which, u32 who, u32 niceval)
{
/* sign extend which, who and niceval */
return sys_setpriority((int)which, (int)who, (int)niceval);
}
long compat_sys_ioprio_get(u32 which, u32 who)
{
/* sign extend which and who */
return sys_ioprio_get((int)which, (int)who);
}
long compat_sys_ioprio_set(u32 which, u32 who, u32 ioprio)
{
/* sign extend which, who and ioprio */
return sys_ioprio_set((int)which, (int)who, (int)ioprio);
}
/* Note: it is necessary to treat newmask as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_ssetmask(u32 newmask)
{
return sys_ssetmask((int) newmask);
}
asmlinkage long compat_sys_syslog(u32 type, char __user * buf, u32 len)
{
/* sign extend len */
return sys_syslog(type, buf, (int)len);
}
/* Note: it is necessary to treat mask as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage long compat_sys_umask(u32 mask)
{
return sys_umask((int)mask);
}
unsigned long compat_sys_mmap2(unsigned long addr, size_t len, unsigned long compat_sys_mmap2(unsigned long addr, size_t len,
unsigned long prot, unsigned long flags, unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long pgoff) unsigned long fd, unsigned long pgoff)
@ -467,12 +172,6 @@ unsigned long compat_sys_mmap2(unsigned long addr, size_t len,
return sys_mmap(addr, len, prot, flags, fd, pgoff << 12); return sys_mmap(addr, len, prot, flags, fd, pgoff << 12);
} }
long compat_sys_tgkill(u32 tgid, u32 pid, int sig)
{
/* sign extend tgid, pid */
return sys_tgkill((int)tgid, (int)pid, sig);
}
/* /*
* long long munging: * long long munging:
* The 32 bit ABI passes long longs in an odd even register pair. * The 32 bit ABI passes long longs in an odd even register pair.

Some files were not shown because too many files have changed in this diff Show More