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


      1/* SPDX-License-Identifier: GPL-2.0 */
      2// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
      3
      4#include <linux/linkage.h>
      5#include "sysdep.h"
      6
      7ENTRY(strcmp)
      8	mov	a3, a0
      9	/* Check if the s1 addr is aligned.  */
     10	xor	a2, a3, a1
     11	andi	a2, 0x3
     12	bnez	a2, 7f
     13	andi	t1, a0, 0x3
     14	bnez	t1, 5f
     15
     161:
     17	/* If aligned, load word each time.  */
     18	ldw	t0, (a3, 0)
     19	ldw	t1, (a1, 0)
     20	/* If s1[i] != s2[i], goto 2f.  */
     21	cmpne   t0, t1
     22	bt      2f
     23	/* If s1[i] == s2[i], check if s1 or s2 is at the end.  */
     24	tstnbz	t0
     25	/* If at the end, goto 3f (finish comparing).  */
     26	bf	3f
     27
     28	ldw	t0, (a3, 4)
     29	ldw	t1, (a1, 4)
     30	cmpne	t0, t1
     31	bt	2f
     32	tstnbz	t0
     33	bf	3f
     34
     35	ldw	t0, (a3, 8)
     36	ldw	t1, (a1, 8)
     37	cmpne	t0, t1
     38	bt	2f
     39	tstnbz	t0
     40	bf	3f
     41
     42	ldw	t0, (a3, 12)
     43	ldw	t1, (a1, 12)
     44	cmpne	t0, t1
     45	bt	2f
     46	tstnbz	t0
     47	bf	3f
     48
     49	ldw	t0, (a3, 16)
     50	ldw	t1, (a1, 16)
     51	cmpne	t0, t1
     52	bt	2f
     53	tstnbz	t0
     54	bf	3f
     55
     56	ldw	t0, (a3, 20)
     57	ldw	t1, (a1, 20)
     58	cmpne	t0, t1
     59	bt	2f
     60	tstnbz	t0
     61	bf	3f
     62
     63	ldw	t0, (a3, 24)
     64	ldw	t1, (a1, 24)
     65	cmpne	t0, t1
     66	bt	2f
     67	tstnbz	t0
     68	bf	3f
     69
     70	ldw	t0, (a3, 28)
     71	ldw	t1, (a1, 28)
     72	cmpne	t0, t1
     73	bt	2f
     74	tstnbz	t0
     75	bf	3f
     76
     77	addi	a3, 32
     78	addi	a1, 32
     79
     80	br	1b
     81
     82# ifdef __CSKYBE__
     83	/* d[i] != s[i] in word, so we check byte 0.  */
     842:
     85	xtrb0   a0, t0
     86	xtrb0   a2, t1
     87	subu    a0, a2
     88	bez     a2, 4f
     89	bnez    a0, 4f
     90
     91	/* check byte 1 */
     92	xtrb1   a0, t0
     93	xtrb1   a2, t1
     94	subu    a0, a2
     95	bez     a2, 4f
     96	bnez    a0, 4f
     97
     98	/* check byte 2 */
     99	xtrb2   a0, t0
    100	xtrb2   a2, t1
    101	subu    a0, a2
    102	bez     a2, 4f
    103	bnez    a0, 4f
    104
    105	/* check byte 3 */
    106	xtrb3   a0, t0
    107	xtrb3   a2, t1
    108	subu    a0, a2
    109# else
    110	/* s1[i] != s2[i] in word, so we check byte 3.  */
    1112:
    112	xtrb3	a0, t0
    113	xtrb3	a2, t1
    114	subu    a0, a2
    115	bez     a2, 4f
    116	bnez    a0, 4f
    117
    118	/* check byte 2 */
    119	xtrb2	a0, t0
    120	xtrb2	a2, t1
    121	subu    a0, a2
    122	bez     a2, 4f
    123	bnez    a0, 4f
    124
    125	/* check byte 1 */
    126	xtrb1	a0, t0
    127	xtrb1	a2, t1
    128	subu	a0, a2
    129	bez	a2, 4f
    130	bnez    a0, 4f
    131
    132	/* check byte 0 */
    133	xtrb0	a0, t0
    134	xtrb0	a2, t1
    135	subu	a0, a2
    136
    137# endif /* !__CSKYBE__ */
    138	jmp     lr
    1393:
    140	movi	a0, 0
    1414:
    142	jmp     lr
    143
    144	/* Compare when s1 or s2 is not aligned.  */
    1455:
    146	subi    t1, 4
    1476:
    148	ldb	a0, (a3, 0)
    149	ldb	a2, (a1, 0)
    150	subu	a0, a2
    151	bez	a2, 4b
    152	bnez	a0, 4b
    153	addi    t1, 1
    154	addi	a1, 1
    155	addi	a3, 1
    156	bnez	t1, 6b
    157	br	1b
    158
    1597:
    160	ldb	a0, (a3, 0)
    161	addi	a3, 1
    162	ldb	a2, (a1, 0)
    163	addi	a1, 1
    164	subu    a0, a2
    165	bnez    a0, 4b
    166	bnez	a2, 7b
    167	jmp	r15
    168ENDPROC(strcmp)