diff options
| author | Catalin Marinas <catalin.marinas@arm.com> | 2016-07-01 14:58:21 +0100 | 
|---|---|---|
| committer | Catalin Marinas <catalin.marinas@arm.com> | 2016-11-21 17:33:47 +0000 | 
| commit | bd38967d406fb4f9fca67d612db71b5d74cfb0f5 (patch) | |
| tree | fbcc9bd2e2f70c40387fe166de6f4e874c0d0bdb /arch/arm64/lib | |
| parent | a8ada146f5179793bbaff3c936d73147ccd47ba2 (diff) | |
| download | linux-bd38967d406fb4f9fca67d612db71b5d74cfb0f5.tar.bz2 | |
arm64: Factor out PAN enabling/disabling into separate uaccess_* macros
This patch moves the directly coded alternatives for turning PAN on/off
into separate uaccess_{enable,disable} macros or functions. The asm
macros take a few arguments which will be used in subsequent patches.
Note that any (unlikely) access that the compiler might generate between
uaccess_enable() and uaccess_disable(), other than those explicitly
specified by the user access code, will not be protected by PAN.
Cc: Will Deacon <will.deacon@arm.com>
Cc: James Morse <james.morse@arm.com>
Cc: Kees Cook <keescook@chromium.org>
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'arch/arm64/lib')
| -rw-r--r-- | arch/arm64/lib/clear_user.S | 11 | ||||
| -rw-r--r-- | arch/arm64/lib/copy_from_user.S | 11 | ||||
| -rw-r--r-- | arch/arm64/lib/copy_in_user.S | 11 | ||||
| -rw-r--r-- | arch/arm64/lib/copy_to_user.S | 11 | 
4 files changed, 12 insertions, 32 deletions
| diff --git a/arch/arm64/lib/clear_user.S b/arch/arm64/lib/clear_user.S index 5d1cad3ce6d6..d7150e30438a 100644 --- a/arch/arm64/lib/clear_user.S +++ b/arch/arm64/lib/clear_user.S @@ -17,10 +17,7 @@   */  #include <linux/linkage.h> -#include <asm/alternative.h> -#include <asm/assembler.h> -#include <asm/cpufeature.h> -#include <asm/sysreg.h> +#include <asm/uaccess.h>  	.text @@ -33,8 +30,7 @@   * Alignment fixed up by hardware.   */  ENTRY(__clear_user) -ALTERNATIVE("nop", __stringify(SET_PSTATE_PAN(0)), ARM64_ALT_PAN_NOT_UAO, \ -	    CONFIG_ARM64_PAN) +	uaccess_enable_not_uao x2, x3  	mov	x2, x1			// save the size for fixup return  	subs	x1, x1, #8  	b.mi	2f @@ -54,8 +50,7 @@ uao_user_alternative 9f, strh, sttrh, wzr, x0, 2  	b.mi	5f  uao_user_alternative 9f, strb, sttrb, wzr, x0, 0  5:	mov	x0, #0 -ALTERNATIVE("nop", __stringify(SET_PSTATE_PAN(1)), ARM64_ALT_PAN_NOT_UAO, \ -	    CONFIG_ARM64_PAN) +	uaccess_disable_not_uao x2  	ret  ENDPROC(__clear_user) diff --git a/arch/arm64/lib/copy_from_user.S b/arch/arm64/lib/copy_from_user.S index 4fd67ea03bb0..cfe13396085b 100644 --- a/arch/arm64/lib/copy_from_user.S +++ b/arch/arm64/lib/copy_from_user.S @@ -16,11 +16,8 @@  #include <linux/linkage.h> -#include <asm/alternative.h> -#include <asm/assembler.h>  #include <asm/cache.h> -#include <asm/cpufeature.h> -#include <asm/sysreg.h> +#include <asm/uaccess.h>  /*   * Copy from user space to a kernel buffer (alignment handled by the hardware) @@ -67,12 +64,10 @@  end	.req	x5  ENTRY(__arch_copy_from_user) -ALTERNATIVE("nop", __stringify(SET_PSTATE_PAN(0)), ARM64_ALT_PAN_NOT_UAO, \ -	    CONFIG_ARM64_PAN) +	uaccess_enable_not_uao x3, x4  	add	end, x0, x2  #include "copy_template.S" -ALTERNATIVE("nop", __stringify(SET_PSTATE_PAN(1)), ARM64_ALT_PAN_NOT_UAO, \ -	    CONFIG_ARM64_PAN) +	uaccess_disable_not_uao x3  	mov	x0, #0				// Nothing to copy  	ret  ENDPROC(__arch_copy_from_user) diff --git a/arch/arm64/lib/copy_in_user.S b/arch/arm64/lib/copy_in_user.S index f7292dd08c84..718b1c4e2f85 100644 --- a/arch/arm64/lib/copy_in_user.S +++ b/arch/arm64/lib/copy_in_user.S @@ -18,11 +18,8 @@  #include <linux/linkage.h> -#include <asm/alternative.h> -#include <asm/assembler.h>  #include <asm/cache.h> -#include <asm/cpufeature.h> -#include <asm/sysreg.h> +#include <asm/uaccess.h>  /*   * Copy from user space to user space (alignment handled by the hardware) @@ -68,12 +65,10 @@  end	.req	x5  ENTRY(__copy_in_user) -ALTERNATIVE("nop", __stringify(SET_PSTATE_PAN(0)), ARM64_ALT_PAN_NOT_UAO, \ -	    CONFIG_ARM64_PAN) +	uaccess_enable_not_uao x3, x4  	add	end, x0, x2  #include "copy_template.S" -ALTERNATIVE("nop", __stringify(SET_PSTATE_PAN(1)), ARM64_ALT_PAN_NOT_UAO, \ -	    CONFIG_ARM64_PAN) +	uaccess_disable_not_uao x3  	mov	x0, #0  	ret  ENDPROC(__copy_in_user) diff --git a/arch/arm64/lib/copy_to_user.S b/arch/arm64/lib/copy_to_user.S index 7a7efe255034..e99e31c9acac 100644 --- a/arch/arm64/lib/copy_to_user.S +++ b/arch/arm64/lib/copy_to_user.S @@ -16,11 +16,8 @@  #include <linux/linkage.h> -#include <asm/alternative.h> -#include <asm/assembler.h>  #include <asm/cache.h> -#include <asm/cpufeature.h> -#include <asm/sysreg.h> +#include <asm/uaccess.h>  /*   * Copy to user space from a kernel buffer (alignment handled by the hardware) @@ -66,12 +63,10 @@  end	.req	x5  ENTRY(__arch_copy_to_user) -ALTERNATIVE("nop", __stringify(SET_PSTATE_PAN(0)), ARM64_ALT_PAN_NOT_UAO, \ -	    CONFIG_ARM64_PAN) +	uaccess_enable_not_uao x3, x4  	add	end, x0, x2  #include "copy_template.S" -ALTERNATIVE("nop", __stringify(SET_PSTATE_PAN(1)), ARM64_ALT_PAN_NOT_UAO, \ -	    CONFIG_ARM64_PAN) +	uaccess_disable_not_uao x3  	mov	x0, #0  	ret  ENDPROC(__arch_copy_to_user) |