diff options
Diffstat (limited to 'arch/um/os-Linux/signal.c')
-rw-r--r-- | arch/um/os-Linux/signal.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index 49c113b576b7..1c5267ec13b0 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c | |||
@@ -59,17 +59,11 @@ static void real_alarm_handler(int sig, struct sigcontext *sc) | |||
59 | { | 59 | { |
60 | struct uml_pt_regs regs; | 60 | struct uml_pt_regs regs; |
61 | 61 | ||
62 | if (sig == SIGALRM) | ||
63 | switch_timers(0); | ||
64 | |||
65 | if (sc != NULL) | 62 | if (sc != NULL) |
66 | copy_sc(®s, sc); | 63 | copy_sc(®s, sc); |
67 | regs.is_user = 0; | 64 | regs.is_user = 0; |
68 | unblock_signals(); | 65 | unblock_signals(); |
69 | timer_handler(sig, ®s); | 66 | timer_handler(sig, ®s); |
70 | |||
71 | if (sig == SIGALRM) | ||
72 | switch_timers(1); | ||
73 | } | 67 | } |
74 | 68 | ||
75 | void alarm_handler(int sig, struct sigcontext *sc) | 69 | void alarm_handler(int sig, struct sigcontext *sc) |
@@ -116,6 +110,7 @@ void (*handlers[_NSIG])(int sig, struct sigcontext *sc); | |||
116 | void handle_signal(int sig, struct sigcontext *sc) | 110 | void handle_signal(int sig, struct sigcontext *sc) |
117 | { | 111 | { |
118 | unsigned long pending = 1UL << sig; | 112 | unsigned long pending = 1UL << sig; |
113 | int timer = switch_timers(0); | ||
119 | 114 | ||
120 | do { | 115 | do { |
121 | int nested, bail; | 116 | int nested, bail; |
@@ -152,6 +147,8 @@ void handle_signal(int sig, struct sigcontext *sc) | |||
152 | if (!nested) | 147 | if (!nested) |
153 | pending = from_irq_stack(nested); | 148 | pending = from_irq_stack(nested); |
154 | } while (pending); | 149 | } while (pending); |
150 | |||
151 | switch_timers(timer); | ||
155 | } | 152 | } |
156 | 153 | ||
157 | extern void hard_handler(int sig); | 154 | extern void hard_handler(int sig); |