diff options
Diffstat (limited to 'arch/um/os-Linux/signal.c')
-rw-r--r-- | arch/um/os-Linux/signal.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index 2d22f1fcd8e2..6366ce904b9b 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c | |||
@@ -13,8 +13,9 @@ | |||
13 | #include "kern_util.h" | 13 | #include "kern_util.h" |
14 | #include "os.h" | 14 | #include "os.h" |
15 | #include "sysdep/mcontext.h" | 15 | #include "sysdep/mcontext.h" |
16 | #include "internal.h" | ||
16 | 17 | ||
17 | void (*sig_info[NSIG])(int, struct uml_pt_regs *) = { | 18 | void (*sig_info[NSIG])(int, siginfo_t *, struct uml_pt_regs *) = { |
18 | [SIGTRAP] = relay_signal, | 19 | [SIGTRAP] = relay_signal, |
19 | [SIGFPE] = relay_signal, | 20 | [SIGFPE] = relay_signal, |
20 | [SIGILL] = relay_signal, | 21 | [SIGILL] = relay_signal, |
@@ -24,7 +25,7 @@ void (*sig_info[NSIG])(int, struct uml_pt_regs *) = { | |||
24 | [SIGIO] = sigio_handler, | 25 | [SIGIO] = sigio_handler, |
25 | [SIGVTALRM] = timer_handler }; | 26 | [SIGVTALRM] = timer_handler }; |
26 | 27 | ||
27 | static void sig_handler_common(int sig, mcontext_t *mc) | 28 | static void sig_handler_common(int sig, siginfo_t *si, mcontext_t *mc) |
28 | { | 29 | { |
29 | struct uml_pt_regs r; | 30 | struct uml_pt_regs r; |
30 | int save_errno = errno; | 31 | int save_errno = errno; |
@@ -40,7 +41,7 @@ static void sig_handler_common(int sig, mcontext_t *mc) | |||
40 | if ((sig != SIGIO) && (sig != SIGWINCH) && (sig != SIGVTALRM)) | 41 | if ((sig != SIGIO) && (sig != SIGWINCH) && (sig != SIGVTALRM)) |
41 | unblock_signals(); | 42 | unblock_signals(); |
42 | 43 | ||
43 | (*sig_info[sig])(sig, &r); | 44 | (*sig_info[sig])(sig, si, &r); |
44 | 45 | ||
45 | errno = save_errno; | 46 | errno = save_errno; |
46 | } | 47 | } |
@@ -60,7 +61,7 @@ static void sig_handler_common(int sig, mcontext_t *mc) | |||
60 | static int signals_enabled; | 61 | static int signals_enabled; |
61 | static unsigned int signals_pending; | 62 | static unsigned int signals_pending; |
62 | 63 | ||
63 | void sig_handler(int sig, mcontext_t *mc) | 64 | void sig_handler(int sig, siginfo_t *si, mcontext_t *mc) |
64 | { | 65 | { |
65 | int enabled; | 66 | int enabled; |
66 | 67 | ||
@@ -72,7 +73,7 @@ void sig_handler(int sig, mcontext_t *mc) | |||
72 | 73 | ||
73 | block_signals(); | 74 | block_signals(); |
74 | 75 | ||
75 | sig_handler_common(sig, mc); | 76 | sig_handler_common(sig, si, mc); |
76 | 77 | ||
77 | set_signals(enabled); | 78 | set_signals(enabled); |
78 | } | 79 | } |
@@ -85,10 +86,10 @@ static void real_alarm_handler(mcontext_t *mc) | |||
85 | get_regs_from_mc(®s, mc); | 86 | get_regs_from_mc(®s, mc); |
86 | regs.is_user = 0; | 87 | regs.is_user = 0; |
87 | unblock_signals(); | 88 | unblock_signals(); |
88 | timer_handler(SIGVTALRM, ®s); | 89 | timer_handler(SIGVTALRM, NULL, ®s); |
89 | } | 90 | } |
90 | 91 | ||
91 | void alarm_handler(int sig, mcontext_t *mc) | 92 | void alarm_handler(int sig, struct siginfo *unused_si, mcontext_t *mc) |
92 | { | 93 | { |
93 | int enabled; | 94 | int enabled; |
94 | 95 | ||
@@ -119,7 +120,7 @@ void set_sigstack(void *sig_stack, int size) | |||
119 | panic("enabling signal stack failed, errno = %d\n", errno); | 120 | panic("enabling signal stack failed, errno = %d\n", errno); |
120 | } | 121 | } |
121 | 122 | ||
122 | static void (*handlers[_NSIG])(int sig, mcontext_t *mc) = { | 123 | static void (*handlers[_NSIG])(int sig, siginfo_t *si, mcontext_t *mc) = { |
123 | [SIGSEGV] = sig_handler, | 124 | [SIGSEGV] = sig_handler, |
124 | [SIGBUS] = sig_handler, | 125 | [SIGBUS] = sig_handler, |
125 | [SIGILL] = sig_handler, | 126 | [SIGILL] = sig_handler, |
@@ -132,7 +133,7 @@ static void (*handlers[_NSIG])(int sig, mcontext_t *mc) = { | |||
132 | }; | 133 | }; |
133 | 134 | ||
134 | 135 | ||
135 | static void hard_handler(int sig, siginfo_t *info, void *p) | 136 | static void hard_handler(int sig, siginfo_t *si, void *p) |
136 | { | 137 | { |
137 | struct ucontext *uc = p; | 138 | struct ucontext *uc = p; |
138 | mcontext_t *mc = &uc->uc_mcontext; | 139 | mcontext_t *mc = &uc->uc_mcontext; |
@@ -161,7 +162,7 @@ static void hard_handler(int sig, siginfo_t *info, void *p) | |||
161 | while ((sig = ffs(pending)) != 0){ | 162 | while ((sig = ffs(pending)) != 0){ |
162 | sig--; | 163 | sig--; |
163 | pending &= ~(1 << sig); | 164 | pending &= ~(1 << sig); |
164 | (*handlers[sig])(sig, mc); | 165 | (*handlers[sig])(sig, si, mc); |
165 | } | 166 | } |
166 | 167 | ||
167 | /* | 168 | /* |
@@ -273,9 +274,12 @@ void unblock_signals(void) | |||
273 | * Deal with SIGIO first because the alarm handler might | 274 | * Deal with SIGIO first because the alarm handler might |
274 | * schedule, leaving the pending SIGIO stranded until we come | 275 | * schedule, leaving the pending SIGIO stranded until we come |
275 | * back here. | 276 | * back here. |
277 | * | ||
278 | * SIGIO's handler doesn't use siginfo or mcontext, | ||
279 | * so they can be NULL. | ||
276 | */ | 280 | */ |
277 | if (save_pending & SIGIO_MASK) | 281 | if (save_pending & SIGIO_MASK) |
278 | sig_handler_common(SIGIO, NULL); | 282 | sig_handler_common(SIGIO, NULL, NULL); |
279 | 283 | ||
280 | if (save_pending & SIGVTALRM_MASK) | 284 | if (save_pending & SIGVTALRM_MASK) |
281 | real_alarm_handler(NULL); | 285 | real_alarm_handler(NULL); |