|
@@ -46,7 +46,7 @@ SP_R14 = STACK_FRAME_OVERHEAD + __PT_GPRS + 56
|
|
SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 60
|
|
SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 60
|
|
SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2
|
|
SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2
|
|
SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC
|
|
SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC
|
|
-SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP
|
|
|
|
|
|
+SP_SVCNR = STACK_FRAME_OVERHEAD + __PT_SVCNR
|
|
SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE
|
|
SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE
|
|
|
|
|
|
_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
|
|
_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
|
|
@@ -183,11 +183,10 @@ STACK_SIZE = 1 << STACK_SHIFT
|
|
.macro CREATE_STACK_FRAME psworg,savearea
|
|
.macro CREATE_STACK_FRAME psworg,savearea
|
|
s %r15,BASED(.Lc_spsize) # make room for registers & psw
|
|
s %r15,BASED(.Lc_spsize) # make room for registers & psw
|
|
mvc SP_PSW(8,%r15),0(%r12) # move user PSW to stack
|
|
mvc SP_PSW(8,%r15),0(%r12) # move user PSW to stack
|
|
- la %r12,\psworg
|
|
|
|
st %r2,SP_ORIG_R2(%r15) # store original content of gpr 2
|
|
st %r2,SP_ORIG_R2(%r15) # store original content of gpr 2
|
|
- icm %r12,12,__LC_SVC_ILC
|
|
|
|
|
|
+ icm %r12,3,__LC_SVC_ILC
|
|
stm %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack
|
|
stm %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack
|
|
- st %r12,SP_ILC(%r15)
|
|
|
|
|
|
+ st %r12,SP_SVCNR(%r15)
|
|
mvc SP_R12(16,%r15),\savearea # move %r12-%r15 to stack
|
|
mvc SP_R12(16,%r15),\savearea # move %r12-%r15 to stack
|
|
la %r12,0
|
|
la %r12,0
|
|
st %r12,__SF_BACKCHAIN(%r15) # clear back chain
|
|
st %r12,__SF_BACKCHAIN(%r15) # clear back chain
|
|
@@ -264,16 +263,17 @@ sysc_update:
|
|
#endif
|
|
#endif
|
|
sysc_do_svc:
|
|
sysc_do_svc:
|
|
l %r9,__LC_THREAD_INFO # load pointer to thread_info struct
|
|
l %r9,__LC_THREAD_INFO # load pointer to thread_info struct
|
|
- sla %r7,2 # *4 and test for svc 0
|
|
|
|
|
|
+ ltr %r7,%r7 # test for svc 0
|
|
bnz BASED(sysc_nr_ok) # svc number > 0
|
|
bnz BASED(sysc_nr_ok) # svc number > 0
|
|
# svc 0: system call number in %r1
|
|
# svc 0: system call number in %r1
|
|
cl %r1,BASED(.Lnr_syscalls)
|
|
cl %r1,BASED(.Lnr_syscalls)
|
|
bnl BASED(sysc_nr_ok)
|
|
bnl BASED(sysc_nr_ok)
|
|
lr %r7,%r1 # copy svc number to %r7
|
|
lr %r7,%r1 # copy svc number to %r7
|
|
- sla %r7,2 # *4
|
|
|
|
sysc_nr_ok:
|
|
sysc_nr_ok:
|
|
mvc SP_ARGS(4,%r15),SP_R7(%r15)
|
|
mvc SP_ARGS(4,%r15),SP_R7(%r15)
|
|
sysc_do_restart:
|
|
sysc_do_restart:
|
|
|
|
+ sth %r7,SP_SVCNR(%r15)
|
|
|
|
+ sll %r7,2 # svc number *4
|
|
l %r8,BASED(.Lsysc_table)
|
|
l %r8,BASED(.Lsysc_table)
|
|
tm __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
|
|
tm __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
|
|
l %r8,0(%r7,%r8) # get system call addr.
|
|
l %r8,0(%r7,%r8) # get system call addr.
|
|
@@ -376,7 +376,6 @@ sysc_notify_resume:
|
|
sysc_restart:
|
|
sysc_restart:
|
|
ni __TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC
|
|
ni __TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC
|
|
l %r7,SP_R2(%r15) # load new svc number
|
|
l %r7,SP_R2(%r15) # load new svc number
|
|
- sla %r7,2
|
|
|
|
mvc SP_R2(4,%r15),SP_ORIG_R2(%r15) # restore first argument
|
|
mvc SP_R2(4,%r15),SP_ORIG_R2(%r15) # restore first argument
|
|
lm %r2,%r6,SP_R2(%r15) # load svc arguments
|
|
lm %r2,%r6,SP_R2(%r15) # load svc arguments
|
|
b BASED(sysc_do_restart) # restart svc
|
|
b BASED(sysc_do_restart) # restart svc
|
|
@@ -386,7 +385,8 @@ sysc_restart:
|
|
#
|
|
#
|
|
sysc_singlestep:
|
|
sysc_singlestep:
|
|
ni __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP
|
|
ni __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP
|
|
- mvi SP_TRAP+1(%r15),0x28 # set trap indication to pgm check
|
|
|
|
|
|
+ mvi SP_SVCNR(%r15),0xff # set trap indication to pgm check
|
|
|
|
+ mvi SP_SVCNR+1(%r15),0xff
|
|
la %r2,SP_PTREGS(%r15) # address of register-save area
|
|
la %r2,SP_PTREGS(%r15) # address of register-save area
|
|
l %r1,BASED(.Lhandle_per) # load adr. of per handler
|
|
l %r1,BASED(.Lhandle_per) # load adr. of per handler
|
|
la %r14,BASED(sysc_return) # load adr. of system return
|
|
la %r14,BASED(sysc_return) # load adr. of system return
|
|
@@ -407,7 +407,7 @@ sysc_tracesys:
|
|
bnl BASED(sysc_tracenogo)
|
|
bnl BASED(sysc_tracenogo)
|
|
l %r8,BASED(.Lsysc_table)
|
|
l %r8,BASED(.Lsysc_table)
|
|
lr %r7,%r2
|
|
lr %r7,%r2
|
|
- sll %r7,2 # *4
|
|
|
|
|
|
+ sll %r7,2 # svc number *4
|
|
l %r8,0(%r7,%r8)
|
|
l %r8,0(%r7,%r8)
|
|
sysc_tracego:
|
|
sysc_tracego:
|
|
lm %r3,%r6,SP_R3(%r15)
|
|
lm %r3,%r6,SP_R3(%r15)
|
|
@@ -586,7 +586,8 @@ pgm_svcper:
|
|
# per was called from kernel, must be kprobes
|
|
# per was called from kernel, must be kprobes
|
|
#
|
|
#
|
|
kernel_per:
|
|
kernel_per:
|
|
- mvi SP_TRAP+1(%r15),0x28 # set trap indication to pgm check
|
|
|
|
|
|
+ mvi SP_SVCNR(%r15),0xff # set trap indication to pgm check
|
|
|
|
+ mvi SP_SVCNR+1(%r15),0xff
|
|
la %r2,SP_PTREGS(%r15) # address of register-save area
|
|
la %r2,SP_PTREGS(%r15) # address of register-save area
|
|
l %r1,BASED(.Lhandle_per) # load adr. of per handler
|
|
l %r1,BASED(.Lhandle_per) # load adr. of per handler
|
|
la %r14,BASED(sysc_restore)# load adr. of system return
|
|
la %r14,BASED(sysc_restore)# load adr. of system return
|