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

memcmp.S (2507B)


      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
      8#ifdef __LITTLE_ENDIAN__
      9#define WORD2 r2
     10#define SHIFT r3
     11#else /* BIG ENDIAN */
     12#define WORD2 r3
     13#define SHIFT r2
     14#endif
     15
     16ENTRY_CFI(memcmp)
     17	or	r12,r0,r1
     18	asl_s	r12,r12,30
     19	sub	r3,r2,1
     20	brls	r2,r12,.Lbytewise
     21	ld	r4,[r0,0]
     22	ld	r5,[r1,0]
     23	lsr.f	lp_count,r3,3
     24#ifdef CONFIG_ISA_ARCV2
     25	/* In ARCv2 a branch can't be the last instruction in a zero overhead
     26	 * loop.
     27	 * So we move the branch to the start of the loop, duplicate it
     28	 * after the end, and set up r12 so that the branch isn't taken
     29	 *  initially.
     30	 */
     31	mov_s	r12,WORD2
     32	lpne	.Loop_end
     33	brne	WORD2,r12,.Lodd
     34	ld	WORD2,[r0,4]
     35#else
     36	lpne	.Loop_end
     37	ld_s	WORD2,[r0,4]
     38#endif
     39	ld_s	r12,[r1,4]
     40	brne	r4,r5,.Leven
     41	ld.a	r4,[r0,8]
     42	ld.a	r5,[r1,8]
     43#ifdef CONFIG_ISA_ARCV2
     44.Loop_end:
     45	brne	WORD2,r12,.Lodd
     46#else
     47	brne	WORD2,r12,.Lodd
     48.Loop_end:
     49#endif
     50	asl_s	SHIFT,SHIFT,3
     51	bhs_s	.Last_cmp
     52	brne	r4,r5,.Leven
     53	ld	r4,[r0,4]
     54	ld	r5,[r1,4]
     55#ifdef __LITTLE_ENDIAN__
     56	nop_s
     57	; one more load latency cycle
     58.Last_cmp:
     59	xor	r0,r4,r5
     60	bset	r0,r0,SHIFT
     61	sub_s	r1,r0,1
     62	bic_s	r1,r1,r0
     63	norm	r1,r1
     64	b.d	.Leven_cmp
     65	and	r1,r1,24
     66.Leven:
     67	xor	r0,r4,r5
     68	sub_s	r1,r0,1
     69	bic_s	r1,r1,r0
     70	norm	r1,r1
     71	; slow track insn
     72	and	r1,r1,24
     73.Leven_cmp:
     74	asl	r2,r4,r1
     75	asl	r12,r5,r1
     76	lsr_s	r2,r2,1
     77	lsr_s	r12,r12,1
     78	j_s.d	[blink]
     79	sub	r0,r2,r12
     80	.balign	4
     81.Lodd:
     82	xor	r0,WORD2,r12
     83	sub_s	r1,r0,1
     84	bic_s	r1,r1,r0
     85	norm	r1,r1
     86	; slow track insn
     87	and	r1,r1,24
     88	asl_s	r2,r2,r1
     89	asl_s	r12,r12,r1
     90	lsr_s	r2,r2,1
     91	lsr_s	r12,r12,1
     92	j_s.d	[blink]
     93	sub	r0,r2,r12
     94#else /* BIG ENDIAN */
     95.Last_cmp:
     96	neg_s	SHIFT,SHIFT
     97	lsr	r4,r4,SHIFT
     98	lsr	r5,r5,SHIFT
     99	; slow track insn
    100.Leven:
    101	sub.f	r0,r4,r5
    102	mov.ne	r0,1
    103	j_s.d	[blink]
    104	bset.cs	r0,r0,31
    105.Lodd:
    106	cmp_s	WORD2,r12
    107	mov_s	r0,1
    108	j_s.d	[blink]
    109	bset.cs	r0,r0,31
    110#endif /* ENDIAN */
    111	.balign	4
    112.Lbytewise:
    113	breq	r2,0,.Lnil
    114	ldb	r4,[r0,0]
    115	ldb	r5,[r1,0]
    116	lsr.f	lp_count,r3
    117#ifdef CONFIG_ISA_ARCV2
    118	mov	r12,r3
    119	lpne	.Lbyte_end
    120	brne	r3,r12,.Lbyte_odd
    121#else
    122	lpne	.Lbyte_end
    123#endif
    124	ldb_s	r3,[r0,1]
    125	ldb	r12,[r1,1]
    126	brne	r4,r5,.Lbyte_even
    127	ldb.a	r4,[r0,2]
    128	ldb.a	r5,[r1,2]
    129#ifdef CONFIG_ISA_ARCV2
    130.Lbyte_end:
    131	brne	r3,r12,.Lbyte_odd
    132#else
    133	brne	r3,r12,.Lbyte_odd
    134.Lbyte_end:
    135#endif
    136	bcc	.Lbyte_even
    137	brne	r4,r5,.Lbyte_even
    138	ldb_s	r3,[r0,1]
    139	ldb_s	r12,[r1,1]
    140.Lbyte_odd:
    141	j_s.d	[blink]
    142	sub	r0,r3,r12
    143.Lbyte_even:
    144	j_s.d	[blink]
    145	sub	r0,r4,r5
    146.Lnil:
    147	j_s.d	[blink]
    148	mov	r0,0
    149END_CFI(memcmp)