Commit 77f6af778dc23514d897f4fdc7935329285ecb1b

Authored by Jeff Dike
Committed by Linus Torvalds
1 parent 63843c265f

uml: don't try to handle signals on initial process stack

Code running on the initial UML stack can't receive or process signals since
current must be valid when IRQs are handled, and there is no current for this
stack.

So, instead of using UML_LONGJMP and UML_SETJMP, which are careful to save and
restore signal state, and, as a side-effect, handle any deferred signals,
start_idle_thread must use the bare equivalents, which don't do anything with
signals.

Signed-off-by: Jeff Dike <jdike@linux.intel.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 11 additions and 3 deletions Side-by-side Diff

arch/um/os-Linux/skas/process.c
... ... @@ -494,7 +494,15 @@
494 494 SA_ONSTACK | SA_RESTART, SIGUSR1, SIGIO, SIGALRM,
495 495 SIGVTALRM, -1);
496 496  
497   - n = UML_SETJMP(&initial_jmpbuf);
  497 + /*
  498 + * Can't use UML_SETJMP or UML_LONGJMP here because they save
  499 + * and restore signals, with the possible side-effect of
  500 + * trying to handle any signals which came when they were
  501 + * blocked, which can't be done on this stack.
  502 + * Signals must be blocked when jumping back here and restored
  503 + * after returning to the jumper.
  504 + */
  505 + n = setjmp(initial_jmpbuf);
498 506 switch(n){
499 507 case INIT_JMP_NEW_THREAD:
500 508 (*switch_buf)[0].JB_IP = (unsigned long) new_thread_handler;
... ... @@ -504,7 +512,7 @@
504 512 break;
505 513 case INIT_JMP_CALLBACK:
506 514 (*cb_proc)(cb_arg);
507   - UML_LONGJMP(cb_back, 1);
  515 + longjmp(*cb_back, 1);
508 516 break;
509 517 case INIT_JMP_HALT:
510 518 kmalloc_ok = 0;
... ... @@ -515,7 +523,7 @@
515 523 default:
516 524 panic("Bad sigsetjmp return in start_idle_thread - %d\n", n);
517 525 }
518   - UML_LONGJMP(switch_buf, 1);
  526 + longjmp(*switch_buf, 1);
519 527 }
520 528  
521 529 void initial_thread_cb_skas(void (*proc)(void *), void *arg)