1 /* 2 * linux/arch/arm/kernel/ptrace.c 3 * 4 * By Ross Biro 1/23/92 5 * edited by Linus Torvalds 6 * ARM modifications Copyright (C) 2000 Russell King 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 */ 12 #include <linux/kernel.h> 13 #include <linux/sched.h> 14 #include <linux/mm.h> 15 #include <linux/elf.h> 16 #include <linux/smp.h> 17 #include <linux/ptrace.h> 18 #include <linux/user.h> 19 #include <linux/security.h> 20 #include <linux/init.h> 21 #include <linux/signal.h> 22 #include <linux/uaccess.h> 23 #include <linux/perf_event.h> 24 #include <linux/hw_breakpoint.h> 25 #include <linux/regset.h> 26 #include <linux/audit.h> 27 #include <linux/tracehook.h> 28 #include <linux/unistd.h> 29 30 #include <asm/pgtable.h> 31 #include <asm/traps.h> 32 33 #define REG_PC 15 34 #define REG_PSR 16 35 /* 36 * does not yet catch signals sent when the child dies. 37 * in exit.c or in signal.c. 38 */ 39 40 #if 0 41 /* 42 * Breakpoint SWI instruction: SWI &9F0001 43 */ 44 #define BREAKINST_ARM 0xef9f0001 45 #define BREAKINST_THUMB 0xdf00 /* fill this in later */ 46 #else 47 /* 48 * New breakpoints - use an undefined instruction. The ARM architecture 49 * reference manual guarantees that the following instruction space 50 * will produce an undefined instruction exception on all CPUs: 51 * 52 * ARM: xxxx 0111 1111 xxxx xxxx xxxx 1111 xxxx 53 * Thumb: 1101 1110 xxxx xxxx 54 */ 55 #define BREAKINST_ARM 0xe7f001f0 56 #define BREAKINST_THUMB 0xde01 57 #endif 58 59 struct pt_regs_offset { 60 const char *name; 61 int offset; 62 }; 63 64 #define REG_OFFSET_NAME(r) \ 65 {.name = #r, .offset = offsetof(struct pt_regs, ARM_##r)} 66 #define REG_OFFSET_END {.name = NULL, .offset = 0} 67 68 static const struct pt_regs_offset regoffset_table[] = { 69 REG_OFFSET_NAME(r0), 70 REG_OFFSET_NAME(r1), 71 REG_OFFSET_NAME(r2), 72 REG_OFFSET_NAME(r3), 73 REG_OFFSET_NAME(r4), 74 REG_OFFSET_NAME(r5), 75 REG_OFFSET_NAME(r6), 76 REG_OFFSET_NAME(r7), 77 REG_OFFSET_NAME(r8), 78 REG_OFFSET_NAME(r9), 79 REG_OFFSET_NAME(r10), 80 REG_OFFSET_NAME(fp), 81 REG_OFFSET_NAME(ip), 82 REG_OFFSET_NAME(sp), 83 REG_OFFSET_NAME(lr), 84 REG_OFFSET_NAME(pc), 85 REG_OFFSET_NAME(cpsr), 86 REG_OFFSET_NAME(ORIG_r0), 87 REG_OFFSET_END, 88 }; 89 90 /** 91 * regs_query_register_offset() - query register offset from its name 92 * @name: the name of a register 93 * 94 * regs_query_register_offset() returns the offset of a register in struct 95 * pt_regs from its name. If the name is invalid, this returns -EINVAL; 96 */ 97 int regs_query_register_offset(const char *name) 98 { 99 const struct pt_regs_offset *roff; 100 for (roff = regoffset_table; roff->name != NULL; roff++) 101 if (!strcmp(roff->name, name)) 102 return roff->offset; 103 return -EINVAL; 104 } 105 106 /** 107 * regs_query_register_name() - query register name from its offset 108 * @offset: the offset of a register in struct pt_regs. 109 * 110 * regs_query_register_name() returns the name of a register from its 111 * offset in struct pt_regs. If the @offset is invalid, this returns NULL; 112 */ 113 const char *regs_query_register_name(unsigned int offset) 114 { 115 const struct pt_regs_offset *roff; 116 for (roff = regoffset_table; roff->name != NULL; roff++) 117 if (roff->offset == offset) 118 return roff->name; 119 return NULL; 120 } 121 122 /** 123 * regs_within_kernel_stack() - check the address in the stack 124 * @regs: pt_regs which contains kernel stack pointer. 125 * @addr: address which is checked. 126 * 127 * regs_within_kernel_stack() checks @addr is within the kernel stack page(s). 128 * If @addr is within the kernel stack, it returns true. If not, returns false. 129 */ 130 bool regs_within_kernel_stack(struct pt_regs *regs, unsigned long addr) 131 { 132 return ((addr & ~(THREAD_SIZE - 1)) == 133 (kernel_stack_pointer(regs) & ~(THREAD_SIZE - 1))); 134 } 135 136 /** 137 * regs_get_kernel_stack_nth() - get Nth entry of the stack 138 * @regs: pt_regs which contains kernel stack pointer. 139 * @n: stack entry number. 140 * 141 * regs_get_kernel_stack_nth() returns @n th entry of the kernel stack which 142 * is specified by @regs. If the @n th entry is NOT in the kernel stack, 143 * this returns 0. 144 */ 145 unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n) 146 { 147 unsigned long *addr = (unsigned long *)kernel_stack_pointer(regs); 148 addr += n; 149 if (regs_within_kernel_stack(regs, (unsigned long)addr)) 150 return *addr; 151 else 152 return 0; 153 } 154 155 /* 156 * this routine will get a word off of the processes privileged stack. 157 * the offset is how far from the base addr as stored in the THREAD. 158 * this routine assumes that all the privileged stacks are in our 159 * data space. 160 */ 161 static inline long get_user_reg(struct task_struct *task, int offset) 162 { 163 return task_pt_regs(task)->uregs[offset]; 164 } 165 166 /* 167 * this routine will put a word on the processes privileged stack. 168 * the offset is how far from the base addr as stored in the THREAD. 169 * this routine assumes that all the privileged stacks are in our 170 * data space. 171 */ 172 static inline int 173 put_user_reg(struct task_struct *task, int offset, long data) 174 { 175 struct pt_regs newregs, *regs = task_pt_regs(task); 176 int ret = -EINVAL; 177 178 newregs = *regs; 179 newregs.uregs[offset] = data; 180 181 if (valid_user_regs(&newregs)) { 182 regs->uregs[offset] = data; 183 ret = 0; 184 } 185 186 return ret; 187 } 188 189 /* 190 * Called by kernel/ptrace.c when detaching.. 191 */ 192 void ptrace_disable(struct task_struct *child) 193 { 194 /* Nothing to do. */ 195 } 196 197 /* 198 * Handle hitting a breakpoint. 199 */ 200 void ptrace_break(struct task_struct *tsk, struct pt_regs *regs) 201 { 202 siginfo_t info; 203 204 info.si_signo = SIGTRAP; 205 info.si_errno = 0; 206 info.si_code = TRAP_BRKPT; 207 info.si_addr = (void __user *)instruction_pointer(regs); 208 209 force_sig_info(SIGTRAP, &info, tsk); 210 } 211 212 static int break_trap(struct pt_regs *regs, unsigned int instr) 213 { 214 ptrace_break(current, regs); 215 return 0; 216 } 217 218 static struct undef_hook arm_break_hook = { 219 .instr_mask = 0x0fffffff, 220 .instr_val = 0x07f001f0, 221 .cpsr_mask = PSR_T_BIT, 222 .cpsr_val = 0, 223 .fn = break_trap, 224 }; 225 226 static struct undef_hook thumb_break_hook = { 227 .instr_mask = 0xffff, 228 .instr_val = 0xde01, 229 .cpsr_mask = PSR_T_BIT, 230 .cpsr_val = PSR_T_BIT, 231 .fn = break_trap, 232 }; 233 234 static struct undef_hook thumb2_break_hook = { 235 .instr_mask = 0xffffffff, 236 .instr_val = 0xf7f0a000, 237 .cpsr_mask = PSR_T_BIT, 238 .cpsr_val = PSR_T_BIT, 239 .fn = break_trap, 240 }; 241 242 static int __init ptrace_break_init(void) 243 { 244 register_undef_hook(&arm_break_hook); 245 register_undef_hook(&thumb_break_hook); 246 register_undef_hook(&thumb2_break_hook); 247 return 0; 248 } 249 250 core_initcall(ptrace_break_init); 251 252 /* 253 * Read the word at offset "off" into the "struct user". We 254 * actually access the pt_regs stored on the kernel stack. 255 */ 256 static int ptrace_read_user(struct task_struct *tsk, unsigned long off, 257 unsigned long __user *ret) 258 { 259 unsigned long tmp; 260 261 if (off & 3) 262 return -EIO; 263 264 tmp = 0; 265 if (off == PT_TEXT_ADDR) 266 tmp = tsk->mm->start_code; 267 else if (off == PT_DATA_ADDR) 268 tmp = tsk->mm->start_data; 269 else if (off == PT_TEXT_END_ADDR) 270 tmp = tsk->mm->end_code; 271 else if (off < sizeof(struct pt_regs)) 272 tmp = get_user_reg(tsk, off >> 2); 273 else if (off >= sizeof(struct user)) 274 return -EIO; 275 276 return put_user(tmp, ret); 277 } 278 279 /* 280 * Write the word at offset "off" into "struct user". We 281 * actually access the pt_regs stored on the kernel stack. 282 */ 283 static int ptrace_write_user(struct task_struct *tsk, unsigned long off, 284 unsigned long val) 285 { 286 if (off & 3 || off >= sizeof(struct user)) 287 return -EIO; 288 289 if (off >= sizeof(struct pt_regs)) 290 return 0; 291 292 return put_user_reg(tsk, off >> 2, val); 293 } 294 295 #ifdef CONFIG_IWMMXT 296 297 /* 298 * Get the child iWMMXt state. 299 */ 300 static int ptrace_getwmmxregs(struct task_struct *tsk, void __user *ufp) 301 { 302 struct thread_info *thread = task_thread_info(tsk); 303 304 if (!test_ti_thread_flag(thread, TIF_USING_IWMMXT)) 305 return -ENODATA; 306 iwmmxt_task_disable(thread); /* force it to ram */ 307 return copy_to_user(ufp, &thread->fpstate.iwmmxt, IWMMXT_SIZE) 308 ? -EFAULT : 0; 309 } 310 311 /* 312 * Set the child iWMMXt state. 313 */ 314 static int ptrace_setwmmxregs(struct task_struct *tsk, void __user *ufp) 315 { 316 struct thread_info *thread = task_thread_info(tsk); 317 318 if (!test_ti_thread_flag(thread, TIF_USING_IWMMXT)) 319 return -EACCES; 320 iwmmxt_task_release(thread); /* force a reload */ 321 return copy_from_user(&thread->fpstate.iwmmxt, ufp, IWMMXT_SIZE) 322 ? -EFAULT : 0; 323 } 324 325 #endif 326 327 #ifdef CONFIG_CRUNCH 328 /* 329 * Get the child Crunch state. 330 */ 331 static int ptrace_getcrunchregs(struct task_struct *tsk, void __user *ufp) 332 { 333 struct thread_info *thread = task_thread_info(tsk); 334 335 crunch_task_disable(thread); /* force it to ram */ 336 return copy_to_user(ufp, &thread->crunchstate, CRUNCH_SIZE) 337 ? -EFAULT : 0; 338 } 339 340 /* 341 * Set the child Crunch state. 342 */ 343 static int ptrace_setcrunchregs(struct task_struct *tsk, void __user *ufp) 344 { 345 struct thread_info *thread = task_thread_info(tsk); 346 347 crunch_task_release(thread); /* force a reload */ 348 return copy_from_user(&thread->crunchstate, ufp, CRUNCH_SIZE) 349 ? -EFAULT : 0; 350 } 351 #endif 352 353 #ifdef CONFIG_HAVE_HW_BREAKPOINT 354 /* 355 * Convert a virtual register number into an index for a thread_info 356 * breakpoint array. Breakpoints are identified using positive numbers 357 * whilst watchpoints are negative. The registers are laid out as pairs 358 * of (address, control), each pair mapping to a unique hw_breakpoint struct. 359 * Register 0 is reserved for describing resource information. 360 */ 361 static int ptrace_hbp_num_to_idx(long num) 362 { 363 if (num < 0) 364 num = (ARM_MAX_BRP << 1) - num; 365 return (num - 1) >> 1; 366 } 367 368 /* 369 * Returns the virtual register number for the address of the 370 * breakpoint at index idx. 371 */ 372 static long ptrace_hbp_idx_to_num(int idx) 373 { 374 long mid = ARM_MAX_BRP << 1; 375 long num = (idx << 1) + 1; 376 return num > mid ? mid - num : num; 377 } 378 379 /* 380 * Handle hitting a HW-breakpoint. 381 */ 382 static void ptrace_hbptriggered(struct perf_event *bp, 383 struct perf_sample_data *data, 384 struct pt_regs *regs) 385 { 386 struct arch_hw_breakpoint *bkpt = counter_arch_bp(bp); 387 long num; 388 int i; 389 siginfo_t info; 390 391 for (i = 0; i < ARM_MAX_HBP_SLOTS; ++i) 392 if (current->thread.debug.hbp[i] == bp) 393 break; 394 395 num = (i == ARM_MAX_HBP_SLOTS) ? 0 : ptrace_hbp_idx_to_num(i); 396 397 info.si_signo = SIGTRAP; 398 info.si_errno = (int)num; 399 info.si_code = TRAP_HWBKPT; 400 info.si_addr = (void __user *)(bkpt->trigger); 401 402 force_sig_info(SIGTRAP, &info, current); 403 } 404 405 /* 406 * Set ptrace breakpoint pointers to zero for this task. 407 * This is required in order to prevent child processes from unregistering 408 * breakpoints held by their parent. 409 */ 410 void clear_ptrace_hw_breakpoint(struct task_struct *tsk) 411 { 412 memset(tsk->thread.debug.hbp, 0, sizeof(tsk->thread.debug.hbp)); 413 } 414 415 /* 416 * Unregister breakpoints from this task and reset the pointers in 417 * the thread_struct. 418 */ 419 void flush_ptrace_hw_breakpoint(struct task_struct *tsk) 420 { 421 int i; 422 struct thread_struct *t = &tsk->thread; 423 424 for (i = 0; i < ARM_MAX_HBP_SLOTS; i++) { 425 if (t->debug.hbp[i]) { 426 unregister_hw_breakpoint(t->debug.hbp[i]); 427 t->debug.hbp[i] = NULL; 428 } 429 } 430 } 431 432 static u32 ptrace_get_hbp_resource_info(void) 433 { 434 u8 num_brps, num_wrps, debug_arch, wp_len; 435 u32 reg = 0; 436 437 num_brps = hw_breakpoint_slots(TYPE_INST); 438 num_wrps = hw_breakpoint_slots(TYPE_DATA); 439 debug_arch = arch_get_debug_arch(); 440 wp_len = arch_get_max_wp_len(); 441 442 reg |= debug_arch; 443 reg <<= 8; 444 reg |= wp_len; 445 reg <<= 8; 446 reg |= num_wrps; 447 reg <<= 8; 448 reg |= num_brps; 449 450 return reg; 451 } 452 453 static struct perf_event *ptrace_hbp_create(struct task_struct *tsk, int type) 454 { 455 struct perf_event_attr attr; 456 457 ptrace_breakpoint_init(&attr); 458 459 /* Initialise fields to sane defaults. */ 460 attr.bp_addr = 0; 461 attr.bp_len = HW_BREAKPOINT_LEN_4; 462 attr.bp_type = type; 463 attr.disabled = 1; 464 465 return register_user_hw_breakpoint(&attr, ptrace_hbptriggered, NULL, 466 tsk); 467 } 468 469 static int ptrace_gethbpregs(struct task_struct *tsk, long num, 470 unsigned long __user *data) 471 { 472 u32 reg; 473 int idx, ret = 0; 474 struct perf_event *bp; 475 struct arch_hw_breakpoint_ctrl arch_ctrl; 476 477 if (num == 0) { 478 reg = ptrace_get_hbp_resource_info(); 479 } else { 480 idx = ptrace_hbp_num_to_idx(num); 481 if (idx < 0 || idx >= ARM_MAX_HBP_SLOTS) { 482 ret = -EINVAL; 483 goto out; 484 } 485 486 bp = tsk->thread.debug.hbp[idx]; 487 if (!bp) { 488 reg = 0; 489 goto put; 490 } 491 492 arch_ctrl = counter_arch_bp(bp)->ctrl; 493 494 /* 495 * Fix up the len because we may have adjusted it 496 * to compensate for an unaligned address. 497 */ 498 while (!(arch_ctrl.len & 0x1)) 499 arch_ctrl.len >>= 1; 500 501 if (num & 0x1) 502 reg = bp->attr.bp_addr; 503 else 504 reg = encode_ctrl_reg(arch_ctrl); 505 } 506 507 put: 508 if (put_user(reg, data)) 509 ret = -EFAULT; 510 511 out: 512 return ret; 513 } 514 515 static int ptrace_sethbpregs(struct task_struct *tsk, long num, 516 unsigned long __user *data) 517 { 518 int idx, gen_len, gen_type, implied_type, ret = 0; 519 u32 user_val; 520 struct perf_event *bp; 521 struct arch_hw_breakpoint_ctrl ctrl; 522 struct perf_event_attr attr; 523 524 if (num == 0) 525 goto out; 526 else if (num < 0) 527 implied_type = HW_BREAKPOINT_RW; 528 else 529 implied_type = HW_BREAKPOINT_X; 530 531 idx = ptrace_hbp_num_to_idx(num); 532 if (idx < 0 || idx >= ARM_MAX_HBP_SLOTS) { 533 ret = -EINVAL; 534 goto out; 535 } 536 537 if (get_user(user_val, data)) { 538 ret = -EFAULT; 539 goto out; 540 } 541 542 bp = tsk->thread.debug.hbp[idx]; 543 if (!bp) { 544 bp = ptrace_hbp_create(tsk, implied_type); 545 if (IS_ERR(bp)) { 546 ret = PTR_ERR(bp); 547 goto out; 548 } 549 tsk->thread.debug.hbp[idx] = bp; 550 } 551 552 attr = bp->attr; 553 554 if (num & 0x1) { 555 /* Address */ 556 attr.bp_addr = user_val; 557 } else { 558 /* Control */ 559 decode_ctrl_reg(user_val, &ctrl); 560 ret = arch_bp_generic_fields(ctrl, &gen_len, &gen_type); 561 if (ret) 562 goto out; 563 564 if ((gen_type & implied_type) != gen_type) { 565 ret = -EINVAL; 566 goto out; 567 } 568 569 attr.bp_len = gen_len; 570 attr.bp_type = gen_type; 571 attr.disabled = !ctrl.enabled; 572 } 573 574 ret = modify_user_hw_breakpoint(bp, &attr); 575 out: 576 return ret; 577 } 578 #endif 579 580 /* regset get/set implementations */ 581 582 static int gpr_get(struct task_struct *target, 583 const struct user_regset *regset, 584 unsigned int pos, unsigned int count, 585 void *kbuf, void __user *ubuf) 586 { 587 struct pt_regs *regs = task_pt_regs(target); 588 589 return user_regset_copyout(&pos, &count, &kbuf, &ubuf, 590 regs, 591 0, sizeof(*regs)); 592 } 593 594 static int gpr_set(struct task_struct *target, 595 const struct user_regset *regset, 596 unsigned int pos, unsigned int count, 597 const void *kbuf, const void __user *ubuf) 598 { 599 int ret; 600 struct pt_regs newregs; 601 602 ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, 603 &newregs, 604 0, sizeof(newregs)); 605 if (ret) 606 return ret; 607 608 if (!valid_user_regs(&newregs)) 609 return -EINVAL; 610 611 *task_pt_regs(target) = newregs; 612 return 0; 613 } 614 615 static int fpa_get(struct task_struct *target, 616 const struct user_regset *regset, 617 unsigned int pos, unsigned int count, 618 void *kbuf, void __user *ubuf) 619 { 620 return user_regset_copyout(&pos, &count, &kbuf, &ubuf, 621 &task_thread_info(target)->fpstate, 622 0, sizeof(struct user_fp)); 623 } 624 625 static int fpa_set(struct task_struct *target, 626 const struct user_regset *regset, 627 unsigned int pos, unsigned int count, 628 const void *kbuf, const void __user *ubuf) 629 { 630 struct thread_info *thread = task_thread_info(target); 631 632 thread->used_cp[1] = thread->used_cp[2] = 1; 633 634 return user_regset_copyin(&pos, &count, &kbuf, &ubuf, 635 &thread->fpstate, 636 0, sizeof(struct user_fp)); 637 } 638 639 #ifdef CONFIG_VFP 640 /* 641 * VFP register get/set implementations. 642 * 643 * With respect to the kernel, struct user_fp is divided into three chunks: 644 * 16 or 32 real VFP registers (d0-d15 or d0-31) 645 * These are transferred to/from the real registers in the task's 646 * vfp_hard_struct. The number of registers depends on the kernel 647 * configuration. 648 * 649 * 16 or 0 fake VFP registers (d16-d31 or empty) 650 * i.e., the user_vfp structure has space for 32 registers even if 651 * the kernel doesn't have them all. 652 * 653 * vfp_get() reads this chunk as zero where applicable 654 * vfp_set() ignores this chunk 655 * 656 * 1 word for the FPSCR 657 * 658 * The bounds-checking logic built into user_regset_copyout and friends 659 * means that we can make a simple sequence of calls to map the relevant data 660 * to/from the specified slice of the user regset structure. 661 */ 662 static int vfp_get(struct task_struct *target, 663 const struct user_regset *regset, 664 unsigned int pos, unsigned int count, 665 void *kbuf, void __user *ubuf) 666 { 667 int ret; 668 struct thread_info *thread = task_thread_info(target); 669 struct vfp_hard_struct const *vfp = &thread->vfpstate.hard; 670 const size_t user_fpregs_offset = offsetof(struct user_vfp, fpregs); 671 const size_t user_fpscr_offset = offsetof(struct user_vfp, fpscr); 672 673 vfp_sync_hwstate(thread); 674 675 ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, 676 &vfp->fpregs, 677 user_fpregs_offset, 678 user_fpregs_offset + sizeof(vfp->fpregs)); 679 if (ret) 680 return ret; 681 682 ret = user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf, 683 user_fpregs_offset + sizeof(vfp->fpregs), 684 user_fpscr_offset); 685 if (ret) 686 return ret; 687 688 return user_regset_copyout(&pos, &count, &kbuf, &ubuf, 689 &vfp->fpscr, 690 user_fpscr_offset, 691 user_fpscr_offset + sizeof(vfp->fpscr)); 692 } 693 694 /* 695 * For vfp_set() a read-modify-write is done on the VFP registers, 696 * in order to avoid writing back a half-modified set of registers on 697 * failure. 698 */ 699 static int vfp_set(struct task_struct *target, 700 const struct user_regset *regset, 701 unsigned int pos, unsigned int count, 702 const void *kbuf, const void __user *ubuf) 703 { 704 int ret; 705 struct thread_info *thread = task_thread_info(target); 706 struct vfp_hard_struct new_vfp; 707 const size_t user_fpregs_offset = offsetof(struct user_vfp, fpregs); 708 const size_t user_fpscr_offset = offsetof(struct user_vfp, fpscr); 709 710 vfp_sync_hwstate(thread); 711 new_vfp = thread->vfpstate.hard; 712 713 ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, 714 &new_vfp.fpregs, 715 user_fpregs_offset, 716 user_fpregs_offset + sizeof(new_vfp.fpregs)); 717 if (ret) 718 return ret; 719 720 ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 721 user_fpregs_offset + sizeof(new_vfp.fpregs), 722 user_fpscr_offset); 723 if (ret) 724 return ret; 725 726 ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, 727 &new_vfp.fpscr, 728 user_fpscr_offset, 729 user_fpscr_offset + sizeof(new_vfp.fpscr)); 730 if (ret) 731 return ret; 732 733 vfp_flush_hwstate(thread); 734 thread->vfpstate.hard = new_vfp; 735 736 return 0; 737 } 738 #endif /* CONFIG_VFP */ 739 740 enum arm_regset { 741 REGSET_GPR, 742 REGSET_FPR, 743 #ifdef CONFIG_VFP 744 REGSET_VFP, 745 #endif 746 }; 747 748 static const struct user_regset arm_regsets[] = { 749 [REGSET_GPR] = { 750 .core_note_type = NT_PRSTATUS, 751 .n = ELF_NGREG, 752 .size = sizeof(u32), 753 .align = sizeof(u32), 754 .get = gpr_get, 755 .set = gpr_set 756 }, 757 [REGSET_FPR] = { 758 /* 759 * For the FPA regs in fpstate, the real fields are a mixture 760 * of sizes, so pretend that the registers are word-sized: 761 */ 762 .core_note_type = NT_PRFPREG, 763 .n = sizeof(struct user_fp) / sizeof(u32), 764 .size = sizeof(u32), 765 .align = sizeof(u32), 766 .get = fpa_get, 767 .set = fpa_set 768 }, 769 #ifdef CONFIG_VFP 770 [REGSET_VFP] = { 771 /* 772 * Pretend that the VFP regs are word-sized, since the FPSCR is 773 * a single word dangling at the end of struct user_vfp: 774 */ 775 .core_note_type = NT_ARM_VFP, 776 .n = ARM_VFPREGS_SIZE / sizeof(u32), 777 .size = sizeof(u32), 778 .align = sizeof(u32), 779 .get = vfp_get, 780 .set = vfp_set 781 }, 782 #endif /* CONFIG_VFP */ 783 }; 784 785 static const struct user_regset_view user_arm_view = { 786 .name = "arm", .e_machine = ELF_ARCH, .ei_osabi = ELF_OSABI, 787 .regsets = arm_regsets, .n = ARRAY_SIZE(arm_regsets) 788 }; 789 790 const struct user_regset_view *task_user_regset_view(struct task_struct *task) 791 { 792 return &user_arm_view; 793 } 794 795 long arch_ptrace(struct task_struct *child, long request, 796 unsigned long addr, unsigned long data) 797 { 798 int ret; 799 unsigned long __user *datap = (unsigned long __user *) data; 800 801 switch (request) { 802 case PTRACE_PEEKUSR: 803 ret = ptrace_read_user(child, addr, datap); 804 break; 805 806 case PTRACE_POKEUSR: 807 ret = ptrace_write_user(child, addr, data); 808 break; 809 810 case PTRACE_GETREGS: 811 ret = copy_regset_to_user(child, 812 &user_arm_view, REGSET_GPR, 813 0, sizeof(struct pt_regs), 814 datap); 815 break; 816 817 case PTRACE_SETREGS: 818 ret = copy_regset_from_user(child, 819 &user_arm_view, REGSET_GPR, 820 0, sizeof(struct pt_regs), 821 datap); 822 break; 823 824 case PTRACE_GETFPREGS: 825 ret = copy_regset_to_user(child, 826 &user_arm_view, REGSET_FPR, 827 0, sizeof(union fp_state), 828 datap); 829 break; 830 831 case PTRACE_SETFPREGS: 832 ret = copy_regset_from_user(child, 833 &user_arm_view, REGSET_FPR, 834 0, sizeof(union fp_state), 835 datap); 836 break; 837 838 #ifdef CONFIG_IWMMXT 839 case PTRACE_GETWMMXREGS: 840 ret = ptrace_getwmmxregs(child, datap); 841 break; 842 843 case PTRACE_SETWMMXREGS: 844 ret = ptrace_setwmmxregs(child, datap); 845 break; 846 #endif 847 848 case PTRACE_GET_THREAD_AREA: 849 ret = put_user(task_thread_info(child)->tp_value, 850 datap); 851 break; 852 853 case PTRACE_SET_SYSCALL: 854 task_thread_info(child)->syscall = data; 855 ret = 0; 856 break; 857 858 #ifdef CONFIG_CRUNCH 859 case PTRACE_GETCRUNCHREGS: 860 ret = ptrace_getcrunchregs(child, datap); 861 break; 862 863 case PTRACE_SETCRUNCHREGS: 864 ret = ptrace_setcrunchregs(child, datap); 865 break; 866 #endif 867 868 #ifdef CONFIG_VFP 869 case PTRACE_GETVFPREGS: 870 ret = copy_regset_to_user(child, 871 &user_arm_view, REGSET_VFP, 872 0, ARM_VFPREGS_SIZE, 873 datap); 874 break; 875 876 case PTRACE_SETVFPREGS: 877 ret = copy_regset_from_user(child, 878 &user_arm_view, REGSET_VFP, 879 0, ARM_VFPREGS_SIZE, 880 datap); 881 break; 882 #endif 883 884 #ifdef CONFIG_HAVE_HW_BREAKPOINT 885 case PTRACE_GETHBPREGS: 886 if (ptrace_get_breakpoints(child) < 0) 887 return -ESRCH; 888 889 ret = ptrace_gethbpregs(child, addr, 890 (unsigned long __user *)data); 891 ptrace_put_breakpoints(child); 892 break; 893 case PTRACE_SETHBPREGS: 894 if (ptrace_get_breakpoints(child) < 0) 895 return -ESRCH; 896 897 ret = ptrace_sethbpregs(child, addr, 898 (unsigned long __user *)data); 899 ptrace_put_breakpoints(child); 900 break; 901 #endif 902 903 default: 904 ret = ptrace_request(child, request, addr, data); 905 break; 906 } 907 908 return ret; 909 } 910 911 enum ptrace_syscall_dir { 912 PTRACE_SYSCALL_ENTER = 0, 913 PTRACE_SYSCALL_EXIT, 914 }; 915 916 static int ptrace_syscall_trace(struct pt_regs *regs, int scno, 917 enum ptrace_syscall_dir dir) 918 { 919 unsigned long ip; 920 921 if (!test_thread_flag(TIF_SYSCALL_TRACE)) 922 return scno; 923 924 current_thread_info()->syscall = scno; 925 926 /* 927 * IP is used to denote syscall entry/exit: 928 * IP = 0 -> entry, =1 -> exit 929 */ 930 ip = regs->ARM_ip; 931 regs->ARM_ip = dir; 932 933 if (dir == PTRACE_SYSCALL_EXIT) 934 tracehook_report_syscall_exit(regs, 0); 935 else if (tracehook_report_syscall_entry(regs)) 936 current_thread_info()->syscall = -1; 937 938 regs->ARM_ip = ip; 939 return current_thread_info()->syscall; 940 } 941 942 asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno) 943 { 944 int ret = ptrace_syscall_trace(regs, scno, PTRACE_SYSCALL_ENTER); 945 audit_syscall_entry(AUDIT_ARCH_ARM, scno, regs->ARM_r0, regs->ARM_r1, 946 regs->ARM_r2, regs->ARM_r3); 947 return ret; 948 } 949 950 asmlinkage int syscall_trace_exit(struct pt_regs *regs, int scno) 951 { 952 int ret = ptrace_syscall_trace(regs, scno, PTRACE_SYSCALL_EXIT); 953 audit_syscall_exit(regs); 954 return ret; 955 } 956