aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/lib')
-rw-r--r--arch/arm/lib/copy_from_user.S9
-rw-r--r--arch/arm/lib/copy_template.S46
-rw-r--r--arch/arm/lib/copy_to_user.S9
-rw-r--r--arch/arm/lib/getuser.S23
-rw-r--r--arch/arm/lib/memcpy.S9
-rw-r--r--arch/arm/lib/putuser.S6
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]