diff mbox series

[v2] ARM: mm: make act_mm() respect THREAD_SIZE

Message ID 20200515124808.213538-1-linus.walleij@linaro.org (mailing list archive)
State Mainlined
Commit e1de94380af588bdf6ad6f0cc1f75004c35bc096
Headers show
Series [v2] ARM: mm: make act_mm() respect THREAD_SIZE | expand

Commit Message

Linus Walleij May 15, 2020, 12:48 p.m. UTC
Recent work with KASan exposed the folling hard-coded bitmask
in arch/arm/mm/proc-macros.S:

  bic     \rd, sp, #8128
  bic     \rd, \rd, #63

This forms the bitmask 0x1FFF that is coinciding with
(PAGE_SIZE << THREAD_SIZE_ORDER) - 1, this code was assuming
that THREAD_SIZE is always 8K (8192).

As KASan was increasing THREAD_SIZE_ORDER to 2, I ran into
this bug.

Fix it by this little oneline suggested by Ard:

  bic     \rd, sp, #(THREAD_SIZE - 1) & ~63

Where THREAD_SIZE is defined using THREAD_SIZE_ORDER.

We have to also include <linux/const.h> since the THREAD_SIZE
expands to use the _AC() macro.

Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: Florian Fainelli <f.fainelli@gmail.com>
Suggested-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v1->v2:
- Change from using THREAD_SIZE_ORDER with a hardcoded
  page size constant to just using THREAD_SIZE - 1
  for the mask.
---
 arch/arm/mm/proc-macros.S | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Russell King (Oracle) May 21, 2020, 11:56 a.m. UTC | #1
On Fri, May 15, 2020 at 02:48:08PM +0200, Linus Walleij wrote:
> Recent work with KASan exposed the folling hard-coded bitmask
> in arch/arm/mm/proc-macros.S:
> 
>   bic     \rd, sp, #8128
>   bic     \rd, \rd, #63
> 
> This forms the bitmask 0x1FFF that is coinciding with
> (PAGE_SIZE << THREAD_SIZE_ORDER) - 1, this code was assuming
> that THREAD_SIZE is always 8K (8192).
> 
> As KASan was increasing THREAD_SIZE_ORDER to 2, I ran into
> this bug.
> 
> Fix it by this little oneline suggested by Ard:
> 
>   bic     \rd, sp, #(THREAD_SIZE - 1) & ~63
> 
> Where THREAD_SIZE is defined using THREAD_SIZE_ORDER.
> 
> We have to also include <linux/const.h> since the THREAD_SIZE
> expands to use the _AC() macro.
> 
> Cc: Ard Biesheuvel <ardb@kernel.org>
> Cc: Florian Fainelli <f.fainelli@gmail.com>
> Suggested-by: Ard Biesheuvel <ardb@kernel.org>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> ChangeLog v1->v2:
> - Change from using THREAD_SIZE_ORDER with a hardcoded
>   page size constant to just using THREAD_SIZE - 1
>   for the mask.
> ---
>  arch/arm/mm/proc-macros.S | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S
> index 5461d589a1e2..60ac7c5999a9 100644
> --- a/arch/arm/mm/proc-macros.S
> +++ b/arch/arm/mm/proc-macros.S
> @@ -5,6 +5,7 @@
>   *  VMA_VM_FLAGS
>   *  VM_EXEC
>   */
> +#include <linux/const.h>
>  #include <asm/asm-offsets.h>
>  #include <asm/thread_info.h>
>  
> @@ -30,7 +31,7 @@
>   * act_mm - get current->active_mm
>   */
>  	.macro	act_mm, rd
> -	bic	\rd, sp, #8128
> +	bic	\rd, sp, #(THREAD_SIZE - 1) & ~63
>  	bic	\rd, \rd, #63

We have a get_thread_info macro in asm/assembler that performs the same
task.  Maybe this should be converted to use that, and maybe the macro
should be updated to use bic, since this seems to be acceptable for
Thumb and is one instruction shorter.
diff mbox series

Patch

diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S
index 5461d589a1e2..60ac7c5999a9 100644
--- a/arch/arm/mm/proc-macros.S
+++ b/arch/arm/mm/proc-macros.S
@@ -5,6 +5,7 @@ 
  *  VMA_VM_FLAGS
  *  VM_EXEC
  */
+#include <linux/const.h>
 #include <asm/asm-offsets.h>
 #include <asm/thread_info.h>
 
@@ -30,7 +31,7 @@ 
  * act_mm - get current->active_mm
  */
 	.macro	act_mm, rd
-	bic	\rd, sp, #8128
+	bic	\rd, sp, #(THREAD_SIZE - 1) & ~63
 	bic	\rd, \rd, #63
 	ldr	\rd, [\rd, #TI_TASK]
 	.if (TSK_ACTIVE_MM > IMM12_MASK)