You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
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:
@@ -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
Block a user