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

memscan_64.S (2491B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * memscan.S: Optimized memscan for Sparc64.
      4 *
      5 * Copyright (C) 1997,1998 Jakub Jelinek (jj@ultra.linux.cz)
      6 * Copyright (C) 1998 David S. Miller (davem@redhat.com)
      7 */
      8
      9	#include <asm/export.h>
     10
     11#define HI_MAGIC	0x8080808080808080
     12#define LO_MAGIC	0x0101010101010101
     13#define ASI_PL		0x88
     14
     15	.text
     16	.align	32
     17	.globl		__memscan_zero, __memscan_generic
     18	.type		__memscan_zero,#function
     19	.type		__memscan_generic,#function
     20	.globl		memscan
     21	EXPORT_SYMBOL(__memscan_zero)
     22	EXPORT_SYMBOL(__memscan_generic)
     23
     24__memscan_zero:
     25	/* %o0 = bufp, %o1 = size */
     26	brlez,pn	%o1, szzero
     27	 andcc		%o0, 7, %g0
     28	be,pt		%icc, we_are_aligned
     29	 sethi		%hi(HI_MAGIC), %o4
     30	ldub		[%o0], %o5
     311:	subcc		%o1, 1, %o1
     32	brz,pn		%o5, 10f
     33	 add		%o0, 1, %o0
     34
     35	be,pn		%xcc, szzero
     36	 andcc		%o0, 7, %g0
     37	bne,a,pn	%icc, 1b
     38	 ldub		[%o0], %o5
     39we_are_aligned:
     40	ldxa		[%o0] ASI_PL, %o5
     41	or		%o4, %lo(HI_MAGIC), %o3
     42	sllx		%o3, 32, %o4
     43	or		%o4, %o3, %o3
     44
     45	srlx		%o3, 7, %o2
     46msloop:
     47	sub		%o1, 8, %o1
     48	add		%o0, 8, %o0
     49	sub		%o5, %o2, %o4
     50	xor		%o4, %o5, %o4
     51	andcc		%o4, %o3, %g3
     52	bne,pn		%xcc, check_bytes
     53	 srlx		%o4, 32, %g3
     54
     55	brgz,a,pt	%o1, msloop
     56	 ldxa		[%o0] ASI_PL, %o5
     57check_bytes:
     58	bne,a,pn	%icc, 2f
     59	 andcc		%o5, 0xff, %g0
     60	add		%o0, -5, %g2
     61	ba,pt		%xcc, 3f
     62	 srlx		%o5, 32, %g7
     63
     642:	srlx		%o5, 8, %g7
     65	be,pn		%icc, 1f
     66	 add		%o0, -8, %g2
     67	andcc		%g7, 0xff, %g0
     68	srlx		%g7, 8, %g7
     69	be,pn		%icc, 1f
     70	 inc		%g2
     71	andcc		%g7, 0xff, %g0
     72
     73	srlx		%g7, 8, %g7
     74	be,pn		%icc, 1f
     75	 inc		%g2
     76	andcc		%g7, 0xff, %g0
     77	srlx		%g7, 8, %g7
     78	be,pn		%icc, 1f
     79	 inc		%g2
     80	andcc		%g3, %o3, %g0
     81
     82	be,a,pn		%icc, 2f
     83	 mov		%o0, %g2
     843:	andcc		%g7, 0xff, %g0
     85	srlx		%g7, 8, %g7
     86	be,pn		%icc, 1f
     87	 inc		%g2
     88	andcc		%g7, 0xff, %g0
     89	srlx		%g7, 8, %g7
     90
     91	be,pn		%icc, 1f
     92	 inc		%g2
     93	andcc		%g7, 0xff, %g0
     94	srlx		%g7, 8, %g7
     95	be,pn		%icc, 1f
     96	 inc		%g2
     97	andcc		%g7, 0xff, %g0
     98	srlx		%g7, 8, %g7
     99
    100	be,pn		%icc, 1f
    101	 inc		%g2
    1022:	brgz,a,pt	%o1, msloop
    103	 ldxa		[%o0] ASI_PL, %o5
    104	inc		%g2
    1051:	add		%o0, %o1, %o0
    106	cmp		%g2, %o0
    107	retl
    108
    109	 movle		%xcc, %g2, %o0
    11010:	retl
    111	 sub		%o0, 1, %o0
    112szzero:	retl
    113	 nop
    114
    115memscan:
    116__memscan_generic:
    117	/* %o0 = addr, %o1 = c, %o2 = size */
    118	brz,pn		%o2, 3f
    119	 add		%o0, %o2, %o3
    120	ldub		[%o0], %o5
    121	sub		%g0, %o2, %o4
    1221:
    123	cmp		%o5, %o1
    124	be,pn		%icc, 2f
    125	 addcc		%o4, 1, %o4
    126	bne,a,pt 	%xcc, 1b
    127	 ldub		[%o3 + %o4], %o5
    128	retl
    129	/* The delay slot is the same as the next insn, this is just to make it look more awful */
    1302:
    131	 add		%o3, %o4, %o0
    132	retl
    133	 sub		%o0, 1, %o0
    1343:
    135	retl
    136	 nop