Commit a03b1a0b authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman

powerpc/signal32: Force inlining of __unsafe_save_user_regs() and save_tm_user_regs_unsafe()

Looking at generated code for handle_signal32() shows calls to a
function called __unsafe_save_user_regs.constprop.0 while user access
is open.

And that __unsafe_save_user_regs.constprop.0 function has two nops at
the begining, allowing it to be traced, which is unexpected during
user access open window.

The solution could be to mark __unsafe_save_user_regs() no trace, but
to be on the safe side the most efficient is to flag it __always_inline
as already done for function __unsafe_restore_general_regs(). The
function is relatively small and only called twice, so the size
increase will remain in the noise.

Do the same with save_tm_user_regs_unsafe() as it may suffer the
same issue.

Fixes: ef75e731 ("powerpc/signal32: Transform save_user_regs() and save_tm_user_regs() in 'unsafe' version")
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/7e469c8f01860a69c1ada3ca6a5e2aa65f0f74b2.1685955220.git.christophe.leroy@csgroup.eu
parent 0eb089a7
...@@ -264,8 +264,9 @@ static void prepare_save_user_regs(int ctx_has_vsx_region) ...@@ -264,8 +264,9 @@ static void prepare_save_user_regs(int ctx_has_vsx_region)
#endif #endif
} }
static int __unsafe_save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, static __always_inline int
struct mcontext __user *tm_frame, int ctx_has_vsx_region) __unsafe_save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
struct mcontext __user *tm_frame, int ctx_has_vsx_region)
{ {
unsigned long msr = regs->msr; unsigned long msr = regs->msr;
...@@ -364,8 +365,9 @@ static void prepare_save_tm_user_regs(void) ...@@ -364,8 +365,9 @@ static void prepare_save_tm_user_regs(void)
current->thread.ckvrsave = mfspr(SPRN_VRSAVE); current->thread.ckvrsave = mfspr(SPRN_VRSAVE);
} }
static int save_tm_user_regs_unsafe(struct pt_regs *regs, struct mcontext __user *frame, static __always_inline int
struct mcontext __user *tm_frame, unsigned long msr) save_tm_user_regs_unsafe(struct pt_regs *regs, struct mcontext __user *frame,
struct mcontext __user *tm_frame, unsigned long msr)
{ {
/* Save both sets of general registers */ /* Save both sets of general registers */
unsafe_save_general_regs(&current->thread.ckpt_regs, frame, failed); unsafe_save_general_regs(&current->thread.ckpt_regs, frame, failed);
...@@ -444,8 +446,9 @@ static int save_tm_user_regs_unsafe(struct pt_regs *regs, struct mcontext __user ...@@ -444,8 +446,9 @@ static int save_tm_user_regs_unsafe(struct pt_regs *regs, struct mcontext __user
#else #else
static void prepare_save_tm_user_regs(void) { } static void prepare_save_tm_user_regs(void) { }
static int save_tm_user_regs_unsafe(struct pt_regs *regs, struct mcontext __user *frame, static __always_inline int
struct mcontext __user *tm_frame, unsigned long msr) save_tm_user_regs_unsafe(struct pt_regs *regs, struct mcontext __user *frame,
struct mcontext __user *tm_frame, unsigned long msr)
{ {
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment