ptrace.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. /* ptrace.c: Sparc process tracing support.
  2. *
  3. * Copyright (C) 1996 David S. Miller (davem@caipfs.rutgers.edu)
  4. * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  5. *
  6. * Based upon code written by Ross Biro, Linus Torvalds, Bob Manson,
  7. * and David Mosberger.
  8. *
  9. * Added Linux support -miguel (weird, eh?, the original code was meant
  10. * to emulate SunOS).
  11. */
  12. #include <linux/kernel.h>
  13. #include <linux/sched.h>
  14. #include <linux/mm.h>
  15. #include <linux/errno.h>
  16. #include <linux/ptrace.h>
  17. #include <linux/user.h>
  18. #include <linux/smp.h>
  19. #include <linux/smp_lock.h>
  20. #include <linux/security.h>
  21. #include <linux/seccomp.h>
  22. #include <linux/audit.h>
  23. #include <linux/signal.h>
  24. #include <asm/asi.h>
  25. #include <asm/pgtable.h>
  26. #include <asm/system.h>
  27. #include <asm/uaccess.h>
  28. #include <asm/psrcompat.h>
  29. #include <asm/visasm.h>
  30. #include <asm/spitfire.h>
  31. #include <asm/page.h>
  32. #include <asm/cpudata.h>
  33. /* Returning from ptrace is a bit tricky because the syscall return
  34. * low level code assumes any value returned which is negative and
  35. * is a valid errno will mean setting the condition codes to indicate
  36. * an error return. This doesn't work, so we have this hook.
  37. */
  38. static inline void pt_error_return(struct pt_regs *regs, unsigned long error)
  39. {
  40. regs->u_regs[UREG_I0] = error;
  41. regs->tstate |= (TSTATE_ICARRY | TSTATE_XCARRY);
  42. regs->tpc = regs->tnpc;
  43. regs->tnpc += 4;
  44. }
  45. static inline void pt_succ_return(struct pt_regs *regs, unsigned long value)
  46. {
  47. regs->u_regs[UREG_I0] = value;
  48. regs->tstate &= ~(TSTATE_ICARRY | TSTATE_XCARRY);
  49. regs->tpc = regs->tnpc;
  50. regs->tnpc += 4;
  51. }
  52. static inline void
  53. pt_succ_return_linux(struct pt_regs *regs, unsigned long value, void __user *addr)
  54. {
  55. if (test_thread_flag(TIF_32BIT)) {
  56. if (put_user(value, (unsigned int __user *) addr)) {
  57. pt_error_return(regs, EFAULT);
  58. return;
  59. }
  60. } else {
  61. if (put_user(value, (long __user *) addr)) {
  62. pt_error_return(regs, EFAULT);
  63. return;
  64. }
  65. }
  66. regs->u_regs[UREG_I0] = 0;
  67. regs->tstate &= ~(TSTATE_ICARRY | TSTATE_XCARRY);
  68. regs->tpc = regs->tnpc;
  69. regs->tnpc += 4;
  70. }
  71. static void
  72. pt_os_succ_return (struct pt_regs *regs, unsigned long val, void __user *addr)
  73. {
  74. if (current->personality == PER_SUNOS)
  75. pt_succ_return (regs, val);
  76. else
  77. pt_succ_return_linux (regs, val, addr);
  78. }
  79. /* #define ALLOW_INIT_TRACING */
  80. /* #define DEBUG_PTRACE */
  81. #ifdef DEBUG_PTRACE
  82. char *pt_rq [] = {
  83. /* 0 */ "TRACEME", "PEEKTEXT", "PEEKDATA", "PEEKUSR",
  84. /* 4 */ "POKETEXT", "POKEDATA", "POKEUSR", "CONT",
  85. /* 8 */ "KILL", "SINGLESTEP", "SUNATTACH", "SUNDETACH",
  86. /* 12 */ "GETREGS", "SETREGS", "GETFPREGS", "SETFPREGS",
  87. /* 16 */ "READDATA", "WRITEDATA", "READTEXT", "WRITETEXT",
  88. /* 20 */ "GETFPAREGS", "SETFPAREGS", "unknown", "unknown",
  89. /* 24 */ "SYSCALL", ""
  90. };
  91. #endif
  92. /*
  93. * Called by kernel/ptrace.c when detaching..
  94. *
  95. * Make sure single step bits etc are not set.
  96. */
  97. void ptrace_disable(struct task_struct *child)
  98. {
  99. /* nothing to do */
  100. }
  101. /* To get the necessary page struct, access_process_vm() first calls
  102. * get_user_pages(). This has done a flush_dcache_page() on the
  103. * accessed page. Then our caller (copy_{to,from}_user_page()) did
  104. * to memcpy to read/write the data from that page.
  105. *
  106. * Now, the only thing we have to do is:
  107. * 1) flush the D-cache if it's possible than an illegal alias
  108. * has been created
  109. * 2) flush the I-cache if this is pre-cheetah and we did a write
  110. */
  111. void flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
  112. unsigned long uaddr, void *kaddr,
  113. unsigned long len, int write)
  114. {
  115. BUG_ON(len > PAGE_SIZE);
  116. if (tlb_type == hypervisor)
  117. return;
  118. #ifdef DCACHE_ALIASING_POSSIBLE
  119. /* If bit 13 of the kernel address we used to access the
  120. * user page is the same as the virtual address that page
  121. * is mapped to in the user's address space, we can skip the
  122. * D-cache flush.
  123. */
  124. if ((uaddr ^ (unsigned long) kaddr) & (1UL << 13)) {
  125. unsigned long start = __pa(kaddr);
  126. unsigned long end = start + len;
  127. unsigned long dcache_line_size;
  128. dcache_line_size = local_cpu_data().dcache_line_size;
  129. if (tlb_type == spitfire) {
  130. for (; start < end; start += dcache_line_size)
  131. spitfire_put_dcache_tag(start & 0x3fe0, 0x0);
  132. } else {
  133. start &= ~(dcache_line_size - 1);
  134. for (; start < end; start += dcache_line_size)
  135. __asm__ __volatile__(
  136. "stxa %%g0, [%0] %1\n\t"
  137. "membar #Sync"
  138. : /* no outputs */
  139. : "r" (start),
  140. "i" (ASI_DCACHE_INVALIDATE));
  141. }
  142. }
  143. #endif
  144. if (write && tlb_type == spitfire) {
  145. unsigned long start = (unsigned long) kaddr;
  146. unsigned long end = start + len;
  147. unsigned long icache_line_size;
  148. icache_line_size = local_cpu_data().icache_line_size;
  149. for (; start < end; start += icache_line_size)
  150. flushi(start);
  151. }
  152. }
  153. asmlinkage void do_ptrace(struct pt_regs *regs)
  154. {
  155. int request = regs->u_regs[UREG_I0];
  156. pid_t pid = regs->u_regs[UREG_I1];
  157. unsigned long addr = regs->u_regs[UREG_I2];
  158. unsigned long data = regs->u_regs[UREG_I3];
  159. unsigned long addr2 = regs->u_regs[UREG_I4];
  160. struct task_struct *child;
  161. int ret;
  162. if (test_thread_flag(TIF_32BIT)) {
  163. addr &= 0xffffffffUL;
  164. data &= 0xffffffffUL;
  165. addr2 &= 0xffffffffUL;
  166. }
  167. lock_kernel();
  168. #ifdef DEBUG_PTRACE
  169. {
  170. char *s;
  171. if ((request >= 0) && (request <= 24))
  172. s = pt_rq [request];
  173. else
  174. s = "unknown";
  175. if (request == PTRACE_POKEDATA && data == 0x91d02001){
  176. printk ("do_ptrace: breakpoint pid=%d, addr=%016lx addr2=%016lx\n",
  177. pid, addr, addr2);
  178. } else
  179. printk("do_ptrace: rq=%s(%d) pid=%d addr=%016lx data=%016lx addr2=%016lx\n",
  180. s, request, pid, addr, data, addr2);
  181. }
  182. #endif
  183. if (request == PTRACE_TRACEME) {
  184. ret = ptrace_traceme();
  185. if (ret < 0)
  186. pt_error_return(regs, -ret);
  187. else
  188. pt_succ_return(regs, 0);
  189. goto out;
  190. }
  191. child = ptrace_get_task_struct(pid);
  192. if (IS_ERR(child)) {
  193. ret = PTR_ERR(child);
  194. pt_error_return(regs, -ret);
  195. goto out;
  196. }
  197. if ((current->personality == PER_SUNOS && request == PTRACE_SUNATTACH)
  198. || (current->personality != PER_SUNOS && request == PTRACE_ATTACH)) {
  199. if (ptrace_attach(child)) {
  200. pt_error_return(regs, EPERM);
  201. goto out_tsk;
  202. }
  203. pt_succ_return(regs, 0);
  204. goto out_tsk;
  205. }
  206. ret = ptrace_check_attach(child, request == PTRACE_KILL);
  207. if (ret < 0) {
  208. pt_error_return(regs, -ret);
  209. goto out_tsk;
  210. }
  211. if (!(test_thread_flag(TIF_32BIT)) &&
  212. ((request == PTRACE_READDATA64) ||
  213. (request == PTRACE_WRITEDATA64) ||
  214. (request == PTRACE_READTEXT64) ||
  215. (request == PTRACE_WRITETEXT64) ||
  216. (request == PTRACE_PEEKTEXT64) ||
  217. (request == PTRACE_POKETEXT64) ||
  218. (request == PTRACE_PEEKDATA64) ||
  219. (request == PTRACE_POKEDATA64))) {
  220. addr = regs->u_regs[UREG_G2];
  221. addr2 = regs->u_regs[UREG_G3];
  222. request -= 30; /* wheee... */
  223. }
  224. switch(request) {
  225. case PTRACE_PEEKUSR:
  226. if (addr != 0)
  227. pt_error_return(regs, EIO);
  228. else
  229. pt_succ_return(regs, 0);
  230. goto out_tsk;
  231. case PTRACE_PEEKTEXT: /* read word at location addr. */
  232. case PTRACE_PEEKDATA: {
  233. unsigned long tmp64;
  234. unsigned int tmp32;
  235. int res, copied;
  236. res = -EIO;
  237. if (test_thread_flag(TIF_32BIT)) {
  238. copied = access_process_vm(child, addr,
  239. &tmp32, sizeof(tmp32), 0);
  240. tmp64 = (unsigned long) tmp32;
  241. if (copied == sizeof(tmp32))
  242. res = 0;
  243. } else {
  244. copied = access_process_vm(child, addr,
  245. &tmp64, sizeof(tmp64), 0);
  246. if (copied == sizeof(tmp64))
  247. res = 0;
  248. }
  249. if (res < 0)
  250. pt_error_return(regs, -res);
  251. else
  252. pt_os_succ_return(regs, tmp64, (void __user *) data);
  253. goto out_tsk;
  254. }
  255. case PTRACE_POKETEXT: /* write the word at location addr. */
  256. case PTRACE_POKEDATA: {
  257. unsigned long tmp64;
  258. unsigned int tmp32;
  259. int copied, res = -EIO;
  260. if (test_thread_flag(TIF_32BIT)) {
  261. tmp32 = data;
  262. copied = access_process_vm(child, addr,
  263. &tmp32, sizeof(tmp32), 1);
  264. if (copied == sizeof(tmp32))
  265. res = 0;
  266. } else {
  267. tmp64 = data;
  268. copied = access_process_vm(child, addr,
  269. &tmp64, sizeof(tmp64), 1);
  270. if (copied == sizeof(tmp64))
  271. res = 0;
  272. }
  273. if (res < 0)
  274. pt_error_return(regs, -res);
  275. else
  276. pt_succ_return(regs, res);
  277. goto out_tsk;
  278. }
  279. case PTRACE_GETREGS: {
  280. struct pt_regs32 __user *pregs =
  281. (struct pt_regs32 __user *) addr;
  282. struct pt_regs *cregs = task_pt_regs(child);
  283. int rval;
  284. if (__put_user(tstate_to_psr(cregs->tstate), (&pregs->psr)) ||
  285. __put_user(cregs->tpc, (&pregs->pc)) ||
  286. __put_user(cregs->tnpc, (&pregs->npc)) ||
  287. __put_user(cregs->y, (&pregs->y))) {
  288. pt_error_return(regs, EFAULT);
  289. goto out_tsk;
  290. }
  291. for (rval = 1; rval < 16; rval++)
  292. if (__put_user(cregs->u_regs[rval], (&pregs->u_regs[rval - 1]))) {
  293. pt_error_return(regs, EFAULT);
  294. goto out_tsk;
  295. }
  296. pt_succ_return(regs, 0);
  297. #ifdef DEBUG_PTRACE
  298. printk ("PC=%lx nPC=%lx o7=%lx\n", cregs->tpc, cregs->tnpc, cregs->u_regs [15]);
  299. #endif
  300. goto out_tsk;
  301. }
  302. case PTRACE_GETREGS64: {
  303. struct pt_regs __user *pregs = (struct pt_regs __user *) addr;
  304. struct pt_regs *cregs = task_pt_regs(child);
  305. unsigned long tpc = cregs->tpc;
  306. int rval;
  307. if ((task_thread_info(child)->flags & _TIF_32BIT) != 0)
  308. tpc &= 0xffffffff;
  309. if (__put_user(cregs->tstate, (&pregs->tstate)) ||
  310. __put_user(tpc, (&pregs->tpc)) ||
  311. __put_user(cregs->tnpc, (&pregs->tnpc)) ||
  312. __put_user(cregs->y, (&pregs->y))) {
  313. pt_error_return(regs, EFAULT);
  314. goto out_tsk;
  315. }
  316. for (rval = 1; rval < 16; rval++)
  317. if (__put_user(cregs->u_regs[rval], (&pregs->u_regs[rval - 1]))) {
  318. pt_error_return(regs, EFAULT);
  319. goto out_tsk;
  320. }
  321. pt_succ_return(regs, 0);
  322. #ifdef DEBUG_PTRACE
  323. printk ("PC=%lx nPC=%lx o7=%lx\n", cregs->tpc, cregs->tnpc, cregs->u_regs [15]);
  324. #endif
  325. goto out_tsk;
  326. }
  327. case PTRACE_SETREGS: {
  328. struct pt_regs32 __user *pregs =
  329. (struct pt_regs32 __user *) addr;
  330. struct pt_regs *cregs = task_pt_regs(child);
  331. unsigned int psr, pc, npc, y;
  332. int i;
  333. /* Must be careful, tracing process can only set certain
  334. * bits in the psr.
  335. */
  336. if (__get_user(psr, (&pregs->psr)) ||
  337. __get_user(pc, (&pregs->pc)) ||
  338. __get_user(npc, (&pregs->npc)) ||
  339. __get_user(y, (&pregs->y))) {
  340. pt_error_return(regs, EFAULT);
  341. goto out_tsk;
  342. }
  343. cregs->tstate &= ~(TSTATE_ICC);
  344. cregs->tstate |= psr_to_tstate_icc(psr);
  345. if (!((pc | npc) & 3)) {
  346. cregs->tpc = pc;
  347. cregs->tnpc = npc;
  348. }
  349. cregs->y = y;
  350. for (i = 1; i < 16; i++) {
  351. if (__get_user(cregs->u_regs[i], (&pregs->u_regs[i-1]))) {
  352. pt_error_return(regs, EFAULT);
  353. goto out_tsk;
  354. }
  355. }
  356. pt_succ_return(regs, 0);
  357. goto out_tsk;
  358. }
  359. case PTRACE_SETREGS64: {
  360. struct pt_regs __user *pregs = (struct pt_regs __user *) addr;
  361. struct pt_regs *cregs = task_pt_regs(child);
  362. unsigned long tstate, tpc, tnpc, y;
  363. int i;
  364. /* Must be careful, tracing process can only set certain
  365. * bits in the psr.
  366. */
  367. if (__get_user(tstate, (&pregs->tstate)) ||
  368. __get_user(tpc, (&pregs->tpc)) ||
  369. __get_user(tnpc, (&pregs->tnpc)) ||
  370. __get_user(y, (&pregs->y))) {
  371. pt_error_return(regs, EFAULT);
  372. goto out_tsk;
  373. }
  374. if ((task_thread_info(child)->flags & _TIF_32BIT) != 0) {
  375. tpc &= 0xffffffff;
  376. tnpc &= 0xffffffff;
  377. }
  378. tstate &= (TSTATE_ICC | TSTATE_XCC);
  379. cregs->tstate &= ~(TSTATE_ICC | TSTATE_XCC);
  380. cregs->tstate |= tstate;
  381. if (!((tpc | tnpc) & 3)) {
  382. cregs->tpc = tpc;
  383. cregs->tnpc = tnpc;
  384. }
  385. cregs->y = y;
  386. for (i = 1; i < 16; i++) {
  387. if (__get_user(cregs->u_regs[i], (&pregs->u_regs[i-1]))) {
  388. pt_error_return(regs, EFAULT);
  389. goto out_tsk;
  390. }
  391. }
  392. pt_succ_return(regs, 0);
  393. goto out_tsk;
  394. }
  395. case PTRACE_GETFPREGS: {
  396. struct fps {
  397. unsigned int regs[32];
  398. unsigned int fsr;
  399. unsigned int flags;
  400. unsigned int extra;
  401. unsigned int fpqd;
  402. struct fq {
  403. unsigned int insnaddr;
  404. unsigned int insn;
  405. } fpq[16];
  406. };
  407. struct fps __user *fps = (struct fps __user *) addr;
  408. unsigned long *fpregs = task_thread_info(child)->fpregs;
  409. if (copy_to_user(&fps->regs[0], fpregs,
  410. (32 * sizeof(unsigned int))) ||
  411. __put_user(task_thread_info(child)->xfsr[0], (&fps->fsr)) ||
  412. __put_user(0, (&fps->fpqd)) ||
  413. __put_user(0, (&fps->flags)) ||
  414. __put_user(0, (&fps->extra)) ||
  415. clear_user(&fps->fpq[0], 32 * sizeof(unsigned int))) {
  416. pt_error_return(regs, EFAULT);
  417. goto out_tsk;
  418. }
  419. pt_succ_return(regs, 0);
  420. goto out_tsk;
  421. }
  422. case PTRACE_GETFPREGS64: {
  423. struct fps {
  424. unsigned int regs[64];
  425. unsigned long fsr;
  426. };
  427. struct fps __user *fps = (struct fps __user *) addr;
  428. unsigned long *fpregs = task_thread_info(child)->fpregs;
  429. if (copy_to_user(&fps->regs[0], fpregs,
  430. (64 * sizeof(unsigned int))) ||
  431. __put_user(task_thread_info(child)->xfsr[0], (&fps->fsr))) {
  432. pt_error_return(regs, EFAULT);
  433. goto out_tsk;
  434. }
  435. pt_succ_return(regs, 0);
  436. goto out_tsk;
  437. }
  438. case PTRACE_SETFPREGS: {
  439. struct fps {
  440. unsigned int regs[32];
  441. unsigned int fsr;
  442. unsigned int flags;
  443. unsigned int extra;
  444. unsigned int fpqd;
  445. struct fq {
  446. unsigned int insnaddr;
  447. unsigned int insn;
  448. } fpq[16];
  449. };
  450. struct fps __user *fps = (struct fps __user *) addr;
  451. unsigned long *fpregs = task_thread_info(child)->fpregs;
  452. unsigned fsr;
  453. if (copy_from_user(fpregs, &fps->regs[0],
  454. (32 * sizeof(unsigned int))) ||
  455. __get_user(fsr, (&fps->fsr))) {
  456. pt_error_return(regs, EFAULT);
  457. goto out_tsk;
  458. }
  459. task_thread_info(child)->xfsr[0] &= 0xffffffff00000000UL;
  460. task_thread_info(child)->xfsr[0] |= fsr;
  461. if (!(task_thread_info(child)->fpsaved[0] & FPRS_FEF))
  462. task_thread_info(child)->gsr[0] = 0;
  463. task_thread_info(child)->fpsaved[0] |= (FPRS_FEF | FPRS_DL);
  464. pt_succ_return(regs, 0);
  465. goto out_tsk;
  466. }
  467. case PTRACE_SETFPREGS64: {
  468. struct fps {
  469. unsigned int regs[64];
  470. unsigned long fsr;
  471. };
  472. struct fps __user *fps = (struct fps __user *) addr;
  473. unsigned long *fpregs = task_thread_info(child)->fpregs;
  474. if (copy_from_user(fpregs, &fps->regs[0],
  475. (64 * sizeof(unsigned int))) ||
  476. __get_user(task_thread_info(child)->xfsr[0], (&fps->fsr))) {
  477. pt_error_return(regs, EFAULT);
  478. goto out_tsk;
  479. }
  480. if (!(task_thread_info(child)->fpsaved[0] & FPRS_FEF))
  481. task_thread_info(child)->gsr[0] = 0;
  482. task_thread_info(child)->fpsaved[0] |= (FPRS_FEF | FPRS_DL | FPRS_DU);
  483. pt_succ_return(regs, 0);
  484. goto out_tsk;
  485. }
  486. case PTRACE_READTEXT:
  487. case PTRACE_READDATA: {
  488. int res = ptrace_readdata(child, addr,
  489. (char __user *)addr2, data);
  490. if (res == data) {
  491. pt_succ_return(regs, 0);
  492. goto out_tsk;
  493. }
  494. if (res >= 0)
  495. res = -EIO;
  496. pt_error_return(regs, -res);
  497. goto out_tsk;
  498. }
  499. case PTRACE_WRITETEXT:
  500. case PTRACE_WRITEDATA: {
  501. int res = ptrace_writedata(child, (char __user *) addr2,
  502. addr, data);
  503. if (res == data) {
  504. pt_succ_return(regs, 0);
  505. goto out_tsk;
  506. }
  507. if (res >= 0)
  508. res = -EIO;
  509. pt_error_return(regs, -res);
  510. goto out_tsk;
  511. }
  512. case PTRACE_SYSCALL: /* continue and stop at (return from) syscall */
  513. addr = 1;
  514. case PTRACE_CONT: { /* restart after signal. */
  515. if (!valid_signal(data)) {
  516. pt_error_return(regs, EIO);
  517. goto out_tsk;
  518. }
  519. if (request == PTRACE_SYSCALL) {
  520. set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
  521. } else {
  522. clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
  523. }
  524. child->exit_code = data;
  525. #ifdef DEBUG_PTRACE
  526. printk("CONT: %s [%d]: set exit_code = %x %lx %lx\n", child->comm,
  527. child->pid, child->exit_code,
  528. task_pt_regs(child)->tpc,
  529. task_pt_regs(child)->tnpc);
  530. #endif
  531. wake_up_process(child);
  532. pt_succ_return(regs, 0);
  533. goto out_tsk;
  534. }
  535. /*
  536. * make the child exit. Best I can do is send it a sigkill.
  537. * perhaps it should be put in the status that it wants to
  538. * exit.
  539. */
  540. case PTRACE_KILL: {
  541. if (child->exit_state == EXIT_ZOMBIE) { /* already dead */
  542. pt_succ_return(regs, 0);
  543. goto out_tsk;
  544. }
  545. child->exit_code = SIGKILL;
  546. wake_up_process(child);
  547. pt_succ_return(regs, 0);
  548. goto out_tsk;
  549. }
  550. case PTRACE_SUNDETACH: { /* detach a process that was attached. */
  551. int error = ptrace_detach(child, data);
  552. if (error) {
  553. pt_error_return(regs, EIO);
  554. goto out_tsk;
  555. }
  556. pt_succ_return(regs, 0);
  557. goto out_tsk;
  558. }
  559. /* PTRACE_DUMPCORE unsupported... */
  560. case PTRACE_GETEVENTMSG: {
  561. int err;
  562. if (test_thread_flag(TIF_32BIT))
  563. err = put_user(child->ptrace_message,
  564. (unsigned int __user *) data);
  565. else
  566. err = put_user(child->ptrace_message,
  567. (unsigned long __user *) data);
  568. if (err)
  569. pt_error_return(regs, -err);
  570. else
  571. pt_succ_return(regs, 0);
  572. break;
  573. }
  574. default: {
  575. int err = ptrace_request(child, request, addr, data);
  576. if (err)
  577. pt_error_return(regs, -err);
  578. else
  579. pt_succ_return(regs, 0);
  580. goto out_tsk;
  581. }
  582. }
  583. out_tsk:
  584. if (child)
  585. put_task_struct(child);
  586. out:
  587. unlock_kernel();
  588. }
  589. asmlinkage void syscall_trace(struct pt_regs *regs, int syscall_exit_p)
  590. {
  591. /* do the secure computing check first */
  592. secure_computing(regs->u_regs[UREG_G1]);
  593. if (unlikely(current->audit_context) && syscall_exit_p) {
  594. unsigned long tstate = regs->tstate;
  595. int result = AUDITSC_SUCCESS;
  596. if (unlikely(tstate & (TSTATE_XCARRY | TSTATE_ICARRY)))
  597. result = AUDITSC_FAILURE;
  598. audit_syscall_exit(result, regs->u_regs[UREG_I0]);
  599. }
  600. if (!(current->ptrace & PT_PTRACED))
  601. goto out;
  602. if (!test_thread_flag(TIF_SYSCALL_TRACE))
  603. goto out;
  604. ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
  605. ? 0x80 : 0));
  606. /*
  607. * this isn't the same as continuing with a signal, but it will do
  608. * for normal use. strace only continues with a signal if the
  609. * stopping signal is not SIGTRAP. -brl
  610. */
  611. if (current->exit_code) {
  612. send_sig(current->exit_code, current, 1);
  613. current->exit_code = 0;
  614. }
  615. out:
  616. if (unlikely(current->audit_context) && !syscall_exit_p)
  617. audit_syscall_entry((test_thread_flag(TIF_32BIT) ?
  618. AUDIT_ARCH_SPARC :
  619. AUDIT_ARCH_SPARC64),
  620. regs->u_regs[UREG_G1],
  621. regs->u_regs[UREG_I0],
  622. regs->u_regs[UREG_I1],
  623. regs->u_regs[UREG_I2],
  624. regs->u_regs[UREG_I3]);
  625. }