Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

+69 -94
+2 -1
arch/s390/include/asm/syscall.h
··· 26 26 static inline long syscall_get_nr(struct task_struct *task, 27 27 struct pt_regs *regs) 28 28 { 29 - return regs->svc_code ? (regs->svc_code & 0xffff) : -1; 29 + return test_tsk_thread_flag(task, TIF_SYSCALL) ? 30 + (regs->svc_code & 0xffff) : -1; 30 31 } 31 32 32 33 static inline void syscall_rollback(struct task_struct *task,
+2 -2
arch/s390/include/asm/thread_info.h
··· 85 85 /* 86 86 * thread information flags bit numbers 87 87 */ 88 + #define TIF_SYSCALL 0 /* inside a system call */ 88 89 #define TIF_NOTIFY_RESUME 1 /* callback before returning to user */ 89 90 #define TIF_SIGPENDING 2 /* signal pending */ 90 91 #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ 91 - #define TIF_RESTART_SVC 4 /* restart svc with new svc number */ 92 92 #define TIF_PER_TRAP 6 /* deliver sigtrap on return to user */ 93 93 #define TIF_MCCK_PENDING 7 /* machine check handling is pending */ 94 94 #define TIF_SYSCALL_TRACE 8 /* syscall trace active */ ··· 104 104 #define TIF_SINGLE_STEP 20 /* This task is single stepped */ 105 105 #define TIF_FREEZE 21 /* thread is freezing for suspend */ 106 106 107 + #define _TIF_SYSCALL (1<<TIF_SYSCALL) 107 108 #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) 108 109 #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) 109 110 #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 110 111 #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 111 - #define _TIF_RESTART_SVC (1<<TIF_RESTART_SVC) 112 112 #define _TIF_PER_TRAP (1<<TIF_PER_TRAP) 113 113 #define _TIF_MCCK_PENDING (1<<TIF_MCCK_PENDING) 114 114 #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
+1 -1
arch/s390/kernel/compat_signal.c
··· 342 342 return err; 343 343 344 344 restore_fp_regs(&current->thread.fp_regs); 345 - regs->svc_code = 0; /* disable syscall checks */ 345 + clear_thread_flag(TIF_SYSCALL); /* No longer in a system call */ 346 346 return 0; 347 347 } 348 348
+25 -41
arch/s390/kernel/entry.S
··· 47 47 SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE 48 48 49 49 _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ 50 - _TIF_MCCK_PENDING | _TIF_RESTART_SVC | _TIF_PER_TRAP ) 50 + _TIF_MCCK_PENDING | _TIF_PER_TRAP ) 51 51 _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ 52 52 _TIF_MCCK_PENDING) 53 - _TIF_SYSCALL = (_TIF_SYSCALL_TRACE>>8 | _TIF_SYSCALL_AUDIT>>8 | \ 54 - _TIF_SECCOMP>>8 | _TIF_SYSCALL_TRACEPOINT>>8) 53 + _TIF_TRACE = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \ 54 + _TIF_SYSCALL_TRACEPOINT) 55 55 56 56 STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER 57 57 STACK_SIZE = 1 << STACK_SHIFT ··· 227 227 sysc_saveall: 228 228 SAVE_ALL_SVC __LC_SVC_OLD_PSW,__LC_SAVE_AREA 229 229 CREATE_STACK_FRAME __LC_SAVE_AREA 230 + l %r12,__LC_THREAD_INFO # load pointer to thread_info struct 230 231 mvc SP_PSW(8,%r15),__LC_SVC_OLD_PSW 231 232 mvc SP_SVC_CODE(4,%r15),__LC_SVC_ILC 232 - l %r12,__LC_THREAD_INFO # load pointer to thread_info struct 233 + oi __TI_flags+3(%r12),_TIF_SYSCALL 233 234 sysc_vtime: 234 235 UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER 235 236 sysc_stime: ··· 249 248 sysc_nr_ok: 250 249 sll %r7,2 # svc number *4 251 250 l %r10,BASED(.Lsysc_table) 252 - tm __TI_flags+2(%r12),_TIF_SYSCALL 251 + tm __TI_flags+2(%r12),_TIF_TRACE >> 8 253 252 mvc SP_ARGS(4,%r15),SP_R7(%r15) 254 253 l %r8,0(%r7,%r10) # get system call addr. 255 254 bnz BASED(sysc_tracesys) ··· 259 258 sysc_return: 260 259 LOCKDEP_SYS_EXIT 261 260 sysc_tif: 261 + tm SP_PSW+1(%r15),0x01 # returning to user ? 262 + bno BASED(sysc_restore) 262 263 tm __TI_flags+3(%r12),_TIF_WORK_SVC 263 264 bnz BASED(sysc_work) # there is work to do (signals etc.) 265 + ni __TI_flags+3(%r12),255-_TIF_SYSCALL 264 266 sysc_restore: 265 267 RESTORE_ALL __LC_RETURN_PSW,1 266 268 sysc_done: 267 269 268 270 # 269 - # There is work to do, but first we need to check if we return to userspace. 270 - # 271 - sysc_work: 272 - tm SP_PSW+1(%r15),0x01 # returning to user ? 273 - bno BASED(sysc_restore) 274 - 275 - # 276 271 # One of the work bits is on. Find out which one. 277 272 # 278 - sysc_work_tif: 273 + sysc_work: 279 274 tm __TI_flags+3(%r12),_TIF_MCCK_PENDING 280 275 bo BASED(sysc_mcck_pending) 281 276 tm __TI_flags+3(%r12),_TIF_NEED_RESCHED ··· 280 283 bo BASED(sysc_sigpending) 281 284 tm __TI_flags+3(%r12),_TIF_NOTIFY_RESUME 282 285 bo BASED(sysc_notify_resume) 283 - tm __TI_flags+3(%r12),_TIF_RESTART_SVC 284 - bo BASED(sysc_restart) 285 286 tm __TI_flags+3(%r12),_TIF_PER_TRAP 286 287 bo BASED(sysc_singlestep) 287 288 b BASED(sysc_return) # beware of critical section cleanup ··· 308 313 la %r2,SP_PTREGS(%r15) # load pt_regs 309 314 l %r1,BASED(.Ldo_signal) 310 315 basr %r14,%r1 # call do_signal 311 - tm __TI_flags+3(%r12),_TIF_RESTART_SVC 312 - bo BASED(sysc_restart) 313 - tm __TI_flags+3(%r12),_TIF_PER_TRAP 314 - bo BASED(sysc_singlestep) 315 - b BASED(sysc_return) 316 + tm __TI_flags+3(%r12),_TIF_SYSCALL 317 + bno BASED(sysc_return) 318 + lm %r2,%r6,SP_R2(%r15) # load svc arguments 319 + xr %r7,%r7 # svc 0 returns -ENOSYS 320 + clc SP_SVC_CODE+2(2,%r15),BASED(.Lnr_syscalls+2) 321 + bnl BASED(sysc_nr_ok) # invalid svc number -> do svc 0 322 + icm %r7,3,SP_SVC_CODE+2(%r15)# load new svc number 323 + b BASED(sysc_nr_ok) # restart svc 316 324 317 325 # 318 326 # _TIF_NOTIFY_RESUME is set, call do_notify_resume ··· 326 328 la %r14,BASED(sysc_return) 327 329 br %r1 # call do_notify_resume 328 330 329 - 330 - # 331 - # _TIF_RESTART_SVC is set, set up registers and restart svc 332 - # 333 - sysc_restart: 334 - ni __TI_flags+3(%r12),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC 335 - lm %r2,%r6,SP_R2(%r15) # load svc arguments 336 - xr %r7,%r7 # svc 0 returns -ENOSYS 337 - clc SP_SVC_CODE+2(%r15),BASED(.Lnr_syscalls+2) 338 - bnl BASED(sysc_nr_ok) # invalid svc number -> do svc 0 339 - icm %r7,3,SP_SVC_CODE+2(%r15)# load new svc number 340 - b BASED(sysc_nr_ok) # restart svc 341 - 342 331 # 343 332 # _TIF_PER_TRAP is set, call do_per_trap 344 333 # 345 334 sysc_singlestep: 346 - ni __TI_flags+3(%r12),255-_TIF_PER_TRAP # clear TIF_PER_TRAP 347 - xc SP_SVC_CODE(4,%r15),SP_SVC_CODE(%r15) # clear svc code 335 + ni __TI_flags+3(%r12),255-(_TIF_SYSCALL | _TIF_PER_TRAP) 348 336 la %r2,SP_PTREGS(%r15) # address of register-save area 349 337 l %r1,BASED(.Lhandle_per) # load adr. of per handler 350 338 la %r14,BASED(sysc_return) # load adr. of system return ··· 360 376 basr %r14,%r8 # call sys_xxx 361 377 st %r2,SP_R2(%r15) # store return value 362 378 sysc_tracenogo: 363 - tm __TI_flags+2(%r12),_TIF_SYSCALL 379 + tm __TI_flags+2(%r12),_TIF_TRACE >> 8 364 380 bz BASED(sysc_return) 365 381 l %r1,BASED(.Ltrace_exit) 366 382 la %r2,SP_PTREGS(%r15) # load pt_regs ··· 438 454 bnz BASED(pgm_per) # got per exception -> special case 439 455 SAVE_ALL_PGM __LC_PGM_OLD_PSW,__LC_SAVE_AREA 440 456 CREATE_STACK_FRAME __LC_SAVE_AREA 441 - xc SP_SVC_CODE(4,%r15),SP_SVC_CODE(%r15) 442 457 mvc SP_PSW(8,%r15),__LC_PGM_OLD_PSW 443 458 l %r12,__LC_THREAD_INFO # load pointer to thread_info struct 444 459 tm SP_PSW+1(%r15),0x01 # interrupting from user ? ··· 513 530 pgm_svcper: 514 531 SAVE_ALL_PGM __LC_SVC_OLD_PSW,__LC_SAVE_AREA 515 532 CREATE_STACK_FRAME __LC_SAVE_AREA 533 + l %r12,__LC_THREAD_INFO # load pointer to thread_info struct 516 534 mvc SP_PSW(8,%r15),__LC_SVC_OLD_PSW 517 535 mvc SP_SVC_CODE(4,%r15),__LC_SVC_ILC 518 - l %r12,__LC_THREAD_INFO # load pointer to thread_info struct 536 + oi __TI_flags+3(%r12),(_TIF_SYSCALL | _TIF_PER_TRAP) 519 537 UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER 520 538 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER 521 539 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER ··· 524 540 mvc __THREAD_per_cause(2,%r8),__LC_PER_CAUSE 525 541 mvc __THREAD_per_address(4,%r8),__LC_PER_ADDRESS 526 542 mvc __THREAD_per_paid(1,%r8),__LC_PER_PAID 527 - oi __TI_flags+3(%r12),_TIF_PER_TRAP # set TIF_PER_TRAP 528 543 stosm __SF_EMPTY(%r15),0x03 # reenable interrupts 529 544 lm %r2,%r6,SP_R2(%r15) # load svc arguments 530 545 b BASED(sysc_do_svc) ··· 533 550 # 534 551 kernel_per: 535 552 REENABLE_IRQS 536 - xc SP_SVC_CODE(4,%r15),SP_SVC_CODE(%r15) 537 553 la %r2,SP_PTREGS(%r15) # address of register-save area 538 554 l %r1,BASED(.Lhandle_per) # load adr. of per handler 539 555 basr %r14,%r1 # branch to do_single_step ··· 947 965 s %r15,BASED(.Lc_spsize) # make room for registers & psw 948 966 st %r15,12(%r12) 949 967 CREATE_STACK_FRAME __LC_SAVE_AREA 968 + mvc 0(4,%r12),__LC_THREAD_INFO 969 + l %r12,__LC_THREAD_INFO 950 970 mvc SP_PSW(8,%r15),__LC_SVC_OLD_PSW 951 971 mvc SP_SVC_CODE(4,%r15),__LC_SVC_ILC 952 - mvc 0(4,%r12),__LC_THREAD_INFO 972 + oi __TI_flags+3(%r12),_TIF_SYSCALL 953 973 cleanup_vtime: 954 974 clc __LC_RETURN_PSW+4(4),BASED(cleanup_system_call_insn+12) 955 975 bhe BASED(cleanup_stime)
+26 -41
arch/s390/kernel/entry64.S
··· 50 50 STACK_SIZE = 1 << STACK_SHIFT 51 51 52 52 _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ 53 - _TIF_MCCK_PENDING | _TIF_RESTART_SVC | _TIF_PER_TRAP ) 53 + _TIF_MCCK_PENDING | _TIF_PER_TRAP ) 54 54 _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ 55 55 _TIF_MCCK_PENDING) 56 - _TIF_SYSCALL = (_TIF_SYSCALL_TRACE>>8 | _TIF_SYSCALL_AUDIT>>8 | \ 57 - _TIF_SECCOMP>>8 | _TIF_SYSCALL_TRACEPOINT>>8) 56 + _TIF_TRACE = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \ 57 + _TIF_SYSCALL_TRACEPOINT) 58 58 _TIF_EXIT_SIE = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING) 59 59 60 60 #define BASED(name) name-system_call(%r13) ··· 248 248 sysc_saveall: 249 249 SAVE_ALL_SVC __LC_SVC_OLD_PSW,__LC_SAVE_AREA 250 250 CREATE_STACK_FRAME __LC_SAVE_AREA 251 + lg %r12,__LC_THREAD_INFO # load pointer to thread_info struct 251 252 mvc SP_PSW(16,%r15),__LC_SVC_OLD_PSW 252 253 mvc SP_SVC_CODE(4,%r15),__LC_SVC_ILC 253 - lg %r12,__LC_THREAD_INFO # load pointer to thread_info struct 254 + oi __TI_flags+7(%r12),_TIF_SYSCALL 254 255 sysc_vtime: 255 256 UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER 256 257 sysc_stime: ··· 277 276 larl %r10,sys_call_table_emu # use 31 bit emulation system calls 278 277 sysc_noemu: 279 278 #endif 280 - tm __TI_flags+6(%r12),_TIF_SYSCALL 279 + tm __TI_flags+6(%r12),_TIF_TRACE >> 8 281 280 mvc SP_ARGS(8,%r15),SP_R7(%r15) 282 281 lgf %r8,0(%r7,%r10) # load address of system call routine 283 282 jnz sysc_tracesys ··· 287 286 sysc_return: 288 287 LOCKDEP_SYS_EXIT 289 288 sysc_tif: 289 + tm SP_PSW+1(%r15),0x01 # returning to user ? 290 + jno sysc_restore 290 291 tm __TI_flags+7(%r12),_TIF_WORK_SVC 291 292 jnz sysc_work # there is work to do (signals etc.) 293 + ni __TI_flags+7(%r12),255-_TIF_SYSCALL 292 294 sysc_restore: 293 295 RESTORE_ALL __LC_RETURN_PSW,1 294 296 sysc_done: 295 297 296 298 # 297 - # There is work to do, but first we need to check if we return to userspace. 298 - # 299 - sysc_work: 300 - tm SP_PSW+1(%r15),0x01 # returning to user ? 301 - jno sysc_restore 302 - 303 - # 304 299 # One of the work bits is on. Find out which one. 305 300 # 306 - sysc_work_tif: 301 + sysc_work: 307 302 tm __TI_flags+7(%r12),_TIF_MCCK_PENDING 308 303 jo sysc_mcck_pending 309 304 tm __TI_flags+7(%r12),_TIF_NEED_RESCHED ··· 308 311 jo sysc_sigpending 309 312 tm __TI_flags+7(%r12),_TIF_NOTIFY_RESUME 310 313 jo sysc_notify_resume 311 - tm __TI_flags+7(%r12),_TIF_RESTART_SVC 312 - jo sysc_restart 313 314 tm __TI_flags+7(%r12),_TIF_PER_TRAP 314 315 jo sysc_singlestep 315 316 j sysc_return # beware of critical section cleanup ··· 333 338 ni __TI_flags+7(%r12),255-_TIF_PER_TRAP # clear TIF_PER_TRAP 334 339 la %r2,SP_PTREGS(%r15) # load pt_regs 335 340 brasl %r14,do_signal # call do_signal 336 - tm __TI_flags+7(%r12),_TIF_RESTART_SVC 337 - jo sysc_restart 338 - tm __TI_flags+7(%r12),_TIF_PER_TRAP 339 - jo sysc_singlestep 340 - j sysc_return 341 + tm __TI_flags+7(%r12),_TIF_SYSCALL 342 + jno sysc_return 343 + lmg %r2,%r6,SP_R2(%r15) # load svc arguments 344 + lghi %r7,0 # svc 0 returns -ENOSYS 345 + lh %r1,SP_SVC_CODE+2(%r15) # load new svc number 346 + cghi %r1,NR_syscalls 347 + jnl sysc_nr_ok # invalid svc number -> do svc 0 348 + slag %r7,%r1,2 349 + j sysc_nr_ok # restart svc 341 350 342 351 # 343 352 # _TIF_NOTIFY_RESUME is set, call do_notify_resume ··· 352 353 jg do_notify_resume # call do_notify_resume 353 354 354 355 # 355 - # _TIF_RESTART_SVC is set, set up registers and restart svc 356 - # 357 - sysc_restart: 358 - ni __TI_flags+7(%r12),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC 359 - lmg %r2,%r6,SP_R2(%r15) # load svc arguments 360 - lghi %r7,0 # svc 0 returns -ENOSYS 361 - lh %r1,SP_SVC_CODE+2(%r15) # load new svc number 362 - cghi %r1,NR_syscalls 363 - jnl sysc_nr_ok # invalid svc number -> do svc 0 364 - slag %r7,%r1,2 365 - j sysc_nr_ok # restart svc 366 - 367 - # 368 356 # _TIF_PER_TRAP is set, call do_per_trap 369 357 # 370 358 sysc_singlestep: 371 - ni __TI_flags+7(%r12),255-_TIF_PER_TRAP # clear TIF_PER_TRAP 372 - xc SP_SVC_CODE(4,%r15),SP_SVC_CODE(%r15) # clear svc code 359 + ni __TI_flags+7(%r12),255-(_TIF_SYSCALL | _TIF_PER_TRAP) 373 360 la %r2,SP_PTREGS(%r15) # address of register-save area 374 361 larl %r14,sysc_return # load adr. of system return 375 362 jg do_per_trap ··· 382 397 basr %r14,%r8 # call sys_xxx 383 398 stg %r2,SP_R2(%r15) # store return value 384 399 sysc_tracenogo: 385 - tm __TI_flags+6(%r12),_TIF_SYSCALL 400 + tm __TI_flags+6(%r12),_TIF_TRACE >> 8 386 401 jz sysc_return 387 402 la %r2,SP_PTREGS(%r15) # load pt_regs 388 403 larl %r14,sysc_return # return point is sysc_return ··· 455 470 jnz pgm_per # got per exception -> special case 456 471 SAVE_ALL_PGM __LC_PGM_OLD_PSW,__LC_SAVE_AREA 457 472 CREATE_STACK_FRAME __LC_SAVE_AREA 458 - xc SP_SVC_CODE(4,%r15),SP_SVC_CODE(%r15) 459 473 mvc SP_PSW(16,%r15),__LC_PGM_OLD_PSW 460 474 lg %r12,__LC_THREAD_INFO # load pointer to thread_info struct 461 475 HANDLE_SIE_INTERCEPT ··· 534 550 pgm_svcper: 535 551 SAVE_ALL_PGM __LC_SVC_OLD_PSW,__LC_SAVE_AREA 536 552 CREATE_STACK_FRAME __LC_SAVE_AREA 553 + lg %r12,__LC_THREAD_INFO # load pointer to thread_info struct 537 554 mvc SP_PSW(16,%r15),__LC_SVC_OLD_PSW 538 555 mvc SP_SVC_CODE(4,%r15),__LC_SVC_ILC 539 - lg %r12,__LC_THREAD_INFO # load pointer to thread_info struct 556 + oi __TI_flags+7(%r12),(_TIF_SYSCALL | _TIF_PER_TRAP) 540 557 UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER 541 558 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER 542 559 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER ··· 546 561 mvc __THREAD_per_cause(2,%r8),__LC_PER_CAUSE 547 562 mvc __THREAD_per_address(8,%r8),__LC_PER_ADDRESS 548 563 mvc __THREAD_per_paid(1,%r8),__LC_PER_PAID 549 - oi __TI_flags+7(%r12),_TIF_PER_TRAP # set TIF_PER_TRAP 550 564 stosm __SF_EMPTY(%r15),0x03 # reenable interrupts 551 565 lmg %r2,%r6,SP_R2(%r15) # load svc arguments 552 566 j sysc_do_svc ··· 555 571 # 556 572 kernel_per: 557 573 REENABLE_IRQS 558 - xc SP_SVC_CODE(4,%r15),SP_SVC_CODE(%r15) # clear svc number 559 574 la %r2,SP_PTREGS(%r15) # address of register-save area 560 575 brasl %r14,do_per_trap 561 576 j pgm_exit ··· 955 972 stg %r15,32(%r12) 956 973 stg %r11,0(%r12) 957 974 CREATE_STACK_FRAME __LC_SAVE_AREA 975 + mvc 8(8,%r12),__LC_THREAD_INFO 976 + lg %r12,__LC_THREAD_INFO 958 977 mvc SP_PSW(16,%r15),__LC_SVC_OLD_PSW 959 978 mvc SP_SVC_CODE(4,%r15),__LC_SVC_ILC 960 - mvc 8(8,%r12),__LC_THREAD_INFO 979 + oi __TI_flags+7(%r12),_TIF_SYSCALL 961 980 cleanup_vtime: 962 981 clc __LC_RETURN_PSW+8(8),BASED(cleanup_system_call_insn+24) 963 982 jhe cleanup_stime
+1 -1
arch/s390/kernel/ptrace.c
··· 750 750 * debugger stored an invalid system call number. Skip 751 751 * the system call and the system call restart handling. 752 752 */ 753 - regs->svc_code = 0; 753 + clear_thread_flag(TIF_SYSCALL); 754 754 ret = -1; 755 755 } 756 756
+12 -7
arch/s390/kernel/signal.c
··· 157 157 current->thread.fp_regs.fpc &= FPC_VALID_MASK; 158 158 159 159 restore_fp_regs(&current->thread.fp_regs); 160 - regs->svc_code = 0; /* disable syscall checks */ 160 + clear_thread_flag(TIF_SYSCALL); /* No longer in a system call */ 161 161 return 0; 162 162 } 163 163 ··· 426 426 * the debugger may change all our registers, including the system 427 427 * call information. 428 428 */ 429 - current_thread_info()->system_call = regs->svc_code; 429 + current_thread_info()->system_call = 430 + test_thread_flag(TIF_SYSCALL) ? regs->svc_code : 0; 430 431 signr = get_signal_to_deliver(&info, &ka, regs, NULL); 431 - regs->svc_code = current_thread_info()->system_call; 432 432 433 433 if (signr > 0) { 434 434 /* Whee! Actually deliver the signal. */ 435 - if (regs->svc_code > 0) { 435 + if (current_thread_info()->system_call) { 436 + regs->svc_code = current_thread_info()->system_call; 436 437 /* Check for system call restarting. */ 437 438 switch (regs->gprs[2]) { 438 439 case -ERESTART_RESTARTBLOCK: ··· 454 453 break; 455 454 } 456 455 /* No longer in a system call */ 457 - regs->svc_code = 0; 456 + clear_thread_flag(TIF_SYSCALL); 458 457 } 459 458 460 459 if ((is_compat_task() ? ··· 479 478 } 480 479 481 480 /* No handlers present - check for system call restart */ 482 - if (regs->svc_code > 0) { 481 + if (current_thread_info()->system_call) { 482 + regs->svc_code = current_thread_info()->system_call; 483 483 switch (regs->gprs[2]) { 484 484 case -ERESTART_RESTARTBLOCK: 485 485 /* Restart with sys_restart_syscall */ ··· 491 489 case -ERESTARTNOINTR: 492 490 /* Restart system call with magic TIF bit. */ 493 491 regs->gprs[2] = regs->orig_gpr2; 494 - set_thread_flag(TIF_RESTART_SVC); 492 + set_thread_flag(TIF_SYSCALL); 493 + break; 494 + default: 495 + clear_thread_flag(TIF_SYSCALL); 495 496 break; 496 497 } 497 498 }