CRISv32: handle multiple signals
authorRabin Vincent <rabin@rab.in>
Sun, 8 Feb 2015 17:19:17 +0000 (18:19 +0100)
committerJesper Nilsson <jespern@axis.com>
Wed, 25 Mar 2015 09:53:54 +0000 (10:53 +0100)
commit9a7449d3e975fe5c5ca12b7fea4f4bd69188a5f9
treef0e601428db322438e1c14a054955340804106be
parent0f72e5c0df732658d5e9e3c556c9c6928034e291
CRISv32: handle multiple signals

Al Viro noted that CRIS fails to handle multiple signals.

This fixes the problem for CRISv32 by making it use a C work_pending
handling loop similar to the ARM implementation in 0a267fa6a15d41c
("ARM: 7472/1: pull all work_pending logics into C function").

This also happens to fixes the warnings which currently trigger on
CRISv32 due to do_signal() being called with interrupts disabled.

Test case (should die of the SIGSEGV which gets raised when setting up
the stack for SIGALRM, but instead reaches and executes the _exit(1)):

  #include <unistd.h>
  #include <signal.h>
  #include <sys/time.h>
  #include <err.h>

  static void handler(int sig) { }

  int main(int argc, char *argv[])
  {
   int ret;
   struct itimerval t1 = { .it_value = {1} };
   stack_t ss = {
   .ss_sp = NULL,
   .ss_size = SIGSTKSZ,
   };
   struct sigaction action = {
   .sa_handler = handler,
   .sa_flags = SA_ONSTACK,
   };

   ret = sigaltstack(&ss, NULL);
   if (ret < 0)
   err(1, "sigaltstack");

   sigaction(SIGALRM, &action, NULL);
    setitimer(ITIMER_REAL, &t1, NULL);

   pause();

   _exit(1);

   return 0;
  }

Reported-by: Al Viro <viro@ZenIV.linux.org.uk>
Link: http://lkml.kernel.org/r/20121208074429.GC4939@ZenIV.linux.org.uk
Signed-off-by: Rabin Vincent <rabin@rab.in>
Signed-off-by: Jesper Nilsson <jespern@axis.com>
arch/cris/arch-v32/kernel/entry.S
arch/cris/kernel/ptrace.c