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:
commit
9e2d59ad58
29
arch/Kconfig
29
arch/Kconfig
@ -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"
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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 */
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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,
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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(¤t->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;
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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]))
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
|
||||||
|
@ -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;
|
||||||
|
@ -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__ */
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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 */
|
||||||
|
@ -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, \
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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(®s, arg1, arg2);
|
return mips_atomic_set(arg1, arg2);
|
||||||
|
|
||||||
case MIPS_FIXADE:
|
case MIPS_FIXADE:
|
||||||
if (arg1 & ~3)
|
if (arg1 & ~3)
|
||||||
|
@ -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
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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)))
|
||||||
|
@ -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
|
||||||
|
@ -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));
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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 */
|
||||||
|
@ -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]);
|
|
||||||
}
|
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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
Loading…
Reference in New Issue
Block a user