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/asm-uaccess.h> 20#include <asm/assembler.h> 21#include <asm/cache.h> 22 23/* 24 * Copy to user space from a kernel buffer (alignment handled by the hardware) 25 * 26 * Parameters: 27 * x0 - to 28 * x1 - from 29 * x2 - n 30 * Returns: 31 * x0 - bytes not copied 32 */ 33 .macro ldrb1 ptr, regB, val 34 ldrb \ptr, [\regB], \val 35 .endm 36 37 .macro strb1 ptr, regB, val 38 uao_user_alternative 9998f, strb, sttrb, \ptr, \regB, \val 39 .endm 40 41 .macro ldrh1 ptr, regB, val 42 ldrh \ptr, [\regB], \val 43 .endm 44 45 .macro strh1 ptr, regB, val 46 uao_user_alternative 9998f, strh, sttrh, \ptr, \regB, \val 47 .endm 48 49 .macro ldr1 ptr, regB, val 50 ldr \ptr, [\regB], \val 51 .endm 52 53 .macro str1 ptr, regB, val 54 uao_user_alternative 9998f, str, sttr, \ptr, \regB, \val 55 .endm 56 57 .macro ldp1 ptr, regB, regC, val 58 ldp \ptr, \regB, [\regC], \val 59 .endm 60 61 .macro stp1 ptr, regB, regC, val 62 uao_stp 9998f, \ptr, \regB, \regC, \val 63 .endm 64 65end .req x5 66ENTRY(__arch_copy_to_user) 67 uaccess_enable_not_uao x3, x4, x5 68 add end, x0, x2 69#include "copy_template.S" 70 uaccess_disable_not_uao x3, x4 71 mov x0, #0 72 ret 73ENDPROC(__arch_copy_to_user) 74EXPORT_SYMBOL(__arch_copy_to_user) 75 76 .section .fixup,"ax" 77 .align 2 789998: sub x0, end, dst // bytes not copied 79 ret 80 .previous 81