diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2007-04-27 10:01:40 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2007-04-27 10:01:42 -0400 |
commit | 03ff9a235a0602724fc54916469b6e0939c62c9b (patch) | |
tree | 86ab2236897eb59542be2ccd667d6ca221153a44 /arch/s390/kernel/entry64.S | |
parent | ef99516c9646802c3d38c3eb83de302e05b3c1b5 (diff) |
[S390] System call cleanup.
Remove system call glue for sys_clone, sys_fork, sys_vfork, sys_execve,
sys_sigreturn, sys_rt_sigreturn and sys_sigaltstack. Call do_execve from
kernel_execve directly, move pt_regs to the right place and branch to
sysc_return to start the user space program. This removes the last
in-kernel system call.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/entry64.S')
-rw-r--r-- | arch/s390/kernel/entry64.S | 100 |
1 files changed, 28 insertions, 72 deletions
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 0f758c329a5d..93745fd8f555 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -244,8 +244,6 @@ sysc_noemu: | |||
244 | jnz sysc_tracesys | 244 | jnz sysc_tracesys |
245 | basr %r14,%r8 # call sys_xxxx | 245 | basr %r14,%r8 # call sys_xxxx |
246 | stg %r2,SP_R2(%r15) # store return value (change R2 on stack) | 246 | stg %r2,SP_R2(%r15) # store return value (change R2 on stack) |
247 | # ATTENTION: check sys_execve_glue before | ||
248 | # changing anything here !! | ||
249 | 247 | ||
250 | sysc_return: | 248 | sysc_return: |
251 | tm SP_PSW+1(%r15),0x01 # returning to user ? | 249 | tm SP_PSW+1(%r15),0x01 # returning to user ? |
@@ -371,77 +369,35 @@ ret_from_fork: | |||
371 | j sysc_return | 369 | j sysc_return |
372 | 370 | ||
373 | # | 371 | # |
374 | # clone, fork, vfork, exec and sigreturn need glue, | 372 | # kernel_execve function needs to deal with pt_regs that is not |
375 | # because they all expect pt_regs as parameter, | 373 | # at the usual place |
376 | # but are called with different parameter. | ||
377 | # return-address is set up above | ||
378 | # | 374 | # |
379 | sys_clone_glue: | 375 | .globl kernel_execve |
380 | la %r2,SP_PTREGS(%r15) # load pt_regs | 376 | kernel_execve: |
381 | jg sys_clone # branch to sys_clone | 377 | stmg %r12,%r15,96(%r15) |
382 | 378 | lgr %r14,%r15 | |
383 | #ifdef CONFIG_COMPAT | 379 | aghi %r15,-SP_SIZE |
384 | sys32_clone_glue: | 380 | stg %r14,__SF_BACKCHAIN(%r15) |
385 | la %r2,SP_PTREGS(%r15) # load pt_regs | 381 | la %r12,SP_PTREGS(%r15) |
386 | jg sys32_clone # branch to sys32_clone | 382 | xc 0(__PT_SIZE,%r12),0(%r12) |
387 | #endif | 383 | lgr %r5,%r12 |
388 | 384 | brasl %r14,do_execve | |
389 | sys_fork_glue: | 385 | ltgfr %r2,%r2 |
390 | la %r2,SP_PTREGS(%r15) # load pt_regs | 386 | je 0f |
391 | jg sys_fork # branch to sys_fork | 387 | aghi %r15,SP_SIZE |
392 | 388 | lmg %r12,%r15,96(%r15) | |
393 | sys_vfork_glue: | 389 | br %r14 |
394 | la %r2,SP_PTREGS(%r15) # load pt_regs | 390 | # execve succeeded. |
395 | jg sys_vfork # branch to sys_vfork | 391 | 0: stnsm __SF_EMPTY(%r15),0xfc # disable interrupts |
396 | 392 | lg %r15,__LC_KERNEL_STACK # load ksp | |
397 | sys_execve_glue: | 393 | aghi %r15,-SP_SIZE # make room for registers & psw |
398 | la %r2,SP_PTREGS(%r15) # load pt_regs | 394 | lg %r13,__LC_SVC_NEW_PSW+8 |
399 | lgr %r12,%r14 # save return address | 395 | lg %r9,__LC_THREAD_INFO |
400 | brasl %r14,sys_execve # call sys_execve | 396 | mvc SP_PTREGS(__PT_SIZE,%r15),0(%r12) # copy pt_regs |
401 | ltgr %r2,%r2 # check if execve failed | 397 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
402 | bnz 0(%r12) # it did fail -> store result in gpr2 | 398 | stosm __SF_EMPTY(%r15),0x03 # reenable interrupts |
403 | b 6(%r12) # SKIP STG 2,SP_R2(15) in | 399 | brasl %r14,execve_tail |
404 | # system_call/sysc_tracesys | 400 | j sysc_return |
405 | #ifdef CONFIG_COMPAT | ||
406 | sys32_execve_glue: | ||
407 | la %r2,SP_PTREGS(%r15) # load pt_regs | ||
408 | lgr %r12,%r14 # save return address | ||
409 | brasl %r14,sys32_execve # call sys32_execve | ||
410 | ltgr %r2,%r2 # check if execve failed | ||
411 | bnz 0(%r12) # it did fail -> store result in gpr2 | ||
412 | b 6(%r12) # SKIP STG 2,SP_R2(15) in | ||
413 | # system_call/sysc_tracesys | ||
414 | #endif | ||
415 | |||
416 | sys_sigreturn_glue: | ||
417 | la %r2,SP_PTREGS(%r15) # load pt_regs as parameter | ||
418 | jg sys_sigreturn # branch to sys_sigreturn | ||
419 | |||
420 | #ifdef CONFIG_COMPAT | ||
421 | sys32_sigreturn_glue: | ||
422 | la %r2,SP_PTREGS(%r15) # load pt_regs as parameter | ||
423 | jg sys32_sigreturn # branch to sys32_sigreturn | ||
424 | #endif | ||
425 | |||
426 | sys_rt_sigreturn_glue: | ||
427 | la %r2,SP_PTREGS(%r15) # load pt_regs as parameter | ||
428 | jg sys_rt_sigreturn # branch to sys_sigreturn | ||
429 | |||
430 | #ifdef CONFIG_COMPAT | ||
431 | sys32_rt_sigreturn_glue: | ||
432 | la %r2,SP_PTREGS(%r15) # load pt_regs as parameter | ||
433 | jg sys32_rt_sigreturn # branch to sys32_sigreturn | ||
434 | #endif | ||
435 | |||
436 | sys_sigaltstack_glue: | ||
437 | la %r4,SP_PTREGS(%r15) # load pt_regs as parameter | ||
438 | jg sys_sigaltstack # branch to sys_sigreturn | ||
439 | |||
440 | #ifdef CONFIG_COMPAT | ||
441 | sys32_sigaltstack_glue: | ||
442 | la %r4,SP_PTREGS(%r15) # load pt_regs as parameter | ||
443 | jg sys32_sigaltstack_wrapper # branch to sys_sigreturn | ||
444 | #endif | ||
445 | 401 | ||
446 | /* | 402 | /* |
447 | * Program check handler routine | 403 | * Program check handler routine |