diff options
Diffstat (limited to 'arch/hexagon/mm/copy_to_user.S')
-rw-r--r-- | arch/hexagon/mm/copy_to_user.S | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/arch/hexagon/mm/copy_to_user.S b/arch/hexagon/mm/copy_to_user.S new file mode 100644 index 000000000000..cb9740ed9e7d --- /dev/null +++ b/arch/hexagon/mm/copy_to_user.S | |||
@@ -0,0 +1,92 @@ | |||
1 | /* | ||
2 | * User memory copying routines for the Hexagon Kernel | ||
3 | * | ||
4 | * Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 and | ||
8 | * only version 2 as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
18 | * 02110-1301, USA. | ||
19 | */ | ||
20 | |||
21 | /* The right way to do this involves valignb | ||
22 | * The easy way to do this is only speed up src/dest similar alignment. | ||
23 | */ | ||
24 | |||
25 | /* | ||
26 | * Copy to/from user are the same, except that for packets with a load and | ||
27 | * a store, I don't know how to tell which kind of exception we got. | ||
28 | * Therefore, we duplicate the function, and handle faulting addresses | ||
29 | * differently for each function | ||
30 | */ | ||
31 | |||
32 | /* | ||
33 | * copy to user: stores can fault | ||
34 | */ | ||
35 | #define src_sav r13 | ||
36 | #define dst_sav r12 | ||
37 | #define src_dst_sav r13:12 | ||
38 | #define d_dbuf r15:14 | ||
39 | #define w_dbuf r15 | ||
40 | |||
41 | #define dst r0 | ||
42 | #define src r1 | ||
43 | #define bytes r2 | ||
44 | #define loopcount r5 | ||
45 | |||
46 | #define FUNCNAME __copy_to_user_hexagon | ||
47 | #include "copy_user_template.S" | ||
48 | |||
49 | /* STORE FAULTS from COPY_TO_USER */ | ||
50 | .falign | ||
51 | 1109: | ||
52 | 2109: | ||
53 | 4109: | ||
54 | /* Alignment loop. r2 has been updated. Return it. */ | ||
55 | { | ||
56 | r0 = r2 | ||
57 | jumpr r31 | ||
58 | } | ||
59 | /* Normal copy loops. Use dst-dst_sav to compute distance */ | ||
60 | /* dst holds best write, no need to unwind any loops */ | ||
61 | /* X - (A - B) == X + B - A */ | ||
62 | .falign | ||
63 | 8189: | ||
64 | 8199: | ||
65 | 4189: | ||
66 | 4199: | ||
67 | 2189: | ||
68 | 2199: | ||
69 | 1189: | ||
70 | 1199: | ||
71 | { | ||
72 | r2 += sub(dst_sav,dst) | ||
73 | } | ||
74 | { | ||
75 | r0 = r2 | ||
76 | jumpr r31 | ||
77 | } | ||
78 | |||
79 | /* COPY TO USER: only stores can fail */ | ||
80 | .section __ex_table,"a" | ||
81 | .long 1100b,1109b | ||
82 | .long 2100b,2109b | ||
83 | .long 4100b,4109b | ||
84 | .long 8180b,8189b | ||
85 | .long 8190b,8199b | ||
86 | .long 4180b,4189b | ||
87 | .long 4190b,4199b | ||
88 | .long 2180b,2189b | ||
89 | .long 2190b,2199b | ||
90 | .long 1180b,1189b | ||
91 | .long 1190b,1199b | ||
92 | .previous | ||