diff options
Diffstat (limited to 'arch/arm/lib')
-rw-r--r-- | arch/arm/lib/copy_from_user.S | 9 | ||||
-rw-r--r-- | arch/arm/lib/copy_template.S | 46 | ||||
-rw-r--r-- | arch/arm/lib/copy_to_user.S | 9 | ||||
-rw-r--r-- | arch/arm/lib/getuser.S | 23 | ||||
-rw-r--r-- | arch/arm/lib/memcpy.S | 9 | ||||
-rw-r--r-- | arch/arm/lib/putuser.S | 6 |
6 files changed, 30 insertions, 72 deletions
diff --git a/arch/arm/lib/copy_from_user.S b/arch/arm/lib/copy_from_user.S index 54daeae..66a477a 100644 --- a/arch/arm/lib/copy_from_user.S +++ b/arch/arm/lib/copy_from_user.S @@ -68,15 +68,6 @@ stmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8} .endm - .macro cpy8w dst src reg1 reg2 abort - .irp offset, #0, #8, #16, #24 - ldr1w \src, \reg1, \abort - ldr1w \src, \reg2, \abort - strd \reg1, \reg2, [\dst, \offset] - .endr - add \dst, \dst, #32 - .endm - .macro str1b ptr reg cond=al abort str\cond\()b \reg, [\ptr], #1 .endm diff --git a/arch/arm/lib/copy_template.S b/arch/arm/lib/copy_template.S index f2b5885..805e3f8 100644 --- a/arch/arm/lib/copy_template.S +++ b/arch/arm/lib/copy_template.S @@ -66,7 +66,6 @@ * than one 32bit instruction in Thumb-2) */ -#define PLDSIZE (CONFIG_ARM_PLD_SIZE) enter r4, lr @@ -91,46 +90,19 @@ CALGN( add pc, r4, ip ) PLD( pld [r1, #0] ) - -#if (PLDSIZE == 64) -2: PLD( cmp r2, #32) - PLD( blt .32copy) - -.64copy: - PLD( subs r2, r2, #(PLDSIZE*3+32) ) - PLD( pld [r1, #PLDSIZE-4] ) - PLD( blt 4f ) - PLD( pld [r1, #PLDSIZE*2-4] ) - PLD( pld [r1, #PLDSIZE*3-4] ) -3: PLD( pld [r1, #PLDSIZE*4-4] ) -4: cpy8w r0, r1, r4, r5, abort=20f - cpy8w r0, r1, r4, r5, abort=20f - subs r2, r2, #PLDSIZE - bge 3b - PLD( cmn r2, #(PLDSIZE*3) ) - PLD( bge 4b ) - - PLD( cmn r2, #(PLDSIZE*4-32) ) - PLD( blt 5f) - -.32copy: - cpy8w r0, r1, r4, r5, abort=20f -#else -2: PLD( subs r2, r2, #(PLDSIZE*3) ) - PLD( pld [r1, #(PLDSIZE-4)] ) +2: PLD( subs r2, r2, #96 ) + PLD( pld [r1, #28] ) PLD( blt 4f ) - PLD( pld [r1, #(PLDSIZE*2-4)] ) - PLD( pld [r1, #(PLDSIZE*3-4)] ) - -3: PLD( pld [r1, #(PLDSIZE*4-4)] ) -4: ldr8w r1, r3, r4, r5, r6, r7, r8, ip, lr, abort=20f - subs r2, r2, #PLDSIZE - str8w r0, r3, r4, r5, r6, r7, r8, ip, lr, abort=20f + PLD( pld [r1, #60] ) + PLD( pld [r1, #92] ) +3: PLD( pld [r1, #124] ) +4: ldr8w r1, r3, r4, r5, r6, r7, r8, ip, lr, abort=20f + subs r2, r2, #32 + str8w r0, r3, r4, r5, r6, r7, r8, ip, lr, abort=20f bge 3b - PLD( cmn r2, #(PLDSIZE*3) ) + PLD( cmn r2, #96 ) PLD( bge 4b ) -#endif 5: ands ip, r2, #28 rsb ip, ip, #32 diff --git a/arch/arm/lib/copy_to_user.S b/arch/arm/lib/copy_to_user.S index e32788b..d066df6 100644 --- a/arch/arm/lib/copy_to_user.S +++ b/arch/arm/lib/copy_to_user.S @@ -71,15 +71,6 @@ str1w \ptr, \reg8, \abort .endm - .macro cpy8w dst src reg1 reg2 abort - .irp offset, #0, #8, #16, #24 - ldrd \reg1, \reg2, [\src, \offset] - str1w \dst, \reg1, \abort - str1w \dst, \reg2, \abort - .endr - add \src, \src, #32 - .endm - .macro str1b ptr reg cond=al abort strusr \reg, \ptr, 1, \cond, abort=\abort .endm diff --git a/arch/arm/lib/getuser.S b/arch/arm/lib/getuser.S index 1b049cd..4306fbf 100644 --- a/arch/arm/lib/getuser.S +++ b/arch/arm/lib/getuser.S @@ -16,8 +16,9 @@ * __get_user_X * * Inputs: r0 contains the address + * r1 contains the address limit, which must be preserved * Outputs: r0 is the error code - * r2, r3 contains the zero-extended value + * r2 contains the zero-extended value * lr corrupted * * No other registers must be altered. (see <asm/uaccess.h> @@ -27,33 +28,39 @@ * Note also that it is intended that __get_user_bad is not global. */ #include <linux/linkage.h> +#include <asm/assembler.h> #include <asm/errno.h> #include <asm/domain.h> ENTRY(__get_user_1) + check_uaccess r0, 1, r1, r2, __get_user_bad 1: T(ldrb) r2, [r0] mov r0, #0 mov pc, lr ENDPROC(__get_user_1) ENTRY(__get_user_2) -#ifdef CONFIG_THUMB2_KERNEL -2: T(ldrb) r2, [r0] -3: T(ldrb) r3, [r0, #1] + check_uaccess r0, 2, r1, r2, __get_user_bad +#ifdef CONFIG_CPU_USE_DOMAINS +rb .req ip +2: ldrbt r2, [r0], #1 +3: ldrbt rb, [r0], #0 #else -2: T(ldrb) r2, [r0], #1 -3: T(ldrb) r3, [r0] +rb .req r0 +2: ldrb r2, [r0] +3: ldrb rb, [r0, #1] #endif #ifndef __ARMEB__ - orr r2, r2, r3, lsl #8 + orr r2, r2, rb, lsl #8 #else - orr r2, r3, r2, lsl #8 + orr r2, rb, r2, lsl #8 #endif mov r0, #0 mov pc, lr ENDPROC(__get_user_2) ENTRY(__get_user_4) + check_uaccess r0, 4, r1, r2, __get_user_bad 4: T(ldr) r2, [r0] mov r0, #0 mov pc, lr diff --git a/arch/arm/lib/memcpy.S b/arch/arm/lib/memcpy.S index 7ffda59..a9b9e22 100644 --- a/arch/arm/lib/memcpy.S +++ b/arch/arm/lib/memcpy.S @@ -40,15 +40,6 @@ stmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8} .endm - .macro cpy8w dst src reg1 reg2 abort - .irp offset, #0, #8, #16, #24 - ldrd \reg1, \reg2, [\src, \offset] - strd \reg1, \reg2, [\dst, \offset] - .endr - add \src, \src, #32 - add \dst, \dst, #32 - .endm - .macro str1b ptr reg cond=al abort str\cond\()b \reg, [\ptr], #1 .endm diff --git a/arch/arm/lib/putuser.S b/arch/arm/lib/putuser.S index c023fc1..9a897fa 100644 --- a/arch/arm/lib/putuser.S +++ b/arch/arm/lib/putuser.S @@ -16,6 +16,7 @@ * __put_user_X * * Inputs: r0 contains the address + * r1 contains the address limit, which must be preserved * r2, r3 contains the value * Outputs: r0 is the error code * lr corrupted @@ -27,16 +28,19 @@ * Note also that it is intended that __put_user_bad is not global. */ #include <linux/linkage.h> +#include <asm/assembler.h> #include <asm/errno.h> #include <asm/domain.h> ENTRY(__put_user_1) + check_uaccess r0, 1, r1, ip, __put_user_bad 1: T(strb) r2, [r0] mov r0, #0 mov pc, lr ENDPROC(__put_user_1) ENTRY(__put_user_2) + check_uaccess r0, 2, r1, ip, __put_user_bad mov ip, r2, lsr #8 #ifdef CONFIG_THUMB2_KERNEL #ifndef __ARMEB__ @@ -60,12 +64,14 @@ ENTRY(__put_user_2) ENDPROC(__put_user_2) ENTRY(__put_user_4) + check_uaccess r0, 4, r1, ip, __put_user_bad 4: T(str) r2, [r0] mov r0, #0 mov pc, lr ENDPROC(__put_user_4) ENTRY(__put_user_8) + check_uaccess r0, 8, r1, ip, __put_user_bad #ifdef CONFIG_THUMB2_KERNEL 5: T(str) r2, [r0] 6: T(str) r3, [r0, #4] |