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

strcmp-archs.S (1204B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
      4 */
      5
      6#include <linux/linkage.h>
      7
      8ENTRY_CFI(strcmp)
      9	or	r2, r0, r1
     10	bmsk_s	r2, r2, 1
     11	brne	r2, 0, @.Lcharloop
     12
     13;;; s1 and s2 are word aligned
     14	ld.ab	r2, [r0, 4]
     15
     16	mov_s	r12, 0x01010101
     17	ror	r11, r12
     18	.align  4
     19.LwordLoop:
     20	ld.ab	r3, [r1, 4]
     21	;; Detect NULL char in str1
     22	sub	r4, r2, r12
     23	ld.ab	r5, [r0, 4]
     24	bic	r4, r4, r2
     25	and	r4, r4, r11
     26	brne.d.nt	r4, 0, .LfoundNULL
     27	;; Check if the read locations are the same
     28	cmp	r2, r3
     29	beq.d	.LwordLoop
     30	mov.eq	r2, r5
     31
     32	;; A match is found, spot it out
     33#ifdef __LITTLE_ENDIAN__
     34	swape	r3, r3
     35	mov_s	r0, 1
     36	swape	r2, r2
     37#else
     38	mov_s	r0, 1
     39#endif
     40	cmp_s	r2, r3
     41	j_s.d	[blink]
     42	bset.lo	r0, r0, 31
     43
     44	.align 4
     45.LfoundNULL:
     46#ifdef __BIG_ENDIAN__
     47	swape	r4, r4
     48	swape	r2, r2
     49	swape	r3, r3
     50#endif
     51	;; Find null byte
     52	ffs	r0, r4
     53	bmsk	r2, r2, r0
     54	bmsk	r3, r3, r0
     55	swape	r2, r2
     56	swape	r3, r3
     57	;; make the return value
     58	sub.f	r0, r2, r3
     59	mov.hi	r0, 1
     60	j_s.d	[blink]
     61	bset.lo	r0, r0, 31
     62
     63	.align 4
     64.Lcharloop:
     65	ldb.ab	r2, [r0, 1]
     66	ldb.ab	r3, [r1, 1]
     67	nop
     68	breq	r2, 0, .Lcmpend
     69	breq	r2, r3, .Lcharloop
     70
     71	.align 4
     72.Lcmpend:
     73	j_s.d	[blink]
     74	sub	r0, r2, r3
     75END_CFI(strcmp)