Commit db023ea595015058270be6a62fe60a7b6b5c50d7
1 parent
1b08e90721
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
uprobes: Move clear_thread_flag(TIF_UPROBE) to uprobe_notify_resume()
Move clear_thread_flag(TIF_UPROBE) from do_notify_resume() to uprobe_notify_resume() for !CONFIG_UPROBES case. Signed-off-by: Oleg Nesterov <oleg@redhat.com> Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Showing 2 changed files with 3 additions and 3 deletions Inline Diff
arch/x86/kernel/signal.c
1 | /* | 1 | /* |
2 | * Copyright (C) 1991, 1992 Linus Torvalds | 2 | * Copyright (C) 1991, 1992 Linus Torvalds |
3 | * Copyright (C) 2000, 2001, 2002 Andi Kleen SuSE Labs | 3 | * Copyright (C) 2000, 2001, 2002 Andi Kleen SuSE Labs |
4 | * | 4 | * |
5 | * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson | 5 | * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson |
6 | * 2000-06-20 Pentium III FXSR, SSE support by Gareth Hughes | 6 | * 2000-06-20 Pentium III FXSR, SSE support by Gareth Hughes |
7 | * 2000-2002 x86-64 support by Andi Kleen | 7 | * 2000-2002 x86-64 support by Andi Kleen |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | 10 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
11 | 11 | ||
12 | #include <linux/sched.h> | 12 | #include <linux/sched.h> |
13 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
14 | #include <linux/smp.h> | 14 | #include <linux/smp.h> |
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
17 | #include <linux/wait.h> | 17 | #include <linux/wait.h> |
18 | #include <linux/tracehook.h> | 18 | #include <linux/tracehook.h> |
19 | #include <linux/unistd.h> | 19 | #include <linux/unistd.h> |
20 | #include <linux/stddef.h> | 20 | #include <linux/stddef.h> |
21 | #include <linux/personality.h> | 21 | #include <linux/personality.h> |
22 | #include <linux/uaccess.h> | 22 | #include <linux/uaccess.h> |
23 | #include <linux/user-return-notifier.h> | 23 | #include <linux/user-return-notifier.h> |
24 | #include <linux/uprobes.h> | 24 | #include <linux/uprobes.h> |
25 | 25 | ||
26 | #include <asm/processor.h> | 26 | #include <asm/processor.h> |
27 | #include <asm/ucontext.h> | 27 | #include <asm/ucontext.h> |
28 | #include <asm/i387.h> | 28 | #include <asm/i387.h> |
29 | #include <asm/fpu-internal.h> | 29 | #include <asm/fpu-internal.h> |
30 | #include <asm/vdso.h> | 30 | #include <asm/vdso.h> |
31 | #include <asm/mce.h> | 31 | #include <asm/mce.h> |
32 | #include <asm/sighandling.h> | 32 | #include <asm/sighandling.h> |
33 | 33 | ||
34 | #ifdef CONFIG_X86_64 | 34 | #ifdef CONFIG_X86_64 |
35 | #include <asm/proto.h> | 35 | #include <asm/proto.h> |
36 | #include <asm/ia32_unistd.h> | 36 | #include <asm/ia32_unistd.h> |
37 | #include <asm/sys_ia32.h> | 37 | #include <asm/sys_ia32.h> |
38 | #endif /* CONFIG_X86_64 */ | 38 | #endif /* CONFIG_X86_64 */ |
39 | 39 | ||
40 | #include <asm/syscall.h> | 40 | #include <asm/syscall.h> |
41 | #include <asm/syscalls.h> | 41 | #include <asm/syscalls.h> |
42 | 42 | ||
43 | #include <asm/sigframe.h> | 43 | #include <asm/sigframe.h> |
44 | 44 | ||
45 | #ifdef CONFIG_X86_32 | 45 | #ifdef CONFIG_X86_32 |
46 | # define FIX_EFLAGS (__FIX_EFLAGS | X86_EFLAGS_RF) | 46 | # define FIX_EFLAGS (__FIX_EFLAGS | X86_EFLAGS_RF) |
47 | #else | 47 | #else |
48 | # define FIX_EFLAGS __FIX_EFLAGS | 48 | # define FIX_EFLAGS __FIX_EFLAGS |
49 | #endif | 49 | #endif |
50 | 50 | ||
51 | #define COPY(x) do { \ | 51 | #define COPY(x) do { \ |
52 | get_user_ex(regs->x, &sc->x); \ | 52 | get_user_ex(regs->x, &sc->x); \ |
53 | } while (0) | 53 | } while (0) |
54 | 54 | ||
55 | #define GET_SEG(seg) ({ \ | 55 | #define GET_SEG(seg) ({ \ |
56 | unsigned short tmp; \ | 56 | unsigned short tmp; \ |
57 | get_user_ex(tmp, &sc->seg); \ | 57 | get_user_ex(tmp, &sc->seg); \ |
58 | tmp; \ | 58 | tmp; \ |
59 | }) | 59 | }) |
60 | 60 | ||
61 | #define COPY_SEG(seg) do { \ | 61 | #define COPY_SEG(seg) do { \ |
62 | regs->seg = GET_SEG(seg); \ | 62 | regs->seg = GET_SEG(seg); \ |
63 | } while (0) | 63 | } while (0) |
64 | 64 | ||
65 | #define COPY_SEG_CPL3(seg) do { \ | 65 | #define COPY_SEG_CPL3(seg) do { \ |
66 | regs->seg = GET_SEG(seg) | 3; \ | 66 | regs->seg = GET_SEG(seg) | 3; \ |
67 | } while (0) | 67 | } while (0) |
68 | 68 | ||
69 | int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | 69 | int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, |
70 | unsigned long *pax) | 70 | unsigned long *pax) |
71 | { | 71 | { |
72 | void __user *buf; | 72 | void __user *buf; |
73 | unsigned int tmpflags; | 73 | unsigned int tmpflags; |
74 | unsigned int err = 0; | 74 | unsigned int err = 0; |
75 | 75 | ||
76 | /* Always make any pending restarted system calls return -EINTR */ | 76 | /* Always make any pending restarted system calls return -EINTR */ |
77 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 77 | current_thread_info()->restart_block.fn = do_no_restart_syscall; |
78 | 78 | ||
79 | get_user_try { | 79 | get_user_try { |
80 | 80 | ||
81 | #ifdef CONFIG_X86_32 | 81 | #ifdef CONFIG_X86_32 |
82 | set_user_gs(regs, GET_SEG(gs)); | 82 | set_user_gs(regs, GET_SEG(gs)); |
83 | COPY_SEG(fs); | 83 | COPY_SEG(fs); |
84 | COPY_SEG(es); | 84 | COPY_SEG(es); |
85 | COPY_SEG(ds); | 85 | COPY_SEG(ds); |
86 | #endif /* CONFIG_X86_32 */ | 86 | #endif /* CONFIG_X86_32 */ |
87 | 87 | ||
88 | COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx); | 88 | COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx); |
89 | COPY(dx); COPY(cx); COPY(ip); | 89 | COPY(dx); COPY(cx); COPY(ip); |
90 | 90 | ||
91 | #ifdef CONFIG_X86_64 | 91 | #ifdef CONFIG_X86_64 |
92 | COPY(r8); | 92 | COPY(r8); |
93 | COPY(r9); | 93 | COPY(r9); |
94 | COPY(r10); | 94 | COPY(r10); |
95 | COPY(r11); | 95 | COPY(r11); |
96 | COPY(r12); | 96 | COPY(r12); |
97 | COPY(r13); | 97 | COPY(r13); |
98 | COPY(r14); | 98 | COPY(r14); |
99 | COPY(r15); | 99 | COPY(r15); |
100 | #endif /* CONFIG_X86_64 */ | 100 | #endif /* CONFIG_X86_64 */ |
101 | 101 | ||
102 | #ifdef CONFIG_X86_32 | 102 | #ifdef CONFIG_X86_32 |
103 | COPY_SEG_CPL3(cs); | 103 | COPY_SEG_CPL3(cs); |
104 | COPY_SEG_CPL3(ss); | 104 | COPY_SEG_CPL3(ss); |
105 | #else /* !CONFIG_X86_32 */ | 105 | #else /* !CONFIG_X86_32 */ |
106 | /* Kernel saves and restores only the CS segment register on signals, | 106 | /* Kernel saves and restores only the CS segment register on signals, |
107 | * which is the bare minimum needed to allow mixed 32/64-bit code. | 107 | * which is the bare minimum needed to allow mixed 32/64-bit code. |
108 | * App's signal handler can save/restore other segments if needed. */ | 108 | * App's signal handler can save/restore other segments if needed. */ |
109 | COPY_SEG_CPL3(cs); | 109 | COPY_SEG_CPL3(cs); |
110 | #endif /* CONFIG_X86_32 */ | 110 | #endif /* CONFIG_X86_32 */ |
111 | 111 | ||
112 | get_user_ex(tmpflags, &sc->flags); | 112 | get_user_ex(tmpflags, &sc->flags); |
113 | regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS); | 113 | regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS); |
114 | regs->orig_ax = -1; /* disable syscall checks */ | 114 | regs->orig_ax = -1; /* disable syscall checks */ |
115 | 115 | ||
116 | get_user_ex(buf, &sc->fpstate); | 116 | get_user_ex(buf, &sc->fpstate); |
117 | err |= restore_i387_xstate(buf); | 117 | err |= restore_i387_xstate(buf); |
118 | 118 | ||
119 | get_user_ex(*pax, &sc->ax); | 119 | get_user_ex(*pax, &sc->ax); |
120 | } get_user_catch(err); | 120 | } get_user_catch(err); |
121 | 121 | ||
122 | return err; | 122 | return err; |
123 | } | 123 | } |
124 | 124 | ||
125 | int setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, | 125 | int setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, |
126 | struct pt_regs *regs, unsigned long mask) | 126 | struct pt_regs *regs, unsigned long mask) |
127 | { | 127 | { |
128 | int err = 0; | 128 | int err = 0; |
129 | 129 | ||
130 | put_user_try { | 130 | put_user_try { |
131 | 131 | ||
132 | #ifdef CONFIG_X86_32 | 132 | #ifdef CONFIG_X86_32 |
133 | put_user_ex(get_user_gs(regs), (unsigned int __user *)&sc->gs); | 133 | put_user_ex(get_user_gs(regs), (unsigned int __user *)&sc->gs); |
134 | put_user_ex(regs->fs, (unsigned int __user *)&sc->fs); | 134 | put_user_ex(regs->fs, (unsigned int __user *)&sc->fs); |
135 | put_user_ex(regs->es, (unsigned int __user *)&sc->es); | 135 | put_user_ex(regs->es, (unsigned int __user *)&sc->es); |
136 | put_user_ex(regs->ds, (unsigned int __user *)&sc->ds); | 136 | put_user_ex(regs->ds, (unsigned int __user *)&sc->ds); |
137 | #endif /* CONFIG_X86_32 */ | 137 | #endif /* CONFIG_X86_32 */ |
138 | 138 | ||
139 | put_user_ex(regs->di, &sc->di); | 139 | put_user_ex(regs->di, &sc->di); |
140 | put_user_ex(regs->si, &sc->si); | 140 | put_user_ex(regs->si, &sc->si); |
141 | put_user_ex(regs->bp, &sc->bp); | 141 | put_user_ex(regs->bp, &sc->bp); |
142 | put_user_ex(regs->sp, &sc->sp); | 142 | put_user_ex(regs->sp, &sc->sp); |
143 | put_user_ex(regs->bx, &sc->bx); | 143 | put_user_ex(regs->bx, &sc->bx); |
144 | put_user_ex(regs->dx, &sc->dx); | 144 | put_user_ex(regs->dx, &sc->dx); |
145 | put_user_ex(regs->cx, &sc->cx); | 145 | put_user_ex(regs->cx, &sc->cx); |
146 | put_user_ex(regs->ax, &sc->ax); | 146 | put_user_ex(regs->ax, &sc->ax); |
147 | #ifdef CONFIG_X86_64 | 147 | #ifdef CONFIG_X86_64 |
148 | put_user_ex(regs->r8, &sc->r8); | 148 | put_user_ex(regs->r8, &sc->r8); |
149 | put_user_ex(regs->r9, &sc->r9); | 149 | put_user_ex(regs->r9, &sc->r9); |
150 | put_user_ex(regs->r10, &sc->r10); | 150 | put_user_ex(regs->r10, &sc->r10); |
151 | put_user_ex(regs->r11, &sc->r11); | 151 | put_user_ex(regs->r11, &sc->r11); |
152 | put_user_ex(regs->r12, &sc->r12); | 152 | put_user_ex(regs->r12, &sc->r12); |
153 | put_user_ex(regs->r13, &sc->r13); | 153 | put_user_ex(regs->r13, &sc->r13); |
154 | put_user_ex(regs->r14, &sc->r14); | 154 | put_user_ex(regs->r14, &sc->r14); |
155 | put_user_ex(regs->r15, &sc->r15); | 155 | put_user_ex(regs->r15, &sc->r15); |
156 | #endif /* CONFIG_X86_64 */ | 156 | #endif /* CONFIG_X86_64 */ |
157 | 157 | ||
158 | put_user_ex(current->thread.trap_nr, &sc->trapno); | 158 | put_user_ex(current->thread.trap_nr, &sc->trapno); |
159 | put_user_ex(current->thread.error_code, &sc->err); | 159 | put_user_ex(current->thread.error_code, &sc->err); |
160 | put_user_ex(regs->ip, &sc->ip); | 160 | put_user_ex(regs->ip, &sc->ip); |
161 | #ifdef CONFIG_X86_32 | 161 | #ifdef CONFIG_X86_32 |
162 | put_user_ex(regs->cs, (unsigned int __user *)&sc->cs); | 162 | put_user_ex(regs->cs, (unsigned int __user *)&sc->cs); |
163 | put_user_ex(regs->flags, &sc->flags); | 163 | put_user_ex(regs->flags, &sc->flags); |
164 | put_user_ex(regs->sp, &sc->sp_at_signal); | 164 | put_user_ex(regs->sp, &sc->sp_at_signal); |
165 | put_user_ex(regs->ss, (unsigned int __user *)&sc->ss); | 165 | put_user_ex(regs->ss, (unsigned int __user *)&sc->ss); |
166 | #else /* !CONFIG_X86_32 */ | 166 | #else /* !CONFIG_X86_32 */ |
167 | put_user_ex(regs->flags, &sc->flags); | 167 | put_user_ex(regs->flags, &sc->flags); |
168 | put_user_ex(regs->cs, &sc->cs); | 168 | put_user_ex(regs->cs, &sc->cs); |
169 | put_user_ex(0, &sc->gs); | 169 | put_user_ex(0, &sc->gs); |
170 | put_user_ex(0, &sc->fs); | 170 | put_user_ex(0, &sc->fs); |
171 | #endif /* CONFIG_X86_32 */ | 171 | #endif /* CONFIG_X86_32 */ |
172 | 172 | ||
173 | put_user_ex(fpstate, &sc->fpstate); | 173 | put_user_ex(fpstate, &sc->fpstate); |
174 | 174 | ||
175 | /* non-iBCS2 extensions.. */ | 175 | /* non-iBCS2 extensions.. */ |
176 | put_user_ex(mask, &sc->oldmask); | 176 | put_user_ex(mask, &sc->oldmask); |
177 | put_user_ex(current->thread.cr2, &sc->cr2); | 177 | put_user_ex(current->thread.cr2, &sc->cr2); |
178 | } put_user_catch(err); | 178 | } put_user_catch(err); |
179 | 179 | ||
180 | return err; | 180 | return err; |
181 | } | 181 | } |
182 | 182 | ||
183 | /* | 183 | /* |
184 | * Set up a signal frame. | 184 | * Set up a signal frame. |
185 | */ | 185 | */ |
186 | 186 | ||
187 | /* | 187 | /* |
188 | * Determine which stack to use.. | 188 | * Determine which stack to use.. |
189 | */ | 189 | */ |
190 | static unsigned long align_sigframe(unsigned long sp) | 190 | static unsigned long align_sigframe(unsigned long sp) |
191 | { | 191 | { |
192 | #ifdef CONFIG_X86_32 | 192 | #ifdef CONFIG_X86_32 |
193 | /* | 193 | /* |
194 | * Align the stack pointer according to the i386 ABI, | 194 | * Align the stack pointer according to the i386 ABI, |
195 | * i.e. so that on function entry ((sp + 4) & 15) == 0. | 195 | * i.e. so that on function entry ((sp + 4) & 15) == 0. |
196 | */ | 196 | */ |
197 | sp = ((sp + 4) & -16ul) - 4; | 197 | sp = ((sp + 4) & -16ul) - 4; |
198 | #else /* !CONFIG_X86_32 */ | 198 | #else /* !CONFIG_X86_32 */ |
199 | sp = round_down(sp, 16) - 8; | 199 | sp = round_down(sp, 16) - 8; |
200 | #endif | 200 | #endif |
201 | return sp; | 201 | return sp; |
202 | } | 202 | } |
203 | 203 | ||
204 | static inline void __user * | 204 | static inline void __user * |
205 | get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size, | 205 | get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size, |
206 | void __user **fpstate) | 206 | void __user **fpstate) |
207 | { | 207 | { |
208 | /* Default to using normal stack */ | 208 | /* Default to using normal stack */ |
209 | unsigned long sp = regs->sp; | 209 | unsigned long sp = regs->sp; |
210 | int onsigstack = on_sig_stack(sp); | 210 | int onsigstack = on_sig_stack(sp); |
211 | 211 | ||
212 | #ifdef CONFIG_X86_64 | 212 | #ifdef CONFIG_X86_64 |
213 | /* redzone */ | 213 | /* redzone */ |
214 | sp -= 128; | 214 | sp -= 128; |
215 | #endif /* CONFIG_X86_64 */ | 215 | #endif /* CONFIG_X86_64 */ |
216 | 216 | ||
217 | if (!onsigstack) { | 217 | if (!onsigstack) { |
218 | /* This is the X/Open sanctioned signal stack switching. */ | 218 | /* This is the X/Open sanctioned signal stack switching. */ |
219 | if (ka->sa.sa_flags & SA_ONSTACK) { | 219 | if (ka->sa.sa_flags & SA_ONSTACK) { |
220 | if (current->sas_ss_size) | 220 | if (current->sas_ss_size) |
221 | sp = current->sas_ss_sp + current->sas_ss_size; | 221 | sp = current->sas_ss_sp + current->sas_ss_size; |
222 | } else { | 222 | } else { |
223 | #ifdef CONFIG_X86_32 | 223 | #ifdef CONFIG_X86_32 |
224 | /* This is the legacy signal stack switching. */ | 224 | /* This is the legacy signal stack switching. */ |
225 | if ((regs->ss & 0xffff) != __USER_DS && | 225 | if ((regs->ss & 0xffff) != __USER_DS && |
226 | !(ka->sa.sa_flags & SA_RESTORER) && | 226 | !(ka->sa.sa_flags & SA_RESTORER) && |
227 | ka->sa.sa_restorer) | 227 | ka->sa.sa_restorer) |
228 | sp = (unsigned long) ka->sa.sa_restorer; | 228 | sp = (unsigned long) ka->sa.sa_restorer; |
229 | #endif /* CONFIG_X86_32 */ | 229 | #endif /* CONFIG_X86_32 */ |
230 | } | 230 | } |
231 | } | 231 | } |
232 | 232 | ||
233 | if (used_math()) { | 233 | if (used_math()) { |
234 | sp -= sig_xstate_size; | 234 | sp -= sig_xstate_size; |
235 | #ifdef CONFIG_X86_64 | 235 | #ifdef CONFIG_X86_64 |
236 | sp = round_down(sp, 64); | 236 | sp = round_down(sp, 64); |
237 | #endif /* CONFIG_X86_64 */ | 237 | #endif /* CONFIG_X86_64 */ |
238 | *fpstate = (void __user *)sp; | 238 | *fpstate = (void __user *)sp; |
239 | } | 239 | } |
240 | 240 | ||
241 | sp = align_sigframe(sp - frame_size); | 241 | sp = align_sigframe(sp - frame_size); |
242 | 242 | ||
243 | /* | 243 | /* |
244 | * If we are on the alternate signal stack and would overflow it, don't. | 244 | * If we are on the alternate signal stack and would overflow it, don't. |
245 | * Return an always-bogus address instead so we will die with SIGSEGV. | 245 | * Return an always-bogus address instead so we will die with SIGSEGV. |
246 | */ | 246 | */ |
247 | if (onsigstack && !likely(on_sig_stack(sp))) | 247 | if (onsigstack && !likely(on_sig_stack(sp))) |
248 | return (void __user *)-1L; | 248 | return (void __user *)-1L; |
249 | 249 | ||
250 | /* save i387 state */ | 250 | /* save i387 state */ |
251 | if (used_math() && save_i387_xstate(*fpstate) < 0) | 251 | if (used_math() && save_i387_xstate(*fpstate) < 0) |
252 | return (void __user *)-1L; | 252 | return (void __user *)-1L; |
253 | 253 | ||
254 | return (void __user *)sp; | 254 | return (void __user *)sp; |
255 | } | 255 | } |
256 | 256 | ||
257 | #ifdef CONFIG_X86_32 | 257 | #ifdef CONFIG_X86_32 |
258 | static const struct { | 258 | static const struct { |
259 | u16 poplmovl; | 259 | u16 poplmovl; |
260 | u32 val; | 260 | u32 val; |
261 | u16 int80; | 261 | u16 int80; |
262 | } __attribute__((packed)) retcode = { | 262 | } __attribute__((packed)) retcode = { |
263 | 0xb858, /* popl %eax; movl $..., %eax */ | 263 | 0xb858, /* popl %eax; movl $..., %eax */ |
264 | __NR_sigreturn, | 264 | __NR_sigreturn, |
265 | 0x80cd, /* int $0x80 */ | 265 | 0x80cd, /* int $0x80 */ |
266 | }; | 266 | }; |
267 | 267 | ||
268 | static const struct { | 268 | static const struct { |
269 | u8 movl; | 269 | u8 movl; |
270 | u32 val; | 270 | u32 val; |
271 | u16 int80; | 271 | u16 int80; |
272 | u8 pad; | 272 | u8 pad; |
273 | } __attribute__((packed)) rt_retcode = { | 273 | } __attribute__((packed)) rt_retcode = { |
274 | 0xb8, /* movl $..., %eax */ | 274 | 0xb8, /* movl $..., %eax */ |
275 | __NR_rt_sigreturn, | 275 | __NR_rt_sigreturn, |
276 | 0x80cd, /* int $0x80 */ | 276 | 0x80cd, /* int $0x80 */ |
277 | 0 | 277 | 0 |
278 | }; | 278 | }; |
279 | 279 | ||
280 | static int | 280 | static int |
281 | __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | 281 | __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, |
282 | struct pt_regs *regs) | 282 | struct pt_regs *regs) |
283 | { | 283 | { |
284 | struct sigframe __user *frame; | 284 | struct sigframe __user *frame; |
285 | void __user *restorer; | 285 | void __user *restorer; |
286 | int err = 0; | 286 | int err = 0; |
287 | void __user *fpstate = NULL; | 287 | void __user *fpstate = NULL; |
288 | 288 | ||
289 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); | 289 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); |
290 | 290 | ||
291 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 291 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
292 | return -EFAULT; | 292 | return -EFAULT; |
293 | 293 | ||
294 | if (__put_user(sig, &frame->sig)) | 294 | if (__put_user(sig, &frame->sig)) |
295 | return -EFAULT; | 295 | return -EFAULT; |
296 | 296 | ||
297 | if (setup_sigcontext(&frame->sc, fpstate, regs, set->sig[0])) | 297 | if (setup_sigcontext(&frame->sc, fpstate, regs, set->sig[0])) |
298 | return -EFAULT; | 298 | return -EFAULT; |
299 | 299 | ||
300 | if (_NSIG_WORDS > 1) { | 300 | if (_NSIG_WORDS > 1) { |
301 | if (__copy_to_user(&frame->extramask, &set->sig[1], | 301 | if (__copy_to_user(&frame->extramask, &set->sig[1], |
302 | sizeof(frame->extramask))) | 302 | sizeof(frame->extramask))) |
303 | return -EFAULT; | 303 | return -EFAULT; |
304 | } | 304 | } |
305 | 305 | ||
306 | if (current->mm->context.vdso) | 306 | if (current->mm->context.vdso) |
307 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, sigreturn); | 307 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, sigreturn); |
308 | else | 308 | else |
309 | restorer = &frame->retcode; | 309 | restorer = &frame->retcode; |
310 | if (ka->sa.sa_flags & SA_RESTORER) | 310 | if (ka->sa.sa_flags & SA_RESTORER) |
311 | restorer = ka->sa.sa_restorer; | 311 | restorer = ka->sa.sa_restorer; |
312 | 312 | ||
313 | /* Set up to return from userspace. */ | 313 | /* Set up to return from userspace. */ |
314 | err |= __put_user(restorer, &frame->pretcode); | 314 | err |= __put_user(restorer, &frame->pretcode); |
315 | 315 | ||
316 | /* | 316 | /* |
317 | * This is popl %eax ; movl $__NR_sigreturn, %eax ; int $0x80 | 317 | * This is popl %eax ; movl $__NR_sigreturn, %eax ; int $0x80 |
318 | * | 318 | * |
319 | * WE DO NOT USE IT ANY MORE! It's only left here for historical | 319 | * WE DO NOT USE IT ANY MORE! It's only left here for historical |
320 | * reasons and because gdb uses it as a signature to notice | 320 | * reasons and because gdb uses it as a signature to notice |
321 | * signal handler stack frames. | 321 | * signal handler stack frames. |
322 | */ | 322 | */ |
323 | err |= __put_user(*((u64 *)&retcode), (u64 *)frame->retcode); | 323 | err |= __put_user(*((u64 *)&retcode), (u64 *)frame->retcode); |
324 | 324 | ||
325 | if (err) | 325 | if (err) |
326 | return -EFAULT; | 326 | return -EFAULT; |
327 | 327 | ||
328 | /* Set up registers for signal handler */ | 328 | /* Set up registers for signal handler */ |
329 | regs->sp = (unsigned long)frame; | 329 | regs->sp = (unsigned long)frame; |
330 | regs->ip = (unsigned long)ka->sa.sa_handler; | 330 | regs->ip = (unsigned long)ka->sa.sa_handler; |
331 | regs->ax = (unsigned long)sig; | 331 | regs->ax = (unsigned long)sig; |
332 | regs->dx = 0; | 332 | regs->dx = 0; |
333 | regs->cx = 0; | 333 | regs->cx = 0; |
334 | 334 | ||
335 | regs->ds = __USER_DS; | 335 | regs->ds = __USER_DS; |
336 | regs->es = __USER_DS; | 336 | regs->es = __USER_DS; |
337 | regs->ss = __USER_DS; | 337 | regs->ss = __USER_DS; |
338 | regs->cs = __USER_CS; | 338 | regs->cs = __USER_CS; |
339 | 339 | ||
340 | return 0; | 340 | return 0; |
341 | } | 341 | } |
342 | 342 | ||
343 | static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 343 | static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, |
344 | sigset_t *set, struct pt_regs *regs) | 344 | sigset_t *set, struct pt_regs *regs) |
345 | { | 345 | { |
346 | struct rt_sigframe __user *frame; | 346 | struct rt_sigframe __user *frame; |
347 | void __user *restorer; | 347 | void __user *restorer; |
348 | int err = 0; | 348 | int err = 0; |
349 | void __user *fpstate = NULL; | 349 | void __user *fpstate = NULL; |
350 | 350 | ||
351 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); | 351 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); |
352 | 352 | ||
353 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 353 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
354 | return -EFAULT; | 354 | return -EFAULT; |
355 | 355 | ||
356 | put_user_try { | 356 | put_user_try { |
357 | put_user_ex(sig, &frame->sig); | 357 | put_user_ex(sig, &frame->sig); |
358 | put_user_ex(&frame->info, &frame->pinfo); | 358 | put_user_ex(&frame->info, &frame->pinfo); |
359 | put_user_ex(&frame->uc, &frame->puc); | 359 | put_user_ex(&frame->uc, &frame->puc); |
360 | err |= copy_siginfo_to_user(&frame->info, info); | 360 | err |= copy_siginfo_to_user(&frame->info, info); |
361 | 361 | ||
362 | /* Create the ucontext. */ | 362 | /* Create the ucontext. */ |
363 | if (cpu_has_xsave) | 363 | if (cpu_has_xsave) |
364 | put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags); | 364 | put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags); |
365 | else | 365 | else |
366 | put_user_ex(0, &frame->uc.uc_flags); | 366 | put_user_ex(0, &frame->uc.uc_flags); |
367 | put_user_ex(0, &frame->uc.uc_link); | 367 | put_user_ex(0, &frame->uc.uc_link); |
368 | put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 368 | put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); |
369 | put_user_ex(sas_ss_flags(regs->sp), | 369 | put_user_ex(sas_ss_flags(regs->sp), |
370 | &frame->uc.uc_stack.ss_flags); | 370 | &frame->uc.uc_stack.ss_flags); |
371 | put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | 371 | put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size); |
372 | err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate, | 372 | err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate, |
373 | regs, set->sig[0]); | 373 | regs, set->sig[0]); |
374 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 374 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
375 | 375 | ||
376 | /* Set up to return from userspace. */ | 376 | /* Set up to return from userspace. */ |
377 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn); | 377 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn); |
378 | if (ka->sa.sa_flags & SA_RESTORER) | 378 | if (ka->sa.sa_flags & SA_RESTORER) |
379 | restorer = ka->sa.sa_restorer; | 379 | restorer = ka->sa.sa_restorer; |
380 | put_user_ex(restorer, &frame->pretcode); | 380 | put_user_ex(restorer, &frame->pretcode); |
381 | 381 | ||
382 | /* | 382 | /* |
383 | * This is movl $__NR_rt_sigreturn, %ax ; int $0x80 | 383 | * This is movl $__NR_rt_sigreturn, %ax ; int $0x80 |
384 | * | 384 | * |
385 | * WE DO NOT USE IT ANY MORE! It's only left here for historical | 385 | * WE DO NOT USE IT ANY MORE! It's only left here for historical |
386 | * reasons and because gdb uses it as a signature to notice | 386 | * reasons and because gdb uses it as a signature to notice |
387 | * signal handler stack frames. | 387 | * signal handler stack frames. |
388 | */ | 388 | */ |
389 | put_user_ex(*((u64 *)&rt_retcode), (u64 *)frame->retcode); | 389 | put_user_ex(*((u64 *)&rt_retcode), (u64 *)frame->retcode); |
390 | } put_user_catch(err); | 390 | } put_user_catch(err); |
391 | 391 | ||
392 | if (err) | 392 | if (err) |
393 | return -EFAULT; | 393 | return -EFAULT; |
394 | 394 | ||
395 | /* Set up registers for signal handler */ | 395 | /* Set up registers for signal handler */ |
396 | regs->sp = (unsigned long)frame; | 396 | regs->sp = (unsigned long)frame; |
397 | regs->ip = (unsigned long)ka->sa.sa_handler; | 397 | regs->ip = (unsigned long)ka->sa.sa_handler; |
398 | regs->ax = (unsigned long)sig; | 398 | regs->ax = (unsigned long)sig; |
399 | regs->dx = (unsigned long)&frame->info; | 399 | regs->dx = (unsigned long)&frame->info; |
400 | regs->cx = (unsigned long)&frame->uc; | 400 | regs->cx = (unsigned long)&frame->uc; |
401 | 401 | ||
402 | regs->ds = __USER_DS; | 402 | regs->ds = __USER_DS; |
403 | regs->es = __USER_DS; | 403 | regs->es = __USER_DS; |
404 | regs->ss = __USER_DS; | 404 | regs->ss = __USER_DS; |
405 | regs->cs = __USER_CS; | 405 | regs->cs = __USER_CS; |
406 | 406 | ||
407 | return 0; | 407 | return 0; |
408 | } | 408 | } |
409 | #else /* !CONFIG_X86_32 */ | 409 | #else /* !CONFIG_X86_32 */ |
410 | static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 410 | static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, |
411 | sigset_t *set, struct pt_regs *regs) | 411 | sigset_t *set, struct pt_regs *regs) |
412 | { | 412 | { |
413 | struct rt_sigframe __user *frame; | 413 | struct rt_sigframe __user *frame; |
414 | void __user *fp = NULL; | 414 | void __user *fp = NULL; |
415 | int err = 0; | 415 | int err = 0; |
416 | struct task_struct *me = current; | 416 | struct task_struct *me = current; |
417 | 417 | ||
418 | frame = get_sigframe(ka, regs, sizeof(struct rt_sigframe), &fp); | 418 | frame = get_sigframe(ka, regs, sizeof(struct rt_sigframe), &fp); |
419 | 419 | ||
420 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 420 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
421 | return -EFAULT; | 421 | return -EFAULT; |
422 | 422 | ||
423 | if (ka->sa.sa_flags & SA_SIGINFO) { | 423 | if (ka->sa.sa_flags & SA_SIGINFO) { |
424 | if (copy_siginfo_to_user(&frame->info, info)) | 424 | if (copy_siginfo_to_user(&frame->info, info)) |
425 | return -EFAULT; | 425 | return -EFAULT; |
426 | } | 426 | } |
427 | 427 | ||
428 | put_user_try { | 428 | put_user_try { |
429 | /* Create the ucontext. */ | 429 | /* Create the ucontext. */ |
430 | if (cpu_has_xsave) | 430 | if (cpu_has_xsave) |
431 | put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags); | 431 | put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags); |
432 | else | 432 | else |
433 | put_user_ex(0, &frame->uc.uc_flags); | 433 | put_user_ex(0, &frame->uc.uc_flags); |
434 | put_user_ex(0, &frame->uc.uc_link); | 434 | put_user_ex(0, &frame->uc.uc_link); |
435 | put_user_ex(me->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 435 | put_user_ex(me->sas_ss_sp, &frame->uc.uc_stack.ss_sp); |
436 | put_user_ex(sas_ss_flags(regs->sp), | 436 | put_user_ex(sas_ss_flags(regs->sp), |
437 | &frame->uc.uc_stack.ss_flags); | 437 | &frame->uc.uc_stack.ss_flags); |
438 | put_user_ex(me->sas_ss_size, &frame->uc.uc_stack.ss_size); | 438 | put_user_ex(me->sas_ss_size, &frame->uc.uc_stack.ss_size); |
439 | err |= setup_sigcontext(&frame->uc.uc_mcontext, fp, regs, set->sig[0]); | 439 | err |= setup_sigcontext(&frame->uc.uc_mcontext, fp, regs, set->sig[0]); |
440 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 440 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
441 | 441 | ||
442 | /* Set up to return from userspace. If provided, use a stub | 442 | /* Set up to return from userspace. If provided, use a stub |
443 | already in userspace. */ | 443 | already in userspace. */ |
444 | /* x86-64 should always use SA_RESTORER. */ | 444 | /* x86-64 should always use SA_RESTORER. */ |
445 | if (ka->sa.sa_flags & SA_RESTORER) { | 445 | if (ka->sa.sa_flags & SA_RESTORER) { |
446 | put_user_ex(ka->sa.sa_restorer, &frame->pretcode); | 446 | put_user_ex(ka->sa.sa_restorer, &frame->pretcode); |
447 | } else { | 447 | } else { |
448 | /* could use a vstub here */ | 448 | /* could use a vstub here */ |
449 | err |= -EFAULT; | 449 | err |= -EFAULT; |
450 | } | 450 | } |
451 | } put_user_catch(err); | 451 | } put_user_catch(err); |
452 | 452 | ||
453 | if (err) | 453 | if (err) |
454 | return -EFAULT; | 454 | return -EFAULT; |
455 | 455 | ||
456 | /* Set up registers for signal handler */ | 456 | /* Set up registers for signal handler */ |
457 | regs->di = sig; | 457 | regs->di = sig; |
458 | /* In case the signal handler was declared without prototypes */ | 458 | /* In case the signal handler was declared without prototypes */ |
459 | regs->ax = 0; | 459 | regs->ax = 0; |
460 | 460 | ||
461 | /* This also works for non SA_SIGINFO handlers because they expect the | 461 | /* This also works for non SA_SIGINFO handlers because they expect the |
462 | next argument after the signal number on the stack. */ | 462 | next argument after the signal number on the stack. */ |
463 | regs->si = (unsigned long)&frame->info; | 463 | regs->si = (unsigned long)&frame->info; |
464 | regs->dx = (unsigned long)&frame->uc; | 464 | regs->dx = (unsigned long)&frame->uc; |
465 | regs->ip = (unsigned long) ka->sa.sa_handler; | 465 | regs->ip = (unsigned long) ka->sa.sa_handler; |
466 | 466 | ||
467 | regs->sp = (unsigned long)frame; | 467 | regs->sp = (unsigned long)frame; |
468 | 468 | ||
469 | /* Set up the CS register to run signal handlers in 64-bit mode, | 469 | /* Set up the CS register to run signal handlers in 64-bit mode, |
470 | even if the handler happens to be interrupting 32-bit code. */ | 470 | even if the handler happens to be interrupting 32-bit code. */ |
471 | regs->cs = __USER_CS; | 471 | regs->cs = __USER_CS; |
472 | 472 | ||
473 | return 0; | 473 | return 0; |
474 | } | 474 | } |
475 | #endif /* CONFIG_X86_32 */ | 475 | #endif /* CONFIG_X86_32 */ |
476 | 476 | ||
477 | #ifdef CONFIG_X86_32 | 477 | #ifdef CONFIG_X86_32 |
478 | /* | 478 | /* |
479 | * Atomically swap in the new signal mask, and wait for a signal. | 479 | * Atomically swap in the new signal mask, and wait for a signal. |
480 | */ | 480 | */ |
481 | asmlinkage int | 481 | asmlinkage int |
482 | sys_sigsuspend(int history0, int history1, old_sigset_t mask) | 482 | sys_sigsuspend(int history0, int history1, old_sigset_t mask) |
483 | { | 483 | { |
484 | sigset_t blocked; | 484 | sigset_t blocked; |
485 | siginitset(&blocked, mask); | 485 | siginitset(&blocked, mask); |
486 | return sigsuspend(&blocked); | 486 | return sigsuspend(&blocked); |
487 | } | 487 | } |
488 | 488 | ||
489 | asmlinkage int | 489 | asmlinkage int |
490 | sys_sigaction(int sig, const struct old_sigaction __user *act, | 490 | sys_sigaction(int sig, const struct old_sigaction __user *act, |
491 | struct old_sigaction __user *oact) | 491 | struct old_sigaction __user *oact) |
492 | { | 492 | { |
493 | struct k_sigaction new_ka, old_ka; | 493 | struct k_sigaction new_ka, old_ka; |
494 | int ret = 0; | 494 | int ret = 0; |
495 | 495 | ||
496 | if (act) { | 496 | if (act) { |
497 | old_sigset_t mask; | 497 | old_sigset_t mask; |
498 | 498 | ||
499 | if (!access_ok(VERIFY_READ, act, sizeof(*act))) | 499 | if (!access_ok(VERIFY_READ, act, sizeof(*act))) |
500 | return -EFAULT; | 500 | return -EFAULT; |
501 | 501 | ||
502 | get_user_try { | 502 | get_user_try { |
503 | get_user_ex(new_ka.sa.sa_handler, &act->sa_handler); | 503 | get_user_ex(new_ka.sa.sa_handler, &act->sa_handler); |
504 | get_user_ex(new_ka.sa.sa_flags, &act->sa_flags); | 504 | get_user_ex(new_ka.sa.sa_flags, &act->sa_flags); |
505 | get_user_ex(mask, &act->sa_mask); | 505 | get_user_ex(mask, &act->sa_mask); |
506 | get_user_ex(new_ka.sa.sa_restorer, &act->sa_restorer); | 506 | get_user_ex(new_ka.sa.sa_restorer, &act->sa_restorer); |
507 | } get_user_catch(ret); | 507 | } get_user_catch(ret); |
508 | 508 | ||
509 | if (ret) | 509 | if (ret) |
510 | return -EFAULT; | 510 | return -EFAULT; |
511 | siginitset(&new_ka.sa.sa_mask, mask); | 511 | siginitset(&new_ka.sa.sa_mask, mask); |
512 | } | 512 | } |
513 | 513 | ||
514 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | 514 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); |
515 | 515 | ||
516 | if (!ret && oact) { | 516 | if (!ret && oact) { |
517 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact))) | 517 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact))) |
518 | return -EFAULT; | 518 | return -EFAULT; |
519 | 519 | ||
520 | put_user_try { | 520 | put_user_try { |
521 | put_user_ex(old_ka.sa.sa_handler, &oact->sa_handler); | 521 | put_user_ex(old_ka.sa.sa_handler, &oact->sa_handler); |
522 | put_user_ex(old_ka.sa.sa_flags, &oact->sa_flags); | 522 | put_user_ex(old_ka.sa.sa_flags, &oact->sa_flags); |
523 | put_user_ex(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | 523 | put_user_ex(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); |
524 | put_user_ex(old_ka.sa.sa_restorer, &oact->sa_restorer); | 524 | put_user_ex(old_ka.sa.sa_restorer, &oact->sa_restorer); |
525 | } put_user_catch(ret); | 525 | } put_user_catch(ret); |
526 | 526 | ||
527 | if (ret) | 527 | if (ret) |
528 | return -EFAULT; | 528 | return -EFAULT; |
529 | } | 529 | } |
530 | 530 | ||
531 | return ret; | 531 | return ret; |
532 | } | 532 | } |
533 | #endif /* CONFIG_X86_32 */ | 533 | #endif /* CONFIG_X86_32 */ |
534 | 534 | ||
535 | long | 535 | long |
536 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | 536 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, |
537 | struct pt_regs *regs) | 537 | struct pt_regs *regs) |
538 | { | 538 | { |
539 | return do_sigaltstack(uss, uoss, regs->sp); | 539 | return do_sigaltstack(uss, uoss, regs->sp); |
540 | } | 540 | } |
541 | 541 | ||
542 | /* | 542 | /* |
543 | * Do a signal return; undo the signal stack. | 543 | * Do a signal return; undo the signal stack. |
544 | */ | 544 | */ |
545 | #ifdef CONFIG_X86_32 | 545 | #ifdef CONFIG_X86_32 |
546 | unsigned long sys_sigreturn(struct pt_regs *regs) | 546 | unsigned long sys_sigreturn(struct pt_regs *regs) |
547 | { | 547 | { |
548 | struct sigframe __user *frame; | 548 | struct sigframe __user *frame; |
549 | unsigned long ax; | 549 | unsigned long ax; |
550 | sigset_t set; | 550 | sigset_t set; |
551 | 551 | ||
552 | frame = (struct sigframe __user *)(regs->sp - 8); | 552 | frame = (struct sigframe __user *)(regs->sp - 8); |
553 | 553 | ||
554 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 554 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
555 | goto badframe; | 555 | goto badframe; |
556 | if (__get_user(set.sig[0], &frame->sc.oldmask) || (_NSIG_WORDS > 1 | 556 | if (__get_user(set.sig[0], &frame->sc.oldmask) || (_NSIG_WORDS > 1 |
557 | && __copy_from_user(&set.sig[1], &frame->extramask, | 557 | && __copy_from_user(&set.sig[1], &frame->extramask, |
558 | sizeof(frame->extramask)))) | 558 | sizeof(frame->extramask)))) |
559 | goto badframe; | 559 | goto badframe; |
560 | 560 | ||
561 | set_current_blocked(&set); | 561 | set_current_blocked(&set); |
562 | 562 | ||
563 | if (restore_sigcontext(regs, &frame->sc, &ax)) | 563 | if (restore_sigcontext(regs, &frame->sc, &ax)) |
564 | goto badframe; | 564 | goto badframe; |
565 | return ax; | 565 | return ax; |
566 | 566 | ||
567 | badframe: | 567 | badframe: |
568 | signal_fault(regs, frame, "sigreturn"); | 568 | signal_fault(regs, frame, "sigreturn"); |
569 | 569 | ||
570 | return 0; | 570 | return 0; |
571 | } | 571 | } |
572 | #endif /* CONFIG_X86_32 */ | 572 | #endif /* CONFIG_X86_32 */ |
573 | 573 | ||
574 | long sys_rt_sigreturn(struct pt_regs *regs) | 574 | long sys_rt_sigreturn(struct pt_regs *regs) |
575 | { | 575 | { |
576 | struct rt_sigframe __user *frame; | 576 | struct rt_sigframe __user *frame; |
577 | unsigned long ax; | 577 | unsigned long ax; |
578 | sigset_t set; | 578 | sigset_t set; |
579 | 579 | ||
580 | frame = (struct rt_sigframe __user *)(regs->sp - sizeof(long)); | 580 | frame = (struct rt_sigframe __user *)(regs->sp - sizeof(long)); |
581 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 581 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
582 | goto badframe; | 582 | goto badframe; |
583 | if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) | 583 | if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) |
584 | goto badframe; | 584 | goto badframe; |
585 | 585 | ||
586 | set_current_blocked(&set); | 586 | set_current_blocked(&set); |
587 | 587 | ||
588 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) | 588 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) |
589 | goto badframe; | 589 | goto badframe; |
590 | 590 | ||
591 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT) | 591 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT) |
592 | goto badframe; | 592 | goto badframe; |
593 | 593 | ||
594 | return ax; | 594 | return ax; |
595 | 595 | ||
596 | badframe: | 596 | badframe: |
597 | signal_fault(regs, frame, "rt_sigreturn"); | 597 | signal_fault(regs, frame, "rt_sigreturn"); |
598 | return 0; | 598 | return 0; |
599 | } | 599 | } |
600 | 600 | ||
601 | /* | 601 | /* |
602 | * OK, we're invoking a handler: | 602 | * OK, we're invoking a handler: |
603 | */ | 603 | */ |
604 | static int signr_convert(int sig) | 604 | static int signr_convert(int sig) |
605 | { | 605 | { |
606 | #ifdef CONFIG_X86_32 | 606 | #ifdef CONFIG_X86_32 |
607 | struct thread_info *info = current_thread_info(); | 607 | struct thread_info *info = current_thread_info(); |
608 | 608 | ||
609 | if (info->exec_domain && info->exec_domain->signal_invmap && sig < 32) | 609 | if (info->exec_domain && info->exec_domain->signal_invmap && sig < 32) |
610 | return info->exec_domain->signal_invmap[sig]; | 610 | return info->exec_domain->signal_invmap[sig]; |
611 | #endif /* CONFIG_X86_32 */ | 611 | #endif /* CONFIG_X86_32 */ |
612 | return sig; | 612 | return sig; |
613 | } | 613 | } |
614 | 614 | ||
615 | #ifdef CONFIG_X86_32 | 615 | #ifdef CONFIG_X86_32 |
616 | 616 | ||
617 | #define is_ia32 1 | 617 | #define is_ia32 1 |
618 | #define ia32_setup_frame __setup_frame | 618 | #define ia32_setup_frame __setup_frame |
619 | #define ia32_setup_rt_frame __setup_rt_frame | 619 | #define ia32_setup_rt_frame __setup_rt_frame |
620 | 620 | ||
621 | #else /* !CONFIG_X86_32 */ | 621 | #else /* !CONFIG_X86_32 */ |
622 | 622 | ||
623 | #ifdef CONFIG_IA32_EMULATION | 623 | #ifdef CONFIG_IA32_EMULATION |
624 | #define is_ia32 test_thread_flag(TIF_IA32) | 624 | #define is_ia32 test_thread_flag(TIF_IA32) |
625 | #else /* !CONFIG_IA32_EMULATION */ | 625 | #else /* !CONFIG_IA32_EMULATION */ |
626 | #define is_ia32 0 | 626 | #define is_ia32 0 |
627 | #endif /* CONFIG_IA32_EMULATION */ | 627 | #endif /* CONFIG_IA32_EMULATION */ |
628 | 628 | ||
629 | #ifdef CONFIG_X86_X32_ABI | 629 | #ifdef CONFIG_X86_X32_ABI |
630 | #define is_x32 test_thread_flag(TIF_X32) | 630 | #define is_x32 test_thread_flag(TIF_X32) |
631 | 631 | ||
632 | static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, | 632 | static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, |
633 | siginfo_t *info, compat_sigset_t *set, | 633 | siginfo_t *info, compat_sigset_t *set, |
634 | struct pt_regs *regs); | 634 | struct pt_regs *regs); |
635 | #else /* !CONFIG_X86_X32_ABI */ | 635 | #else /* !CONFIG_X86_X32_ABI */ |
636 | #define is_x32 0 | 636 | #define is_x32 0 |
637 | #endif /* CONFIG_X86_X32_ABI */ | 637 | #endif /* CONFIG_X86_X32_ABI */ |
638 | 638 | ||
639 | int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 639 | int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, |
640 | sigset_t *set, struct pt_regs *regs); | 640 | sigset_t *set, struct pt_regs *regs); |
641 | int ia32_setup_frame(int sig, struct k_sigaction *ka, | 641 | int ia32_setup_frame(int sig, struct k_sigaction *ka, |
642 | sigset_t *set, struct pt_regs *regs); | 642 | sigset_t *set, struct pt_regs *regs); |
643 | 643 | ||
644 | #endif /* CONFIG_X86_32 */ | 644 | #endif /* CONFIG_X86_32 */ |
645 | 645 | ||
646 | static int | 646 | static int |
647 | setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 647 | setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, |
648 | struct pt_regs *regs) | 648 | struct pt_regs *regs) |
649 | { | 649 | { |
650 | int usig = signr_convert(sig); | 650 | int usig = signr_convert(sig); |
651 | sigset_t *set = sigmask_to_save(); | 651 | sigset_t *set = sigmask_to_save(); |
652 | 652 | ||
653 | /* Set up the stack frame */ | 653 | /* Set up the stack frame */ |
654 | if (is_ia32) { | 654 | if (is_ia32) { |
655 | if (ka->sa.sa_flags & SA_SIGINFO) | 655 | if (ka->sa.sa_flags & SA_SIGINFO) |
656 | return ia32_setup_rt_frame(usig, ka, info, set, regs); | 656 | return ia32_setup_rt_frame(usig, ka, info, set, regs); |
657 | else | 657 | else |
658 | return ia32_setup_frame(usig, ka, set, regs); | 658 | return ia32_setup_frame(usig, ka, set, regs); |
659 | #ifdef CONFIG_X86_X32_ABI | 659 | #ifdef CONFIG_X86_X32_ABI |
660 | } else if (is_x32) { | 660 | } else if (is_x32) { |
661 | return x32_setup_rt_frame(usig, ka, info, | 661 | return x32_setup_rt_frame(usig, ka, info, |
662 | (compat_sigset_t *)set, regs); | 662 | (compat_sigset_t *)set, regs); |
663 | #endif | 663 | #endif |
664 | } else { | 664 | } else { |
665 | return __setup_rt_frame(sig, ka, info, set, regs); | 665 | return __setup_rt_frame(sig, ka, info, set, regs); |
666 | } | 666 | } |
667 | } | 667 | } |
668 | 668 | ||
669 | static void | 669 | static void |
670 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | 670 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, |
671 | struct pt_regs *regs) | 671 | struct pt_regs *regs) |
672 | { | 672 | { |
673 | /* Are we from a system call? */ | 673 | /* Are we from a system call? */ |
674 | if (syscall_get_nr(current, regs) >= 0) { | 674 | if (syscall_get_nr(current, regs) >= 0) { |
675 | /* If so, check system call restarting.. */ | 675 | /* If so, check system call restarting.. */ |
676 | switch (syscall_get_error(current, regs)) { | 676 | switch (syscall_get_error(current, regs)) { |
677 | case -ERESTART_RESTARTBLOCK: | 677 | case -ERESTART_RESTARTBLOCK: |
678 | case -ERESTARTNOHAND: | 678 | case -ERESTARTNOHAND: |
679 | regs->ax = -EINTR; | 679 | regs->ax = -EINTR; |
680 | break; | 680 | break; |
681 | 681 | ||
682 | case -ERESTARTSYS: | 682 | case -ERESTARTSYS: |
683 | if (!(ka->sa.sa_flags & SA_RESTART)) { | 683 | if (!(ka->sa.sa_flags & SA_RESTART)) { |
684 | regs->ax = -EINTR; | 684 | regs->ax = -EINTR; |
685 | break; | 685 | break; |
686 | } | 686 | } |
687 | /* fallthrough */ | 687 | /* fallthrough */ |
688 | case -ERESTARTNOINTR: | 688 | case -ERESTARTNOINTR: |
689 | regs->ax = regs->orig_ax; | 689 | regs->ax = regs->orig_ax; |
690 | regs->ip -= 2; | 690 | regs->ip -= 2; |
691 | break; | 691 | break; |
692 | } | 692 | } |
693 | } | 693 | } |
694 | 694 | ||
695 | /* | 695 | /* |
696 | * If TF is set due to a debugger (TIF_FORCED_TF), clear the TF | 696 | * If TF is set due to a debugger (TIF_FORCED_TF), clear the TF |
697 | * flag so that register information in the sigcontext is correct. | 697 | * flag so that register information in the sigcontext is correct. |
698 | */ | 698 | */ |
699 | if (unlikely(regs->flags & X86_EFLAGS_TF) && | 699 | if (unlikely(regs->flags & X86_EFLAGS_TF) && |
700 | likely(test_and_clear_thread_flag(TIF_FORCED_TF))) | 700 | likely(test_and_clear_thread_flag(TIF_FORCED_TF))) |
701 | regs->flags &= ~X86_EFLAGS_TF; | 701 | regs->flags &= ~X86_EFLAGS_TF; |
702 | 702 | ||
703 | if (setup_rt_frame(sig, ka, info, regs) < 0) { | 703 | if (setup_rt_frame(sig, ka, info, regs) < 0) { |
704 | force_sigsegv(sig, current); | 704 | force_sigsegv(sig, current); |
705 | return; | 705 | return; |
706 | } | 706 | } |
707 | 707 | ||
708 | /* | 708 | /* |
709 | * Clear the direction flag as per the ABI for function entry. | 709 | * Clear the direction flag as per the ABI for function entry. |
710 | */ | 710 | */ |
711 | regs->flags &= ~X86_EFLAGS_DF; | 711 | regs->flags &= ~X86_EFLAGS_DF; |
712 | 712 | ||
713 | /* | 713 | /* |
714 | * Clear TF when entering the signal handler, but | 714 | * Clear TF when entering the signal handler, but |
715 | * notify any tracer that was single-stepping it. | 715 | * notify any tracer that was single-stepping it. |
716 | * The tracer may want to single-step inside the | 716 | * The tracer may want to single-step inside the |
717 | * handler too. | 717 | * handler too. |
718 | */ | 718 | */ |
719 | regs->flags &= ~X86_EFLAGS_TF; | 719 | regs->flags &= ~X86_EFLAGS_TF; |
720 | 720 | ||
721 | signal_delivered(sig, info, ka, regs, | 721 | signal_delivered(sig, info, ka, regs, |
722 | test_thread_flag(TIF_SINGLESTEP)); | 722 | test_thread_flag(TIF_SINGLESTEP)); |
723 | } | 723 | } |
724 | 724 | ||
725 | #ifdef CONFIG_X86_32 | 725 | #ifdef CONFIG_X86_32 |
726 | #define NR_restart_syscall __NR_restart_syscall | 726 | #define NR_restart_syscall __NR_restart_syscall |
727 | #else /* !CONFIG_X86_32 */ | 727 | #else /* !CONFIG_X86_32 */ |
728 | #define NR_restart_syscall \ | 728 | #define NR_restart_syscall \ |
729 | test_thread_flag(TIF_IA32) ? __NR_ia32_restart_syscall : __NR_restart_syscall | 729 | test_thread_flag(TIF_IA32) ? __NR_ia32_restart_syscall : __NR_restart_syscall |
730 | #endif /* CONFIG_X86_32 */ | 730 | #endif /* CONFIG_X86_32 */ |
731 | 731 | ||
732 | /* | 732 | /* |
733 | * Note that 'init' is a special process: it doesn't get signals it doesn't | 733 | * Note that 'init' is a special process: it doesn't get signals it doesn't |
734 | * want to handle. Thus you cannot kill init even with a SIGKILL even by | 734 | * want to handle. Thus you cannot kill init even with a SIGKILL even by |
735 | * mistake. | 735 | * mistake. |
736 | */ | 736 | */ |
737 | static void do_signal(struct pt_regs *regs) | 737 | static void do_signal(struct pt_regs *regs) |
738 | { | 738 | { |
739 | struct k_sigaction ka; | 739 | struct k_sigaction ka; |
740 | siginfo_t info; | 740 | siginfo_t info; |
741 | int signr; | 741 | int signr; |
742 | 742 | ||
743 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 743 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
744 | if (signr > 0) { | 744 | if (signr > 0) { |
745 | /* Whee! Actually deliver the signal. */ | 745 | /* Whee! Actually deliver the signal. */ |
746 | handle_signal(signr, &info, &ka, regs); | 746 | handle_signal(signr, &info, &ka, regs); |
747 | return; | 747 | return; |
748 | } | 748 | } |
749 | 749 | ||
750 | /* Did we come from a system call? */ | 750 | /* Did we come from a system call? */ |
751 | if (syscall_get_nr(current, regs) >= 0) { | 751 | if (syscall_get_nr(current, regs) >= 0) { |
752 | /* Restart the system call - no handlers present */ | 752 | /* Restart the system call - no handlers present */ |
753 | switch (syscall_get_error(current, regs)) { | 753 | switch (syscall_get_error(current, regs)) { |
754 | case -ERESTARTNOHAND: | 754 | case -ERESTARTNOHAND: |
755 | case -ERESTARTSYS: | 755 | case -ERESTARTSYS: |
756 | case -ERESTARTNOINTR: | 756 | case -ERESTARTNOINTR: |
757 | regs->ax = regs->orig_ax; | 757 | regs->ax = regs->orig_ax; |
758 | regs->ip -= 2; | 758 | regs->ip -= 2; |
759 | break; | 759 | break; |
760 | 760 | ||
761 | case -ERESTART_RESTARTBLOCK: | 761 | case -ERESTART_RESTARTBLOCK: |
762 | regs->ax = NR_restart_syscall; | 762 | regs->ax = NR_restart_syscall; |
763 | regs->ip -= 2; | 763 | regs->ip -= 2; |
764 | break; | 764 | break; |
765 | } | 765 | } |
766 | } | 766 | } |
767 | 767 | ||
768 | /* | 768 | /* |
769 | * If there's no signal to deliver, we just put the saved sigmask | 769 | * If there's no signal to deliver, we just put the saved sigmask |
770 | * back. | 770 | * back. |
771 | */ | 771 | */ |
772 | restore_saved_sigmask(); | 772 | restore_saved_sigmask(); |
773 | } | 773 | } |
774 | 774 | ||
775 | /* | 775 | /* |
776 | * notification of userspace execution resumption | 776 | * notification of userspace execution resumption |
777 | * - triggered by the TIF_WORK_MASK flags | 777 | * - triggered by the TIF_WORK_MASK flags |
778 | */ | 778 | */ |
779 | void | 779 | void |
780 | do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags) | 780 | do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags) |
781 | { | 781 | { |
782 | #ifdef CONFIG_X86_MCE | 782 | #ifdef CONFIG_X86_MCE |
783 | /* notify userspace of pending MCEs */ | 783 | /* notify userspace of pending MCEs */ |
784 | if (thread_info_flags & _TIF_MCE_NOTIFY) | 784 | if (thread_info_flags & _TIF_MCE_NOTIFY) |
785 | mce_notify_process(); | 785 | mce_notify_process(); |
786 | #endif /* CONFIG_X86_64 && CONFIG_X86_MCE */ | 786 | #endif /* CONFIG_X86_64 && CONFIG_X86_MCE */ |
787 | 787 | ||
788 | if (thread_info_flags & _TIF_UPROBE) { | 788 | if (thread_info_flags & _TIF_UPROBE) |
789 | clear_thread_flag(TIF_UPROBE); | ||
790 | uprobe_notify_resume(regs); | 789 | uprobe_notify_resume(regs); |
791 | } | ||
792 | 790 | ||
793 | /* deal with pending signal delivery */ | 791 | /* deal with pending signal delivery */ |
794 | if (thread_info_flags & _TIF_SIGPENDING) | 792 | if (thread_info_flags & _TIF_SIGPENDING) |
795 | do_signal(regs); | 793 | do_signal(regs); |
796 | 794 | ||
797 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | 795 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { |
798 | clear_thread_flag(TIF_NOTIFY_RESUME); | 796 | clear_thread_flag(TIF_NOTIFY_RESUME); |
799 | tracehook_notify_resume(regs); | 797 | tracehook_notify_resume(regs); |
800 | } | 798 | } |
801 | if (thread_info_flags & _TIF_USER_RETURN_NOTIFY) | 799 | if (thread_info_flags & _TIF_USER_RETURN_NOTIFY) |
802 | fire_user_return_notifiers(); | 800 | fire_user_return_notifiers(); |
803 | 801 | ||
804 | #ifdef CONFIG_X86_32 | 802 | #ifdef CONFIG_X86_32 |
805 | clear_thread_flag(TIF_IRET); | 803 | clear_thread_flag(TIF_IRET); |
806 | #endif /* CONFIG_X86_32 */ | 804 | #endif /* CONFIG_X86_32 */ |
807 | } | 805 | } |
808 | 806 | ||
809 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where) | 807 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where) |
810 | { | 808 | { |
811 | struct task_struct *me = current; | 809 | struct task_struct *me = current; |
812 | 810 | ||
813 | if (show_unhandled_signals && printk_ratelimit()) { | 811 | if (show_unhandled_signals && printk_ratelimit()) { |
814 | printk("%s" | 812 | printk("%s" |
815 | "%s[%d] bad frame in %s frame:%p ip:%lx sp:%lx orax:%lx", | 813 | "%s[%d] bad frame in %s frame:%p ip:%lx sp:%lx orax:%lx", |
816 | task_pid_nr(current) > 1 ? KERN_INFO : KERN_EMERG, | 814 | task_pid_nr(current) > 1 ? KERN_INFO : KERN_EMERG, |
817 | me->comm, me->pid, where, frame, | 815 | me->comm, me->pid, where, frame, |
818 | regs->ip, regs->sp, regs->orig_ax); | 816 | regs->ip, regs->sp, regs->orig_ax); |
819 | print_vma_addr(" in ", regs->ip); | 817 | print_vma_addr(" in ", regs->ip); |
820 | pr_cont("\n"); | 818 | pr_cont("\n"); |
821 | } | 819 | } |
822 | 820 | ||
823 | force_sig(SIGSEGV, me); | 821 | force_sig(SIGSEGV, me); |
824 | } | 822 | } |
825 | 823 | ||
826 | #ifdef CONFIG_X86_X32_ABI | 824 | #ifdef CONFIG_X86_X32_ABI |
827 | static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, | 825 | static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, |
828 | siginfo_t *info, compat_sigset_t *set, | 826 | siginfo_t *info, compat_sigset_t *set, |
829 | struct pt_regs *regs) | 827 | struct pt_regs *regs) |
830 | { | 828 | { |
831 | struct rt_sigframe_x32 __user *frame; | 829 | struct rt_sigframe_x32 __user *frame; |
832 | void __user *restorer; | 830 | void __user *restorer; |
833 | int err = 0; | 831 | int err = 0; |
834 | void __user *fpstate = NULL; | 832 | void __user *fpstate = NULL; |
835 | 833 | ||
836 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); | 834 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); |
837 | 835 | ||
838 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 836 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
839 | return -EFAULT; | 837 | return -EFAULT; |
840 | 838 | ||
841 | if (ka->sa.sa_flags & SA_SIGINFO) { | 839 | if (ka->sa.sa_flags & SA_SIGINFO) { |
842 | if (copy_siginfo_to_user32(&frame->info, info)) | 840 | if (copy_siginfo_to_user32(&frame->info, info)) |
843 | return -EFAULT; | 841 | return -EFAULT; |
844 | } | 842 | } |
845 | 843 | ||
846 | put_user_try { | 844 | put_user_try { |
847 | /* Create the ucontext. */ | 845 | /* Create the ucontext. */ |
848 | if (cpu_has_xsave) | 846 | if (cpu_has_xsave) |
849 | put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags); | 847 | put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags); |
850 | else | 848 | else |
851 | put_user_ex(0, &frame->uc.uc_flags); | 849 | put_user_ex(0, &frame->uc.uc_flags); |
852 | put_user_ex(0, &frame->uc.uc_link); | 850 | put_user_ex(0, &frame->uc.uc_link); |
853 | put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 851 | put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); |
854 | put_user_ex(sas_ss_flags(regs->sp), | 852 | put_user_ex(sas_ss_flags(regs->sp), |
855 | &frame->uc.uc_stack.ss_flags); | 853 | &frame->uc.uc_stack.ss_flags); |
856 | put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | 854 | put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size); |
857 | put_user_ex(0, &frame->uc.uc__pad0); | 855 | put_user_ex(0, &frame->uc.uc__pad0); |
858 | err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate, | 856 | err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate, |
859 | regs, set->sig[0]); | 857 | regs, set->sig[0]); |
860 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 858 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
861 | 859 | ||
862 | if (ka->sa.sa_flags & SA_RESTORER) { | 860 | if (ka->sa.sa_flags & SA_RESTORER) { |
863 | restorer = ka->sa.sa_restorer; | 861 | restorer = ka->sa.sa_restorer; |
864 | } else { | 862 | } else { |
865 | /* could use a vstub here */ | 863 | /* could use a vstub here */ |
866 | restorer = NULL; | 864 | restorer = NULL; |
867 | err |= -EFAULT; | 865 | err |= -EFAULT; |
868 | } | 866 | } |
869 | put_user_ex(restorer, &frame->pretcode); | 867 | put_user_ex(restorer, &frame->pretcode); |
870 | } put_user_catch(err); | 868 | } put_user_catch(err); |
871 | 869 | ||
872 | if (err) | 870 | if (err) |
873 | return -EFAULT; | 871 | return -EFAULT; |
874 | 872 | ||
875 | /* Set up registers for signal handler */ | 873 | /* Set up registers for signal handler */ |
876 | regs->sp = (unsigned long) frame; | 874 | regs->sp = (unsigned long) frame; |
877 | regs->ip = (unsigned long) ka->sa.sa_handler; | 875 | regs->ip = (unsigned long) ka->sa.sa_handler; |
878 | 876 | ||
879 | /* We use the x32 calling convention here... */ | 877 | /* We use the x32 calling convention here... */ |
880 | regs->di = sig; | 878 | regs->di = sig; |
881 | regs->si = (unsigned long) &frame->info; | 879 | regs->si = (unsigned long) &frame->info; |
882 | regs->dx = (unsigned long) &frame->uc; | 880 | regs->dx = (unsigned long) &frame->uc; |
883 | 881 | ||
884 | loadsegment(ds, __USER_DS); | 882 | loadsegment(ds, __USER_DS); |
885 | loadsegment(es, __USER_DS); | 883 | loadsegment(es, __USER_DS); |
886 | 884 | ||
887 | regs->cs = __USER_CS; | 885 | regs->cs = __USER_CS; |
888 | regs->ss = __USER_DS; | 886 | regs->ss = __USER_DS; |
889 | 887 | ||
890 | return 0; | 888 | return 0; |
891 | } | 889 | } |
892 | 890 | ||
893 | asmlinkage long sys32_x32_rt_sigreturn(struct pt_regs *regs) | 891 | asmlinkage long sys32_x32_rt_sigreturn(struct pt_regs *regs) |
894 | { | 892 | { |
895 | struct rt_sigframe_x32 __user *frame; | 893 | struct rt_sigframe_x32 __user *frame; |
896 | sigset_t set; | 894 | sigset_t set; |
897 | unsigned long ax; | 895 | unsigned long ax; |
898 | struct pt_regs tregs; | 896 | struct pt_regs tregs; |
899 | 897 | ||
900 | frame = (struct rt_sigframe_x32 __user *)(regs->sp - 8); | 898 | frame = (struct rt_sigframe_x32 __user *)(regs->sp - 8); |
901 | 899 | ||
902 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 900 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
903 | goto badframe; | 901 | goto badframe; |
904 | if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) | 902 | if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) |
905 | goto badframe; | 903 | goto badframe; |
906 | 904 | ||
907 | set_current_blocked(&set); | 905 | set_current_blocked(&set); |
908 | 906 | ||
909 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) | 907 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) |
910 | goto badframe; | 908 | goto badframe; |
911 | 909 | ||
912 | tregs = *regs; | 910 | tregs = *regs; |
913 | if (sys32_sigaltstack(&frame->uc.uc_stack, NULL, &tregs) == -EFAULT) | 911 | if (sys32_sigaltstack(&frame->uc.uc_stack, NULL, &tregs) == -EFAULT) |
914 | goto badframe; | 912 | goto badframe; |
915 | 913 | ||
916 | return ax; | 914 | return ax; |
917 | 915 | ||
918 | badframe: | 916 | badframe: |
919 | signal_fault(regs, frame, "x32 rt_sigreturn"); | 917 | signal_fault(regs, frame, "x32 rt_sigreturn"); |
920 | return 0; | 918 | return 0; |
921 | } | 919 | } |
922 | #endif | 920 | #endif |
923 | 921 |
kernel/events/uprobes.c
1 | /* | 1 | /* |
2 | * User-space Probes (UProbes) | 2 | * User-space Probes (UProbes) |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify | 4 | * This program is free software; you can redistribute it and/or modify |
5 | * it under the terms of the GNU General Public License as published by | 5 | * it under the terms of the GNU General Public License as published by |
6 | * the Free Software Foundation; either version 2 of the License, or | 6 | * the Free Software Foundation; either version 2 of the License, or |
7 | * (at your option) any later version. | 7 | * (at your option) any later version. |
8 | * | 8 | * |
9 | * This program is distributed in the hope that it will be useful, | 9 | * This program is distributed in the hope that it will be useful, |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | * GNU General Public License for more details. | 12 | * GNU General Public License for more details. |
13 | * | 13 | * |
14 | * You should have received a copy of the GNU General Public License | 14 | * You should have received a copy of the GNU General Public License |
15 | * along with this program; if not, write to the Free Software | 15 | * along with this program; if not, write to the Free Software |
16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
17 | * | 17 | * |
18 | * Copyright (C) IBM Corporation, 2008-2012 | 18 | * Copyright (C) IBM Corporation, 2008-2012 |
19 | * Authors: | 19 | * Authors: |
20 | * Srikar Dronamraju | 20 | * Srikar Dronamraju |
21 | * Jim Keniston | 21 | * Jim Keniston |
22 | * Copyright (C) 2011-2012 Red Hat, Inc., Peter Zijlstra <pzijlstr@redhat.com> | 22 | * Copyright (C) 2011-2012 Red Hat, Inc., Peter Zijlstra <pzijlstr@redhat.com> |
23 | */ | 23 | */ |
24 | 24 | ||
25 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
26 | #include <linux/highmem.h> | 26 | #include <linux/highmem.h> |
27 | #include <linux/pagemap.h> /* read_mapping_page */ | 27 | #include <linux/pagemap.h> /* read_mapping_page */ |
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | #include <linux/sched.h> | 29 | #include <linux/sched.h> |
30 | #include <linux/rmap.h> /* anon_vma_prepare */ | 30 | #include <linux/rmap.h> /* anon_vma_prepare */ |
31 | #include <linux/mmu_notifier.h> /* set_pte_at_notify */ | 31 | #include <linux/mmu_notifier.h> /* set_pte_at_notify */ |
32 | #include <linux/swap.h> /* try_to_free_swap */ | 32 | #include <linux/swap.h> /* try_to_free_swap */ |
33 | #include <linux/ptrace.h> /* user_enable_single_step */ | 33 | #include <linux/ptrace.h> /* user_enable_single_step */ |
34 | #include <linux/kdebug.h> /* notifier mechanism */ | 34 | #include <linux/kdebug.h> /* notifier mechanism */ |
35 | #include "../../mm/internal.h" /* munlock_vma_page */ | 35 | #include "../../mm/internal.h" /* munlock_vma_page */ |
36 | 36 | ||
37 | #include <linux/uprobes.h> | 37 | #include <linux/uprobes.h> |
38 | 38 | ||
39 | #define UINSNS_PER_PAGE (PAGE_SIZE/UPROBE_XOL_SLOT_BYTES) | 39 | #define UINSNS_PER_PAGE (PAGE_SIZE/UPROBE_XOL_SLOT_BYTES) |
40 | #define MAX_UPROBE_XOL_SLOTS UINSNS_PER_PAGE | 40 | #define MAX_UPROBE_XOL_SLOTS UINSNS_PER_PAGE |
41 | 41 | ||
42 | static struct rb_root uprobes_tree = RB_ROOT; | 42 | static struct rb_root uprobes_tree = RB_ROOT; |
43 | 43 | ||
44 | static DEFINE_SPINLOCK(uprobes_treelock); /* serialize rbtree access */ | 44 | static DEFINE_SPINLOCK(uprobes_treelock); /* serialize rbtree access */ |
45 | 45 | ||
46 | #define UPROBES_HASH_SZ 13 | 46 | #define UPROBES_HASH_SZ 13 |
47 | 47 | ||
48 | /* | 48 | /* |
49 | * We need separate register/unregister and mmap/munmap lock hashes because | 49 | * We need separate register/unregister and mmap/munmap lock hashes because |
50 | * of mmap_sem nesting. | 50 | * of mmap_sem nesting. |
51 | * | 51 | * |
52 | * uprobe_register() needs to install probes on (potentially) all processes | 52 | * uprobe_register() needs to install probes on (potentially) all processes |
53 | * and thus needs to acquire multiple mmap_sems (consequtively, not | 53 | * and thus needs to acquire multiple mmap_sems (consequtively, not |
54 | * concurrently), whereas uprobe_mmap() is called while holding mmap_sem | 54 | * concurrently), whereas uprobe_mmap() is called while holding mmap_sem |
55 | * for the particular process doing the mmap. | 55 | * for the particular process doing the mmap. |
56 | * | 56 | * |
57 | * uprobe_register()->register_for_each_vma() needs to drop/acquire mmap_sem | 57 | * uprobe_register()->register_for_each_vma() needs to drop/acquire mmap_sem |
58 | * because of lock order against i_mmap_mutex. This means there's a hole in | 58 | * because of lock order against i_mmap_mutex. This means there's a hole in |
59 | * the register vma iteration where a mmap() can happen. | 59 | * the register vma iteration where a mmap() can happen. |
60 | * | 60 | * |
61 | * Thus uprobe_register() can race with uprobe_mmap() and we can try and | 61 | * Thus uprobe_register() can race with uprobe_mmap() and we can try and |
62 | * install a probe where one is already installed. | 62 | * install a probe where one is already installed. |
63 | */ | 63 | */ |
64 | 64 | ||
65 | /* serialize (un)register */ | 65 | /* serialize (un)register */ |
66 | static struct mutex uprobes_mutex[UPROBES_HASH_SZ]; | 66 | static struct mutex uprobes_mutex[UPROBES_HASH_SZ]; |
67 | 67 | ||
68 | #define uprobes_hash(v) (&uprobes_mutex[((unsigned long)(v)) % UPROBES_HASH_SZ]) | 68 | #define uprobes_hash(v) (&uprobes_mutex[((unsigned long)(v)) % UPROBES_HASH_SZ]) |
69 | 69 | ||
70 | /* serialize uprobe->pending_list */ | 70 | /* serialize uprobe->pending_list */ |
71 | static struct mutex uprobes_mmap_mutex[UPROBES_HASH_SZ]; | 71 | static struct mutex uprobes_mmap_mutex[UPROBES_HASH_SZ]; |
72 | #define uprobes_mmap_hash(v) (&uprobes_mmap_mutex[((unsigned long)(v)) % UPROBES_HASH_SZ]) | 72 | #define uprobes_mmap_hash(v) (&uprobes_mmap_mutex[((unsigned long)(v)) % UPROBES_HASH_SZ]) |
73 | 73 | ||
74 | /* | 74 | /* |
75 | * uprobe_events allows us to skip the uprobe_mmap if there are no uprobe | 75 | * uprobe_events allows us to skip the uprobe_mmap if there are no uprobe |
76 | * events active at this time. Probably a fine grained per inode count is | 76 | * events active at this time. Probably a fine grained per inode count is |
77 | * better? | 77 | * better? |
78 | */ | 78 | */ |
79 | static atomic_t uprobe_events = ATOMIC_INIT(0); | 79 | static atomic_t uprobe_events = ATOMIC_INIT(0); |
80 | 80 | ||
81 | struct uprobe { | 81 | struct uprobe { |
82 | struct rb_node rb_node; /* node in the rb tree */ | 82 | struct rb_node rb_node; /* node in the rb tree */ |
83 | atomic_t ref; | 83 | atomic_t ref; |
84 | struct rw_semaphore consumer_rwsem; | 84 | struct rw_semaphore consumer_rwsem; |
85 | struct list_head pending_list; | 85 | struct list_head pending_list; |
86 | struct uprobe_consumer *consumers; | 86 | struct uprobe_consumer *consumers; |
87 | struct inode *inode; /* Also hold a ref to inode */ | 87 | struct inode *inode; /* Also hold a ref to inode */ |
88 | loff_t offset; | 88 | loff_t offset; |
89 | int flags; | 89 | int flags; |
90 | struct arch_uprobe arch; | 90 | struct arch_uprobe arch; |
91 | }; | 91 | }; |
92 | 92 | ||
93 | /* | 93 | /* |
94 | * valid_vma: Verify if the specified vma is an executable vma | 94 | * valid_vma: Verify if the specified vma is an executable vma |
95 | * Relax restrictions while unregistering: vm_flags might have | 95 | * Relax restrictions while unregistering: vm_flags might have |
96 | * changed after breakpoint was inserted. | 96 | * changed after breakpoint was inserted. |
97 | * - is_register: indicates if we are in register context. | 97 | * - is_register: indicates if we are in register context. |
98 | * - Return 1 if the specified virtual address is in an | 98 | * - Return 1 if the specified virtual address is in an |
99 | * executable vma. | 99 | * executable vma. |
100 | */ | 100 | */ |
101 | static bool valid_vma(struct vm_area_struct *vma, bool is_register) | 101 | static bool valid_vma(struct vm_area_struct *vma, bool is_register) |
102 | { | 102 | { |
103 | if (!vma->vm_file) | 103 | if (!vma->vm_file) |
104 | return false; | 104 | return false; |
105 | 105 | ||
106 | if (!is_register) | 106 | if (!is_register) |
107 | return true; | 107 | return true; |
108 | 108 | ||
109 | if ((vma->vm_flags & (VM_HUGETLB|VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)) | 109 | if ((vma->vm_flags & (VM_HUGETLB|VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)) |
110 | == (VM_READ|VM_EXEC)) | 110 | == (VM_READ|VM_EXEC)) |
111 | return true; | 111 | return true; |
112 | 112 | ||
113 | return false; | 113 | return false; |
114 | } | 114 | } |
115 | 115 | ||
116 | static unsigned long offset_to_vaddr(struct vm_area_struct *vma, loff_t offset) | 116 | static unsigned long offset_to_vaddr(struct vm_area_struct *vma, loff_t offset) |
117 | { | 117 | { |
118 | return vma->vm_start + offset - ((loff_t)vma->vm_pgoff << PAGE_SHIFT); | 118 | return vma->vm_start + offset - ((loff_t)vma->vm_pgoff << PAGE_SHIFT); |
119 | } | 119 | } |
120 | 120 | ||
121 | static loff_t vaddr_to_offset(struct vm_area_struct *vma, unsigned long vaddr) | 121 | static loff_t vaddr_to_offset(struct vm_area_struct *vma, unsigned long vaddr) |
122 | { | 122 | { |
123 | return ((loff_t)vma->vm_pgoff << PAGE_SHIFT) + (vaddr - vma->vm_start); | 123 | return ((loff_t)vma->vm_pgoff << PAGE_SHIFT) + (vaddr - vma->vm_start); |
124 | } | 124 | } |
125 | 125 | ||
126 | /** | 126 | /** |
127 | * __replace_page - replace page in vma by new page. | 127 | * __replace_page - replace page in vma by new page. |
128 | * based on replace_page in mm/ksm.c | 128 | * based on replace_page in mm/ksm.c |
129 | * | 129 | * |
130 | * @vma: vma that holds the pte pointing to page | 130 | * @vma: vma that holds the pte pointing to page |
131 | * @addr: address the old @page is mapped at | 131 | * @addr: address the old @page is mapped at |
132 | * @page: the cowed page we are replacing by kpage | 132 | * @page: the cowed page we are replacing by kpage |
133 | * @kpage: the modified page we replace page by | 133 | * @kpage: the modified page we replace page by |
134 | * | 134 | * |
135 | * Returns 0 on success, -EFAULT on failure. | 135 | * Returns 0 on success, -EFAULT on failure. |
136 | */ | 136 | */ |
137 | static int __replace_page(struct vm_area_struct *vma, unsigned long addr, | 137 | static int __replace_page(struct vm_area_struct *vma, unsigned long addr, |
138 | struct page *page, struct page *kpage) | 138 | struct page *page, struct page *kpage) |
139 | { | 139 | { |
140 | struct mm_struct *mm = vma->vm_mm; | 140 | struct mm_struct *mm = vma->vm_mm; |
141 | spinlock_t *ptl; | 141 | spinlock_t *ptl; |
142 | pte_t *ptep; | 142 | pte_t *ptep; |
143 | int err; | 143 | int err; |
144 | 144 | ||
145 | /* For try_to_free_swap() and munlock_vma_page() below */ | 145 | /* For try_to_free_swap() and munlock_vma_page() below */ |
146 | lock_page(page); | 146 | lock_page(page); |
147 | 147 | ||
148 | err = -EAGAIN; | 148 | err = -EAGAIN; |
149 | ptep = page_check_address(page, mm, addr, &ptl, 0); | 149 | ptep = page_check_address(page, mm, addr, &ptl, 0); |
150 | if (!ptep) | 150 | if (!ptep) |
151 | goto unlock; | 151 | goto unlock; |
152 | 152 | ||
153 | get_page(kpage); | 153 | get_page(kpage); |
154 | page_add_new_anon_rmap(kpage, vma, addr); | 154 | page_add_new_anon_rmap(kpage, vma, addr); |
155 | 155 | ||
156 | if (!PageAnon(page)) { | 156 | if (!PageAnon(page)) { |
157 | dec_mm_counter(mm, MM_FILEPAGES); | 157 | dec_mm_counter(mm, MM_FILEPAGES); |
158 | inc_mm_counter(mm, MM_ANONPAGES); | 158 | inc_mm_counter(mm, MM_ANONPAGES); |
159 | } | 159 | } |
160 | 160 | ||
161 | flush_cache_page(vma, addr, pte_pfn(*ptep)); | 161 | flush_cache_page(vma, addr, pte_pfn(*ptep)); |
162 | ptep_clear_flush(vma, addr, ptep); | 162 | ptep_clear_flush(vma, addr, ptep); |
163 | set_pte_at_notify(mm, addr, ptep, mk_pte(kpage, vma->vm_page_prot)); | 163 | set_pte_at_notify(mm, addr, ptep, mk_pte(kpage, vma->vm_page_prot)); |
164 | 164 | ||
165 | page_remove_rmap(page); | 165 | page_remove_rmap(page); |
166 | if (!page_mapped(page)) | 166 | if (!page_mapped(page)) |
167 | try_to_free_swap(page); | 167 | try_to_free_swap(page); |
168 | pte_unmap_unlock(ptep, ptl); | 168 | pte_unmap_unlock(ptep, ptl); |
169 | 169 | ||
170 | if (vma->vm_flags & VM_LOCKED) | 170 | if (vma->vm_flags & VM_LOCKED) |
171 | munlock_vma_page(page); | 171 | munlock_vma_page(page); |
172 | put_page(page); | 172 | put_page(page); |
173 | 173 | ||
174 | err = 0; | 174 | err = 0; |
175 | unlock: | 175 | unlock: |
176 | unlock_page(page); | 176 | unlock_page(page); |
177 | return err; | 177 | return err; |
178 | } | 178 | } |
179 | 179 | ||
180 | /** | 180 | /** |
181 | * is_swbp_insn - check if instruction is breakpoint instruction. | 181 | * is_swbp_insn - check if instruction is breakpoint instruction. |
182 | * @insn: instruction to be checked. | 182 | * @insn: instruction to be checked. |
183 | * Default implementation of is_swbp_insn | 183 | * Default implementation of is_swbp_insn |
184 | * Returns true if @insn is a breakpoint instruction. | 184 | * Returns true if @insn is a breakpoint instruction. |
185 | */ | 185 | */ |
186 | bool __weak is_swbp_insn(uprobe_opcode_t *insn) | 186 | bool __weak is_swbp_insn(uprobe_opcode_t *insn) |
187 | { | 187 | { |
188 | return *insn == UPROBE_SWBP_INSN; | 188 | return *insn == UPROBE_SWBP_INSN; |
189 | } | 189 | } |
190 | 190 | ||
191 | /* | 191 | /* |
192 | * NOTE: | 192 | * NOTE: |
193 | * Expect the breakpoint instruction to be the smallest size instruction for | 193 | * Expect the breakpoint instruction to be the smallest size instruction for |
194 | * the architecture. If an arch has variable length instruction and the | 194 | * the architecture. If an arch has variable length instruction and the |
195 | * breakpoint instruction is not of the smallest length instruction | 195 | * breakpoint instruction is not of the smallest length instruction |
196 | * supported by that architecture then we need to modify read_opcode / | 196 | * supported by that architecture then we need to modify read_opcode / |
197 | * write_opcode accordingly. This would never be a problem for archs that | 197 | * write_opcode accordingly. This would never be a problem for archs that |
198 | * have fixed length instructions. | 198 | * have fixed length instructions. |
199 | */ | 199 | */ |
200 | 200 | ||
201 | /* | 201 | /* |
202 | * write_opcode - write the opcode at a given virtual address. | 202 | * write_opcode - write the opcode at a given virtual address. |
203 | * @auprobe: arch breakpointing information. | 203 | * @auprobe: arch breakpointing information. |
204 | * @mm: the probed process address space. | 204 | * @mm: the probed process address space. |
205 | * @vaddr: the virtual address to store the opcode. | 205 | * @vaddr: the virtual address to store the opcode. |
206 | * @opcode: opcode to be written at @vaddr. | 206 | * @opcode: opcode to be written at @vaddr. |
207 | * | 207 | * |
208 | * Called with mm->mmap_sem held (for read and with a reference to | 208 | * Called with mm->mmap_sem held (for read and with a reference to |
209 | * mm). | 209 | * mm). |
210 | * | 210 | * |
211 | * For mm @mm, write the opcode at @vaddr. | 211 | * For mm @mm, write the opcode at @vaddr. |
212 | * Return 0 (success) or a negative errno. | 212 | * Return 0 (success) or a negative errno. |
213 | */ | 213 | */ |
214 | static int write_opcode(struct arch_uprobe *auprobe, struct mm_struct *mm, | 214 | static int write_opcode(struct arch_uprobe *auprobe, struct mm_struct *mm, |
215 | unsigned long vaddr, uprobe_opcode_t opcode) | 215 | unsigned long vaddr, uprobe_opcode_t opcode) |
216 | { | 216 | { |
217 | struct page *old_page, *new_page; | 217 | struct page *old_page, *new_page; |
218 | void *vaddr_old, *vaddr_new; | 218 | void *vaddr_old, *vaddr_new; |
219 | struct vm_area_struct *vma; | 219 | struct vm_area_struct *vma; |
220 | int ret; | 220 | int ret; |
221 | 221 | ||
222 | retry: | 222 | retry: |
223 | /* Read the page with vaddr into memory */ | 223 | /* Read the page with vaddr into memory */ |
224 | ret = get_user_pages(NULL, mm, vaddr, 1, 0, 0, &old_page, &vma); | 224 | ret = get_user_pages(NULL, mm, vaddr, 1, 0, 0, &old_page, &vma); |
225 | if (ret <= 0) | 225 | if (ret <= 0) |
226 | return ret; | 226 | return ret; |
227 | 227 | ||
228 | ret = -ENOMEM; | 228 | ret = -ENOMEM; |
229 | new_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, vaddr); | 229 | new_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, vaddr); |
230 | if (!new_page) | 230 | if (!new_page) |
231 | goto put_old; | 231 | goto put_old; |
232 | 232 | ||
233 | __SetPageUptodate(new_page); | 233 | __SetPageUptodate(new_page); |
234 | 234 | ||
235 | /* copy the page now that we've got it stable */ | 235 | /* copy the page now that we've got it stable */ |
236 | vaddr_old = kmap_atomic(old_page); | 236 | vaddr_old = kmap_atomic(old_page); |
237 | vaddr_new = kmap_atomic(new_page); | 237 | vaddr_new = kmap_atomic(new_page); |
238 | 238 | ||
239 | memcpy(vaddr_new, vaddr_old, PAGE_SIZE); | 239 | memcpy(vaddr_new, vaddr_old, PAGE_SIZE); |
240 | memcpy(vaddr_new + (vaddr & ~PAGE_MASK), &opcode, UPROBE_SWBP_INSN_SIZE); | 240 | memcpy(vaddr_new + (vaddr & ~PAGE_MASK), &opcode, UPROBE_SWBP_INSN_SIZE); |
241 | 241 | ||
242 | kunmap_atomic(vaddr_new); | 242 | kunmap_atomic(vaddr_new); |
243 | kunmap_atomic(vaddr_old); | 243 | kunmap_atomic(vaddr_old); |
244 | 244 | ||
245 | ret = anon_vma_prepare(vma); | 245 | ret = anon_vma_prepare(vma); |
246 | if (ret) | 246 | if (ret) |
247 | goto put_new; | 247 | goto put_new; |
248 | 248 | ||
249 | ret = __replace_page(vma, vaddr, old_page, new_page); | 249 | ret = __replace_page(vma, vaddr, old_page, new_page); |
250 | 250 | ||
251 | put_new: | 251 | put_new: |
252 | page_cache_release(new_page); | 252 | page_cache_release(new_page); |
253 | put_old: | 253 | put_old: |
254 | put_page(old_page); | 254 | put_page(old_page); |
255 | 255 | ||
256 | if (unlikely(ret == -EAGAIN)) | 256 | if (unlikely(ret == -EAGAIN)) |
257 | goto retry; | 257 | goto retry; |
258 | return ret; | 258 | return ret; |
259 | } | 259 | } |
260 | 260 | ||
261 | /** | 261 | /** |
262 | * read_opcode - read the opcode at a given virtual address. | 262 | * read_opcode - read the opcode at a given virtual address. |
263 | * @mm: the probed process address space. | 263 | * @mm: the probed process address space. |
264 | * @vaddr: the virtual address to read the opcode. | 264 | * @vaddr: the virtual address to read the opcode. |
265 | * @opcode: location to store the read opcode. | 265 | * @opcode: location to store the read opcode. |
266 | * | 266 | * |
267 | * Called with mm->mmap_sem held (for read and with a reference to | 267 | * Called with mm->mmap_sem held (for read and with a reference to |
268 | * mm. | 268 | * mm. |
269 | * | 269 | * |
270 | * For mm @mm, read the opcode at @vaddr and store it in @opcode. | 270 | * For mm @mm, read the opcode at @vaddr and store it in @opcode. |
271 | * Return 0 (success) or a negative errno. | 271 | * Return 0 (success) or a negative errno. |
272 | */ | 272 | */ |
273 | static int read_opcode(struct mm_struct *mm, unsigned long vaddr, uprobe_opcode_t *opcode) | 273 | static int read_opcode(struct mm_struct *mm, unsigned long vaddr, uprobe_opcode_t *opcode) |
274 | { | 274 | { |
275 | struct page *page; | 275 | struct page *page; |
276 | void *vaddr_new; | 276 | void *vaddr_new; |
277 | int ret; | 277 | int ret; |
278 | 278 | ||
279 | ret = get_user_pages(NULL, mm, vaddr, 1, 0, 1, &page, NULL); | 279 | ret = get_user_pages(NULL, mm, vaddr, 1, 0, 1, &page, NULL); |
280 | if (ret <= 0) | 280 | if (ret <= 0) |
281 | return ret; | 281 | return ret; |
282 | 282 | ||
283 | vaddr_new = kmap_atomic(page); | 283 | vaddr_new = kmap_atomic(page); |
284 | vaddr &= ~PAGE_MASK; | 284 | vaddr &= ~PAGE_MASK; |
285 | memcpy(opcode, vaddr_new + vaddr, UPROBE_SWBP_INSN_SIZE); | 285 | memcpy(opcode, vaddr_new + vaddr, UPROBE_SWBP_INSN_SIZE); |
286 | kunmap_atomic(vaddr_new); | 286 | kunmap_atomic(vaddr_new); |
287 | 287 | ||
288 | put_page(page); | 288 | put_page(page); |
289 | 289 | ||
290 | return 0; | 290 | return 0; |
291 | } | 291 | } |
292 | 292 | ||
293 | static int is_swbp_at_addr(struct mm_struct *mm, unsigned long vaddr) | 293 | static int is_swbp_at_addr(struct mm_struct *mm, unsigned long vaddr) |
294 | { | 294 | { |
295 | uprobe_opcode_t opcode; | 295 | uprobe_opcode_t opcode; |
296 | int result; | 296 | int result; |
297 | 297 | ||
298 | if (current->mm == mm) { | 298 | if (current->mm == mm) { |
299 | pagefault_disable(); | 299 | pagefault_disable(); |
300 | result = __copy_from_user_inatomic(&opcode, (void __user*)vaddr, | 300 | result = __copy_from_user_inatomic(&opcode, (void __user*)vaddr, |
301 | sizeof(opcode)); | 301 | sizeof(opcode)); |
302 | pagefault_enable(); | 302 | pagefault_enable(); |
303 | 303 | ||
304 | if (likely(result == 0)) | 304 | if (likely(result == 0)) |
305 | goto out; | 305 | goto out; |
306 | } | 306 | } |
307 | 307 | ||
308 | result = read_opcode(mm, vaddr, &opcode); | 308 | result = read_opcode(mm, vaddr, &opcode); |
309 | if (result) | 309 | if (result) |
310 | return result; | 310 | return result; |
311 | out: | 311 | out: |
312 | if (is_swbp_insn(&opcode)) | 312 | if (is_swbp_insn(&opcode)) |
313 | return 1; | 313 | return 1; |
314 | 314 | ||
315 | return 0; | 315 | return 0; |
316 | } | 316 | } |
317 | 317 | ||
318 | /** | 318 | /** |
319 | * set_swbp - store breakpoint at a given address. | 319 | * set_swbp - store breakpoint at a given address. |
320 | * @auprobe: arch specific probepoint information. | 320 | * @auprobe: arch specific probepoint information. |
321 | * @mm: the probed process address space. | 321 | * @mm: the probed process address space. |
322 | * @vaddr: the virtual address to insert the opcode. | 322 | * @vaddr: the virtual address to insert the opcode. |
323 | * | 323 | * |
324 | * For mm @mm, store the breakpoint instruction at @vaddr. | 324 | * For mm @mm, store the breakpoint instruction at @vaddr. |
325 | * Return 0 (success) or a negative errno. | 325 | * Return 0 (success) or a negative errno. |
326 | */ | 326 | */ |
327 | int __weak set_swbp(struct arch_uprobe *auprobe, struct mm_struct *mm, unsigned long vaddr) | 327 | int __weak set_swbp(struct arch_uprobe *auprobe, struct mm_struct *mm, unsigned long vaddr) |
328 | { | 328 | { |
329 | int result; | 329 | int result; |
330 | /* | 330 | /* |
331 | * See the comment near uprobes_hash(). | 331 | * See the comment near uprobes_hash(). |
332 | */ | 332 | */ |
333 | result = is_swbp_at_addr(mm, vaddr); | 333 | result = is_swbp_at_addr(mm, vaddr); |
334 | if (result == 1) | 334 | if (result == 1) |
335 | return 0; | 335 | return 0; |
336 | 336 | ||
337 | if (result) | 337 | if (result) |
338 | return result; | 338 | return result; |
339 | 339 | ||
340 | return write_opcode(auprobe, mm, vaddr, UPROBE_SWBP_INSN); | 340 | return write_opcode(auprobe, mm, vaddr, UPROBE_SWBP_INSN); |
341 | } | 341 | } |
342 | 342 | ||
343 | /** | 343 | /** |
344 | * set_orig_insn - Restore the original instruction. | 344 | * set_orig_insn - Restore the original instruction. |
345 | * @mm: the probed process address space. | 345 | * @mm: the probed process address space. |
346 | * @auprobe: arch specific probepoint information. | 346 | * @auprobe: arch specific probepoint information. |
347 | * @vaddr: the virtual address to insert the opcode. | 347 | * @vaddr: the virtual address to insert the opcode. |
348 | * | 348 | * |
349 | * For mm @mm, restore the original opcode (opcode) at @vaddr. | 349 | * For mm @mm, restore the original opcode (opcode) at @vaddr. |
350 | * Return 0 (success) or a negative errno. | 350 | * Return 0 (success) or a negative errno. |
351 | */ | 351 | */ |
352 | int __weak | 352 | int __weak |
353 | set_orig_insn(struct arch_uprobe *auprobe, struct mm_struct *mm, unsigned long vaddr) | 353 | set_orig_insn(struct arch_uprobe *auprobe, struct mm_struct *mm, unsigned long vaddr) |
354 | { | 354 | { |
355 | int result; | 355 | int result; |
356 | 356 | ||
357 | result = is_swbp_at_addr(mm, vaddr); | 357 | result = is_swbp_at_addr(mm, vaddr); |
358 | if (!result) | 358 | if (!result) |
359 | return -EINVAL; | 359 | return -EINVAL; |
360 | 360 | ||
361 | if (result != 1) | 361 | if (result != 1) |
362 | return result; | 362 | return result; |
363 | 363 | ||
364 | return write_opcode(auprobe, mm, vaddr, *(uprobe_opcode_t *)auprobe->insn); | 364 | return write_opcode(auprobe, mm, vaddr, *(uprobe_opcode_t *)auprobe->insn); |
365 | } | 365 | } |
366 | 366 | ||
367 | static int match_uprobe(struct uprobe *l, struct uprobe *r) | 367 | static int match_uprobe(struct uprobe *l, struct uprobe *r) |
368 | { | 368 | { |
369 | if (l->inode < r->inode) | 369 | if (l->inode < r->inode) |
370 | return -1; | 370 | return -1; |
371 | 371 | ||
372 | if (l->inode > r->inode) | 372 | if (l->inode > r->inode) |
373 | return 1; | 373 | return 1; |
374 | 374 | ||
375 | if (l->offset < r->offset) | 375 | if (l->offset < r->offset) |
376 | return -1; | 376 | return -1; |
377 | 377 | ||
378 | if (l->offset > r->offset) | 378 | if (l->offset > r->offset) |
379 | return 1; | 379 | return 1; |
380 | 380 | ||
381 | return 0; | 381 | return 0; |
382 | } | 382 | } |
383 | 383 | ||
384 | static struct uprobe *__find_uprobe(struct inode *inode, loff_t offset) | 384 | static struct uprobe *__find_uprobe(struct inode *inode, loff_t offset) |
385 | { | 385 | { |
386 | struct uprobe u = { .inode = inode, .offset = offset }; | 386 | struct uprobe u = { .inode = inode, .offset = offset }; |
387 | struct rb_node *n = uprobes_tree.rb_node; | 387 | struct rb_node *n = uprobes_tree.rb_node; |
388 | struct uprobe *uprobe; | 388 | struct uprobe *uprobe; |
389 | int match; | 389 | int match; |
390 | 390 | ||
391 | while (n) { | 391 | while (n) { |
392 | uprobe = rb_entry(n, struct uprobe, rb_node); | 392 | uprobe = rb_entry(n, struct uprobe, rb_node); |
393 | match = match_uprobe(&u, uprobe); | 393 | match = match_uprobe(&u, uprobe); |
394 | if (!match) { | 394 | if (!match) { |
395 | atomic_inc(&uprobe->ref); | 395 | atomic_inc(&uprobe->ref); |
396 | return uprobe; | 396 | return uprobe; |
397 | } | 397 | } |
398 | 398 | ||
399 | if (match < 0) | 399 | if (match < 0) |
400 | n = n->rb_left; | 400 | n = n->rb_left; |
401 | else | 401 | else |
402 | n = n->rb_right; | 402 | n = n->rb_right; |
403 | } | 403 | } |
404 | return NULL; | 404 | return NULL; |
405 | } | 405 | } |
406 | 406 | ||
407 | /* | 407 | /* |
408 | * Find a uprobe corresponding to a given inode:offset | 408 | * Find a uprobe corresponding to a given inode:offset |
409 | * Acquires uprobes_treelock | 409 | * Acquires uprobes_treelock |
410 | */ | 410 | */ |
411 | static struct uprobe *find_uprobe(struct inode *inode, loff_t offset) | 411 | static struct uprobe *find_uprobe(struct inode *inode, loff_t offset) |
412 | { | 412 | { |
413 | struct uprobe *uprobe; | 413 | struct uprobe *uprobe; |
414 | 414 | ||
415 | spin_lock(&uprobes_treelock); | 415 | spin_lock(&uprobes_treelock); |
416 | uprobe = __find_uprobe(inode, offset); | 416 | uprobe = __find_uprobe(inode, offset); |
417 | spin_unlock(&uprobes_treelock); | 417 | spin_unlock(&uprobes_treelock); |
418 | 418 | ||
419 | return uprobe; | 419 | return uprobe; |
420 | } | 420 | } |
421 | 421 | ||
422 | static struct uprobe *__insert_uprobe(struct uprobe *uprobe) | 422 | static struct uprobe *__insert_uprobe(struct uprobe *uprobe) |
423 | { | 423 | { |
424 | struct rb_node **p = &uprobes_tree.rb_node; | 424 | struct rb_node **p = &uprobes_tree.rb_node; |
425 | struct rb_node *parent = NULL; | 425 | struct rb_node *parent = NULL; |
426 | struct uprobe *u; | 426 | struct uprobe *u; |
427 | int match; | 427 | int match; |
428 | 428 | ||
429 | while (*p) { | 429 | while (*p) { |
430 | parent = *p; | 430 | parent = *p; |
431 | u = rb_entry(parent, struct uprobe, rb_node); | 431 | u = rb_entry(parent, struct uprobe, rb_node); |
432 | match = match_uprobe(uprobe, u); | 432 | match = match_uprobe(uprobe, u); |
433 | if (!match) { | 433 | if (!match) { |
434 | atomic_inc(&u->ref); | 434 | atomic_inc(&u->ref); |
435 | return u; | 435 | return u; |
436 | } | 436 | } |
437 | 437 | ||
438 | if (match < 0) | 438 | if (match < 0) |
439 | p = &parent->rb_left; | 439 | p = &parent->rb_left; |
440 | else | 440 | else |
441 | p = &parent->rb_right; | 441 | p = &parent->rb_right; |
442 | 442 | ||
443 | } | 443 | } |
444 | 444 | ||
445 | u = NULL; | 445 | u = NULL; |
446 | rb_link_node(&uprobe->rb_node, parent, p); | 446 | rb_link_node(&uprobe->rb_node, parent, p); |
447 | rb_insert_color(&uprobe->rb_node, &uprobes_tree); | 447 | rb_insert_color(&uprobe->rb_node, &uprobes_tree); |
448 | /* get access + creation ref */ | 448 | /* get access + creation ref */ |
449 | atomic_set(&uprobe->ref, 2); | 449 | atomic_set(&uprobe->ref, 2); |
450 | 450 | ||
451 | return u; | 451 | return u; |
452 | } | 452 | } |
453 | 453 | ||
454 | /* | 454 | /* |
455 | * Acquire uprobes_treelock. | 455 | * Acquire uprobes_treelock. |
456 | * Matching uprobe already exists in rbtree; | 456 | * Matching uprobe already exists in rbtree; |
457 | * increment (access refcount) and return the matching uprobe. | 457 | * increment (access refcount) and return the matching uprobe. |
458 | * | 458 | * |
459 | * No matching uprobe; insert the uprobe in rb_tree; | 459 | * No matching uprobe; insert the uprobe in rb_tree; |
460 | * get a double refcount (access + creation) and return NULL. | 460 | * get a double refcount (access + creation) and return NULL. |
461 | */ | 461 | */ |
462 | static struct uprobe *insert_uprobe(struct uprobe *uprobe) | 462 | static struct uprobe *insert_uprobe(struct uprobe *uprobe) |
463 | { | 463 | { |
464 | struct uprobe *u; | 464 | struct uprobe *u; |
465 | 465 | ||
466 | spin_lock(&uprobes_treelock); | 466 | spin_lock(&uprobes_treelock); |
467 | u = __insert_uprobe(uprobe); | 467 | u = __insert_uprobe(uprobe); |
468 | spin_unlock(&uprobes_treelock); | 468 | spin_unlock(&uprobes_treelock); |
469 | 469 | ||
470 | /* For now assume that the instruction need not be single-stepped */ | 470 | /* For now assume that the instruction need not be single-stepped */ |
471 | uprobe->flags |= UPROBE_SKIP_SSTEP; | 471 | uprobe->flags |= UPROBE_SKIP_SSTEP; |
472 | 472 | ||
473 | return u; | 473 | return u; |
474 | } | 474 | } |
475 | 475 | ||
476 | static void put_uprobe(struct uprobe *uprobe) | 476 | static void put_uprobe(struct uprobe *uprobe) |
477 | { | 477 | { |
478 | if (atomic_dec_and_test(&uprobe->ref)) | 478 | if (atomic_dec_and_test(&uprobe->ref)) |
479 | kfree(uprobe); | 479 | kfree(uprobe); |
480 | } | 480 | } |
481 | 481 | ||
482 | static struct uprobe *alloc_uprobe(struct inode *inode, loff_t offset) | 482 | static struct uprobe *alloc_uprobe(struct inode *inode, loff_t offset) |
483 | { | 483 | { |
484 | struct uprobe *uprobe, *cur_uprobe; | 484 | struct uprobe *uprobe, *cur_uprobe; |
485 | 485 | ||
486 | uprobe = kzalloc(sizeof(struct uprobe), GFP_KERNEL); | 486 | uprobe = kzalloc(sizeof(struct uprobe), GFP_KERNEL); |
487 | if (!uprobe) | 487 | if (!uprobe) |
488 | return NULL; | 488 | return NULL; |
489 | 489 | ||
490 | uprobe->inode = igrab(inode); | 490 | uprobe->inode = igrab(inode); |
491 | uprobe->offset = offset; | 491 | uprobe->offset = offset; |
492 | init_rwsem(&uprobe->consumer_rwsem); | 492 | init_rwsem(&uprobe->consumer_rwsem); |
493 | 493 | ||
494 | /* add to uprobes_tree, sorted on inode:offset */ | 494 | /* add to uprobes_tree, sorted on inode:offset */ |
495 | cur_uprobe = insert_uprobe(uprobe); | 495 | cur_uprobe = insert_uprobe(uprobe); |
496 | 496 | ||
497 | /* a uprobe exists for this inode:offset combination */ | 497 | /* a uprobe exists for this inode:offset combination */ |
498 | if (cur_uprobe) { | 498 | if (cur_uprobe) { |
499 | kfree(uprobe); | 499 | kfree(uprobe); |
500 | uprobe = cur_uprobe; | 500 | uprobe = cur_uprobe; |
501 | iput(inode); | 501 | iput(inode); |
502 | } else { | 502 | } else { |
503 | atomic_inc(&uprobe_events); | 503 | atomic_inc(&uprobe_events); |
504 | } | 504 | } |
505 | 505 | ||
506 | return uprobe; | 506 | return uprobe; |
507 | } | 507 | } |
508 | 508 | ||
509 | static void handler_chain(struct uprobe *uprobe, struct pt_regs *regs) | 509 | static void handler_chain(struct uprobe *uprobe, struct pt_regs *regs) |
510 | { | 510 | { |
511 | struct uprobe_consumer *uc; | 511 | struct uprobe_consumer *uc; |
512 | 512 | ||
513 | if (!(uprobe->flags & UPROBE_RUN_HANDLER)) | 513 | if (!(uprobe->flags & UPROBE_RUN_HANDLER)) |
514 | return; | 514 | return; |
515 | 515 | ||
516 | down_read(&uprobe->consumer_rwsem); | 516 | down_read(&uprobe->consumer_rwsem); |
517 | for (uc = uprobe->consumers; uc; uc = uc->next) { | 517 | for (uc = uprobe->consumers; uc; uc = uc->next) { |
518 | if (!uc->filter || uc->filter(uc, current)) | 518 | if (!uc->filter || uc->filter(uc, current)) |
519 | uc->handler(uc, regs); | 519 | uc->handler(uc, regs); |
520 | } | 520 | } |
521 | up_read(&uprobe->consumer_rwsem); | 521 | up_read(&uprobe->consumer_rwsem); |
522 | } | 522 | } |
523 | 523 | ||
524 | /* Returns the previous consumer */ | 524 | /* Returns the previous consumer */ |
525 | static struct uprobe_consumer * | 525 | static struct uprobe_consumer * |
526 | consumer_add(struct uprobe *uprobe, struct uprobe_consumer *uc) | 526 | consumer_add(struct uprobe *uprobe, struct uprobe_consumer *uc) |
527 | { | 527 | { |
528 | down_write(&uprobe->consumer_rwsem); | 528 | down_write(&uprobe->consumer_rwsem); |
529 | uc->next = uprobe->consumers; | 529 | uc->next = uprobe->consumers; |
530 | uprobe->consumers = uc; | 530 | uprobe->consumers = uc; |
531 | up_write(&uprobe->consumer_rwsem); | 531 | up_write(&uprobe->consumer_rwsem); |
532 | 532 | ||
533 | return uc->next; | 533 | return uc->next; |
534 | } | 534 | } |
535 | 535 | ||
536 | /* | 536 | /* |
537 | * For uprobe @uprobe, delete the consumer @uc. | 537 | * For uprobe @uprobe, delete the consumer @uc. |
538 | * Return true if the @uc is deleted successfully | 538 | * Return true if the @uc is deleted successfully |
539 | * or return false. | 539 | * or return false. |
540 | */ | 540 | */ |
541 | static bool consumer_del(struct uprobe *uprobe, struct uprobe_consumer *uc) | 541 | static bool consumer_del(struct uprobe *uprobe, struct uprobe_consumer *uc) |
542 | { | 542 | { |
543 | struct uprobe_consumer **con; | 543 | struct uprobe_consumer **con; |
544 | bool ret = false; | 544 | bool ret = false; |
545 | 545 | ||
546 | down_write(&uprobe->consumer_rwsem); | 546 | down_write(&uprobe->consumer_rwsem); |
547 | for (con = &uprobe->consumers; *con; con = &(*con)->next) { | 547 | for (con = &uprobe->consumers; *con; con = &(*con)->next) { |
548 | if (*con == uc) { | 548 | if (*con == uc) { |
549 | *con = uc->next; | 549 | *con = uc->next; |
550 | ret = true; | 550 | ret = true; |
551 | break; | 551 | break; |
552 | } | 552 | } |
553 | } | 553 | } |
554 | up_write(&uprobe->consumer_rwsem); | 554 | up_write(&uprobe->consumer_rwsem); |
555 | 555 | ||
556 | return ret; | 556 | return ret; |
557 | } | 557 | } |
558 | 558 | ||
559 | static int | 559 | static int |
560 | __copy_insn(struct address_space *mapping, struct file *filp, char *insn, | 560 | __copy_insn(struct address_space *mapping, struct file *filp, char *insn, |
561 | unsigned long nbytes, loff_t offset) | 561 | unsigned long nbytes, loff_t offset) |
562 | { | 562 | { |
563 | struct page *page; | 563 | struct page *page; |
564 | void *vaddr; | 564 | void *vaddr; |
565 | unsigned long off; | 565 | unsigned long off; |
566 | pgoff_t idx; | 566 | pgoff_t idx; |
567 | 567 | ||
568 | if (!filp) | 568 | if (!filp) |
569 | return -EINVAL; | 569 | return -EINVAL; |
570 | 570 | ||
571 | if (!mapping->a_ops->readpage) | 571 | if (!mapping->a_ops->readpage) |
572 | return -EIO; | 572 | return -EIO; |
573 | 573 | ||
574 | idx = offset >> PAGE_CACHE_SHIFT; | 574 | idx = offset >> PAGE_CACHE_SHIFT; |
575 | off = offset & ~PAGE_MASK; | 575 | off = offset & ~PAGE_MASK; |
576 | 576 | ||
577 | /* | 577 | /* |
578 | * Ensure that the page that has the original instruction is | 578 | * Ensure that the page that has the original instruction is |
579 | * populated and in page-cache. | 579 | * populated and in page-cache. |
580 | */ | 580 | */ |
581 | page = read_mapping_page(mapping, idx, filp); | 581 | page = read_mapping_page(mapping, idx, filp); |
582 | if (IS_ERR(page)) | 582 | if (IS_ERR(page)) |
583 | return PTR_ERR(page); | 583 | return PTR_ERR(page); |
584 | 584 | ||
585 | vaddr = kmap_atomic(page); | 585 | vaddr = kmap_atomic(page); |
586 | memcpy(insn, vaddr + off, nbytes); | 586 | memcpy(insn, vaddr + off, nbytes); |
587 | kunmap_atomic(vaddr); | 587 | kunmap_atomic(vaddr); |
588 | page_cache_release(page); | 588 | page_cache_release(page); |
589 | 589 | ||
590 | return 0; | 590 | return 0; |
591 | } | 591 | } |
592 | 592 | ||
593 | static int copy_insn(struct uprobe *uprobe, struct file *filp) | 593 | static int copy_insn(struct uprobe *uprobe, struct file *filp) |
594 | { | 594 | { |
595 | struct address_space *mapping; | 595 | struct address_space *mapping; |
596 | unsigned long nbytes; | 596 | unsigned long nbytes; |
597 | int bytes; | 597 | int bytes; |
598 | 598 | ||
599 | nbytes = PAGE_SIZE - (uprobe->offset & ~PAGE_MASK); | 599 | nbytes = PAGE_SIZE - (uprobe->offset & ~PAGE_MASK); |
600 | mapping = uprobe->inode->i_mapping; | 600 | mapping = uprobe->inode->i_mapping; |
601 | 601 | ||
602 | /* Instruction at end of binary; copy only available bytes */ | 602 | /* Instruction at end of binary; copy only available bytes */ |
603 | if (uprobe->offset + MAX_UINSN_BYTES > uprobe->inode->i_size) | 603 | if (uprobe->offset + MAX_UINSN_BYTES > uprobe->inode->i_size) |
604 | bytes = uprobe->inode->i_size - uprobe->offset; | 604 | bytes = uprobe->inode->i_size - uprobe->offset; |
605 | else | 605 | else |
606 | bytes = MAX_UINSN_BYTES; | 606 | bytes = MAX_UINSN_BYTES; |
607 | 607 | ||
608 | /* Instruction at the page-boundary; copy bytes in second page */ | 608 | /* Instruction at the page-boundary; copy bytes in second page */ |
609 | if (nbytes < bytes) { | 609 | if (nbytes < bytes) { |
610 | int err = __copy_insn(mapping, filp, uprobe->arch.insn + nbytes, | 610 | int err = __copy_insn(mapping, filp, uprobe->arch.insn + nbytes, |
611 | bytes - nbytes, uprobe->offset + nbytes); | 611 | bytes - nbytes, uprobe->offset + nbytes); |
612 | if (err) | 612 | if (err) |
613 | return err; | 613 | return err; |
614 | bytes = nbytes; | 614 | bytes = nbytes; |
615 | } | 615 | } |
616 | return __copy_insn(mapping, filp, uprobe->arch.insn, bytes, uprobe->offset); | 616 | return __copy_insn(mapping, filp, uprobe->arch.insn, bytes, uprobe->offset); |
617 | } | 617 | } |
618 | 618 | ||
619 | /* | 619 | /* |
620 | * How mm->uprobes_state.count gets updated | 620 | * How mm->uprobes_state.count gets updated |
621 | * uprobe_mmap() increments the count if | 621 | * uprobe_mmap() increments the count if |
622 | * - it successfully adds a breakpoint. | 622 | * - it successfully adds a breakpoint. |
623 | * - it cannot add a breakpoint, but sees that there is a underlying | 623 | * - it cannot add a breakpoint, but sees that there is a underlying |
624 | * breakpoint (via a is_swbp_at_addr()). | 624 | * breakpoint (via a is_swbp_at_addr()). |
625 | * | 625 | * |
626 | * uprobe_munmap() decrements the count if | 626 | * uprobe_munmap() decrements the count if |
627 | * - it sees a underlying breakpoint, (via is_swbp_at_addr) | 627 | * - it sees a underlying breakpoint, (via is_swbp_at_addr) |
628 | * (Subsequent uprobe_unregister wouldnt find the breakpoint | 628 | * (Subsequent uprobe_unregister wouldnt find the breakpoint |
629 | * unless a uprobe_mmap kicks in, since the old vma would be | 629 | * unless a uprobe_mmap kicks in, since the old vma would be |
630 | * dropped just after uprobe_munmap.) | 630 | * dropped just after uprobe_munmap.) |
631 | * | 631 | * |
632 | * uprobe_register increments the count if: | 632 | * uprobe_register increments the count if: |
633 | * - it successfully adds a breakpoint. | 633 | * - it successfully adds a breakpoint. |
634 | * | 634 | * |
635 | * uprobe_unregister decrements the count if: | 635 | * uprobe_unregister decrements the count if: |
636 | * - it sees a underlying breakpoint and removes successfully. | 636 | * - it sees a underlying breakpoint and removes successfully. |
637 | * (via is_swbp_at_addr) | 637 | * (via is_swbp_at_addr) |
638 | * (Subsequent uprobe_munmap wouldnt find the breakpoint | 638 | * (Subsequent uprobe_munmap wouldnt find the breakpoint |
639 | * since there is no underlying breakpoint after the | 639 | * since there is no underlying breakpoint after the |
640 | * breakpoint removal.) | 640 | * breakpoint removal.) |
641 | */ | 641 | */ |
642 | static int | 642 | static int |
643 | install_breakpoint(struct uprobe *uprobe, struct mm_struct *mm, | 643 | install_breakpoint(struct uprobe *uprobe, struct mm_struct *mm, |
644 | struct vm_area_struct *vma, unsigned long vaddr) | 644 | struct vm_area_struct *vma, unsigned long vaddr) |
645 | { | 645 | { |
646 | bool first_uprobe; | 646 | bool first_uprobe; |
647 | int ret; | 647 | int ret; |
648 | 648 | ||
649 | /* | 649 | /* |
650 | * If probe is being deleted, unregister thread could be done with | 650 | * If probe is being deleted, unregister thread could be done with |
651 | * the vma-rmap-walk through. Adding a probe now can be fatal since | 651 | * the vma-rmap-walk through. Adding a probe now can be fatal since |
652 | * nobody will be able to cleanup. Also we could be from fork or | 652 | * nobody will be able to cleanup. Also we could be from fork or |
653 | * mremap path, where the probe might have already been inserted. | 653 | * mremap path, where the probe might have already been inserted. |
654 | * Hence behave as if probe already existed. | 654 | * Hence behave as if probe already existed. |
655 | */ | 655 | */ |
656 | if (!uprobe->consumers) | 656 | if (!uprobe->consumers) |
657 | return 0; | 657 | return 0; |
658 | 658 | ||
659 | if (!(uprobe->flags & UPROBE_COPY_INSN)) { | 659 | if (!(uprobe->flags & UPROBE_COPY_INSN)) { |
660 | ret = copy_insn(uprobe, vma->vm_file); | 660 | ret = copy_insn(uprobe, vma->vm_file); |
661 | if (ret) | 661 | if (ret) |
662 | return ret; | 662 | return ret; |
663 | 663 | ||
664 | if (is_swbp_insn((uprobe_opcode_t *)uprobe->arch.insn)) | 664 | if (is_swbp_insn((uprobe_opcode_t *)uprobe->arch.insn)) |
665 | return -ENOTSUPP; | 665 | return -ENOTSUPP; |
666 | 666 | ||
667 | ret = arch_uprobe_analyze_insn(&uprobe->arch, mm, vaddr); | 667 | ret = arch_uprobe_analyze_insn(&uprobe->arch, mm, vaddr); |
668 | if (ret) | 668 | if (ret) |
669 | return ret; | 669 | return ret; |
670 | 670 | ||
671 | /* write_opcode() assumes we don't cross page boundary */ | 671 | /* write_opcode() assumes we don't cross page boundary */ |
672 | BUG_ON((uprobe->offset & ~PAGE_MASK) + | 672 | BUG_ON((uprobe->offset & ~PAGE_MASK) + |
673 | UPROBE_SWBP_INSN_SIZE > PAGE_SIZE); | 673 | UPROBE_SWBP_INSN_SIZE > PAGE_SIZE); |
674 | 674 | ||
675 | uprobe->flags |= UPROBE_COPY_INSN; | 675 | uprobe->flags |= UPROBE_COPY_INSN; |
676 | } | 676 | } |
677 | 677 | ||
678 | /* | 678 | /* |
679 | * set MMF_HAS_UPROBES in advance for uprobe_pre_sstep_notifier(), | 679 | * set MMF_HAS_UPROBES in advance for uprobe_pre_sstep_notifier(), |
680 | * the task can hit this breakpoint right after __replace_page(). | 680 | * the task can hit this breakpoint right after __replace_page(). |
681 | */ | 681 | */ |
682 | first_uprobe = !test_bit(MMF_HAS_UPROBES, &mm->flags); | 682 | first_uprobe = !test_bit(MMF_HAS_UPROBES, &mm->flags); |
683 | if (first_uprobe) | 683 | if (first_uprobe) |
684 | set_bit(MMF_HAS_UPROBES, &mm->flags); | 684 | set_bit(MMF_HAS_UPROBES, &mm->flags); |
685 | 685 | ||
686 | ret = set_swbp(&uprobe->arch, mm, vaddr); | 686 | ret = set_swbp(&uprobe->arch, mm, vaddr); |
687 | if (!ret) | 687 | if (!ret) |
688 | clear_bit(MMF_RECALC_UPROBES, &mm->flags); | 688 | clear_bit(MMF_RECALC_UPROBES, &mm->flags); |
689 | else if (first_uprobe) | 689 | else if (first_uprobe) |
690 | clear_bit(MMF_HAS_UPROBES, &mm->flags); | 690 | clear_bit(MMF_HAS_UPROBES, &mm->flags); |
691 | 691 | ||
692 | return ret; | 692 | return ret; |
693 | } | 693 | } |
694 | 694 | ||
695 | static void | 695 | static void |
696 | remove_breakpoint(struct uprobe *uprobe, struct mm_struct *mm, unsigned long vaddr) | 696 | remove_breakpoint(struct uprobe *uprobe, struct mm_struct *mm, unsigned long vaddr) |
697 | { | 697 | { |
698 | /* can happen if uprobe_register() fails */ | 698 | /* can happen if uprobe_register() fails */ |
699 | if (!test_bit(MMF_HAS_UPROBES, &mm->flags)) | 699 | if (!test_bit(MMF_HAS_UPROBES, &mm->flags)) |
700 | return; | 700 | return; |
701 | 701 | ||
702 | set_bit(MMF_RECALC_UPROBES, &mm->flags); | 702 | set_bit(MMF_RECALC_UPROBES, &mm->flags); |
703 | set_orig_insn(&uprobe->arch, mm, vaddr); | 703 | set_orig_insn(&uprobe->arch, mm, vaddr); |
704 | } | 704 | } |
705 | 705 | ||
706 | /* | 706 | /* |
707 | * There could be threads that have already hit the breakpoint. They | 707 | * There could be threads that have already hit the breakpoint. They |
708 | * will recheck the current insn and restart if find_uprobe() fails. | 708 | * will recheck the current insn and restart if find_uprobe() fails. |
709 | * See find_active_uprobe(). | 709 | * See find_active_uprobe(). |
710 | */ | 710 | */ |
711 | static void delete_uprobe(struct uprobe *uprobe) | 711 | static void delete_uprobe(struct uprobe *uprobe) |
712 | { | 712 | { |
713 | spin_lock(&uprobes_treelock); | 713 | spin_lock(&uprobes_treelock); |
714 | rb_erase(&uprobe->rb_node, &uprobes_tree); | 714 | rb_erase(&uprobe->rb_node, &uprobes_tree); |
715 | spin_unlock(&uprobes_treelock); | 715 | spin_unlock(&uprobes_treelock); |
716 | iput(uprobe->inode); | 716 | iput(uprobe->inode); |
717 | put_uprobe(uprobe); | 717 | put_uprobe(uprobe); |
718 | atomic_dec(&uprobe_events); | 718 | atomic_dec(&uprobe_events); |
719 | } | 719 | } |
720 | 720 | ||
721 | struct map_info { | 721 | struct map_info { |
722 | struct map_info *next; | 722 | struct map_info *next; |
723 | struct mm_struct *mm; | 723 | struct mm_struct *mm; |
724 | unsigned long vaddr; | 724 | unsigned long vaddr; |
725 | }; | 725 | }; |
726 | 726 | ||
727 | static inline struct map_info *free_map_info(struct map_info *info) | 727 | static inline struct map_info *free_map_info(struct map_info *info) |
728 | { | 728 | { |
729 | struct map_info *next = info->next; | 729 | struct map_info *next = info->next; |
730 | kfree(info); | 730 | kfree(info); |
731 | return next; | 731 | return next; |
732 | } | 732 | } |
733 | 733 | ||
734 | static struct map_info * | 734 | static struct map_info * |
735 | build_map_info(struct address_space *mapping, loff_t offset, bool is_register) | 735 | build_map_info(struct address_space *mapping, loff_t offset, bool is_register) |
736 | { | 736 | { |
737 | unsigned long pgoff = offset >> PAGE_SHIFT; | 737 | unsigned long pgoff = offset >> PAGE_SHIFT; |
738 | struct prio_tree_iter iter; | 738 | struct prio_tree_iter iter; |
739 | struct vm_area_struct *vma; | 739 | struct vm_area_struct *vma; |
740 | struct map_info *curr = NULL; | 740 | struct map_info *curr = NULL; |
741 | struct map_info *prev = NULL; | 741 | struct map_info *prev = NULL; |
742 | struct map_info *info; | 742 | struct map_info *info; |
743 | int more = 0; | 743 | int more = 0; |
744 | 744 | ||
745 | again: | 745 | again: |
746 | mutex_lock(&mapping->i_mmap_mutex); | 746 | mutex_lock(&mapping->i_mmap_mutex); |
747 | vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) { | 747 | vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) { |
748 | if (!valid_vma(vma, is_register)) | 748 | if (!valid_vma(vma, is_register)) |
749 | continue; | 749 | continue; |
750 | 750 | ||
751 | if (!prev && !more) { | 751 | if (!prev && !more) { |
752 | /* | 752 | /* |
753 | * Needs GFP_NOWAIT to avoid i_mmap_mutex recursion through | 753 | * Needs GFP_NOWAIT to avoid i_mmap_mutex recursion through |
754 | * reclaim. This is optimistic, no harm done if it fails. | 754 | * reclaim. This is optimistic, no harm done if it fails. |
755 | */ | 755 | */ |
756 | prev = kmalloc(sizeof(struct map_info), | 756 | prev = kmalloc(sizeof(struct map_info), |
757 | GFP_NOWAIT | __GFP_NOMEMALLOC | __GFP_NOWARN); | 757 | GFP_NOWAIT | __GFP_NOMEMALLOC | __GFP_NOWARN); |
758 | if (prev) | 758 | if (prev) |
759 | prev->next = NULL; | 759 | prev->next = NULL; |
760 | } | 760 | } |
761 | if (!prev) { | 761 | if (!prev) { |
762 | more++; | 762 | more++; |
763 | continue; | 763 | continue; |
764 | } | 764 | } |
765 | 765 | ||
766 | if (!atomic_inc_not_zero(&vma->vm_mm->mm_users)) | 766 | if (!atomic_inc_not_zero(&vma->vm_mm->mm_users)) |
767 | continue; | 767 | continue; |
768 | 768 | ||
769 | info = prev; | 769 | info = prev; |
770 | prev = prev->next; | 770 | prev = prev->next; |
771 | info->next = curr; | 771 | info->next = curr; |
772 | curr = info; | 772 | curr = info; |
773 | 773 | ||
774 | info->mm = vma->vm_mm; | 774 | info->mm = vma->vm_mm; |
775 | info->vaddr = offset_to_vaddr(vma, offset); | 775 | info->vaddr = offset_to_vaddr(vma, offset); |
776 | } | 776 | } |
777 | mutex_unlock(&mapping->i_mmap_mutex); | 777 | mutex_unlock(&mapping->i_mmap_mutex); |
778 | 778 | ||
779 | if (!more) | 779 | if (!more) |
780 | goto out; | 780 | goto out; |
781 | 781 | ||
782 | prev = curr; | 782 | prev = curr; |
783 | while (curr) { | 783 | while (curr) { |
784 | mmput(curr->mm); | 784 | mmput(curr->mm); |
785 | curr = curr->next; | 785 | curr = curr->next; |
786 | } | 786 | } |
787 | 787 | ||
788 | do { | 788 | do { |
789 | info = kmalloc(sizeof(struct map_info), GFP_KERNEL); | 789 | info = kmalloc(sizeof(struct map_info), GFP_KERNEL); |
790 | if (!info) { | 790 | if (!info) { |
791 | curr = ERR_PTR(-ENOMEM); | 791 | curr = ERR_PTR(-ENOMEM); |
792 | goto out; | 792 | goto out; |
793 | } | 793 | } |
794 | info->next = prev; | 794 | info->next = prev; |
795 | prev = info; | 795 | prev = info; |
796 | } while (--more); | 796 | } while (--more); |
797 | 797 | ||
798 | goto again; | 798 | goto again; |
799 | out: | 799 | out: |
800 | while (prev) | 800 | while (prev) |
801 | prev = free_map_info(prev); | 801 | prev = free_map_info(prev); |
802 | return curr; | 802 | return curr; |
803 | } | 803 | } |
804 | 804 | ||
805 | static int register_for_each_vma(struct uprobe *uprobe, bool is_register) | 805 | static int register_for_each_vma(struct uprobe *uprobe, bool is_register) |
806 | { | 806 | { |
807 | struct map_info *info; | 807 | struct map_info *info; |
808 | int err = 0; | 808 | int err = 0; |
809 | 809 | ||
810 | info = build_map_info(uprobe->inode->i_mapping, | 810 | info = build_map_info(uprobe->inode->i_mapping, |
811 | uprobe->offset, is_register); | 811 | uprobe->offset, is_register); |
812 | if (IS_ERR(info)) | 812 | if (IS_ERR(info)) |
813 | return PTR_ERR(info); | 813 | return PTR_ERR(info); |
814 | 814 | ||
815 | while (info) { | 815 | while (info) { |
816 | struct mm_struct *mm = info->mm; | 816 | struct mm_struct *mm = info->mm; |
817 | struct vm_area_struct *vma; | 817 | struct vm_area_struct *vma; |
818 | 818 | ||
819 | if (err) | 819 | if (err) |
820 | goto free; | 820 | goto free; |
821 | 821 | ||
822 | down_write(&mm->mmap_sem); | 822 | down_write(&mm->mmap_sem); |
823 | vma = find_vma(mm, info->vaddr); | 823 | vma = find_vma(mm, info->vaddr); |
824 | if (!vma || !valid_vma(vma, is_register) || | 824 | if (!vma || !valid_vma(vma, is_register) || |
825 | vma->vm_file->f_mapping->host != uprobe->inode) | 825 | vma->vm_file->f_mapping->host != uprobe->inode) |
826 | goto unlock; | 826 | goto unlock; |
827 | 827 | ||
828 | if (vma->vm_start > info->vaddr || | 828 | if (vma->vm_start > info->vaddr || |
829 | vaddr_to_offset(vma, info->vaddr) != uprobe->offset) | 829 | vaddr_to_offset(vma, info->vaddr) != uprobe->offset) |
830 | goto unlock; | 830 | goto unlock; |
831 | 831 | ||
832 | if (is_register) | 832 | if (is_register) |
833 | err = install_breakpoint(uprobe, mm, vma, info->vaddr); | 833 | err = install_breakpoint(uprobe, mm, vma, info->vaddr); |
834 | else | 834 | else |
835 | remove_breakpoint(uprobe, mm, info->vaddr); | 835 | remove_breakpoint(uprobe, mm, info->vaddr); |
836 | 836 | ||
837 | unlock: | 837 | unlock: |
838 | up_write(&mm->mmap_sem); | 838 | up_write(&mm->mmap_sem); |
839 | free: | 839 | free: |
840 | mmput(mm); | 840 | mmput(mm); |
841 | info = free_map_info(info); | 841 | info = free_map_info(info); |
842 | } | 842 | } |
843 | 843 | ||
844 | return err; | 844 | return err; |
845 | } | 845 | } |
846 | 846 | ||
847 | static int __uprobe_register(struct uprobe *uprobe) | 847 | static int __uprobe_register(struct uprobe *uprobe) |
848 | { | 848 | { |
849 | return register_for_each_vma(uprobe, true); | 849 | return register_for_each_vma(uprobe, true); |
850 | } | 850 | } |
851 | 851 | ||
852 | static void __uprobe_unregister(struct uprobe *uprobe) | 852 | static void __uprobe_unregister(struct uprobe *uprobe) |
853 | { | 853 | { |
854 | if (!register_for_each_vma(uprobe, false)) | 854 | if (!register_for_each_vma(uprobe, false)) |
855 | delete_uprobe(uprobe); | 855 | delete_uprobe(uprobe); |
856 | 856 | ||
857 | /* TODO : cant unregister? schedule a worker thread */ | 857 | /* TODO : cant unregister? schedule a worker thread */ |
858 | } | 858 | } |
859 | 859 | ||
860 | /* | 860 | /* |
861 | * uprobe_register - register a probe | 861 | * uprobe_register - register a probe |
862 | * @inode: the file in which the probe has to be placed. | 862 | * @inode: the file in which the probe has to be placed. |
863 | * @offset: offset from the start of the file. | 863 | * @offset: offset from the start of the file. |
864 | * @uc: information on howto handle the probe.. | 864 | * @uc: information on howto handle the probe.. |
865 | * | 865 | * |
866 | * Apart from the access refcount, uprobe_register() takes a creation | 866 | * Apart from the access refcount, uprobe_register() takes a creation |
867 | * refcount (thro alloc_uprobe) if and only if this @uprobe is getting | 867 | * refcount (thro alloc_uprobe) if and only if this @uprobe is getting |
868 | * inserted into the rbtree (i.e first consumer for a @inode:@offset | 868 | * inserted into the rbtree (i.e first consumer for a @inode:@offset |
869 | * tuple). Creation refcount stops uprobe_unregister from freeing the | 869 | * tuple). Creation refcount stops uprobe_unregister from freeing the |
870 | * @uprobe even before the register operation is complete. Creation | 870 | * @uprobe even before the register operation is complete. Creation |
871 | * refcount is released when the last @uc for the @uprobe | 871 | * refcount is released when the last @uc for the @uprobe |
872 | * unregisters. | 872 | * unregisters. |
873 | * | 873 | * |
874 | * Return errno if it cannot successully install probes | 874 | * Return errno if it cannot successully install probes |
875 | * else return 0 (success) | 875 | * else return 0 (success) |
876 | */ | 876 | */ |
877 | int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc) | 877 | int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc) |
878 | { | 878 | { |
879 | struct uprobe *uprobe; | 879 | struct uprobe *uprobe; |
880 | int ret; | 880 | int ret; |
881 | 881 | ||
882 | if (!inode || !uc || uc->next) | 882 | if (!inode || !uc || uc->next) |
883 | return -EINVAL; | 883 | return -EINVAL; |
884 | 884 | ||
885 | if (offset > i_size_read(inode)) | 885 | if (offset > i_size_read(inode)) |
886 | return -EINVAL; | 886 | return -EINVAL; |
887 | 887 | ||
888 | ret = 0; | 888 | ret = 0; |
889 | mutex_lock(uprobes_hash(inode)); | 889 | mutex_lock(uprobes_hash(inode)); |
890 | uprobe = alloc_uprobe(inode, offset); | 890 | uprobe = alloc_uprobe(inode, offset); |
891 | 891 | ||
892 | if (uprobe && !consumer_add(uprobe, uc)) { | 892 | if (uprobe && !consumer_add(uprobe, uc)) { |
893 | ret = __uprobe_register(uprobe); | 893 | ret = __uprobe_register(uprobe); |
894 | if (ret) { | 894 | if (ret) { |
895 | uprobe->consumers = NULL; | 895 | uprobe->consumers = NULL; |
896 | __uprobe_unregister(uprobe); | 896 | __uprobe_unregister(uprobe); |
897 | } else { | 897 | } else { |
898 | uprobe->flags |= UPROBE_RUN_HANDLER; | 898 | uprobe->flags |= UPROBE_RUN_HANDLER; |
899 | } | 899 | } |
900 | } | 900 | } |
901 | 901 | ||
902 | mutex_unlock(uprobes_hash(inode)); | 902 | mutex_unlock(uprobes_hash(inode)); |
903 | if (uprobe) | 903 | if (uprobe) |
904 | put_uprobe(uprobe); | 904 | put_uprobe(uprobe); |
905 | 905 | ||
906 | return ret; | 906 | return ret; |
907 | } | 907 | } |
908 | 908 | ||
909 | /* | 909 | /* |
910 | * uprobe_unregister - unregister a already registered probe. | 910 | * uprobe_unregister - unregister a already registered probe. |
911 | * @inode: the file in which the probe has to be removed. | 911 | * @inode: the file in which the probe has to be removed. |
912 | * @offset: offset from the start of the file. | 912 | * @offset: offset from the start of the file. |
913 | * @uc: identify which probe if multiple probes are colocated. | 913 | * @uc: identify which probe if multiple probes are colocated. |
914 | */ | 914 | */ |
915 | void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc) | 915 | void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc) |
916 | { | 916 | { |
917 | struct uprobe *uprobe; | 917 | struct uprobe *uprobe; |
918 | 918 | ||
919 | if (!inode || !uc) | 919 | if (!inode || !uc) |
920 | return; | 920 | return; |
921 | 921 | ||
922 | uprobe = find_uprobe(inode, offset); | 922 | uprobe = find_uprobe(inode, offset); |
923 | if (!uprobe) | 923 | if (!uprobe) |
924 | return; | 924 | return; |
925 | 925 | ||
926 | mutex_lock(uprobes_hash(inode)); | 926 | mutex_lock(uprobes_hash(inode)); |
927 | 927 | ||
928 | if (consumer_del(uprobe, uc)) { | 928 | if (consumer_del(uprobe, uc)) { |
929 | if (!uprobe->consumers) { | 929 | if (!uprobe->consumers) { |
930 | __uprobe_unregister(uprobe); | 930 | __uprobe_unregister(uprobe); |
931 | uprobe->flags &= ~UPROBE_RUN_HANDLER; | 931 | uprobe->flags &= ~UPROBE_RUN_HANDLER; |
932 | } | 932 | } |
933 | } | 933 | } |
934 | 934 | ||
935 | mutex_unlock(uprobes_hash(inode)); | 935 | mutex_unlock(uprobes_hash(inode)); |
936 | if (uprobe) | 936 | if (uprobe) |
937 | put_uprobe(uprobe); | 937 | put_uprobe(uprobe); |
938 | } | 938 | } |
939 | 939 | ||
940 | static struct rb_node * | 940 | static struct rb_node * |
941 | find_node_in_range(struct inode *inode, loff_t min, loff_t max) | 941 | find_node_in_range(struct inode *inode, loff_t min, loff_t max) |
942 | { | 942 | { |
943 | struct rb_node *n = uprobes_tree.rb_node; | 943 | struct rb_node *n = uprobes_tree.rb_node; |
944 | 944 | ||
945 | while (n) { | 945 | while (n) { |
946 | struct uprobe *u = rb_entry(n, struct uprobe, rb_node); | 946 | struct uprobe *u = rb_entry(n, struct uprobe, rb_node); |
947 | 947 | ||
948 | if (inode < u->inode) { | 948 | if (inode < u->inode) { |
949 | n = n->rb_left; | 949 | n = n->rb_left; |
950 | } else if (inode > u->inode) { | 950 | } else if (inode > u->inode) { |
951 | n = n->rb_right; | 951 | n = n->rb_right; |
952 | } else { | 952 | } else { |
953 | if (max < u->offset) | 953 | if (max < u->offset) |
954 | n = n->rb_left; | 954 | n = n->rb_left; |
955 | else if (min > u->offset) | 955 | else if (min > u->offset) |
956 | n = n->rb_right; | 956 | n = n->rb_right; |
957 | else | 957 | else |
958 | break; | 958 | break; |
959 | } | 959 | } |
960 | } | 960 | } |
961 | 961 | ||
962 | return n; | 962 | return n; |
963 | } | 963 | } |
964 | 964 | ||
965 | /* | 965 | /* |
966 | * For a given range in vma, build a list of probes that need to be inserted. | 966 | * For a given range in vma, build a list of probes that need to be inserted. |
967 | */ | 967 | */ |
968 | static void build_probe_list(struct inode *inode, | 968 | static void build_probe_list(struct inode *inode, |
969 | struct vm_area_struct *vma, | 969 | struct vm_area_struct *vma, |
970 | unsigned long start, unsigned long end, | 970 | unsigned long start, unsigned long end, |
971 | struct list_head *head) | 971 | struct list_head *head) |
972 | { | 972 | { |
973 | loff_t min, max; | 973 | loff_t min, max; |
974 | struct rb_node *n, *t; | 974 | struct rb_node *n, *t; |
975 | struct uprobe *u; | 975 | struct uprobe *u; |
976 | 976 | ||
977 | INIT_LIST_HEAD(head); | 977 | INIT_LIST_HEAD(head); |
978 | min = vaddr_to_offset(vma, start); | 978 | min = vaddr_to_offset(vma, start); |
979 | max = min + (end - start) - 1; | 979 | max = min + (end - start) - 1; |
980 | 980 | ||
981 | spin_lock(&uprobes_treelock); | 981 | spin_lock(&uprobes_treelock); |
982 | n = find_node_in_range(inode, min, max); | 982 | n = find_node_in_range(inode, min, max); |
983 | if (n) { | 983 | if (n) { |
984 | for (t = n; t; t = rb_prev(t)) { | 984 | for (t = n; t; t = rb_prev(t)) { |
985 | u = rb_entry(t, struct uprobe, rb_node); | 985 | u = rb_entry(t, struct uprobe, rb_node); |
986 | if (u->inode != inode || u->offset < min) | 986 | if (u->inode != inode || u->offset < min) |
987 | break; | 987 | break; |
988 | list_add(&u->pending_list, head); | 988 | list_add(&u->pending_list, head); |
989 | atomic_inc(&u->ref); | 989 | atomic_inc(&u->ref); |
990 | } | 990 | } |
991 | for (t = n; (t = rb_next(t)); ) { | 991 | for (t = n; (t = rb_next(t)); ) { |
992 | u = rb_entry(t, struct uprobe, rb_node); | 992 | u = rb_entry(t, struct uprobe, rb_node); |
993 | if (u->inode != inode || u->offset > max) | 993 | if (u->inode != inode || u->offset > max) |
994 | break; | 994 | break; |
995 | list_add(&u->pending_list, head); | 995 | list_add(&u->pending_list, head); |
996 | atomic_inc(&u->ref); | 996 | atomic_inc(&u->ref); |
997 | } | 997 | } |
998 | } | 998 | } |
999 | spin_unlock(&uprobes_treelock); | 999 | spin_unlock(&uprobes_treelock); |
1000 | } | 1000 | } |
1001 | 1001 | ||
1002 | /* | 1002 | /* |
1003 | * Called from mmap_region/vma_adjust with mm->mmap_sem acquired. | 1003 | * Called from mmap_region/vma_adjust with mm->mmap_sem acquired. |
1004 | * | 1004 | * |
1005 | * Currently we ignore all errors and always return 0, the callers | 1005 | * Currently we ignore all errors and always return 0, the callers |
1006 | * can't handle the failure anyway. | 1006 | * can't handle the failure anyway. |
1007 | */ | 1007 | */ |
1008 | int uprobe_mmap(struct vm_area_struct *vma) | 1008 | int uprobe_mmap(struct vm_area_struct *vma) |
1009 | { | 1009 | { |
1010 | struct list_head tmp_list; | 1010 | struct list_head tmp_list; |
1011 | struct uprobe *uprobe, *u; | 1011 | struct uprobe *uprobe, *u; |
1012 | struct inode *inode; | 1012 | struct inode *inode; |
1013 | 1013 | ||
1014 | if (!atomic_read(&uprobe_events) || !valid_vma(vma, true)) | 1014 | if (!atomic_read(&uprobe_events) || !valid_vma(vma, true)) |
1015 | return 0; | 1015 | return 0; |
1016 | 1016 | ||
1017 | inode = vma->vm_file->f_mapping->host; | 1017 | inode = vma->vm_file->f_mapping->host; |
1018 | if (!inode) | 1018 | if (!inode) |
1019 | return 0; | 1019 | return 0; |
1020 | 1020 | ||
1021 | mutex_lock(uprobes_mmap_hash(inode)); | 1021 | mutex_lock(uprobes_mmap_hash(inode)); |
1022 | build_probe_list(inode, vma, vma->vm_start, vma->vm_end, &tmp_list); | 1022 | build_probe_list(inode, vma, vma->vm_start, vma->vm_end, &tmp_list); |
1023 | 1023 | ||
1024 | list_for_each_entry_safe(uprobe, u, &tmp_list, pending_list) { | 1024 | list_for_each_entry_safe(uprobe, u, &tmp_list, pending_list) { |
1025 | if (!fatal_signal_pending(current)) { | 1025 | if (!fatal_signal_pending(current)) { |
1026 | unsigned long vaddr = offset_to_vaddr(vma, uprobe->offset); | 1026 | unsigned long vaddr = offset_to_vaddr(vma, uprobe->offset); |
1027 | install_breakpoint(uprobe, vma->vm_mm, vma, vaddr); | 1027 | install_breakpoint(uprobe, vma->vm_mm, vma, vaddr); |
1028 | } | 1028 | } |
1029 | put_uprobe(uprobe); | 1029 | put_uprobe(uprobe); |
1030 | } | 1030 | } |
1031 | mutex_unlock(uprobes_mmap_hash(inode)); | 1031 | mutex_unlock(uprobes_mmap_hash(inode)); |
1032 | 1032 | ||
1033 | return 0; | 1033 | return 0; |
1034 | } | 1034 | } |
1035 | 1035 | ||
1036 | static bool | 1036 | static bool |
1037 | vma_has_uprobes(struct vm_area_struct *vma, unsigned long start, unsigned long end) | 1037 | vma_has_uprobes(struct vm_area_struct *vma, unsigned long start, unsigned long end) |
1038 | { | 1038 | { |
1039 | loff_t min, max; | 1039 | loff_t min, max; |
1040 | struct inode *inode; | 1040 | struct inode *inode; |
1041 | struct rb_node *n; | 1041 | struct rb_node *n; |
1042 | 1042 | ||
1043 | inode = vma->vm_file->f_mapping->host; | 1043 | inode = vma->vm_file->f_mapping->host; |
1044 | 1044 | ||
1045 | min = vaddr_to_offset(vma, start); | 1045 | min = vaddr_to_offset(vma, start); |
1046 | max = min + (end - start) - 1; | 1046 | max = min + (end - start) - 1; |
1047 | 1047 | ||
1048 | spin_lock(&uprobes_treelock); | 1048 | spin_lock(&uprobes_treelock); |
1049 | n = find_node_in_range(inode, min, max); | 1049 | n = find_node_in_range(inode, min, max); |
1050 | spin_unlock(&uprobes_treelock); | 1050 | spin_unlock(&uprobes_treelock); |
1051 | 1051 | ||
1052 | return !!n; | 1052 | return !!n; |
1053 | } | 1053 | } |
1054 | 1054 | ||
1055 | /* | 1055 | /* |
1056 | * Called in context of a munmap of a vma. | 1056 | * Called in context of a munmap of a vma. |
1057 | */ | 1057 | */ |
1058 | void uprobe_munmap(struct vm_area_struct *vma, unsigned long start, unsigned long end) | 1058 | void uprobe_munmap(struct vm_area_struct *vma, unsigned long start, unsigned long end) |
1059 | { | 1059 | { |
1060 | if (!atomic_read(&uprobe_events) || !valid_vma(vma, false)) | 1060 | if (!atomic_read(&uprobe_events) || !valid_vma(vma, false)) |
1061 | return; | 1061 | return; |
1062 | 1062 | ||
1063 | if (!atomic_read(&vma->vm_mm->mm_users)) /* called by mmput() ? */ | 1063 | if (!atomic_read(&vma->vm_mm->mm_users)) /* called by mmput() ? */ |
1064 | return; | 1064 | return; |
1065 | 1065 | ||
1066 | if (!test_bit(MMF_HAS_UPROBES, &vma->vm_mm->flags) || | 1066 | if (!test_bit(MMF_HAS_UPROBES, &vma->vm_mm->flags) || |
1067 | test_bit(MMF_RECALC_UPROBES, &vma->vm_mm->flags)) | 1067 | test_bit(MMF_RECALC_UPROBES, &vma->vm_mm->flags)) |
1068 | return; | 1068 | return; |
1069 | 1069 | ||
1070 | if (vma_has_uprobes(vma, start, end)) | 1070 | if (vma_has_uprobes(vma, start, end)) |
1071 | set_bit(MMF_RECALC_UPROBES, &vma->vm_mm->flags); | 1071 | set_bit(MMF_RECALC_UPROBES, &vma->vm_mm->flags); |
1072 | } | 1072 | } |
1073 | 1073 | ||
1074 | /* Slot allocation for XOL */ | 1074 | /* Slot allocation for XOL */ |
1075 | static int xol_add_vma(struct xol_area *area) | 1075 | static int xol_add_vma(struct xol_area *area) |
1076 | { | 1076 | { |
1077 | struct mm_struct *mm; | 1077 | struct mm_struct *mm; |
1078 | int ret; | 1078 | int ret; |
1079 | 1079 | ||
1080 | area->page = alloc_page(GFP_HIGHUSER); | 1080 | area->page = alloc_page(GFP_HIGHUSER); |
1081 | if (!area->page) | 1081 | if (!area->page) |
1082 | return -ENOMEM; | 1082 | return -ENOMEM; |
1083 | 1083 | ||
1084 | ret = -EALREADY; | 1084 | ret = -EALREADY; |
1085 | mm = current->mm; | 1085 | mm = current->mm; |
1086 | 1086 | ||
1087 | down_write(&mm->mmap_sem); | 1087 | down_write(&mm->mmap_sem); |
1088 | if (mm->uprobes_state.xol_area) | 1088 | if (mm->uprobes_state.xol_area) |
1089 | goto fail; | 1089 | goto fail; |
1090 | 1090 | ||
1091 | ret = -ENOMEM; | 1091 | ret = -ENOMEM; |
1092 | 1092 | ||
1093 | /* Try to map as high as possible, this is only a hint. */ | 1093 | /* Try to map as high as possible, this is only a hint. */ |
1094 | area->vaddr = get_unmapped_area(NULL, TASK_SIZE - PAGE_SIZE, PAGE_SIZE, 0, 0); | 1094 | area->vaddr = get_unmapped_area(NULL, TASK_SIZE - PAGE_SIZE, PAGE_SIZE, 0, 0); |
1095 | if (area->vaddr & ~PAGE_MASK) { | 1095 | if (area->vaddr & ~PAGE_MASK) { |
1096 | ret = area->vaddr; | 1096 | ret = area->vaddr; |
1097 | goto fail; | 1097 | goto fail; |
1098 | } | 1098 | } |
1099 | 1099 | ||
1100 | ret = install_special_mapping(mm, area->vaddr, PAGE_SIZE, | 1100 | ret = install_special_mapping(mm, area->vaddr, PAGE_SIZE, |
1101 | VM_EXEC|VM_MAYEXEC|VM_DONTCOPY|VM_IO, &area->page); | 1101 | VM_EXEC|VM_MAYEXEC|VM_DONTCOPY|VM_IO, &area->page); |
1102 | if (ret) | 1102 | if (ret) |
1103 | goto fail; | 1103 | goto fail; |
1104 | 1104 | ||
1105 | smp_wmb(); /* pairs with get_xol_area() */ | 1105 | smp_wmb(); /* pairs with get_xol_area() */ |
1106 | mm->uprobes_state.xol_area = area; | 1106 | mm->uprobes_state.xol_area = area; |
1107 | ret = 0; | 1107 | ret = 0; |
1108 | 1108 | ||
1109 | fail: | 1109 | fail: |
1110 | up_write(&mm->mmap_sem); | 1110 | up_write(&mm->mmap_sem); |
1111 | if (ret) | 1111 | if (ret) |
1112 | __free_page(area->page); | 1112 | __free_page(area->page); |
1113 | 1113 | ||
1114 | return ret; | 1114 | return ret; |
1115 | } | 1115 | } |
1116 | 1116 | ||
1117 | static struct xol_area *get_xol_area(struct mm_struct *mm) | 1117 | static struct xol_area *get_xol_area(struct mm_struct *mm) |
1118 | { | 1118 | { |
1119 | struct xol_area *area; | 1119 | struct xol_area *area; |
1120 | 1120 | ||
1121 | area = mm->uprobes_state.xol_area; | 1121 | area = mm->uprobes_state.xol_area; |
1122 | smp_read_barrier_depends(); /* pairs with wmb in xol_add_vma() */ | 1122 | smp_read_barrier_depends(); /* pairs with wmb in xol_add_vma() */ |
1123 | 1123 | ||
1124 | return area; | 1124 | return area; |
1125 | } | 1125 | } |
1126 | 1126 | ||
1127 | /* | 1127 | /* |
1128 | * xol_alloc_area - Allocate process's xol_area. | 1128 | * xol_alloc_area - Allocate process's xol_area. |
1129 | * This area will be used for storing instructions for execution out of | 1129 | * This area will be used for storing instructions for execution out of |
1130 | * line. | 1130 | * line. |
1131 | * | 1131 | * |
1132 | * Returns the allocated area or NULL. | 1132 | * Returns the allocated area or NULL. |
1133 | */ | 1133 | */ |
1134 | static struct xol_area *xol_alloc_area(void) | 1134 | static struct xol_area *xol_alloc_area(void) |
1135 | { | 1135 | { |
1136 | struct xol_area *area; | 1136 | struct xol_area *area; |
1137 | 1137 | ||
1138 | area = kzalloc(sizeof(*area), GFP_KERNEL); | 1138 | area = kzalloc(sizeof(*area), GFP_KERNEL); |
1139 | if (unlikely(!area)) | 1139 | if (unlikely(!area)) |
1140 | return NULL; | 1140 | return NULL; |
1141 | 1141 | ||
1142 | area->bitmap = kzalloc(BITS_TO_LONGS(UINSNS_PER_PAGE) * sizeof(long), GFP_KERNEL); | 1142 | area->bitmap = kzalloc(BITS_TO_LONGS(UINSNS_PER_PAGE) * sizeof(long), GFP_KERNEL); |
1143 | 1143 | ||
1144 | if (!area->bitmap) | 1144 | if (!area->bitmap) |
1145 | goto fail; | 1145 | goto fail; |
1146 | 1146 | ||
1147 | init_waitqueue_head(&area->wq); | 1147 | init_waitqueue_head(&area->wq); |
1148 | if (!xol_add_vma(area)) | 1148 | if (!xol_add_vma(area)) |
1149 | return area; | 1149 | return area; |
1150 | 1150 | ||
1151 | fail: | 1151 | fail: |
1152 | kfree(area->bitmap); | 1152 | kfree(area->bitmap); |
1153 | kfree(area); | 1153 | kfree(area); |
1154 | 1154 | ||
1155 | return get_xol_area(current->mm); | 1155 | return get_xol_area(current->mm); |
1156 | } | 1156 | } |
1157 | 1157 | ||
1158 | /* | 1158 | /* |
1159 | * uprobe_clear_state - Free the area allocated for slots. | 1159 | * uprobe_clear_state - Free the area allocated for slots. |
1160 | */ | 1160 | */ |
1161 | void uprobe_clear_state(struct mm_struct *mm) | 1161 | void uprobe_clear_state(struct mm_struct *mm) |
1162 | { | 1162 | { |
1163 | struct xol_area *area = mm->uprobes_state.xol_area; | 1163 | struct xol_area *area = mm->uprobes_state.xol_area; |
1164 | 1164 | ||
1165 | if (!area) | 1165 | if (!area) |
1166 | return; | 1166 | return; |
1167 | 1167 | ||
1168 | put_page(area->page); | 1168 | put_page(area->page); |
1169 | kfree(area->bitmap); | 1169 | kfree(area->bitmap); |
1170 | kfree(area); | 1170 | kfree(area); |
1171 | } | 1171 | } |
1172 | 1172 | ||
1173 | void uprobe_dup_mmap(struct mm_struct *oldmm, struct mm_struct *newmm) | 1173 | void uprobe_dup_mmap(struct mm_struct *oldmm, struct mm_struct *newmm) |
1174 | { | 1174 | { |
1175 | newmm->uprobes_state.xol_area = NULL; | 1175 | newmm->uprobes_state.xol_area = NULL; |
1176 | 1176 | ||
1177 | if (test_bit(MMF_HAS_UPROBES, &oldmm->flags)) { | 1177 | if (test_bit(MMF_HAS_UPROBES, &oldmm->flags)) { |
1178 | set_bit(MMF_HAS_UPROBES, &newmm->flags); | 1178 | set_bit(MMF_HAS_UPROBES, &newmm->flags); |
1179 | /* unconditionally, dup_mmap() skips VM_DONTCOPY vmas */ | 1179 | /* unconditionally, dup_mmap() skips VM_DONTCOPY vmas */ |
1180 | set_bit(MMF_RECALC_UPROBES, &newmm->flags); | 1180 | set_bit(MMF_RECALC_UPROBES, &newmm->flags); |
1181 | } | 1181 | } |
1182 | } | 1182 | } |
1183 | 1183 | ||
1184 | /* | 1184 | /* |
1185 | * - search for a free slot. | 1185 | * - search for a free slot. |
1186 | */ | 1186 | */ |
1187 | static unsigned long xol_take_insn_slot(struct xol_area *area) | 1187 | static unsigned long xol_take_insn_slot(struct xol_area *area) |
1188 | { | 1188 | { |
1189 | unsigned long slot_addr; | 1189 | unsigned long slot_addr; |
1190 | int slot_nr; | 1190 | int slot_nr; |
1191 | 1191 | ||
1192 | do { | 1192 | do { |
1193 | slot_nr = find_first_zero_bit(area->bitmap, UINSNS_PER_PAGE); | 1193 | slot_nr = find_first_zero_bit(area->bitmap, UINSNS_PER_PAGE); |
1194 | if (slot_nr < UINSNS_PER_PAGE) { | 1194 | if (slot_nr < UINSNS_PER_PAGE) { |
1195 | if (!test_and_set_bit(slot_nr, area->bitmap)) | 1195 | if (!test_and_set_bit(slot_nr, area->bitmap)) |
1196 | break; | 1196 | break; |
1197 | 1197 | ||
1198 | slot_nr = UINSNS_PER_PAGE; | 1198 | slot_nr = UINSNS_PER_PAGE; |
1199 | continue; | 1199 | continue; |
1200 | } | 1200 | } |
1201 | wait_event(area->wq, (atomic_read(&area->slot_count) < UINSNS_PER_PAGE)); | 1201 | wait_event(area->wq, (atomic_read(&area->slot_count) < UINSNS_PER_PAGE)); |
1202 | } while (slot_nr >= UINSNS_PER_PAGE); | 1202 | } while (slot_nr >= UINSNS_PER_PAGE); |
1203 | 1203 | ||
1204 | slot_addr = area->vaddr + (slot_nr * UPROBE_XOL_SLOT_BYTES); | 1204 | slot_addr = area->vaddr + (slot_nr * UPROBE_XOL_SLOT_BYTES); |
1205 | atomic_inc(&area->slot_count); | 1205 | atomic_inc(&area->slot_count); |
1206 | 1206 | ||
1207 | return slot_addr; | 1207 | return slot_addr; |
1208 | } | 1208 | } |
1209 | 1209 | ||
1210 | /* | 1210 | /* |
1211 | * xol_get_insn_slot - If was not allocated a slot, then | 1211 | * xol_get_insn_slot - If was not allocated a slot, then |
1212 | * allocate a slot. | 1212 | * allocate a slot. |
1213 | * Returns the allocated slot address or 0. | 1213 | * Returns the allocated slot address or 0. |
1214 | */ | 1214 | */ |
1215 | static unsigned long xol_get_insn_slot(struct uprobe *uprobe, unsigned long slot_addr) | 1215 | static unsigned long xol_get_insn_slot(struct uprobe *uprobe, unsigned long slot_addr) |
1216 | { | 1216 | { |
1217 | struct xol_area *area; | 1217 | struct xol_area *area; |
1218 | unsigned long offset; | 1218 | unsigned long offset; |
1219 | void *vaddr; | 1219 | void *vaddr; |
1220 | 1220 | ||
1221 | area = get_xol_area(current->mm); | 1221 | area = get_xol_area(current->mm); |
1222 | if (!area) { | 1222 | if (!area) { |
1223 | area = xol_alloc_area(); | 1223 | area = xol_alloc_area(); |
1224 | if (!area) | 1224 | if (!area) |
1225 | return 0; | 1225 | return 0; |
1226 | } | 1226 | } |
1227 | current->utask->xol_vaddr = xol_take_insn_slot(area); | 1227 | current->utask->xol_vaddr = xol_take_insn_slot(area); |
1228 | 1228 | ||
1229 | /* | 1229 | /* |
1230 | * Initialize the slot if xol_vaddr points to valid | 1230 | * Initialize the slot if xol_vaddr points to valid |
1231 | * instruction slot. | 1231 | * instruction slot. |
1232 | */ | 1232 | */ |
1233 | if (unlikely(!current->utask->xol_vaddr)) | 1233 | if (unlikely(!current->utask->xol_vaddr)) |
1234 | return 0; | 1234 | return 0; |
1235 | 1235 | ||
1236 | current->utask->vaddr = slot_addr; | 1236 | current->utask->vaddr = slot_addr; |
1237 | offset = current->utask->xol_vaddr & ~PAGE_MASK; | 1237 | offset = current->utask->xol_vaddr & ~PAGE_MASK; |
1238 | vaddr = kmap_atomic(area->page); | 1238 | vaddr = kmap_atomic(area->page); |
1239 | memcpy(vaddr + offset, uprobe->arch.insn, MAX_UINSN_BYTES); | 1239 | memcpy(vaddr + offset, uprobe->arch.insn, MAX_UINSN_BYTES); |
1240 | kunmap_atomic(vaddr); | 1240 | kunmap_atomic(vaddr); |
1241 | 1241 | ||
1242 | return current->utask->xol_vaddr; | 1242 | return current->utask->xol_vaddr; |
1243 | } | 1243 | } |
1244 | 1244 | ||
1245 | /* | 1245 | /* |
1246 | * xol_free_insn_slot - If slot was earlier allocated by | 1246 | * xol_free_insn_slot - If slot was earlier allocated by |
1247 | * @xol_get_insn_slot(), make the slot available for | 1247 | * @xol_get_insn_slot(), make the slot available for |
1248 | * subsequent requests. | 1248 | * subsequent requests. |
1249 | */ | 1249 | */ |
1250 | static void xol_free_insn_slot(struct task_struct *tsk) | 1250 | static void xol_free_insn_slot(struct task_struct *tsk) |
1251 | { | 1251 | { |
1252 | struct xol_area *area; | 1252 | struct xol_area *area; |
1253 | unsigned long vma_end; | 1253 | unsigned long vma_end; |
1254 | unsigned long slot_addr; | 1254 | unsigned long slot_addr; |
1255 | 1255 | ||
1256 | if (!tsk->mm || !tsk->mm->uprobes_state.xol_area || !tsk->utask) | 1256 | if (!tsk->mm || !tsk->mm->uprobes_state.xol_area || !tsk->utask) |
1257 | return; | 1257 | return; |
1258 | 1258 | ||
1259 | slot_addr = tsk->utask->xol_vaddr; | 1259 | slot_addr = tsk->utask->xol_vaddr; |
1260 | 1260 | ||
1261 | if (unlikely(!slot_addr || IS_ERR_VALUE(slot_addr))) | 1261 | if (unlikely(!slot_addr || IS_ERR_VALUE(slot_addr))) |
1262 | return; | 1262 | return; |
1263 | 1263 | ||
1264 | area = tsk->mm->uprobes_state.xol_area; | 1264 | area = tsk->mm->uprobes_state.xol_area; |
1265 | vma_end = area->vaddr + PAGE_SIZE; | 1265 | vma_end = area->vaddr + PAGE_SIZE; |
1266 | if (area->vaddr <= slot_addr && slot_addr < vma_end) { | 1266 | if (area->vaddr <= slot_addr && slot_addr < vma_end) { |
1267 | unsigned long offset; | 1267 | unsigned long offset; |
1268 | int slot_nr; | 1268 | int slot_nr; |
1269 | 1269 | ||
1270 | offset = slot_addr - area->vaddr; | 1270 | offset = slot_addr - area->vaddr; |
1271 | slot_nr = offset / UPROBE_XOL_SLOT_BYTES; | 1271 | slot_nr = offset / UPROBE_XOL_SLOT_BYTES; |
1272 | if (slot_nr >= UINSNS_PER_PAGE) | 1272 | if (slot_nr >= UINSNS_PER_PAGE) |
1273 | return; | 1273 | return; |
1274 | 1274 | ||
1275 | clear_bit(slot_nr, area->bitmap); | 1275 | clear_bit(slot_nr, area->bitmap); |
1276 | atomic_dec(&area->slot_count); | 1276 | atomic_dec(&area->slot_count); |
1277 | if (waitqueue_active(&area->wq)) | 1277 | if (waitqueue_active(&area->wq)) |
1278 | wake_up(&area->wq); | 1278 | wake_up(&area->wq); |
1279 | 1279 | ||
1280 | tsk->utask->xol_vaddr = 0; | 1280 | tsk->utask->xol_vaddr = 0; |
1281 | } | 1281 | } |
1282 | } | 1282 | } |
1283 | 1283 | ||
1284 | /** | 1284 | /** |
1285 | * uprobe_get_swbp_addr - compute address of swbp given post-swbp regs | 1285 | * uprobe_get_swbp_addr - compute address of swbp given post-swbp regs |
1286 | * @regs: Reflects the saved state of the task after it has hit a breakpoint | 1286 | * @regs: Reflects the saved state of the task after it has hit a breakpoint |
1287 | * instruction. | 1287 | * instruction. |
1288 | * Return the address of the breakpoint instruction. | 1288 | * Return the address of the breakpoint instruction. |
1289 | */ | 1289 | */ |
1290 | unsigned long __weak uprobe_get_swbp_addr(struct pt_regs *regs) | 1290 | unsigned long __weak uprobe_get_swbp_addr(struct pt_regs *regs) |
1291 | { | 1291 | { |
1292 | return instruction_pointer(regs) - UPROBE_SWBP_INSN_SIZE; | 1292 | return instruction_pointer(regs) - UPROBE_SWBP_INSN_SIZE; |
1293 | } | 1293 | } |
1294 | 1294 | ||
1295 | /* | 1295 | /* |
1296 | * Called with no locks held. | 1296 | * Called with no locks held. |
1297 | * Called in context of a exiting or a exec-ing thread. | 1297 | * Called in context of a exiting or a exec-ing thread. |
1298 | */ | 1298 | */ |
1299 | void uprobe_free_utask(struct task_struct *t) | 1299 | void uprobe_free_utask(struct task_struct *t) |
1300 | { | 1300 | { |
1301 | struct uprobe_task *utask = t->utask; | 1301 | struct uprobe_task *utask = t->utask; |
1302 | 1302 | ||
1303 | if (!utask) | 1303 | if (!utask) |
1304 | return; | 1304 | return; |
1305 | 1305 | ||
1306 | if (utask->active_uprobe) | 1306 | if (utask->active_uprobe) |
1307 | put_uprobe(utask->active_uprobe); | 1307 | put_uprobe(utask->active_uprobe); |
1308 | 1308 | ||
1309 | xol_free_insn_slot(t); | 1309 | xol_free_insn_slot(t); |
1310 | kfree(utask); | 1310 | kfree(utask); |
1311 | t->utask = NULL; | 1311 | t->utask = NULL; |
1312 | } | 1312 | } |
1313 | 1313 | ||
1314 | /* | 1314 | /* |
1315 | * Called in context of a new clone/fork from copy_process. | 1315 | * Called in context of a new clone/fork from copy_process. |
1316 | */ | 1316 | */ |
1317 | void uprobe_copy_process(struct task_struct *t) | 1317 | void uprobe_copy_process(struct task_struct *t) |
1318 | { | 1318 | { |
1319 | t->utask = NULL; | 1319 | t->utask = NULL; |
1320 | } | 1320 | } |
1321 | 1321 | ||
1322 | /* | 1322 | /* |
1323 | * Allocate a uprobe_task object for the task. | 1323 | * Allocate a uprobe_task object for the task. |
1324 | * Called when the thread hits a breakpoint for the first time. | 1324 | * Called when the thread hits a breakpoint for the first time. |
1325 | * | 1325 | * |
1326 | * Returns: | 1326 | * Returns: |
1327 | * - pointer to new uprobe_task on success | 1327 | * - pointer to new uprobe_task on success |
1328 | * - NULL otherwise | 1328 | * - NULL otherwise |
1329 | */ | 1329 | */ |
1330 | static struct uprobe_task *add_utask(void) | 1330 | static struct uprobe_task *add_utask(void) |
1331 | { | 1331 | { |
1332 | struct uprobe_task *utask; | 1332 | struct uprobe_task *utask; |
1333 | 1333 | ||
1334 | utask = kzalloc(sizeof *utask, GFP_KERNEL); | 1334 | utask = kzalloc(sizeof *utask, GFP_KERNEL); |
1335 | if (unlikely(!utask)) | 1335 | if (unlikely(!utask)) |
1336 | return NULL; | 1336 | return NULL; |
1337 | 1337 | ||
1338 | current->utask = utask; | 1338 | current->utask = utask; |
1339 | return utask; | 1339 | return utask; |
1340 | } | 1340 | } |
1341 | 1341 | ||
1342 | /* Prepare to single-step probed instruction out of line. */ | 1342 | /* Prepare to single-step probed instruction out of line. */ |
1343 | static int | 1343 | static int |
1344 | pre_ssout(struct uprobe *uprobe, struct pt_regs *regs, unsigned long vaddr) | 1344 | pre_ssout(struct uprobe *uprobe, struct pt_regs *regs, unsigned long vaddr) |
1345 | { | 1345 | { |
1346 | if (xol_get_insn_slot(uprobe, vaddr) && !arch_uprobe_pre_xol(&uprobe->arch, regs)) | 1346 | if (xol_get_insn_slot(uprobe, vaddr) && !arch_uprobe_pre_xol(&uprobe->arch, regs)) |
1347 | return 0; | 1347 | return 0; |
1348 | 1348 | ||
1349 | return -EFAULT; | 1349 | return -EFAULT; |
1350 | } | 1350 | } |
1351 | 1351 | ||
1352 | /* | 1352 | /* |
1353 | * If we are singlestepping, then ensure this thread is not connected to | 1353 | * If we are singlestepping, then ensure this thread is not connected to |
1354 | * non-fatal signals until completion of singlestep. When xol insn itself | 1354 | * non-fatal signals until completion of singlestep. When xol insn itself |
1355 | * triggers the signal, restart the original insn even if the task is | 1355 | * triggers the signal, restart the original insn even if the task is |
1356 | * already SIGKILL'ed (since coredump should report the correct ip). This | 1356 | * already SIGKILL'ed (since coredump should report the correct ip). This |
1357 | * is even more important if the task has a handler for SIGSEGV/etc, The | 1357 | * is even more important if the task has a handler for SIGSEGV/etc, The |
1358 | * _same_ instruction should be repeated again after return from the signal | 1358 | * _same_ instruction should be repeated again after return from the signal |
1359 | * handler, and SSTEP can never finish in this case. | 1359 | * handler, and SSTEP can never finish in this case. |
1360 | */ | 1360 | */ |
1361 | bool uprobe_deny_signal(void) | 1361 | bool uprobe_deny_signal(void) |
1362 | { | 1362 | { |
1363 | struct task_struct *t = current; | 1363 | struct task_struct *t = current; |
1364 | struct uprobe_task *utask = t->utask; | 1364 | struct uprobe_task *utask = t->utask; |
1365 | 1365 | ||
1366 | if (likely(!utask || !utask->active_uprobe)) | 1366 | if (likely(!utask || !utask->active_uprobe)) |
1367 | return false; | 1367 | return false; |
1368 | 1368 | ||
1369 | WARN_ON_ONCE(utask->state != UTASK_SSTEP); | 1369 | WARN_ON_ONCE(utask->state != UTASK_SSTEP); |
1370 | 1370 | ||
1371 | if (signal_pending(t)) { | 1371 | if (signal_pending(t)) { |
1372 | spin_lock_irq(&t->sighand->siglock); | 1372 | spin_lock_irq(&t->sighand->siglock); |
1373 | clear_tsk_thread_flag(t, TIF_SIGPENDING); | 1373 | clear_tsk_thread_flag(t, TIF_SIGPENDING); |
1374 | spin_unlock_irq(&t->sighand->siglock); | 1374 | spin_unlock_irq(&t->sighand->siglock); |
1375 | 1375 | ||
1376 | if (__fatal_signal_pending(t) || arch_uprobe_xol_was_trapped(t)) { | 1376 | if (__fatal_signal_pending(t) || arch_uprobe_xol_was_trapped(t)) { |
1377 | utask->state = UTASK_SSTEP_TRAPPED; | 1377 | utask->state = UTASK_SSTEP_TRAPPED; |
1378 | set_tsk_thread_flag(t, TIF_UPROBE); | 1378 | set_tsk_thread_flag(t, TIF_UPROBE); |
1379 | set_tsk_thread_flag(t, TIF_NOTIFY_RESUME); | 1379 | set_tsk_thread_flag(t, TIF_NOTIFY_RESUME); |
1380 | } | 1380 | } |
1381 | } | 1381 | } |
1382 | 1382 | ||
1383 | return true; | 1383 | return true; |
1384 | } | 1384 | } |
1385 | 1385 | ||
1386 | /* | 1386 | /* |
1387 | * Avoid singlestepping the original instruction if the original instruction | 1387 | * Avoid singlestepping the original instruction if the original instruction |
1388 | * is a NOP or can be emulated. | 1388 | * is a NOP or can be emulated. |
1389 | */ | 1389 | */ |
1390 | static bool can_skip_sstep(struct uprobe *uprobe, struct pt_regs *regs) | 1390 | static bool can_skip_sstep(struct uprobe *uprobe, struct pt_regs *regs) |
1391 | { | 1391 | { |
1392 | if (uprobe->flags & UPROBE_SKIP_SSTEP) { | 1392 | if (uprobe->flags & UPROBE_SKIP_SSTEP) { |
1393 | if (arch_uprobe_skip_sstep(&uprobe->arch, regs)) | 1393 | if (arch_uprobe_skip_sstep(&uprobe->arch, regs)) |
1394 | return true; | 1394 | return true; |
1395 | uprobe->flags &= ~UPROBE_SKIP_SSTEP; | 1395 | uprobe->flags &= ~UPROBE_SKIP_SSTEP; |
1396 | } | 1396 | } |
1397 | return false; | 1397 | return false; |
1398 | } | 1398 | } |
1399 | 1399 | ||
1400 | static void mmf_recalc_uprobes(struct mm_struct *mm) | 1400 | static void mmf_recalc_uprobes(struct mm_struct *mm) |
1401 | { | 1401 | { |
1402 | struct vm_area_struct *vma; | 1402 | struct vm_area_struct *vma; |
1403 | 1403 | ||
1404 | for (vma = mm->mmap; vma; vma = vma->vm_next) { | 1404 | for (vma = mm->mmap; vma; vma = vma->vm_next) { |
1405 | if (!valid_vma(vma, false)) | 1405 | if (!valid_vma(vma, false)) |
1406 | continue; | 1406 | continue; |
1407 | /* | 1407 | /* |
1408 | * This is not strictly accurate, we can race with | 1408 | * This is not strictly accurate, we can race with |
1409 | * uprobe_unregister() and see the already removed | 1409 | * uprobe_unregister() and see the already removed |
1410 | * uprobe if delete_uprobe() was not yet called. | 1410 | * uprobe if delete_uprobe() was not yet called. |
1411 | */ | 1411 | */ |
1412 | if (vma_has_uprobes(vma, vma->vm_start, vma->vm_end)) | 1412 | if (vma_has_uprobes(vma, vma->vm_start, vma->vm_end)) |
1413 | return; | 1413 | return; |
1414 | } | 1414 | } |
1415 | 1415 | ||
1416 | clear_bit(MMF_HAS_UPROBES, &mm->flags); | 1416 | clear_bit(MMF_HAS_UPROBES, &mm->flags); |
1417 | } | 1417 | } |
1418 | 1418 | ||
1419 | static struct uprobe *find_active_uprobe(unsigned long bp_vaddr, int *is_swbp) | 1419 | static struct uprobe *find_active_uprobe(unsigned long bp_vaddr, int *is_swbp) |
1420 | { | 1420 | { |
1421 | struct mm_struct *mm = current->mm; | 1421 | struct mm_struct *mm = current->mm; |
1422 | struct uprobe *uprobe = NULL; | 1422 | struct uprobe *uprobe = NULL; |
1423 | struct vm_area_struct *vma; | 1423 | struct vm_area_struct *vma; |
1424 | 1424 | ||
1425 | down_read(&mm->mmap_sem); | 1425 | down_read(&mm->mmap_sem); |
1426 | vma = find_vma(mm, bp_vaddr); | 1426 | vma = find_vma(mm, bp_vaddr); |
1427 | if (vma && vma->vm_start <= bp_vaddr) { | 1427 | if (vma && vma->vm_start <= bp_vaddr) { |
1428 | if (valid_vma(vma, false)) { | 1428 | if (valid_vma(vma, false)) { |
1429 | struct inode *inode = vma->vm_file->f_mapping->host; | 1429 | struct inode *inode = vma->vm_file->f_mapping->host; |
1430 | loff_t offset = vaddr_to_offset(vma, bp_vaddr); | 1430 | loff_t offset = vaddr_to_offset(vma, bp_vaddr); |
1431 | 1431 | ||
1432 | uprobe = find_uprobe(inode, offset); | 1432 | uprobe = find_uprobe(inode, offset); |
1433 | } | 1433 | } |
1434 | 1434 | ||
1435 | if (!uprobe) | 1435 | if (!uprobe) |
1436 | *is_swbp = is_swbp_at_addr(mm, bp_vaddr); | 1436 | *is_swbp = is_swbp_at_addr(mm, bp_vaddr); |
1437 | } else { | 1437 | } else { |
1438 | *is_swbp = -EFAULT; | 1438 | *is_swbp = -EFAULT; |
1439 | } | 1439 | } |
1440 | 1440 | ||
1441 | if (!uprobe && test_and_clear_bit(MMF_RECALC_UPROBES, &mm->flags)) | 1441 | if (!uprobe && test_and_clear_bit(MMF_RECALC_UPROBES, &mm->flags)) |
1442 | mmf_recalc_uprobes(mm); | 1442 | mmf_recalc_uprobes(mm); |
1443 | up_read(&mm->mmap_sem); | 1443 | up_read(&mm->mmap_sem); |
1444 | 1444 | ||
1445 | return uprobe; | 1445 | return uprobe; |
1446 | } | 1446 | } |
1447 | 1447 | ||
1448 | void __weak arch_uprobe_enable_step(struct arch_uprobe *arch) | 1448 | void __weak arch_uprobe_enable_step(struct arch_uprobe *arch) |
1449 | { | 1449 | { |
1450 | user_enable_single_step(current); | 1450 | user_enable_single_step(current); |
1451 | } | 1451 | } |
1452 | 1452 | ||
1453 | void __weak arch_uprobe_disable_step(struct arch_uprobe *arch) | 1453 | void __weak arch_uprobe_disable_step(struct arch_uprobe *arch) |
1454 | { | 1454 | { |
1455 | user_disable_single_step(current); | 1455 | user_disable_single_step(current); |
1456 | } | 1456 | } |
1457 | 1457 | ||
1458 | /* | 1458 | /* |
1459 | * Run handler and ask thread to singlestep. | 1459 | * Run handler and ask thread to singlestep. |
1460 | * Ensure all non-fatal signals cannot interrupt thread while it singlesteps. | 1460 | * Ensure all non-fatal signals cannot interrupt thread while it singlesteps. |
1461 | */ | 1461 | */ |
1462 | static void handle_swbp(struct pt_regs *regs) | 1462 | static void handle_swbp(struct pt_regs *regs) |
1463 | { | 1463 | { |
1464 | struct uprobe_task *utask; | 1464 | struct uprobe_task *utask; |
1465 | struct uprobe *uprobe; | 1465 | struct uprobe *uprobe; |
1466 | unsigned long bp_vaddr; | 1466 | unsigned long bp_vaddr; |
1467 | int uninitialized_var(is_swbp); | 1467 | int uninitialized_var(is_swbp); |
1468 | 1468 | ||
1469 | bp_vaddr = uprobe_get_swbp_addr(regs); | 1469 | bp_vaddr = uprobe_get_swbp_addr(regs); |
1470 | uprobe = find_active_uprobe(bp_vaddr, &is_swbp); | 1470 | uprobe = find_active_uprobe(bp_vaddr, &is_swbp); |
1471 | 1471 | ||
1472 | if (!uprobe) { | 1472 | if (!uprobe) { |
1473 | if (is_swbp > 0) { | 1473 | if (is_swbp > 0) { |
1474 | /* No matching uprobe; signal SIGTRAP. */ | 1474 | /* No matching uprobe; signal SIGTRAP. */ |
1475 | send_sig(SIGTRAP, current, 0); | 1475 | send_sig(SIGTRAP, current, 0); |
1476 | } else { | 1476 | } else { |
1477 | /* | 1477 | /* |
1478 | * Either we raced with uprobe_unregister() or we can't | 1478 | * Either we raced with uprobe_unregister() or we can't |
1479 | * access this memory. The latter is only possible if | 1479 | * access this memory. The latter is only possible if |
1480 | * another thread plays with our ->mm. In both cases | 1480 | * another thread plays with our ->mm. In both cases |
1481 | * we can simply restart. If this vma was unmapped we | 1481 | * we can simply restart. If this vma was unmapped we |
1482 | * can pretend this insn was not executed yet and get | 1482 | * can pretend this insn was not executed yet and get |
1483 | * the (correct) SIGSEGV after restart. | 1483 | * the (correct) SIGSEGV after restart. |
1484 | */ | 1484 | */ |
1485 | instruction_pointer_set(regs, bp_vaddr); | 1485 | instruction_pointer_set(regs, bp_vaddr); |
1486 | } | 1486 | } |
1487 | return; | 1487 | return; |
1488 | } | 1488 | } |
1489 | 1489 | ||
1490 | utask = current->utask; | 1490 | utask = current->utask; |
1491 | if (!utask) { | 1491 | if (!utask) { |
1492 | utask = add_utask(); | 1492 | utask = add_utask(); |
1493 | /* Cannot allocate; re-execute the instruction. */ | 1493 | /* Cannot allocate; re-execute the instruction. */ |
1494 | if (!utask) | 1494 | if (!utask) |
1495 | goto restart; | 1495 | goto restart; |
1496 | } | 1496 | } |
1497 | 1497 | ||
1498 | handler_chain(uprobe, regs); | 1498 | handler_chain(uprobe, regs); |
1499 | if (can_skip_sstep(uprobe, regs)) | 1499 | if (can_skip_sstep(uprobe, regs)) |
1500 | goto out; | 1500 | goto out; |
1501 | 1501 | ||
1502 | if (!pre_ssout(uprobe, regs, bp_vaddr)) { | 1502 | if (!pre_ssout(uprobe, regs, bp_vaddr)) { |
1503 | arch_uprobe_enable_step(&uprobe->arch); | 1503 | arch_uprobe_enable_step(&uprobe->arch); |
1504 | utask->active_uprobe = uprobe; | 1504 | utask->active_uprobe = uprobe; |
1505 | utask->state = UTASK_SSTEP; | 1505 | utask->state = UTASK_SSTEP; |
1506 | return; | 1506 | return; |
1507 | } | 1507 | } |
1508 | 1508 | ||
1509 | restart: | 1509 | restart: |
1510 | /* | 1510 | /* |
1511 | * cannot singlestep; cannot skip instruction; | 1511 | * cannot singlestep; cannot skip instruction; |
1512 | * re-execute the instruction. | 1512 | * re-execute the instruction. |
1513 | */ | 1513 | */ |
1514 | instruction_pointer_set(regs, bp_vaddr); | 1514 | instruction_pointer_set(regs, bp_vaddr); |
1515 | out: | 1515 | out: |
1516 | put_uprobe(uprobe); | 1516 | put_uprobe(uprobe); |
1517 | } | 1517 | } |
1518 | 1518 | ||
1519 | /* | 1519 | /* |
1520 | * Perform required fix-ups and disable singlestep. | 1520 | * Perform required fix-ups and disable singlestep. |
1521 | * Allow pending signals to take effect. | 1521 | * Allow pending signals to take effect. |
1522 | */ | 1522 | */ |
1523 | static void handle_singlestep(struct uprobe_task *utask, struct pt_regs *regs) | 1523 | static void handle_singlestep(struct uprobe_task *utask, struct pt_regs *regs) |
1524 | { | 1524 | { |
1525 | struct uprobe *uprobe; | 1525 | struct uprobe *uprobe; |
1526 | 1526 | ||
1527 | uprobe = utask->active_uprobe; | 1527 | uprobe = utask->active_uprobe; |
1528 | if (utask->state == UTASK_SSTEP_ACK) | 1528 | if (utask->state == UTASK_SSTEP_ACK) |
1529 | arch_uprobe_post_xol(&uprobe->arch, regs); | 1529 | arch_uprobe_post_xol(&uprobe->arch, regs); |
1530 | else if (utask->state == UTASK_SSTEP_TRAPPED) | 1530 | else if (utask->state == UTASK_SSTEP_TRAPPED) |
1531 | arch_uprobe_abort_xol(&uprobe->arch, regs); | 1531 | arch_uprobe_abort_xol(&uprobe->arch, regs); |
1532 | else | 1532 | else |
1533 | WARN_ON_ONCE(1); | 1533 | WARN_ON_ONCE(1); |
1534 | 1534 | ||
1535 | arch_uprobe_disable_step(&uprobe->arch); | 1535 | arch_uprobe_disable_step(&uprobe->arch); |
1536 | put_uprobe(uprobe); | 1536 | put_uprobe(uprobe); |
1537 | utask->active_uprobe = NULL; | 1537 | utask->active_uprobe = NULL; |
1538 | utask->state = UTASK_RUNNING; | 1538 | utask->state = UTASK_RUNNING; |
1539 | xol_free_insn_slot(current); | 1539 | xol_free_insn_slot(current); |
1540 | 1540 | ||
1541 | spin_lock_irq(¤t->sighand->siglock); | 1541 | spin_lock_irq(¤t->sighand->siglock); |
1542 | recalc_sigpending(); /* see uprobe_deny_signal() */ | 1542 | recalc_sigpending(); /* see uprobe_deny_signal() */ |
1543 | spin_unlock_irq(¤t->sighand->siglock); | 1543 | spin_unlock_irq(¤t->sighand->siglock); |
1544 | } | 1544 | } |
1545 | 1545 | ||
1546 | /* | 1546 | /* |
1547 | * On breakpoint hit, breakpoint notifier sets the TIF_UPROBE flag and | 1547 | * On breakpoint hit, breakpoint notifier sets the TIF_UPROBE flag and |
1548 | * allows the thread to return from interrupt. After that handle_swbp() | 1548 | * allows the thread to return from interrupt. After that handle_swbp() |
1549 | * sets utask->active_uprobe. | 1549 | * sets utask->active_uprobe. |
1550 | * | 1550 | * |
1551 | * On singlestep exception, singlestep notifier sets the TIF_UPROBE flag | 1551 | * On singlestep exception, singlestep notifier sets the TIF_UPROBE flag |
1552 | * and allows the thread to return from interrupt. | 1552 | * and allows the thread to return from interrupt. |
1553 | * | 1553 | * |
1554 | * While returning to userspace, thread notices the TIF_UPROBE flag and calls | 1554 | * While returning to userspace, thread notices the TIF_UPROBE flag and calls |
1555 | * uprobe_notify_resume(). | 1555 | * uprobe_notify_resume(). |
1556 | */ | 1556 | */ |
1557 | void uprobe_notify_resume(struct pt_regs *regs) | 1557 | void uprobe_notify_resume(struct pt_regs *regs) |
1558 | { | 1558 | { |
1559 | struct uprobe_task *utask; | 1559 | struct uprobe_task *utask; |
1560 | 1560 | ||
1561 | clear_thread_flag(TIF_UPROBE); | ||
1562 | |||
1561 | utask = current->utask; | 1563 | utask = current->utask; |
1562 | if (utask && utask->active_uprobe) | 1564 | if (utask && utask->active_uprobe) |
1563 | handle_singlestep(utask, regs); | 1565 | handle_singlestep(utask, regs); |
1564 | else | 1566 | else |
1565 | handle_swbp(regs); | 1567 | handle_swbp(regs); |
1566 | } | 1568 | } |
1567 | 1569 | ||
1568 | /* | 1570 | /* |
1569 | * uprobe_pre_sstep_notifier gets called from interrupt context as part of | 1571 | * uprobe_pre_sstep_notifier gets called from interrupt context as part of |
1570 | * notifier mechanism. Set TIF_UPROBE flag and indicate breakpoint hit. | 1572 | * notifier mechanism. Set TIF_UPROBE flag and indicate breakpoint hit. |
1571 | */ | 1573 | */ |
1572 | int uprobe_pre_sstep_notifier(struct pt_regs *regs) | 1574 | int uprobe_pre_sstep_notifier(struct pt_regs *regs) |
1573 | { | 1575 | { |
1574 | if (!current->mm || !test_bit(MMF_HAS_UPROBES, ¤t->mm->flags)) | 1576 | if (!current->mm || !test_bit(MMF_HAS_UPROBES, ¤t->mm->flags)) |
1575 | return 0; | 1577 | return 0; |
1576 | 1578 | ||
1577 | set_thread_flag(TIF_UPROBE); | 1579 | set_thread_flag(TIF_UPROBE); |
1578 | return 1; | 1580 | return 1; |
1579 | } | 1581 | } |
1580 | 1582 | ||
1581 | /* | 1583 | /* |
1582 | * uprobe_post_sstep_notifier gets called in interrupt context as part of notifier | 1584 | * uprobe_post_sstep_notifier gets called in interrupt context as part of notifier |
1583 | * mechanism. Set TIF_UPROBE flag and indicate completion of singlestep. | 1585 | * mechanism. Set TIF_UPROBE flag and indicate completion of singlestep. |
1584 | */ | 1586 | */ |
1585 | int uprobe_post_sstep_notifier(struct pt_regs *regs) | 1587 | int uprobe_post_sstep_notifier(struct pt_regs *regs) |
1586 | { | 1588 | { |
1587 | struct uprobe_task *utask = current->utask; | 1589 | struct uprobe_task *utask = current->utask; |
1588 | 1590 | ||
1589 | if (!current->mm || !utask || !utask->active_uprobe) | 1591 | if (!current->mm || !utask || !utask->active_uprobe) |
1590 | /* task is currently not uprobed */ | 1592 | /* task is currently not uprobed */ |
1591 | return 0; | 1593 | return 0; |
1592 | 1594 | ||
1593 | utask->state = UTASK_SSTEP_ACK; | 1595 | utask->state = UTASK_SSTEP_ACK; |
1594 | set_thread_flag(TIF_UPROBE); | 1596 | set_thread_flag(TIF_UPROBE); |
1595 | return 1; | 1597 | return 1; |
1596 | } | 1598 | } |
1597 | 1599 | ||
1598 | static struct notifier_block uprobe_exception_nb = { | 1600 | static struct notifier_block uprobe_exception_nb = { |
1599 | .notifier_call = arch_uprobe_exception_notify, | 1601 | .notifier_call = arch_uprobe_exception_notify, |
1600 | .priority = INT_MAX-1, /* notified after kprobes, kgdb */ | 1602 | .priority = INT_MAX-1, /* notified after kprobes, kgdb */ |
1601 | }; | 1603 | }; |
1602 | 1604 | ||
1603 | static int __init init_uprobes(void) | 1605 | static int __init init_uprobes(void) |
1604 | { | 1606 | { |
1605 | int i; | 1607 | int i; |
1606 | 1608 | ||
1607 | for (i = 0; i < UPROBES_HASH_SZ; i++) { | 1609 | for (i = 0; i < UPROBES_HASH_SZ; i++) { |
1608 | mutex_init(&uprobes_mutex[i]); | 1610 | mutex_init(&uprobes_mutex[i]); |
1609 | mutex_init(&uprobes_mmap_mutex[i]); | 1611 | mutex_init(&uprobes_mmap_mutex[i]); |
1610 | } | 1612 | } |
1611 | 1613 | ||
1612 | return register_die_notifier(&uprobe_exception_nb); | 1614 | return register_die_notifier(&uprobe_exception_nb); |
1613 | } | 1615 | } |
1614 | module_init(init_uprobes); | 1616 | module_init(init_uprobes); |
1615 | 1617 | ||
1616 | static void __exit exit_uprobes(void) | 1618 | static void __exit exit_uprobes(void) |
1617 | { | 1619 | { |
1618 | } | 1620 | } |
1619 | module_exit(exit_uprobes); | 1621 | module_exit(exit_uprobes); |
1620 | 1622 |