Skip to content

Commit 649671c

Browse files
unicore32: Use get_signal() signal_setup_done()
Use the more generic functions get_signal() signal_setup_done() for signal delivery. Signed-off-by: Richard Weinberger <richard@nod.at>
1 parent 307627e commit 649671c

File tree

1 file changed

+20
-28
lines changed

1 file changed

+20
-28
lines changed

arch/unicore32/kernel/signal.c

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,10 @@ static int setup_return(struct pt_regs *regs, struct k_sigaction *ka,
238238
return 0;
239239
}
240240

241-
static int setup_frame(int usig, struct k_sigaction *ka,
242-
sigset_t *set, struct pt_regs *regs)
241+
static int setup_frame(struct ksignal *ksig, sigset_t *set,
242+
struct pt_regs *regs)
243243
{
244-
struct sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame));
244+
struct sigframe __user *frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
245245
int err = 0;
246246

247247
if (!frame)
@@ -254,29 +254,29 @@ static int setup_frame(int usig, struct k_sigaction *ka,
254254

255255
err |= setup_sigframe(frame, regs, set);
256256
if (err == 0)
257-
err |= setup_return(regs, ka, frame->retcode, frame, usig);
257+
err |= setup_return(regs, &ksig->ka, frame->retcode, frame, usig);
258258

259259
return err;
260260
}
261261

262-
static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
263-
sigset_t *set, struct pt_regs *regs)
262+
static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
263+
struct pt_regs *regs)
264264
{
265265
struct rt_sigframe __user *frame =
266-
get_sigframe(ka, regs, sizeof(*frame));
266+
get_sigframe(&ksig->ka, regs, sizeof(*frame));
267267
int err = 0;
268268

269269
if (!frame)
270270
return 1;
271271

272-
err |= copy_siginfo_to_user(&frame->info, info);
272+
err |= copy_siginfo_to_user(&frame->info, &ksig->info);
273273

274274
err |= __put_user(0, &frame->sig.uc.uc_flags);
275275
err |= __put_user(NULL, &frame->sig.uc.uc_link);
276276
err |= __save_altstack(&frame->sig.uc.uc_stack, regs->UCreg_sp);
277277
err |= setup_sigframe(&frame->sig, regs, set);
278278
if (err == 0)
279-
err |= setup_return(regs, ka, frame->sig.retcode, frame, usig);
279+
err |= setup_return(regs, &ksig->ka, frame->sig.retcode, frame, usig);
280280

281281
if (err == 0) {
282282
/*
@@ -299,13 +299,13 @@ static inline void setup_syscall_restart(struct pt_regs *regs)
299299
/*
300300
* OK, we're invoking a handler
301301
*/
302-
static void handle_signal(unsigned long sig, struct k_sigaction *ka,
303-
siginfo_t *info, struct pt_regs *regs, int syscall)
302+
static void handle_signal(struct ksignal *ksig, struct pt_regs *regs,
303+
int syscall)
304304
{
305305
struct thread_info *thread = current_thread_info();
306306
struct task_struct *tsk = current;
307307
sigset_t *oldset = sigmask_to_save();
308-
int usig = sig;
308+
int usig = ksig->sig;
309309
int ret;
310310

311311
/*
@@ -318,7 +318,7 @@ static void handle_signal(unsigned long sig, struct k_sigaction *ka,
318318
regs->UCreg_00 = -EINTR;
319319
break;
320320
case -ERESTARTSYS:
321-
if (!(ka->sa.sa_flags & SA_RESTART)) {
321+
if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
322322
regs->UCreg_00 = -EINTR;
323323
break;
324324
}
@@ -338,22 +338,17 @@ static void handle_signal(unsigned long sig, struct k_sigaction *ka,
338338
/*
339339
* Set up the stack frame
340340
*/
341-
if (ka->sa.sa_flags & SA_SIGINFO)
342-
ret = setup_rt_frame(usig, ka, info, oldset, regs);
341+
if (ksig->ka.sa.sa_flags & SA_SIGINFO)
342+
ret = setup_rt_frame(ksig, oldset, regs);
343343
else
344-
ret = setup_frame(usig, ka, oldset, regs);
344+
ret = setup_frame(ksig, oldset, regs);
345345

346346
/*
347347
* Check that the resulting registers are actually sane.
348348
*/
349349
ret |= !valid_user_regs(regs);
350350

351-
if (ret != 0) {
352-
force_sigsegv(sig, tsk);
353-
return;
354-
}
355-
356-
signal_delivered(sig, info, ka, regs, 0);
351+
signal_setup_done(ret, ksig, 0);
357352
}
358353

359354
/*
@@ -367,9 +362,7 @@ static void handle_signal(unsigned long sig, struct k_sigaction *ka,
367362
*/
368363
static void do_signal(struct pt_regs *regs, int syscall)
369364
{
370-
struct k_sigaction ka;
371-
siginfo_t info;
372-
int signr;
365+
struct ksignal ksig;
373366

374367
/*
375368
* We want the common case to go fast, which
@@ -380,9 +373,8 @@ static void do_signal(struct pt_regs *regs, int syscall)
380373
if (!user_mode(regs))
381374
return;
382375

383-
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
384-
if (signr > 0) {
385-
handle_signal(signr, &ka, &info, regs, syscall);
376+
if (get_signsl(&ksig)) {
377+
handle_signal(&ksig, regs, syscall);
386378
return;
387379
}
388380

0 commit comments

Comments
 (0)