1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #include <linux/linkage.h>
28 #include <asm/assembler.h>
29 #include <asm/errno.h>
30 #include <asm/domain.h>
31
32 ENTRY(__put_user_1)
33 check_uaccess r0, 1, r1, ip, __put_user_bad
34 1: TUSER(strb) r2, [r0]
35 mov r0, #0
36 ret lr
37 ENDPROC(__put_user_1)
38
39 ENTRY(__put_user_2)
40 check_uaccess r0, 2, r1, ip, __put_user_bad
41 #if __LINUX_ARM_ARCH__ >= 6
42
43 2: TUSER(strh) r2, [r0]
44
45 #else
46
47 mov ip, r2, lsr #8
48 #ifndef __ARMEB__
49 2: TUSER(strb) r2, [r0], #1
50 3: TUSER(strb) ip, [r0]
51 #else
52 2: TUSER(strb) ip, [r0], #1
53 3: TUSER(strb) r2, [r0]
54 #endif
55
56 #endif
57 mov r0, #0
58 ret lr
59 ENDPROC(__put_user_2)
60
61 ENTRY(__put_user_4)
62 check_uaccess r0, 4, r1, ip, __put_user_bad
63 4: TUSER(str) r2, [r0]
64 mov r0, #0
65 ret lr
66 ENDPROC(__put_user_4)
67
68 ENTRY(__put_user_8)
69 check_uaccess r0, 8, r1, ip, __put_user_bad
70 #ifdef CONFIG_THUMB2_KERNEL
71 5: TUSER(str) r2, [r0]
72 6: TUSER(str) r3, [r0, #4]
73 #else
74 5: TUSER(str) r2, [r0], #4
75 6: TUSER(str) r3, [r0]
76 #endif
77 mov r0, #0
78 ret lr
79 ENDPROC(__put_user_8)
80
81 __put_user_bad:
82 mov r0, #-EFAULT
83 ret lr
84 ENDPROC(__put_user_bad)
85
86 .pushsection __ex_table, "a"
87 .long 1b, __put_user_bad
88 .long 2b, __put_user_bad
89 #if __LINUX_ARM_ARCH__ < 6
90 .long 3b, __put_user_bad
91 #endif
92 .long 4b, __put_user_bad
93 .long 5b, __put_user_bad
94 .long 6b, __put_user_bad
95 .popsection