0001
0002
0003
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
0014
0015
0016
0017
0018
0019
0020
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)