diff options
Diffstat (limited to 'arch/um')
-rw-r--r-- | arch/um/include/shared/process.h | 5 | ||||
-rw-r--r-- | arch/um/os-Linux/internal.h | 1 | ||||
-rw-r--r-- | arch/um/os-Linux/signal.c | 35 | ||||
-rw-r--r-- | arch/um/os-Linux/time.c | 2 | ||||
-rw-r--r-- | arch/um/sys-x86/shared/sysdep/sigcontext_32.h | 7 | ||||
-rw-r--r-- | arch/um/sys-x86/shared/sysdep/sigcontext_64.h | 7 | ||||
-rw-r--r-- | arch/um/sys-x86/stub_segv.c | 2 |
7 files changed, 33 insertions, 26 deletions
diff --git a/arch/um/include/shared/process.h b/arch/um/include/shared/process.h index 28215300fc69..2ba310e1b656 100644 --- a/arch/um/include/shared/process.h +++ b/arch/um/include/shared/process.h | |||
@@ -6,9 +6,4 @@ | |||
6 | #ifndef __PROCESS_H__ | 6 | #ifndef __PROCESS_H__ |
7 | #define __PROCESS_H__ | 7 | #define __PROCESS_H__ |
8 | 8 | ||
9 | #include <signal.h> | ||
10 | |||
11 | extern void sig_handler(int sig, struct sigcontext *sc); | ||
12 | extern void alarm_handler(int sig, struct sigcontext *sc); | ||
13 | |||
14 | #endif | 9 | #endif |
diff --git a/arch/um/os-Linux/internal.h b/arch/um/os-Linux/internal.h new file mode 100644 index 000000000000..2c3c3ecd8c01 --- /dev/null +++ b/arch/um/os-Linux/internal.h | |||
@@ -0,0 +1 @@ | |||
void alarm_handler(int, mcontext_t *); | |||
diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index 08d306176995..07d9905e44ef 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c | |||
@@ -26,7 +26,7 @@ void (*sig_info[NSIG])(int, struct uml_pt_regs *) = { | |||
26 | [SIGIO] = sigio_handler, | 26 | [SIGIO] = sigio_handler, |
27 | [SIGVTALRM] = timer_handler }; | 27 | [SIGVTALRM] = timer_handler }; |
28 | 28 | ||
29 | static void sig_handler_common(int sig, struct sigcontext *sc) | 29 | static void sig_handler_common(int sig, mcontext_t *mc) |
30 | { | 30 | { |
31 | struct uml_pt_regs r; | 31 | struct uml_pt_regs r; |
32 | int save_errno = errno; | 32 | int save_errno = errno; |
@@ -34,8 +34,8 @@ static void sig_handler_common(int sig, struct sigcontext *sc) | |||
34 | r.is_user = 0; | 34 | r.is_user = 0; |
35 | if (sig == SIGSEGV) { | 35 | if (sig == SIGSEGV) { |
36 | /* For segfaults, we want the data from the sigcontext. */ | 36 | /* For segfaults, we want the data from the sigcontext. */ |
37 | copy_sc(&r, sc); | 37 | copy_sc(&r, (struct sigcontext *)mc); |
38 | GET_FAULTINFO_FROM_SC(r.faultinfo, sc); | 38 | GET_FAULTINFO_FROM_MC(r.faultinfo, mc); |
39 | } | 39 | } |
40 | 40 | ||
41 | /* enable signals if sig isn't IRQ signal */ | 41 | /* enable signals if sig isn't IRQ signal */ |
@@ -62,7 +62,7 @@ static void sig_handler_common(int sig, struct sigcontext *sc) | |||
62 | static int signals_enabled; | 62 | static int signals_enabled; |
63 | static unsigned int signals_pending; | 63 | static unsigned int signals_pending; |
64 | 64 | ||
65 | void sig_handler(int sig, struct sigcontext *sc) | 65 | void sig_handler(int sig, mcontext_t *mc) |
66 | { | 66 | { |
67 | int enabled; | 67 | int enabled; |
68 | 68 | ||
@@ -74,23 +74,23 @@ void sig_handler(int sig, struct sigcontext *sc) | |||
74 | 74 | ||
75 | block_signals(); | 75 | block_signals(); |
76 | 76 | ||
77 | sig_handler_common(sig, sc); | 77 | sig_handler_common(sig, mc); |
78 | 78 | ||
79 | set_signals(enabled); | 79 | set_signals(enabled); |
80 | } | 80 | } |
81 | 81 | ||
82 | static void real_alarm_handler(struct sigcontext *sc) | 82 | static void real_alarm_handler(mcontext_t *mc) |
83 | { | 83 | { |
84 | struct uml_pt_regs regs; | 84 | struct uml_pt_regs regs; |
85 | 85 | ||
86 | if (sc != NULL) | 86 | if (mc != NULL) |
87 | copy_sc(®s, sc); | 87 | copy_sc(®s, (struct sigcontext *)mc); |
88 | regs.is_user = 0; | 88 | regs.is_user = 0; |
89 | unblock_signals(); | 89 | unblock_signals(); |
90 | timer_handler(SIGVTALRM, ®s); | 90 | timer_handler(SIGVTALRM, ®s); |
91 | } | 91 | } |
92 | 92 | ||
93 | void alarm_handler(int sig, struct sigcontext *sc) | 93 | void alarm_handler(int sig, mcontext_t *mc) |
94 | { | 94 | { |
95 | int enabled; | 95 | int enabled; |
96 | 96 | ||
@@ -102,7 +102,7 @@ void alarm_handler(int sig, struct sigcontext *sc) | |||
102 | 102 | ||
103 | block_signals(); | 103 | block_signals(); |
104 | 104 | ||
105 | real_alarm_handler(sc); | 105 | real_alarm_handler(mc); |
106 | set_signals(enabled); | 106 | set_signals(enabled); |
107 | } | 107 | } |
108 | 108 | ||
@@ -121,7 +121,7 @@ void set_sigstack(void *sig_stack, int size) | |||
121 | panic("enabling signal stack failed, errno = %d\n", errno); | 121 | panic("enabling signal stack failed, errno = %d\n", errno); |
122 | } | 122 | } |
123 | 123 | ||
124 | static void (*handlers[_NSIG])(int sig, struct sigcontext *sc) = { | 124 | static void (*handlers[_NSIG])(int sig, mcontext_t *mc) = { |
125 | [SIGSEGV] = sig_handler, | 125 | [SIGSEGV] = sig_handler, |
126 | [SIGBUS] = sig_handler, | 126 | [SIGBUS] = sig_handler, |
127 | [SIGILL] = sig_handler, | 127 | [SIGILL] = sig_handler, |
@@ -133,8 +133,11 @@ static void (*handlers[_NSIG])(int sig, struct sigcontext *sc) = { | |||
133 | [SIGVTALRM] = alarm_handler | 133 | [SIGVTALRM] = alarm_handler |
134 | }; | 134 | }; |
135 | 135 | ||
136 | static void handle_signal(int sig, struct sigcontext *sc) | 136 | |
137 | static void hard_handler(int sig, siginfo_t *info, void *p) | ||
137 | { | 138 | { |
139 | struct ucontext *uc = p; | ||
140 | mcontext_t *mc = &uc->uc_mcontext; | ||
138 | unsigned long pending = 1UL << sig; | 141 | unsigned long pending = 1UL << sig; |
139 | 142 | ||
140 | do { | 143 | do { |
@@ -160,7 +163,7 @@ static void handle_signal(int sig, struct sigcontext *sc) | |||
160 | while ((sig = ffs(pending)) != 0){ | 163 | while ((sig = ffs(pending)) != 0){ |
161 | sig--; | 164 | sig--; |
162 | pending &= ~(1 << sig); | 165 | pending &= ~(1 << sig); |
163 | (*handlers[sig])(sig, sc); | 166 | (*handlers[sig])(sig, mc); |
164 | } | 167 | } |
165 | 168 | ||
166 | /* | 169 | /* |
@@ -174,12 +177,6 @@ static void handle_signal(int sig, struct sigcontext *sc) | |||
174 | } while (pending); | 177 | } while (pending); |
175 | } | 178 | } |
176 | 179 | ||
177 | static void hard_handler(int sig, siginfo_t *info, void *p) | ||
178 | { | ||
179 | struct ucontext *uc = p; | ||
180 | handle_signal(sig, (struct sigcontext *) &uc->uc_mcontext); | ||
181 | } | ||
182 | |||
183 | void set_handler(int sig) | 180 | void set_handler(int sig) |
184 | { | 181 | { |
185 | struct sigaction action; | 182 | struct sigaction action; |
diff --git a/arch/um/os-Linux/time.c b/arch/um/os-Linux/time.c index 995ca304f1c9..910499d76a67 100644 --- a/arch/um/os-Linux/time.c +++ b/arch/um/os-Linux/time.c | |||
@@ -10,7 +10,7 @@ | |||
10 | #include <sys/time.h> | 10 | #include <sys/time.h> |
11 | #include "kern_util.h" | 11 | #include "kern_util.h" |
12 | #include "os.h" | 12 | #include "os.h" |
13 | #include "process.h" | 13 | #include "internal.h" |
14 | 14 | ||
15 | int set_interval(void) | 15 | int set_interval(void) |
16 | { | 16 | { |
diff --git a/arch/um/sys-x86/shared/sysdep/sigcontext_32.h b/arch/um/sys-x86/shared/sysdep/sigcontext_32.h index aebc2dd61f0d..548c3cdb743b 100644 --- a/arch/um/sys-x86/shared/sysdep/sigcontext_32.h +++ b/arch/um/sys-x86/shared/sysdep/sigcontext_32.h | |||
@@ -22,4 +22,11 @@ | |||
22 | (fi).trap_no = SC_TRAPNO(sc); \ | 22 | (fi).trap_no = SC_TRAPNO(sc); \ |
23 | } | 23 | } |
24 | 24 | ||
25 | #define GET_FAULTINFO_FROM_MC(fi, mc) \ | ||
26 | { \ | ||
27 | (fi).cr2 = (mc)->cr2; \ | ||
28 | (fi).error_code = (mc)->gregs[REG_ERR]; \ | ||
29 | (fi).trap_no = (mc)->gregs[REG_TRAPNO]; \ | ||
30 | } | ||
31 | |||
25 | #endif | 32 | #endif |
diff --git a/arch/um/sys-x86/shared/sysdep/sigcontext_64.h b/arch/um/sys-x86/shared/sysdep/sigcontext_64.h index 60d89a2fba06..5c4a6a359141 100644 --- a/arch/um/sys-x86/shared/sysdep/sigcontext_64.h +++ b/arch/um/sys-x86/shared/sysdep/sigcontext_64.h | |||
@@ -22,4 +22,11 @@ | |||
22 | (fi).trap_no = SC_TRAPNO(sc); \ | 22 | (fi).trap_no = SC_TRAPNO(sc); \ |
23 | } | 23 | } |
24 | 24 | ||
25 | #define GET_FAULTINFO_FROM_MC(fi, mc) \ | ||
26 | { \ | ||
27 | (fi).cr2 = (mc)->gregs[REG_CR2]; \ | ||
28 | (fi).error_code = (mc)->gregs[REG_ERR]; \ | ||
29 | (fi).trap_no = (mc)->gregs[REG_TRAPNO]; \ | ||
30 | } | ||
31 | |||
25 | #endif | 32 | #endif |
diff --git a/arch/um/sys-x86/stub_segv.c b/arch/um/sys-x86/stub_segv.c index f62771cf236e..bd2eaf69103f 100644 --- a/arch/um/sys-x86/stub_segv.c +++ b/arch/um/sys-x86/stub_segv.c | |||
@@ -12,7 +12,7 @@ stub_segv_handler(int sig, siginfo_t *info, void *p) | |||
12 | { | 12 | { |
13 | struct ucontext *uc = p; | 13 | struct ucontext *uc = p; |
14 | 14 | ||
15 | GET_FAULTINFO_FROM_SC(*((struct faultinfo *) STUB_DATA), | 15 | GET_FAULTINFO_FROM_MC(*((struct faultinfo *) STUB_DATA), |
16 | &uc->uc_mcontext); | 16 | &uc->uc_mcontext); |
17 | trap_myself(); | 17 | trap_myself(); |
18 | } | 18 | } |