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 to user space from 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     .macro ldrb1 reg, ptr, val
0023     ldrb  \reg, [\ptr], \val
0024     .endm
0025 
0026     .macro strb1 reg, ptr, val
0027     user_ldst 9998f, sttrb, \reg, \ptr, \val
0028     .endm
0029 
0030     .macro ldrh1 reg, ptr, val
0031     ldrh  \reg, [\ptr], \val
0032     .endm
0033 
0034     .macro strh1 reg, ptr, val
0035     user_ldst 9997f, sttrh, \reg, \ptr, \val
0036     .endm
0037 
0038     .macro ldr1 reg, ptr, val
0039     ldr \reg, [\ptr], \val
0040     .endm
0041 
0042     .macro str1 reg, ptr, val
0043     user_ldst 9997f, sttr, \reg, \ptr, \val
0044     .endm
0045 
0046     .macro ldp1 reg1, reg2, ptr, val
0047     ldp \reg1, \reg2, [\ptr], \val
0048     .endm
0049 
0050     .macro stp1 reg1, reg2, ptr, val
0051     user_stp 9997f, \reg1, \reg2, \ptr, \val
0052     .endm
0053 
0054 end .req    x5
0055 srcin   .req    x15
0056 SYM_FUNC_START(__arch_copy_to_user)
0057     add end, x0, x2
0058     mov srcin, x1
0059 #include "copy_template.S"
0060     mov x0, #0
0061     ret
0062 
0063     // Exception fixups
0064 9997:   cmp dst, dstin
0065     b.ne    9998f
0066     // Before being absolutely sure we couldn't copy anything, try harder
0067     ldrb    tmp1w, [srcin]
0068 USER(9998f, sttrb tmp1w, [dst])
0069     add dst, dst, #1
0070 9998:   sub x0, end, dst            // bytes not copied
0071     ret
0072 SYM_FUNC_END(__arch_copy_to_user)
0073 EXPORT_SYMBOL(__arch_copy_to_user)