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 <davem@davemloft.net>
This commit is contained in:
parent
c4a3987fa0
commit
b857bd2922
|
@ -65,6 +65,7 @@ static int genregs32_get(struct task_struct *target,
|
||||||
*k++ = regs->u_regs[pos++];
|
*k++ = regs->u_regs[pos++];
|
||||||
|
|
||||||
reg_window = (unsigned long __user *) regs->u_regs[UREG_I6];
|
reg_window = (unsigned long __user *) regs->u_regs[UREG_I6];
|
||||||
|
reg_window -= 16;
|
||||||
for (; count > 0 && pos < 32; count--) {
|
for (; count > 0 && pos < 32; count--) {
|
||||||
if (get_user(*k++, ®_window[pos++]))
|
if (get_user(*k++, ®_window[pos++]))
|
||||||
return -EFAULT;
|
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 = (unsigned long __user *) regs->u_regs[UREG_I6];
|
||||||
|
reg_window -= 16;
|
||||||
for (; count > 0 && pos < 32; count--) {
|
for (; count > 0 && pos < 32; count--) {
|
||||||
if (get_user(reg, ®_window[pos++]) ||
|
if (get_user(reg, ®_window[pos++]) ||
|
||||||
put_user(reg, u++))
|
put_user(reg, u++))
|
||||||
|
@ -141,6 +143,7 @@ static int genregs32_set(struct task_struct *target,
|
||||||
regs->u_regs[pos++] = *k++;
|
regs->u_regs[pos++] = *k++;
|
||||||
|
|
||||||
reg_window = (unsigned long __user *) regs->u_regs[UREG_I6];
|
reg_window = (unsigned long __user *) regs->u_regs[UREG_I6];
|
||||||
|
reg_window -= 16;
|
||||||
for (; count > 0 && pos < 32; count--) {
|
for (; count > 0 && pos < 32; count--) {
|
||||||
if (put_user(*k++, ®_window[pos++]))
|
if (put_user(*k++, ®_window[pos++]))
|
||||||
return -EFAULT;
|
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 = (unsigned long __user *) regs->u_regs[UREG_I6];
|
||||||
|
reg_window -= 16;
|
||||||
for (; count > 0 && pos < 32; count--) {
|
for (; count > 0 && pos < 32; count--) {
|
||||||
if (get_user(reg, u++) ||
|
if (get_user(reg, u++) ||
|
||||||
put_user(reg, ®_window[pos++]))
|
put_user(reg, ®_window[pos++]))
|
||||||
|
|
|
@ -492,6 +492,7 @@ static int genregs32_get(struct task_struct *target,
|
||||||
*k++ = regs->u_regs[pos++];
|
*k++ = regs->u_regs[pos++];
|
||||||
|
|
||||||
reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6];
|
reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6];
|
||||||
|
reg_window -= 16;
|
||||||
if (target == current) {
|
if (target == current) {
|
||||||
for (; count > 0 && pos < 32; count--) {
|
for (; count > 0 && pos < 32; count--) {
|
||||||
if (get_user(*k++, ®_window[pos++]))
|
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 = (compat_ulong_t __user *) regs->u_regs[UREG_I6];
|
||||||
|
reg_window -= 16;
|
||||||
if (target == current) {
|
if (target == current) {
|
||||||
for (; count > 0 && pos < 32; count--) {
|
for (; count > 0 && pos < 32; count--) {
|
||||||
if (get_user(reg, ®_window[pos++]) ||
|
if (get_user(reg, ®_window[pos++]) ||
|
||||||
|
@ -599,6 +601,7 @@ static int genregs32_set(struct task_struct *target,
|
||||||
regs->u_regs[pos++] = *k++;
|
regs->u_regs[pos++] = *k++;
|
||||||
|
|
||||||
reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6];
|
reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6];
|
||||||
|
reg_window -= 16;
|
||||||
if (target == current) {
|
if (target == current) {
|
||||||
for (; count > 0 && pos < 32; count--) {
|
for (; count > 0 && pos < 32; count--) {
|
||||||
if (put_user(*k++, ®_window[pos++]))
|
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 = (compat_ulong_t __user *) regs->u_regs[UREG_I6];
|
||||||
|
reg_window -= 16;
|
||||||
if (target == current) {
|
if (target == current) {
|
||||||
for (; count > 0 && pos < 32; count--) {
|
for (; count > 0 && pos < 32; count--) {
|
||||||
if (get_user(reg, u++) ||
|
if (get_user(reg, u++) ||
|
||||||
|
|
Reference in New Issue