@@ -262,17 +262,17 @@ get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
262
262
extern void __kernel_sigreturn (void );
263
263
extern void __kernel_rt_sigreturn (void );
264
264
265
- static int setup_frame (int sig , struct k_sigaction * ka ,
266
- sigset_t * set , struct pt_regs * regs )
265
+ static int setup_frame (struct ksignal * ksig , sigset_t * set ,
266
+ struct pt_regs * regs )
267
267
{
268
268
struct sigframe __user * frame ;
269
- int err = 0 ;
269
+ int err = 0 , sig = ksig -> sig ;
270
270
int signal ;
271
271
272
- frame = get_sigframe (ka , regs -> regs [15 ], sizeof (* frame ));
272
+ frame = get_sigframe (& ksig -> ka , regs -> regs [15 ], sizeof (* frame ));
273
273
274
274
if (!access_ok (VERIFY_WRITE , frame , sizeof (* frame )))
275
- goto give_sigsegv ;
275
+ return - EFAULT ;
276
276
277
277
signal = current_thread_info ()-> exec_domain
278
278
&& current_thread_info ()-> exec_domain -> signal_invmap
@@ -288,8 +288,8 @@ static int setup_frame(int sig, struct k_sigaction *ka,
288
288
289
289
/* Set up to return from userspace. If provided, use a stub
290
290
already in userspace. */
291
- if (ka -> sa .sa_flags & SA_RESTORER ) {
292
- regs -> pr = (unsigned long ) ka -> sa .sa_restorer ;
291
+ if (ksig -> ka . sa .sa_flags & SA_RESTORER ) {
292
+ regs -> pr = (unsigned long ) ksig -> ka . sa .sa_restorer ;
293
293
#ifdef CONFIG_VSYSCALL
294
294
} else if (likely (current -> mm -> context .vdso )) {
295
295
regs -> pr = VDSO_SYM (& __kernel_sigreturn );
@@ -309,7 +309,7 @@ static int setup_frame(int sig, struct k_sigaction *ka,
309
309
}
310
310
311
311
if (err )
312
- goto give_sigsegv ;
312
+ return - EFAULT ;
313
313
314
314
/* Set up registers for signal handler */
315
315
regs -> regs [15 ] = (unsigned long ) frame ;
@@ -319,47 +319,43 @@ static int setup_frame(int sig, struct k_sigaction *ka,
319
319
320
320
if (current -> personality & FDPIC_FUNCPTRS ) {
321
321
struct fdpic_func_descriptor __user * funcptr =
322
- (struct fdpic_func_descriptor __user * )ka -> sa .sa_handler ;
322
+ (struct fdpic_func_descriptor __user * )ksig -> ka . sa .sa_handler ;
323
323
324
324
err |= __get_user (regs -> pc , & funcptr -> text );
325
325
err |= __get_user (regs -> regs [12 ], & funcptr -> GOT );
326
326
} else
327
- regs -> pc = (unsigned long )ka -> sa .sa_handler ;
327
+ regs -> pc = (unsigned long )ksig -> ka . sa .sa_handler ;
328
328
329
329
if (err )
330
- goto give_sigsegv ;
330
+ return - EFAULT ;
331
331
332
332
set_fs (USER_DS );
333
333
334
334
pr_debug ("SIG deliver (%s:%d): sp=%p pc=%08lx pr=%08lx\n" ,
335
335
current -> comm , task_pid_nr (current ), frame , regs -> pc , regs -> pr );
336
336
337
337
return 0 ;
338
-
339
- give_sigsegv :
340
- force_sigsegv (sig , current );
341
- return - EFAULT ;
342
338
}
343
339
344
- static int setup_rt_frame (int sig , struct k_sigaction * ka , siginfo_t * info ,
345
- sigset_t * set , struct pt_regs * regs )
340
+ static int setup_rt_frame (struct ksignal * ksig , sigset_t * set ,
341
+ struct pt_regs * regs )
346
342
{
347
343
struct rt_sigframe __user * frame ;
348
- int err = 0 ;
344
+ int err = 0 , sig = ksig -> sig ;
349
345
int signal ;
350
346
351
- frame = get_sigframe (ka , regs -> regs [15 ], sizeof (* frame ));
347
+ frame = get_sigframe (& ksig -> ka , regs -> regs [15 ], sizeof (* frame ));
352
348
353
349
if (!access_ok (VERIFY_WRITE , frame , sizeof (* frame )))
354
- goto give_sigsegv ;
350
+ return - EFAULT ;
355
351
356
352
signal = current_thread_info ()-> exec_domain
357
353
&& current_thread_info ()-> exec_domain -> signal_invmap
358
354
&& sig < 32
359
355
? current_thread_info ()-> exec_domain -> signal_invmap [sig ]
360
356
: sig ;
361
357
362
- err |= copy_siginfo_to_user (& frame -> info , info );
358
+ err |= copy_siginfo_to_user (& frame -> info , & ksig -> info );
363
359
364
360
/* Create the ucontext. */
365
361
err |= __put_user (0 , & frame -> uc .uc_flags );
@@ -371,8 +367,8 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
371
367
372
368
/* Set up to return from userspace. If provided, use a stub
373
369
already in userspace. */
374
- if (ka -> sa .sa_flags & SA_RESTORER ) {
375
- regs -> pr = (unsigned long ) ka -> sa .sa_restorer ;
370
+ if (ksig -> ka . sa .sa_flags & SA_RESTORER ) {
371
+ regs -> pr = (unsigned long ) ksig -> ka . sa .sa_restorer ;
376
372
#ifdef CONFIG_VSYSCALL
377
373
} else if (likely (current -> mm -> context .vdso )) {
378
374
regs -> pr = VDSO_SYM (& __kernel_rt_sigreturn );
@@ -392,7 +388,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
392
388
}
393
389
394
390
if (err )
395
- goto give_sigsegv ;
391
+ return - EFAULT ;
396
392
397
393
/* Set up registers for signal handler */
398
394
regs -> regs [15 ] = (unsigned long ) frame ;
@@ -402,26 +398,22 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
402
398
403
399
if (current -> personality & FDPIC_FUNCPTRS ) {
404
400
struct fdpic_func_descriptor __user * funcptr =
405
- (struct fdpic_func_descriptor __user * )ka -> sa .sa_handler ;
401
+ (struct fdpic_func_descriptor __user * )ksig -> ka . sa .sa_handler ;
406
402
407
403
err |= __get_user (regs -> pc , & funcptr -> text );
408
404
err |= __get_user (regs -> regs [12 ], & funcptr -> GOT );
409
405
} else
410
- regs -> pc = (unsigned long )ka -> sa .sa_handler ;
406
+ regs -> pc = (unsigned long )ksig -> ka . sa .sa_handler ;
411
407
412
408
if (err )
413
- goto give_sigsegv ;
409
+ return - EFAULT ;
414
410
415
411
set_fs (USER_DS );
416
412
417
413
pr_debug ("SIG deliver (%s:%d): sp=%p pc=%08lx pr=%08lx\n" ,
418
414
current -> comm , task_pid_nr (current ), frame , regs -> pc , regs -> pr );
419
415
420
416
return 0 ;
421
-
422
- give_sigsegv :
423
- force_sigsegv (sig , current );
424
- return - EFAULT ;
425
417
}
426
418
427
419
static inline void
@@ -455,22 +447,18 @@ handle_syscall_restart(unsigned long save_r0, struct pt_regs *regs,
455
447
* OK, we're invoking a handler
456
448
*/
457
449
static void
458
- handle_signal (unsigned long sig , struct k_sigaction * ka , siginfo_t * info ,
459
- struct pt_regs * regs , unsigned int save_r0 )
450
+ handle_signal (struct ksignal * ksig , struct pt_regs * regs , unsigned int save_r0 )
460
451
{
461
452
sigset_t * oldset = sigmask_to_save ();
462
453
int ret ;
463
454
464
455
/* Set up the stack frame */
465
- if (ka -> sa .sa_flags & SA_SIGINFO )
466
- ret = setup_rt_frame (sig , ka , info , oldset , regs );
456
+ if (ksig -> ka . sa .sa_flags & SA_SIGINFO )
457
+ ret = setup_rt_frame (ksig , oldset , regs );
467
458
else
468
- ret = setup_frame (sig , ka , oldset , regs );
459
+ ret = setup_frame (ksig , oldset , regs );
469
460
470
- if (ret )
471
- return ;
472
- signal_delivered (sig , info , ka , regs ,
473
- test_thread_flag (TIF_SINGLESTEP ));
461
+ signal_setup_done (ret , ksig , test_thread_flag (TIF_SINGLESTEP ));
474
462
}
475
463
476
464
/*
@@ -484,9 +472,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
484
472
*/
485
473
static void do_signal (struct pt_regs * regs , unsigned int save_r0 )
486
474
{
487
- siginfo_t info ;
488
- int signr ;
489
- struct k_sigaction ka ;
475
+ struct ksignal ksig ;
490
476
491
477
/*
492
478
* We want the common case to go fast, which
@@ -497,12 +483,11 @@ static void do_signal(struct pt_regs *regs, unsigned int save_r0)
497
483
if (!user_mode (regs ))
498
484
return ;
499
485
500
- signr = get_signal_to_deliver (& info , & ka , regs , NULL );
501
- if (signr > 0 ) {
502
- handle_syscall_restart (save_r0 , regs , & ka .sa );
486
+ if (get_signal (& ksig )) {
487
+ handle_syscall_restart (save_r0 , regs , & ksig .ka .sa );
503
488
504
489
/* Whee! Actually deliver the signal. */
505
- handle_signal (signr , & ka , & info , regs , save_r0 );
490
+ handle_signal (& ksig , regs , save_r0 );
506
491
return ;
507
492
}
508
493
0 commit comments