ptrace.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:36k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Kernel support for the ptrace() and syscall tracing interfaces.
  3.  *
  4.  * Copyright (C) 1999-2002 Hewlett-Packard Co
  5.  * David Mosberger-Tang <davidm@hpl.hp.com>
  6.  *
  7.  * Derived from the x86 and Alpha versions.  Most of the code in here
  8.  * could actually be factored into a common set of routines.
  9.  */
  10. #include <linux/config.h>
  11. #include <linux/kernel.h>
  12. #include <linux/sched.h>
  13. #include <linux/mm.h>
  14. #include <linux/errno.h>
  15. #include <linux/ptrace.h>
  16. #include <linux/smp_lock.h>
  17. #include <linux/user.h>
  18. #include <asm/pgtable.h>
  19. #include <asm/processor.h>
  20. #include <asm/ptrace_offsets.h>
  21. #include <asm/rse.h>
  22. #include <asm/system.h>
  23. #include <asm/uaccess.h>
  24. #include <asm/unwind.h>
  25. #ifdef CONFIG_PERFMON
  26. # include <asm/perfmon.h>
  27. #endif
  28. /*
  29.  * Bits in the PSR that we allow ptrace() to change:
  30.  * be, up, ac, mfl, mfh (the user mask; five bits total)
  31.  * db (debug breakpoint fault; one bit)
  32.  * id (instruction debug fault disable; one bit)
  33.  * dd (data debug fault disable; one bit)
  34.  * ri (restart instruction; two bits)
  35.  * is (instruction set; one bit)
  36.  */
  37. #define IPSR_WRITE_MASK 
  38. (IA64_PSR_UM | IA64_PSR_DB | IA64_PSR_IS | IA64_PSR_ID | IA64_PSR_DD | IA64_PSR_RI)
  39. #define IPSR_READ_MASK IPSR_WRITE_MASK
  40. #define PTRACE_DEBUG 1
  41. #if PTRACE_DEBUG
  42. # define dprintk(format...) printk(format)
  43. # define inline
  44. #else
  45. # define dprintk(format...)
  46. #endif
  47. /*
  48.  * Collect the NaT bits for r1-r31 from scratch_unat and return a NaT
  49.  * bitset where bit i is set iff the NaT bit of register i is set.
  50.  */
  51. unsigned long
  52. ia64_get_scratch_nat_bits (struct pt_regs *pt, unsigned long scratch_unat)
  53. {
  54. # define GET_BITS(first, last, unat)
  55. ({
  56. unsigned long bit = ia64_unat_pos(&pt->r##first);
  57. unsigned long mask = ((1UL << (last - first + 1)) - 1) << first;
  58. (ia64_rotl(unat, first) >> bit) & mask;
  59. })
  60. unsigned long val;
  61. val  = GET_BITS( 1,  3, scratch_unat);
  62. val |= GET_BITS(12, 15, scratch_unat);
  63. val |= GET_BITS( 8, 11, scratch_unat);
  64. val |= GET_BITS(16, 31, scratch_unat);
  65. return val;
  66. # undef GET_BITS
  67. }
  68. /*
  69.  * Set the NaT bits for the scratch registers according to NAT and
  70.  * return the resulting unat (assuming the scratch registers are
  71.  * stored in PT).
  72.  */
  73. unsigned long
  74. ia64_put_scratch_nat_bits (struct pt_regs *pt, unsigned long nat)
  75. {
  76. unsigned long scratch_unat;
  77. # define PUT_BITS(first, last, nat)
  78. ({
  79. unsigned long bit = ia64_unat_pos(&pt->r##first);
  80. unsigned long mask = ((1UL << (last - first + 1)) - 1) << bit;
  81. (ia64_rotr(nat, first) << bit) & mask;
  82. })
  83. scratch_unat  = PUT_BITS( 1,  3, nat);
  84. scratch_unat |= PUT_BITS(12, 15, nat);
  85. scratch_unat |= PUT_BITS( 8, 11, nat);
  86. scratch_unat |= PUT_BITS(16, 31, nat);
  87. return scratch_unat;
  88. # undef PUT_BITS
  89. }
  90. #define IA64_MLX_TEMPLATE 0x2
  91. #define IA64_MOVL_OPCODE 6
  92. void
  93. ia64_increment_ip (struct pt_regs *regs)
  94. {
  95. unsigned long w0, ri = ia64_psr(regs)->ri + 1;
  96. if (ri > 2) {
  97. ri = 0;
  98. regs->cr_iip += 16;
  99. } else if (ri == 2) {
  100. get_user(w0, (char *) regs->cr_iip + 0);
  101. if (((w0 >> 1) & 0xf) == IA64_MLX_TEMPLATE) {
  102. /*
  103.  * rfi'ing to slot 2 of an MLX bundle causes
  104.  * an illegal operation fault.  We don't want
  105.  * that to happen...
  106.  */
  107. ri = 0;
  108. regs->cr_iip += 16;
  109. }
  110. }
  111. ia64_psr(regs)->ri = ri;
  112. }
  113. void
  114. ia64_decrement_ip (struct pt_regs *regs)
  115. {
  116. unsigned long w0, ri = ia64_psr(regs)->ri - 1;
  117. if (ia64_psr(regs)->ri == 0) {
  118. regs->cr_iip -= 16;
  119. ri = 2;
  120. get_user(w0, (char *) regs->cr_iip + 0);
  121. if (((w0 >> 1) & 0xf) == IA64_MLX_TEMPLATE) {
  122. /*
  123.  * rfi'ing to slot 2 of an MLX bundle causes
  124.  * an illegal operation fault.  We don't want
  125.  * that to happen...
  126.  */
  127. ri = 1;
  128. }
  129. }
  130. ia64_psr(regs)->ri = ri;
  131. }
  132. /*
  133.  * This routine is used to read an rnat bits that are stored on the kernel backing store.
  134.  * Since, in general, the alignment of the user and kernel are different, this is not
  135.  * completely trivial.  In essence, we need to construct the user RNAT based on up to two
  136.  * kernel RNAT values and/or the RNAT value saved in the child's pt_regs.
  137.  *
  138.  * user rbs
  139.  *
  140.  * +--------+ <-- lowest address
  141.  * | slot62 |
  142.  * +--------+
  143.  * |  rnat  | 0x....1f8
  144.  * +--------+
  145.  * | slot00 | 
  146.  * +--------+ |
  147.  * | slot01 | > child_regs->ar_rnat
  148.  * +--------+ |
  149.  * | slot02 | / kernel rbs
  150.  * +--------+ +--------+
  151.  *     <- child_regs->ar_bspstore | slot61 | <-- krbs
  152.  * +- - - - + +--------+
  153.  * | slot62 |
  154.  * +- - - - + +--------+
  155.  * |  rnat  |
  156.  * +- - - - + +--------+
  157.  *   vrnat | slot00 |
  158.  * +- - - - + +--------+
  159.  * =  =
  160.  * +--------+
  161.  * | slot00 | 
  162.  * +--------+ |
  163.  * | slot01 | > child_stack->ar_rnat
  164.  * +--------+ |
  165.  * | slot02 | /
  166.  * +--------+
  167.  *   <--- child_stack->ar_bspstore
  168.  *
  169.  * The way to think of this code is as follows: bit 0 in the user rnat corresponds to some
  170.  * bit N (0 <= N <= 62) in one of the kernel rnat value.  The kernel rnat value holding
  171.  * this bit is stored in variable rnat0.  rnat1 is loaded with the kernel rnat value that
  172.  * form the upper bits of the user rnat value.
  173.  *
  174.  * Boundary cases:
  175.  *
  176.  * o when reading the rnat "below" the first rnat slot on the kernel backing store,
  177.  *   rnat0/rnat1 are set to 0 and the low order bits are merged in from pt->ar_rnat.
  178.  *
  179.  * o when reading the rnat "above" the last rnat slot on the kernel backing store,
  180.  *   rnat0/rnat1 gets its value from sw->ar_rnat.
  181.  */
  182. static unsigned long
  183. get_rnat (struct pt_regs *pt, struct switch_stack *sw,
  184.   unsigned long *krbs, unsigned long *urnat_addr)
  185. {
  186. unsigned long rnat0 = 0, rnat1 = 0, urnat = 0, *slot0_kaddr, kmask = ~0UL;
  187. unsigned long *kbsp, *ubspstore, *rnat0_kaddr, *rnat1_kaddr, shift;
  188. long num_regs;
  189. kbsp = (unsigned long *) sw->ar_bspstore;
  190. ubspstore = (unsigned long *) pt->ar_bspstore;
  191. /*
  192.  * First, figure out which bit number slot 0 in user-land maps
  193.  * to in the kernel rnat.  Do this by figuring out how many
  194.  * register slots we're beyond the user's backingstore and
  195.  * then computing the equivalent address in kernel space.
  196.  */
  197. num_regs = ia64_rse_num_regs(ubspstore, urnat_addr + 1);
  198. slot0_kaddr = ia64_rse_skip_regs(krbs, num_regs);
  199. shift = ia64_rse_slot_num(slot0_kaddr);
  200. rnat1_kaddr = ia64_rse_rnat_addr(slot0_kaddr);
  201. rnat0_kaddr = rnat1_kaddr - 64;
  202. if (ubspstore + 63 > urnat_addr) {
  203. /* some bits need to be merged in from pt->ar_rnat */
  204. kmask = ~((1UL << ia64_rse_slot_num(ubspstore)) - 1);
  205. urnat = (pt->ar_rnat & ~kmask);
  206. }
  207. if (rnat0_kaddr >= kbsp) {
  208. rnat0 = sw->ar_rnat;
  209. } else if (rnat0_kaddr > krbs) {
  210. rnat0 = *rnat0_kaddr;
  211. }
  212. if (rnat1_kaddr >= kbsp) {
  213. rnat1 = sw->ar_rnat;
  214. } else if (rnat1_kaddr > krbs) {
  215. rnat1 = *rnat1_kaddr;
  216. }
  217. urnat |= ((rnat1 << (63 - shift)) | (rnat0 >> shift)) & kmask;
  218. return urnat;
  219. }
  220. /*
  221.  * The reverse of get_rnat.
  222.  */
  223. static void
  224. put_rnat (struct pt_regs *pt, struct switch_stack *sw,
  225.   unsigned long *krbs, unsigned long *urnat_addr, unsigned long urnat)
  226. {
  227. unsigned long rnat0 = 0, rnat1 = 0, rnat = 0, *slot0_kaddr, kmask = ~0UL, mask;
  228. unsigned long *kbsp, *ubspstore, *rnat0_kaddr, *rnat1_kaddr, shift;
  229. long num_regs;
  230. kbsp = (unsigned long *) sw->ar_bspstore;
  231. ubspstore = (unsigned long *) pt->ar_bspstore;
  232. /*
  233.  * First, figure out which bit number slot 0 in user-land maps
  234.  * to in the kernel rnat.  Do this by figuring out how many
  235.  * register slots we're beyond the user's backingstore and
  236.  * then computing the equivalent address in kernel space.
  237.  */
  238. num_regs = (long) ia64_rse_num_regs(ubspstore, urnat_addr + 1);
  239. slot0_kaddr = ia64_rse_skip_regs(krbs, num_regs);
  240. shift = ia64_rse_slot_num(slot0_kaddr);
  241. rnat1_kaddr = ia64_rse_rnat_addr(slot0_kaddr);
  242. rnat0_kaddr = rnat1_kaddr - 64;
  243. if (ubspstore + 63 > urnat_addr) {
  244. /* some bits need to be place in pt->ar_rnat: */
  245. kmask = ~((1UL << ia64_rse_slot_num(ubspstore)) - 1);
  246. pt->ar_rnat = (pt->ar_rnat & kmask) | (rnat & ~kmask);
  247. }
  248. /*
  249.  * Note: Section 11.1 of the EAS guarantees that bit 63 of an
  250.  * rnat slot is ignored. so we don't have to clear it here.
  251.  */
  252. rnat0 = (urnat << shift);
  253. mask = ~0UL << shift;
  254. if (rnat0_kaddr >= kbsp) {
  255. sw->ar_rnat = (sw->ar_rnat & ~mask) | (rnat0 & mask);
  256. } else if (rnat0_kaddr > krbs) {
  257. *rnat0_kaddr = ((*rnat0_kaddr & ~mask) | (rnat0 & mask));
  258. }
  259. rnat1 = (urnat >> (63 - shift));
  260. mask = ~0UL >> (63 - shift);
  261. if (rnat1_kaddr >= kbsp) {
  262. sw->ar_rnat = (sw->ar_rnat & ~mask) | (rnat1 & mask);
  263. } else if (rnat1_kaddr > krbs) {
  264. *rnat1_kaddr = ((*rnat1_kaddr & ~mask) | (rnat1 & mask));
  265. }
  266. }
  267. /*
  268.  * Read a word from the user-level backing store of task CHILD.  ADDR is the user-level
  269.  * address to read the word from, VAL a pointer to the return value, and USER_BSP gives
  270.  * the end of the user-level backing store (i.e., it's the address that would be in ar.bsp
  271.  * after the user executed a "cover" instruction).
  272.  *
  273.  * This routine takes care of accessing the kernel register backing store for those
  274.  * registers that got spilled there.  It also takes care of calculating the appropriate
  275.  * RNaT collection words.
  276.  */
  277. long
  278. ia64_peek (struct task_struct *child, struct switch_stack *child_stack, unsigned long user_rbs_end,
  279.    unsigned long addr, long *val)
  280. {
  281. unsigned long *bspstore, *krbs, regnum, *laddr, *urbs_end, *rnat_addr;
  282. struct pt_regs *child_regs;
  283. size_t copied;
  284. long ret;
  285. urbs_end = (long *) user_rbs_end;
  286. laddr = (unsigned long *) addr;
  287. child_regs = ia64_task_regs(child);
  288. bspstore = (unsigned long *) child_regs->ar_bspstore;
  289. krbs = (unsigned long *) child + IA64_RBS_OFFSET/8;
  290. if (laddr >= bspstore && laddr <= ia64_rse_rnat_addr(urbs_end)) {
  291. /*
  292.  * Attempt to read the RBS in an area that's actually on the kernel RBS =>
  293.  * read the corresponding bits in the kernel RBS.
  294.  */
  295. rnat_addr = ia64_rse_rnat_addr(laddr);
  296. ret = get_rnat(child_regs, child_stack, krbs, rnat_addr);
  297. if (laddr == rnat_addr) {
  298. /* return NaT collection word itself */
  299. *val = ret;
  300. return 0;
  301. }
  302. if (((1UL << ia64_rse_slot_num(laddr)) & ret) != 0) {
  303. /*
  304.  * It is implementation dependent whether the data portion of a
  305.  * NaT value gets saved on a st8.spill or RSE spill (e.g., see
  306.  * EAS 2.6, 4.4.4.6 Register Spill and Fill).  To get consistent
  307.  * behavior across all possible IA-64 implementations, we return
  308.  * zero in this case.
  309.  */
  310. *val = 0;
  311. return 0;
  312. }
  313. if (laddr < urbs_end) {
  314. /* the desired word is on the kernel RBS and is not a NaT */
  315. regnum = ia64_rse_num_regs(bspstore, laddr);
  316. *val = *ia64_rse_skip_regs(krbs, regnum);
  317. return 0;
  318. }
  319. }
  320. copied = access_process_vm(child, addr, &ret, sizeof(ret), 0);
  321. if (copied != sizeof(ret))
  322. return -EIO;
  323. *val = ret;
  324. return 0;
  325. }
  326. long
  327. ia64_poke (struct task_struct *child, struct switch_stack *child_stack, unsigned long user_rbs_end,
  328.    unsigned long addr, long val)
  329. {
  330. unsigned long *bspstore, *krbs, regnum, *laddr, *urbs_end = (long *) user_rbs_end;
  331. struct pt_regs *child_regs;
  332. laddr = (unsigned long *) addr;
  333. child_regs = ia64_task_regs(child);
  334. bspstore = (unsigned long *) child_regs->ar_bspstore;
  335. krbs = (unsigned long *) child + IA64_RBS_OFFSET/8;
  336. if (laddr >= bspstore && laddr <= ia64_rse_rnat_addr(urbs_end)) {
  337. /*
  338.  * Attempt to write the RBS in an area that's actually on the kernel RBS
  339.  * => write the corresponding bits in the kernel RBS.
  340.  */
  341. if (ia64_rse_is_rnat_slot(laddr))
  342. put_rnat(child_regs, child_stack, krbs, laddr, val);
  343. else {
  344. if (laddr < urbs_end) {
  345. regnum = ia64_rse_num_regs(bspstore, laddr);
  346. *ia64_rse_skip_regs(krbs, regnum) = val;
  347. }
  348. }
  349. } else if (access_process_vm(child, addr, &val, sizeof(val), 1) != sizeof(val)) {
  350. return -EIO;
  351. }
  352. return 0;
  353. }
  354. /*
  355.  * Calculate the address of the end of the user-level register backing store.  This is the
  356.  * address that would have been stored in ar.bsp if the user had executed a "cover"
  357.  * instruction right before entering the kernel.  If CFMP is not NULL, it is used to
  358.  * return the "current frame mask" that was active at the time the kernel was entered.
  359.  */
  360. unsigned long
  361. ia64_get_user_rbs_end (struct task_struct *child, struct pt_regs *pt, unsigned long *cfmp)
  362. {
  363. unsigned long *krbs, *bspstore, cfm;
  364. struct unw_frame_info info;
  365. long ndirty;
  366. krbs = (unsigned long *) child + IA64_RBS_OFFSET/8;
  367. bspstore = (unsigned long *) pt->ar_bspstore;
  368. ndirty = ia64_rse_num_regs(krbs, krbs + (pt->loadrs >> 19));
  369. cfm = pt->cr_ifs & ~(1UL << 63);
  370. if ((long) pt->cr_ifs >= 0) {
  371. /*
  372.  * If bit 63 of cr.ifs is cleared, the kernel was entered via a system
  373.  * call and we need to recover the CFM that existed on entry to the
  374.  * kernel by unwinding the kernel stack.
  375.  */
  376. unw_init_from_blocked_task(&info, child);
  377. if (unw_unwind_to_user(&info) == 0) {
  378. unw_get_cfm(&info, &cfm);
  379. ndirty += (cfm & 0x7f);
  380. }
  381. }
  382. if (cfmp)
  383. *cfmp = cfm;
  384. return (unsigned long) ia64_rse_skip_regs(bspstore, ndirty);
  385. }
  386. /*
  387.  * Synchronize (i.e, write) the RSE backing store living in kernel space to the VM of the
  388.  * CHILD task.  SW and PT are the pointers to the switch_stack and pt_regs structures,
  389.  * respectively.  USER_RBS_END is the user-level address at which the backing store ends.
  390.  */
  391. long
  392. ia64_sync_user_rbs (struct task_struct *child, struct switch_stack *sw,
  393.     unsigned long user_rbs_start, unsigned long user_rbs_end)
  394. {
  395. unsigned long addr, val;
  396. long ret;
  397. /* now copy word for word from kernel rbs to user rbs: */
  398. for (addr = user_rbs_start; addr < user_rbs_end; addr += 8) {
  399. ret = ia64_peek(child, sw, user_rbs_end, addr, &val);
  400. if (ret < 0)
  401. return ret;
  402. if (access_process_vm(child, addr, &val, sizeof(val), 1) != sizeof(val))
  403. return -EIO;
  404. }
  405. return 0;
  406. }
  407. /*
  408.  * Simulate user-level "flushrs".  Note: we can't just add pt->loadrs>>16 to
  409.  * pt->ar_bspstore because the kernel backing store and the user-level backing store may
  410.  * have different alignments (and therefore a different number of intervening rnat slots).
  411.  */
  412. static void
  413. user_flushrs (struct task_struct *task, struct pt_regs *pt)
  414. {
  415. unsigned long *krbs;
  416. long ndirty;
  417. krbs = (unsigned long *) task + IA64_RBS_OFFSET/8;
  418. ndirty = ia64_rse_num_regs(krbs, krbs + (pt->loadrs >> 19));
  419. pt->ar_bspstore = (unsigned long) ia64_rse_skip_regs((unsigned long *) pt->ar_bspstore,
  420.      ndirty);
  421. pt->loadrs = 0;
  422. }
  423. /*
  424.  * Synchronize the RSE backing store of CHILD and all tasks that share the address space
  425.  * with it.  CHILD_URBS_END is the address of the end of the register backing store of
  426.  * CHILD.  If MAKE_WRITABLE is set, a user-level "flushrs" is simulated such that the VM
  427.  * can be written via ptrace() and the tasks will pick up the newly written values.  It
  428.  * would be OK to unconditionally simulate a "flushrs", but this would be more intrusive
  429.  * than strictly necessary (e.g., it would make it impossible to obtain the original value
  430.  * of ar.bspstore).
  431.  */
  432. static void
  433. threads_sync_user_rbs (struct task_struct *child, unsigned long child_urbs_end, int make_writable)
  434. {
  435. struct switch_stack *sw;
  436. unsigned long urbs_end;
  437. struct task_struct *p;
  438. struct mm_struct *mm;
  439. struct pt_regs *pt;
  440. long multi_threaded;
  441. task_lock(child);
  442. {
  443. mm = child->mm;
  444. multi_threaded = mm && (atomic_read(&mm->mm_users) > 1);
  445. }
  446. task_unlock(child);
  447. if (!multi_threaded) {
  448. sw = (struct switch_stack *) (child->thread.ksp + 16);
  449. pt = ia64_task_regs(child);
  450. ia64_sync_user_rbs(child, sw, pt->ar_bspstore, child_urbs_end);
  451. if (make_writable)
  452. user_flushrs(child, pt);
  453. } else {
  454. read_lock(&tasklist_lock);
  455. {
  456. for_each_task(p) {
  457. if (p->mm == mm && p->state != TASK_RUNNING) {
  458. sw = (struct switch_stack *) (p->thread.ksp + 16);
  459. pt = ia64_task_regs(p);
  460. urbs_end = ia64_get_user_rbs_end(p, pt, NULL);
  461. ia64_sync_user_rbs(p, sw, pt->ar_bspstore, urbs_end);
  462. if (make_writable)
  463. user_flushrs(p, pt);
  464. }
  465. }
  466. }
  467. read_unlock(&tasklist_lock);
  468. }
  469. child->thread.flags |= IA64_THREAD_KRBS_SYNCED; /* set the flag in the child thread only */
  470. }
  471. /*
  472.  * Write f32-f127 back to task->thread.fph if it has been modified.
  473.  */
  474. inline void
  475. ia64_flush_fph (struct task_struct *task)
  476. {
  477. struct ia64_psr *psr = ia64_psr(ia64_task_regs(task));
  478. #ifdef CONFIG_SMP
  479. struct task_struct *fpu_owner = current;
  480. #else
  481. struct task_struct *fpu_owner = ia64_get_fpu_owner();
  482. #endif
  483. if (task == fpu_owner && psr->mfh) {
  484. psr->mfh = 0;
  485. ia64_save_fpu(&task->thread.fph[0]);
  486. task->thread.flags |= IA64_THREAD_FPH_VALID;
  487. }
  488. }
  489. /*
  490.  * Sync the fph state of the task so that it can be manipulated
  491.  * through thread.fph.  If necessary, f32-f127 are written back to
  492.  * thread.fph or, if the fph state hasn't been used before, thread.fph
  493.  * is cleared to zeroes.  Also, access to f32-f127 is disabled to
  494.  * ensure that the task picks up the state from thread.fph when it
  495.  * executes again.
  496.  */
  497. void
  498. ia64_sync_fph (struct task_struct *task)
  499. {
  500. struct ia64_psr *psr = ia64_psr(ia64_task_regs(task));
  501. ia64_flush_fph(task);
  502. if (!(task->thread.flags & IA64_THREAD_FPH_VALID)) {
  503. task->thread.flags |= IA64_THREAD_FPH_VALID;
  504. memset(&task->thread.fph, 0, sizeof(task->thread.fph));
  505. }
  506. #ifndef CONFIG_SMP
  507. if (ia64_get_fpu_owner() == task)
  508. ia64_set_fpu_owner(0);
  509. #endif
  510. psr->dfh = 1;
  511. }
  512. static int
  513. access_fr (struct unw_frame_info *info, int regnum, int hi, unsigned long *data, int write_access)
  514. {
  515. struct ia64_fpreg fpval;
  516. int ret;
  517. ret = unw_get_fr(info, regnum, &fpval);
  518. if (ret < 0)
  519. return ret;
  520. if (write_access) {
  521. fpval.u.bits[hi] = *data;
  522. ret = unw_set_fr(info, regnum, fpval);
  523. } else
  524. *data = fpval.u.bits[hi];
  525. return ret;
  526. }
  527. static int
  528. access_uarea (struct task_struct *child, unsigned long addr, unsigned long *data, int write_access)
  529. {
  530. unsigned long *ptr, regnum, urbs_end, rnat_addr;
  531. struct switch_stack *sw;
  532. struct unw_frame_info info;
  533. struct pt_regs *pt;
  534. pt = ia64_task_regs(child);
  535. sw = (struct switch_stack *) (child->thread.ksp + 16);
  536. if ((addr & 0x7) != 0) {
  537. dprintk("ptrace: unaligned register address 0x%lxn", addr);
  538. return -1;
  539. }
  540. if (addr < PT_F127 + 16) {
  541. /* accessing fph */
  542. if (write_access)
  543. ia64_sync_fph(child);
  544. else
  545. ia64_flush_fph(child);
  546. ptr = (unsigned long *) ((unsigned long) &child->thread.fph + addr);
  547. } else if (addr >= PT_F10 && addr < PT_F15 + 16) {
  548. /* scratch registers untouched by kernel (saved in switch_stack) */
  549. ptr = (unsigned long *) ((long) sw + addr - PT_NAT_BITS);
  550. } else if (addr < PT_AR_LC + 8) {
  551. /* preserved state: */
  552. unsigned long nat_bits, scratch_unat, dummy = 0;
  553. struct unw_frame_info info;
  554. char nat = 0;
  555. int ret;
  556. unw_init_from_blocked_task(&info, child);
  557. if (unw_unwind_to_user(&info) < 0)
  558. return -1;
  559. switch (addr) {
  560.       case PT_NAT_BITS:
  561. if (write_access) {
  562. nat_bits = *data;
  563. scratch_unat = ia64_put_scratch_nat_bits(pt, nat_bits);
  564. if (unw_set_ar(&info, UNW_AR_UNAT, scratch_unat) < 0) {
  565. dprintk("ptrace: failed to set ar.unatn");
  566. return -1;
  567. }
  568. for (regnum = 4; regnum <= 7; ++regnum) {
  569. unw_get_gr(&info, regnum, &dummy, &nat);
  570. unw_set_gr(&info, regnum, dummy, (nat_bits >> regnum) & 1);
  571. }
  572. } else {
  573. if (unw_get_ar(&info, UNW_AR_UNAT, &scratch_unat) < 0) {
  574. dprintk("ptrace: failed to read ar.unatn");
  575. return -1;
  576. }
  577. nat_bits = ia64_get_scratch_nat_bits(pt, scratch_unat);
  578. for (regnum = 4; regnum <= 7; ++regnum) {
  579. unw_get_gr(&info, regnum, &dummy, &nat);
  580. nat_bits |= (nat != 0) << regnum;
  581. }
  582. *data = nat_bits;
  583. }
  584. return 0;
  585.       case PT_R4: case PT_R5: case PT_R6: case PT_R7:
  586. if (write_access) {
  587. /* read NaT bit first: */
  588. ret = unw_get_gr(&info, (addr - PT_R4)/8 + 4, data, &nat);
  589. if (ret < 0)
  590. return ret;
  591. }
  592. return unw_access_gr(&info, (addr - PT_R4)/8 + 4, data, &nat,
  593.      write_access);
  594.       case PT_B1: case PT_B2: case PT_B3: case PT_B4: case PT_B5:
  595. return unw_access_br(&info, (addr - PT_B1)/8 + 1, data, write_access);
  596.       case PT_AR_EC:
  597. return unw_access_ar(&info, UNW_AR_EC, data, write_access);
  598.       case PT_AR_LC:
  599. return unw_access_ar(&info, UNW_AR_LC, data, write_access);
  600.       default:
  601. if (addr >= PT_F2 && addr < PT_F5 + 16)
  602. return access_fr(&info, (addr - PT_F2)/16 + 2, (addr & 8) != 0,
  603.  data, write_access);
  604. else if (addr >= PT_F16 && addr < PT_F31 + 16)
  605. return access_fr(&info, (addr - PT_F16)/16 + 16, (addr & 8) != 0,
  606.  data, write_access);
  607. else {
  608. dprintk("ptrace: rejecting access to register address 0x%lxn",
  609. addr);
  610. return -1;
  611. }
  612. }
  613. } else if (addr < PT_F9+16) {
  614. /* scratch state */
  615. switch (addr) {
  616.       case PT_AR_BSP:
  617. /*
  618.  * By convention, we use PT_AR_BSP to refer to the end of the user-level
  619.  * backing store.  Use ia64_rse_skip_regs(PT_AR_BSP, -CFM.sof) to get
  620.  * the real value of ar.bsp at the time the kernel was entered.
  621.  */
  622. urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
  623. if (write_access) {
  624. if (*data != urbs_end) {
  625. if (ia64_sync_user_rbs(child, sw,
  626.        pt->ar_bspstore, urbs_end) < 0)
  627. return -1;
  628. /* simulate user-level write of ar.bsp: */
  629. pt->loadrs = 0;
  630. pt->ar_bspstore = *data;
  631. }
  632. } else
  633. *data = urbs_end;
  634. return 0;
  635.       case PT_CFM:
  636. if ((long) pt->cr_ifs < 0) {
  637. if (write_access)
  638. pt->cr_ifs = ((pt->cr_ifs & ~0x3fffffffffUL)
  639.       | (*data & 0x3fffffffffUL));
  640. else
  641. *data = pt->cr_ifs & 0x3fffffffffUL;
  642. } else {
  643. /* kernel was entered through a system call */
  644. unsigned long cfm;
  645. unw_init_from_blocked_task(&info, child);
  646. if (unw_unwind_to_user(&info) < 0)
  647. return -1;
  648. unw_get_cfm(&info, &cfm);
  649. if (write_access)
  650. unw_set_cfm(&info, ((cfm & ~0x3fffffffffU)
  651.     | (*data & 0x3fffffffffUL)));
  652. else
  653. *data = cfm;
  654. }
  655. return 0;
  656.       case PT_CR_IPSR:
  657. if (write_access)
  658. pt->cr_ipsr = ((*data & IPSR_WRITE_MASK)
  659.        | (pt->cr_ipsr & ~IPSR_WRITE_MASK));
  660. else
  661. *data = (pt->cr_ipsr & IPSR_READ_MASK);
  662. return 0;
  663.       case PT_AR_RNAT:
  664. urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
  665. rnat_addr = (long) ia64_rse_rnat_addr((long *) urbs_end);
  666. if (write_access)
  667. return ia64_poke(child, sw, urbs_end, rnat_addr, *data);
  668. else
  669. return ia64_peek(child, sw, urbs_end, rnat_addr, data);
  670.    case PT_R1:  case PT_R2:  case PT_R3:
  671.       case PT_R8:  case PT_R9:  case PT_R10: case PT_R11:
  672.       case PT_R12: case PT_R13: case PT_R14: case PT_R15:
  673.       case PT_R16: case PT_R17: case PT_R18: case PT_R19:
  674.       case PT_R20: case PT_R21: case PT_R22: case PT_R23:
  675.       case PT_R24: case PT_R25: case PT_R26: case PT_R27:
  676.       case PT_R28: case PT_R29: case PT_R30: case PT_R31:
  677.       case PT_B0:  case PT_B6:  case PT_B7:
  678.       case PT_F6:  case PT_F6+8: case PT_F7: case PT_F7+8:
  679.       case PT_F8:  case PT_F8+8: case PT_F9: case PT_F9+8:
  680.       case PT_AR_BSPSTORE:
  681.       case PT_AR_RSC: case PT_AR_UNAT: case PT_AR_PFS:
  682.       case PT_AR_CCV: case PT_AR_FPSR: case PT_CR_IIP: case PT_PR:
  683. /* scratch register */
  684. ptr = (unsigned long *) ((long) pt + addr - PT_CR_IPSR);
  685. break;
  686.       default:
  687. /* disallow accessing anything else... */
  688. dprintk("ptrace: rejecting access to register address 0x%lxn",
  689. addr);
  690. return -1;
  691. }
  692. } else {
  693. /* access debug registers */
  694. if (addr >= PT_IBR) {
  695. regnum = (addr - PT_IBR) >> 3;
  696. ptr = &child->thread.ibr[0];
  697. } else {
  698. regnum = (addr - PT_DBR) >> 3;
  699. ptr = &child->thread.dbr[0];
  700. }
  701. if (regnum >= 8) {
  702. dprintk("ptrace: rejecting access to register address 0x%lxn", addr);
  703. return -1;
  704. }
  705. #ifdef CONFIG_PERFMON
  706. /*
  707.  * Check if debug registers are used by perfmon. This test must be done
  708.  * once we know that we can do the operation, i.e. the arguments are all
  709.  * valid, but before we start modifying the state.
  710.  *
  711.  * Perfmon needs to keep a count of how many processes are trying to
  712.  * modify the debug registers for system wide monitoring sessions.
  713.  *
  714.  * We also include read access here, because they may cause the
  715.  * PMU-installed debug register state (dbr[], ibr[]) to be reset. The two
  716.  * arrays are also used by perfmon, but we do not use
  717.  * IA64_THREAD_DBG_VALID. The registers are restored by the PMU context
  718.  * switch code.
  719.  */
  720. if (pfm_use_debug_registers(child))
  721. return -1;
  722. #endif
  723. if (!(child->thread.flags & IA64_THREAD_DBG_VALID)) {
  724. child->thread.flags |= IA64_THREAD_DBG_VALID;
  725. memset(child->thread.dbr, 0, sizeof(child->thread.dbr));
  726. memset(child->thread.ibr, 0, sizeof(child->thread.ibr));
  727. }
  728. ptr += regnum;
  729. if (write_access)
  730. /* don't let the user set kernel-level breakpoints... */
  731. *ptr = *data & ~(7UL << 56);
  732. else
  733. *data = *ptr;
  734. return 0;
  735. }
  736. if (write_access)
  737. *ptr = *data;
  738. else
  739. *data = *ptr;
  740. return 0;
  741. }
  742. static long
  743. ptrace_getregs (struct task_struct *child, struct pt_all_user_regs *ppr)
  744. {
  745. struct switch_stack *sw;
  746. struct pt_regs *pt;
  747. long ret, retval;
  748. struct unw_frame_info info;
  749. char nat = 0;
  750. int i;
  751. retval = verify_area(VERIFY_WRITE, ppr, sizeof(struct pt_all_user_regs));
  752. if (retval != 0) {
  753. return -EIO;
  754. }
  755. pt = ia64_task_regs(child);
  756. sw = (struct switch_stack *) (child->thread.ksp + 16);
  757. unw_init_from_blocked_task(&info, child);
  758. if (unw_unwind_to_user(&info) < 0) {
  759. return -EIO;
  760. }
  761. if (((unsigned long) ppr & 0x7) != 0) {
  762. dprintk("ptrace:unaligned register address %pn", ppr);
  763. return -EIO;
  764. }
  765. retval = 0;
  766. /* control regs */
  767. retval |= __put_user(pt->cr_iip, &ppr->cr_iip);
  768. retval |= access_uarea(child, PT_CR_IPSR, &ppr->cr_ipsr, 0);
  769. /* app regs */
  770. retval |= __put_user(pt->ar_pfs, &ppr->ar[PT_AUR_PFS]);
  771. retval |= __put_user(pt->ar_rsc, &ppr->ar[PT_AUR_RSC]);
  772. retval |= __put_user(pt->ar_bspstore, &ppr->ar[PT_AUR_BSPSTORE]);
  773. retval |= __put_user(pt->ar_unat, &ppr->ar[PT_AUR_UNAT]);
  774. retval |= __put_user(pt->ar_ccv, &ppr->ar[PT_AUR_CCV]);
  775. retval |= __put_user(pt->ar_fpsr, &ppr->ar[PT_AUR_FPSR]);
  776. retval |= access_uarea(child, PT_AR_EC, &ppr->ar[PT_AUR_EC], 0);
  777. retval |= access_uarea(child, PT_AR_LC, &ppr->ar[PT_AUR_LC], 0);
  778. retval |= access_uarea(child, PT_AR_RNAT, &ppr->ar[PT_AUR_RNAT], 0);
  779. retval |= access_uarea(child, PT_AR_BSP, &ppr->ar[PT_AUR_BSP], 0);
  780. retval |= access_uarea(child, PT_CFM, &ppr->cfm, 0);
  781. /* gr1-gr3 */
  782. retval |= __copy_to_user(&ppr->gr[1], &pt->r1, sizeof(long) * 3);
  783. /* gr4-gr7 */
  784. for (i = 4; i < 8; i++) {
  785. retval |= unw_access_gr(&info, i, &ppr->gr[i], &nat, 0);
  786. }
  787. /* gr8-gr11 */
  788. retval |= __copy_to_user(&ppr->gr[8], &pt->r8, sizeof(long) * 4);
  789. /* gr12-gr15 */
  790. retval |= __copy_to_user(&ppr->gr[12], &pt->r12, sizeof(long) * 4);
  791. /* gr16-gr31 */
  792. retval |= __copy_to_user(&ppr->gr[16], &pt->r16, sizeof(long) * 16);
  793. /* b0 */
  794. retval |= __put_user(pt->b0, &ppr->br[0]);
  795. /* b1-b5 */
  796. for (i = 1; i < 6; i++) {
  797. retval |= unw_access_br(&info, i, &ppr->br[i], 0);
  798. }
  799. /* b6-b7 */
  800. retval |= __put_user(pt->b6, &ppr->br[6]);
  801. retval |= __put_user(pt->b7, &ppr->br[7]);
  802. /* fr2-fr5 */
  803. for (i = 2; i < 6; i++) {
  804. retval |= access_fr(&info, i, 0, (unsigned long *) &ppr->fr[i], 0);
  805. retval |= access_fr(&info, i, 1, (unsigned long *) &ppr->fr[i] + 1, 0);
  806. }
  807. /* fr6-fr9 */
  808. retval |= __copy_to_user(&ppr->fr[6], &pt->f6, sizeof(struct ia64_fpreg) * 4);
  809. /* fp scratch regs(10-15) */
  810. retval |= __copy_to_user(&ppr->fr[10], &sw->f10, sizeof(struct ia64_fpreg) * 6);
  811. /* fr16-fr31 */
  812. for (i = 16; i < 32; i++) {
  813. retval |= access_fr(&info, i, 0, (unsigned long *) &ppr->fr[i], 0);
  814. retval |= access_fr(&info, i, 1, (unsigned long *) &ppr->fr[i] + 1, 0);
  815. }
  816. /* fph */
  817. ia64_flush_fph(child);
  818. retval |= __copy_to_user(&ppr->fr[32], &child->thread.fph, sizeof(ppr->fr[32]) * 96);
  819. /* preds */
  820. retval |= __put_user(pt->pr, &ppr->pr);
  821. /* nat bits */
  822. retval |= access_uarea(child, PT_NAT_BITS, &ppr->nat, 0);
  823. ret = retval ? -EIO : 0;
  824. return ret;
  825. }
  826. static long
  827. ptrace_setregs (struct task_struct *child, struct pt_all_user_regs *ppr)
  828. {
  829. struct switch_stack *sw;
  830. struct pt_regs *pt;
  831. long ret, retval;
  832. struct unw_frame_info info;
  833. char nat = 0;
  834. int i;
  835. retval = verify_area(VERIFY_READ, ppr, sizeof(struct pt_all_user_regs));
  836. if (retval != 0) {
  837. return -EIO;
  838. }
  839. pt = ia64_task_regs(child);
  840. sw = (struct switch_stack *) (child->thread.ksp + 16);
  841. unw_init_from_blocked_task(&info, child);
  842. if (unw_unwind_to_user(&info) < 0) {
  843. return -EIO;
  844. }
  845. if (((unsigned long) ppr & 0x7) != 0) {
  846. dprintk("ptrace:unaligned register address %pn", ppr);
  847. return -EIO;
  848. }
  849. retval = 0;
  850. /* control regs */
  851. retval |= __get_user(pt->cr_iip, &ppr->cr_iip);
  852. retval |= access_uarea(child, PT_CR_IPSR, &ppr->cr_ipsr, 1);
  853. /* app regs */
  854. retval |= __get_user(pt->ar_pfs, &ppr->ar[PT_AUR_PFS]);
  855. retval |= __get_user(pt->ar_rsc, &ppr->ar[PT_AUR_RSC]);
  856. retval |= __get_user(pt->ar_bspstore, &ppr->ar[PT_AUR_BSPSTORE]);
  857. retval |= __get_user(pt->ar_unat, &ppr->ar[PT_AUR_UNAT]);
  858. retval |= __get_user(pt->ar_ccv, &ppr->ar[PT_AUR_CCV]);
  859. retval |= __get_user(pt->ar_fpsr, &ppr->ar[PT_AUR_FPSR]);
  860. retval |= access_uarea(child, PT_AR_EC, &ppr->ar[PT_AUR_EC], 1);
  861. retval |= access_uarea(child, PT_AR_LC, &ppr->ar[PT_AUR_LC], 1);
  862. retval |= access_uarea(child, PT_AR_RNAT, &ppr->ar[PT_AUR_RNAT], 1);
  863. retval |= access_uarea(child, PT_AR_BSP, &ppr->ar[PT_AUR_BSP], 1);
  864. retval |= access_uarea(child, PT_CFM, &ppr->cfm, 1);
  865. /* gr1-gr3 */
  866. retval |= __copy_from_user(&pt->r1, &ppr->gr[1], sizeof(long) * 3);
  867. /* gr4-gr7 */
  868. for (i = 4; i < 8; i++) {
  869. long ret = unw_get_gr(&info, i, &ppr->gr[i], &nat);
  870. if (ret < 0) {
  871. return ret;
  872. }
  873. retval |= unw_access_gr(&info, i, &ppr->gr[i], &nat, 1);
  874. }
  875. /* gr8-gr11 */
  876. retval |= __copy_from_user(&pt->r8, &ppr->gr[8], sizeof(long) * 4);
  877. /* gr12-gr15 */
  878. retval |= __copy_from_user(&pt->r12, &ppr->gr[12], sizeof(long) * 4);
  879. /* gr16-gr31 */
  880. retval |= __copy_from_user(&pt->r16, &ppr->gr[16], sizeof(long) * 16);
  881. /* b0 */
  882. retval |= __get_user(pt->b0, &ppr->br[0]);
  883. /* b1-b5 */
  884. for (i = 1; i < 6; i++) {
  885. retval |= unw_access_br(&info, i, &ppr->br[i], 1);
  886. }
  887. /* b6-b7 */
  888. retval |= __get_user(pt->b6, &ppr->br[6]);
  889. retval |= __get_user(pt->b7, &ppr->br[7]);
  890. /* fr2-fr5 */
  891. for (i = 2; i < 6; i++) {
  892. retval |= access_fr(&info, i, 0, (unsigned long *) &ppr->fr[i], 1);
  893. retval |= access_fr(&info, i, 1, (unsigned long *) &ppr->fr[i] + 1, 1);
  894. }
  895. /* fr6-fr9 */
  896. retval |= __copy_from_user(&pt->f6, &ppr->fr[6], sizeof(ppr->fr[6]) * 4);
  897. /* fp scratch regs(10-15) */
  898. retval |= __copy_from_user(&sw->f10, &ppr->fr[10], sizeof(ppr->fr[10]) * 6);
  899. /* fr16-fr31 */
  900. for (i = 16; i < 32; i++) {
  901. retval |= access_fr(&info, i, 0, (unsigned long *) &ppr->fr[i], 1);
  902. retval |= access_fr(&info, i, 1, (unsigned long *) &ppr->fr[i] + 1, 1);
  903. }
  904. /* fph */
  905. ia64_sync_fph(child);
  906. retval |= __copy_from_user(&child->thread.fph, &ppr->fr[32], sizeof(ppr->fr[32]) * 96);
  907. /* preds */
  908. retval |= __get_user(pt->pr, &ppr->pr);
  909. /* nat bits */
  910. retval |= access_uarea(child, PT_NAT_BITS, &ppr->nat, 1);
  911. ret = retval ? -EIO : 0;
  912. return ret;
  913. }
  914. /*
  915.  * Called by kernel/ptrace.c when detaching..
  916.  *
  917.  * Make sure the single step bit is not set.
  918.  */
  919. void
  920. ptrace_disable (struct task_struct *child)
  921. {
  922. struct ia64_psr *child_psr = ia64_psr(ia64_task_regs(child));
  923. /* make sure the single step/take-branch tra bits are not set: */
  924. child_psr->ss = 0;
  925. child_psr->tb = 0;
  926. /* Turn off flag indicating that the KRBS is sync'd with child's VM: */
  927. child->thread.flags &= ~IA64_THREAD_KRBS_SYNCED;
  928. }
  929. asmlinkage long
  930. sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data,
  931.     long arg4, long arg5, long arg6, long arg7, long stack)
  932. {
  933. struct pt_regs *pt, *regs = (struct pt_regs *) &stack;
  934. unsigned long urbs_end;
  935. struct task_struct *child;
  936. struct switch_stack *sw;
  937. long ret;
  938. lock_kernel();
  939. ret = -EPERM;
  940. if (request == PTRACE_TRACEME) {
  941. /* are we already being traced? */
  942. if (current->ptrace & PT_PTRACED)
  943. goto out;
  944. current->ptrace |= PT_PTRACED;
  945. ret = 0;
  946. goto out;
  947. }
  948. ret = -ESRCH;
  949. read_lock(&tasklist_lock);
  950. {
  951. child = find_task_by_pid(pid);
  952. if (child)
  953. get_task_struct(child);
  954. }
  955. read_unlock(&tasklist_lock);
  956. if (!child)
  957. goto out;
  958. ret = -EPERM;
  959. if (pid == 1) /* no messing around with init! */
  960. goto out_tsk;
  961. if (request == PTRACE_ATTACH) {
  962. ret = ptrace_attach(child);
  963. goto out_tsk;
  964. }
  965. ret = ptrace_check_attach(child, request == PTRACE_KILL);
  966. if (ret < 0)
  967. goto out_tsk;
  968. pt = ia64_task_regs(child);
  969. sw = (struct switch_stack *) (child->thread.ksp + 16);
  970. switch (request) {
  971.       case PTRACE_PEEKTEXT:
  972.       case PTRACE_PEEKDATA: /* read word at location addr */
  973. urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
  974. if (!(child->thread.flags & IA64_THREAD_KRBS_SYNCED))
  975. threads_sync_user_rbs(child, urbs_end, 0);
  976. ret = ia64_peek(child, sw, urbs_end, addr, &data);
  977. if (ret == 0) {
  978. ret = data;
  979. regs->r8 = 0; /* ensure "ret" is not mistaken as an error code */
  980. }
  981. goto out_tsk;
  982.       case PTRACE_POKETEXT:
  983.       case PTRACE_POKEDATA: /* write the word at location addr */
  984. urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
  985. if (!(child->thread.flags & IA64_THREAD_KRBS_SYNCED))
  986. threads_sync_user_rbs(child, urbs_end, 1);
  987. ret = ia64_poke(child, sw, urbs_end, addr, data);
  988. goto out_tsk;
  989.       case PTRACE_PEEKUSR: /* read the word at addr in the USER area */
  990. if (access_uarea(child, addr, &data, 0) < 0) {
  991. ret = -EIO;
  992. goto out_tsk;
  993. }
  994. ret = data;
  995. regs->r8 = 0; /* ensure "ret" is not mistaken as an error code */
  996. goto out_tsk;
  997.       case PTRACE_POKEUSR:       /* write the word at addr in the USER area */
  998. if (access_uarea(child, addr, &data, 1) < 0) {
  999. ret = -EIO;
  1000. goto out_tsk;
  1001. }
  1002. ret = 0;
  1003. goto out_tsk;
  1004.       case PTRACE_GETSIGINFO:
  1005. ret = -EIO;
  1006. if (!access_ok(VERIFY_WRITE, data, sizeof (siginfo_t)) || !child->thread.siginfo)
  1007. goto out_tsk;
  1008. ret = copy_siginfo_to_user((siginfo_t *) data, child->thread.siginfo);
  1009. goto out_tsk;
  1010.       case PTRACE_SETSIGINFO:
  1011. ret = -EIO;
  1012. if (!access_ok(VERIFY_READ, data, sizeof (siginfo_t))
  1013.     || child->thread.siginfo == 0)
  1014. goto out_tsk;
  1015. ret = copy_siginfo_from_user(child->thread.siginfo, (siginfo_t *) data);
  1016. goto out_tsk;
  1017.       case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
  1018.       case PTRACE_CONT: /* restart after signal. */
  1019. ret = -EIO;
  1020. if (data > _NSIG)
  1021. goto out_tsk;
  1022. if (request == PTRACE_SYSCALL)
  1023. child->ptrace |= PT_TRACESYS;
  1024. else
  1025. child->ptrace &= ~PT_TRACESYS;
  1026. child->exit_code = data;
  1027. /* make sure the single step/taken-branch trap bits are not set: */
  1028. ia64_psr(pt)->ss = 0;
  1029. ia64_psr(pt)->tb = 0;
  1030. /* Turn off flag indicating that the KRBS is sync'd with child's VM: */
  1031. child->thread.flags &= ~IA64_THREAD_KRBS_SYNCED;
  1032. wake_up_process(child);
  1033. ret = 0;
  1034. goto out_tsk;
  1035.       case PTRACE_KILL:
  1036. /*
  1037.  * Make the child exit.  Best I can do is send it a
  1038.  * sigkill.  Perhaps it should be put in the status
  1039.  * that it wants to exit.
  1040.  */
  1041. if (child->state == TASK_ZOMBIE) /* already dead */
  1042. goto out_tsk;
  1043. child->exit_code = SIGKILL;
  1044. /* make sure the single step/take-branch tra bits are not set: */
  1045. ia64_psr(pt)->ss = 0;
  1046. ia64_psr(pt)->tb = 0;
  1047. /* Turn off flag indicating that the KRBS is sync'd with child's VM: */
  1048. child->thread.flags &= ~IA64_THREAD_KRBS_SYNCED;
  1049. wake_up_process(child);
  1050. ret = 0;
  1051. goto out_tsk;
  1052.       case PTRACE_SINGLESTEP: /* let child execute for one instruction */
  1053.       case PTRACE_SINGLEBLOCK:
  1054. ret = -EIO;
  1055. if (data > _NSIG)
  1056. goto out_tsk;
  1057. child->ptrace &= ~PT_TRACESYS;
  1058. if (request == PTRACE_SINGLESTEP) {
  1059. ia64_psr(pt)->ss = 1;
  1060. } else {
  1061. ia64_psr(pt)->tb = 1;
  1062. }
  1063. child->exit_code = data;
  1064. /* Turn off flag indicating that the KRBS is sync'd with child's VM: */
  1065. child->thread.flags &= ~IA64_THREAD_KRBS_SYNCED;
  1066. /* give it a chance to run. */
  1067. wake_up_process(child);
  1068. ret = 0;
  1069. goto out_tsk;
  1070.       case PTRACE_DETACH: /* detach a process that was attached. */
  1071. ret = ptrace_detach(child, data);
  1072. goto out_tsk;
  1073.       case PTRACE_GETREGS:
  1074. ret = ptrace_getregs(child, (struct pt_all_user_regs*) data);
  1075. goto out_tsk;
  1076.       case PTRACE_SETREGS:
  1077. ret = ptrace_setregs(child, (struct pt_all_user_regs*) data);
  1078. goto out_tsk;
  1079.       default:
  1080. ret = -EIO;
  1081. goto out_tsk;
  1082. }
  1083.   out_tsk:
  1084. free_task_struct(child);
  1085.   out:
  1086. unlock_kernel();
  1087. return ret;
  1088. }
  1089. void
  1090. syscall_trace (void)
  1091. {
  1092. if ((current->ptrace & (PT_PTRACED|PT_TRACESYS)) != (PT_PTRACED|PT_TRACESYS))
  1093. return;
  1094. current->exit_code = SIGTRAP;
  1095. set_current_state(TASK_STOPPED);
  1096. notify_parent(current, SIGCHLD);
  1097. schedule();
  1098. /*
  1099.  * This isn't the same as continuing with a signal, but it
  1100.  * will do for normal use.  strace only continues with a
  1101.  * signal if the stopping signal is not SIGTRAP.  -brl
  1102.  */
  1103. if (current->exit_code) {
  1104. send_sig(current->exit_code, current, 1);
  1105. current->exit_code = 0;
  1106. }
  1107. }