Skip to content

Commit 307627e

Browse files
um: 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 b3707c7 commit 307627e

File tree

3 files changed

+36
-48
lines changed

3 files changed

+36
-48
lines changed

arch/um/include/shared/frame_kern.h

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,10 @@
66
#ifndef __FRAME_KERN_H_
77
#define __FRAME_KERN_H_
88

9-
extern int setup_signal_stack_sc(unsigned long stack_top, int sig,
10-
struct k_sigaction *ka,
11-
struct pt_regs *regs,
12-
sigset_t *mask);
13-
extern int setup_signal_stack_si(unsigned long stack_top, int sig,
14-
struct k_sigaction *ka,
15-
struct pt_regs *regs, struct siginfo *info,
16-
sigset_t *mask);
9+
extern int setup_signal_stack_sc(unsigned long stack_top, struct ksignal *ksig,
10+
struct pt_regs *regs, sigset_t *mask);
11+
extern int setup_signal_stack_si(unsigned long stack_top, struct ksignal *ksig,
12+
struct pt_regs *regs, sigset_t *mask);
1713

1814
#endif
1915

arch/um/kernel/signal.c

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ EXPORT_SYMBOL(unblock_signals);
1818
/*
1919
* OK, we're invoking a handler
2020
*/
21-
static void handle_signal(struct pt_regs *regs, unsigned long signr,
22-
struct k_sigaction *ka, struct siginfo *info)
21+
static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
2322
{
2423
sigset_t *oldset = sigmask_to_save();
2524
int singlestep = 0;
@@ -39,7 +38,7 @@ static void handle_signal(struct pt_regs *regs, unsigned long signr,
3938
break;
4039

4140
case -ERESTARTSYS:
42-
if (!(ka->sa.sa_flags & SA_RESTART)) {
41+
if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
4342
PT_REGS_SYSCALL_RET(regs) = -EINTR;
4443
break;
4544
}
@@ -52,32 +51,28 @@ static void handle_signal(struct pt_regs *regs, unsigned long signr,
5251
}
5352

5453
sp = PT_REGS_SP(regs);
55-
if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags(sp) == 0))
54+
if ((ksig->ka.sa.sa_flags & SA_ONSTACK) && (sas_ss_flags(sp) == 0))
5655
sp = current->sas_ss_sp + current->sas_ss_size;
5756

5857
#ifdef CONFIG_ARCH_HAS_SC_SIGNALS
59-
if (!(ka->sa.sa_flags & SA_SIGINFO))
60-
err = setup_signal_stack_sc(sp, signr, ka, regs, oldset);
58+
if (!(ksig->ka.sa.sa_flags & SA_SIGINFO))
59+
err = setup_signal_stack_sc(sp, ksig, regs, oldset);
6160
else
6261
#endif
63-
err = setup_signal_stack_si(sp, signr, ka, regs, info, oldset);
62+
err = setup_signal_stack_si(sp, ksig, regs, oldset);
6463

65-
if (err)
66-
force_sigsegv(signr, current);
67-
else
68-
signal_delivered(signr, info, ka, regs, singlestep);
64+
signal_setup_done(err, ksig, singlestep);
6965
}
7066

