/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright ( C ) 2012 ARM Ltd .
*/
#include <linux/linkage.h>
#include <asm/asm-uaccess.h>
#include <asm/assembler.h>
#include <asm/cache.h>
/*
* Copy to user space from a kernel buffer ( alignment handled by the hardware )
*
* Parameters :
* x0 - to
* x1 - from
* x2 - n
* Returns :
* x0 - bytes not copied
*/
.macro ldrb1 reg, ptr, val
ldrb \reg, [\ptr], \val
.endm
.macro strb1 reg, ptr, val
user_ldst 9998 f, sttrb, \reg, \ptr, \val
.endm
.macro ldrh1 reg, ptr, val
ldrh \reg, [\ptr], \val
.endm
.macro strh1 reg, ptr, val
user_ldst 9997 f, sttrh, \reg, \ptr, \val
.endm
.macro ldr1 reg, ptr, val
ldr \reg, [\ptr], \val
.endm
.macro str1 reg, ptr, val
user_ldst 9997 f, sttr, \reg, \ptr, \val
.endm
.macro ldp1 reg1, reg2, ptr, val
ldp \reg1, \reg2, [\ptr], \val
.endm
.macro stp1 reg1, reg2, ptr, val
user_stp 9997 f, \reg1, \reg2, \ptr, \val
.endm
.macro cpy1 dst, src, count
.arch_extension mops
USER_CPY(9997 f, 1 , cpyfpwt [\dst]!, [\src]!, \count!)
USER_CPY(9996 f, 1 , cpyfmwt [\dst]!, [\src]!, \count!)
USER_CPY(9996 f, 1 , cpyfewt [\dst]!, [\src]!, \count!)
.endm
end .req x5
srcin .req x15
SYM_FUNC_START(__arch_copy_to_user)
add end, x0, x2
mov srcin, x1
#include "copy_template.S"
mov x0, #0
ret
// Exception fixups
9996 : b.cs 9997 f
// Registers are in Option A format
add dst, dst, count
9997 : cmp dst, dstin
b.ne 9998 f
// Before being absolutely sure we couldn't copy anything, try harder
ldrb tmp1w, [srcin]
USER(9998 f, sttrb tmp1w, [dst])
add dst, dst, #1
9998 : sub x0, end, dst // bytes not copied
ret
SYM_FUNC_END(__arch_copy_to_user)
EXPORT_SYMBOL(__arch_copy_to_user)
Messung V0.5 in Prozent C=83 H=100 G=91
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-09-29)
¤
*© Formatika GbR, Deutschland