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 93