7167
static int kern_do_signal(struct pt_regs *regs)
7268
{
73-
struct k_sigaction ka_copy;
74-
struct siginfo info;
75-
int sig, handled_sig = 0;
69+
struct ksignal ksig;
70+
int handled_sig = 0;
7671

77-
while ((sig = get_signal_to_deliver(&info, &ka_copy, regs, NULL)) > 0) {
72+
while (get_signal(&ksig)) {
7873
handled_sig = 1;
7974
/* Whee! Actually deliver the signal. */
80-
handle_signal(regs, sig, &ka_copy, &info);
75+
handle_signal(&ksig, regs);
8176
}
8277

8378
/* Did we come from a system call? */

arch/x86/um/signal.c

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -370,13 +370,12 @@ struct rt_sigframe
370370
char retcode[8];
371371
};
372372

373-
int setup_signal_stack_sc(unsigned long stack_top, int sig,
374-
struct k_sigaction *ka, struct pt_regs *regs,
375-
sigset_t *mask)
373+
int setup_signal_stack_sc(unsigned long stack_top, struct ksignal *ksig,
374+
struct pt_regs *regs, sigset_t *mask)
376375
{
377376
struct sigframe __user *frame;
378377
void __user *restorer;
379-
int err = 0;
378+
int err = 0, sig = ksig->sig;
380379

381380
/* This is the same calculation as i386 - ((sp + 4) & 15) == 0 */
382381
stack_top = ((stack_top + 4) & -16UL) - 4;
@@ -385,8 +384,8 @@ int setup_signal_stack_sc(unsigned long stack_top, int sig,
385384
return 1;
386385

387386
restorer = frame->retcode;
388-
if (ka->sa.sa_flags & SA_RESTORER)
389-
restorer = ka->sa.sa_restorer;
387+
if (ksig->ka.sa.sa_flags & SA_RESTORER)
388+
restorer = ksig->ka.sa.sa_restorer;
390389

391390
err |= __put_user(restorer, &frame->pretcode);
392391
err |= __put_user(sig, &frame->sig);
@@ -410,35 +409,34 @@ int setup_signal_stack_sc(unsigned long stack_top, int sig,
410409
return err;
411410

412411
PT_REGS_SP(regs) = (unsigned long) frame;
413-
PT_REGS_IP(regs) = (unsigned long) ka->sa.sa_handler;
412+
PT_REGS_IP(regs) = (unsigned long) ksig->ka.sa.sa_handler;
414413
PT_REGS_AX(regs) = (unsigned long) sig;
415414
PT_REGS_DX(regs) = (unsigned long) 0;
416415
PT_REGS_CX(regs) = (unsigned long) 0;
417416
return 0;
418417
}
419418

420-
int setup_signal_stack_si(unsigned long stack_top, int sig,
421-
struct k_sigaction *ka, struct pt_regs *regs,
422-
siginfo_t *info, sigset_t *mask)
419+
int setup_signal_stack_si(unsigned long stack_top, struct ksignal *ksig,
420+
struct pt_regs *regs, sigset_t *mask)
423421
{
424422
struct rt_sigframe __user *frame;
425423
void __user *restorer;
426-
int err = 0;
424+
int err = 0, sig = ksig->sig;
427425

428426
stack_top &= -8UL;
429427
frame = (struct rt_sigframe __user *) stack_top - 1;
430428
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
431429
return 1;
432430

433431
restorer = frame->retcode;
434-
if (ka->sa.sa_flags & SA_RESTORER)
435-
restorer = ka->sa.sa_restorer;
432+
if (ksig->ka.sa.sa_flags & SA_RESTORER)
433+
restorer = ksig->ka.sa.sa_restorer;
436434

437435
err |= __put_user(restorer, &frame->pretcode);
438436
err |= __put_user(sig, &frame->sig);
439437
err |= __put_user(&frame->info, &frame->pinfo);
440438
err |= __put_user(&frame->uc, &frame->puc);
441-
err |= copy_siginfo_to_user(&frame->info, info);
439+
err |= copy_siginfo_to_user(&frame->info, &ksig->info);
442440
err |= copy_ucontext_to_user(&frame->uc, &frame->fpstate, mask,
443441
PT_REGS_SP(regs));
444442

@@ -457,7 +455,7 @@ int setup_signal_stack_si(unsigned long stack_top, int sig,
457455
return err;
458456

459457
PT_REGS_SP(regs) = (unsigned long) frame;
460-
PT_REGS_IP(regs) = (unsigned long) ka->sa.sa_handler;
458+
PT_REGS_IP(regs) = (unsigned long) ksig->ka.sa.sa_handler;
461459
PT_REGS_AX(regs) = (unsigned long) sig;
462460
PT_REGS_DX(regs) = (unsigned long) &frame->info;
463461
PT_REGS_CX(regs) = (unsigned long) &frame->uc;
@@ -502,12 +500,11 @@ struct rt_sigframe
502500
struct _fpstate fpstate;
503501
};
504502

505-
int setup_signal_stack_si(unsigned long stack_top, int sig,
506-
struct k_sigaction *ka, struct pt_regs * regs,
507-
siginfo_t *info, sigset_t *set)
503+
int setup_signal_stack_si(unsigned long stack_top, struct ksignal *ksig,
504+
struct pt_regs *regs, sigset_t *set)
508505
{
509506
struct rt_sigframe __user *frame;
510-
int err = 0;
507+
int err = 0, sig = ksig->sig;
511508

512509
frame = (struct rt_sigframe __user *)
513510
round_down(stack_top - sizeof(struct rt_sigframe), 16);
@@ -517,8 +514,8 @@ int setup_signal_stack_si(unsigned long stack_top, int sig,
517514
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
518515
goto out;
519516

520-
if (ka->sa.sa_flags & SA_SIGINFO) {
521-
err |= copy_siginfo_to_user(&frame->info, info);
517+
if (ksig->ka.sa.sa_flags & SA_SIGINFO) {
518+
err |= copy_siginfo_to_user(&frame->info, &ksig->info);
522519
if (err)
523520
goto out;
524521
}
@@ -543,8 +540,8 @@ int setup_signal_stack_si(unsigned long stack_top, int sig,
543540
* already in userspace.
544541
*/
545542
/* x86-64 should always use SA_RESTORER. */
546-
if (ka->sa.sa_flags & SA_RESTORER)
547-
err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
543+
if (ksig->ka.sa.sa_flags & SA_RESTORER)
544+
err |= __put_user(ksig->ka.sa.sa_restorer, &frame->pretcode);
548545
else
549546
/* could use a vstub here */
550547
return err;
@@ -570,7 +567,7 @@ int setup_signal_stack_si(unsigned long stack_top, int sig,
570567
*/
571568
PT_REGS_SI(regs) = (unsigned long) &frame->info;
572569
PT_REGS_DX(regs) = (unsigned long) &frame->uc;
573-
PT_REGS_IP(regs) = (unsigned long) ka->sa.sa_handler;
570+
PT_REGS_IP(regs) = (unsigned long) ksig->ka.sa.sa_handler;
574571
out:
575572
return err;
576573
}

0 commit comments

Comments
 (0)