[S390] add TIF_SYSCALL thread flag
Add an explicit TIF_SYSCALL bit that indicates if a task is inside a system call. The svc_code in the pt_regs structure is now only valid if TIF_SYSCALL is set. With this definition TIF_RESTART_SVC can be replaced with TIF_SYSCALL. Overall do_signal is a bit more readable and it saves a few lines of code. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
@@ -50,11 +50,11 @@ STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER
|
||||
STACK_SIZE = 1 << STACK_SHIFT
|
||||
|
||||
_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
|
||||
_TIF_MCCK_PENDING | _TIF_RESTART_SVC | _TIF_PER_TRAP )
|
||||
_TIF_MCCK_PENDING | _TIF_PER_TRAP )
|
||||
_TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
|
||||
_TIF_MCCK_PENDING)
|
||||
_TIF_SYSCALL = (_TIF_SYSCALL_TRACE>>8 | _TIF_SYSCALL_AUDIT>>8 | \
|
||||
_TIF_SECCOMP>>8 | _TIF_SYSCALL_TRACEPOINT>>8)
|
||||
_TIF_TRACE = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \
|
||||
_TIF_SYSCALL_TRACEPOINT)
|
||||
_TIF_EXIT_SIE = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING)
|
||||
|
||||
#define BASED(name) name-system_call(%r13)
|
||||
@@ -248,9 +248,10 @@ ENTRY(system_call)
|
||||
sysc_saveall:
|
||||
SAVE_ALL_SVC __LC_SVC_OLD_PSW,__LC_SAVE_AREA
|
||||
CREATE_STACK_FRAME __LC_SAVE_AREA
|
||||
lg %r12,__LC_THREAD_INFO # load pointer to thread_info struct
|
||||
mvc SP_PSW(16,%r15),__LC_SVC_OLD_PSW
|
||||
mvc SP_SVC_CODE(4,%r15),__LC_SVC_ILC
|
||||
lg %r12,__LC_THREAD_INFO # load pointer to thread_info struct
|
||||
oi __TI_flags+7(%r12),_TIF_SYSCALL
|
||||
sysc_vtime:
|
||||
UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER
|
||||
sysc_stime:
|
||||
@@ -276,7 +277,7 @@ sysc_nr_ok:
|
||||
larl %r10,sys_call_table_emu # use 31 bit emulation system calls
|
||||
sysc_noemu:
|
||||
#endif
|
||||
tm __TI_flags+6(%r12),_TIF_SYSCALL
|
||||
tm __TI_flags+6(%r12),_TIF_TRACE >> 8
|
||||
mvc SP_ARGS(8,%r15),SP_R7(%r15)
|
||||
lgf %r8,0(%r7,%r10) # load address of system call routine
|
||||
jnz sysc_tracesys
|
||||
@@ -286,23 +287,19 @@ sysc_noemu:
|
||||
sysc_return:
|
||||
LOCKDEP_SYS_EXIT
|
||||
sysc_tif:
|
||||
tm SP_PSW+1(%r15),0x01 # returning to user ?
|
||||
jno sysc_restore
|
||||
tm __TI_flags+7(%r12),_TIF_WORK_SVC
|
||||
jnz sysc_work # there is work to do (signals etc.)
|
||||
ni __TI_flags+7(%r12),255-_TIF_SYSCALL
|
||||
sysc_restore:
|
||||
RESTORE_ALL __LC_RETURN_PSW,1
|
||||
sysc_done:
|
||||
|
||||
#
|
||||
# There is work to do, but first we need to check if we return to userspace.
|
||||
#
|
||||
sysc_work:
|
||||
tm SP_PSW+1(%r15),0x01 # returning to user ?
|
||||
jno sysc_restore
|
||||
|
||||
#
|
||||
# One of the work bits is on. Find out which one.
|
||||
#
|
||||
sysc_work_tif:
|
||||
sysc_work:
|
||||
tm __TI_flags+7(%r12),_TIF_MCCK_PENDING
|
||||
jo sysc_mcck_pending
|
||||
tm __TI_flags+7(%r12),_TIF_NEED_RESCHED
|
||||
@@ -311,8 +308,6 @@ sysc_work_tif:
|
||||
jo sysc_sigpending
|
||||
tm __TI_flags+7(%r12),_TIF_NOTIFY_RESUME
|
||||
jo sysc_notify_resume
|
||||
tm __TI_flags+7(%r12),_TIF_RESTART_SVC
|
||||
jo sysc_restart
|
||||
tm __TI_flags+7(%r12),_TIF_PER_TRAP
|
||||
jo sysc_singlestep
|
||||
j sysc_return # beware of critical section cleanup
|
||||
@@ -338,11 +333,15 @@ sysc_sigpending:
|
||||
ni __TI_flags+7(%r12),255-_TIF_PER_TRAP # clear TIF_PER_TRAP
|
||||
la %r2,SP_PTREGS(%r15) # load pt_regs
|
||||
brasl %r14,do_signal # call do_signal
|
||||
tm __TI_flags+7(%r12),_TIF_RESTART_SVC
|
||||
jo sysc_restart
|
||||
tm __TI_flags+7(%r12),_TIF_PER_TRAP
|
||||
jo sysc_singlestep
|
||||
j sysc_return
|
||||
tm __TI_flags+7(%r12),_TIF_SYSCALL
|
||||
jno sysc_return
|
||||
lmg %r2,%r6,SP_R2(%r15) # load svc arguments
|
||||
lghi %r7,0 # svc 0 returns -ENOSYS
|
||||
lh %r1,SP_SVC_CODE+2(%r15) # load new svc number
|
||||
cghi %r1,NR_syscalls
|
||||
jnl sysc_nr_ok # invalid svc number -> do svc 0
|
||||
slag %r7,%r1,2
|
||||
j sysc_nr_ok # restart svc
|
||||
|
||||
#
|
||||
# _TIF_NOTIFY_RESUME is set, call do_notify_resume
|
||||
@@ -352,25 +351,11 @@ sysc_notify_resume:
|
||||
larl %r14,sysc_return
|
||||
jg do_notify_resume # call do_notify_resume
|
||||
|
||||
#
|
||||
# _TIF_RESTART_SVC is set, set up registers and restart svc
|
||||
#
|
||||
sysc_restart:
|
||||
ni __TI_flags+7(%r12),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC
|
||||
lmg %r2,%r6,SP_R2(%r15) # load svc arguments
|
||||
lghi %r7,0 # svc 0 returns -ENOSYS
|
||||
lh %r1,SP_SVC_CODE+2(%r15) # load new svc number
|
||||
cghi %r1,NR_syscalls
|
||||
jnl sysc_nr_ok # invalid svc number -> do svc 0
|
||||
slag %r7,%r1,2
|
||||
j sysc_nr_ok # restart svc
|
||||
|
||||
#
|
||||
# _TIF_PER_TRAP is set, call do_per_trap
|
||||
#
|
||||
sysc_singlestep:
|
||||
ni __TI_flags+7(%r12),255-_TIF_PER_TRAP # clear TIF_PER_TRAP
|
||||
xc SP_SVC_CODE(4,%r15),SP_SVC_CODE(%r15) # clear svc code
|
||||
ni __TI_flags+7(%r12),255-(_TIF_SYSCALL | _TIF_PER_TRAP)
|
||||
la %r2,SP_PTREGS(%r15) # address of register-save area
|
||||
larl %r14,sysc_return # load adr. of system return
|
||||
jg do_per_trap
|
||||
@@ -397,7 +382,7 @@ sysc_tracego:
|
||||
basr %r14,%r8 # call sys_xxx
|
||||
stg %r2,SP_R2(%r15) # store return value
|
||||
sysc_tracenogo:
|
||||
tm __TI_flags+6(%r12),_TIF_SYSCALL
|
||||
tm __TI_flags+6(%r12),_TIF_TRACE >> 8
|
||||
jz sysc_return
|
||||
la %r2,SP_PTREGS(%r15) # load pt_regs
|
||||
larl %r14,sysc_return # return point is sysc_return
|
||||
@@ -470,7 +455,6 @@ ENTRY(pgm_check_handler)
|
||||
jnz pgm_per # got per exception -> special case
|
||||
SAVE_ALL_PGM __LC_PGM_OLD_PSW,__LC_SAVE_AREA
|
||||
CREATE_STACK_FRAME __LC_SAVE_AREA
|
||||
xc SP_SVC_CODE(4,%r15),SP_SVC_CODE(%r15)
|
||||
mvc SP_PSW(16,%r15),__LC_PGM_OLD_PSW
|
||||
lg %r12,__LC_THREAD_INFO # load pointer to thread_info struct
|
||||
HANDLE_SIE_INTERCEPT
|
||||
@@ -550,9 +534,10 @@ pgm_exit2:
|
||||
pgm_svcper:
|
||||
SAVE_ALL_PGM __LC_SVC_OLD_PSW,__LC_SAVE_AREA
|
||||
CREATE_STACK_FRAME __LC_SAVE_AREA
|
||||
lg %r12,__LC_THREAD_INFO # load pointer to thread_info struct
|
||||
mvc SP_PSW(16,%r15),__LC_SVC_OLD_PSW
|
||||
mvc SP_SVC_CODE(4,%r15),__LC_SVC_ILC
|
||||
lg %r12,__LC_THREAD_INFO # load pointer to thread_info struct
|
||||
oi __TI_flags+7(%r12),(_TIF_SYSCALL | _TIF_PER_TRAP)
|
||||
UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER
|
||||
UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER
|
||||
mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER
|
||||
@@ -561,7 +546,6 @@ pgm_svcper:
|
||||
mvc __THREAD_per_cause(2,%r8),__LC_PER_CAUSE
|
||||
mvc __THREAD_per_address(8,%r8),__LC_PER_ADDRESS
|
||||
mvc __THREAD_per_paid(1,%r8),__LC_PER_PAID
|
||||
oi __TI_flags+7(%r12),_TIF_PER_TRAP # set TIF_PER_TRAP
|
||||
stosm __SF_EMPTY(%r15),0x03 # reenable interrupts
|
||||
lmg %r2,%r6,SP_R2(%r15) # load svc arguments
|
||||
j sysc_do_svc
|
||||
@@ -571,7 +555,6 @@ pgm_svcper:
|
||||
#
|
||||
kernel_per:
|
||||
REENABLE_IRQS
|
||||
xc SP_SVC_CODE(4,%r15),SP_SVC_CODE(%r15) # clear svc number
|
||||
la %r2,SP_PTREGS(%r15) # address of register-save area
|
||||
brasl %r14,do_per_trap
|
||||
j pgm_exit
|
||||
@@ -972,9 +955,11 @@ cleanup_system_call:
|
||||
stg %r15,32(%r12)
|
||||
stg %r11,0(%r12)
|
||||
CREATE_STACK_FRAME __LC_SAVE_AREA
|
||||
mvc 8(8,%r12),__LC_THREAD_INFO
|
||||
lg %r12,__LC_THREAD_INFO
|
||||
mvc SP_PSW(16,%r15),__LC_SVC_OLD_PSW
|
||||
mvc SP_SVC_CODE(4,%r15),__LC_SVC_ILC
|
||||
mvc 8(8,%r12),__LC_THREAD_INFO
|
||||
oi __TI_flags+7(%r12),_TIF_SYSCALL
|
||||
cleanup_vtime:
|
||||
clc __LC_RETURN_PSW+8(8),BASED(cleanup_system_call_insn+24)
|
||||
jhe cleanup_stime
|
||||
|
Reference in New Issue
Block a user