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_in_user.S (2068B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/* copy_in_user.S: Copy from userspace to userspace.
      3 *
      4 * Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com)
      5 */
      6
      7#include <linux/linkage.h>
      8#include <asm/asi.h>
      9#include <asm/export.h>
     10
     11#define XCC xcc
     12
     13#define EX(x,y,z)		\
     1498:	x,y;			\
     15	.section __ex_table,"a";\
     16	.align 4;		\
     17	.word 98b, z;		\
     18	.text;			\
     19	.align 4;
     20
     21#define EX_O4(x,y) EX(x,y,__retl_o4_plus_8)
     22#define EX_O2_4(x,y) EX(x,y,__retl_o2_plus_4)
     23#define EX_O2_1(x,y) EX(x,y,__retl_o2_plus_1)
     24
     25	.register	%g2,#scratch
     26	.register	%g3,#scratch
     27
     28	.text
     29__retl_o4_plus_8:
     30	add	%o4, %o2, %o4
     31	retl
     32	 add	%o4, 8, %o0
     33__retl_o2_plus_4:
     34	retl
     35	 add	%o2, 4, %o0
     36__retl_o2_plus_1:
     37	retl
     38	 add	%o2, 1, %o0
     39
     40	.align	32
     41
     42	/* Don't try to get too fancy here, just nice and
     43	 * simple.  This is predominantly used for well aligned
     44	 * small copies in the compat layer.  It is also used
     45	 * to copy register windows around during thread cloning.
     46	 */
     47
     48ENTRY(raw_copy_in_user)	/* %o0=dst, %o1=src, %o2=len */
     49	cmp		%o2, 0
     50	be,pn		%XCC, 85f
     51	 or		%o0, %o1, %o3
     52	cmp		%o2, 16
     53	bleu,a,pn	%XCC, 80f
     54	 or		%o3, %o2, %o3
     55
     56	/* 16 < len <= 64 */
     57	andcc		%o3, 0x7, %g0
     58	bne,pn		%XCC, 90f
     59	 nop
     60
     61	andn		%o2, 0x7, %o4
     62	and		%o2, 0x7, %o2
     631:	subcc		%o4, 0x8, %o4
     64	EX_O4(ldxa [%o1] %asi, %o5)
     65	EX_O4(stxa %o5, [%o0] %asi)
     66	add		%o1, 0x8, %o1
     67	bgu,pt		%XCC, 1b
     68	 add		%o0, 0x8, %o0
     69	andcc		%o2, 0x4, %g0
     70	be,pt		%XCC, 1f
     71	 nop
     72	sub		%o2, 0x4, %o2
     73	EX_O2_4(lduwa [%o1] %asi, %o5)
     74	EX_O2_4(stwa %o5, [%o0] %asi)
     75	add		%o1, 0x4, %o1
     76	add		%o0, 0x4, %o0
     771:	cmp		%o2, 0
     78	be,pt		%XCC, 85f
     79	 nop
     80	ba,pt		%xcc, 90f
     81	 nop
     82
     8380:	/* 0 < len <= 16 */
     84	andcc		%o3, 0x3, %g0
     85	bne,pn		%XCC, 90f
     86	 nop
     87
     8882:
     89	subcc		%o2, 4, %o2
     90	EX_O2_4(lduwa [%o1] %asi, %g1)
     91	EX_O2_4(stwa %g1, [%o0] %asi)
     92	add		%o1, 4, %o1
     93	bgu,pt		%XCC, 82b
     94	 add		%o0, 4, %o0
     95
     9685:	retl
     97	 clr		%o0
     98
     99	.align	32
    10090:
    101	subcc		%o2, 1, %o2
    102	EX_O2_1(lduba [%o1] %asi, %g1)
    103	EX_O2_1(stba %g1, [%o0] %asi)
    104	add		%o1, 1, %o1
    105	bgu,pt		%XCC, 90b
    106	 add		%o0, 1, %o0
    107	retl
    108	 clr		%o0
    109ENDPROC(raw_copy_in_user)
    110EXPORT_SYMBOL(raw_copy_in_user)