Commit cefeddf3 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://are.twiddle.net/axp-2.6

into home.osdl.org:/home/torvalds/v2.5/linux
parents b2a910c7 3a892a64
...@@ -201,10 +201,13 @@ sys_sigaltstack(const stack_t *uss, stack_t *uoss) ...@@ -201,10 +201,13 @@ sys_sigaltstack(const stack_t *uss, stack_t *uoss)
* Do a signal return; undo the signal stack. * Do a signal return; undo the signal stack.
*/ */
#if _NSIG_WORDS > 1
# error "Non SA_SIGINFO frame needs rearranging"
#endif
struct sigframe struct sigframe
{ {
struct sigcontext sc; struct sigcontext sc;
unsigned long extramask[_NSIG_WORDS-1];
unsigned int retcode[3]; unsigned int retcode[3];
}; };
...@@ -268,19 +271,20 @@ restore_sigcontext(struct sigcontext *sc, struct pt_regs *regs, ...@@ -268,19 +271,20 @@ restore_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
return err; return err;
} }
/* Note that this syscall is also used by setcontext(3) to install
a given sigcontext. This because it's impossible to set *all*
registers and transfer control from userland. */
asmlinkage void asmlinkage void
do_sigreturn(struct sigframe *frame, struct pt_regs *regs, do_sigreturn(struct sigcontext *sc, struct pt_regs *regs,
struct switch_stack *sw) struct switch_stack *sw)
{ {
sigset_t set; sigset_t set;
/* Verify that it's a good sigcontext before using it */ /* Verify that it's a good sigcontext before using it */
if (verify_area(VERIFY_READ, frame, sizeof(*frame))) if (verify_area(VERIFY_READ, sc, sizeof(*sc)))
goto give_sigsegv; goto give_sigsegv;
if (__get_user(set.sig[0], &frame->sc.sc_mask) if (__get_user(set.sig[0], &sc->sc_mask))
|| (_NSIG_WORDS > 1
&& __copy_from_user(&set.sig[1], &frame->extramask,
sizeof(frame->extramask))))
goto give_sigsegv; goto give_sigsegv;
sigdelsetmask(&set, ~_BLOCKABLE); sigdelsetmask(&set, ~_BLOCKABLE);
...@@ -289,7 +293,7 @@ do_sigreturn(struct sigframe *frame, struct pt_regs *regs, ...@@ -289,7 +293,7 @@ do_sigreturn(struct sigframe *frame, struct pt_regs *regs,
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock); spin_unlock_irq(&current->sighand->siglock);
if (restore_sigcontext(&frame->sc, regs, sw)) if (restore_sigcontext(sc, regs, sw))
goto give_sigsegv; goto give_sigsegv;
/* Send SIGTRAP if we're single-stepping: */ /* Send SIGTRAP if we're single-stepping: */
...@@ -314,10 +318,9 @@ do_rt_sigreturn(struct rt_sigframe *frame, struct pt_regs *regs, ...@@ -314,10 +318,9 @@ do_rt_sigreturn(struct rt_sigframe *frame, struct pt_regs *regs,
struct switch_stack *sw) struct switch_stack *sw)
{ {
sigset_t set; sigset_t set;
stack_t st;
/* Verify that it's a good sigcontext before using it */ /* Verify that it's a good ucontext_t before using it */
if (verify_area(VERIFY_READ, frame, sizeof(*frame))) if (verify_area(VERIFY_READ, &frame->uc, sizeof(frame->uc)))
goto give_sigsegv; goto give_sigsegv;
if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
goto give_sigsegv; goto give_sigsegv;
...@@ -331,12 +334,6 @@ do_rt_sigreturn(struct rt_sigframe *frame, struct pt_regs *regs, ...@@ -331,12 +334,6 @@ do_rt_sigreturn(struct rt_sigframe *frame, struct pt_regs *regs,
if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw)) if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw))
goto give_sigsegv; goto give_sigsegv;
if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
goto give_sigsegv;
/* It is more difficult to avoid calling this function than to
call it and ignore errors. */
do_sigaltstack(&st, NULL, rdusp());
/* Send SIGTRAP if we're single-stepping: */ /* Send SIGTRAP if we're single-stepping: */
if (ptrace_cancel_bpt (current)) { if (ptrace_cancel_bpt (current)) {
siginfo_t info; siginfo_t info;
...@@ -437,10 +434,6 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, ...@@ -437,10 +434,6 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
goto give_sigsegv; goto give_sigsegv;
err |= setup_sigcontext(&frame->sc, regs, sw, set->sig[0], oldsp); err |= setup_sigcontext(&frame->sc, regs, sw, set->sig[0], oldsp);
if (_NSIG_WORDS > 1) {
err |= __copy_to_user(frame->extramask, &set->sig[1],
sizeof(frame->extramask));
}
if (err) if (err)
goto give_sigsegv; goto give_sigsegv;
......
...@@ -122,27 +122,19 @@ extern int dump_elf_task_fp(elf_fpreg_t *dest, struct task_struct *task); ...@@ -122,27 +122,19 @@ extern int dump_elf_task_fp(elf_fpreg_t *dest, struct task_struct *task);
instruction set this CPU supports. This is trivial on Alpha, instruction set this CPU supports. This is trivial on Alpha,
but not so on other machines. */ but not so on other machines. */
#define ELF_HWCAP \ #define ELF_HWCAP (~amask(-1))
({ \
/* Sadly, most folks don't yet have assemblers that know about \
amask. This is "amask v0, v0" */ \
register long _v0 __asm("$0") = -1; \
__asm(".long 0x47e00c20" : "=r"(_v0) : "0"(_v0)); \
~_v0; \
})
/* This yields a string that ld.so will use to load implementation /* This yields a string that ld.so will use to load implementation
specific libraries for optimization. This is more specific in specific libraries for optimization. This is more specific in
intent than poking at uname or /proc/cpuinfo. intent than poking at uname or /proc/cpuinfo. */
This might do with checking bwx simultaneously... */
#define ELF_PLATFORM \ #define ELF_PLATFORM \
({ \ ({ \
/* Or "implver v0" ... */ \ enum implver_enum i_ = implver(); \
register long _v0 __asm("$0"); \ ( i_ == IMPLVER_EV4 ? "ev4" \
__asm(".long 0x47e03d80" : "=r"(_v0)); \ : i_ == IMPLVER_EV5 \
_v0 == 0 ? "ev4" : "ev5"; \ ? (amask(AMASK_BWX) ? "ev5" : "ev56") \
: amask (AMASK_CIX) ? "ev6" : "ev67"); \
}) })
#ifdef __KERNEL__ #ifdef __KERNEL__
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment