Skip to content
  • Rabin Vincent's avatar
    CRISv32: handle multiple signals · 9a7449d3
    Rabin Vincent authored
    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 0a267fa6
    
    
    ("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: default avatarAl Viro <viro@ZenIV.linux.org.uk>
    Link: http://lkml.kernel.org/r/20121208074429.GC4939@ZenIV.linux.org.uk
    
    
    Signed-off-by: default avatarRabin Vincent <rabin@rab.in>
    Signed-off-by: default avatarJesper Nilsson <jespern@axis.com>
    9a7449d3