Merge remote-tracking branches 'asoc/topic/nau8824', 'asoc/topic/nau8825' and 'asoc...
[linux-2.6-microblaze.git] / arch / m68k / lib / uaccess.c
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file COPYING in the main directory of this archive
4  * for more details.
5  */
6
7 #include <linux/module.h>
8 #include <linux/uaccess.h>
9
10 unsigned long __generic_copy_from_user(void *to, const void __user *from,
11                                        unsigned long n)
12 {
13         unsigned long tmp, res;
14
15         asm volatile ("\n"
16                 "       tst.l   %0\n"
17                 "       jeq     2f\n"
18                 "1:     "MOVES".l       (%1)+,%3\n"
19                 "       move.l  %3,(%2)+\n"
20                 "       subq.l  #1,%0\n"
21                 "       jne     1b\n"
22                 "2:     btst    #1,%5\n"
23                 "       jeq     4f\n"
24                 "3:     "MOVES".w       (%1)+,%3\n"
25                 "       move.w  %3,(%2)+\n"
26                 "4:     btst    #0,%5\n"
27                 "       jeq     6f\n"
28                 "5:     "MOVES".b       (%1)+,%3\n"
29                 "       move.b  %3,(%2)+\n"
30                 "6:\n"
31                 "       .section .fixup,\"ax\"\n"
32                 "       .even\n"
33                 "10:    lsl.l   #2,%0\n"
34                 "       btst    #1,%5\n"
35                 "       jeq     8f\n"
36                 "30:    addq.l  #2,%0\n"
37                 "8:     btst    #0,%5\n"
38                 "       jeq     6b\n"
39                 "50:    addq.l  #1,%0\n"
40                 "       jra     6b\n"
41                 "       .previous\n"
42                 "\n"
43                 "       .section __ex_table,\"a\"\n"
44                 "       .align  4\n"
45                 "       .long   1b,10b\n"
46                 "       .long   3b,30b\n"
47                 "       .long   5b,50b\n"
48                 "       .previous"
49                 : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp)
50                 : "0" (n / 4), "d" (n & 3));
51
52         return res;
53 }
54 EXPORT_SYMBOL(__generic_copy_from_user);
55
56 unsigned long __generic_copy_to_user(void __user *to, const void *from,
57                                      unsigned long n)
58 {
59         unsigned long tmp, res;
60
61         asm volatile ("\n"
62                 "       tst.l   %0\n"
63                 "       jeq     4f\n"
64                 "1:     move.l  (%1)+,%3\n"
65                 "2:     "MOVES".l       %3,(%2)+\n"
66                 "3:     subq.l  #1,%0\n"
67                 "       jne     1b\n"
68                 "4:     btst    #1,%5\n"
69                 "       jeq     6f\n"
70                 "       move.w  (%1)+,%3\n"
71                 "5:     "MOVES".w       %3,(%2)+\n"
72                 "6:     btst    #0,%5\n"
73                 "       jeq     8f\n"
74                 "       move.b  (%1)+,%3\n"
75                 "7:     "MOVES".b  %3,(%2)+\n"
76                 "8:\n"
77                 "       .section .fixup,\"ax\"\n"
78                 "       .even\n"
79                 "20:    lsl.l   #2,%0\n"
80                 "50:    add.l   %5,%0\n"
81                 "       jra     8b\n"
82                 "       .previous\n"
83                 "\n"
84                 "       .section __ex_table,\"a\"\n"
85                 "       .align  4\n"
86                 "       .long   2b,20b\n"
87                 "       .long   3b,20b\n"
88                 "       .long   5b,50b\n"
89                 "       .long   6b,50b\n"
90                 "       .long   7b,50b\n"
91                 "       .long   8b,50b\n"
92                 "       .previous"
93                 : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp)
94                 : "0" (n / 4), "d" (n & 3));
95
96         return res;
97 }
98 EXPORT_SYMBOL(__generic_copy_to_user);
99
100 /*
101  * Zero Userspace
102  */
103
104 unsigned long __clear_user(void __user *to, unsigned long n)
105 {
106         unsigned long res;
107
108         asm volatile ("\n"
109                 "       tst.l   %0\n"
110                 "       jeq     3f\n"
111                 "1:     "MOVES".l       %2,(%1)+\n"
112                 "2:     subq.l  #1,%0\n"
113                 "       jne     1b\n"
114                 "3:     btst    #1,%4\n"
115                 "       jeq     5f\n"
116                 "4:     "MOVES".w       %2,(%1)+\n"
117                 "5:     btst    #0,%4\n"
118                 "       jeq     7f\n"
119                 "6:     "MOVES".b       %2,(%1)\n"
120                 "7:\n"
121                 "       .section .fixup,\"ax\"\n"
122                 "       .even\n"
123                 "10:    lsl.l   #2,%0\n"
124                 "40:    add.l   %4,%0\n"
125                 "       jra     7b\n"
126                 "       .previous\n"
127                 "\n"
128                 "       .section __ex_table,\"a\"\n"
129                 "       .align  4\n"
130                 "       .long   1b,10b\n"
131                 "       .long   2b,10b\n"
132                 "       .long   4b,40b\n"
133                 "       .long   5b,40b\n"
134                 "       .long   6b,40b\n"
135                 "       .long   7b,40b\n"
136                 "       .previous"
137                 : "=d" (res), "+a" (to)
138                 : "d" (0), "0" (n / 4), "d" (n & 3));
139
140     return res;
141 }
142 EXPORT_SYMBOL(__clear_user);