diff options
| -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 | } |
