Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2012 ARM Ltd.
0004  */
0005 
0006 #include <linux/linkage.h>
0007 
0008 #include <asm/asm-uaccess.h>
0009 #include <asm/assembler.h>
0010 #include <asm/cache.h>
0011 
0012 /*
0013  * Copy from user space to a kernel buffer (alignment handled by the hardware)
0014  *
0015  * Parameters:
0016  *  x0 - to
0017  *  x1 - from
0018  *  x2 - n
0019  * Returns:
0020  *  x0 - bytes not copied
0021  */
0022 
0023     .macro ldrb1 reg, ptr, val
0024     user_ldst 9998f, ldtrb, \reg, \ptr, \val
0025     .endm
0026 
0027     .macro strb1 reg, ptr, val
0028     strb \reg, [\ptr], \val
0029     .endm
0030 
0031     .macro ldrh1 reg, ptr, val
0032     user_ldst 9997f, ldtrh, \reg, \ptr, \val
0033     .endm
0034 
0035     .macro strh1 reg, ptr, val
0036     strh \reg, [\ptr], \val
0037     .endm
0038 
0039     .macro ldr1 reg, ptr, val
0040     user_ldst 9997f, ldtr, \reg, \ptr, \val
0041     .endm
0042 
0043     .macro str1 reg, ptr, val
0044     str \reg, [\ptr], \val
0045     .endm
0046 
0047     .macro ldp1 reg1, reg2, ptr, val
0048     user_ldp 9997f, \reg1, \reg2, \ptr, \val
0049     .endm
0050 
0051     .macro stp1 reg1, reg2, ptr, val
0052     stp \reg1, \reg2, [\ptr], \val
0053     .endm
0054 
0055 end .req    x5
0056 srcin   .req    x15
0057 SYM_FUNC_START(__arch_copy_from_user)
0058     add end, x0, x2
0059     mov srcin, x1
0060 #include "copy_template.S"
0061     mov x0, #0              // Nothing to copy
0062     ret
0063 
0064     // Exception fixups
0065 9997:   cmp dst, dstin
0066     b.ne    9998f
0067     // Before being absolutely sure we couldn't copy anything, try harder
0068 USER(9998f, ldtrb tmp1w, [srcin])
0069     strb    tmp1w, [dst], #1
0070 9998:   sub x0, end, dst            // bytes not copied
0071     ret
0072 SYM_FUNC_END(__arch_copy_from_user)
0073 EXPORT_SYMBOL(__arch_copy_from_user)