1/* 2 * Copyright (C) 2012 ARM Ltd. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 */ 16 17#include <linux/linkage.h> 18 19#include <asm/cache.h> 20#include <asm/asm-uaccess.h> 21 22/* 23 * Copy to user space from a kernel buffer (alignment handled by the hardware) 24 * 25 * Parameters: 26 * x0 - to 27 * x1 - from 28 * x2 - n 29 * Returns: 30 * x0 - bytes not copied 31 */ 32 .macro ldrb1 ptr, regB, val 33 ldrb \ptr, [\regB], \val 34 .endm 35 36 .macro strb1 ptr, regB, val 37 uao_user_alternative 9998f, strb, sttrb, \ptr, \regB, \val 38 .endm 39 40 .macro ldrh1 ptr, regB, val 41 ldrh \ptr, [\regB], \val 42 .endm 43 44 .macro strh1 ptr, regB, val 45 uao_user_alternative 9998f, strh, sttrh, \ptr, \regB, \val 46 .endm 47 48 .macro ldr1 ptr, regB, val 49 ldr \ptr, [\regB], \val 50 .endm 51 52 .macro str1 ptr, regB, val 53 uao_user_alternative 9998f, str, sttr, \ptr, \regB, \val 54 .endm 55 56 .macro ldp1 ptr, regB, regC, val 57 ldp \ptr, \regB, [\regC], \val 58 .endm 59 60 .macro stp1 ptr, regB, regC, val 61 uao_stp 9998f, \ptr, \regB, \regC, \val 62 .endm 63 64end .req x5 65ENTRY(__arch_copy_to_user) 66 uaccess_enable_not_uao x3, x4 67 add end, x0, x2 68#include "copy_template.S" 69 uaccess_disable_not_uao x3, x4 70 mov x0, #0 71 ret 72ENDPROC(__arch_copy_to_user) 73 74 .section .fixup,"ax" 75 .align 2 769998: sub x0, end, dst // bytes not copied 77 ret 78 .previous 79