diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-30 03:09:17 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-30 03:09:17 -0400 |
commit | f52b69f86e27903d6896ed5fa7cd280fec8de532 (patch) | |
tree | 0b213c61386153800afb459ca33e091bdec94570 /arch/sh/kernel | |
parent | 2f7fa1be66dce77608330c5eb918d6360b5525f2 (diff) | |
parent | b7e68d6876dfbab087bc3859211a9efc74cbe30c (diff) |
Merge tag 'sh-for-linus' of git://github.com/pmundt/linux-sh
Pull SuperH updates from Paul Mundt.
* tag 'sh-for-linus' of git://github.com/pmundt/linux-sh: (25 commits)
sh: Support I/O space swapping where needed.
sh: use set_current_blocked() and block_sigmask()
sh: no need to reset handler if SA_ONESHOT
sh: intc: Fix up section mismatch for intc_ack_data
sh: select ARCH_DISCARD_MEMBLOCK.
sh: Consolidate duplicate _32/_64 unistd definitions.
sh: ecovec: switch SDHI controllers to card polling
sh: Avoid exporting unimplemented syscalls.
sh: add platform_device for RSPI in setup-sh7757
SH: pci-sh7780: enable big-endian operation.
serial: sh-sci: fix a race of DMA submit_tx on transfer
sh: dma: Collect up CHCR of SH7763, SH7764, SH7780 and SH7785
sh: dma: Collect up CHCR of SH7723 and SH7730
sh/next: Fix build fail by asm/system.h in asm/bitops.h
arch/sh/drivers/dma/{dma-g2,dmabrg}.c: ensure arguments to request_irq and free_irq are compatible
sh: cpufreq: Wire up scaling_available_freqs support.
sh: cpufreq: notify about rate rounding fallback.
sh: cpufreq: Support CPU clock frequency table.
sh: cpufreq: struct device lookup from CPU topology.
sh: cpufreq: percpu struct clk accounting.
...
Diffstat (limited to 'arch/sh/kernel')
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7757.c | 20 | ||||
-rw-r--r-- | arch/sh/kernel/cpufreq.c | 121 | ||||
-rw-r--r-- | arch/sh/kernel/signal_32.c | 35 | ||||
-rw-r--r-- | arch/sh/kernel/signal_64.c | 40 | ||||
-rw-r--r-- | arch/sh/kernel/syscalls_32.S | 8 | ||||
-rw-r--r-- | arch/sh/kernel/syscalls_64.S | 8 |
6 files changed, 130 insertions, 102 deletions
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c index 2875e8be4f72..c8836cffa216 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c | |||
@@ -680,6 +680,25 @@ static struct platform_device spi1_device = { | |||
680 | .resource = spi1_resources, | 680 | .resource = spi1_resources, |
681 | }; | 681 | }; |
682 | 682 | ||
683 | static struct resource rspi_resources[] = { | ||
684 | { | ||
685 | .start = 0xfe480000, | ||
686 | .end = 0xfe4800ff, | ||
687 | .flags = IORESOURCE_MEM, | ||
688 | }, | ||
689 | { | ||
690 | .start = 220, | ||
691 | .flags = IORESOURCE_IRQ, | ||
692 | }, | ||
693 | }; | ||
694 | |||
695 | static struct platform_device rspi_device = { | ||
696 | .name = "rspi", | ||
697 | .id = 2, | ||
698 | .num_resources = ARRAY_SIZE(rspi_resources), | ||
699 | .resource = rspi_resources, | ||
700 | }; | ||
701 | |||
683 | static struct resource usb_ehci_resources[] = { | 702 | static struct resource usb_ehci_resources[] = { |
684 | [0] = { | 703 | [0] = { |
685 | .start = 0xfe4f1000, | 704 | .start = 0xfe4f1000, |
@@ -740,6 +759,7 @@ static struct platform_device *sh7757_devices[] __initdata = { | |||
740 | &dma3_device, | 759 | &dma3_device, |
741 | &spi0_device, | 760 | &spi0_device, |
742 | &spi1_device, | 761 | &spi1_device, |
762 | &rspi_device, | ||
743 | &usb_ehci_device, | 763 | &usb_ehci_device, |
744 | &usb_ohci_device, | 764 | &usb_ohci_device, |
745 | }; | 765 | }; |
diff --git a/arch/sh/kernel/cpufreq.c b/arch/sh/kernel/cpufreq.c index 0fffacea6ed9..e68b45b6f3f9 100644 --- a/arch/sh/kernel/cpufreq.c +++ b/arch/sh/kernel/cpufreq.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * cpufreq driver for the SuperH processors. | 4 | * cpufreq driver for the SuperH processors. |
5 | * | 5 | * |
6 | * Copyright (C) 2002 - 2007 Paul Mundt | 6 | * Copyright (C) 2002 - 2012 Paul Mundt |
7 | * Copyright (C) 2002 M. R. Brown | 7 | * Copyright (C) 2002 M. R. Brown |
8 | * | 8 | * |
9 | * Clock framework bits from arch/avr32/mach-at32ap/cpufreq.c | 9 | * Clock framework bits from arch/avr32/mach-at32ap/cpufreq.c |
@@ -14,6 +14,8 @@ | |||
14 | * License. See the file "COPYING" in the main directory of this archive | 14 | * License. See the file "COPYING" in the main directory of this archive |
15 | * for more details. | 15 | * for more details. |
16 | */ | 16 | */ |
17 | #define pr_fmt(fmt) "cpufreq: " fmt | ||
18 | |||
17 | #include <linux/types.h> | 19 | #include <linux/types.h> |
18 | #include <linux/cpufreq.h> | 20 | #include <linux/cpufreq.h> |
19 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
@@ -21,15 +23,18 @@ | |||
21 | #include <linux/init.h> | 23 | #include <linux/init.h> |
22 | #include <linux/err.h> | 24 | #include <linux/err.h> |
23 | #include <linux/cpumask.h> | 25 | #include <linux/cpumask.h> |
26 | #include <linux/cpu.h> | ||
24 | #include <linux/smp.h> | 27 | #include <linux/smp.h> |
25 | #include <linux/sched.h> /* set_cpus_allowed() */ | 28 | #include <linux/sched.h> /* set_cpus_allowed() */ |
26 | #include <linux/clk.h> | 29 | #include <linux/clk.h> |
30 | #include <linux/percpu.h> | ||
31 | #include <linux/sh_clk.h> | ||
27 | 32 | ||
28 | static struct clk *cpuclk; | 33 | static DEFINE_PER_CPU(struct clk, sh_cpuclk); |
29 | 34 | ||
30 | static unsigned int sh_cpufreq_get(unsigned int cpu) | 35 | static unsigned int sh_cpufreq_get(unsigned int cpu) |
31 | { | 36 | { |
32 | return (clk_get_rate(cpuclk) + 500) / 1000; | 37 | return (clk_get_rate(&per_cpu(sh_cpuclk, cpu)) + 500) / 1000; |
33 | } | 38 | } |
34 | 39 | ||
35 | /* | 40 | /* |
@@ -40,8 +45,10 @@ static int sh_cpufreq_target(struct cpufreq_policy *policy, | |||
40 | unsigned int relation) | 45 | unsigned int relation) |
41 | { | 46 | { |
42 | unsigned int cpu = policy->cpu; | 47 | unsigned int cpu = policy->cpu; |
48 | struct clk *cpuclk = &per_cpu(sh_cpuclk, cpu); | ||
43 | cpumask_t cpus_allowed; | 49 | cpumask_t cpus_allowed; |
44 | struct cpufreq_freqs freqs; | 50 | struct cpufreq_freqs freqs; |
51 | struct device *dev; | ||
45 | long freq; | 52 | long freq; |
46 | 53 | ||
47 | if (!cpu_online(cpu)) | 54 | if (!cpu_online(cpu)) |
@@ -52,13 +59,15 @@ static int sh_cpufreq_target(struct cpufreq_policy *policy, | |||
52 | 59 | ||
53 | BUG_ON(smp_processor_id() != cpu); | 60 | BUG_ON(smp_processor_id() != cpu); |
54 | 61 | ||
62 | dev = get_cpu_device(cpu); | ||
63 | |||
55 | /* Convert target_freq from kHz to Hz */ | 64 | /* Convert target_freq from kHz to Hz */ |
56 | freq = clk_round_rate(cpuclk, target_freq * 1000); | 65 | freq = clk_round_rate(cpuclk, target_freq * 1000); |
57 | 66 | ||
58 | if (freq < (policy->min * 1000) || freq > (policy->max * 1000)) | 67 | if (freq < (policy->min * 1000) || freq > (policy->max * 1000)) |
59 | return -EINVAL; | 68 | return -EINVAL; |
60 | 69 | ||
61 | pr_debug("cpufreq: requested frequency %u Hz\n", target_freq * 1000); | 70 | dev_dbg(dev, "requested frequency %u Hz\n", target_freq * 1000); |
62 | 71 | ||
63 | freqs.cpu = cpu; | 72 | freqs.cpu = cpu; |
64 | freqs.old = sh_cpufreq_get(cpu); | 73 | freqs.old = sh_cpufreq_get(cpu); |
@@ -70,78 +79,112 @@ static int sh_cpufreq_target(struct cpufreq_policy *policy, | |||
70 | clk_set_rate(cpuclk, freq); | 79 | clk_set_rate(cpuclk, freq); |
71 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | 80 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); |
72 | 81 | ||
73 | pr_debug("cpufreq: set frequency %lu Hz\n", freq); | 82 | dev_dbg(dev, "set frequency %lu Hz\n", freq); |
83 | |||
84 | return 0; | ||
85 | } | ||
86 | |||
87 | static int sh_cpufreq_verify(struct cpufreq_policy *policy) | ||
88 | { | ||
89 | struct clk *cpuclk = &per_cpu(sh_cpuclk, policy->cpu); | ||
90 | struct cpufreq_frequency_table *freq_table; | ||
91 | |||
92 | freq_table = cpuclk->nr_freqs ? cpuclk->freq_table : NULL; | ||
93 | if (freq_table) | ||
94 | return cpufreq_frequency_table_verify(policy, freq_table); | ||
95 | |||
96 | cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, | ||
97 | policy->cpuinfo.max_freq); | ||
98 | |||
99 | policy->min = (clk_round_rate(cpuclk, 1) + 500) / 1000; | ||
100 | policy->max = (clk_round_rate(cpuclk, ~0UL) + 500) / 1000; | ||
101 | |||
102 | cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, | ||
103 | policy->cpuinfo.max_freq); | ||
74 | 104 | ||
75 | return 0; | 105 | return 0; |
76 | } | 106 | } |
77 | 107 | ||
78 | static int sh_cpufreq_cpu_init(struct cpufreq_policy *policy) | 108 | static int sh_cpufreq_cpu_init(struct cpufreq_policy *policy) |
79 | { | 109 | { |
80 | if (!cpu_online(policy->cpu)) | 110 | unsigned int cpu = policy->cpu; |
111 | struct clk *cpuclk = &per_cpu(sh_cpuclk, cpu); | ||
112 | struct cpufreq_frequency_table *freq_table; | ||
113 | struct device *dev; | ||
114 | |||
115 | if (!cpu_online(cpu)) | ||
81 | return -ENODEV; | 116 | return -ENODEV; |
82 | 117 | ||
83 | cpuclk = clk_get(NULL, "cpu_clk"); | 118 | dev = get_cpu_device(cpu); |
119 | |||
120 | cpuclk = clk_get(dev, "cpu_clk"); | ||
84 | if (IS_ERR(cpuclk)) { | 121 | if (IS_ERR(cpuclk)) { |
85 | printk(KERN_ERR "cpufreq: couldn't get CPU#%d clk\n", | 122 | dev_err(dev, "couldn't get CPU clk\n"); |
86 | policy->cpu); | ||
87 | return PTR_ERR(cpuclk); | 123 | return PTR_ERR(cpuclk); |
88 | } | 124 | } |
89 | 125 | ||
90 | /* cpuinfo and default policy values */ | 126 | policy->cur = policy->min = policy->max = sh_cpufreq_get(cpu); |
91 | policy->cpuinfo.min_freq = (clk_round_rate(cpuclk, 1) + 500) / 1000; | ||
92 | policy->cpuinfo.max_freq = (clk_round_rate(cpuclk, ~0UL) + 500) / 1000; | ||
93 | policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL; | ||
94 | 127 | ||
95 | policy->cur = sh_cpufreq_get(policy->cpu); | 128 | freq_table = cpuclk->nr_freqs ? cpuclk->freq_table : NULL; |
96 | policy->min = policy->cpuinfo.min_freq; | 129 | if (freq_table) { |
97 | policy->max = policy->cpuinfo.max_freq; | 130 | int result; |
98 | 131 | ||
99 | /* | 132 | result = cpufreq_frequency_table_cpuinfo(policy, freq_table); |
100 | * Catch the cases where the clock framework hasn't been wired up | 133 | if (!result) |
101 | * properly to support scaling. | 134 | cpufreq_frequency_table_get_attr(freq_table, cpu); |
102 | */ | 135 | } else { |
103 | if (unlikely(policy->min == policy->max)) { | 136 | dev_notice(dev, "no frequency table found, falling back " |
104 | printk(KERN_ERR "cpufreq: clock framework rate rounding " | 137 | "to rate rounding.\n"); |
105 | "not supported on CPU#%d.\n", policy->cpu); | ||
106 | 138 | ||
107 | clk_put(cpuclk); | 139 | policy->cpuinfo.min_freq = |
108 | return -EINVAL; | 140 | (clk_round_rate(cpuclk, 1) + 500) / 1000; |
141 | policy->cpuinfo.max_freq = | ||
142 | (clk_round_rate(cpuclk, ~0UL) + 500) / 1000; | ||
109 | } | 143 | } |
110 | 144 | ||
111 | printk(KERN_INFO "cpufreq: CPU#%d Frequencies - Minimum %u.%03u MHz, " | 145 | policy->min = policy->cpuinfo.min_freq; |
146 | policy->max = policy->cpuinfo.max_freq; | ||
147 | |||
148 | policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL; | ||
149 | |||
150 | dev_info(dev, "CPU Frequencies - Minimum %u.%03u MHz, " | ||
112 | "Maximum %u.%03u MHz.\n", | 151 | "Maximum %u.%03u MHz.\n", |
113 | policy->cpu, policy->min / 1000, policy->min % 1000, | 152 | policy->min / 1000, policy->min % 1000, |
114 | policy->max / 1000, policy->max % 1000); | 153 | policy->max / 1000, policy->max % 1000); |
115 | 154 | ||
116 | return 0; | 155 | return 0; |
117 | } | 156 | } |
118 | 157 | ||
119 | static int sh_cpufreq_verify(struct cpufreq_policy *policy) | 158 | static int sh_cpufreq_cpu_exit(struct cpufreq_policy *policy) |
120 | { | 159 | { |
121 | cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, | 160 | unsigned int cpu = policy->cpu; |
122 | policy->cpuinfo.max_freq); | 161 | struct clk *cpuclk = &per_cpu(sh_cpuclk, cpu); |
123 | return 0; | ||
124 | } | ||
125 | 162 | ||
126 | static int sh_cpufreq_exit(struct cpufreq_policy *policy) | 163 | cpufreq_frequency_table_put_attr(cpu); |
127 | { | ||
128 | clk_put(cpuclk); | 164 | clk_put(cpuclk); |
165 | |||
129 | return 0; | 166 | return 0; |
130 | } | 167 | } |
131 | 168 | ||
169 | static struct freq_attr *sh_freq_attr[] = { | ||
170 | &cpufreq_freq_attr_scaling_available_freqs, | ||
171 | NULL, | ||
172 | }; | ||
173 | |||
132 | static struct cpufreq_driver sh_cpufreq_driver = { | 174 | static struct cpufreq_driver sh_cpufreq_driver = { |
133 | .owner = THIS_MODULE, | 175 | .owner = THIS_MODULE, |
134 | .name = "sh", | 176 | .name = "sh", |
135 | .init = sh_cpufreq_cpu_init, | ||
136 | .verify = sh_cpufreq_verify, | ||
137 | .target = sh_cpufreq_target, | ||
138 | .get = sh_cpufreq_get, | 177 | .get = sh_cpufreq_get, |
139 | .exit = sh_cpufreq_exit, | 178 | .target = sh_cpufreq_target, |
179 | .verify = sh_cpufreq_verify, | ||
180 | .init = sh_cpufreq_cpu_init, | ||
181 | .exit = sh_cpufreq_cpu_exit, | ||
182 | .attr = sh_freq_attr, | ||
140 | }; | 183 | }; |
141 | 184 | ||
142 | static int __init sh_cpufreq_module_init(void) | 185 | static int __init sh_cpufreq_module_init(void) |
143 | { | 186 | { |
144 | printk(KERN_INFO "cpufreq: SuperH CPU frequency driver.\n"); | 187 | pr_notice("SuperH CPU frequency driver.\n"); |
145 | return cpufreq_register_driver(&sh_cpufreq_driver); | 188 | return cpufreq_register_driver(&sh_cpufreq_driver); |
146 | } | 189 | } |
147 | 190 | ||
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c index 0bc58866add1..5901fba3176e 100644 --- a/arch/sh/kernel/signal_32.c +++ b/arch/sh/kernel/signal_32.c | |||
@@ -57,12 +57,13 @@ sys_sigsuspend(old_sigset_t mask, | |||
57 | unsigned long r5, unsigned long r6, unsigned long r7, | 57 | unsigned long r5, unsigned long r6, unsigned long r7, |
58 | struct pt_regs __regs) | 58 | struct pt_regs __regs) |
59 | { | 59 | { |
60 | mask &= _BLOCKABLE; | 60 | sigset_t blocked; |
61 | spin_lock_irq(¤t->sighand->siglock); | 61 | |
62 | current->saved_sigmask = current->blocked; | 62 | current->saved_sigmask = current->blocked; |
63 | siginitset(¤t->blocked, mask); | 63 | |
64 | recalc_sigpending(); | 64 | mask &= _BLOCKABLE; |
65 | spin_unlock_irq(¤t->sighand->siglock); | 65 | siginitset(&blocked, mask); |
66 | set_current_blocked(&blocked); | ||
66 | 67 | ||
67 | current->state = TASK_INTERRUPTIBLE; | 68 | current->state = TASK_INTERRUPTIBLE; |
68 | schedule(); | 69 | schedule(); |
@@ -239,11 +240,7 @@ asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5, | |||
239 | goto badframe; | 240 | goto badframe; |
240 | 241 | ||
241 | sigdelsetmask(&set, ~_BLOCKABLE); | 242 | sigdelsetmask(&set, ~_BLOCKABLE); |
242 | 243 | set_current_blocked(&set); | |
243 | spin_lock_irq(¤t->sighand->siglock); | ||
244 | current->blocked = set; | ||
245 | recalc_sigpending(); | ||
246 | spin_unlock_irq(¤t->sighand->siglock); | ||
247 | 244 | ||
248 | if (restore_sigcontext(regs, &frame->sc, &r0)) | 245 | if (restore_sigcontext(regs, &frame->sc, &r0)) |
249 | goto badframe; | 246 | goto badframe; |
@@ -273,10 +270,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5, | |||
273 | goto badframe; | 270 | goto badframe; |
274 | 271 | ||
275 | sigdelsetmask(&set, ~_BLOCKABLE); | 272 | sigdelsetmask(&set, ~_BLOCKABLE); |
276 | spin_lock_irq(¤t->sighand->siglock); | 273 | set_current_blocked(&set); |
277 | current->blocked = set; | ||
278 | recalc_sigpending(); | ||
279 | spin_unlock_irq(¤t->sighand->siglock); | ||
280 | 274 | ||
281 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0)) | 275 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0)) |
282 | goto badframe; | 276 | goto badframe; |
@@ -547,17 +541,8 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
547 | else | 541 | else |
548 | ret = setup_frame(sig, ka, oldset, regs); | 542 | ret = setup_frame(sig, ka, oldset, regs); |
549 | 543 | ||
550 | if (ka->sa.sa_flags & SA_ONESHOT) | 544 | if (ret == 0) |
551 | ka->sa.sa_handler = SIG_DFL; | 545 | block_sigmask(ka, sig); |
552 | |||
553 | if (ret == 0) { | ||
554 | spin_lock_irq(¤t->sighand->siglock); | ||
555 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
556 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
557 | sigaddset(¤t->blocked,sig); | ||
558 | recalc_sigpending(); | ||
559 | spin_unlock_irq(¤t->sighand->siglock); | ||
560 | } | ||
561 | 546 | ||
562 | return ret; | 547 | return ret; |
563 | } | 548 | } |
diff --git a/arch/sh/kernel/signal_64.c b/arch/sh/kernel/signal_64.c index 6b5603fe274b..3c9a6f7dcdce 100644 --- a/arch/sh/kernel/signal_64.c +++ b/arch/sh/kernel/signal_64.c | |||
@@ -159,14 +159,13 @@ sys_sigsuspend(old_sigset_t mask, | |||
159 | unsigned long r6, unsigned long r7, | 159 | unsigned long r6, unsigned long r7, |
160 | struct pt_regs * regs) | 160 | struct pt_regs * regs) |
161 | { | 161 | { |
162 | sigset_t saveset; | 162 | sigset_t saveset, blocked; |
163 | 163 | ||
164 | mask &= _BLOCKABLE; | ||
165 | spin_lock_irq(¤t->sighand->siglock); | ||
166 | saveset = current->blocked; | 164 | saveset = current->blocked; |
167 | siginitset(¤t->blocked, mask); | 165 | |
168 | recalc_sigpending(); | 166 | mask &= _BLOCKABLE; |
169 | spin_unlock_irq(¤t->sighand->siglock); | 167 | siginitset(&blocked, mask); |
168 | set_current_blocked(&blocked); | ||
170 | 169 | ||
171 | REF_REG_RET = -EINTR; | 170 | REF_REG_RET = -EINTR; |
172 | while (1) { | 171 | while (1) { |
@@ -198,11 +197,8 @@ sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, | |||
198 | if (copy_from_user(&newset, unewset, sizeof(newset))) | 197 | if (copy_from_user(&newset, unewset, sizeof(newset))) |
199 | return -EFAULT; | 198 | return -EFAULT; |
200 | sigdelsetmask(&newset, ~_BLOCKABLE); | 199 | sigdelsetmask(&newset, ~_BLOCKABLE); |
201 | spin_lock_irq(¤t->sighand->siglock); | ||
202 | saveset = current->blocked; | 200 | saveset = current->blocked; |
203 | current->blocked = newset; | 201 | set_current_blocked(&newset); |
204 | recalc_sigpending(); | ||
205 | spin_unlock_irq(¤t->sighand->siglock); | ||
206 | 202 | ||
207 | REF_REG_RET = -EINTR; | 203 | REF_REG_RET = -EINTR; |
208 | while (1) { | 204 | while (1) { |
@@ -408,11 +404,7 @@ asmlinkage int sys_sigreturn(unsigned long r2, unsigned long r3, | |||
408 | goto badframe; | 404 | goto badframe; |
409 | 405 | ||
410 | sigdelsetmask(&set, ~_BLOCKABLE); | 406 | sigdelsetmask(&set, ~_BLOCKABLE); |
411 | 407 | set_current_blocked(&set); | |
412 | spin_lock_irq(¤t->sighand->siglock); | ||
413 | current->blocked = set; | ||
414 | recalc_sigpending(); | ||
415 | spin_unlock_irq(¤t->sighand->siglock); | ||
416 | 408 | ||
417 | if (restore_sigcontext(regs, &frame->sc, &ret)) | 409 | if (restore_sigcontext(regs, &frame->sc, &ret)) |
418 | goto badframe; | 410 | goto badframe; |
@@ -445,10 +437,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3, | |||
445 | goto badframe; | 437 | goto badframe; |
446 | 438 | ||
447 | sigdelsetmask(&set, ~_BLOCKABLE); | 439 | sigdelsetmask(&set, ~_BLOCKABLE); |
448 | spin_lock_irq(¤t->sighand->siglock); | 440 | set_current_blocked(&set); |
449 | current->blocked = set; | ||
450 | recalc_sigpending(); | ||
451 | spin_unlock_irq(¤t->sighand->siglock); | ||
452 | 441 | ||
453 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ret)) | 442 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ret)) |
454 | goto badframe; | 443 | goto badframe; |
@@ -734,17 +723,8 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
734 | else | 723 | else |
735 | ret = setup_frame(sig, ka, oldset, regs); | 724 | ret = setup_frame(sig, ka, oldset, regs); |
736 | 725 | ||
737 | if (ka->sa.sa_flags & SA_ONESHOT) | 726 | if (ret == 0) |
738 | ka->sa.sa_handler = SIG_DFL; | 727 | block_sigmask(ka, sig); |
739 | |||
740 | if (ret == 0) { | ||
741 | spin_lock_irq(¤t->sighand->siglock); | ||
742 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
743 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
744 | sigaddset(¤t->blocked,sig); | ||
745 | recalc_sigpending(); | ||
746 | spin_unlock_irq(¤t->sighand->siglock); | ||
747 | } | ||
748 | 728 | ||
749 | return ret; | 729 | return ret; |
750 | } | 730 | } |
diff --git a/arch/sh/kernel/syscalls_32.S b/arch/sh/kernel/syscalls_32.S index ee56a9b1a981..4b68f0f79761 100644 --- a/arch/sh/kernel/syscalls_32.S +++ b/arch/sh/kernel/syscalls_32.S | |||
@@ -204,8 +204,8 @@ ENTRY(sys_call_table) | |||
204 | .long sys_capset /* 185 */ | 204 | .long sys_capset /* 185 */ |
205 | .long sys_sigaltstack | 205 | .long sys_sigaltstack |
206 | .long sys_sendfile | 206 | .long sys_sendfile |
207 | .long sys_ni_syscall /* streams1 */ | 207 | .long sys_ni_syscall /* getpmsg */ |
208 | .long sys_ni_syscall /* streams2 */ | 208 | .long sys_ni_syscall /* putpmsg */ |
209 | .long sys_vfork /* 190 */ | 209 | .long sys_vfork /* 190 */ |
210 | .long sys_getrlimit | 210 | .long sys_getrlimit |
211 | .long sys_mmap2 | 211 | .long sys_mmap2 |
@@ -259,8 +259,8 @@ ENTRY(sys_call_table) | |||
259 | .long sys_futex /* 240 */ | 259 | .long sys_futex /* 240 */ |
260 | .long sys_sched_setaffinity | 260 | .long sys_sched_setaffinity |
261 | .long sys_sched_getaffinity | 261 | .long sys_sched_getaffinity |
262 | .long sys_ni_syscall | 262 | .long sys_ni_syscall /* reserved for set_thread_area */ |
263 | .long sys_ni_syscall | 263 | .long sys_ni_syscall /* reserved for get_thread_area */ |
264 | .long sys_io_setup /* 245 */ | 264 | .long sys_io_setup /* 245 */ |
265 | .long sys_io_destroy | 265 | .long sys_io_destroy |
266 | .long sys_io_getevents | 266 | .long sys_io_getevents |
diff --git a/arch/sh/kernel/syscalls_64.S b/arch/sh/kernel/syscalls_64.S index 9af7de26fb71..0956345b36ef 100644 --- a/arch/sh/kernel/syscalls_64.S +++ b/arch/sh/kernel/syscalls_64.S | |||
@@ -208,8 +208,8 @@ sys_call_table: | |||
208 | .long sys_capset /* 185 */ | 208 | .long sys_capset /* 185 */ |
209 | .long sys_sigaltstack | 209 | .long sys_sigaltstack |
210 | .long sys_sendfile | 210 | .long sys_sendfile |
211 | .long sys_ni_syscall /* streams1 */ | 211 | .long sys_ni_syscall /* getpmsg */ |
212 | .long sys_ni_syscall /* streams2 */ | 212 | .long sys_ni_syscall /* putpmsg */ |
213 | .long sys_vfork /* 190 */ | 213 | .long sys_vfork /* 190 */ |
214 | .long sys_getrlimit | 214 | .long sys_getrlimit |
215 | .long sys_mmap2 | 215 | .long sys_mmap2 |
@@ -296,8 +296,8 @@ sys_call_table: | |||
296 | .long sys_futex | 296 | .long sys_futex |
297 | .long sys_sched_setaffinity | 297 | .long sys_sched_setaffinity |
298 | .long sys_sched_getaffinity /* 270 */ | 298 | .long sys_sched_getaffinity /* 270 */ |
299 | .long sys_ni_syscall | 299 | .long sys_ni_syscall /* reserved for set_thread_area */ |
300 | .long sys_ni_syscall | 300 | .long sys_ni_syscall /* reserved for get_thread_area */ |
301 | .long sys_io_setup | 301 | .long sys_io_setup |
302 | .long sys_io_destroy | 302 | .long sys_io_destroy |
303 | .long sys_io_getevents /* 275 */ | 303 | .long sys_io_getevents /* 275 */ |