aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/os-Linux/skas/process.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/os-Linux/skas/process.c')
-rw-r--r--arch/um/os-Linux/skas/process.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c
index 5b1943dc15e9..1f39f2bf7ce9 100644
--- a/arch/um/os-Linux/skas/process.c
+++ b/arch/um/os-Linux/skas/process.c
@@ -494,7 +494,15 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf)
494 SA_ONSTACK | SA_RESTART, SIGUSR1, SIGIO, SIGALRM, 494 SA_ONSTACK | SA_RESTART, SIGUSR1, SIGIO, SIGALRM,
495 SIGVTALRM, -1); 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 switch(n){ 506 switch(n){
499 case INIT_JMP_NEW_THREAD: 507 case INIT_JMP_NEW_THREAD:
500 (*switch_buf)[0].JB_IP = (unsigned long) new_thread_handler; 508 (*switch_buf)[0].JB_IP = (unsigned long) new_thread_handler;
@@ -504,7 +512,7 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf)
504 break; 512 break;
505 case INIT_JMP_CALLBACK: 513 case INIT_JMP_CALLBACK:
506 (*cb_proc)(cb_arg); 514 (*cb_proc)(cb_arg);
507 UML_LONGJMP(cb_back, 1); 515 longjmp(*cb_back, 1);
508 break; 516 break;
509 case INIT_JMP_HALT: 517 case INIT_JMP_HALT:
510 kmalloc_ok = 0; 518 kmalloc_ok = 0;
@@ -515,7 +523,7 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf)
515 default: 523 default:
516 panic("Bad sigsetjmp return in start_idle_thread - %d\n", n); 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
521void initial_thread_cb_skas(void (*proc)(void *), void *arg) 529void initial_thread_cb_skas(void (*proc)(void *), void *arg)