- llgh %r7,__LC_SVC_INT_CODE # get svc number from lowcore
- stosm 48(%r15),0x03 # reenable interrupts
- GET_THREAD_INFO # load pointer to task_struct to R9
- mvc __THREAD_per+__PER_atmid(2,%r9),__LC_PER_ATMID
- mvc __THREAD_per+__PER_address(8,%r9),__LC_PER_ADDRESS
- mvc __THREAD_per+__PER_access_id(1,%r9),__LC_PER_ACCESS_ID
- slag %r7,%r7,2 # *4 and test for svc 0
- jnz pgm_svcstd
- # svc 0: system call number in %r1
- lghi %r0,NR_syscalls
- clr %r1,%r0
- slag %r7,%r1,2
-pgm_svcstd:
- larl %r10,sys_call_table
-#ifdef CONFIG_S390_SUPPORT
- tm SP_PSW+3(%r15),0x01 # are we running in 31 bit mode ?
- jo pgm_svcper_noemu
- larl %r10,sys_call_table_emu # use 31 bit emulation system calls
-pgm_svcper_noemu:
-#endif
- tm __TI_flags+7(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
- lgf %r8,0(%r7,%r10) # load address of system call routine
- jo pgm_tracesys
- basr %r14,%r8 # call sys_xxxx
- stg %r2,SP_R2(%r15) # store return value (change R2 on stack)
- # ATTENTION: check sys_execve_glue before
- # changing anything here !!
-
-pgm_svcret:
- tm __TI_flags+7(%r9),_TIF_SIGPENDING
- jno pgm_svcper_nosig
- la %r2,SP_PTREGS(%r15) # load pt_regs
- sgr %r3,%r3 # clear *oldset
- brasl %r14,do_signal
-
-pgm_svcper_nosig:
- lhi %r0,__LC_PGM_OLD_PSW # set trap indication back to pgm_chk
- st %r0,SP_TRAP(%r15)
- la %r2,SP_PTREGS(15) # address of register-save area
- larl %r14,sysc_return # load adr. of system return
- jg do_debugger_trap
-#
-# call trace before and after sys_call
-#
-pgm_tracesys:
- la %r2,SP_PTREGS(%r15) # load pt_regs
- la %r3,0
- srlg %r7,%r7,2
- stg %r7,SP_R2(%r15)
- brasl %r14,syscall_trace
- lghi %r0,NR_syscalls
- clg %r0,SP_R2(%r15)
- jnh pgm_svc_nogo
- lg %r7,SP_R2(%r15)
- sllg %r7,%r7,2 # strace wants to change the syscall
- lgf %r8,0(%r7,%r10)
-pgm_svc_go:
- lmg %r3,%r6,SP_R3(%r15)
- lg %r2,SP_ORIG_R2(%r15)
- basr %r14,%r8 # call sys_xxx
- stg %r2,SP_R2(%r15) # store return value
-pgm_svc_nogo:
- tm __TI_flags+7(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
- jno pgm_svcret
- la %r2,SP_PTREGS(%r15) # load pt_regs
- la %r3,1
- larl %r14,pgm_svcret # return point is sysc_return
- jg syscall_trace
+ llgh %r7,__LC_SVC_INT_CODE # get svc number from lowcore
+ GET_THREAD_INFO # load pointer to task_struct to R9
+ lg %r1,__TI_task(%r9)
+ mvc __THREAD_per+__PER_atmid(2,%r1),__LC_PER_ATMID
+ mvc __THREAD_per+__PER_address(8,%r1),__LC_PER_ADDRESS
+ mvc __THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID
+ oi __TI_flags+7(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP
+ stosm 48(%r15),0x03 # reenable interrupts
+ j sysc_do_svc