ptrace.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. /*
  2. * This file is subject to the terms and conditions of the GNU General Public
  3. * License. See the file "COPYING" in the main directory of this archive
  4. * for more details.
  5. *
  6. * Copyright (C) 2001 - 2007 Tensilica Inc.
  7. *
  8. * Joe Taylor <joe@tensilica.com, joetylr@yahoo.com>
  9. * Chris Zankel <chris@zankel.net>
  10. * Scott Foehner<sfoehner@yahoo.com>,
  11. * Kevin Chea
  12. * Marc Gauthier<marc@tensilica.com> <marc@alumni.uwaterloo.ca>
  13. */
  14. #include <linux/errno.h>
  15. #include <linux/hw_breakpoint.h>
  16. #include <linux/kernel.h>
  17. #include <linux/mm.h>
  18. #include <linux/perf_event.h>
  19. #include <linux/ptrace.h>
  20. #include <linux/sched.h>
  21. #include <linux/sched/task_stack.h>
  22. #include <linux/security.h>
  23. #include <linux/signal.h>
  24. #include <linux/smp.h>
  25. #include <linux/tracehook.h>
  26. #include <linux/uaccess.h>
  27. #include <asm/coprocessor.h>
  28. #include <asm/elf.h>
  29. #include <asm/page.h>
  30. #include <asm/pgtable.h>
  31. #include <asm/ptrace.h>
  32. void user_enable_single_step(struct task_struct *child)
  33. {
  34. child->ptrace |= PT_SINGLESTEP;
  35. }
  36. void user_disable_single_step(struct task_struct *child)
  37. {
  38. child->ptrace &= ~PT_SINGLESTEP;
  39. }
  40. /*
  41. * Called by kernel/ptrace.c when detaching to disable single stepping.
  42. */
  43. void ptrace_disable(struct task_struct *child)
  44. {
  45. /* Nothing to do.. */
  46. }
  47. static int ptrace_getregs(struct task_struct *child, void __user *uregs)
  48. {
  49. struct pt_regs *regs = task_pt_regs(child);
  50. xtensa_gregset_t __user *gregset = uregs;
  51. unsigned long wb = regs->windowbase;
  52. int i;
  53. if (!access_ok(VERIFY_WRITE, uregs, sizeof(xtensa_gregset_t)))
  54. return -EIO;
  55. __put_user(regs->pc, &gregset->pc);
  56. __put_user(regs->ps & ~(1 << PS_EXCM_BIT), &gregset->ps);
  57. __put_user(regs->lbeg, &gregset->lbeg);
  58. __put_user(regs->lend, &gregset->lend);
  59. __put_user(regs->lcount, &gregset->lcount);
  60. __put_user(regs->windowstart, &gregset->windowstart);
  61. __put_user(regs->windowbase, &gregset->windowbase);
  62. __put_user(regs->threadptr, &gregset->threadptr);
  63. for (i = 0; i < XCHAL_NUM_AREGS; i++)
  64. __put_user(regs->areg[i],
  65. gregset->a + ((wb * 4 + i) % XCHAL_NUM_AREGS));
  66. return 0;
  67. }
  68. static int ptrace_setregs(struct task_struct *child, void __user *uregs)
  69. {
  70. struct pt_regs *regs = task_pt_regs(child);
  71. xtensa_gregset_t *gregset = uregs;
  72. const unsigned long ps_mask = PS_CALLINC_MASK | PS_OWB_MASK;
  73. unsigned long ps;
  74. unsigned long wb, ws;
  75. if (!access_ok(VERIFY_WRITE, uregs, sizeof(xtensa_gregset_t)))
  76. return -EIO;
  77. __get_user(regs->pc, &gregset->pc);
  78. __get_user(ps, &gregset->ps);
  79. __get_user(regs->lbeg, &gregset->lbeg);
  80. __get_user(regs->lend, &gregset->lend);
  81. __get_user(regs->lcount, &gregset->lcount);
  82. __get_user(ws, &gregset->windowstart);
  83. __get_user(wb, &gregset->windowbase);
  84. __get_user(regs->threadptr, &gregset->threadptr);
  85. regs->ps = (regs->ps & ~ps_mask) | (ps & ps_mask) | (1 << PS_EXCM_BIT);
  86. if (wb >= XCHAL_NUM_AREGS / 4)
  87. return -EFAULT;
  88. if (wb != regs->windowbase || ws != regs->windowstart) {
  89. unsigned long rotws, wmask;
  90. rotws = (((ws | (ws << WSBITS)) >> wb) &
  91. ((1 << WSBITS) - 1)) & ~1;
  92. wmask = ((rotws ? WSBITS + 1 - ffs(rotws) : 0) << 4) |
  93. (rotws & 0xF) | 1;
  94. regs->windowbase = wb;
  95. regs->windowstart = ws;
  96. regs->wmask = wmask;
  97. }
  98. if (wb != 0 && __copy_from_user(regs->areg + XCHAL_NUM_AREGS - wb * 4,
  99. gregset->a, wb * 16))
  100. return -EFAULT;
  101. if (__copy_from_user(regs->areg, gregset->a + wb * 4,
  102. (WSBITS - wb) * 16))
  103. return -EFAULT;
  104. return 0;
  105. }
  106. static int ptrace_getxregs(struct task_struct *child, void __user *uregs)
  107. {
  108. struct pt_regs *regs = task_pt_regs(child);
  109. struct thread_info *ti = task_thread_info(child);
  110. elf_xtregs_t __user *xtregs = uregs;
  111. int ret = 0;
  112. if (!access_ok(VERIFY_WRITE, uregs, sizeof(elf_xtregs_t)))
  113. return -EIO;
  114. #if XTENSA_HAVE_COPROCESSORS
  115. /* Flush all coprocessor registers to memory. */
  116. coprocessor_flush_all(ti);
  117. ret |= __copy_to_user(&xtregs->cp0, &ti->xtregs_cp,
  118. sizeof(xtregs_coprocessor_t));
  119. #endif
  120. ret |= __copy_to_user(&xtregs->opt, &regs->xtregs_opt,
  121. sizeof(xtregs->opt));
  122. ret |= __copy_to_user(&xtregs->user,&ti->xtregs_user,
  123. sizeof(xtregs->user));
  124. return ret ? -EFAULT : 0;
  125. }
  126. static int ptrace_setxregs(struct task_struct *child, void __user *uregs)
  127. {
  128. struct thread_info *ti = task_thread_info(child);
  129. struct pt_regs *regs = task_pt_regs(child);
  130. elf_xtregs_t *xtregs = uregs;
  131. int ret = 0;
  132. if (!access_ok(VERIFY_READ, uregs, sizeof(elf_xtregs_t)))
  133. return -EFAULT;
  134. #if XTENSA_HAVE_COPROCESSORS
  135. /* Flush all coprocessors before we overwrite them. */
  136. coprocessor_flush_all(ti);
  137. coprocessor_release_all(ti);
  138. ret |= __copy_from_user(&ti->xtregs_cp, &xtregs->cp0,
  139. sizeof(xtregs_coprocessor_t));
  140. #endif
  141. ret |= __copy_from_user(&regs->xtregs_opt, &xtregs->opt,
  142. sizeof(xtregs->opt));
  143. ret |= __copy_from_user(&ti->xtregs_user, &xtregs->user,
  144. sizeof(xtregs->user));
  145. return ret ? -EFAULT : 0;
  146. }
  147. static int ptrace_peekusr(struct task_struct *child, long regno,
  148. long __user *ret)
  149. {
  150. struct pt_regs *regs;
  151. unsigned long tmp;
  152. regs = task_pt_regs(child);
  153. tmp = 0; /* Default return value. */
  154. switch(regno) {
  155. case REG_AR_BASE ... REG_AR_BASE + XCHAL_NUM_AREGS - 1:
  156. tmp = regs->areg[regno - REG_AR_BASE];
  157. break;
  158. case REG_A_BASE ... REG_A_BASE + 15:
  159. tmp = regs->areg[regno - REG_A_BASE];
  160. break;
  161. case REG_PC:
  162. tmp = regs->pc;
  163. break;
  164. case REG_PS:
  165. /* Note: PS.EXCM is not set while user task is running;
  166. * its being set in regs is for exception handling
  167. * convenience.
  168. */
  169. tmp = (regs->ps & ~(1 << PS_EXCM_BIT));
  170. break;
  171. case REG_WB:
  172. break; /* tmp = 0 */
  173. case REG_WS:
  174. {
  175. unsigned long wb = regs->windowbase;
  176. unsigned long ws = regs->windowstart;
  177. tmp = ((ws >> wb) | (ws << (WSBITS - wb))) &
  178. ((1 << WSBITS) - 1);
  179. break;
  180. }
  181. case REG_LBEG:
  182. tmp = regs->lbeg;
  183. break;
  184. case REG_LEND:
  185. tmp = regs->lend;
  186. break;
  187. case REG_LCOUNT:
  188. tmp = regs->lcount;
  189. break;
  190. case REG_SAR:
  191. tmp = regs->sar;
  192. break;
  193. case SYSCALL_NR:
  194. tmp = regs->syscall;
  195. break;
  196. default:
  197. return -EIO;
  198. }
  199. return put_user(tmp, ret);
  200. }
  201. static int ptrace_pokeusr(struct task_struct *child, long regno, long val)
  202. {
  203. struct pt_regs *regs;
  204. regs = task_pt_regs(child);
  205. switch (regno) {
  206. case REG_AR_BASE ... REG_AR_BASE + XCHAL_NUM_AREGS - 1:
  207. regs->areg[regno - REG_AR_BASE] = val;
  208. break;
  209. case REG_A_BASE ... REG_A_BASE + 15:
  210. regs->areg[regno - REG_A_BASE] = val;
  211. break;
  212. case REG_PC:
  213. regs->pc = val;
  214. break;
  215. case SYSCALL_NR:
  216. regs->syscall = val;
  217. break;
  218. default:
  219. return -EIO;
  220. }
  221. return 0;
  222. }
  223. #ifdef CONFIG_HAVE_HW_BREAKPOINT
  224. static void ptrace_hbptriggered(struct perf_event *bp,
  225. struct perf_sample_data *data,
  226. struct pt_regs *regs)
  227. {
  228. int i;
  229. siginfo_t info;
  230. struct arch_hw_breakpoint *bkpt = counter_arch_bp(bp);
  231. if (bp->attr.bp_type & HW_BREAKPOINT_X) {
  232. for (i = 0; i < XCHAL_NUM_IBREAK; ++i)
  233. if (current->thread.ptrace_bp[i] == bp)
  234. break;
  235. i <<= 1;
  236. } else {
  237. for (i = 0; i < XCHAL_NUM_DBREAK; ++i)
  238. if (current->thread.ptrace_wp[i] == bp)
  239. break;
  240. i = (i << 1) | 1;
  241. }
  242. info.si_signo = SIGTRAP;
  243. info.si_errno = i;
  244. info.si_code = TRAP_HWBKPT;
  245. info.si_addr = (void __user *)bkpt->address;
  246. force_sig_info(SIGTRAP, &info, current);
  247. }
  248. static struct perf_event *ptrace_hbp_create(struct task_struct *tsk, int type)
  249. {
  250. struct perf_event_attr attr;
  251. ptrace_breakpoint_init(&attr);
  252. /* Initialise fields to sane defaults. */
  253. attr.bp_addr = 0;
  254. attr.bp_len = 1;
  255. attr.bp_type = type;
  256. attr.disabled = 1;
  257. return register_user_hw_breakpoint(&attr, ptrace_hbptriggered, NULL,
  258. tsk);
  259. }
  260. /*
  261. * Address bit 0 choose instruction (0) or data (1) break register, bits
  262. * 31..1 are the register number.
  263. * Both PTRACE_GETHBPREGS and PTRACE_SETHBPREGS transfer two 32-bit words:
  264. * address (0) and control (1).
  265. * Instruction breakpoint contorl word is 0 to clear breakpoint, 1 to set.
  266. * Data breakpoint control word bit 31 is 'trigger on store', bit 30 is
  267. * 'trigger on load, bits 29..0 are length. Length 0 is used to clear a
  268. * breakpoint. To set a breakpoint length must be a power of 2 in the range
  269. * 1..64 and the address must be length-aligned.
  270. */
  271. static long ptrace_gethbpregs(struct task_struct *child, long addr,
  272. long __user *datap)
  273. {
  274. struct perf_event *bp;
  275. u32 user_data[2] = {0};
  276. bool dbreak = addr & 1;
  277. unsigned idx = addr >> 1;
  278. if ((!dbreak && idx >= XCHAL_NUM_IBREAK) ||
  279. (dbreak && idx >= XCHAL_NUM_DBREAK))
  280. return -EINVAL;
  281. if (dbreak)
  282. bp = child->thread.ptrace_wp[idx];
  283. else
  284. bp = child->thread.ptrace_bp[idx];
  285. if (bp) {
  286. user_data[0] = bp->attr.bp_addr;
  287. user_data[1] = bp->attr.disabled ? 0 : bp->attr.bp_len;
  288. if (dbreak) {
  289. if (bp->attr.bp_type & HW_BREAKPOINT_R)
  290. user_data[1] |= DBREAKC_LOAD_MASK;
  291. if (bp->attr.bp_type & HW_BREAKPOINT_W)
  292. user_data[1] |= DBREAKC_STOR_MASK;
  293. }
  294. }
  295. if (copy_to_user(datap, user_data, sizeof(user_data)))
  296. return -EFAULT;
  297. return 0;
  298. }
  299. static long ptrace_sethbpregs(struct task_struct *child, long addr,
  300. long __user *datap)
  301. {
  302. struct perf_event *bp;
  303. struct perf_event_attr attr;
  304. u32 user_data[2];
  305. bool dbreak = addr & 1;
  306. unsigned idx = addr >> 1;
  307. int bp_type = 0;
  308. if ((!dbreak && idx >= XCHAL_NUM_IBREAK) ||
  309. (dbreak && idx >= XCHAL_NUM_DBREAK))
  310. return -EINVAL;
  311. if (copy_from_user(user_data, datap, sizeof(user_data)))
  312. return -EFAULT;
  313. if (dbreak) {
  314. bp = child->thread.ptrace_wp[idx];
  315. if (user_data[1] & DBREAKC_LOAD_MASK)
  316. bp_type |= HW_BREAKPOINT_R;
  317. if (user_data[1] & DBREAKC_STOR_MASK)
  318. bp_type |= HW_BREAKPOINT_W;
  319. } else {
  320. bp = child->thread.ptrace_bp[idx];
  321. bp_type = HW_BREAKPOINT_X;
  322. }
  323. if (!bp) {
  324. bp = ptrace_hbp_create(child,
  325. bp_type ? bp_type : HW_BREAKPOINT_RW);
  326. if (IS_ERR(bp))
  327. return PTR_ERR(bp);
  328. if (dbreak)
  329. child->thread.ptrace_wp[idx] = bp;
  330. else
  331. child->thread.ptrace_bp[idx] = bp;
  332. }
  333. attr = bp->attr;
  334. attr.bp_addr = user_data[0];
  335. attr.bp_len = user_data[1] & ~(DBREAKC_LOAD_MASK | DBREAKC_STOR_MASK);
  336. attr.bp_type = bp_type;
  337. attr.disabled = !attr.bp_len;
  338. return modify_user_hw_breakpoint(bp, &attr);
  339. }
  340. #endif
  341. long arch_ptrace(struct task_struct *child, long request,
  342. unsigned long addr, unsigned long data)
  343. {
  344. int ret = -EPERM;
  345. void __user *datap = (void __user *) data;
  346. switch (request) {
  347. case PTRACE_PEEKTEXT: /* read word at location addr. */
  348. case PTRACE_PEEKDATA:
  349. ret = generic_ptrace_peekdata(child, addr, data);
  350. break;
  351. case PTRACE_PEEKUSR: /* read register specified by addr. */
  352. ret = ptrace_peekusr(child, addr, datap);
  353. break;
  354. case PTRACE_POKETEXT: /* write the word at location addr. */
  355. case PTRACE_POKEDATA:
  356. ret = generic_ptrace_pokedata(child, addr, data);
  357. break;
  358. case PTRACE_POKEUSR: /* write register specified by addr. */
  359. ret = ptrace_pokeusr(child, addr, data);
  360. break;
  361. case PTRACE_GETREGS:
  362. ret = ptrace_getregs(child, datap);
  363. break;
  364. case PTRACE_SETREGS:
  365. ret = ptrace_setregs(child, datap);
  366. break;
  367. case PTRACE_GETXTREGS:
  368. ret = ptrace_getxregs(child, datap);
  369. break;
  370. case PTRACE_SETXTREGS:
  371. ret = ptrace_setxregs(child, datap);
  372. break;
  373. #ifdef CONFIG_HAVE_HW_BREAKPOINT
  374. case PTRACE_GETHBPREGS:
  375. ret = ptrace_gethbpregs(child, addr, datap);
  376. break;
  377. case PTRACE_SETHBPREGS:
  378. ret = ptrace_sethbpregs(child, addr, datap);
  379. break;
  380. #endif
  381. default:
  382. ret = ptrace_request(child, request, addr, data);
  383. break;
  384. }
  385. return ret;
  386. }
  387. unsigned long do_syscall_trace_enter(struct pt_regs *regs)
  388. {
  389. if (test_thread_flag(TIF_SYSCALL_TRACE) &&
  390. tracehook_report_syscall_entry(regs))
  391. return -1;
  392. return regs->areg[2];
  393. }
  394. void do_syscall_trace_leave(struct pt_regs *regs)
  395. {
  396. int step;
  397. step = test_thread_flag(TIF_SINGLESTEP);
  398. if (step || test_thread_flag(TIF_SYSCALL_TRACE))
  399. tracehook_report_syscall_exit(regs, step);
  400. }