diff options
Diffstat (limited to 'arch/sparc/kernel')
| -rw-r--r-- | arch/sparc/kernel/pci.c | 3 | ||||
| -rw-r--r-- | arch/sparc/kernel/signal32.c | 21 | ||||
| -rw-r--r-- | arch/sparc/kernel/signal_32.c | 32 | ||||
| -rw-r--r-- | arch/sparc/kernel/signal_64.c | 32 |
4 files changed, 35 insertions, 53 deletions
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c index 1e94f946570e..8aa0d4408586 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c | |||
| @@ -230,7 +230,8 @@ static void pci_parse_of_addrs(struct platform_device *op, | |||
| 230 | res = &dev->resource[(i - PCI_BASE_ADDRESS_0) >> 2]; | 230 | res = &dev->resource[(i - PCI_BASE_ADDRESS_0) >> 2]; |
| 231 | } else if (i == dev->rom_base_reg) { | 231 | } else if (i == dev->rom_base_reg) { |
| 232 | res = &dev->resource[PCI_ROM_RESOURCE]; | 232 | res = &dev->resource[PCI_ROM_RESOURCE]; |
| 233 | flags |= IORESOURCE_READONLY | IORESOURCE_CACHEABLE; | 233 | flags |= IORESOURCE_READONLY | IORESOURCE_CACHEABLE |
| 234 | | IORESOURCE_SIZEALIGN; | ||
| 234 | } else { | 235 | } else { |
| 235 | printk(KERN_ERR "PCI: bad cfg reg num 0x%x\n", i); | 236 | printk(KERN_ERR "PCI: bad cfg reg num 0x%x\n", i); |
| 236 | continue; | 237 | continue; |
diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c index 1ba95aff5d59..2caa556db86d 100644 --- a/arch/sparc/kernel/signal32.c +++ b/arch/sparc/kernel/signal32.c | |||
| @@ -273,10 +273,7 @@ void do_sigreturn32(struct pt_regs *regs) | |||
| 273 | case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32); | 273 | case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32); |
| 274 | } | 274 | } |
| 275 | sigdelsetmask(&set, ~_BLOCKABLE); | 275 | sigdelsetmask(&set, ~_BLOCKABLE); |
| 276 | spin_lock_irq(¤t->sighand->siglock); | 276 | set_current_blocked(&set); |
| 277 | current->blocked = set; | ||
| 278 | recalc_sigpending(); | ||
| 279 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 280 | return; | 277 | return; |
| 281 | 278 | ||
| 282 | segv: | 279 | segv: |
| @@ -377,10 +374,7 @@ asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) | |||
| 377 | case 1: set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32); | 374 | case 1: set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32); |
| 378 | } | 375 | } |
| 379 | sigdelsetmask(&set, ~_BLOCKABLE); | 376 | sigdelsetmask(&set, ~_BLOCKABLE); |
| 380 | spin_lock_irq(¤t->sighand->siglock); | 377 | set_current_blocked(&set); |
| 381 | current->blocked = set; | ||
| 382 | recalc_sigpending(); | ||
| 383 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 384 | return; | 378 | return; |
| 385 | segv: | 379 | segv: |
| 386 | force_sig(SIGSEGV, current); | 380 | force_sig(SIGSEGV, current); |
| @@ -782,6 +776,7 @@ static inline int handle_signal32(unsigned long signr, struct k_sigaction *ka, | |||
| 782 | siginfo_t *info, | 776 | siginfo_t *info, |
| 783 | sigset_t *oldset, struct pt_regs *regs) | 777 | sigset_t *oldset, struct pt_regs *regs) |
| 784 | { | 778 | { |
| 779 | sigset_t blocked; | ||
| 785 | int err; | 780 | int err; |
| 786 | 781 | ||
| 787 | if (ka->sa.sa_flags & SA_SIGINFO) | 782 | if (ka->sa.sa_flags & SA_SIGINFO) |
| @@ -792,12 +787,10 @@ static inline int handle_signal32(unsigned long signr, struct k_sigaction *ka, | |||
| 792 | if (err) | 787 | if (err) |
| 793 | return err; | 788 | return err; |
| 794 | 789 | ||
| 795 | spin_lock_irq(¤t->sighand->siglock); | 790 | sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask); |
| 796 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
| 797 | if (!(ka->sa.sa_flags & SA_NOMASK)) | 791 | if (!(ka->sa.sa_flags & SA_NOMASK)) |
| 798 | sigaddset(¤t->blocked,signr); | 792 | sigaddset(&blocked, signr); |
| 799 | recalc_sigpending(); | 793 | set_current_blocked(&blocked); |
| 800 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 801 | 794 | ||
| 802 | tracehook_signal_handler(signr, info, ka, regs, 0); | 795 | tracehook_signal_handler(signr, info, ka, regs, 0); |
| 803 | 796 | ||
| @@ -881,7 +874,7 @@ void do_signal32(sigset_t *oldset, struct pt_regs * regs, | |||
| 881 | */ | 874 | */ |
| 882 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { | 875 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { |
| 883 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | 876 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
| 884 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 877 | set_current_blocked(¤t->saved_sigmask); |
| 885 | } | 878 | } |
| 886 | } | 879 | } |
| 887 | 880 | ||
diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c index 04ede8f04add..8ce247ac04cc 100644 --- a/arch/sparc/kernel/signal_32.c +++ b/arch/sparc/kernel/signal_32.c | |||
| @@ -62,12 +62,13 @@ struct rt_signal_frame { | |||
| 62 | 62 | ||
| 63 | static int _sigpause_common(old_sigset_t set) | 63 | static int _sigpause_common(old_sigset_t set) |
| 64 | { | 64 | { |
| 65 | set &= _BLOCKABLE; | 65 | sigset_t blocked; |
| 66 | spin_lock_irq(¤t->sighand->siglock); | 66 | |
| 67 | current->saved_sigmask = current->blocked; | 67 | current->saved_sigmask = current->blocked; |
| 68 | siginitset(¤t->blocked, set); | 68 | |
| 69 | recalc_sigpending(); | 69 | set &= _BLOCKABLE; |
| 70 | spin_unlock_irq(¤t->sighand->siglock); | 70 | siginitset(&blocked, set); |
| 71 | set_current_blocked(&blocked); | ||
| 71 | 72 | ||
| 72 | current->state = TASK_INTERRUPTIBLE; | 73 | current->state = TASK_INTERRUPTIBLE; |
| 73 | schedule(); | 74 | schedule(); |
| @@ -139,10 +140,7 @@ asmlinkage void do_sigreturn(struct pt_regs *regs) | |||
| 139 | goto segv_and_exit; | 140 | goto segv_and_exit; |
| 140 | 141 | ||
| 141 | sigdelsetmask(&set, ~_BLOCKABLE); | 142 | sigdelsetmask(&set, ~_BLOCKABLE); |
| 142 | spin_lock_irq(¤t->sighand->siglock); | 143 | set_current_blocked(&set); |
| 143 | current->blocked = set; | ||
| 144 | recalc_sigpending(); | ||
| 145 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 146 | return; | 144 | return; |
| 147 | 145 | ||
| 148 | segv_and_exit: | 146 | segv_and_exit: |
| @@ -209,10 +207,7 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs) | |||
| 209 | } | 207 | } |
| 210 | 208 | ||
| 211 | sigdelsetmask(&set, ~_BLOCKABLE); | 209 | sigdelsetmask(&set, ~_BLOCKABLE); |
| 212 | spin_lock_irq(¤t->sighand->siglock); | 210 | set_current_blocked(&set); |
| 213 | current->blocked = set; | ||
| 214 | recalc_sigpending(); | ||
| 215 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 216 | return; | 211 | return; |
| 217 | segv: | 212 | segv: |
| 218 | force_sig(SIGSEGV, current); | 213 | force_sig(SIGSEGV, current); |
| @@ -470,6 +465,7 @@ static inline int | |||
| 470 | handle_signal(unsigned long signr, struct k_sigaction *ka, | 465 | handle_signal(unsigned long signr, struct k_sigaction *ka, |
| 471 | siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) | 466 | siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) |
| 472 | { | 467 | { |
| 468 | sigset_t blocked; | ||
| 473 | int err; | 469 | int err; |
| 474 | 470 | ||
| 475 | if (ka->sa.sa_flags & SA_SIGINFO) | 471 | if (ka->sa.sa_flags & SA_SIGINFO) |
| @@ -480,12 +476,10 @@ handle_signal(unsigned long signr, struct k_sigaction *ka, | |||
| 480 | if (err) | 476 | if (err) |
| 481 | return err; | 477 | return err; |
| 482 | 478 | ||
| 483 | spin_lock_irq(¤t->sighand->siglock); | 479 | sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask); |
| 484 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
| 485 | if (!(ka->sa.sa_flags & SA_NOMASK)) | 480 | if (!(ka->sa.sa_flags & SA_NOMASK)) |
| 486 | sigaddset(¤t->blocked, signr); | 481 | sigaddset(&blocked, signr); |
| 487 | recalc_sigpending(); | 482 | set_current_blocked(&blocked); |
| 488 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 489 | 483 | ||
| 490 | tracehook_signal_handler(signr, info, ka, regs, 0); | 484 | tracehook_signal_handler(signr, info, ka, regs, 0); |
| 491 | 485 | ||
| @@ -581,7 +575,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 581 | */ | 575 | */ |
| 582 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | 576 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { |
| 583 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 577 | clear_thread_flag(TIF_RESTORE_SIGMASK); |
| 584 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 578 | set_current_blocked(¤t->saved_sigmask); |
| 585 | } | 579 | } |
| 586 | } | 580 | } |
| 587 | 581 | ||
diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 47509df3b893..a2b81598d905 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c | |||
| @@ -70,10 +70,7 @@ asmlinkage void sparc64_set_context(struct pt_regs *regs) | |||
| 70 | goto do_sigsegv; | 70 | goto do_sigsegv; |
| 71 | } | 71 | } |
| 72 | sigdelsetmask(&set, ~_BLOCKABLE); | 72 | sigdelsetmask(&set, ~_BLOCKABLE); |
| 73 | spin_lock_irq(¤t->sighand->siglock); | 73 | set_current_blocked(&set); |
| 74 | current->blocked = set; | ||
| 75 | recalc_sigpending(); | ||
| 76 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 77 | } | 74 | } |
| 78 | if (test_thread_flag(TIF_32BIT)) { | 75 | if (test_thread_flag(TIF_32BIT)) { |
| 79 | pc &= 0xffffffff; | 76 | pc &= 0xffffffff; |
| @@ -242,12 +239,13 @@ struct rt_signal_frame { | |||
| 242 | 239 | ||
| 243 | static long _sigpause_common(old_sigset_t set) | 240 | static long _sigpause_common(old_sigset_t set) |
| 244 | { | 241 | { |
| 245 | set &= _BLOCKABLE; | 242 | sigset_t blocked; |
| 246 | spin_lock_irq(¤t->sighand->siglock); | 243 | |
| 247 | current->saved_sigmask = current->blocked; | 244 | current->saved_sigmask = current->blocked; |
| 248 | siginitset(¤t->blocked, set); | 245 | |
| 249 | recalc_sigpending(); | 246 | set &= _BLOCKABLE; |
| 250 | spin_unlock_irq(¤t->sighand->siglock); | 247 | siginitset(&blocked, set); |
| 248 | set_current_blocked(&blocked); | ||
| 251 | 249 | ||
| 252 | current->state = TASK_INTERRUPTIBLE; | 250 | current->state = TASK_INTERRUPTIBLE; |
| 253 | schedule(); | 251 | schedule(); |
| @@ -327,10 +325,7 @@ void do_rt_sigreturn(struct pt_regs *regs) | |||
| 327 | pt_regs_clear_syscall(regs); | 325 | pt_regs_clear_syscall(regs); |
| 328 | 326 | ||
| 329 | sigdelsetmask(&set, ~_BLOCKABLE); | 327 | sigdelsetmask(&set, ~_BLOCKABLE); |
| 330 | spin_lock_irq(¤t->sighand->siglock); | 328 | set_current_blocked(&set); |
| 331 | current->blocked = set; | ||
| 332 | recalc_sigpending(); | ||
| 333 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 334 | return; | 329 | return; |
| 335 | segv: | 330 | segv: |
| 336 | force_sig(SIGSEGV, current); | 331 | force_sig(SIGSEGV, current); |
| @@ -484,18 +479,17 @@ static inline int handle_signal(unsigned long signr, struct k_sigaction *ka, | |||
| 484 | siginfo_t *info, | 479 | siginfo_t *info, |
| 485 | sigset_t *oldset, struct pt_regs *regs) | 480 | sigset_t *oldset, struct pt_regs *regs) |
| 486 | { | 481 | { |
| 482 | sigset_t blocked; | ||
| 487 | int err; | 483 | int err; |
| 488 | 484 | ||
| 489 | err = setup_rt_frame(ka, regs, signr, oldset, | 485 | err = setup_rt_frame(ka, regs, signr, oldset, |
| 490 | (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL); | 486 | (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL); |
| 491 | if (err) | 487 | if (err) |
| 492 | return err; | 488 | return err; |
| 493 | spin_lock_irq(¤t->sighand->siglock); | 489 | sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask); |
| 494 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
| 495 | if (!(ka->sa.sa_flags & SA_NOMASK)) | 490 | if (!(ka->sa.sa_flags & SA_NOMASK)) |
| 496 | sigaddset(¤t->blocked,signr); | 491 | sigaddset(&blocked, signr); |
| 497 | recalc_sigpending(); | 492 | set_current_blocked(&blocked); |
| 498 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 499 | 493 | ||
| 500 | tracehook_signal_handler(signr, info, ka, regs, 0); | 494 | tracehook_signal_handler(signr, info, ka, regs, 0); |
| 501 | 495 | ||
| @@ -601,7 +595,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 601 | */ | 595 | */ |
| 602 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { | 596 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { |
| 603 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | 597 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
| 604 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 598 | set_current_blocked(¤t->saved_sigmask); |
| 605 | } | 599 | } |
| 606 | } | 600 | } |
| 607 | 601 | ||
