cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

copy_from_user.S (1407B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (C) 2012 ARM Ltd.
      4 */
      5
      6#include <linux/linkage.h>
      7
      8#include <asm/asm-uaccess.h>
      9#include <asm/assembler.h>
     10#include <asm/cache.h>
     11
     12/*
     13 * Copy from user space to a kernel buffer (alignment handled by the hardware)
     14 *
     15 * Parameters:
     16 *	x0 - to
     17 *	x1 - from
     18 *	x2 - n
     19 * Returns:
     20 *	x0 - bytes not copied
     21 */
     22
     23	.macro ldrb1 reg, ptr, val
     24	user_ldst 9998f, ldtrb, \reg, \ptr, \val
     25	.endm
     26
     27	.macro strb1 reg, ptr, val
     28	strb \reg, [\ptr], \val
     29	.endm
     30
     31	.macro ldrh1 reg, ptr, val
     32	user_ldst 9997f, ldtrh, \reg, \ptr, \val
     33	.endm
     34
     35	.macro strh1 reg, ptr, val
     36	strh \reg, [\ptr], \val
     37	.endm
     38
     39	.macro ldr1 reg, ptr, val
     40	user_ldst 9997f, ldtr, \reg, \ptr, \val
     41	.endm
     42
     43	.macro str1 reg, ptr, val
     44	str \reg, [\ptr], \val
     45	.endm
     46
     47	.macro ldp1 reg1, reg2, ptr, val
     48	user_ldp 9997f, \reg1, \reg2, \ptr, \val
     49	.endm
     50
     51	.macro stp1 reg1, reg2, ptr, val
     52	stp \reg1, \reg2, [\ptr], \val
     53	.endm
     54
     55end	.req	x5
     56srcin	.req	x15
     57SYM_FUNC_START(__arch_copy_from_user)
     58	add	end, x0, x2
     59	mov	srcin, x1
     60#include "copy_template.S"
     61	mov	x0, #0				// Nothing to copy
     62	ret
     63
     64	// Exception fixups
     659997:	cmp	dst, dstin
     66	b.ne	9998f
     67	// Before being absolutely sure we couldn't copy anything, try harder
     68USER(9998f, ldtrb tmp1w, [srcin])
     69	strb	tmp1w, [dst], #1
     709998:	sub	x0, end, dst			// bytes not copied
     71	ret
     72SYM_FUNC_END(__arch_copy_from_user)
     73EXPORT_SYMBOL(__arch_copy_from_user)