diff options
author | Jens Axboe <axboe@kernel.dk> | 2014-01-08 11:32:45 -0500 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2014-01-08 11:32:45 -0500 |
commit | 54a387cb9e600256e50cb9e2209e7e4f06f464de (patch) | |
tree | 37f2b32b1330f51dbe10ccf4300114c72f7aabdc /arch/arm64/kernel/ptrace.c | |
parent | 8586ea96b4f919a9b38929040bc9ce57c9998fc4 (diff) | |
parent | 0fec08b4ecfc36fd8a64432343b2964fb86d2675 (diff) |
Merge branch 'for-3.14/core' into for-3.14/drivers
We need the updated code to make bcache easier to merge.
Diffstat (limited to 'arch/arm64/kernel/ptrace.c')
-rw-r--r-- | arch/arm64/kernel/ptrace.c | 78 |
1 files changed, 37 insertions, 41 deletions
diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index fecdbf7de82e..6a8928bba03c 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c | |||
@@ -214,31 +214,29 @@ static int ptrace_hbp_fill_attr_ctrl(unsigned int note_type, | |||
214 | { | 214 | { |
215 | int err, len, type, disabled = !ctrl.enabled; | 215 | int err, len, type, disabled = !ctrl.enabled; |
216 | 216 | ||
217 | if (disabled) { | 217 | attr->disabled = disabled; |
218 | len = 0; | 218 | if (disabled) |
219 | type = HW_BREAKPOINT_EMPTY; | 219 | return 0; |
220 | } else { | 220 | |
221 | err = arch_bp_generic_fields(ctrl, &len, &type); | 221 | err = arch_bp_generic_fields(ctrl, &len, &type); |
222 | if (err) | 222 | if (err) |
223 | return err; | 223 | return err; |
224 | 224 | ||
225 | switch (note_type) { | 225 | switch (note_type) { |
226 | case NT_ARM_HW_BREAK: | 226 | case NT_ARM_HW_BREAK: |
227 | if ((type & HW_BREAKPOINT_X) != type) | 227 | if ((type & HW_BREAKPOINT_X) != type) |
228 | return -EINVAL; | ||
229 | break; | ||
230 | case NT_ARM_HW_WATCH: | ||
231 | if ((type & HW_BREAKPOINT_RW) != type) | ||
232 | return -EINVAL; | ||
233 | break; | ||
234 | default: | ||
235 | return -EINVAL; | 228 | return -EINVAL; |
236 | } | 229 | break; |
230 | case NT_ARM_HW_WATCH: | ||
231 | if ((type & HW_BREAKPOINT_RW) != type) | ||
232 | return -EINVAL; | ||
233 | break; | ||
234 | default: | ||
235 | return -EINVAL; | ||
237 | } | 236 | } |
238 | 237 | ||
239 | attr->bp_len = len; | 238 | attr->bp_len = len; |
240 | attr->bp_type = type; | 239 | attr->bp_type = type; |
241 | attr->disabled = disabled; | ||
242 | 240 | ||
243 | return 0; | 241 | return 0; |
244 | } | 242 | } |
@@ -636,28 +634,27 @@ static int compat_gpr_get(struct task_struct *target, | |||
636 | 634 | ||
637 | for (i = 0; i < num_regs; ++i) { | 635 | for (i = 0; i < num_regs; ++i) { |
638 | unsigned int idx = start + i; | 636 | unsigned int idx = start + i; |
639 | void *reg; | 637 | compat_ulong_t reg; |
640 | 638 | ||
641 | switch (idx) { | 639 | switch (idx) { |
642 | case 15: | 640 | case 15: |
643 | reg = (void *)&task_pt_regs(target)->pc; | 641 | reg = task_pt_regs(target)->pc; |
644 | break; | 642 | break; |
645 | case 16: | 643 | case 16: |
646 | reg = (void *)&task_pt_regs(target)->pstate; | 644 | reg = task_pt_regs(target)->pstate; |
647 | break; | 645 | break; |
648 | case 17: | 646 | case 17: |
649 | reg = (void *)&task_pt_regs(target)->orig_x0; | 647 | reg = task_pt_regs(target)->orig_x0; |
650 | break; | 648 | break; |
651 | default: | 649 | default: |
652 | reg = (void *)&task_pt_regs(target)->regs[idx]; | 650 | reg = task_pt_regs(target)->regs[idx]; |
653 | } | 651 | } |
654 | 652 | ||
655 | ret = copy_to_user(ubuf, reg, sizeof(compat_ulong_t)); | 653 | ret = copy_to_user(ubuf, ®, sizeof(reg)); |
656 | |||
657 | if (ret) | 654 | if (ret) |
658 | break; | 655 | break; |
659 | else | 656 | |
660 | ubuf += sizeof(compat_ulong_t); | 657 | ubuf += sizeof(reg); |
661 | } | 658 | } |
662 | 659 | ||
663 | return ret; | 660 | return ret; |
@@ -685,28 +682,28 @@ static int compat_gpr_set(struct task_struct *target, | |||
685 | 682 | ||
686 | for (i = 0; i < num_regs; ++i) { | 683 | for (i = 0; i < num_regs; ++i) { |
687 | unsigned int idx = start + i; | 684 | unsigned int idx = start + i; |
688 | void *reg; | 685 | compat_ulong_t reg; |
686 | |||
687 | ret = copy_from_user(®, ubuf, sizeof(reg)); | ||
688 | if (ret) | ||
689 | return ret; | ||
690 | |||
691 | ubuf += sizeof(reg); | ||
689 | 692 | ||
690 | switch (idx) { | 693 | switch (idx) { |
691 | case 15: | 694 | case 15: |
692 | reg = (void *)&newregs.pc; | 695 | newregs.pc = reg; |
693 | break; | 696 | break; |
694 | case 16: | 697 | case 16: |
695 | reg = (void *)&newregs.pstate; | 698 | newregs.pstate = reg; |
696 | break; | 699 | break; |
697 | case 17: | 700 | case 17: |
698 | reg = (void *)&newregs.orig_x0; | 701 | newregs.orig_x0 = reg; |
699 | break; | 702 | break; |
700 | default: | 703 | default: |
701 | reg = (void *)&newregs.regs[idx]; | 704 | newregs.regs[idx] = reg; |
702 | } | 705 | } |
703 | 706 | ||
704 | ret = copy_from_user(reg, ubuf, sizeof(compat_ulong_t)); | ||
705 | |||
706 | if (ret) | ||
707 | goto out; | ||
708 | else | ||
709 | ubuf += sizeof(compat_ulong_t); | ||
710 | } | 707 | } |
711 | 708 | ||
712 | if (valid_user_regs(&newregs.user_regs)) | 709 | if (valid_user_regs(&newregs.user_regs)) |
@@ -714,7 +711,6 @@ static int compat_gpr_set(struct task_struct *target, | |||
714 | else | 711 | else |
715 | ret = -EINVAL; | 712 | ret = -EINVAL; |
716 | 713 | ||
717 | out: | ||
718 | return ret; | 714 | return ret; |
719 | } | 715 | } |
720 | 716 | ||