/* SPDX-License-Identifier: GPL-2.0-only */1/*2* User memory copy functions for kernel3*4* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.5*/67/*8* The right way to do this involves valignb9* The easy way to do this is only speed up src/dest similar alignment.10*/1112/*13* Copy to/from user are the same, except that for packets with a load and14* a store, I don't know how to tell which kind of exception we got.15* Therefore, we duplicate the function, and handle faulting addresses16* differently for each function17*/1819/*20* copy from user: loads can fault21*/22#define src_sav r1323#define dst_sav r1224#define src_dst_sav r13:1225#define d_dbuf r15:1426#define w_dbuf r152728#define dst r029#define src r130#define bytes r231#define loopcount r53233#define FUNCNAME raw_copy_from_user34#include "copy_user_template.S"3536/* LOAD FAULTS from COPY_FROM_USER */3738/* Alignment loop. r2 has been updated. Return it. */39.falign401009:412009:424009:43{44r0 = r245jumpr r3146}47/* Normal copy loops. Do epilog. Use src-src_sav to compute distance */48/* X - (A - B) == X + B - A */49.falign508089:51{52memd(dst) = d_dbuf53r2 += sub(src_sav,src)54}55{56r0 = r257jumpr r3158}59.falign604089:61{62memw(dst) = w_dbuf63r2 += sub(src_sav,src)64}65{66r0 = r267jumpr r3168}69.falign702089:71{72memh(dst) = w_dbuf73r2 += sub(src_sav,src)74}75{76r0 = r277jumpr r3178}79.falign801089:81{82memb(dst) = w_dbuf83r2 += sub(src_sav,src)84}85{86r0 = r287jumpr r3188}8990/* COPY FROM USER: only loads can fail */9192.section __ex_table,"a"93.long 1000b,1009b94.long 2000b,2009b95.long 4000b,4009b96.long 8080b,8089b97.long 4080b,4089b98.long 2080b,2089b99.long 1080b,1089b100.previous101102103