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
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)