|
@@ -494,7 +494,15 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf)
|
|
|
SA_ONSTACK | SA_RESTART, SIGUSR1, SIGIO, SIGALRM,
|
|
|
SIGVTALRM, -1);
|
|
|
|
|
|
- n = UML_SETJMP(&initial_jmpbuf);
|
|
|
+ /*
|
|
|
+ * Can't use UML_SETJMP or UML_LONGJMP here because they save
|
|
|
+ * and restore signals, with the possible side-effect of
|
|
|
+ * trying to handle any signals which came when they were
|
|
|
+ * blocked, which can't be done on this stack.
|
|
|
+ * Signals must be blocked when jumping back here and restored
|
|
|
+ * after returning to the jumper.
|
|
|
+ */
|
|
|
+ n = setjmp(initial_jmpbuf);
|
|
|
switch(n){
|
|
|
case INIT_JMP_NEW_THREAD:
|
|
|
(*switch_buf)[0].JB_IP = (unsigned long) new_thread_handler;
|
|
@@ -504,7 +512,7 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf)
|
|
|
break;
|
|
|
case INIT_JMP_CALLBACK:
|
|
|
(*cb_proc)(cb_arg);
|
|
|
- UML_LONGJMP(cb_back, 1);
|
|
|
+ longjmp(*cb_back, 1);
|
|
|
break;
|
|
|
case INIT_JMP_HALT:
|
|
|
kmalloc_ok = 0;
|
|
@@ -515,7 +523,7 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf)
|
|
|
default:
|
|
|
panic("Bad sigsetjmp return in start_idle_thread - %d\n", n);
|
|
|
}
|
|
|
- UML_LONGJMP(switch_buf, 1);
|
|
|
+ longjmp(*switch_buf, 1);
|
|
|
}
|
|
|
|
|
|
void initial_thread_cb_skas(void (*proc)(void *), void *arg)
|