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

strlen.S (1325B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
      4 */
      5
      6#include <linux/linkage.h>
      7
      8ENTRY_CFI(strlen)
      9	or	r3,r0,7
     10	ld	r2,[r3,-7]
     11	ld.a	r6,[r3,-3]
     12	mov	r4,0x01010101
     13	; uses long immediate
     14#ifdef __LITTLE_ENDIAN__
     15	asl_s	r1,r0,3
     16	btst_s	r0,2
     17	asl	r7,r4,r1
     18	ror	r5,r4
     19	sub	r1,r2,r7
     20	bic_s	r1,r1,r2
     21	mov.eq	r7,r4
     22	sub	r12,r6,r7
     23	bic	r12,r12,r6
     24	or.eq	r12,r12,r1
     25	and	r12,r12,r5
     26	brne	r12,0,.Learly_end
     27#else /* BIG ENDIAN */
     28	ror	r5,r4
     29	btst_s	r0,2
     30	mov_s	r1,31
     31	sub3	r7,r1,r0
     32	sub	r1,r2,r4
     33	bic_s	r1,r1,r2
     34	bmsk	r1,r1,r7
     35	sub	r12,r6,r4
     36	bic	r12,r12,r6
     37	bmsk.ne	r12,r12,r7
     38	or.eq	r12,r12,r1
     39	and	r12,r12,r5
     40	brne	r12,0,.Learly_end
     41#endif /* ENDIAN */
     42
     43.Loop:
     44	ld_s	r2,[r3,4]
     45	ld.a	r6,[r3,8]
     46	; stall for load result
     47	sub	r1,r2,r4
     48	bic_s	r1,r1,r2
     49	sub	r12,r6,r4
     50	bic	r12,r12,r6
     51	or	r12,r12,r1
     52	and	r12,r12,r5
     53	breq r12,0,.Loop
     54.Lend:
     55	and.f	r1,r1,r5
     56	sub.ne	r3,r3,4
     57	mov.eq	r1,r12
     58#ifdef __LITTLE_ENDIAN__
     59	sub_s	r2,r1,1
     60	bic_s	r2,r2,r1
     61	norm	r1,r2
     62	sub_s	r0,r0,3
     63	lsr_s	r1,r1,3
     64	sub	    r0,r3,r0
     65	j_s.d	[blink]
     66	sub	    r0,r0,r1
     67#else /* BIG ENDIAN */
     68	lsr_s	r1,r1,7
     69	mov.eq	r2,r6
     70	bic_s	r1,r1,r2
     71	norm	r1,r1
     72	sub	    r0,r3,r0
     73	lsr_s	r1,r1,3
     74	j_s.d	[blink]
     75	add	    r0,r0,r1
     76#endif /* ENDIAN */
     77.Learly_end:
     78	b.d	.Lend
     79	sub_s.ne r1,r1,r1
     80END_CFI(strlen)