Skip to content

Commit 2bb12b7

Browse files
score: Use get_signal() signal_setup_done()
Use the more generic functions get_signal() signal_setup_done() for signal delivery. Acked-by: Lennox Wu <lennox.wu@gmail.com> Signed-off-by: Richard Weinberger <richard@nod.at>
1 parent 067bf2d commit 2bb12b7

File tree

1 file changed

+18
-25
lines changed

1 file changed

+18
-25
lines changed

arch/score/kernel/signal.c

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -173,15 +173,15 @@ score_rt_sigreturn(struct pt_regs *regs)
173173
return 0;
174174
}
175175

176-
static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
177-
int signr, sigset_t *set, siginfo_t *info)
176+
static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs,
177+
sigset_t *set)
178178
{
179179
struct rt_sigframe __user *frame;
180180
int err = 0;
181181

182-
frame = get_sigframe(ka, regs, sizeof(*frame));
182+
frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
183183
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
184-
goto give_sigsegv;
184+
return -EFAULT;
185185

186186
/*
187187
* Set up the return code ...
@@ -194,42 +194,39 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
194194
err |= __put_user(0x80008002, frame->rs_code + 1);
195195
flush_cache_sigtramp((unsigned long) frame->rs_code);
196196

197-
err |= copy_siginfo_to_user(&frame->rs_info, info);
197+
err |= copy_siginfo_to_user(&frame->rs_info, &ksig->info);
198198
err |= __put_user(0, &frame->rs_uc.uc_flags);
199199
err |= __put_user(NULL, &frame->rs_uc.uc_link);
200200
err |= __save_altstack(&frame->rs_uc.uc_stack, regs->regs[0]);
201201
err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext);
202202
err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
203203

204204
if (err)
205-
goto give_sigsegv;
205+
return -EFAULT;
206206

207207
regs->regs[0] = (unsigned long) frame;
208208
regs->regs[3] = (unsigned long) frame->rs_code;
209-
regs->regs[4] = signr;
209+
regs->regs[4] = ksig->sig;
210210
regs->regs[5] = (unsigned long) &frame->rs_info;
211211
regs->regs[6] = (unsigned long) &frame->rs_uc;
212-
regs->regs[29] = (unsigned long) ka->sa.sa_handler;
213-
regs->cp0_epc = (unsigned long) ka->sa.sa_handler;
212+
regs->regs[29] = (unsigned long) ksig->ka.sa.sa_handler;
213+
regs->cp0_epc = (unsigned long) ksig->ka.sa.sa_handler;
214214

215215
return 0;
216-
217-
give_sigsegv:
218-
force_sigsegv(signr, current);
219-
return -EFAULT;
220216
}
221217

222-
static void handle_signal(unsigned long sig, siginfo_t *info,
223-
struct k_sigaction *ka, struct pt_regs *regs)
218+
static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
224219
{
220+
int ret;
221+
225222
if (regs->is_syscall) {
226223
switch (regs->regs[4]) {
227224
case ERESTART_RESTARTBLOCK:
228225
case ERESTARTNOHAND:
229226
regs->regs[4] = EINTR;
230227
break;
231228
case ERESTARTSYS:
232-
if (!(ka->sa.sa_flags & SA_RESTART)) {
229+
if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
233230
regs->regs[4] = EINTR;
234231
break;
235232
}
@@ -245,17 +242,14 @@ static void handle_signal(unsigned long sig, siginfo_t *info,
245242
/*
246243
* Set up the stack frame
247244
*/
248-
if (setup_rt_frame(ka, regs, sig, sigmask_to_save(), info) < 0)
249-
return;
245+
ret = setup_rt_frame(ksig, regs, sigmask_to_save());
250246

251-
signal_delivered(sig, info, ka, regs, 0);
247+
signal_setup_done(ret, ksig, 0);
252248
}
253249

254250
static void do_signal(struct pt_regs *regs)
255251
{
256-
struct k_sigaction ka;
257-
siginfo_t info;
258-
int signr;
252+
struct ksignal ksig;
259253

260254
/*
261255
* We want the common case to go fast, which is why we may in certain
@@ -265,10 +259,9 @@ static void do_signal(struct pt_regs *regs)
265259
if (!user_mode(regs))
266260
return;
267261

268-
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
269-
if (signr > 0) {
262+
if (get_signal(&ksig)) {
270263
/* Actually deliver the signal. */
271-
handle_signal(signr, &info, &ka, regs);
264+
handle_signal(&ksig, regs);
272265
return;
273266
}
274267

0 commit comments

Comments
 (0)