diff options
-rw-r--r-- | arch/x86/ia32/ia32entry.S | 2 | ||||
-rw-r--r-- | arch/x86/kernel/ptrace.c | 67 | ||||
-rw-r--r-- | include/asm-x86/ptrace.h | 2 |
3 files changed, 11 insertions, 60 deletions
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index ae7158bce4d6..b5e329da166c 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S | |||
@@ -430,7 +430,7 @@ ia32_sys_call_table: | |||
430 | .quad sys_setuid16 | 430 | .quad sys_setuid16 |
431 | .quad sys_getuid16 | 431 | .quad sys_getuid16 |
432 | .quad compat_sys_stime /* stime */ /* 25 */ | 432 | .quad compat_sys_stime /* stime */ /* 25 */ |
433 | .quad sys32_ptrace /* ptrace */ | 433 | .quad compat_sys_ptrace /* ptrace */ |
434 | .quad sys_alarm | 434 | .quad sys_alarm |
435 | .quad sys_fstat /* (old)fstat */ | 435 | .quad sys_fstat /* (old)fstat */ |
436 | .quad sys_pause | 436 | .quad sys_pause |
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index 870dc1023d2d..fb03ef380f0e 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
@@ -1207,69 +1207,16 @@ static int genregs32_set(struct task_struct *target, | |||
1207 | return ret; | 1207 | return ret; |
1208 | } | 1208 | } |
1209 | 1209 | ||
1210 | asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) | 1210 | long compat_arch_ptrace(struct task_struct *child, compat_long_t request, |
1211 | compat_ulong_t caddr, compat_ulong_t cdata) | ||
1211 | { | 1212 | { |
1212 | struct task_struct *child; | 1213 | unsigned long addr = caddr; |
1213 | struct pt_regs *childregs; | 1214 | unsigned long data = cdata; |
1214 | void __user *datap = compat_ptr(data); | 1215 | void __user *datap = compat_ptr(data); |
1215 | int ret; | 1216 | int ret; |
1216 | __u32 val; | 1217 | __u32 val; |
1217 | 1218 | ||
1218 | switch (request) { | 1219 | switch (request) { |
1219 | case PTRACE_TRACEME: | ||
1220 | case PTRACE_ATTACH: | ||
1221 | case PTRACE_KILL: | ||
1222 | case PTRACE_CONT: | ||
1223 | case PTRACE_SINGLESTEP: | ||
1224 | case PTRACE_SINGLEBLOCK: | ||
1225 | case PTRACE_DETACH: | ||
1226 | case PTRACE_SYSCALL: | ||
1227 | case PTRACE_OLDSETOPTIONS: | ||
1228 | case PTRACE_SETOPTIONS: | ||
1229 | case PTRACE_SET_THREAD_AREA: | ||
1230 | case PTRACE_GET_THREAD_AREA: | ||
1231 | #ifdef X86_BTS | ||
1232 | case PTRACE_BTS_CONFIG: | ||
1233 | case PTRACE_BTS_STATUS: | ||
1234 | case PTRACE_BTS_SIZE: | ||
1235 | case PTRACE_BTS_GET: | ||
1236 | case PTRACE_BTS_CLEAR: | ||
1237 | case PTRACE_BTS_DRAIN: | ||
1238 | #endif | ||
1239 | return sys_ptrace(request, pid, addr, data); | ||
1240 | |||
1241 | default: | ||
1242 | return -EINVAL; | ||
1243 | |||
1244 | case PTRACE_PEEKTEXT: | ||
1245 | case PTRACE_PEEKDATA: | ||
1246 | case PTRACE_POKEDATA: | ||
1247 | case PTRACE_POKETEXT: | ||
1248 | case PTRACE_POKEUSR: | ||
1249 | case PTRACE_PEEKUSR: | ||
1250 | case PTRACE_GETREGS: | ||
1251 | case PTRACE_SETREGS: | ||
1252 | case PTRACE_SETFPREGS: | ||
1253 | case PTRACE_GETFPREGS: | ||
1254 | case PTRACE_SETFPXREGS: | ||
1255 | case PTRACE_GETFPXREGS: | ||
1256 | case PTRACE_GETEVENTMSG: | ||
1257 | case PTRACE_SETSIGINFO: | ||
1258 | case PTRACE_GETSIGINFO: | ||
1259 | break; | ||
1260 | } | ||
1261 | |||
1262 | child = ptrace_get_task_struct(pid); | ||
1263 | if (IS_ERR(child)) | ||
1264 | return PTR_ERR(child); | ||
1265 | |||
1266 | ret = ptrace_check_attach(child, request == PTRACE_KILL); | ||
1267 | if (ret < 0) | ||
1268 | goto out; | ||
1269 | |||
1270 | childregs = task_pt_regs(child); | ||
1271 | |||
1272 | switch (request) { | ||
1273 | case PTRACE_PEEKUSR: | 1220 | case PTRACE_PEEKUSR: |
1274 | ret = getreg32(child, addr, &val); | 1221 | ret = getreg32(child, addr, &val); |
1275 | if (ret == 0) | 1222 | if (ret == 0) |
@@ -1315,12 +1262,14 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) | |||
1315 | sizeof(struct user32_fxsr_struct), | 1262 | sizeof(struct user32_fxsr_struct), |
1316 | datap); | 1263 | datap); |
1317 | 1264 | ||
1265 | case PTRACE_GET_THREAD_AREA: | ||
1266 | case PTRACE_SET_THREAD_AREA: | ||
1267 | return arch_ptrace(child, request, addr, data); | ||
1268 | |||
1318 | default: | 1269 | default: |
1319 | return compat_ptrace_request(child, request, addr, data); | 1270 | return compat_ptrace_request(child, request, addr, data); |
1320 | } | 1271 | } |
1321 | 1272 | ||
1322 | out: | ||
1323 | put_task_struct(child); | ||
1324 | return ret; | 1273 | return ret; |
1325 | } | 1274 | } |
1326 | 1275 | ||
diff --git a/include/asm-x86/ptrace.h b/include/asm-x86/ptrace.h index 24ec061566c5..9f922b0b95d6 100644 --- a/include/asm-x86/ptrace.h +++ b/include/asm-x86/ptrace.h | |||
@@ -231,6 +231,8 @@ extern int do_get_thread_area(struct task_struct *p, int idx, | |||
231 | extern int do_set_thread_area(struct task_struct *p, int idx, | 231 | extern int do_set_thread_area(struct task_struct *p, int idx, |
232 | struct user_desc __user *info, int can_allocate); | 232 | struct user_desc __user *info, int can_allocate); |
233 | 233 | ||
234 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
235 | |||
234 | #endif /* __KERNEL__ */ | 236 | #endif /* __KERNEL__ */ |
235 | 237 | ||
236 | #endif /* !__ASSEMBLY__ */ | 238 | #endif /* !__ASSEMBLY__ */ |