[PATCH v4 2/5] powerpc/code-patching: Add data patch alignment check

Hari Bathini hbathini at linux.ibm.com
Tue Aug 20 17:03:27 AEST 2024



On 15/05/24 8:14 am, Benjamin Gray wrote:
> The new data patching still needs to be aligned within a
> cacheline too for the flushes to work correctly. To simplify
> this requirement, we just say data patches must be aligned.
> 
> Detect when data patching is not aligned, returning an invalid
> argument error.
> 
> Signed-off-by: Benjamin Gray <bgray at linux.ibm.com>

Reviewed-by: Hari Bathini <hbathini at linux.ibm.com>

> 
> ---
> 
> v3: * New in v3
> ---
>   arch/powerpc/include/asm/code-patching.h | 6 ++++++
>   arch/powerpc/lib/code-patching.c         | 6 ++++++
>   2 files changed, 12 insertions(+)
> 
> diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h
> index 21a36e2c4e26..e7f14720f630 100644
> --- a/arch/powerpc/include/asm/code-patching.h
> +++ b/arch/powerpc/include/asm/code-patching.h
> @@ -95,11 +95,17 @@ int patch_ulong(void *addr, unsigned long val);
>   
>   static inline int patch_uint(void *addr, unsigned int val)
>   {
> +	if (!IS_ALIGNED((unsigned long)addr, sizeof(unsigned int)))
> +		return -EINVAL;
> +
>   	return patch_instruction(addr, ppc_inst(val));
>   }
>   
>   static inline int patch_ulong(void *addr, unsigned long val)
>   {
> +	if (!IS_ALIGNED((unsigned long)addr, sizeof(unsigned long)))
> +		return -EINVAL;
> +
>   	return patch_instruction(addr, ppc_inst(val));
>   }
>   
> diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c
> index 18f762616db9..384b275d1bc5 100644
> --- a/arch/powerpc/lib/code-patching.c
> +++ b/arch/powerpc/lib/code-patching.c
> @@ -386,12 +386,18 @@ NOKPROBE_SYMBOL(patch_instruction);
>   
>   int patch_uint(void *addr, unsigned int val)
>   {
> +	if (!IS_ALIGNED((unsigned long)addr, sizeof(unsigned int)))
> +		return -EINVAL;
> +
>   	return patch_mem(addr, val, false);
>   }
>   NOKPROBE_SYMBOL(patch_uint);
>   
>   int patch_ulong(void *addr, unsigned long val)
>   {
> +	if (!IS_ALIGNED((unsigned long)addr, sizeof(unsigned long)))
> +		return -EINVAL;
> +
>   	return patch_mem(addr, val, true);
>   }
>   NOKPROBE_SYMBOL(patch_ulong);


More information about the Linuxppc-dev mailing list