|
@@ -47,11 +47,11 @@ SP_SVC_CODE = STACK_FRAME_OVERHEAD + __PT_SVC_CODE
|
|
|
SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE
|
|
|
|
|
|
_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)
|
|
|
|
|
|
STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER
|
|
|
STACK_SIZE = 1 << STACK_SHIFT
|
|
@@ -227,9 +227,10 @@ ENTRY(system_call)
|
|
|
sysc_saveall:
|
|
|
SAVE_ALL_SVC __LC_SVC_OLD_PSW,__LC_SAVE_AREA
|
|
|
CREATE_STACK_FRAME __LC_SAVE_AREA
|
|
|
+ l %r12,__LC_THREAD_INFO # load pointer to thread_info struct
|
|
|
mvc SP_PSW(8,%r15),__LC_SVC_OLD_PSW
|
|
|
mvc SP_SVC_CODE(4,%r15),__LC_SVC_ILC
|
|
|
- l %r12,__LC_THREAD_INFO # load pointer to thread_info struct
|
|
|
+ oi __TI_flags+3(%r12),_TIF_SYSCALL
|
|
|
sysc_vtime:
|
|
|
UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER
|
|
|
sysc_stime:
|
|
@@ -248,7 +249,7 @@ sysc_do_svc:
|
|
|
sysc_nr_ok:
|
|
|
sll %r7,2 # svc number *4
|
|
|
l %r10,BASED(.Lsysc_table)
|
|
|
- tm __TI_flags+2(%r12),_TIF_SYSCALL
|
|
|
+ tm __TI_flags+2(%r12),_TIF_TRACE >> 8
|
|
|
mvc SP_ARGS(4,%r15),SP_R7(%r15)
|
|
|
l %r8,0(%r7,%r10) # get system call addr.
|
|
|
bnz BASED(sysc_tracesys)
|
|
@@ -258,23 +259,19 @@ sysc_nr_ok:
|
|
|
sysc_return:
|
|
|
LOCKDEP_SYS_EXIT
|
|
|
sysc_tif:
|
|
|
+ tm SP_PSW+1(%r15),0x01 # returning to user ?
|
|
|
+ bno BASED(sysc_restore)
|
|
|
tm __TI_flags+3(%r12),_TIF_WORK_SVC
|
|
|
bnz BASED(sysc_work) # there is work to do (signals etc.)
|
|
|
+ ni __TI_flags+3(%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 ?
|
|
|
- bno BASED(sysc_restore)
|
|
|
-
|
|
|
#
|
|
|
# One of the work bits is on. Find out which one.
|
|
|
#
|
|
|
-sysc_work_tif:
|
|
|
+sysc_work:
|
|
|
tm __TI_flags+3(%r12),_TIF_MCCK_PENDING
|
|
|
bo BASED(sysc_mcck_pending)
|
|
|
tm __TI_flags+3(%r12),_TIF_NEED_RESCHED
|
|
@@ -283,8 +280,6 @@ sysc_work_tif:
|
|
|
bo BASED(sysc_sigpending)
|
|
|
tm __TI_flags+3(%r12),_TIF_NOTIFY_RESUME
|
|
|
bo BASED(sysc_notify_resume)
|
|
|
- tm __TI_flags+3(%r12),_TIF_RESTART_SVC
|
|
|
- bo BASED(sysc_restart)
|
|
|
tm __TI_flags+3(%r12),_TIF_PER_TRAP
|
|
|
bo BASED(sysc_singlestep)
|
|
|
b BASED(sysc_return) # beware of critical section cleanup
|
|
@@ -313,11 +308,14 @@ sysc_sigpending:
|
|
|
la %r2,SP_PTREGS(%r15) # load pt_regs
|
|
|
l %r1,BASED(.Ldo_signal)
|
|
|
basr %r14,%r1 # call do_signal
|
|
|
- tm __TI_flags+3(%r12),_TIF_RESTART_SVC
|
|
|
- bo BASED(sysc_restart)
|
|
|
- tm __TI_flags+3(%r12),_TIF_PER_TRAP
|
|
|
- bo BASED(sysc_singlestep)
|
|
|
- b BASED(sysc_return)
|
|
|
+ tm __TI_flags+3(%r12),_TIF_SYSCALL
|
|
|
+ bno BASED(sysc_return)
|
|
|
+ lm %r2,%r6,SP_R2(%r15) # load svc arguments
|
|
|
+ xr %r7,%r7 # svc 0 returns -ENOSYS
|
|
|
+ clc SP_SVC_CODE+2(2,%r15),BASED(.Lnr_syscalls+2)
|
|
|
+ bnl BASED(sysc_nr_ok) # invalid svc number -> do svc 0
|
|
|
+ icm %r7,3,SP_SVC_CODE+2(%r15)# load new svc number
|
|
|
+ b BASED(sysc_nr_ok) # restart svc
|
|
|
|
|
|
#
|
|
|
# _TIF_NOTIFY_RESUME is set, call do_notify_resume
|
|
@@ -328,25 +326,11 @@ sysc_notify_resume:
|
|
|
la %r14,BASED(sysc_return)
|
|
|
br %r1 # call do_notify_resume
|
|
|
|
|
|
-
|
|
|
-#
|
|
|
-# _TIF_RESTART_SVC is set, set up registers and restart svc
|
|
|
-#
|
|
|
-sysc_restart:
|
|
|
- ni __TI_flags+3(%r12),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC
|
|
|
- lm %r2,%r6,SP_R2(%r15) # load svc arguments
|
|
|
- xr %r7,%r7 # svc 0 returns -ENOSYS
|
|
|
- clc SP_SVC_CODE+2(%r15),BASED(.Lnr_syscalls+2)
|
|
|
- bnl BASED(sysc_nr_ok) # invalid svc number -> do svc 0
|
|
|
- icm %r7,3,SP_SVC_CODE+2(%r15)# load new svc number
|
|
|
- b BASED(sysc_nr_ok) # restart svc
|
|
|
-
|
|
|
#
|
|
|
# _TIF_PER_TRAP is set, call do_per_trap
|
|
|
#
|
|
|
sysc_singlestep:
|
|
|
- ni __TI_flags+3(%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+3(%r12),255-(_TIF_SYSCALL | _TIF_PER_TRAP)
|
|
|
la %r2,SP_PTREGS(%r15) # address of register-save area
|
|
|
l %r1,BASED(.Lhandle_per) # load adr. of per handler
|
|
|
la %r14,BASED(sysc_return) # load adr. of system return
|
|
@@ -376,7 +360,7 @@ sysc_tracego:
|
|
|
basr %r14,%r8 # call sys_xxx
|
|
|
st %r2,SP_R2(%r15) # store return value
|
|
|
sysc_tracenogo:
|
|
|
- tm __TI_flags+2(%r12),_TIF_SYSCALL
|
|
|
+ tm __TI_flags+2(%r12),_TIF_TRACE >> 8
|
|
|
bz BASED(sysc_return)
|
|
|
l %r1,BASED(.Ltrace_exit)
|
|
|
la %r2,SP_PTREGS(%r15) # load pt_regs
|
|
@@ -454,7 +438,6 @@ ENTRY(pgm_check_handler)
|
|
|
bnz BASED(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(8,%r15),__LC_PGM_OLD_PSW
|
|
|
l %r12,__LC_THREAD_INFO # load pointer to thread_info struct
|
|
|
tm SP_PSW+1(%r15),0x01 # interrupting from user ?
|
|
@@ -530,9 +513,10 @@ pgm_exit2:
|
|
|
pgm_svcper:
|
|
|
SAVE_ALL_PGM __LC_SVC_OLD_PSW,__LC_SAVE_AREA
|
|
|
CREATE_STACK_FRAME __LC_SAVE_AREA
|
|
|
+ l %r12,__LC_THREAD_INFO # load pointer to thread_info struct
|
|
|
mvc SP_PSW(8,%r15),__LC_SVC_OLD_PSW
|
|
|
mvc SP_SVC_CODE(4,%r15),__LC_SVC_ILC
|
|
|
- l %r12,__LC_THREAD_INFO # load pointer to thread_info struct
|
|
|
+ oi __TI_flags+3(%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
|
|
@@ -540,7 +524,6 @@ pgm_svcper:
|
|
|
mvc __THREAD_per_cause(2,%r8),__LC_PER_CAUSE
|
|
|
mvc __THREAD_per_address(4,%r8),__LC_PER_ADDRESS
|
|
|
mvc __THREAD_per_paid(1,%r8),__LC_PER_PAID
|
|
|
- oi __TI_flags+3(%r12),_TIF_PER_TRAP # set TIF_PER_TRAP
|
|
|
stosm __SF_EMPTY(%r15),0x03 # reenable interrupts
|
|
|
lm %r2,%r6,SP_R2(%r15) # load svc arguments
|
|
|
b BASED(sysc_do_svc)
|
|
@@ -550,7 +533,6 @@ pgm_svcper:
|
|
|
#
|
|
|
kernel_per:
|
|
|
REENABLE_IRQS
|
|
|
- xc SP_SVC_CODE(4,%r15),SP_SVC_CODE(%r15)
|
|
|
la %r2,SP_PTREGS(%r15) # address of register-save area
|
|
|
l %r1,BASED(.Lhandle_per) # load adr. of per handler
|
|
|
basr %r14,%r1 # branch to do_single_step
|
|
@@ -965,9 +947,11 @@ cleanup_system_call:
|
|
|
s %r15,BASED(.Lc_spsize) # make room for registers & psw
|
|
|
st %r15,12(%r12)
|
|
|
CREATE_STACK_FRAME __LC_SAVE_AREA
|
|
|
+ mvc 0(4,%r12),__LC_THREAD_INFO
|
|
|
+ l %r12,__LC_THREAD_INFO
|
|
|
mvc SP_PSW(8,%r15),__LC_SVC_OLD_PSW
|
|
|
mvc SP_SVC_CODE(4,%r15),__LC_SVC_ILC
|
|
|
- mvc 0(4,%r12),__LC_THREAD_INFO
|
|
|
+ oi __TI_flags+3(%r12),_TIF_SYSCALL
|
|
|
cleanup_vtime:
|
|
|
clc __LC_RETURN_PSW+4(4),BASED(cleanup_system_call_insn+12)
|
|
|
bhe BASED(cleanup_stime)
|