On Mon, 2018-10-01 at 12:21 +0000, Christophe Leroy wrote:
> Commit 51c3c62b58b3 ("powerpc: Avoid code patching freed init
> sections") accesses 'init_mem_is_free' flag too early, before the
> kernel is relocated. This provokes early boot failure (before the
> console is active).
> 
> As it is not necessary to do this verification that early, this
> patch moves the test into patch_instruction() instead of
> __patch_instruction().
> 
> This modification also has the advantage of avoiding unnecessary
> remappings.
> 
> Fixes: 51c3c62b58b3 ("powerpc: Avoid code patching freed init sections")
> Signed-off-by: Christophe Leroy <christophe.le...@c-s.fr>

Thanks

Acked-by: Michael Neuling <mi...@neuling.org>

The original patch was also marked for stable so we should do the same here.

Cc: sta...@vger.kernel.org # 4.13+

> ---
>  arch/powerpc/lib/code-patching.c | 20 ++++++++++++--------
>  1 file changed, 12 insertions(+), 8 deletions(-)
> 
> diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-
> patching.c
> index 6ae2777c220d..5ffee298745f 100644
> --- a/arch/powerpc/lib/code-patching.c
> +++ b/arch/powerpc/lib/code-patching.c
> @@ -28,12 +28,6 @@ static int __patch_instruction(unsigned int *exec_addr,
> unsigned int instr,
>  {
>       int err;
>  
> -     /* Make sure we aren't patching a freed init section */
> -     if (init_mem_is_free && init_section_contains(exec_addr, 4)) {
> -             pr_debug("Skipping init section patching addr: 0x%px\n",
> exec_addr);
> -             return 0;
> -     }
> -
>       __put_user_size(instr, patch_addr, 4, err);
>       if (err)
>               return err;
> @@ -148,7 +142,7 @@ static inline int unmap_patch_area(unsigned long addr)
>       return 0;
>  }
>  
> -int patch_instruction(unsigned int *addr, unsigned int instr)
> +static int do_patch_instruction(unsigned int *addr, unsigned int instr)
>  {
>       int err;
>       unsigned int *patch_addr = NULL;
> @@ -188,12 +182,22 @@ int patch_instruction(unsigned int *addr, unsigned int
> instr)
>  }
>  #else /* !CONFIG_STRICT_KERNEL_RWX */
>  
> -int patch_instruction(unsigned int *addr, unsigned int instr)
> +static int do_patch_instruction(unsigned int *addr, unsigned int instr)
>  {
>       return raw_patch_instruction(addr, instr);
>  }
>  
>  #endif /* CONFIG_STRICT_KERNEL_RWX */
> +
> +int patch_instruction(unsigned int *addr, unsigned int instr)
> +{
> +     /* Make sure we aren't patching a freed init section */
> +     if (init_mem_is_free && init_section_contains(addr, 4)) {
> +             pr_debug("Skipping init section patching addr: 0x%px\n", addr);
> +             return 0;
> +     }
> +     return do_patch_instruction(addr, instr);
> +}
>  NOKPROBE_SYMBOL(patch_instruction);
>  
>  int patch_branch(unsigned int *addr, unsigned long target, int flags)

Reply via email to