diff options
31 files changed, 92 insertions, 250 deletions
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index cadf4571ca31..f1e7d2aa2586 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c | |||
| @@ -468,12 +468,9 @@ static inline void | |||
| 468 | handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, | 468 | handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, |
| 469 | struct pt_regs * regs, struct switch_stack *sw) | 469 | struct pt_regs * regs, struct switch_stack *sw) |
| 470 | { | 470 | { |
| 471 | sigset_t *oldset = ¤t->blocked; | 471 | sigset_t *oldset = sigmask_to_save(); |
| 472 | int ret; | 472 | int ret; |
| 473 | 473 | ||
| 474 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 475 | oldset = ¤t->saved_sigmask; | ||
| 476 | |||
| 477 | if (ka->sa.sa_flags & SA_SIGINFO) | 474 | if (ka->sa.sa_flags & SA_SIGINFO) |
| 478 | ret = setup_rt_frame(sig, ka, info, oldset, regs, sw); | 475 | ret = setup_rt_frame(sig, ka, info, oldset, regs, sw); |
| 479 | else | 476 | else |
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 3d1daac8ea04..2e66c93973c3 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
| @@ -530,11 +530,11 @@ setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, | |||
| 530 | */ | 530 | */ |
| 531 | static int | 531 | static int |
| 532 | handle_signal(unsigned long sig, struct k_sigaction *ka, | 532 | handle_signal(unsigned long sig, struct k_sigaction *ka, |
| 533 | siginfo_t *info, sigset_t *oldset, | 533 | siginfo_t *info, struct pt_regs *regs) |
| 534 | struct pt_regs * regs) | ||
| 535 | { | 534 | { |
| 536 | struct thread_info *thread = current_thread_info(); | 535 | struct thread_info *thread = current_thread_info(); |
| 537 | struct task_struct *tsk = current; | 536 | struct task_struct *tsk = current; |
| 537 | sigset_t *oldset = sigmask_to_save(); | ||
| 538 | int usig = sig; | 538 | int usig = sig; |
| 539 | int ret; | 539 | int ret; |
| 540 | 540 | ||
| @@ -617,8 +617,6 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
| 617 | */ | 617 | */ |
| 618 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 618 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 619 | if (signr > 0) { | 619 | if (signr > 0) { |
| 620 | sigset_t *oldset; | ||
| 621 | |||
| 622 | /* | 620 | /* |
| 623 | * Depending on the signal settings we may need to revert the | 621 | * Depending on the signal settings we may need to revert the |
| 624 | * decision to restart the system call. But skip this if a | 622 | * decision to restart the system call. But skip this if a |
| @@ -635,11 +633,7 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
| 635 | clear_thread_flag(TIF_SYSCALL_RESTARTSYS); | 633 | clear_thread_flag(TIF_SYSCALL_RESTARTSYS); |
| 636 | } | 634 | } |
| 637 | 635 | ||
| 638 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 636 | if (handle_signal(signr, &ka, &info, regs) == 0) { |
| 639 | oldset = ¤t->saved_sigmask; | ||
| 640 | else | ||
| 641 | oldset = ¤t->blocked; | ||
| 642 | if (handle_signal(signr, &ka, &info, oldset, regs) == 0) { | ||
| 643 | /* | 637 | /* |
| 644 | * A signal was successfully delivered; the saved | 638 | * A signal was successfully delivered; the saved |
| 645 | * sigmask will have been stored in the signal frame, | 639 | * sigmask will have been stored in the signal frame, |
diff --git a/arch/avr32/kernel/signal.c b/arch/avr32/kernel/signal.c index 8b12c3046137..0e2c0527c9fe 100644 --- a/arch/avr32/kernel/signal.c +++ b/arch/avr32/kernel/signal.c | |||
| @@ -224,14 +224,14 @@ static inline void setup_syscall_restart(struct pt_regs *regs) | |||
| 224 | 224 | ||
| 225 | static inline void | 225 | static inline void |
| 226 | handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | 226 | handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, |
| 227 | sigset_t *oldset, struct pt_regs *regs, int syscall) | 227 | struct pt_regs *regs, int syscall) |
| 228 | { | 228 | { |
| 229 | int ret; | 229 | int ret; |
| 230 | 230 | ||
| 231 | /* | 231 | /* |
| 232 | * Set up the stack frame | 232 | * Set up the stack frame |
| 233 | */ | 233 | */ |
| 234 | ret = setup_rt_frame(sig, ka, info, oldset, regs); | 234 | ret = setup_rt_frame(sig, ka, info, sigmask_to_save(), regs); |
| 235 | 235 | ||
| 236 | /* | 236 | /* |
| 237 | * Check that the resulting registers are sane | 237 | * Check that the resulting registers are sane |
| @@ -255,7 +255,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 255 | * doesn't want to handle. Thus you cannot kill init even with a | 255 | * doesn't want to handle. Thus you cannot kill init even with a |
| 256 | * SIGKILL even by mistake. | 256 | * SIGKILL even by mistake. |
| 257 | */ | 257 | */ |
| 258 | int do_signal(struct pt_regs *regs, sigset_t *oldset, int syscall) | 258 | static void do_signal(struct pt_regs *regs, int syscall) |
| 259 | { | 259 | { |
| 260 | siginfo_t info; | 260 | siginfo_t info; |
| 261 | int signr; | 261 | int signr; |
| @@ -267,12 +267,7 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset, int syscall) | |||
| 267 | * without doing anything if so. | 267 | * without doing anything if so. |
| 268 | */ | 268 | */ |
| 269 | if (!user_mode(regs)) | 269 | if (!user_mode(regs)) |
| 270 | return 0; | 270 | return; |
| 271 | |||
| 272 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 273 | oldset = ¤t->saved_sigmask; | ||
| 274 | else if (!oldset) | ||
| 275 | oldset = ¤t->blocked; | ||
| 276 | 271 | ||
| 277 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 272 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 278 | if (syscall) { | 273 | if (syscall) { |
| @@ -298,11 +293,10 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset, int syscall) | |||
| 298 | if (signr == 0) { | 293 | if (signr == 0) { |
| 299 | /* No signal to deliver -- put the saved sigmask back */ | 294 | /* No signal to deliver -- put the saved sigmask back */ |
| 300 | restore_saved_sigmask(); | 295 | restore_saved_sigmask(); |
| 301 | return 0; | 296 | return; |
| 302 | } | 297 | } |
| 303 | 298 | ||
| 304 | handle_signal(signr, &ka, &info, oldset, regs, syscall); | 299 | handle_signal(signr, &ka, &info, regs, syscall); |
| 305 | return 1; | ||
| 306 | } | 300 | } |
| 307 | 301 | ||
| 308 | asmlinkage void do_notify_resume(struct pt_regs *regs, struct thread_info *ti) | 302 | asmlinkage void do_notify_resume(struct pt_regs *regs, struct thread_info *ti) |
| @@ -313,7 +307,7 @@ asmlinkage void do_notify_resume(struct pt_regs *regs, struct thread_info *ti) | |||
| 313 | syscall = 1; | 307 | syscall = 1; |
| 314 | 308 | ||
| 315 | if (ti->flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) | 309 | if (ti->flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) |
| 316 | do_signal(regs, ¤t->blocked, syscall); | 310 | do_signal(regs, syscall); |
| 317 | 311 | ||
| 318 | if (ti->flags & _TIF_NOTIFY_RESUME) { | 312 | if (ti->flags & _TIF_NOTIFY_RESUME) { |
| 319 | clear_thread_flag(TIF_NOTIFY_RESUME); | 313 | clear_thread_flag(TIF_NOTIFY_RESUME); |
diff --git a/arch/blackfin/kernel/signal.c b/arch/blackfin/kernel/signal.c index 9d692a1277b3..7f4205ddfa4d 100644 --- a/arch/blackfin/kernel/signal.c +++ b/arch/blackfin/kernel/signal.c | |||
| @@ -249,7 +249,7 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler) | |||
| 249 | */ | 249 | */ |
| 250 | static int | 250 | static int |
| 251 | handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka, | 251 | handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka, |
| 252 | sigset_t *oldset, struct pt_regs *regs) | 252 | struct pt_regs *regs) |
| 253 | { | 253 | { |
| 254 | int ret; | 254 | int ret; |
| 255 | 255 | ||
| @@ -259,7 +259,7 @@ handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka, | |||
| 259 | handle_restart(regs, ka, 1); | 259 | handle_restart(regs, ka, 1); |
| 260 | 260 | ||
| 261 | /* set up the stack frame */ | 261 | /* set up the stack frame */ |
| 262 | ret = setup_rt_frame(sig, ka, info, oldset, regs); | 262 | ret = setup_rt_frame(sig, ka, info, sigmask_to_save(), regs); |
| 263 | 263 | ||
| 264 | if (ret == 0) | 264 | if (ret == 0) |
| 265 | block_sigmask(ka, sig); | 265 | block_sigmask(ka, sig); |
| @@ -281,22 +281,16 @@ asmlinkage void do_signal(struct pt_regs *regs) | |||
| 281 | siginfo_t info; | 281 | siginfo_t info; |
| 282 | int signr; | 282 | int signr; |
| 283 | struct k_sigaction ka; | 283 | struct k_sigaction ka; |
| 284 | sigset_t *oldset; | ||
| 285 | 284 | ||
| 286 | current->thread.esp0 = (unsigned long)regs; | 285 | current->thread.esp0 = (unsigned long)regs; |
| 287 | 286 | ||
| 288 | if (try_to_freeze()) | 287 | if (try_to_freeze()) |
| 289 | goto no_signal; | 288 | goto no_signal; |
| 290 | 289 | ||
| 291 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 292 | oldset = ¤t->saved_sigmask; | ||
| 293 | else | ||
| 294 | oldset = ¤t->blocked; | ||
| 295 | |||
| 296 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 290 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 297 | if (signr > 0) { | 291 | if (signr > 0) { |
| 298 | /* Whee! Actually deliver the signal. */ | 292 | /* Whee! Actually deliver the signal. */ |
| 299 | if (handle_signal(signr, &info, &ka, oldset, regs) == 0) { | 293 | if (handle_signal(signr, &info, &ka, regs) == 0) { |
| 300 | /* a signal was successfully delivered; the saved | 294 | /* a signal was successfully delivered; the saved |
| 301 | * sigmask will have been stored in the signal frame, | 295 | * sigmask will have been stored in the signal frame, |
| 302 | * and will be restored by sigreturn, so we can simply | 296 | * and will be restored by sigreturn, so we can simply |
diff --git a/arch/c6x/kernel/signal.c b/arch/c6x/kernel/signal.c index bfbcc958bbb4..38bb501eb117 100644 --- a/arch/c6x/kernel/signal.c +++ b/arch/c6x/kernel/signal.c | |||
| @@ -250,8 +250,7 @@ do_restart: | |||
| 250 | */ | 250 | */ |
| 251 | static int handle_signal(int sig, | 251 | static int handle_signal(int sig, |
| 252 | siginfo_t *info, struct k_sigaction *ka, | 252 | siginfo_t *info, struct k_sigaction *ka, |
| 253 | sigset_t *oldset, struct pt_regs *regs, | 253 | struct pt_regs *regs, int syscall) |
| 254 | int syscall) | ||
| 255 | { | 254 | { |
| 256 | int ret; | 255 | int ret; |
| 257 | 256 | ||
| @@ -278,7 +277,7 @@ static int handle_signal(int sig, | |||
| 278 | } | 277 | } |
| 279 | 278 | ||
| 280 | /* Set up the stack frame */ | 279 | /* Set up the stack frame */ |
| 281 | ret = setup_rt_frame(sig, ka, info, oldset, regs); | 280 | ret = setup_rt_frame(sig, ka, info, sigmask_to_save(), regs); |
| 282 | if (ret == 0) | 281 | if (ret == 0) |
| 283 | block_sigmask(ka, sig); | 282 | block_sigmask(ka, sig); |
| 284 | 283 | ||
| @@ -292,7 +291,6 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
| 292 | { | 291 | { |
| 293 | struct k_sigaction ka; | 292 | struct k_sigaction ka; |
| 294 | siginfo_t info; | 293 | siginfo_t info; |
| 295 | sigset_t *oldset; | ||
| 296 | int signr; | 294 | int signr; |
| 297 | 295 | ||
| 298 | /* we want the common case to go fast, which is why we may in certain | 296 | /* we want the common case to go fast, which is why we may in certain |
| @@ -300,15 +298,9 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
| 300 | if (!user_mode(regs)) | 298 | if (!user_mode(regs)) |
| 301 | return; | 299 | return; |
| 302 | 300 | ||
| 303 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 304 | oldset = ¤t->saved_sigmask; | ||
| 305 | else | ||
| 306 | oldset = ¤t->blocked; | ||
| 307 | |||
| 308 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 301 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 309 | if (signr > 0) { | 302 | if (signr > 0) { |
| 310 | if (handle_signal(signr, &info, &ka, oldset, | 303 | if (handle_signal(signr, &info, &ka, regs, syscall) == 0) { |
| 311 | regs, syscall) == 0) { | ||
| 312 | /* a signal was successfully delivered; the saved | 304 | /* a signal was successfully delivered; the saved |
| 313 | * sigmask will have been stored in the signal frame, | 305 | * sigmask will have been stored in the signal frame, |
| 314 | * and will be restored by sigreturn, so we can simply | 306 | * and will be restored by sigreturn, so we can simply |
diff --git a/arch/cris/arch-v10/kernel/signal.c b/arch/cris/arch-v10/kernel/signal.c index 06885e94e455..09a4cf4eb08a 100644 --- a/arch/cris/arch-v10/kernel/signal.c +++ b/arch/cris/arch-v10/kernel/signal.c | |||
| @@ -417,8 +417,9 @@ give_sigsegv: | |||
| 417 | 417 | ||
| 418 | static inline int handle_signal(int canrestart, unsigned long sig, | 418 | static inline int handle_signal(int canrestart, unsigned long sig, |
| 419 | siginfo_t *info, struct k_sigaction *ka, | 419 | siginfo_t *info, struct k_sigaction *ka, |
| 420 | sigset_t *oldset, struct pt_regs *regs) | 420 | struct pt_regs *regs) |
| 421 | { | 421 | { |
| 422 | sigset_t *oldset = sigmask_to_save(); | ||
| 422 | int ret; | 423 | int ret; |
| 423 | 424 | ||
| 424 | /* Are we from a system call? */ | 425 | /* Are we from a system call? */ |
| @@ -478,7 +479,6 @@ void do_signal(int canrestart, struct pt_regs *regs) | |||
| 478 | siginfo_t info; | 479 | siginfo_t info; |
| 479 | int signr; | 480 | int signr; |
| 480 | struct k_sigaction ka; | 481 | struct k_sigaction ka; |
| 481 | sigset_t *oldset; | ||
| 482 | 482 | ||
| 483 | /* | 483 | /* |
| 484 | * We want the common case to go fast, which | 484 | * We want the common case to go fast, which |
| @@ -489,16 +489,11 @@ void do_signal(int canrestart, struct pt_regs *regs) | |||
| 489 | if (!user_mode(regs)) | 489 | if (!user_mode(regs)) |
| 490 | return; | 490 | return; |
| 491 | 491 | ||
| 492 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 493 | oldset = ¤t->saved_sigmask; | ||
| 494 | else | ||
| 495 | oldset = ¤t->blocked; | ||
| 496 | |||
| 497 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 492 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 498 | if (signr > 0) { | 493 | if (signr > 0) { |
| 499 | /* Whee! Actually deliver the signal. */ | 494 | /* Whee! Actually deliver the signal. */ |
| 500 | if (handle_signal(canrestart, signr, &info, &ka, | 495 | if (handle_signal(canrestart, signr, &info, &ka, |
| 501 | oldset, regs)) { | 496 | regs)) { |
| 502 | /* a signal was successfully delivered; the saved | 497 | /* a signal was successfully delivered; the saved |
| 503 | * sigmask will have been stored in the signal frame, | 498 | * sigmask will have been stored in the signal frame, |
| 504 | * and will be restored by sigreturn, so we can simply | 499 | * and will be restored by sigreturn, so we can simply |
diff --git a/arch/cris/arch-v32/kernel/signal.c b/arch/cris/arch-v32/kernel/signal.c index fe12cdca0bac..d52276ddae4b 100644 --- a/arch/cris/arch-v32/kernel/signal.c +++ b/arch/cris/arch-v32/kernel/signal.c | |||
| @@ -437,8 +437,9 @@ give_sigsegv: | |||
| 437 | static inline int | 437 | static inline int |
| 438 | handle_signal(int canrestart, unsigned long sig, | 438 | handle_signal(int canrestart, unsigned long sig, |
| 439 | siginfo_t *info, struct k_sigaction *ka, | 439 | siginfo_t *info, struct k_sigaction *ka, |
| 440 | sigset_t *oldset, struct pt_regs * regs) | 440 | struct pt_regs * regs) |
| 441 | { | 441 | { |
| 442 | sigset_t *oldset = sigmask_to_save(); | ||
| 442 | int ret; | 443 | int ret; |
| 443 | 444 | ||
| 444 | /* Check if this got called from a system call. */ | 445 | /* Check if this got called from a system call. */ |
| @@ -511,7 +512,6 @@ do_signal(int canrestart, struct pt_regs *regs) | |||
| 511 | int signr; | 512 | int signr; |
| 512 | siginfo_t info; | 513 | siginfo_t info; |
| 513 | struct k_sigaction ka; | 514 | struct k_sigaction ka; |
| 514 | sigset_t *oldset; | ||
| 515 | 515 | ||
| 516 | /* | 516 | /* |
| 517 | * The common case should go fast, which is why this point is | 517 | * The common case should go fast, which is why this point is |
| @@ -521,17 +521,12 @@ do_signal(int canrestart, struct pt_regs *regs) | |||
| 521 | if (!user_mode(regs)) | 521 | if (!user_mode(regs)) |
| 522 | return; | 522 | return; |
| 523 | 523 | ||
| 524 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 525 | oldset = ¤t->saved_sigmask; | ||
| 526 | else | ||
| 527 | oldset = ¤t->blocked; | ||
| 528 | |||
| 529 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 524 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 530 | 525 | ||
| 531 | if (signr > 0) { | 526 | if (signr > 0) { |
| 532 | /* Whee! Actually deliver the signal. */ | 527 | /* Whee! Actually deliver the signal. */ |
| 533 | if (handle_signal(canrestart, signr, &info, &ka, | 528 | if (handle_signal(canrestart, signr, &info, &ka, |
| 534 | oldset, regs)) { | 529 | regs)) { |
| 535 | /* a signal was successfully delivered; the saved | 530 | /* a signal was successfully delivered; the saved |
| 536 | * sigmask will have been stored in the signal frame, | 531 | * sigmask will have been stored in the signal frame, |
| 537 | * and will be restored by sigreturn, so we can simply | 532 | * and will be restored by sigreturn, so we can simply |
diff --git a/arch/frv/kernel/signal.c b/arch/frv/kernel/signal.c index 16351cc8c36c..22efe8d25038 100644 --- a/arch/frv/kernel/signal.c +++ b/arch/frv/kernel/signal.c | |||
| @@ -427,8 +427,9 @@ give_sigsegv: | |||
| 427 | * OK, we're invoking a handler | 427 | * OK, we're invoking a handler |
| 428 | */ | 428 | */ |
| 429 | static int handle_signal(unsigned long sig, siginfo_t *info, | 429 | static int handle_signal(unsigned long sig, siginfo_t *info, |
| 430 | struct k_sigaction *ka, sigset_t *oldset) | 430 | struct k_sigaction *ka) |
| 431 | { | 431 | { |
| 432 | sigset_t *oldset = sigmask_to_save(); | ||
| 432 | int ret; | 433 | int ret; |
| 433 | 434 | ||
| 434 | /* Are we from a system call? */ | 435 | /* Are we from a system call? */ |
| @@ -492,14 +493,9 @@ static void do_signal(void) | |||
| 492 | if (try_to_freeze()) | 493 | if (try_to_freeze()) |
| 493 | goto no_signal; | 494 | goto no_signal; |
| 494 | 495 | ||
| 495 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 496 | oldset = ¤t->saved_sigmask; | ||
| 497 | else | ||
| 498 | oldset = ¤t->blocked; | ||
| 499 | |||
| 500 | signr = get_signal_to_deliver(&info, &ka, __frame, NULL); | 496 | signr = get_signal_to_deliver(&info, &ka, __frame, NULL); |
| 501 | if (signr > 0) { | 497 | if (signr > 0) { |
| 502 | if (handle_signal(signr, &info, &ka, oldset) == 0) { | 498 | if (handle_signal(signr, &info, &ka) == 0) { |
| 503 | /* a signal was successfully delivered; the saved | 499 | /* a signal was successfully delivered; the saved |
| 504 | * sigmask will have been stored in the signal frame, | 500 | * sigmask will have been stored in the signal frame, |
| 505 | * and will be restored by sigreturn, so we can simply | 501 | * and will be restored by sigreturn, so we can simply |
diff --git a/arch/h8300/kernel/signal.c b/arch/h8300/kernel/signal.c index 63623dabab32..d4d2f72672ad 100644 --- a/arch/h8300/kernel/signal.c +++ b/arch/h8300/kernel/signal.c | |||
| @@ -412,8 +412,9 @@ give_sigsegv: | |||
| 412 | */ | 412 | */ |
| 413 | static void | 413 | static void |
| 414 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | 414 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, |
| 415 | sigset_t *oldset, struct pt_regs * regs) | 415 | struct pt_regs * regs) |
| 416 | { | 416 | { |
| 417 | sigset_t *oldset = sigmask_to_save(); | ||
| 417 | int ret; | 418 | int ret; |
| 418 | /* are we from a system call? */ | 419 | /* are we from a system call? */ |
| 419 | if (regs->orig_er0 >= 0) { | 420 | if (regs->orig_er0 >= 0) { |
| @@ -457,7 +458,6 @@ statis void do_signal(struct pt_regs *regs) | |||
| 457 | siginfo_t info; | 458 | siginfo_t info; |
| 458 | int signr; | 459 | int signr; |
| 459 | struct k_sigaction ka; | 460 | struct k_sigaction ka; |
| 460 | sigset_t *oldset; | ||
| 461 | 461 | ||
| 462 | /* | 462 | /* |
| 463 | * We want the common case to go fast, which | 463 | * We want the common case to go fast, which |
| @@ -473,15 +473,10 @@ statis void do_signal(struct pt_regs *regs) | |||
| 473 | 473 | ||
| 474 | current->thread.esp0 = (unsigned long) regs; | 474 | current->thread.esp0 = (unsigned long) regs; |
| 475 | 475 | ||
| 476 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 477 | oldset = ¤t->saved_sigmask; | ||
| 478 | else | ||
| 479 | oldset = ¤t->blocked; | ||
| 480 | |||
| 481 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 476 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 482 | if (signr > 0) { | 477 | if (signr > 0) { |
| 483 | /* Whee! Actually deliver the signal. */ | 478 | /* Whee! Actually deliver the signal. */ |
| 484 | handle_signal(signr, &info, &ka, oldset, regs); | 479 | handle_signal(signr, &info, &ka, regs); |
| 485 | return; | 480 | return; |
| 486 | } | 481 | } |
| 487 | no_signal: | 482 | no_signal: |
diff --git a/arch/hexagon/kernel/signal.c b/arch/hexagon/kernel/signal.c index acd6272913b3..f73fcee09bac 100644 --- a/arch/hexagon/kernel/signal.c +++ b/arch/hexagon/kernel/signal.c | |||
| @@ -150,7 +150,7 @@ sigsegv: | |||
| 150 | * Setup invocation of signal handler | 150 | * Setup invocation of signal handler |
| 151 | */ | 151 | */ |
| 152 | static int handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka, | 152 | static int handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka, |
| 153 | sigset_t *oldset, struct pt_regs *regs) | 153 | struct pt_regs *regs) |
| 154 | { | 154 | { |
| 155 | int rc; | 155 | int rc; |
| 156 | 156 | ||
| @@ -186,7 +186,7 @@ static int handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka, | |||
| 186 | * Set up the stack frame; not doing the SA_SIGINFO thing. We | 186 | * Set up the stack frame; not doing the SA_SIGINFO thing. We |
| 187 | * only set up the rt_frame flavor. | 187 | * only set up the rt_frame flavor. |
| 188 | */ | 188 | */ |
| 189 | rc = setup_rt_frame(sig, ka, info, oldset, regs); | 189 | rc = setup_rt_frame(sig, ka, info, sigmask_to_save(), regs); |
| 190 | 190 | ||
| 191 | /* If there was an error on setup, no signal was delivered. */ | 191 | /* If there was an error on setup, no signal was delivered. */ |
| 192 | if (rc) | 192 | if (rc) |
| @@ -215,14 +215,7 @@ static void do_signal(struct pt_regs *regs) | |||
| 215 | signo = get_signal_to_deliver(&info, &sigact, regs, NULL); | 215 | signo = get_signal_to_deliver(&info, &sigact, regs, NULL); |
| 216 | 216 | ||
| 217 | if (signo > 0) { | 217 | if (signo > 0) { |
| 218 | sigset_t *oldset; | 218 | if (handle_signal(signo, &info, &sigact, regs) == 0) { |
| 219 | |||
| 220 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 221 | oldset = ¤t->saved_sigmask; | ||
| 222 | else | ||
| 223 | oldset = ¤t->blocked; | ||
| 224 | |||
| 225 | if (handle_signal(signo, &info, &sigact, oldset, regs) == 0) { | ||
| 226 | /* | 219 | /* |
| 227 | * Successful delivery case. The saved sigmask is | 220 | * Successful delivery case. The saved sigmask is |
| 228 | * stored in the signal frame, and will be restored | 221 | * stored in the signal frame, and will be restored |
diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c index 39d8f3afff49..9fee6d6a3f21 100644 --- a/arch/ia64/kernel/signal.c +++ b/arch/ia64/kernel/signal.c | |||
| @@ -415,10 +415,10 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, | |||
| 415 | } | 415 | } |
| 416 | 416 | ||
| 417 | static long | 417 | static long |
| 418 | handle_signal (unsigned long sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *oldset, | 418 | handle_signal (unsigned long sig, struct k_sigaction *ka, siginfo_t *info, |
| 419 | struct sigscratch *scr) | 419 | struct sigscratch *scr) |
| 420 | { | 420 | { |
| 421 | if (!setup_frame(sig, ka, info, oldset, scr)) | 421 | if (!setup_frame(sig, ka, info, sigmask_to_save(), scr)) |
| 422 | return 0; | 422 | return 0; |
| 423 | 423 | ||
| 424 | block_sigmask(ka, sig); | 424 | block_sigmask(ka, sig); |
| @@ -440,7 +440,6 @@ void | |||
| 440 | ia64_do_signal (struct sigscratch *scr, long in_syscall) | 440 | ia64_do_signal (struct sigscratch *scr, long in_syscall) |
| 441 | { | 441 | { |
| 442 | struct k_sigaction ka; | 442 | struct k_sigaction ka; |
| 443 | sigset_t *oldset; | ||
| 444 | siginfo_t info; | 443 | siginfo_t info; |
| 445 | long restart = in_syscall; | 444 | long restart = in_syscall; |
| 446 | long errno = scr->pt.r8; | 445 | long errno = scr->pt.r8; |
| @@ -453,11 +452,6 @@ ia64_do_signal (struct sigscratch *scr, long in_syscall) | |||
| 453 | if (!user_mode(&scr->pt)) | 452 | if (!user_mode(&scr->pt)) |
| 454 | return; | 453 | return; |
| 455 | 454 | ||
| 456 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) | ||
| 457 | oldset = ¤t->saved_sigmask; | ||
| 458 | else | ||
| 459 | oldset = ¤t->blocked; | ||
| 460 | |||
| 461 | /* | 455 | /* |
| 462 | * This only loops in the rare cases of handle_signal() failing, in which case we | 456 | * This only loops in the rare cases of handle_signal() failing, in which case we |
| 463 | * need to push through a forced SIGSEGV. | 457 | * need to push through a forced SIGSEGV. |
| @@ -507,7 +501,7 @@ ia64_do_signal (struct sigscratch *scr, long in_syscall) | |||
| 507 | * Whee! Actually deliver the signal. If the delivery failed, we need to | 501 | * Whee! Actually deliver the signal. If the delivery failed, we need to |
| 508 | * continue to iterate in this loop so we can deliver the SIGSEGV... | 502 | * continue to iterate in this loop so we can deliver the SIGSEGV... |
| 509 | */ | 503 | */ |
| 510 | if (handle_signal(signr, &ka, &info, oldset, scr)) { | 504 | if (handle_signal(signr, &ka, &info, scr)) { |
| 511 | /* | 505 | /* |
| 512 | * A signal was successfully delivered; the saved | 506 | * A signal was successfully delivered; the saved |
| 513 | * sigmask will have been stored in the signal frame, | 507 | * sigmask will have been stored in the signal frame, |
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c index 2ad7c4587669..e0d6d1079f33 100644 --- a/arch/m32r/kernel/signal.c +++ b/arch/m32r/kernel/signal.c | |||
| @@ -269,7 +269,7 @@ static int prev_insn(struct pt_regs *regs) | |||
| 269 | 269 | ||
| 270 | static int | 270 | static int |
| 271 | handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | 271 | handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, |
| 272 | sigset_t *oldset, struct pt_regs *regs) | 272 | struct pt_regs *regs) |
| 273 | { | 273 | { |
| 274 | /* Are we from a system call? */ | 274 | /* Are we from a system call? */ |
| 275 | if (regs->syscall_nr >= 0) { | 275 | if (regs->syscall_nr >= 0) { |
| @@ -294,7 +294,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 294 | } | 294 | } |
| 295 | 295 | ||
| 296 | /* Set up the stack frame */ | 296 | /* Set up the stack frame */ |
| 297 | if (setup_rt_frame(sig, ka, info, oldset, regs)) | 297 | if (setup_rt_frame(sig, ka, info, sigmask_to_save(), regs)) |
| 298 | return -EFAULT; | 298 | return -EFAULT; |
| 299 | 299 | ||
| 300 | block_sigmask(ka, sig); | 300 | block_sigmask(ka, sig); |
| @@ -311,7 +311,6 @@ static void do_signal(struct pt_regs *regs) | |||
| 311 | siginfo_t info; | 311 | siginfo_t info; |
| 312 | int signr; | 312 | int signr; |
| 313 | struct k_sigaction ka; | 313 | struct k_sigaction ka; |
| 314 | sigset_t *oldset; | ||
| 315 | 314 | ||
| 316 | /* | 315 | /* |
| 317 | * We want the common case to go fast, which | 316 | * We want the common case to go fast, which |
| @@ -325,11 +324,6 @@ static void do_signal(struct pt_regs *regs) | |||
| 325 | if (try_to_freeze()) | 324 | if (try_to_freeze()) |
| 326 | goto no_signal; | 325 | goto no_signal; |
| 327 | 326 | ||
| 328 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 329 | oldset = ¤t->saved_sigmask; | ||
| 330 | else | ||
| 331 | oldset = ¤t->blocked; | ||
| 332 | |||
| 333 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 327 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 334 | if (signr > 0) { | 328 | if (signr > 0) { |
| 335 | /* Re-enable any watchpoints before delivering the | 329 | /* Re-enable any watchpoints before delivering the |
| @@ -339,7 +333,7 @@ static void do_signal(struct pt_regs *regs) | |||
| 339 | */ | 333 | */ |
| 340 | 334 | ||
| 341 | /* Whee! Actually deliver the signal. */ | 335 | /* Whee! Actually deliver the signal. */ |
| 342 | if (handle_signal(signr, &ka, &info, oldset, regs) == 0) | 336 | if (handle_signal(signr, &ka, &info, regs) == 0) |
| 343 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 337 | clear_thread_flag(TIF_RESTORE_SIGMASK); |
| 344 | 338 | ||
| 345 | return; | 339 | return; |
diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c index 685cbe84f33f..c83eb5a8ed8b 100644 --- a/arch/m68k/kernel/signal.c +++ b/arch/m68k/kernel/signal.c | |||
| @@ -1123,8 +1123,9 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler) | |||
| 1123 | */ | 1123 | */ |
| 1124 | static void | 1124 | static void |
| 1125 | handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, | 1125 | handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, |
| 1126 | sigset_t *oldset, struct pt_regs *regs) | 1126 | struct pt_regs *regs) |
| 1127 | { | 1127 | { |
| 1128 | sigset_t *oldset = sigmask_to_save(); | ||
| 1128 | int err; | 1129 | int err; |
| 1129 | /* are we from a system call? */ | 1130 | /* are we from a system call? */ |
| 1130 | if (regs->orig_d0 >= 0) | 1131 | if (regs->orig_d0 >= 0) |
| @@ -1160,19 +1161,13 @@ static void do_signal(struct pt_regs *regs) | |||
| 1160 | siginfo_t info; | 1161 | siginfo_t info; |
| 1161 | struct k_sigaction ka; | 1162 | struct k_sigaction ka; |
| 1162 | int signr; | 1163 | int signr; |
| 1163 | sigset_t *oldset; | ||
| 1164 | 1164 | ||
| 1165 | current->thread.esp0 = (unsigned long) regs; | 1165 | current->thread.esp0 = (unsigned long) regs; |
| 1166 | 1166 | ||
| 1167 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 1168 | oldset = ¤t->saved_sigmask; | ||
| 1169 | else | ||
| 1170 | oldset = ¤t->blocked; | ||
| 1171 | |||
| 1172 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 1167 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 1173 | if (signr > 0) { | 1168 | if (signr > 0) { |
| 1174 | /* Whee! Actually deliver the signal. */ | 1169 | /* Whee! Actually deliver the signal. */ |
| 1175 | handle_signal(signr, &ka, &info, oldset, regs); | 1170 | handle_signal(signr, &ka, &info, regs); |
| 1176 | return; | 1171 | return; |
| 1177 | } | 1172 | } |
| 1178 | 1173 | ||
diff --git a/arch/microblaze/kernel/signal.c b/arch/microblaze/kernel/signal.c index 8e644dfaba4f..fd2de5718a4e 100644 --- a/arch/microblaze/kernel/signal.c +++ b/arch/microblaze/kernel/signal.c | |||
| @@ -312,8 +312,9 @@ do_restart: | |||
| 312 | 312 | ||
| 313 | static int | 313 | static int |
| 314 | handle_signal(unsigned long sig, struct k_sigaction *ka, | 314 | handle_signal(unsigned long sig, struct k_sigaction *ka, |
| 315 | siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) | 315 | siginfo_t *info, struct pt_regs *regs) |
| 316 | { | 316 | { |
| 317 | sigset_t *oldset = sigmask_to_save(); | ||
| 317 | int ret; | 318 | int ret; |
| 318 | 319 | ||
| 319 | /* Set up the stack frame */ | 320 | /* Set up the stack frame */ |
| @@ -344,18 +345,12 @@ static void do_signal(struct pt_regs *regs, int in_syscall) | |||
| 344 | siginfo_t info; | 345 | siginfo_t info; |
| 345 | int signr; | 346 | int signr; |
| 346 | struct k_sigaction ka; | 347 | struct k_sigaction ka; |
| 347 | sigset_t *oldset; | ||
| 348 | #ifdef DEBUG_SIG | 348 | #ifdef DEBUG_SIG |
| 349 | printk(KERN_INFO "do signal: %p %d\n", regs, in_syscall); | 349 | printk(KERN_INFO "do signal: %p %d\n", regs, in_syscall); |
| 350 | printk(KERN_INFO "do signal2: %lx %lx %ld [%lx]\n", regs->pc, regs->r1, | 350 | printk(KERN_INFO "do signal2: %lx %lx %ld [%lx]\n", regs->pc, regs->r1, |
| 351 | regs->r12, current_thread_info()->flags); | 351 | regs->r12, current_thread_info()->flags); |
| 352 | #endif | 352 | #endif |
| 353 | 353 | ||
| 354 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) | ||
| 355 | oldset = ¤t->saved_sigmask; | ||
| 356 | else | ||
| 357 | oldset = ¤t->blocked; | ||
| 358 | |||
| 359 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 354 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 360 | if (signr > 0) { | 355 | if (signr > 0) { |
| 361 | /* Whee! Actually deliver the signal. */ | 356 | /* Whee! Actually deliver the signal. */ |
diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c index aad2d2da5eec..18355060f241 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c | |||
| @@ -515,8 +515,9 @@ struct mips_abi mips_abi = { | |||
| 515 | }; | 515 | }; |
| 516 | 516 | ||
| 517 | static int handle_signal(unsigned long sig, siginfo_t *info, | 517 | static int handle_signal(unsigned long sig, siginfo_t *info, |
| 518 | struct k_sigaction *ka, sigset_t *oldset, struct pt_regs *regs) | 518 | struct k_sigaction *ka, struct pt_regs *regs) |
| 519 | { | 519 | { |
| 520 | sigset_t *oldset = sigmask_to_save(); | ||
| 520 | int ret; | 521 | int ret; |
| 521 | struct mips_abi *abi = current->thread.abi; | 522 | struct mips_abi *abi = current->thread.abi; |
| 522 | void *vdso = current->mm->context.vdso; | 523 | void *vdso = current->mm->context.vdso; |
| @@ -560,7 +561,6 @@ static int handle_signal(unsigned long sig, siginfo_t *info, | |||
| 560 | static void do_signal(struct pt_regs *regs) | 561 | static void do_signal(struct pt_regs *regs) |
| 561 | { | 562 | { |
| 562 | struct k_sigaction ka; | 563 | struct k_sigaction ka; |
| 563 | sigset_t *oldset; | ||
| 564 | siginfo_t info; | 564 | siginfo_t info; |
| 565 | int signr; | 565 | int signr; |
| 566 | 566 | ||
| @@ -572,15 +572,10 @@ static void do_signal(struct pt_regs *regs) | |||
| 572 | if (!user_mode(regs)) | 572 | if (!user_mode(regs)) |
| 573 | return; | 573 | return; |
| 574 | 574 | ||
| 575 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 576 | oldset = ¤t->saved_sigmask; | ||
| 577 | else | ||
| 578 | oldset = ¤t->blocked; | ||
| 579 | |||
| 580 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 575 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 581 | if (signr > 0) { | 576 | if (signr > 0) { |
| 582 | /* Whee! Actually deliver the signal. */ | 577 | /* Whee! Actually deliver the signal. */ |
| 583 | if (handle_signal(signr, &info, &ka, oldset, regs) == 0) { | 578 | if (handle_signal(signr, &info, &ka, regs) == 0) { |
| 584 | /* | 579 | /* |
| 585 | * A signal was successfully delivered; the saved | 580 | * A signal was successfully delivered; the saved |
| 586 | * sigmask will have been stored in the signal frame, | 581 | * sigmask will have been stored in the signal frame, |
diff --git a/arch/mn10300/kernel/signal.c b/arch/mn10300/kernel/signal.c index b7994c38eacc..26a1d98c62a1 100644 --- a/arch/mn10300/kernel/signal.c +++ b/arch/mn10300/kernel/signal.c | |||
| @@ -430,8 +430,9 @@ static inline void stepback(struct pt_regs *regs) | |||
| 430 | */ | 430 | */ |
| 431 | static int handle_signal(int sig, | 431 | static int handle_signal(int sig, |
| 432 | siginfo_t *info, struct k_sigaction *ka, | 432 | siginfo_t *info, struct k_sigaction *ka, |
| 433 | sigset_t *oldset, struct pt_regs *regs) | 433 | struct pt_regs *regs) |
| 434 | { | 434 | { |
| 435 | sigset_t *oldset = sigmask_to_save(); | ||
| 435 | int ret; | 436 | int ret; |
| 436 | 437 | ||
| 437 | /* Are we from a system call? */ | 438 | /* Are we from a system call? */ |
| @@ -475,7 +476,6 @@ static void do_signal(struct pt_regs *regs) | |||
| 475 | { | 476 | { |
| 476 | struct k_sigaction ka; | 477 | struct k_sigaction ka; |
| 477 | siginfo_t info; | 478 | siginfo_t info; |
| 478 | sigset_t *oldset; | ||
| 479 | int signr; | 479 | int signr; |
| 480 | 480 | ||
| 481 | /* we want the common case to go fast, which is why we may in certain | 481 | /* we want the common case to go fast, which is why we may in certain |
| @@ -483,14 +483,9 @@ static void do_signal(struct pt_regs *regs) | |||
| 483 | if (!user_mode(regs)) | 483 | if (!user_mode(regs)) |
| 484 | return; | 484 | return; |
| 485 | 485 | ||
| 486 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 487 | oldset = ¤t->saved_sigmask; | ||
| 488 | else | ||
| 489 | oldset = ¤t->blocked; | ||
| 490 | |||
| 491 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 486 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 492 | if (signr > 0) { | 487 | if (signr > 0) { |
| 493 | if (handle_signal(signr, &info, &ka, oldset, regs) == 0) { | 488 | if (handle_signal(signr, &info, &ka, regs) == 0) { |
| 494 | /* a signal was successfully delivered; the saved | 489 | /* a signal was successfully delivered; the saved |
| 495 | * sigmask will have been stored in the signal frame, | 490 | * sigmask will have been stored in the signal frame, |
| 496 | * and will be restored by sigreturn, so we can simply | 491 | * and will be restored by sigreturn, so we can simply |
diff --git a/arch/openrisc/kernel/signal.c b/arch/openrisc/kernel/signal.c index 266c6fd2eb5c..721c584ff44a 100644 --- a/arch/openrisc/kernel/signal.c +++ b/arch/openrisc/kernel/signal.c | |||
| @@ -254,11 +254,11 @@ give_sigsegv: | |||
| 254 | static inline int | 254 | static inline int |
| 255 | handle_signal(unsigned long sig, | 255 | handle_signal(unsigned long sig, |
| 256 | siginfo_t *info, struct k_sigaction *ka, | 256 | siginfo_t *info, struct k_sigaction *ka, |
| 257 | sigset_t *oldset, struct pt_regs *regs) | 257 | struct pt_regs *regs) |
| 258 | { | 258 | { |
| 259 | int ret; | 259 | int ret; |
| 260 | 260 | ||
| 261 | ret = setup_rt_frame(sig, ka, info, oldset, regs); | 261 | ret = setup_rt_frame(sig, ka, info, sigmask_to_save(), regs); |
| 262 | if (ret) | 262 | if (ret) |
| 263 | return ret; | 263 | return ret; |
| 264 | 264 | ||
| @@ -341,15 +341,9 @@ void do_signal(struct pt_regs *regs) | |||
| 341 | * back */ | 341 | * back */ |
| 342 | restore_saved_sigmask(); | 342 | restore_saved_sigmask(); |
| 343 | } else { /* signr > 0 */ | 343 | } else { /* signr > 0 */ |
| 344 | sigset_t *oldset; | ||
| 345 | |||
| 346 | if (current_thread_info()->flags & _TIF_RESTORE_SIGMASK) | ||
| 347 | oldset = ¤t->saved_sigmask; | ||
| 348 | else | ||
| 349 | oldset = ¤t->blocked; | ||
| 350 | 344 | ||
| 351 | /* Whee! Actually deliver the signal. */ | 345 | /* Whee! Actually deliver the signal. */ |
| 352 | if (!handle_signal(signr, &info, &ka, oldset, regs)) { | 346 | if (!handle_signal(signr, &info, &ka, regs)) { |
| 353 | /* a signal was successfully delivered; the saved | 347 | /* a signal was successfully delivered; the saved |
| 354 | * sigmask will have been stored in the signal frame, | 348 | * sigmask will have been stored in the signal frame, |
| 355 | * and will be restored by sigreturn, so we can simply | 349 | * and will be restored by sigreturn, so we can simply |
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index 277cacadf653..441b25992846 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
| @@ -443,8 +443,9 @@ give_sigsegv: | |||
| 443 | 443 | ||
| 444 | static long | 444 | static long |
| 445 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | 445 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, |
| 446 | sigset_t *oldset, struct pt_regs *regs, int in_syscall) | 446 | struct pt_regs *regs, int in_syscall) |
| 447 | { | 447 | { |
| 448 | sigset_t *oldset = sigmask_to_save(); | ||
| 448 | DBG(1,"handle_signal: sig=%ld, ka=%p, info=%p, oldset=%p, regs=%p\n", | 449 | DBG(1,"handle_signal: sig=%ld, ka=%p, info=%p, oldset=%p, regs=%p\n", |
| 449 | sig, ka, info, oldset, regs); | 450 | sig, ka, info, oldset, regs); |
| 450 | 451 | ||
| @@ -568,28 +569,17 @@ do_signal(struct pt_regs *regs, long in_syscall) | |||
| 568 | siginfo_t info; | 569 | siginfo_t info; |
| 569 | struct k_sigaction ka; | 570 | struct k_sigaction ka; |
| 570 | int signr; | 571 | int signr; |
| 571 | sigset_t *oldset; | ||
| 572 | 572 | ||
| 573 | DBG(1,"\ndo_signal: oldset=0x%p, regs=0x%p, sr7 %#lx, in_syscall=%d\n", | 573 | DBG(1,"\ndo_signal: regs=0x%p, sr7 %#lx, in_syscall=%d\n", |
| 574 | oldset, regs, regs->sr[7], in_syscall); | 574 | regs, regs->sr[7], in_syscall); |
| 575 | 575 | ||
| 576 | /* Everyone else checks to see if they are in kernel mode at | 576 | /* Everyone else checks to see if they are in kernel mode at |
| 577 | this point and exits if that's the case. I'm not sure why | 577 | this point and exits if that's the case. I'm not sure why |
| 578 | we would be called in that case, but for some reason we | 578 | we would be called in that case, but for some reason we |
| 579 | are. */ | 579 | are. */ |
| 580 | 580 | ||
| 581 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 582 | oldset = ¤t->saved_sigmask; | ||
| 583 | else | ||
| 584 | oldset = ¤t->blocked; | ||
| 585 | |||
| 586 | DBG(1,"do_signal: oldset %08lx / %08lx\n", | ||
| 587 | oldset->sig[0], oldset->sig[1]); | ||
| 588 | |||
| 589 | |||
| 590 | /* May need to force signal if handle_signal failed to deliver */ | 581 | /* May need to force signal if handle_signal failed to deliver */ |
| 591 | while (1) { | 582 | while (1) { |
| 592 | |||
| 593 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 583 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 594 | DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]); | 584 | DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]); |
| 595 | 585 | ||
| @@ -603,8 +593,7 @@ do_signal(struct pt_regs *regs, long in_syscall) | |||
| 603 | /* Whee! Actually deliver the signal. If the | 593 | /* Whee! Actually deliver the signal. If the |
| 604 | delivery failed, we need to continue to iterate in | 594 | delivery failed, we need to continue to iterate in |
| 605 | this loop so we can deliver the SIGSEGV... */ | 595 | this loop so we can deliver the SIGSEGV... */ |
| 606 | if (handle_signal(signr, &info, &ka, oldset, | 596 | if (handle_signal(signr, &info, &ka, regs, in_syscall)) { |
| 607 | regs, in_syscall)) { | ||
| 608 | DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n", | 597 | DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n", |
| 609 | regs->gr[28]); | 598 | regs->gr[28]); |
| 610 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 599 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c index 0f4cc67f4268..8e9ddab7ade6 100644 --- a/arch/powerpc/kernel/signal.c +++ b/arch/powerpc/kernel/signal.c | |||
| @@ -114,18 +114,13 @@ static void check_syscall_restart(struct pt_regs *regs, struct k_sigaction *ka, | |||
| 114 | 114 | ||
| 115 | static int do_signal(struct pt_regs *regs) | 115 | static int do_signal(struct pt_regs *regs) |
| 116 | { | 116 | { |
| 117 | sigset_t *oldset; | 117 | sigset_t *oldset = sigmask_to_save(); |
| 118 | siginfo_t info; | 118 | siginfo_t info; |
| 119 | int signr; | 119 | int signr; |
| 120 | struct k_sigaction ka; | 120 | struct k_sigaction ka; |
| 121 | int ret; | 121 | int ret; |
| 122 | int is32 = is_32bit_task(); | 122 | int is32 = is_32bit_task(); |
| 123 | 123 | ||
| 124 | if (current_thread_info()->local_flags & _TLF_RESTORE_SIGMASK) | ||
| 125 | oldset = ¤t->saved_sigmask; | ||
| 126 | else | ||
| 127 | oldset = ¤t->blocked; | ||
| 128 | |||
| 129 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 124 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 130 | 125 | ||
| 131 | /* Is there any syscall restart business here ? */ | 126 | /* Is there any syscall restart business here ? */ |
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index 37799089c38e..c880c48a09f3 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
| @@ -398,12 +398,7 @@ void do_signal(struct pt_regs *regs) | |||
| 398 | siginfo_t info; | 398 | siginfo_t info; |
| 399 | int signr; | 399 | int signr; |
| 400 | struct k_sigaction ka; | 400 | struct k_sigaction ka; |
| 401 | sigset_t *oldset; | 401 | sigset_t *oldset = sigmask_to_save(); |
| 402 | |||
| 403 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 404 | oldset = ¤t->saved_sigmask; | ||
| 405 | else | ||
| 406 | oldset = ¤t->blocked; | ||
| 407 | 402 | ||
| 408 | /* | 403 | /* |
| 409 | * Get signal to deliver. When running under ptrace, at this point | 404 | * Get signal to deliver. When running under ptrace, at this point |
diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c index 9e751559375b..b24dfaf2462f 100644 --- a/arch/score/kernel/signal.c +++ b/arch/score/kernel/signal.c | |||
| @@ -242,7 +242,7 @@ give_sigsegv: | |||
| 242 | } | 242 | } |
| 243 | 243 | ||
| 244 | static int handle_signal(unsigned long sig, siginfo_t *info, | 244 | static int handle_signal(unsigned long sig, siginfo_t *info, |
| 245 | struct k_sigaction *ka, sigset_t *oldset, struct pt_regs *regs) | 245 | struct k_sigaction *ka, struct pt_regs *regs) |
| 246 | { | 246 | { |
| 247 | int ret; | 247 | int ret; |
| 248 | 248 | ||
| @@ -269,7 +269,7 @@ static int handle_signal(unsigned long sig, siginfo_t *info, | |||
| 269 | /* | 269 | /* |
| 270 | * Set up the stack frame | 270 | * Set up the stack frame |
| 271 | */ | 271 | */ |
| 272 | ret = setup_rt_frame(ka, regs, sig, oldset, info); | 272 | ret = setup_rt_frame(ka, regs, sig, sigmask_to_save(), info); |
| 273 | 273 | ||
| 274 | if (ret == 0) | 274 | if (ret == 0) |
| 275 | block_sigmask(ka, sig); | 275 | block_sigmask(ka, sig); |
| @@ -280,7 +280,6 @@ static int handle_signal(unsigned long sig, siginfo_t *info, | |||
| 280 | static void do_signal(struct pt_regs *regs) | 280 | static void do_signal(struct pt_regs *regs) |
| 281 | { | 281 | { |
| 282 | struct k_sigaction ka; | 282 | struct k_sigaction ka; |
| 283 | sigset_t *oldset; | ||
| 284 | siginfo_t info; | 283 | siginfo_t info; |
| 285 | int signr; | 284 | int signr; |
| 286 | 285 | ||
| @@ -292,15 +291,10 @@ static void do_signal(struct pt_regs *regs) | |||
| 292 | if (!user_mode(regs)) | 291 | if (!user_mode(regs)) |
| 293 | return; | 292 | return; |
| 294 | 293 | ||
| 295 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 296 | oldset = ¤t->saved_sigmask; | ||
| 297 | else | ||
| 298 | oldset = ¤t->blocked; | ||
| 299 | |||
| 300 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 294 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 301 | if (signr > 0) { | 295 | if (signr > 0) { |
| 302 | /* Actually deliver the signal. */ | 296 | /* Actually deliver the signal. */ |
| 303 | if (handle_signal(signr, &info, &ka, oldset, regs) == 0) { | 297 | if (handle_signal(signr, &info, &ka, regs) == 0) { |
| 304 | /* | 298 | /* |
| 305 | * A signal was successfully delivered; the saved | 299 | * A signal was successfully delivered; the saved |
| 306 | * sigmask will have been stored in the signal frame, | 300 | * sigmask will have been stored in the signal frame, |
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c index 92f4173ad29a..bfb3d599f032 100644 --- a/arch/sh/kernel/signal_32.c +++ b/arch/sh/kernel/signal_32.c | |||
| @@ -524,8 +524,9 @@ handle_syscall_restart(unsigned long save_r0, struct pt_regs *regs, | |||
| 524 | */ | 524 | */ |
| 525 | static int | 525 | static int |
| 526 | handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | 526 | handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, |
| 527 | sigset_t *oldset, struct pt_regs *regs, unsigned int save_r0) | 527 | struct pt_regs *regs, unsigned int save_r0) |
| 528 | { | 528 | { |
| 529 | sigset_t *oldset = sigmask_to_save(); | ||
| 529 | int ret; | 530 | int ret; |
| 530 | 531 | ||
| 531 | /* Set up the stack frame */ | 532 | /* Set up the stack frame */ |
| @@ -554,7 +555,6 @@ static void do_signal(struct pt_regs *regs, unsigned int save_r0) | |||
| 554 | siginfo_t info; | 555 | siginfo_t info; |
| 555 | int signr; | 556 | int signr; |
| 556 | struct k_sigaction ka; | 557 | struct k_sigaction ka; |
| 557 | sigset_t *oldset; | ||
| 558 | 558 | ||
| 559 | /* | 559 | /* |
| 560 | * We want the common case to go fast, which | 560 | * We want the common case to go fast, which |
| @@ -565,17 +565,12 @@ static void do_signal(struct pt_regs *regs, unsigned int save_r0) | |||
| 565 | if (!user_mode(regs)) | 565 | if (!user_mode(regs)) |
| 566 | return; | 566 | return; |
| 567 | 567 | ||
| 568 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) | ||
| 569 | oldset = ¤t->saved_sigmask; | ||
| 570 | else | ||
| 571 | oldset = ¤t->blocked; | ||
| 572 | |||
| 573 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 568 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 574 | if (signr > 0) { | 569 | if (signr > 0) { |
| 575 | handle_syscall_restart(save_r0, regs, &ka.sa); | 570 | handle_syscall_restart(save_r0, regs, &ka.sa); |
| 576 | 571 | ||
| 577 | /* Whee! Actually deliver the signal. */ | 572 | /* Whee! Actually deliver the signal. */ |
| 578 | if (handle_signal(signr, &ka, &info, oldset, | 573 | if (handle_signal(signr, &ka, &info, |
| 579 | regs, save_r0) == 0) { | 574 | regs, save_r0) == 0) { |
| 580 | /* | 575 | /* |
| 581 | * A signal was successfully delivered; the saved | 576 | * A signal was successfully delivered; the saved |
diff --git a/arch/sh/kernel/signal_64.c b/arch/sh/kernel/signal_64.c index 6e191ef0aa62..cc22d2b2e3f2 100644 --- a/arch/sh/kernel/signal_64.c +++ b/arch/sh/kernel/signal_64.c | |||
| @@ -45,7 +45,7 @@ | |||
| 45 | 45 | ||
| 46 | static int | 46 | static int |
| 47 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | 47 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, |
| 48 | sigset_t *oldset, struct pt_regs * regs); | 48 | struct pt_regs * regs); |
| 49 | 49 | ||
| 50 | static inline void | 50 | static inline void |
| 51 | handle_syscall_restart(struct pt_regs *regs, struct sigaction *sa) | 51 | handle_syscall_restart(struct pt_regs *regs, struct sigaction *sa) |
| @@ -88,7 +88,6 @@ static void do_signal(struct pt_regs *regs) | |||
| 88 | siginfo_t info; | 88 | siginfo_t info; |
| 89 | int signr; | 89 | int signr; |
| 90 | struct k_sigaction ka; | 90 | struct k_sigaction ka; |
| 91 | sigset_t *oldset; | ||
| 92 | 91 | ||
| 93 | /* | 92 | /* |
| 94 | * We want the common case to go fast, which | 93 | * We want the common case to go fast, which |
| @@ -99,17 +98,12 @@ static void do_signal(struct pt_regs *regs) | |||
| 99 | if (!user_mode(regs)) | 98 | if (!user_mode(regs)) |
| 100 | return; | 99 | return; |
| 101 | 100 | ||
| 102 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) | ||
| 103 | oldset = ¤t->saved_sigmask; | ||
| 104 | else | ||
| 105 | oldset = ¤t->blocked; | ||
| 106 | |||
| 107 | signr = get_signal_to_deliver(&info, &ka, regs, 0); | 101 | signr = get_signal_to_deliver(&info, &ka, regs, 0); |
| 108 | if (signr > 0) { | 102 | if (signr > 0) { |
| 109 | handle_syscall_restart(regs, &ka.sa); | 103 | handle_syscall_restart(regs, &ka.sa); |
| 110 | 104 | ||
| 111 | /* Whee! Actually deliver the signal. */ | 105 | /* Whee! Actually deliver the signal. */ |
| 112 | if (handle_signal(signr, &info, &ka, oldset, regs) == 0) { | 106 | if (handle_signal(signr, &info, &ka, regs) == 0) { |
| 113 | /* | 107 | /* |
| 114 | * If a signal was successfully delivered, the | 108 | * If a signal was successfully delivered, the |
| 115 | * saved sigmask is in its frame, and we can | 109 | * saved sigmask is in its frame, and we can |
| @@ -656,8 +650,9 @@ give_sigsegv: | |||
| 656 | */ | 650 | */ |
| 657 | static int | 651 | static int |
| 658 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | 652 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, |
| 659 | sigset_t *oldset, struct pt_regs * regs) | 653 | struct pt_regs * regs) |
| 660 | { | 654 | { |
| 655 | sigset_t *oldset = sigmask_to_save(); | ||
| 661 | int ret; | 656 | int ret; |
| 662 | 657 | ||
| 663 | /* Set up the stack frame */ | 658 | /* Set up the stack frame */ |
diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c index 9dd97d2e171e..5d74410c787b 100644 --- a/arch/sparc/kernel/signal_32.c +++ b/arch/sparc/kernel/signal_32.c | |||
| @@ -451,8 +451,9 @@ sigsegv: | |||
| 451 | 451 | ||
| 452 | static inline int | 452 | static inline int |
| 453 | handle_signal(unsigned long signr, struct k_sigaction *ka, | 453 | handle_signal(unsigned long signr, struct k_sigaction *ka, |
| 454 | siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) | 454 | siginfo_t *info, struct pt_regs *regs) |
| 455 | { | 455 | { |
| 456 | sigset_t *oldset = sigmask_to_save(); | ||
| 456 | int err; | 457 | int err; |
| 457 | 458 | ||
| 458 | if (ka->sa.sa_flags & SA_SIGINFO) | 459 | if (ka->sa.sa_flags & SA_SIGINFO) |
| @@ -498,7 +499,6 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 498 | { | 499 | { |
| 499 | struct k_sigaction ka; | 500 | struct k_sigaction ka; |
| 500 | int restart_syscall; | 501 | int restart_syscall; |
| 501 | sigset_t *oldset; | ||
| 502 | siginfo_t info; | 502 | siginfo_t info; |
| 503 | int signr; | 503 | int signr; |
| 504 | 504 | ||
| @@ -523,11 +523,6 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 523 | if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) | 523 | if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) |
| 524 | regs->u_regs[UREG_G6] = orig_i0; | 524 | regs->u_regs[UREG_G6] = orig_i0; |
| 525 | 525 | ||
| 526 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 527 | oldset = ¤t->saved_sigmask; | ||
| 528 | else | ||
| 529 | oldset = ¤t->blocked; | ||
| 530 | |||
| 531 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 526 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 532 | 527 | ||
| 533 | /* If the debugger messes with the program counter, it clears | 528 | /* If the debugger messes with the program counter, it clears |
| @@ -544,7 +539,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 544 | if (signr > 0) { | 539 | if (signr > 0) { |
| 545 | if (restart_syscall) | 540 | if (restart_syscall) |
| 546 | syscall_restart(orig_i0, regs, &ka.sa); | 541 | syscall_restart(orig_i0, regs, &ka.sa); |
| 547 | if (handle_signal(signr, &ka, &info, oldset, regs) == 0) { | 542 | if (handle_signal(signr, &ka, &info, regs) == 0) { |
| 548 | /* a signal was successfully delivered; the saved | 543 | /* a signal was successfully delivered; the saved |
| 549 | * sigmask will have been stored in the signal frame, | 544 | * sigmask will have been stored in the signal frame, |
| 550 | * and will be restored by sigreturn, so we can simply | 545 | * and will be restored by sigreturn, so we can simply |
diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 55b820ee0ac9..088a733f83f9 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c | |||
| @@ -512,7 +512,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 512 | { | 512 | { |
| 513 | struct k_sigaction ka; | 513 | struct k_sigaction ka; |
| 514 | int restart_syscall; | 514 | int restart_syscall; |
| 515 | sigset_t *oldset; | 515 | sigset_t *oldset = sigmask_to_save(); |
| 516 | siginfo_t info; | 516 | siginfo_t info; |
| 517 | int signr; | 517 | int signr; |
| 518 | 518 | ||
| @@ -538,11 +538,6 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 538 | (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) | 538 | (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) |
| 539 | regs->u_regs[UREG_G6] = orig_i0; | 539 | regs->u_regs[UREG_G6] = orig_i0; |
| 540 | 540 | ||
| 541 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) | ||
| 542 | oldset = ¤t->saved_sigmask; | ||
| 543 | else | ||
| 544 | oldset = ¤t->blocked; | ||
| 545 | |||
| 546 | #ifdef CONFIG_COMPAT | 541 | #ifdef CONFIG_COMPAT |
| 547 | if (test_thread_flag(TIF_32BIT)) { | 542 | if (test_thread_flag(TIF_32BIT)) { |
| 548 | extern void do_signal32(sigset_t *, struct pt_regs *); | 543 | extern void do_signal32(sigset_t *, struct pt_regs *); |
diff --git a/arch/tile/kernel/signal.c b/arch/tile/kernel/signal.c index 62b3493ea77d..588c28b2db58 100644 --- a/arch/tile/kernel/signal.c +++ b/arch/tile/kernel/signal.c | |||
| @@ -243,9 +243,10 @@ give_sigsegv: | |||
| 243 | */ | 243 | */ |
| 244 | 244 | ||
| 245 | static int handle_signal(unsigned long sig, siginfo_t *info, | 245 | static int handle_signal(unsigned long sig, siginfo_t *info, |
| 246 | struct k_sigaction *ka, sigset_t *oldset, | 246 | struct k_sigaction *ka, |
| 247 | struct pt_regs *regs) | 247 | struct pt_regs *regs) |
| 248 | { | 248 | { |
| 249 | sigset_t *oldset = sigmask_to_save(); | ||
| 249 | int ret; | 250 | int ret; |
| 250 | 251 | ||
| 251 | /* Are we from a system call? */ | 252 | /* Are we from a system call? */ |
| @@ -299,7 +300,6 @@ void do_signal(struct pt_regs *regs) | |||
| 299 | siginfo_t info; | 300 | siginfo_t info; |
| 300 | int signr; | 301 | int signr; |
| 301 | struct k_sigaction ka; | 302 | struct k_sigaction ka; |
| 302 | sigset_t *oldset; | ||
| 303 | 303 | ||
| 304 | /* | 304 | /* |
| 305 | * i386 will check if we're coming from kernel mode and bail out | 305 | * i386 will check if we're coming from kernel mode and bail out |
| @@ -308,15 +308,10 @@ void do_signal(struct pt_regs *regs) | |||
| 308 | * helpful, we can reinstate the check on "!user_mode(regs)". | 308 | * helpful, we can reinstate the check on "!user_mode(regs)". |
| 309 | */ | 309 | */ |
| 310 | 310 | ||
| 311 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) | ||
| 312 | oldset = ¤t->saved_sigmask; | ||
| 313 | else | ||
| 314 | oldset = ¤t->blocked; | ||
| 315 | |||
| 316 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 311 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 317 | if (signr > 0) { | 312 | if (signr > 0) { |
| 318 | /* Whee! Actually deliver the signal. */ | 313 | /* Whee! Actually deliver the signal. */ |
| 319 | if (handle_signal(signr, &info, &ka, oldset, regs) == 0) { | 314 | if (handle_signal(signr, &info, &ka, regs) == 0) { |
| 320 | /* | 315 | /* |
| 321 | * A signal was successfully delivered; the saved | 316 | * A signal was successfully delivered; the saved |
| 322 | * sigmask will have been stored in the signal frame, | 317 | * sigmask will have been stored in the signal frame, |
diff --git a/arch/um/kernel/signal.c b/arch/um/kernel/signal.c index 6acf13c1740b..909e9b8d6612 100644 --- a/arch/um/kernel/signal.c +++ b/arch/um/kernel/signal.c | |||
| @@ -23,9 +23,9 @@ EXPORT_SYMBOL(unblock_signals); | |||
| 23 | * OK, we're invoking a handler | 23 | * OK, we're invoking a handler |
| 24 | */ | 24 | */ |
| 25 | static int handle_signal(struct pt_regs *regs, unsigned long signr, | 25 | static int handle_signal(struct pt_regs *regs, unsigned long signr, |
| 26 | struct k_sigaction *ka, siginfo_t *info, | 26 | struct k_sigaction *ka, siginfo_t *info) |
| 27 | sigset_t *oldset) | ||
| 28 | { | 27 | { |
| 28 | sigset_t *oldset = sigmask_to_save(); | ||
| 29 | unsigned long sp; | 29 | unsigned long sp; |
| 30 | int err; | 30 | int err; |
| 31 | 31 | ||
| @@ -77,14 +77,9 @@ static int kern_do_signal(struct pt_regs *regs) | |||
| 77 | int sig, handled_sig = 0; | 77 | int sig, handled_sig = 0; |
| 78 | 78 | ||
| 79 | while ((sig = get_signal_to_deliver(&info, &ka_copy, regs, NULL)) > 0) { | 79 | while ((sig = get_signal_to_deliver(&info, &ka_copy, regs, NULL)) > 0) { |
| 80 | sigset_t *oldset; | ||
| 81 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 82 | oldset = ¤t->saved_sigmask; | ||
| 83 | else | ||
| 84 | oldset = ¤t->blocked; | ||
| 85 | handled_sig = 1; | 80 | handled_sig = 1; |
| 86 | /* Whee! Actually deliver the signal. */ | 81 | /* Whee! Actually deliver the signal. */ |
| 87 | if (!handle_signal(regs, sig, &ka_copy, &info, oldset)) { | 82 | if (!handle_signal(regs, sig, &ka_copy, &info)) { |
| 88 | /* | 83 | /* |
| 89 | * a signal was successfully delivered; the saved | 84 | * a signal was successfully delivered; the saved |
| 90 | * sigmask will have been stored in the signal frame, | 85 | * sigmask will have been stored in the signal frame, |
diff --git a/arch/unicore32/kernel/signal.c b/arch/unicore32/kernel/signal.c index 65a5ed3b6f2a..bf23194dc74d 100644 --- a/arch/unicore32/kernel/signal.c +++ b/arch/unicore32/kernel/signal.c | |||
| @@ -313,12 +313,11 @@ static inline void setup_syscall_restart(struct pt_regs *regs) | |||
| 313 | * OK, we're invoking a handler | 313 | * OK, we're invoking a handler |
| 314 | */ | 314 | */ |
| 315 | static int handle_signal(unsigned long sig, struct k_sigaction *ka, | 315 | static int handle_signal(unsigned long sig, struct k_sigaction *ka, |
| 316 | siginfo_t *info, sigset_t *oldset, | 316 | siginfo_t *info, struct pt_regs *regs, int syscall) |
| 317 | struct pt_regs *regs, int syscall) | ||
| 318 | { | 317 | { |
| 319 | struct thread_info *thread = current_thread_info(); | 318 | struct thread_info *thread = current_thread_info(); |
| 320 | struct task_struct *tsk = current; | 319 | struct task_struct *tsk = current; |
| 321 | sigset_t blocked; | 320 | sigset_t *oldset = sigmask_to_save(); |
| 322 | int usig = sig; | 321 | int usig = sig; |
| 323 | int ret; | 322 | int ret; |
| 324 | 323 | ||
| @@ -404,13 +403,7 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
| 404 | 403 | ||
| 405 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 404 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| 406 | if (signr > 0) { | 405 | if (signr > 0) { |
| 407 | sigset_t *oldset; | 406 | if (handle_signal(signr, &ka, &info, regs, syscall) |
| 408 | |||
| 409 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 410 | oldset = ¤t->saved_sigmask; | ||
| 411 | else | ||
| 412 | oldset = ¤t->blocked; | ||
| 413 | if (handle_signal(signr, &ka, &info, oldset, regs, syscall) | ||
| 414 | == 0) { | 407 | == 0) { |
| 415 | /* | 408 | /* |
| 416 | * A signal was successfully delivered; the saved | 409 | * A signal was successfully delivered; the saved |
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index 25a4a81a51aa..56f3062c5111 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c | |||
| @@ -647,12 +647,9 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 647 | struct pt_regs *regs) | 647 | struct pt_regs *regs) |
| 648 | { | 648 | { |
| 649 | int usig = signr_convert(sig); | 649 | int usig = signr_convert(sig); |
| 650 | sigset_t *set = ¤t->blocked; | 650 | sigset_t *set = sigmask_to_save(); |
| 651 | int ret; | 651 | int ret; |
| 652 | 652 | ||
| 653 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) | ||
| 654 | set = ¤t->saved_sigmask; | ||
| 655 | |||
| 656 | /* Set up the stack frame */ | 653 | /* Set up the stack frame */ |
| 657 | if (is_ia32) { | 654 | if (is_ia32) { |
| 658 | if (ka->sa.sa_flags & SA_SIGINFO) | 655 | if (ka->sa.sa_flags & SA_SIGINFO) |
diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c index 8c4e751e3b83..e4b06e2d4eb9 100644 --- a/arch/xtensa/kernel/signal.c +++ b/arch/xtensa/kernel/signal.c | |||
| @@ -452,16 +452,10 @@ static void do_signal(struct pt_regs *regs) | |||
| 452 | siginfo_t info; | 452 | siginfo_t info; |
| 453 | int signr; | 453 | int signr; |
| 454 | struct k_sigaction ka; | 454 | struct k_sigaction ka; |
| 455 | sigset_t oldset; | ||
| 456 | 455 | ||
| 457 | if (try_to_freeze()) | 456 | if (try_to_freeze()) |
| 458 | goto no_signal; | 457 | goto no_signal; |
| 459 | 458 | ||
| 460 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 461 | oldset = ¤t->saved_sigmask; | ||
| 462 | else | ||
| 463 | oldset = ¤t->blocked; | ||
| 464 | |||
| 465 | task_pt_regs(current)->icountlevel = 0; | 459 | task_pt_regs(current)->icountlevel = 0; |
| 466 | 460 | ||
| 467 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 461 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| @@ -501,7 +495,7 @@ static void do_signal(struct pt_regs *regs) | |||
| 501 | 495 | ||
| 502 | /* Whee! Actually deliver the signal. */ | 496 | /* Whee! Actually deliver the signal. */ |
| 503 | /* Set up the stack frame */ | 497 | /* Set up the stack frame */ |
| 504 | ret = setup_frame(signr, &ka, &info, oldset, regs); | 498 | ret = setup_frame(signr, &ka, &info, sigmask_to_save(), regs); |
| 505 | if (ret) | 499 | if (ret) |
| 506 | return; | 500 | return; |
| 507 | 501 | ||
diff --git a/include/linux/sched.h b/include/linux/sched.h index f1b46b88f6f5..ded3fb63fb06 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -2213,6 +2213,14 @@ static inline void restore_saved_sigmask(void) | |||
| 2213 | set_current_blocked(¤t->saved_sigmask); | 2213 | set_current_blocked(¤t->saved_sigmask); |
| 2214 | } | 2214 | } |
| 2215 | 2215 | ||
| 2216 | static inline sigset_t *sigmask_to_save(void) | ||
| 2217 | { | ||
| 2218 | sigset_t *res = ¤t->blocked; | ||
| 2219 | if (unlikely(test_restore_sigmask())) | ||
| 2220 | res = ¤t->saved_sigmask; | ||
| 2221 | return res; | ||
| 2222 | } | ||
| 2223 | |||
| 2216 | static inline int kill_cad_pid(int sig, int priv) | 2224 | static inline int kill_cad_pid(int sig, int priv) |
| 2217 | { | 2225 | { |
| 2218 | return kill_pid(cad_pid, sig, priv); | 2226 | return kill_pid(cad_pid, sig, priv); |
