diff options
| -rw-r--r-- | arch/powerpc/kernel/ptrace.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index 05b7dd217f60..18447c4fbad3 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
| @@ -1497,9 +1497,14 @@ long arch_ptrace(struct task_struct *child, long request, | |||
| 1497 | if (index < PT_FPR0) { | 1497 | if (index < PT_FPR0) { |
| 1498 | tmp = ptrace_get_reg(child, (int) index); | 1498 | tmp = ptrace_get_reg(child, (int) index); |
| 1499 | } else { | 1499 | } else { |
| 1500 | unsigned int fpidx = index - PT_FPR0; | ||
| 1501 | |||
| 1500 | flush_fp_to_thread(child); | 1502 | flush_fp_to_thread(child); |
| 1501 | tmp = ((unsigned long *)child->thread.fpr) | 1503 | if (fpidx < (PT_FPSCR - PT_FPR0)) |
| 1502 | [TS_FPRWIDTH * (index - PT_FPR0)]; | 1504 | tmp = ((unsigned long *)child->thread.fpr) |
| 1505 | [fpidx * TS_FPRWIDTH]; | ||
| 1506 | else | ||
| 1507 | tmp = child->thread.fpscr.val; | ||
| 1503 | } | 1508 | } |
| 1504 | ret = put_user(tmp, datalp); | 1509 | ret = put_user(tmp, datalp); |
| 1505 | break; | 1510 | break; |
| @@ -1525,9 +1530,14 @@ long arch_ptrace(struct task_struct *child, long request, | |||
| 1525 | if (index < PT_FPR0) { | 1530 | if (index < PT_FPR0) { |
| 1526 | ret = ptrace_put_reg(child, index, data); | 1531 | ret = ptrace_put_reg(child, index, data); |
| 1527 | } else { | 1532 | } else { |
| 1533 | unsigned int fpidx = index - PT_FPR0; | ||
| 1534 | |||
| 1528 | flush_fp_to_thread(child); | 1535 | flush_fp_to_thread(child); |
| 1529 | ((unsigned long *)child->thread.fpr) | 1536 | if (fpidx < (PT_FPSCR - PT_FPR0)) |
| 1530 | [TS_FPRWIDTH * (index - PT_FPR0)] = data; | 1537 | ((unsigned long *)child->thread.fpr) |
| 1538 | [fpidx * TS_FPRWIDTH] = data; | ||
| 1539 | else | ||
| 1540 | child->thread.fpscr.val = data; | ||
| 1531 | ret = 0; | 1541 | ret = 0; |
| 1532 | } | 1542 | } |
| 1533 | break; | 1543 | break; |
