[POWERPC] user_regset PTRACE_SETREGS regression fix
The PTRACE_SETREGS request was only recently added on powerpc, and gdb does not use it. So it slipped through without getting all the testing it should have had. The user_regset changes had a simple bug in storing to all of the 32-bit general registers block on 64-bit kernels. This bug only comes up with PTRACE_SETREGS, not PPC_PTRACE_SETREGS. It causes a BUG_ON to hit, so this fix needs to go in ASAP. Signed-off-by: Roland McGrath <roland@redhat.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
264e3e889d
commit
c2372eb9bc
1 changed files with 8 additions and 2 deletions
|
@ -530,15 +530,21 @@ static int gpr32_set(struct task_struct *target,
|
||||||
--count;
|
--count;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kbuf)
|
if (kbuf) {
|
||||||
for (; count > 0 && pos <= PT_MAX_PUT_REG; --count)
|
for (; count > 0 && pos <= PT_MAX_PUT_REG; --count)
|
||||||
regs[pos++] = *k++;
|
regs[pos++] = *k++;
|
||||||
else
|
for (; count > 0 && pos < PT_TRAP; --count, ++pos)
|
||||||
|
++k;
|
||||||
|
} else {
|
||||||
for (; count > 0 && pos <= PT_MAX_PUT_REG; --count) {
|
for (; count > 0 && pos <= PT_MAX_PUT_REG; --count) {
|
||||||
if (__get_user(reg, u++))
|
if (__get_user(reg, u++))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
regs[pos++] = reg;
|
regs[pos++] = reg;
|
||||||
}
|
}
|
||||||
|
for (; count > 0 && pos < PT_TRAP; --count, ++pos)
|
||||||
|
if (__get_user(reg, u++))
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
if (count > 0 && pos == PT_TRAP) {
|
if (count > 0 && pos == PT_TRAP) {
|
||||||
if (kbuf)
|
if (kbuf)
|
||||||
|
|
Loading…
Reference in a new issue