Loading...
1/*
2 * User memory copying routines for the Hexagon Kernel
3 *
4 * Copyright (c) 2010-2011, The Linux Foundation. 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 raw_copy_to_user
47#include "copy_user_template.S"
48
49 /* STORE FAULTS from COPY_TO_USER */
50 .falign
511109:
522109:
534109:
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
638189:
648199:
654189:
664199:
672189:
682199:
691189:
701199:
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
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * User memory copying routines for the Hexagon Kernel
4 *
5 * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
6 */
7
8/* The right way to do this involves valignb
9 * The easy way to do this is only speed up src/dest similar alignment.
10 */
11
12/*
13 * Copy to/from user are the same, except that for packets with a load and
14 * a store, I don't know how to tell which kind of exception we got.
15 * Therefore, we duplicate the function, and handle faulting addresses
16 * differently for each function
17 */
18
19/*
20 * copy to user: stores can fault
21 */
22#define src_sav r13
23#define dst_sav r12
24#define src_dst_sav r13:12
25#define d_dbuf r15:14
26#define w_dbuf r15
27
28#define dst r0
29#define src r1
30#define bytes r2
31#define loopcount r5
32
33#define FUNCNAME raw_copy_to_user
34#include "copy_user_template.S"
35
36 /* STORE FAULTS from COPY_TO_USER */
37 .falign
381109:
392109:
404109:
41 /* Alignment loop. r2 has been updated. Return it. */
42 {
43 r0 = r2
44 jumpr r31
45 }
46 /* Normal copy loops. Use dst-dst_sav to compute distance */
47 /* dst holds best write, no need to unwind any loops */
48 /* X - (A - B) == X + B - A */
49 .falign
508189:
518199:
524189:
534199:
542189:
552199:
561189:
571199:
58 {
59 r2 += sub(dst_sav,dst)
60 }
61 {
62 r0 = r2
63 jumpr r31
64 }
65
66 /* COPY TO USER: only stores can fail */
67 .section __ex_table,"a"
68 .long 1100b,1109b
69 .long 2100b,2109b
70 .long 4100b,4109b
71 .long 8180b,8189b
72 .long 8190b,8199b
73 .long 4180b,4189b
74 .long 4190b,4199b
75 .long 2180b,2189b
76 .long 2190b,2199b
77 .long 1180b,1189b
78 .long 1190b,1199b
79 .previous