aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/entry.S
diff options
context:
space:
mode:
authorMartin Schwidefsky <schwidefsky@de.ibm.com>2011-01-05 06:48:10 -0500
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>2011-01-05 06:47:31 -0500
commit5e9a26928f550157563cfc06ce12c4ae121a02ec (patch)
treefc58668f8c6151a5f58c0430f92a0691d727af42 /arch/s390/kernel/entry.S
parentda7f51c11d5fedca9ba779ee220063ccb4f0a27e (diff)
[S390] ptrace cleanup
Overhaul program event recording and the code dealing with the ptrace user space interface. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/entry.S')
-rw-r--r--arch/s390/kernel/entry.S70
1 files changed, 30 insertions, 40 deletions
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S
index af8bd3b90a26..648f64239a9d 100644
--- a/arch/s390/kernel/entry.S
+++ b/arch/s390/kernel/entry.S
@@ -48,7 +48,7 @@ SP_SVCNR = STACK_FRAME_OVERHEAD + __PT_SVCNR
48SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE 48SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE
49 49
50_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ 50_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
51 _TIF_MCCK_PENDING | _TIF_RESTART_SVC | _TIF_SINGLE_STEP ) 51 _TIF_MCCK_PENDING | _TIF_RESTART_SVC | _TIF_PER_TRAP )
52_TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ 52_TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
53 _TIF_MCCK_PENDING) 53 _TIF_MCCK_PENDING)
54_TIF_SYSCALL = (_TIF_SYSCALL_TRACE>>8 | _TIF_SYSCALL_AUDIT>>8 | \ 54_TIF_SYSCALL = (_TIF_SYSCALL_TRACE>>8 | _TIF_SYSCALL_AUDIT>>8 | \
@@ -200,31 +200,21 @@ STACK_SIZE = 1 << STACK_SHIFT
200 .globl __switch_to 200 .globl __switch_to
201__switch_to: 201__switch_to:
202 basr %r1,0 202 basr %r1,0
203__switch_to_base: 2030: l %r4,__THREAD_info(%r2) # get thread_info of prev
204 tm __THREAD_per(%r3),0xe8 # new process is using per ? 204 l %r5,__THREAD_info(%r3) # get thread_info of next
205 bz __switch_to_noper-__switch_to_base(%r1) # if not we're fine
206 stctl %c9,%c11,__SF_EMPTY(%r15) # We are using per stuff
207 clc __THREAD_per(12,%r3),__SF_EMPTY(%r15)
208 be __switch_to_noper-__switch_to_base(%r1) # we got away w/o bashing TLB's
209 lctl %c9,%c11,__THREAD_per(%r3) # Nope we didn't
210__switch_to_noper:
211 l %r4,__THREAD_info(%r2) # get thread_info of prev
212 tm __TI_flags+3(%r4),_TIF_MCCK_PENDING # machine check pending? 205 tm __TI_flags+3(%r4),_TIF_MCCK_PENDING # machine check pending?
213 bz __switch_to_no_mcck-__switch_to_base(%r1) 206 bz 1f-0b(%r1)
214 ni __TI_flags+3(%r4),255-_TIF_MCCK_PENDING # clear flag in prev 207 ni __TI_flags+3(%r4),255-_TIF_MCCK_PENDING # clear flag in prev
215 l %r4,__THREAD_info(%r3) # get thread_info of next 208 oi __TI_flags+3(%r5),_TIF_MCCK_PENDING # set it in next
216 oi __TI_flags+3(%r4),_TIF_MCCK_PENDING # set it in next 2091: stm %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task
217__switch_to_no_mcck: 210 st %r15,__THREAD_ksp(%r2) # store kernel stack of prev
218 stm %r6,%r15,__SF_GPRS(%r15)# store __switch_to registers of prev task 211 l %r15,__THREAD_ksp(%r3) # load kernel stack of next
219 st %r15,__THREAD_ksp(%r2) # store kernel stack to prev->tss.ksp 212 lctl %c4,%c4,__TASK_pid(%r3) # load pid to control reg. 4
220 l %r15,__THREAD_ksp(%r3) # load kernel stack from next->tss.ksp 213 lm %r6,%r15,__SF_GPRS(%r15) # load gprs of next task
221 lm %r6,%r15,__SF_GPRS(%r15)# load __switch_to registers of next task 214 st %r3,__LC_CURRENT # store task struct of next
222 st %r3,__LC_CURRENT # __LC_CURRENT = current task struct 215 st %r5,__LC_THREAD_INFO # store thread info of next
223 lctl %c4,%c4,__TASK_pid(%r3) # load pid to control reg. 4 216 ahi %r5,STACK_SIZE # end of kernel stack of next
224 l %r3,__THREAD_info(%r3) # load thread_info from task struct 217 st %r5,__LC_KERNEL_STACK # store end of kernel stack
225 st %r3,__LC_THREAD_INFO
226 ahi %r3,STACK_SIZE
227 st %r3,__LC_KERNEL_STACK # __LC_KERNEL_STACK = new kernel stack
228 br %r14 218 br %r14
229 219
230__critical_start: 220__critical_start:
@@ -297,7 +287,7 @@ sysc_work_tif:
297 bo BASED(sysc_notify_resume) 287 bo BASED(sysc_notify_resume)
298 tm __TI_flags+3(%r12),_TIF_RESTART_SVC 288 tm __TI_flags+3(%r12),_TIF_RESTART_SVC
299 bo BASED(sysc_restart) 289 bo BASED(sysc_restart)
300 tm __TI_flags+3(%r12),_TIF_SINGLE_STEP 290 tm __TI_flags+3(%r12),_TIF_PER_TRAP
301 bo BASED(sysc_singlestep) 291 bo BASED(sysc_singlestep)
302 b BASED(sysc_return) # beware of critical section cleanup 292 b BASED(sysc_return) # beware of critical section cleanup
303 293
@@ -321,13 +311,13 @@ sysc_mcck_pending:
321# _TIF_SIGPENDING is set, call do_signal 311# _TIF_SIGPENDING is set, call do_signal
322# 312#
323sysc_sigpending: 313sysc_sigpending:
324 ni __TI_flags+3(%r12),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP 314 ni __TI_flags+3(%r12),255-_TIF_PER_TRAP # clear TIF_PER_TRAP
325 la %r2,SP_PTREGS(%r15) # load pt_regs 315 la %r2,SP_PTREGS(%r15) # load pt_regs
326 l %r1,BASED(.Ldo_signal) 316 l %r1,BASED(.Ldo_signal)
327 basr %r14,%r1 # call do_signal 317 basr %r14,%r1 # call do_signal
328 tm __TI_flags+3(%r12),_TIF_RESTART_SVC 318 tm __TI_flags+3(%r12),_TIF_RESTART_SVC
329 bo BASED(sysc_restart) 319 bo BASED(sysc_restart)
330 tm __TI_flags+3(%r12),_TIF_SINGLE_STEP 320 tm __TI_flags+3(%r12),_TIF_PER_TRAP
331 bo BASED(sysc_singlestep) 321 bo BASED(sysc_singlestep)
332 b BASED(sysc_return) 322 b BASED(sysc_return)
333 323
@@ -353,15 +343,15 @@ sysc_restart:
353 b BASED(sysc_nr_ok) # restart svc 343 b BASED(sysc_nr_ok) # restart svc
354 344
355# 345#
356# _TIF_SINGLE_STEP is set, call do_single_step 346# _TIF_PER_TRAP is set, call do_per_trap
357# 347#
358sysc_singlestep: 348sysc_singlestep:
359 ni __TI_flags+3(%r12),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP 349 ni __TI_flags+3(%r12),255-_TIF_PER_TRAP # clear TIF_PER_TRAP
360 xc SP_SVCNR(2,%r15),SP_SVCNR(%r15) # clear svc number 350 xc SP_SVCNR(2,%r15),SP_SVCNR(%r15) # clear svc number
361 la %r2,SP_PTREGS(%r15) # address of register-save area 351 la %r2,SP_PTREGS(%r15) # address of register-save area
362 l %r1,BASED(.Lhandle_per) # load adr. of per handler 352 l %r1,BASED(.Lhandle_per) # load adr. of per handler
363 la %r14,BASED(sysc_return) # load adr. of system return 353 la %r14,BASED(sysc_return) # load adr. of system return
364 br %r1 # branch to do_single_step 354 br %r1 # branch to do_per_trap
365 355
366# 356#
367# call tracehook_report_syscall_entry/tracehook_report_syscall_exit before 357# call tracehook_report_syscall_entry/tracehook_report_syscall_exit before
@@ -520,10 +510,10 @@ pgm_no_vtime2:
520 l %r1,__TI_task(%r12) 510 l %r1,__TI_task(%r12)
521 tm SP_PSW+1(%r15),0x01 # kernel per event ? 511 tm SP_PSW+1(%r15),0x01 # kernel per event ?
522 bz BASED(kernel_per) 512 bz BASED(kernel_per)
523 mvc __THREAD_per+__PER_atmid(2,%r1),__LC_PER_ATMID 513 mvc __THREAD_per_cause(2,%r1),__LC_PER_CAUSE
524 mvc __THREAD_per+__PER_address(4,%r1),__LC_PER_ADDRESS 514 mvc __THREAD_per_address(4,%r1),__LC_PER_ADDRESS
525 mvc __THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID 515 mvc __THREAD_per_paid(1,%r1),__LC_PER_PAID
526 oi __TI_flags+3(%r12),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP 516 oi __TI_flags+3(%r12),_TIF_PER_TRAP # set TIF_PER_TRAP
527 l %r3,__LC_PGM_ILC # load program interruption code 517 l %r3,__LC_PGM_ILC # load program interruption code
528 l %r4,__LC_TRANS_EXC_CODE 518 l %r4,__LC_TRANS_EXC_CODE
529 REENABLE_IRQS 519 REENABLE_IRQS
@@ -551,10 +541,10 @@ pgm_svcper:
551 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER 541 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER
552 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER 542 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER
553 l %r8,__TI_task(%r12) 543 l %r8,__TI_task(%r12)
554 mvc __THREAD_per+__PER_atmid(2,%r8),__LC_PER_ATMID 544 mvc __THREAD_per_cause(2,%r8),__LC_PER_CAUSE
555 mvc __THREAD_per+__PER_address(4,%r8),__LC_PER_ADDRESS 545 mvc __THREAD_per_address(4,%r8),__LC_PER_ADDRESS
556 mvc __THREAD_per+__PER_access_id(1,%r8),__LC_PER_ACCESS_ID 546 mvc __THREAD_per_paid(1,%r8),__LC_PER_PAID
557 oi __TI_flags+3(%r12),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP 547 oi __TI_flags+3(%r12),_TIF_PER_TRAP # set TIF_PER_TRAP
558 stosm __SF_EMPTY(%r15),0x03 # reenable interrupts 548 stosm __SF_EMPTY(%r15),0x03 # reenable interrupts
559 lm %r2,%r6,SP_R2(%r15) # load svc arguments 549 lm %r2,%r6,SP_R2(%r15) # load svc arguments
560 b BASED(sysc_do_svc) 550 b BASED(sysc_do_svc)
@@ -1056,7 +1046,7 @@ cleanup_io_restore_insn:
1056.Ldo_signal: .long do_signal 1046.Ldo_signal: .long do_signal
1057.Ldo_notify_resume: 1047.Ldo_notify_resume:
1058 .long do_notify_resume 1048 .long do_notify_resume
1059.Lhandle_per: .long do_single_step 1049.Lhandle_per: .long do_per_trap
1060.Ldo_execve: .long do_execve 1050.Ldo_execve: .long do_execve
1061.Lexecve_tail: .long execve_tail 1051.Lexecve_tail: .long execve_tail
1062.Ljump_table: .long pgm_check_table 1052.Ljump_table: .long pgm_check_table