sparc: Fix regset register window handling.
Subsystems (2)
David Miller
maintainerPATCH 1/1 sparc: Fix regset register window handling.
We have to adjust 'reg_window' down by 16 becuase the 'pos' iterator we'll use to index into the stack slots will be between 16 and 32.
Signed-off-by David S. Miller <[email protected]>
---
This should fix registers in core dumps and other debugging problems on Sparc. I'll push this to Linus and stable too.
arch/sparc/kernel/ptrace_32.c | 4 ++++ arch/sparc/kernel/ptrace_64.c | 4 ++++ 2 files changed, 8 insertions(+), 0 deletions(-)
arch/sparc/kernel/ptrace_32.c +4 -0
@@ -65,6 +65,7 @@ static int genregs32_get(struct task_struct *target, *k++ = regs->u_regs[pos++]; reg_window = (unsigned long __user *) regs->u_regs[UREG_I6 ]; + reg_window -=16 ;for (; count >0 && pos <32 ; count--) {if (get_user (*k++, ®_window[pos++]))return -EFAULT ;
@@ -76,6 +77,7 @@ static int genregs32_get(struct task_struct *target, } reg_window = (unsigned long __user *) regs->u_regs[UREG_I6 ]; + reg_window -=16 ;for (; count >0 && pos <32 ; count--) {if (get_user (reg, ®_window[pos++]) ||put_user (reg, u++))
@@ -141,6 +143,7 @@ static int genregs32_set(struct task_struct *target, regs->u_regs[pos++] = *k++; reg_window = (unsigned long __user *) regs->u_regs[UREG_I6 ]; + reg_window -=16 ;for (; count >0 && pos <32 ; count--) {if (put_user (*k++, ®_window[pos++]))return -EFAULT ;
@@ -153,6 +156,7 @@ static int genregs32_set(struct task_struct *target, } reg_window = (unsigned long __user *) regs->u_regs[UREG_I6 ]; + reg_window -=16 ;for (; count >0 && pos <32 ; count--) {if (get_user (reg, u++) ||put_user (reg, ®_window[pos++]))
arch/sparc/kernel/ptrace_64.c +4 -0
@@ -492,6 +492,7 @@ static int genregs32_get(struct task_struct *target, *k++ = regs->u_regs[pos++]; reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6 ]; + reg_window -=16 ;if (target = current) {for (; count >0 && pos <32 ; count--) {if (get_user (*k++, ®_window[pos++]))
@@ -516,6 +517,7 @@ static int genregs32_get(struct task_struct *target, } reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6 ]; + reg_window -=16 ;if (target = current) {for (; count >0 && pos <32 ; count--) { if (get_user(reg, ®_window[pos++]) ||
@@ -599,6 +601,7 @@ static int genregs32_set(struct task_struct *target, regs->u_regs[pos++] = *k++; reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6 ]; + reg_window -=16 ;if (target = current) {for (; count >0 && pos <32 ; count--) {if (put_user (*k++, ®_window[pos++]))
@@ -625,6 +628,7 @@ static int genregs32_set(struct task_struct *target, } reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6 ]; + reg_window -=16 ;if (target = current) {for (; count >0 && pos <32 ; count--) { if (get_user(reg, u++) ||
Signature · 1 line
1.7.0.3