ptrace.c (0ff555192a8d20385d49d1c420e2e8d409b3c0da) | ptrace.c (bf53de907dfdaac178c92d774aae7370d7b97d20) |
---|---|
1/* By Ross Biro 1/23/92 */ 2/* 3 * Pentium III FXSR, SSE support 4 * Gareth Hughes <gareth@valinux.com>, May 2000 5 * 6 * BTS tracing 7 * Markus Metzger <markus.t.metzger@intel.com>, Dec 2007 8 */ --- 567 unchanged lines hidden (view full) --- 576 return -ENXIO; 577 578 return user_regset_copyout(&pos, &count, &kbuf, &ubuf, 579 target->thread.io_bitmap_ptr, 580 0, IO_BITMAP_BYTES); 581} 582 583#ifdef CONFIG_X86_PTRACE_BTS | 1/* By Ross Biro 1/23/92 */ 2/* 3 * Pentium III FXSR, SSE support 4 * Gareth Hughes <gareth@valinux.com>, May 2000 5 * 6 * BTS tracing 7 * Markus Metzger <markus.t.metzger@intel.com>, Dec 2007 8 */ --- 567 unchanged lines hidden (view full) --- 576 return -ENXIO; 577 578 return user_regset_copyout(&pos, &count, &kbuf, &ubuf, 579 target->thread.io_bitmap_ptr, 580 0, IO_BITMAP_BYTES); 581} 582 583#ifdef CONFIG_X86_PTRACE_BTS |
584/* 585 * The configuration for a particular BTS hardware implementation. 586 */ 587struct bts_configuration { 588 /* the size of a BTS record in bytes; at most BTS_MAX_RECORD_SIZE */ 589 unsigned char sizeof_bts; 590 /* the size of a field in the BTS record in bytes */ 591 unsigned char sizeof_field; 592 /* a bitmask to enable/disable BTS in DEBUGCTL MSR */ 593 unsigned long debugctl_mask; 594}; 595static struct bts_configuration bts_cfg; 596 597#define BTS_MAX_RECORD_SIZE (8 * 3) 598 599 600/* 601 * Branch Trace Store (BTS) uses the following format. Different 602 * architectures vary in the size of those fields. 603 * - source linear address 604 * - destination linear address 605 * - flags 606 * 607 * Later architectures use 64bit pointers throughout, whereas earlier 608 * architectures use 32bit pointers in 32bit mode. 609 * 610 * We compute the base address for the first 8 fields based on: 611 * - the field size stored in the DS configuration 612 * - the relative field position 613 * 614 * In order to store additional information in the BTS buffer, we use 615 * a special source address to indicate that the record requires 616 * special interpretation. 617 * 618 * Netburst indicated via a bit in the flags field whether the branch 619 * was predicted; this is ignored. 620 */ 621 622enum bts_field { 623 bts_from = 0, 624 bts_to, 625 bts_flags, 626 627 bts_escape = (unsigned long)-1, 628 bts_qual = bts_to, 629 bts_jiffies = bts_flags 630}; 631 632static inline unsigned long bts_get(const char *base, enum bts_field field) 633{ 634 base += (bts_cfg.sizeof_field * field); 635 return *(unsigned long *)base; 636} 637 638static inline void bts_set(char *base, enum bts_field field, unsigned long val) 639{ 640 base += (bts_cfg.sizeof_field * field);; 641 (*(unsigned long *)base) = val; 642} 643 644/* 645 * Translate a BTS record from the raw format into the bts_struct format 646 * 647 * out (out): bts_struct interpretation 648 * raw: raw BTS record 649 */ 650static void ptrace_bts_translate_record(struct bts_struct *out, const void *raw) 651{ 652 memset(out, 0, sizeof(*out)); 653 if (bts_get(raw, bts_from) == bts_escape) { 654 out->qualifier = bts_get(raw, bts_qual); 655 out->variant.jiffies = bts_get(raw, bts_jiffies); 656 } else { 657 out->qualifier = BTS_BRANCH; 658 out->variant.lbr.from_ip = bts_get(raw, bts_from); 659 out->variant.lbr.to_ip = bts_get(raw, bts_to); 660 } 661} 662 | |
663static int ptrace_bts_read_record(struct task_struct *child, size_t index, 664 struct bts_struct __user *out) 665{ | 584static int ptrace_bts_read_record(struct task_struct *child, size_t index, 585 struct bts_struct __user *out) 586{ |
666 struct bts_struct ret; 667 const void *bts_record; 668 size_t bts_index, bts_end; | 587 const struct bts_trace *trace; 588 struct bts_struct bts; 589 const unsigned char *at; |
669 int error; 670 | 590 int error; 591 |
671 error = ds_get_bts_end(child, &bts_end); 672 if (error < 0) 673 return error; | 592 trace = ds_read_bts(child->bts); 593 if (!trace) 594 return -EPERM; |
674 | 595 |
675 if (bts_end <= index) 676 return -EINVAL; | 596 at = trace->ds.top - ((index + 1) * trace->ds.size); 597 if ((void *)at < trace->ds.begin) 598 at += (trace->ds.n * trace->ds.size); |
677 | 599 |
678 error = ds_get_bts_index(child, &bts_index); 679 if (error < 0) 680 return error; | 600 if (!trace->read) 601 return -EOPNOTSUPP; |
681 | 602 |
682 /* translate the ptrace bts index into the ds bts index */ 683 bts_index += bts_end - (index + 1); 684 if (bts_end <= bts_index) 685 bts_index -= bts_end; 686 687 error = ds_access_bts(child, bts_index, &bts_record); | 603 error = trace->read(child->bts, at, &bts); |
688 if (error < 0) 689 return error; 690 | 604 if (error < 0) 605 return error; 606 |
691 ptrace_bts_translate_record(&ret, bts_record); 692 693 if (copy_to_user(out, &ret, sizeof(ret))) | 607 if (copy_to_user(out, &bts, sizeof(bts))) |
694 return -EFAULT; 695 | 608 return -EFAULT; 609 |
696 return sizeof(ret); | 610 return sizeof(bts); |
697} 698 699static int ptrace_bts_drain(struct task_struct *child, 700 long size, 701 struct bts_struct __user *out) 702{ | 611} 612 613static int ptrace_bts_drain(struct task_struct *child, 614 long size, 615 struct bts_struct __user *out) 616{ |
703 struct bts_struct ret; 704 const unsigned char *raw; 705 size_t end, i; 706 int error; | 617 const struct bts_trace *trace; 618 const unsigned char *at; 619 int error, drained = 0; |
707 | 620 |
708 error = ds_get_bts_index(child, &end); 709 if (error < 0) 710 return error; | 621 trace = ds_read_bts(child->bts); 622 if (!trace) 623 return -EPERM; |
711 | 624 |
712 if (size < (end * sizeof(struct bts_struct))) | 625 if (!trace->read) 626 return -EOPNOTSUPP; 627 628 if (size < (trace->ds.top - trace->ds.begin)) |
713 return -EIO; 714 | 629 return -EIO; 630 |
715 error = ds_access_bts(child, 0, (const void **)&raw); 716 if (error < 0) 717 return error; | 631 for (at = trace->ds.begin; (void *)at < trace->ds.top; 632 out++, drained++, at += trace->ds.size) { 633 struct bts_struct bts; 634 int error; |
718 | 635 |
719 for (i = 0; i < end; i++, out++, raw += bts_cfg.sizeof_bts) { 720 ptrace_bts_translate_record(&ret, raw); | 636 error = trace->read(child->bts, at, &bts); 637 if (error < 0) 638 return error; |
721 | 639 |
722 if (copy_to_user(out, &ret, sizeof(ret))) | 640 if (copy_to_user(out, &bts, sizeof(bts))) |
723 return -EFAULT; 724 } 725 | 641 return -EFAULT; 642 } 643 |
726 error = ds_clear_bts(child); | 644 memset(trace->ds.begin, 0, trace->ds.n * trace->ds.size); 645 646 error = ds_reset_bts(child->bts); |
727 if (error < 0) 728 return error; 729 | 647 if (error < 0) 648 return error; 649 |
730 return end; | 650 return drained; |
731} 732 | 651} 652 |
733static void ptrace_bts_ovfl(struct task_struct *child) 734{ 735 send_sig(child->thread.bts_ovfl_signal, child, 0); 736} 737 | |
738static int ptrace_bts_config(struct task_struct *child, 739 long cfg_size, 740 const struct ptrace_bts_config __user *ucfg) 741{ 742 struct ptrace_bts_config cfg; | 653static int ptrace_bts_config(struct task_struct *child, 654 long cfg_size, 655 const struct ptrace_bts_config __user *ucfg) 656{ 657 struct ptrace_bts_config cfg; |
743 int error = 0; | 658 unsigned int flags = 0; |
744 | 659 |
745 error = -EOPNOTSUPP; 746 if (!bts_cfg.sizeof_bts) 747 goto errout; 748 749 error = -EIO; | |
750 if (cfg_size < sizeof(cfg)) | 660 if (cfg_size < sizeof(cfg)) |
751 goto errout; | 661 return -EIO; |
752 | 662 |
753 error = -EFAULT; | |
754 if (copy_from_user(&cfg, ucfg, sizeof(cfg))) | 663 if (copy_from_user(&cfg, ucfg, sizeof(cfg))) |
755 goto errout; | 664 return -EFAULT; |
756 | 665 |
757 error = -EINVAL; 758 if ((cfg.flags & PTRACE_BTS_O_SIGNAL) && 759 !(cfg.flags & PTRACE_BTS_O_ALLOC)) 760 goto errout; | 666 if (child->bts) { 667 ds_release_bts(child->bts); 668 child->bts = NULL; 669 } |
761 | 670 |
762 if (cfg.flags & PTRACE_BTS_O_ALLOC) { 763 ds_ovfl_callback_t ovfl = NULL; 764 unsigned int sig = 0; | 671 if (cfg.flags & PTRACE_BTS_O_SIGNAL) { 672 if (!cfg.signal) 673 return -EINVAL; |
765 | 674 |
766 /* we ignore the error in case we were not tracing child */ 767 (void)ds_release_bts(child); | 675 return -EOPNOTSUPP; |
768 | 676 |
769 if (cfg.flags & PTRACE_BTS_O_SIGNAL) { 770 if (!cfg.signal) 771 goto errout; | 677 child->thread.bts_ovfl_signal = cfg.signal; 678 } |
772 | 679 |
773 sig = cfg.signal; 774 ovfl = ptrace_bts_ovfl; 775 } | 680 if ((cfg.flags & PTRACE_BTS_O_ALLOC) && 681 (cfg.size != child->bts_size)) { 682 kfree(child->bts_buffer); |
776 | 683 |
777 error = ds_request_bts(child, /* base = */ NULL, cfg.size, ovfl); 778 if (error < 0) 779 goto errout; 780 781 child->thread.bts_ovfl_signal = sig; | 684 child->bts_size = cfg.size; 685 child->bts_buffer = kzalloc(cfg.size, GFP_KERNEL); 686 if (!child->bts_buffer) { 687 child->bts_size = 0; 688 return -ENOMEM; 689 } |
782 } 783 | 690 } 691 |
784 error = -EINVAL; 785 if (!child->thread.ds_ctx && cfg.flags) 786 goto errout; 787 | |
788 if (cfg.flags & PTRACE_BTS_O_TRACE) | 692 if (cfg.flags & PTRACE_BTS_O_TRACE) |
789 child->thread.debugctlmsr |= bts_cfg.debugctl_mask; 790 else 791 child->thread.debugctlmsr &= ~bts_cfg.debugctl_mask; | 693 flags |= BTS_USER; |
792 793 if (cfg.flags & PTRACE_BTS_O_SCHED) | 694 695 if (cfg.flags & PTRACE_BTS_O_SCHED) |
794 set_tsk_thread_flag(child, TIF_BTS_TRACE_TS); 795 else 796 clear_tsk_thread_flag(child, TIF_BTS_TRACE_TS); | 696 flags |= BTS_TIMESTAMPS; |
797 | 697 |
798 error = sizeof(cfg); | 698 child->bts = ds_request_bts(child, child->bts_buffer, child->bts_size, 699 /* ovfl = */ NULL, /* th = */ (size_t)-1, 700 flags); 701 if (IS_ERR(child->bts)) { 702 int error = PTR_ERR(child->bts); |
799 | 703 |
800out: 801 if (child->thread.debugctlmsr) 802 set_tsk_thread_flag(child, TIF_DEBUGCTLMSR); 803 else 804 clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); | 704 kfree(child->bts_buffer); 705 child->bts = NULL; 706 child->bts_buffer = NULL; 707 child->bts_size = 0; |
805 | 708 |
806 return error; | 709 return error; 710 } |
807 | 711 |
808errout: 809 child->thread.debugctlmsr &= ~bts_cfg.debugctl_mask; 810 clear_tsk_thread_flag(child, TIF_BTS_TRACE_TS); 811 goto out; | 712 return sizeof(cfg); |
812} 813 814static int ptrace_bts_status(struct task_struct *child, 815 long cfg_size, 816 struct ptrace_bts_config __user *ucfg) 817{ | 713} 714 715static int ptrace_bts_status(struct task_struct *child, 716 long cfg_size, 717 struct ptrace_bts_config __user *ucfg) 718{ |
719 const struct bts_trace *trace; |
|
818 struct ptrace_bts_config cfg; | 720 struct ptrace_bts_config cfg; |
819 size_t end; 820 const void *base, *max; 821 int error; | |
822 823 if (cfg_size < sizeof(cfg)) 824 return -EIO; 825 | 721 722 if (cfg_size < sizeof(cfg)) 723 return -EIO; 724 |
826 error = ds_get_bts_end(child, &end); 827 if (error < 0) 828 return error; | 725 trace = ds_read_bts(child->bts); 726 if (!trace) 727 return -EPERM; |
829 | 728 |
830 error = ds_access_bts(child, /* index = */ 0, &base); 831 if (error < 0) 832 return error; 833 834 error = ds_access_bts(child, /* index = */ end, &max); 835 if (error < 0) 836 return error; 837 | |
838 memset(&cfg, 0, sizeof(cfg)); | 729 memset(&cfg, 0, sizeof(cfg)); |
839 cfg.size = (max - base); | 730 cfg.size = trace->ds.end - trace->ds.begin; |
840 cfg.signal = child->thread.bts_ovfl_signal; 841 cfg.bts_size = sizeof(struct bts_struct); 842 843 if (cfg.signal) 844 cfg.flags |= PTRACE_BTS_O_SIGNAL; 845 | 731 cfg.signal = child->thread.bts_ovfl_signal; 732 cfg.bts_size = sizeof(struct bts_struct); 733 734 if (cfg.signal) 735 cfg.flags |= PTRACE_BTS_O_SIGNAL; 736 |
846 if (test_tsk_thread_flag(child, TIF_DEBUGCTLMSR) && 847 child->thread.debugctlmsr & bts_cfg.debugctl_mask) | 737 if (trace->ds.flags & BTS_USER) |
848 cfg.flags |= PTRACE_BTS_O_TRACE; 849 | 738 cfg.flags |= PTRACE_BTS_O_TRACE; 739 |
850 if (test_tsk_thread_flag(child, TIF_BTS_TRACE_TS)) | 740 if (trace->ds.flags & BTS_TIMESTAMPS) |
851 cfg.flags |= PTRACE_BTS_O_SCHED; 852 853 if (copy_to_user(ucfg, &cfg, sizeof(cfg))) 854 return -EFAULT; 855 856 return sizeof(cfg); 857} 858 | 741 cfg.flags |= PTRACE_BTS_O_SCHED; 742 743 if (copy_to_user(ucfg, &cfg, sizeof(cfg))) 744 return -EFAULT; 745 746 return sizeof(cfg); 747} 748 |
859static int ptrace_bts_write_record(struct task_struct *child, 860 const struct bts_struct *in) | 749static int ptrace_bts_clear(struct task_struct *child) |
861{ | 750{ |
862 unsigned char bts_record[BTS_MAX_RECORD_SIZE]; | 751 const struct bts_trace *trace; |
863 | 752 |
864 BUG_ON(BTS_MAX_RECORD_SIZE < bts_cfg.sizeof_bts); | 753 trace = ds_read_bts(child->bts); 754 if (!trace) 755 return -EPERM; |
865 | 756 |
866 memset(bts_record, 0, bts_cfg.sizeof_bts); 867 switch (in->qualifier) { 868 case BTS_INVALID: 869 break; | 757 memset(trace->ds.begin, 0, trace->ds.n * trace->ds.size); |
870 | 758 |
871 case BTS_BRANCH: 872 bts_set(bts_record, bts_from, in->variant.lbr.from_ip); 873 bts_set(bts_record, bts_to, in->variant.lbr.to_ip); 874 break; | 759 return ds_reset_bts(child->bts); 760} |
875 | 761 |
876 case BTS_TASK_ARRIVES: 877 case BTS_TASK_DEPARTS: 878 bts_set(bts_record, bts_from, bts_escape); 879 bts_set(bts_record, bts_qual, in->qualifier); 880 bts_set(bts_record, bts_jiffies, in->variant.jiffies); 881 break; | 762static int ptrace_bts_size(struct task_struct *child) 763{ 764 const struct bts_trace *trace; |
882 | 765 |
883 default: 884 return -EINVAL; 885 } | 766 trace = ds_read_bts(child->bts); 767 if (!trace) 768 return -EPERM; |
886 | 769 |
887 /* The writing task will be the switched-to task on a context 888 * switch. It needs to write into the switched-from task's BTS 889 * buffer. */ 890 return ds_unchecked_write_bts(child, bts_record, bts_cfg.sizeof_bts); | 770 return (trace->ds.top - trace->ds.begin) / trace->ds.size; |
891} 892 | 771} 772 |
893void ptrace_bts_take_timestamp(struct task_struct *tsk, 894 enum bts_qualifier qualifier) | 773static void ptrace_bts_fork(struct task_struct *tsk) |
895{ | 774{ |
896 struct bts_struct rec = { 897 .qualifier = qualifier, 898 .variant.jiffies = jiffies_64 899 }; 900 901 ptrace_bts_write_record(tsk, &rec); | 775 tsk->bts = NULL; 776 tsk->bts_buffer = NULL; 777 tsk->bts_size = 0; 778 tsk->thread.bts_ovfl_signal = 0; |
902} 903 | 779} 780 |
904static const struct bts_configuration bts_cfg_netburst = { 905 .sizeof_bts = sizeof(long) * 3, 906 .sizeof_field = sizeof(long), 907 .debugctl_mask = (1<<2)|(1<<3)|(1<<5) 908}; | 781static void ptrace_bts_untrace(struct task_struct *child) 782{ 783 if (unlikely(child->bts)) { 784 ds_release_bts(child->bts); 785 child->bts = NULL; |
909 | 786 |
910static const struct bts_configuration bts_cfg_pentium_m = { 911 .sizeof_bts = sizeof(long) * 3, 912 .sizeof_field = sizeof(long), 913 .debugctl_mask = (1<<6)|(1<<7) 914}; | 787 kfree(child->bts_buffer); 788 child->bts_buffer = NULL; 789 child->bts_size = 0; 790 } 791} |
915 | 792 |
916static const struct bts_configuration bts_cfg_core2 = { 917 .sizeof_bts = 8 * 3, 918 .sizeof_field = 8, 919 .debugctl_mask = (1<<6)|(1<<7)|(1<<9) 920}; | 793static void ptrace_bts_detach(struct task_struct *child) 794{ 795 ptrace_bts_untrace(child); 796} 797#else 798static inline void ptrace_bts_fork(struct task_struct *tsk) {} 799static inline void ptrace_bts_detach(struct task_struct *child) {} 800static inline void ptrace_bts_untrace(struct task_struct *child) {} 801#endif /* CONFIG_X86_PTRACE_BTS */ |
921 | 802 |
922static inline void bts_configure(const struct bts_configuration *cfg) | 803void x86_ptrace_fork(struct task_struct *child, unsigned long clone_flags) |
923{ | 804{ |
924 bts_cfg = *cfg; | 805 ptrace_bts_fork(child); |
925} 926 | 806} 807 |
927void __cpuinit ptrace_bts_init_intel(struct cpuinfo_x86 *c) | 808void x86_ptrace_untrace(struct task_struct *child) |
928{ | 809{ |
929 switch (c->x86) { 930 case 0x6: 931 switch (c->x86_model) { 932 case 0xD: 933 case 0xE: /* Pentium M */ 934 bts_configure(&bts_cfg_pentium_m); 935 break; 936 case 0xF: /* Core2 */ 937 case 0x1C: /* Atom */ 938 bts_configure(&bts_cfg_core2); 939 break; 940 default: 941 /* sorry, don't know about them */ 942 break; 943 } 944 break; 945 case 0xF: 946 switch (c->x86_model) { 947 case 0x0: 948 case 0x1: 949 case 0x2: /* Netburst */ 950 bts_configure(&bts_cfg_netburst); 951 break; 952 default: 953 /* sorry, don't know about them */ 954 break; 955 } 956 break; 957 default: 958 /* sorry, don't know about them */ 959 break; 960 } | 810 ptrace_bts_untrace(child); |
961} | 811} |
962#endif /* CONFIG_X86_PTRACE_BTS */ | |
963 964/* 965 * Called by kernel/ptrace.c when detaching.. 966 * 967 * Make sure the single step bit is not set. 968 */ 969void ptrace_disable(struct task_struct *child) 970{ 971 user_disable_single_step(child); 972#ifdef TIF_SYSCALL_EMU 973 clear_tsk_thread_flag(child, TIF_SYSCALL_EMU); 974#endif | 812 813/* 814 * Called by kernel/ptrace.c when detaching.. 815 * 816 * Make sure the single step bit is not set. 817 */ 818void ptrace_disable(struct task_struct *child) 819{ 820 user_disable_single_step(child); 821#ifdef TIF_SYSCALL_EMU 822 clear_tsk_thread_flag(child, TIF_SYSCALL_EMU); 823#endif |
975#ifdef CONFIG_X86_PTRACE_BTS 976 (void)ds_release_bts(child); 977 978 child->thread.debugctlmsr &= ~bts_cfg.debugctl_mask; 979 if (!child->thread.debugctlmsr) 980 clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); 981 982 clear_tsk_thread_flag(child, TIF_BTS_TRACE_TS); 983#endif /* CONFIG_X86_PTRACE_BTS */ | 824 ptrace_bts_detach(child); |
984} 985 986#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION 987static const struct user_regset_view user_x86_32_view; /* Initialized below. */ 988#endif 989 990long arch_ptrace(struct task_struct *child, long request, long addr, long data) 991{ --- 115 unchanged lines hidden (view full) --- 1107 break; 1108 1109 case PTRACE_BTS_STATUS: 1110 ret = ptrace_bts_status 1111 (child, data, (struct ptrace_bts_config __user *)addr); 1112 break; 1113 1114 case PTRACE_BTS_SIZE: | 825} 826 827#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION 828static const struct user_regset_view user_x86_32_view; /* Initialized below. */ 829#endif 830 831long arch_ptrace(struct task_struct *child, long request, long addr, long data) 832{ --- 115 unchanged lines hidden (view full) --- 948 break; 949 950 case PTRACE_BTS_STATUS: 951 ret = ptrace_bts_status 952 (child, data, (struct ptrace_bts_config __user *)addr); 953 break; 954 955 case PTRACE_BTS_SIZE: |
1115 ret = ds_get_bts_index(child, /* pos = */ NULL); | 956 ret = ptrace_bts_size(child); |
1116 break; 1117 1118 case PTRACE_BTS_GET: 1119 ret = ptrace_bts_read_record 1120 (child, data, (struct bts_struct __user *) addr); 1121 break; 1122 1123 case PTRACE_BTS_CLEAR: | 957 break; 958 959 case PTRACE_BTS_GET: 960 ret = ptrace_bts_read_record 961 (child, data, (struct bts_struct __user *) addr); 962 break; 963 964 case PTRACE_BTS_CLEAR: |
1124 ret = ds_clear_bts(child); | 965 ret = ptrace_bts_clear(child); |
1125 break; 1126 1127 case PTRACE_BTS_DRAIN: 1128 ret = ptrace_bts_drain 1129 (child, data, (struct bts_struct __user *) addr); 1130 break; 1131#endif /* CONFIG_X86_PTRACE_BTS */ 1132 --- 246 unchanged lines hidden (view full) --- 1379 case PTRACE_SETFPXREGS: /* Set the child extended FPU state. */ 1380 return copy_regset_from_user(child, &user_x86_32_view, 1381 REGSET_XFP, 0, 1382 sizeof(struct user32_fxsr_struct), 1383 datap); 1384 1385 case PTRACE_GET_THREAD_AREA: 1386 case PTRACE_SET_THREAD_AREA: | 966 break; 967 968 case PTRACE_BTS_DRAIN: 969 ret = ptrace_bts_drain 970 (child, data, (struct bts_struct __user *) addr); 971 break; 972#endif /* CONFIG_X86_PTRACE_BTS */ 973 --- 246 unchanged lines hidden (view full) --- 1220 case PTRACE_SETFPXREGS: /* Set the child extended FPU state. */ 1221 return copy_regset_from_user(child, &user_x86_32_view, 1222 REGSET_XFP, 0, 1223 sizeof(struct user32_fxsr_struct), 1224 datap); 1225 1226 case PTRACE_GET_THREAD_AREA: 1227 case PTRACE_SET_THREAD_AREA: |
1228#ifdef CONFIG_X86_PTRACE_BTS 1229 case PTRACE_BTS_CONFIG: 1230 case PTRACE_BTS_STATUS: 1231 case PTRACE_BTS_SIZE: 1232 case PTRACE_BTS_GET: 1233 case PTRACE_BTS_CLEAR: 1234 case PTRACE_BTS_DRAIN: 1235#endif /* CONFIG_X86_PTRACE_BTS */ |
|
1387 return arch_ptrace(child, request, addr, data); 1388 1389 default: 1390 return compat_ptrace_request(child, request, addr, data); 1391 } 1392 1393 return ret; 1394} --- 196 unchanged lines hidden --- | 1236 return arch_ptrace(child, request, addr, data); 1237 1238 default: 1239 return compat_ptrace_request(child, request, addr, data); 1240 } 1241 1242 return ret; 1243} --- 196 unchanged lines hidden --- |