diff options
Diffstat (limited to 'arch/um')
-rw-r--r-- | arch/um/kernel/skas/process.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/arch/um/kernel/skas/process.c b/arch/um/kernel/skas/process.c index 4dc13bc8cfd8..773cd2b525fc 100644 --- a/arch/um/kernel/skas/process.c +++ b/arch/um/kernel/skas/process.c | |||
@@ -201,6 +201,11 @@ void userspace(union uml_pt_regs *regs) | |||
201 | } | 201 | } |
202 | } | 202 | } |
203 | } | 203 | } |
204 | #define INIT_JMP_NEW_THREAD 0 | ||
205 | #define INIT_JMP_REMOVE_SIGSTACK 1 | ||
206 | #define INIT_JMP_CALLBACK 2 | ||
207 | #define INIT_JMP_HALT 3 | ||
208 | #define INIT_JMP_REBOOT 4 | ||
204 | 209 | ||
205 | void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr, | 210 | void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr, |
206 | void (*handler)(int)) | 211 | void (*handler)(int)) |
@@ -236,7 +241,7 @@ void thread_wait(void *sw, void *fb) | |||
236 | *switch_buf = &buf; | 241 | *switch_buf = &buf; |
237 | fork_buf = fb; | 242 | fork_buf = fb; |
238 | if(sigsetjmp(buf, 1) == 0) | 243 | if(sigsetjmp(buf, 1) == 0) |
239 | siglongjmp(*fork_buf, 1); | 244 | siglongjmp(*fork_buf, INIT_JMP_REMOVE_SIGSTACK); |
240 | } | 245 | } |
241 | 246 | ||
242 | void switch_threads(void *me, void *next) | 247 | void switch_threads(void *me, void *next) |
@@ -266,21 +271,25 @@ int start_idle_thread(void *stack, void *switch_buf_ptr, void **fork_buf_ptr) | |||
266 | 271 | ||
267 | *fork_buf_ptr = &initial_jmpbuf; | 272 | *fork_buf_ptr = &initial_jmpbuf; |
268 | n = sigsetjmp(initial_jmpbuf, 1); | 273 | n = sigsetjmp(initial_jmpbuf, 1); |
269 | if(n == 0) | 274 | switch(n){ |
270 | new_thread_proc((void *) stack, new_thread_handler); | 275 | case INIT_JMP_NEW_THREAD: |
271 | else if(n == 1) | 276 | new_thread_proc((void *) stack, new_thread_handler); |
272 | remove_sigstack(); | 277 | break; |
273 | else if(n == 2){ | 278 | case INIT_JMP_REMOVE_SIGSTACK: |
279 | remove_sigstack(); | ||
280 | break; | ||
281 | case INIT_JMP_CALLBACK: | ||
274 | (*cb_proc)(cb_arg); | 282 | (*cb_proc)(cb_arg); |
275 | siglongjmp(*cb_back, 1); | 283 | siglongjmp(*cb_back, 1); |
276 | } | 284 | break; |
277 | else if(n == 3){ | 285 | case INIT_JMP_HALT: |
278 | kmalloc_ok = 0; | 286 | kmalloc_ok = 0; |
279 | return(0); | 287 | return(0); |
280 | } | 288 | case INIT_JMP_REBOOT: |
281 | else if(n == 4){ | ||
282 | kmalloc_ok = 0; | 289 | kmalloc_ok = 0; |
283 | return(1); | 290 | return(1); |
291 | default: | ||
292 | panic("Bad sigsetjmp return in start_idle_thread - %d\n", n); | ||
284 | } | 293 | } |
285 | siglongjmp(**switch_buf, 1); | 294 | siglongjmp(**switch_buf, 1); |
286 | } | 295 | } |
@@ -305,7 +314,7 @@ void initial_thread_cb_skas(void (*proc)(void *), void *arg) | |||
305 | 314 | ||
306 | block_signals(); | 315 | block_signals(); |
307 | if(sigsetjmp(here, 1) == 0) | 316 | if(sigsetjmp(here, 1) == 0) |
308 | siglongjmp(initial_jmpbuf, 2); | 317 | siglongjmp(initial_jmpbuf, INIT_JMP_CALLBACK); |
309 | unblock_signals(); | 318 | unblock_signals(); |
310 | 319 | ||
311 | cb_proc = NULL; | 320 | cb_proc = NULL; |
@@ -316,13 +325,13 @@ void initial_thread_cb_skas(void (*proc)(void *), void *arg) | |||
316 | void halt_skas(void) | 325 | void halt_skas(void) |
317 | { | 326 | { |
318 | block_signals(); | 327 | block_signals(); |
319 | siglongjmp(initial_jmpbuf, 3); | 328 | siglongjmp(initial_jmpbuf, INIT_JMP_HALT); |
320 | } | 329 | } |
321 | 330 | ||
322 | void reboot_skas(void) | 331 | void reboot_skas(void) |
323 | { | 332 | { |
324 | block_signals(); | 333 | block_signals(); |
325 | siglongjmp(initial_jmpbuf, 4); | 334 | siglongjmp(initial_jmpbuf, INIT_JMP_REBOOT); |
326 | } | 335 | } |
327 | 336 | ||
328 | void switch_mm_skas(int mm_fd) | 337 | void switch_mm_skas(int mm_fd) |