1/* 2 * Copy from user space to user space 3 * 4 * Copyright (C) 2012 ARM Ltd. 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 as 8 * 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, see <http://www.gnu.org/licenses/>. 17 */ 18 19#include <linux/linkage.h> 20 21#include <asm/cache.h> 22#include <asm/asm-uaccess.h> 23 24/* 25 * Copy from user space to user space (alignment handled by the hardware) 26 * 27 * Parameters: 28 * x0 - to 29 * x1 - from 30 * x2 - n 31 * Returns: 32 * x0 - bytes not copied 33 */ 34 .macro ldrb1 ptr, regB, val 35 uao_user_alternative 9998f, ldrb, ldtrb, \ptr, \regB, \val 36 .endm 37 38 .macro strb1 ptr, regB, val 39 uao_user_alternative 9998f, strb, sttrb, \ptr, \regB, \val 40 .endm 41 42 .macro ldrh1 ptr, regB, val 43 uao_user_alternative 9998f, ldrh, ldtrh, \ptr, \regB, \val 44 .endm 45 46 .macro strh1 ptr, regB, val 47 uao_user_alternative 9998f, strh, sttrh, \ptr, \regB, \val 48 .endm 49 50 .macro ldr1 ptr, regB, val 51 uao_user_alternative 9998f, ldr, ldtr, \ptr, \regB, \val 52 .endm 53 54 .macro str1 ptr, regB, val 55 uao_user_alternative 9998f, str, sttr, \ptr, \regB, \val 56 .endm 57 58 .macro ldp1 ptr, regB, regC, val 59 uao_ldp 9998f, \ptr, \regB, \regC, \val 60 .endm 61 62 .macro stp1 ptr, regB, regC, val 63 uao_stp 9998f, \ptr, \regB, \regC, \val 64 .endm 65 66end .req x5 67 68ENTRY(__arch_copy_in_user) 69 uaccess_enable_not_uao x3, x4, x5 70 add end, x0, x2 71#include "copy_template.S" 72 uaccess_disable_not_uao x3, x4 73 mov x0, #0 74 ret 75ENDPROC(__arch_copy_in_user) 76 77 .section .fixup,"ax" 78 .align 2 799998: sub x0, end, dst // bytes not copied 80 uaccess_disable_not_uao x3, x4 81 ret 82 .previous 83