diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2011-01-05 06:48:10 -0500 |
---|---|---|
committer | Martin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com> | 2011-01-05 06:47:31 -0500 |
commit | 5e9a26928f550157563cfc06ce12c4ae121a02ec (patch) | |
tree | fc58668f8c6151a5f58c0430f92a0691d727af42 /arch/s390/kernel/entry.S | |
parent | da7f51c11d5fedca9ba779ee220063ccb4f0a27e (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.S | 70 |
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 | |||
48 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE | 48 | SP_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: | 203 | 0: 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 | 209 | 1: 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 | # |
323 | sysc_sigpending: | 313 | sysc_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 | # |
358 | sysc_singlestep: | 348 | sysc_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 |