diff options
Diffstat (limited to 'arch/powerpc/kernel/ptrace.c')
| -rw-r--r-- | arch/powerpc/kernel/ptrace.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index 55613e33e263..a6ae1cfad86c 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
| @@ -933,12 +933,16 @@ int ptrace_set_debugreg(struct task_struct *task, unsigned long addr, | |||
| 933 | if (data && !(data & DABR_TRANSLATION)) | 933 | if (data && !(data & DABR_TRANSLATION)) |
| 934 | return -EIO; | 934 | return -EIO; |
| 935 | #ifdef CONFIG_HAVE_HW_BREAKPOINT | 935 | #ifdef CONFIG_HAVE_HW_BREAKPOINT |
| 936 | if (ptrace_get_breakpoints(task) < 0) | ||
| 937 | return -ESRCH; | ||
| 938 | |||
| 936 | bp = thread->ptrace_bps[0]; | 939 | bp = thread->ptrace_bps[0]; |
| 937 | if ((!data) || !(data & (DABR_DATA_WRITE | DABR_DATA_READ))) { | 940 | if ((!data) || !(data & (DABR_DATA_WRITE | DABR_DATA_READ))) { |
| 938 | if (bp) { | 941 | if (bp) { |
| 939 | unregister_hw_breakpoint(bp); | 942 | unregister_hw_breakpoint(bp); |
| 940 | thread->ptrace_bps[0] = NULL; | 943 | thread->ptrace_bps[0] = NULL; |
| 941 | } | 944 | } |
| 945 | ptrace_put_breakpoints(task); | ||
| 942 | return 0; | 946 | return 0; |
| 943 | } | 947 | } |
| 944 | if (bp) { | 948 | if (bp) { |
| @@ -948,9 +952,12 @@ int ptrace_set_debugreg(struct task_struct *task, unsigned long addr, | |||
| 948 | (DABR_DATA_WRITE | DABR_DATA_READ), | 952 | (DABR_DATA_WRITE | DABR_DATA_READ), |
| 949 | &attr.bp_type); | 953 | &attr.bp_type); |
| 950 | ret = modify_user_hw_breakpoint(bp, &attr); | 954 | ret = modify_user_hw_breakpoint(bp, &attr); |
| 951 | if (ret) | 955 | if (ret) { |
| 956 | ptrace_put_breakpoints(task); | ||
| 952 | return ret; | 957 | return ret; |
| 958 | } | ||
| 953 | thread->ptrace_bps[0] = bp; | 959 | thread->ptrace_bps[0] = bp; |
| 960 | ptrace_put_breakpoints(task); | ||
| 954 | thread->dabr = data; | 961 | thread->dabr = data; |
| 955 | return 0; | 962 | return 0; |
| 956 | } | 963 | } |
| @@ -965,9 +972,12 @@ int ptrace_set_debugreg(struct task_struct *task, unsigned long addr, | |||
| 965 | ptrace_triggered, task); | 972 | ptrace_triggered, task); |
| 966 | if (IS_ERR(bp)) { | 973 | if (IS_ERR(bp)) { |
| 967 | thread->ptrace_bps[0] = NULL; | 974 | thread->ptrace_bps[0] = NULL; |
| 975 | ptrace_put_breakpoints(task); | ||
| 968 | return PTR_ERR(bp); | 976 | return PTR_ERR(bp); |
| 969 | } | 977 | } |
| 970 | 978 | ||
| 979 | ptrace_put_breakpoints(task); | ||
| 980 | |||
| 971 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ | 981 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ |
| 972 | 982 | ||
| 973 | /* Move contents to the DABR register */ | 983 | /* Move contents to the DABR register */ |
