Skip to content

Commit

Permalink
arm64/signal: Restore TPIDR2 register rather than memory state
Browse files Browse the repository at this point in the history
Currently when restoring the TPIDR2 signal context we set the new value
from the signal frame in the thread data structure but not the register,
following the pattern for the rest of the data we are restoring. This does
not work in the case of TPIDR2, the register always has the value for the
current task. This means that either we return to userspace and ignore the
new value or we context switch and save the register value on top of the
newly restored value.

Load the value from the signal context into the register instead.

Fixes: 39e5449 ("arm64/signal: Include TPIDR2 in the signal context")
Signed-off-by: Mark Brown <[email protected]>
Cc: <[email protected]> # 6.3.x
Link: https://lore.kernel.org/r/20230621-arm64-fix-tpidr2-signal-restore-v2-1-c8e8fcc10302@kernel.org
Signed-off-by: Catalin Marinas <[email protected]>
  • Loading branch information
broonie authored and ctmarinas committed Jun 23, 2023
1 parent 44c026a commit 616cb2f
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion arch/arm64/kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -398,7 +398,7 @@ static int restore_tpidr2_context(struct user_ctxs *user)

__get_user_error(tpidr2_el0, &user->tpidr2->tpidr2, err);
if (!err)
current->thread.tpidr2_el0 = tpidr2_el0;
write_sysreg_s(tpidr2_el0, SYS_TPIDR2_EL0);

return err;
}
Expand Down

0 comments on commit 616cb2f

Please sign in to comment.