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

strncpy_user.S (1417B)


      1/*
      2 * This file is subject to the terms and conditions of the GNU General Public
      3 * License.  See the file "COPYING" in the main directory of this archive
      4 * for more details.
      5 *
      6 * Copyright (C) 1996, 1999 by Ralf Baechle
      7 * Copyright (C) 2011 MIPS Technologies, Inc.
      8 */
      9#include <linux/errno.h>
     10#include <asm/asm.h>
     11#include <asm/asm-offsets.h>
     12#include <asm/export.h>
     13#include <asm/regdef.h>
     14
     15#define EX(insn,reg,addr,handler)			\
     169:	insn	reg, addr;				\
     17	.section __ex_table,"a";			\
     18	PTR_WD	9b, handler;				\
     19	.previous
     20
     21/*
     22 * Returns: -EFAULT if exception before terminator, N if the entire
     23 * buffer filled, else strlen.
     24 */
     25
     26/*
     27 * Ugly special case have to check: we might get passed a user space
     28 * pointer which wraps into the kernel space.  We don't deal with that.	 If
     29 * it happens at most some bytes of the exceptions handlers will be copied.
     30 */
     31
     32LEAF(__strncpy_from_user_asm)
     33	move		t0, zero
     34	move		v1, a1
     35#ifdef CONFIG_EVA
     36	.set push
     37	.set eva
     381:	EX(lbue, v0, (v1), .Lfault)
     39	.set pop
     40#else
     411:	EX(lbu, v0, (v1), .Lfault)
     42#endif
     43	PTR_ADDIU	v1, 1
     44	R10KCBARRIER(0(ra))
     45	sb		v0, (a0)
     46	beqz		v0, 2f
     47	PTR_ADDIU	t0, 1
     48	PTR_ADDIU	a0, 1
     49	bne		t0, a2, 1b
     502:	PTR_ADDU	v0, a1, t0
     51	xor		v0, a1
     52	bltz		v0, .Lfault
     53	move		v0, t0
     54	jr		ra			# return n
     55	END(__strncpy_from_user_asm)
     56
     57.Lfault:
     58	li		v0, -EFAULT
     59	jr		ra
     60
     61	.section	__ex_table,"a"
     62	PTR_WD		1b, .Lfault
     63	.previous
     64
     65	EXPORT_SYMBOL(__strncpy_from_user_asm)