Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/parisc/kernel/signal.c
10817 views
1
/*
2
* linux/arch/parisc/kernel/signal.c: Architecture-specific signal
3
* handling support.
4
*
5
* Copyright (C) 2000 David Huggins-Daines <[email protected]>
6
* Copyright (C) 2000 Linuxcare, Inc.
7
*
8
* Based on the ia64, i386, and alpha versions.
9
*
10
* Like the IA-64, we are a recent enough port (we are *starting*
11
* with glibc2.2) that we do not need to support the old non-realtime
12
* Linux signals. Therefore we don't. HP/UX signals will go in
13
* arch/parisc/hpux/signal.c when we figure out how to do them.
14
*/
15
16
#include <linux/sched.h>
17
#include <linux/mm.h>
18
#include <linux/smp.h>
19
#include <linux/kernel.h>
20
#include <linux/signal.h>
21
#include <linux/errno.h>
22
#include <linux/wait.h>
23
#include <linux/ptrace.h>
24
#include <linux/tracehook.h>
25
#include <linux/unistd.h>
26
#include <linux/stddef.h>
27
#include <linux/compat.h>
28
#include <linux/elf.h>
29
#include <asm/ucontext.h>
30
#include <asm/rt_sigframe.h>
31
#include <asm/uaccess.h>
32
#include <asm/pgalloc.h>
33
#include <asm/cacheflush.h>
34
#include <asm/asm-offsets.h>
35
36
#ifdef CONFIG_COMPAT
37
#include "signal32.h"
38
#endif
39
40
#define DEBUG_SIG 0
41
#define DEBUG_SIG_LEVEL 2
42
43
#if DEBUG_SIG
44
#define DBG(LEVEL, ...) \
45
((DEBUG_SIG_LEVEL >= LEVEL) \
46
? printk(__VA_ARGS__) : (void) 0)
47
#else
48
#define DBG(LEVEL, ...)
49
#endif
50
51
52
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
53
54
/* gcc will complain if a pointer is cast to an integer of different
55
* size. If you really need to do this (and we do for an ELF32 user
56
* application in an ELF64 kernel) then you have to do a cast to an
57
* integer of the same size first. The A() macro accomplishes
58
* this. */
59
#define A(__x) ((unsigned long)(__x))
60
61
/*
62
* Atomically swap in the new signal mask, and wait for a signal.
63
*/
64
#ifdef CONFIG_64BIT
65
#include "sys32.h"
66
#endif
67
68
/*
69
* Do a signal return - restore sigcontext.
70
*/
71
72
/* Trampoline for calling rt_sigreturn() */
73
#define INSN_LDI_R25_0 0x34190000 /* ldi 0,%r25 (in_syscall=0) */
74
#define INSN_LDI_R25_1 0x34190002 /* ldi 1,%r25 (in_syscall=1) */
75
#define INSN_LDI_R20 0x3414015a /* ldi __NR_rt_sigreturn,%r20 */
76
#define INSN_BLE_SR2_R0 0xe4008200 /* be,l 0x100(%sr2,%r0),%sr0,%r31 */
77
#define INSN_NOP 0x08000240 /* nop */
78
/* For debugging */
79
#define INSN_DIE_HORRIBLY 0x68000ccc /* stw %r0,0x666(%sr0,%r0) */
80
81
static long
82
restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs)
83
{
84
long err = 0;
85
86
err |= __copy_from_user(regs->gr, sc->sc_gr, sizeof(regs->gr));
87
err |= __copy_from_user(regs->fr, sc->sc_fr, sizeof(regs->fr));
88
err |= __copy_from_user(regs->iaoq, sc->sc_iaoq, sizeof(regs->iaoq));
89
err |= __copy_from_user(regs->iasq, sc->sc_iasq, sizeof(regs->iasq));
90
err |= __get_user(regs->sar, &sc->sc_sar);
91
DBG(2,"restore_sigcontext: iaoq is 0x%#lx / 0x%#lx\n",
92
regs->iaoq[0],regs->iaoq[1]);
93
DBG(2,"restore_sigcontext: r28 is %ld\n", regs->gr[28]);
94
return err;
95
}
96
97
void
98
sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
99
{
100
struct rt_sigframe __user *frame;
101
sigset_t set;
102
unsigned long usp = (regs->gr[30] & ~(0x01UL));
103
unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE;
104
#ifdef CONFIG_64BIT
105
compat_sigset_t compat_set;
106
struct compat_rt_sigframe __user * compat_frame;
107
108
if (is_compat_task())
109
sigframe_size = PARISC_RT_SIGFRAME_SIZE32;
110
#endif
111
112
113
/* Unwind the user stack to get the rt_sigframe structure. */
114
frame = (struct rt_sigframe __user *)
115
(usp - sigframe_size);
116
DBG(2,"sys_rt_sigreturn: frame is %p\n", frame);
117
118
#ifdef CONFIG_64BIT
119
compat_frame = (struct compat_rt_sigframe __user *)frame;
120
121
if (is_compat_task()) {
122
DBG(2,"sys_rt_sigreturn: ELF32 process.\n");
123
if (__copy_from_user(&compat_set, &compat_frame->uc.uc_sigmask, sizeof(compat_set)))
124
goto give_sigsegv;
125
sigset_32to64(&set,&compat_set);
126
} else
127
#endif
128
{
129
if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
130
goto give_sigsegv;
131
}
132
133
sigdelsetmask(&set, ~_BLOCKABLE);
134
spin_lock_irq(&current->sighand->siglock);
135
current->blocked = set;
136
recalc_sigpending();
137
spin_unlock_irq(&current->sighand->siglock);
138
139
/* Good thing we saved the old gr[30], eh? */
140
#ifdef CONFIG_64BIT
141
if (is_compat_task()) {
142
DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n",
143
&compat_frame->uc.uc_mcontext);
144
// FIXME: Load upper half from register file
145
if (restore_sigcontext32(&compat_frame->uc.uc_mcontext,
146
&compat_frame->regs, regs))
147
goto give_sigsegv;
148
DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n",
149
usp, &compat_frame->uc.uc_stack);
150
if (do_sigaltstack32(&compat_frame->uc.uc_stack, NULL, usp) == -EFAULT)
151
goto give_sigsegv;
152
} else
153
#endif
154
{
155
DBG(1,"sys_rt_sigreturn: frame->uc.uc_mcontext 0x%p\n",
156
&frame->uc.uc_mcontext);
157
if (restore_sigcontext(&frame->uc.uc_mcontext, regs))
158
goto give_sigsegv;
159
DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n",
160
usp, &frame->uc.uc_stack);
161
if (do_sigaltstack(&frame->uc.uc_stack, NULL, usp) == -EFAULT)
162
goto give_sigsegv;
163
}
164
165
166
167
/* If we are on the syscall path IAOQ will not be restored, and
168
* if we are on the interrupt path we must not corrupt gr31.
169
*/
170
if (in_syscall)
171
regs->gr[31] = regs->iaoq[0];
172
#if DEBUG_SIG
173
DBG(1,"sys_rt_sigreturn: returning to %#lx, DUMPING REGS:\n", regs->iaoq[0]);
174
show_regs(regs);
175
#endif
176
return;
177
178
give_sigsegv:
179
DBG(1,"sys_rt_sigreturn: Sending SIGSEGV\n");
180
force_sig(SIGSEGV, current);
181
return;
182
}
183
184
/*
185
* Set up a signal frame.
186
*/
187
188
static inline void __user *
189
get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
190
{
191
/*FIXME: ELF32 vs. ELF64 has different frame_size, but since we
192
don't use the parameter it doesn't matter */
193
194
DBG(1,"get_sigframe: ka = %#lx, sp = %#lx, frame_size = %#lx\n",
195
(unsigned long)ka, sp, frame_size);
196
197
if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
198
sp = current->sas_ss_sp; /* Stacks grow up! */
199
200
DBG(1,"get_sigframe: Returning sp = %#lx\n", (unsigned long)sp);
201
return (void __user *) sp; /* Stacks grow up. Fun. */
202
}
203
204
static long
205
setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, int in_syscall)
206
207
{
208
unsigned long flags = 0;
209
long err = 0;
210
211
if (on_sig_stack((unsigned long) sc))
212
flags |= PARISC_SC_FLAG_ONSTACK;
213
if (in_syscall) {
214
flags |= PARISC_SC_FLAG_IN_SYSCALL;
215
/* regs->iaoq is undefined in the syscall return path */
216
err |= __put_user(regs->gr[31], &sc->sc_iaoq[0]);
217
err |= __put_user(regs->gr[31]+4, &sc->sc_iaoq[1]);
218
err |= __put_user(regs->sr[3], &sc->sc_iasq[0]);
219
err |= __put_user(regs->sr[3], &sc->sc_iasq[1]);
220
DBG(1,"setup_sigcontext: iaoq %#lx / %#lx (in syscall)\n",
221
regs->gr[31], regs->gr[31]+4);
222
} else {
223
err |= __copy_to_user(sc->sc_iaoq, regs->iaoq, sizeof(regs->iaoq));
224
err |= __copy_to_user(sc->sc_iasq, regs->iasq, sizeof(regs->iasq));
225
DBG(1,"setup_sigcontext: iaoq %#lx / %#lx (not in syscall)\n",
226
regs->iaoq[0], regs->iaoq[1]);
227
}
228
229
err |= __put_user(flags, &sc->sc_flags);
230
err |= __copy_to_user(sc->sc_gr, regs->gr, sizeof(regs->gr));
231
err |= __copy_to_user(sc->sc_fr, regs->fr, sizeof(regs->fr));
232
err |= __put_user(regs->sar, &sc->sc_sar);
233
DBG(1,"setup_sigcontext: r28 is %ld\n", regs->gr[28]);
234
235
return err;
236
}
237
238
static long
239
setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
240
sigset_t *set, struct pt_regs *regs, int in_syscall)
241
{
242
struct rt_sigframe __user *frame;
243
unsigned long rp, usp;
244
unsigned long haddr, sigframe_size;
245
int err = 0;
246
#ifdef CONFIG_64BIT
247
compat_int_t compat_val;
248
struct compat_rt_sigframe __user * compat_frame;
249
compat_sigset_t compat_set;
250
#endif
251
252
usp = (regs->gr[30] & ~(0x01UL));
253
/*FIXME: frame_size parameter is unused, remove it. */
254
frame = get_sigframe(ka, usp, sizeof(*frame));
255
256
DBG(1,"SETUP_RT_FRAME: START\n");
257
DBG(1,"setup_rt_frame: frame %p info %p\n", frame, info);
258
259
260
#ifdef CONFIG_64BIT
261
262
compat_frame = (struct compat_rt_sigframe __user *)frame;
263
264
if (is_compat_task()) {
265
DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info);
266
err |= copy_siginfo_to_user32(&compat_frame->info, info);
267
DBG(1,"SETUP_RT_FRAME: 1\n");
268
compat_val = (compat_int_t)current->sas_ss_sp;
269
err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_sp);
270
DBG(1,"SETUP_RT_FRAME: 2\n");
271
compat_val = (compat_int_t)current->sas_ss_size;
272
err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_size);
273
DBG(1,"SETUP_RT_FRAME: 3\n");
274
compat_val = sas_ss_flags(regs->gr[30]);
275
err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_flags);
276
DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc);
277
DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext);
278
err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext,
279
&compat_frame->regs, regs, in_syscall);
280
sigset_64to32(&compat_set,set);
281
err |= __copy_to_user(&compat_frame->uc.uc_sigmask, &compat_set, sizeof(compat_set));
282
} else
283
#endif
284
{
285
DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info);
286
err |= copy_siginfo_to_user(&frame->info, info);
287
err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
288
err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
289
err |= __put_user(sas_ss_flags(regs->gr[30]),
290
&frame->uc.uc_stack.ss_flags);
291
DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc);
292
DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext);
293
err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall);
294
/* FIXME: Should probably be converted as well for the compat case */
295
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
296
}
297
298
if (err)
299
goto give_sigsegv;
300
301
/* Set up to return from userspace. If provided, use a stub
302
already in userspace. The first words of tramp are used to
303
save the previous sigrestartblock trampoline that might be
304
on the stack. We start the sigreturn trampoline at
305
SIGRESTARTBLOCK_TRAMP+X. */
306
err |= __put_user(in_syscall ? INSN_LDI_R25_1 : INSN_LDI_R25_0,
307
&frame->tramp[SIGRESTARTBLOCK_TRAMP+0]);
308
err |= __put_user(INSN_LDI_R20,
309
&frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
310
err |= __put_user(INSN_BLE_SR2_R0,
311
&frame->tramp[SIGRESTARTBLOCK_TRAMP+2]);
312
err |= __put_user(INSN_NOP, &frame->tramp[SIGRESTARTBLOCK_TRAMP+3]);
313
314
#if DEBUG_SIG
315
/* Assert that we're flushing in the correct space... */
316
{
317
int sid;
318
asm ("mfsp %%sr3,%0" : "=r" (sid));
319
DBG(1,"setup_rt_frame: Flushing 64 bytes at space %#x offset %p\n",
320
sid, frame->tramp);
321
}
322
#endif
323
324
flush_user_dcache_range((unsigned long) &frame->tramp[0],
325
(unsigned long) &frame->tramp[TRAMP_SIZE]);
326
flush_user_icache_range((unsigned long) &frame->tramp[0],
327
(unsigned long) &frame->tramp[TRAMP_SIZE]);
328
329
/* TRAMP Words 0-4, Length 5 = SIGRESTARTBLOCK_TRAMP
330
* TRAMP Words 5-9, Length 4 = SIGRETURN_TRAMP
331
* So the SIGRETURN_TRAMP is at the end of SIGRESTARTBLOCK_TRAMP
332
*/
333
rp = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP];
334
335
if (err)
336
goto give_sigsegv;
337
338
haddr = A(ka->sa.sa_handler);
339
/* The sa_handler may be a pointer to a function descriptor */
340
#ifdef CONFIG_64BIT
341
if (is_compat_task()) {
342
#endif
343
if (haddr & PA_PLABEL_FDESC) {
344
Elf32_Fdesc fdesc;
345
Elf32_Fdesc __user *ufdesc = (Elf32_Fdesc __user *)A(haddr & ~3);
346
347
err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
348
349
if (err)
350
goto give_sigsegv;
351
352
haddr = fdesc.addr;
353
regs->gr[19] = fdesc.gp;
354
}
355
#ifdef CONFIG_64BIT
356
} else {
357
Elf64_Fdesc fdesc;
358
Elf64_Fdesc __user *ufdesc = (Elf64_Fdesc __user *)A(haddr & ~3);
359
360
err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
361
362
if (err)
363
goto give_sigsegv;
364
365
haddr = fdesc.addr;
366
regs->gr[19] = fdesc.gp;
367
DBG(1,"setup_rt_frame: 64 bit signal, exe=%#lx, r19=%#lx, in_syscall=%d\n",
368
haddr, regs->gr[19], in_syscall);
369
}
370
#endif
371
372
/* The syscall return path will create IAOQ values from r31.
373
*/
374
sigframe_size = PARISC_RT_SIGFRAME_SIZE;
375
#ifdef CONFIG_64BIT
376
if (is_compat_task())
377
sigframe_size = PARISC_RT_SIGFRAME_SIZE32;
378
#endif
379
if (in_syscall) {
380
regs->gr[31] = haddr;
381
#ifdef CONFIG_64BIT
382
if (!test_thread_flag(TIF_32BIT))
383
sigframe_size |= 1;
384
#endif
385
} else {
386
unsigned long psw = USER_PSW;
387
#ifdef CONFIG_64BIT
388
if (!test_thread_flag(TIF_32BIT))
389
psw |= PSW_W;
390
#endif
391
392
/* If we are singlestepping, arrange a trap to be delivered
393
when we return to userspace. Note the semantics -- we
394
should trap before the first insn in the handler is
395
executed. Ref:
396
http://sources.redhat.com/ml/gdb/2004-11/msg00245.html
397
*/
398
if (pa_psw(current)->r) {
399
pa_psw(current)->r = 0;
400
psw |= PSW_R;
401
mtctl(-1, 0);
402
}
403
404
regs->gr[0] = psw;
405
regs->iaoq[0] = haddr | 3;
406
regs->iaoq[1] = regs->iaoq[0] + 4;
407
}
408
409
regs->gr[2] = rp; /* userland return pointer */
410
regs->gr[26] = sig; /* signal number */
411
412
#ifdef CONFIG_64BIT
413
if (is_compat_task()) {
414
regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */
415
regs->gr[24] = A(&compat_frame->uc); /* ucontext pointer */
416
} else
417
#endif
418
{
419
regs->gr[25] = A(&frame->info); /* siginfo pointer */
420
regs->gr[24] = A(&frame->uc); /* ucontext pointer */
421
}
422
423
DBG(1,"setup_rt_frame: making sigreturn frame: %#lx + %#lx = %#lx\n",
424
regs->gr[30], sigframe_size,
425
regs->gr[30] + sigframe_size);
426
/* Raise the user stack pointer to make a proper call frame. */
427
regs->gr[30] = (A(frame) + sigframe_size);
428
429
430
DBG(1,"setup_rt_frame: sig deliver (%s,%d) frame=0x%p sp=%#lx iaoq=%#lx/%#lx rp=%#lx\n",
431
current->comm, current->pid, frame, regs->gr[30],
432
regs->iaoq[0], regs->iaoq[1], rp);
433
434
return 1;
435
436
give_sigsegv:
437
DBG(1,"setup_rt_frame: sending SIGSEGV\n");
438
force_sigsegv(sig, current);
439
return 0;
440
}
441
442
/*
443
* OK, we're invoking a handler.
444
*/
445
446
static long
447
handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
448
sigset_t *oldset, struct pt_regs *regs, int in_syscall)
449
{
450
DBG(1,"handle_signal: sig=%ld, ka=%p, info=%p, oldset=%p, regs=%p\n",
451
sig, ka, info, oldset, regs);
452
453
/* Set up the stack frame */
454
if (!setup_rt_frame(sig, ka, info, oldset, regs, in_syscall))
455
return 0;
456
457
spin_lock_irq(&current->sighand->siglock);
458
sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
459
if (!(ka->sa.sa_flags & SA_NODEFER))
460
sigaddset(&current->blocked,sig);
461
recalc_sigpending();
462
spin_unlock_irq(&current->sighand->siglock);
463
464
tracehook_signal_handler(sig, info, ka, regs,
465
test_thread_flag(TIF_SINGLESTEP) ||
466
test_thread_flag(TIF_BLOCKSTEP));
467
468
return 1;
469
}
470
471
static inline void
472
syscall_restart(struct pt_regs *regs, struct k_sigaction *ka)
473
{
474
/* Check the return code */
475
switch (regs->gr[28]) {
476
case -ERESTART_RESTARTBLOCK:
477
current_thread_info()->restart_block.fn =
478
do_no_restart_syscall;
479
case -ERESTARTNOHAND:
480
DBG(1,"ERESTARTNOHAND: returning -EINTR\n");
481
regs->gr[28] = -EINTR;
482
break;
483
484
case -ERESTARTSYS:
485
if (!(ka->sa.sa_flags & SA_RESTART)) {
486
DBG(1,"ERESTARTSYS: putting -EINTR\n");
487
regs->gr[28] = -EINTR;
488
break;
489
}
490
/* fallthrough */
491
case -ERESTARTNOINTR:
492
/* A syscall is just a branch, so all
493
* we have to do is fiddle the return pointer.
494
*/
495
regs->gr[31] -= 8; /* delayed branching */
496
/* Preserve original r28. */
497
regs->gr[28] = regs->orig_r28;
498
break;
499
}
500
}
501
502
static inline void
503
insert_restart_trampoline(struct pt_regs *regs)
504
{
505
switch(regs->gr[28]) {
506
case -ERESTART_RESTARTBLOCK: {
507
/* Restart the system call - no handlers present */
508
unsigned int *usp = (unsigned int *)regs->gr[30];
509
510
/* Setup a trampoline to restart the syscall
511
* with __NR_restart_syscall
512
*
513
* 0: <return address (orig r31)>
514
* 4: <2nd half for 64-bit>
515
* 8: ldw 0(%sp), %r31
516
* 12: be 0x100(%sr2, %r0)
517
* 16: ldi __NR_restart_syscall, %r20
518
*/
519
#ifdef CONFIG_64BIT
520
put_user(regs->gr[31] >> 32, &usp[0]);
521
put_user(regs->gr[31] & 0xffffffff, &usp[1]);
522
put_user(0x0fc010df, &usp[2]);
523
#else
524
put_user(regs->gr[31], &usp[0]);
525
put_user(0x0fc0109f, &usp[2]);
526
#endif
527
put_user(0xe0008200, &usp[3]);
528
put_user(0x34140000, &usp[4]);
529
530
/* Stack is 64-byte aligned, and we only need
531
* to flush 1 cache line.
532
* Flushing one cacheline is cheap.
533
* "sync" on bigger (> 4 way) boxes is not.
534
*/
535
flush_user_dcache_range(regs->gr[30], regs->gr[30] + 4);
536
flush_user_icache_range(regs->gr[30], regs->gr[30] + 4);
537
538
regs->gr[31] = regs->gr[30] + 8;
539
/* Preserve original r28. */
540
regs->gr[28] = regs->orig_r28;
541
542
return;
543
}
544
case -ERESTARTNOHAND:
545
case -ERESTARTSYS:
546
case -ERESTARTNOINTR: {
547
/* Hooray for delayed branching. We don't
548
* have to restore %r20 (the system call
549
* number) because it gets loaded in the delay
550
* slot of the branch external instruction.
551
*/
552
regs->gr[31] -= 8;
553
/* Preserve original r28. */
554
regs->gr[28] = regs->orig_r28;
555
556
return;
557
}
558
default:
559
break;
560
}
561
}
562
563
/*
564
* Note that 'init' is a special process: it doesn't get signals it doesn't
565
* want to handle. Thus you cannot kill init even with a SIGKILL even by
566
* mistake.
567
*
568
* We need to be able to restore the syscall arguments (r21-r26) to
569
* restart syscalls. Thus, the syscall path should save them in the
570
* pt_regs structure (it's okay to do so since they are caller-save
571
* registers). As noted below, the syscall number gets restored for
572
* us due to the magic of delayed branching.
573
*/
574
asmlinkage void
575
do_signal(struct pt_regs *regs, long in_syscall)
576
{
577
siginfo_t info;
578
struct k_sigaction ka;
579
int signr;
580
sigset_t *oldset;
581
582
DBG(1,"\ndo_signal: oldset=0x%p, regs=0x%p, sr7 %#lx, in_syscall=%d\n",
583
oldset, regs, regs->sr[7], in_syscall);
584
585
/* Everyone else checks to see if they are in kernel mode at
586
this point and exits if that's the case. I'm not sure why
587
we would be called in that case, but for some reason we
588
are. */
589
590
if (test_thread_flag(TIF_RESTORE_SIGMASK))
591
oldset = &current->saved_sigmask;
592
else
593
oldset = &current->blocked;
594
595
DBG(1,"do_signal: oldset %08lx / %08lx\n",
596
oldset->sig[0], oldset->sig[1]);
597
598
599
/* May need to force signal if handle_signal failed to deliver */
600
while (1) {
601
602
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
603
DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]);
604
605
if (signr <= 0)
606
break;
607
608
/* Restart a system call if necessary. */
609
if (in_syscall)
610
syscall_restart(regs, &ka);
611
612
/* Whee! Actually deliver the signal. If the
613
delivery failed, we need to continue to iterate in
614
this loop so we can deliver the SIGSEGV... */
615
if (handle_signal(signr, &info, &ka, oldset,
616
regs, in_syscall)) {
617
DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n",
618
regs->gr[28]);
619
if (test_thread_flag(TIF_RESTORE_SIGMASK))
620
clear_thread_flag(TIF_RESTORE_SIGMASK);
621
return;
622
}
623
}
624
/* end of while(1) looping forever if we can't force a signal */
625
626
/* Did we come from a system call? */
627
if (in_syscall)
628
insert_restart_trampoline(regs);
629
630
DBG(1,"do_signal: Exit (not delivered), regs->gr[28] = %ld\n",
631
regs->gr[28]);
632
633
if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
634
clear_thread_flag(TIF_RESTORE_SIGMASK);
635
sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
636
}
637
638
return;
639
}
640
641
void do_notify_resume(struct pt_regs *regs, long in_syscall)
642
{
643
if (test_thread_flag(TIF_SIGPENDING) ||
644
test_thread_flag(TIF_RESTORE_SIGMASK))
645
do_signal(regs, in_syscall);
646
647
if (test_thread_flag(TIF_NOTIFY_RESUME)) {
648
clear_thread_flag(TIF_NOTIFY_RESUME);
649
tracehook_notify_resume(regs);
650
if (current->replacement_session_keyring)
651
key_replace_session_keyring();
652
}
653
}
654
655