ptrace32.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. /*
  2. * 32bit ptrace for x86-64.
  3. *
  4. * Copyright 2001,2002 Andi Kleen, SuSE Labs.
  5. * Some parts copied from arch/i386/kernel/ptrace.c. See that file for earlier
  6. * copyright.
  7. *
  8. * This allows to access 64bit processes too; but there is no way to see the extended
  9. * register contents.
  10. */
  11. #include <linux/kernel.h>
  12. #include <linux/stddef.h>
  13. #include <linux/sched.h>
  14. #include <linux/syscalls.h>
  15. #include <linux/unistd.h>
  16. #include <linux/mm.h>
  17. #include <linux/ptrace.h>
  18. #include <asm/ptrace.h>
  19. #include <asm/compat.h>
  20. #include <asm/uaccess.h>
  21. #include <asm/user32.h>
  22. #include <asm/user.h>
  23. #include <asm/errno.h>
  24. #include <asm/debugreg.h>
  25. #include <asm/i387.h>
  26. #include <asm/fpu32.h>
  27. #include <asm/ia32.h>
  28. /*
  29. * Determines which flags the user has access to [1 = access, 0 = no access].
  30. * Prohibits changing ID(21), VIP(20), VIF(19), VM(17), IOPL(12-13), IF(9).
  31. * Also masks reserved bits (31-22, 15, 5, 3, 1).
  32. */
  33. #define FLAG_MASK 0x54dd5UL
  34. #define R32(l,q) \
  35. case offsetof(struct user32, regs.l): stack[offsetof(struct pt_regs, q)/8] = val; break
  36. static int putreg32(struct task_struct *child, unsigned regno, u32 val)
  37. {
  38. int i;
  39. __u64 *stack = (__u64 *)task_pt_regs(child);
  40. switch (regno) {
  41. case offsetof(struct user32, regs.fs):
  42. if (val && (val & 3) != 3) return -EIO;
  43. child->thread.fsindex = val & 0xffff;
  44. break;
  45. case offsetof(struct user32, regs.gs):
  46. if (val && (val & 3) != 3) return -EIO;
  47. child->thread.gsindex = val & 0xffff;
  48. break;
  49. case offsetof(struct user32, regs.ds):
  50. if (val && (val & 3) != 3) return -EIO;
  51. child->thread.ds = val & 0xffff;
  52. break;
  53. case offsetof(struct user32, regs.es):
  54. child->thread.es = val & 0xffff;
  55. break;
  56. case offsetof(struct user32, regs.ss):
  57. if ((val & 3) != 3) return -EIO;
  58. stack[offsetof(struct pt_regs, ss)/8] = val & 0xffff;
  59. break;
  60. case offsetof(struct user32, regs.cs):
  61. if ((val & 3) != 3) return -EIO;
  62. stack[offsetof(struct pt_regs, cs)/8] = val & 0xffff;
  63. break;
  64. R32(ebx, rbx);
  65. R32(ecx, rcx);
  66. R32(edx, rdx);
  67. R32(edi, rdi);
  68. R32(esi, rsi);
  69. R32(ebp, rbp);
  70. R32(eax, rax);
  71. R32(orig_eax, orig_rax);
  72. R32(eip, rip);
  73. R32(esp, rsp);
  74. case offsetof(struct user32, regs.eflags): {
  75. __u64 *flags = &stack[offsetof(struct pt_regs, eflags)/8];
  76. val &= FLAG_MASK;
  77. *flags = val | (*flags & ~FLAG_MASK);
  78. break;
  79. }
  80. case offsetof(struct user32, u_debugreg[4]):
  81. case offsetof(struct user32, u_debugreg[5]):
  82. return -EIO;
  83. case offsetof(struct user32, u_debugreg[0]):
  84. child->thread.debugreg0 = val;
  85. break;
  86. case offsetof(struct user32, u_debugreg[1]):
  87. child->thread.debugreg1 = val;
  88. break;
  89. case offsetof(struct user32, u_debugreg[2]):
  90. child->thread.debugreg2 = val;
  91. break;
  92. case offsetof(struct user32, u_debugreg[3]):
  93. child->thread.debugreg3 = val;
  94. break;
  95. case offsetof(struct user32, u_debugreg[6]):
  96. child->thread.debugreg6 = val;
  97. break;
  98. case offsetof(struct user32, u_debugreg[7]):
  99. val &= ~DR_CONTROL_RESERVED;
  100. /* See arch/i386/kernel/ptrace.c for an explanation of
  101. * this awkward check.*/
  102. for(i=0; i<4; i++)
  103. if ((0x5454 >> ((val >> (16 + 4*i)) & 0xf)) & 1)
  104. return -EIO;
  105. child->thread.debugreg7 = val;
  106. if (val)
  107. set_tsk_thread_flag(child, TIF_DEBUG);
  108. else
  109. clear_tsk_thread_flag(child, TIF_DEBUG);
  110. break;
  111. default:
  112. if (regno > sizeof(struct user32) || (regno & 3))
  113. return -EIO;
  114. /* Other dummy fields in the virtual user structure are ignored */
  115. break;
  116. }
  117. return 0;
  118. }
  119. #undef R32
  120. #define R32(l,q) \
  121. case offsetof(struct user32, regs.l): *val = stack[offsetof(struct pt_regs, q)/8]; break
  122. static int getreg32(struct task_struct *child, unsigned regno, u32 *val)
  123. {
  124. __u64 *stack = (__u64 *)task_pt_regs(child);
  125. switch (regno) {
  126. case offsetof(struct user32, regs.fs):
  127. *val = child->thread.fsindex;
  128. break;
  129. case offsetof(struct user32, regs.gs):
  130. *val = child->thread.gsindex;
  131. break;
  132. case offsetof(struct user32, regs.ds):
  133. *val = child->thread.ds;
  134. break;
  135. case offsetof(struct user32, regs.es):
  136. *val = child->thread.es;
  137. break;
  138. R32(cs, cs);
  139. R32(ss, ss);
  140. R32(ebx, rbx);
  141. R32(ecx, rcx);
  142. R32(edx, rdx);
  143. R32(edi, rdi);
  144. R32(esi, rsi);
  145. R32(ebp, rbp);
  146. R32(eax, rax);
  147. R32(orig_eax, orig_rax);
  148. R32(eip, rip);
  149. R32(eflags, eflags);
  150. R32(esp, rsp);
  151. case offsetof(struct user32, u_debugreg[0]):
  152. *val = child->thread.debugreg0;
  153. break;
  154. case offsetof(struct user32, u_debugreg[1]):
  155. *val = child->thread.debugreg1;
  156. break;
  157. case offsetof(struct user32, u_debugreg[2]):
  158. *val = child->thread.debugreg2;
  159. break;
  160. case offsetof(struct user32, u_debugreg[3]):
  161. *val = child->thread.debugreg3;
  162. break;
  163. case offsetof(struct user32, u_debugreg[6]):
  164. *val = child->thread.debugreg6;
  165. break;
  166. case offsetof(struct user32, u_debugreg[7]):
  167. *val = child->thread.debugreg7;
  168. break;
  169. default:
  170. if (regno > sizeof(struct user32) || (regno & 3))
  171. return -EIO;
  172. /* Other dummy fields in the virtual user structure are ignored */
  173. *val = 0;
  174. break;
  175. }
  176. return 0;
  177. }
  178. #undef R32
  179. static long ptrace32_siginfo(unsigned request, u32 pid, u32 addr, u32 data)
  180. {
  181. int ret;
  182. compat_siginfo_t __user *si32 = compat_ptr(data);
  183. siginfo_t ssi;
  184. siginfo_t __user *si = compat_alloc_user_space(sizeof(siginfo_t));
  185. if (request == PTRACE_SETSIGINFO) {
  186. memset(&ssi, 0, sizeof(siginfo_t));
  187. ret = copy_siginfo_from_user32(&ssi, si32);
  188. if (ret)
  189. return ret;
  190. if (copy_to_user(si, &ssi, sizeof(siginfo_t)))
  191. return -EFAULT;
  192. }
  193. ret = sys_ptrace(request, pid, addr, (unsigned long)si);
  194. if (ret)
  195. return ret;
  196. if (request == PTRACE_GETSIGINFO) {
  197. if (copy_from_user(&ssi, si, sizeof(siginfo_t)))
  198. return -EFAULT;
  199. ret = copy_siginfo_to_user32(si32, &ssi);
  200. }
  201. return ret;
  202. }
  203. asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data)
  204. {
  205. struct task_struct *child;
  206. struct pt_regs *childregs;
  207. void __user *datap = compat_ptr(data);
  208. int ret;
  209. __u32 val;
  210. switch (request) {
  211. case PTRACE_TRACEME:
  212. case PTRACE_ATTACH:
  213. case PTRACE_KILL:
  214. case PTRACE_CONT:
  215. case PTRACE_SINGLESTEP:
  216. case PTRACE_DETACH:
  217. case PTRACE_SYSCALL:
  218. case PTRACE_SETOPTIONS:
  219. return sys_ptrace(request, pid, addr, data);
  220. default:
  221. return -EINVAL;
  222. case PTRACE_PEEKTEXT:
  223. case PTRACE_PEEKDATA:
  224. case PTRACE_POKEDATA:
  225. case PTRACE_POKETEXT:
  226. case PTRACE_POKEUSR:
  227. case PTRACE_PEEKUSR:
  228. case PTRACE_GETREGS:
  229. case PTRACE_SETREGS:
  230. case PTRACE_SETFPREGS:
  231. case PTRACE_GETFPREGS:
  232. case PTRACE_SETFPXREGS:
  233. case PTRACE_GETFPXREGS:
  234. case PTRACE_GETEVENTMSG:
  235. break;
  236. case PTRACE_SETSIGINFO:
  237. case PTRACE_GETSIGINFO:
  238. return ptrace32_siginfo(request, pid, addr, data);
  239. }
  240. child = ptrace_get_task_struct(pid);
  241. if (IS_ERR(child))
  242. return PTR_ERR(child);
  243. ret = ptrace_check_attach(child, request == PTRACE_KILL);
  244. if (ret < 0)
  245. goto out;
  246. childregs = task_pt_regs(child);
  247. switch (request) {
  248. case PTRACE_PEEKDATA:
  249. case PTRACE_PEEKTEXT:
  250. ret = 0;
  251. if (access_process_vm(child, addr, &val, sizeof(u32), 0)!=sizeof(u32))
  252. ret = -EIO;
  253. else
  254. ret = put_user(val, (unsigned int __user *)datap);
  255. break;
  256. case PTRACE_POKEDATA:
  257. case PTRACE_POKETEXT:
  258. ret = 0;
  259. if (access_process_vm(child, addr, &data, sizeof(u32), 1)!=sizeof(u32))
  260. ret = -EIO;
  261. break;
  262. case PTRACE_PEEKUSR:
  263. ret = getreg32(child, addr, &val);
  264. if (ret == 0)
  265. ret = put_user(val, (__u32 __user *)datap);
  266. break;
  267. case PTRACE_POKEUSR:
  268. ret = putreg32(child, addr, data);
  269. break;
  270. case PTRACE_GETREGS: { /* Get all gp regs from the child. */
  271. int i;
  272. if (!access_ok(VERIFY_WRITE, datap, 16*4)) {
  273. ret = -EIO;
  274. break;
  275. }
  276. ret = 0;
  277. for ( i = 0; i <= 16*4 ; i += sizeof(__u32) ) {
  278. getreg32(child, i, &val);
  279. ret |= __put_user(val,(u32 __user *)datap);
  280. datap += sizeof(u32);
  281. }
  282. break;
  283. }
  284. case PTRACE_SETREGS: { /* Set all gp regs in the child. */
  285. unsigned long tmp;
  286. int i;
  287. if (!access_ok(VERIFY_READ, datap, 16*4)) {
  288. ret = -EIO;
  289. break;
  290. }
  291. ret = 0;
  292. for ( i = 0; i <= 16*4; i += sizeof(u32) ) {
  293. ret |= __get_user(tmp, (u32 __user *)datap);
  294. putreg32(child, i, tmp);
  295. datap += sizeof(u32);
  296. }
  297. break;
  298. }
  299. case PTRACE_GETFPREGS:
  300. ret = -EIO;
  301. if (!access_ok(VERIFY_READ, compat_ptr(data),
  302. sizeof(struct user_i387_struct)))
  303. break;
  304. save_i387_ia32(child, datap, childregs, 1);
  305. ret = 0;
  306. break;
  307. case PTRACE_SETFPREGS:
  308. ret = -EIO;
  309. if (!access_ok(VERIFY_WRITE, datap,
  310. sizeof(struct user_i387_struct)))
  311. break;
  312. ret = 0;
  313. /* don't check EFAULT to be bug-to-bug compatible to i386 */
  314. restore_i387_ia32(child, datap, 1);
  315. break;
  316. case PTRACE_GETFPXREGS: {
  317. struct user32_fxsr_struct __user *u = datap;
  318. init_fpu(child);
  319. ret = -EIO;
  320. if (!access_ok(VERIFY_WRITE, u, sizeof(*u)))
  321. break;
  322. ret = -EFAULT;
  323. if (__copy_to_user(u, &child->thread.i387.fxsave, sizeof(*u)))
  324. break;
  325. ret = __put_user(childregs->cs, &u->fcs);
  326. ret |= __put_user(child->thread.ds, &u->fos);
  327. break;
  328. }
  329. case PTRACE_SETFPXREGS: {
  330. struct user32_fxsr_struct __user *u = datap;
  331. unlazy_fpu(child);
  332. ret = -EIO;
  333. if (!access_ok(VERIFY_READ, u, sizeof(*u)))
  334. break;
  335. /* no checking to be bug-to-bug compatible with i386. */
  336. /* but silence warning */
  337. if (__copy_from_user(&child->thread.i387.fxsave, u, sizeof(*u)))
  338. ;
  339. set_stopped_child_used_math(child);
  340. child->thread.i387.fxsave.mxcsr &= mxcsr_feature_mask;
  341. ret = 0;
  342. break;
  343. }
  344. case PTRACE_GETEVENTMSG:
  345. ret = put_user(child->ptrace_message,(unsigned int __user *)compat_ptr(data));
  346. break;
  347. default:
  348. BUG();
  349. }
  350. out:
  351. put_task_struct(child);
  352. return ret;
  353. }