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 (2929B)


      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(memcmp)
      8	/* Test if len less than 4 bytes.  */
      9	mov	r3, r0
     10	movi	r0, 0
     11	mov	r12, r4
     12	cmplti	r2, 4
     13	bt	.L_compare_by_byte
     14
     15	andi	r13, r0, 3
     16	movi	r19, 4
     17
     18	/* Test if s1 is not 4 bytes aligned.  */
     19	bnez	r13, .L_s1_not_aligned
     20
     21	LABLE_ALIGN
     22.L_s1_aligned:
     23	/* If dest is aligned, then copy.  */
     24	zext	r18, r2, 31, 4
     25	/* Test if len less than 16 bytes.  */
     26	bez	r18, .L_compare_by_word
     27
     28.L_compare_by_4word:
     29	/* If aligned, load word each time.  */
     30	ldw	r20, (r3, 0)
     31	ldw	r21, (r1, 0)
     32	/* If s1[i] != s2[i], goto .L_byte_check.  */
     33	cmpne	r20, r21
     34	bt	.L_byte_check
     35
     36	ldw	r20, (r3, 4)
     37	ldw	r21, (r1, 4)
     38	cmpne	r20, r21
     39	bt	.L_byte_check
     40
     41	ldw	r20, (r3, 8)
     42	ldw	r21, (r1, 8)
     43	cmpne	r20, r21
     44	bt	.L_byte_check
     45
     46	ldw	r20, (r3, 12)
     47	ldw	r21, (r1, 12)
     48	cmpne	r20, r21
     49	bt	.L_byte_check
     50
     51	PRE_BNEZAD (r18)
     52	addi	a3, 16
     53	addi	a1, 16
     54
     55	BNEZAD (r18, .L_compare_by_4word)
     56
     57.L_compare_by_word:
     58	zext	r18, r2, 3, 2
     59	bez	r18, .L_compare_by_byte
     60.L_compare_by_word_loop:
     61	ldw	r20, (r3, 0)
     62	ldw	r21, (r1, 0)
     63	addi	r3, 4
     64	PRE_BNEZAD (r18)
     65	cmpne	r20, r21
     66	addi    r1, 4
     67	bt	.L_byte_check
     68	BNEZAD (r18, .L_compare_by_word_loop)
     69
     70.L_compare_by_byte:
     71        zext    r18, r2, 1, 0
     72        bez     r18, .L_return
     73.L_compare_by_byte_loop:
     74        ldb     r0, (r3, 0)
     75        ldb     r4, (r1, 0)
     76        addi    r3, 1
     77        subu    r0, r4
     78        PRE_BNEZAD (r18)
     79        addi    r1, 1
     80        bnez    r0, .L_return
     81        BNEZAD (r18, .L_compare_by_byte_loop)
     82
     83.L_return:
     84        mov     r4, r12
     85        rts
     86
     87# ifdef __CSKYBE__
     88/* d[i] != s[i] in word, so we check byte 0.  */
     89.L_byte_check:
     90        xtrb0   r0, r20
     91        xtrb0   r2, r21
     92        subu    r0, r2
     93        bnez    r0, .L_return
     94
     95        /* check byte 1 */
     96        xtrb1   r0, r20
     97        xtrb1   r2, r21
     98        subu    r0, r2
     99        bnez    r0, .L_return
    100
    101        /* check byte 2 */
    102        xtrb2   r0, r20
    103        xtrb2   r2, r21
    104        subu    r0, r2
    105        bnez    r0, .L_return
    106
    107        /* check byte 3 */
    108        xtrb3   r0, r20
    109        xtrb3   r2, r21
    110        subu    r0, r2
    111# else
    112/* s1[i] != s2[i] in word, so we check byte 3.  */
    113.L_byte_check:
    114	xtrb3	r0, r20
    115	xtrb3	r2, r21
    116        subu    r0, r2
    117        bnez    r0, .L_return
    118
    119	/* check byte 2 */
    120	xtrb2	r0, r20
    121	xtrb2	r2, r21
    122        subu    r0, r2
    123        bnez    r0, .L_return
    124
    125	/* check byte 1 */
    126	xtrb1	r0, r20
    127	xtrb1	r2, r21
    128	subu	r0, r2
    129	bnez    r0, .L_return
    130
    131	/* check byte 0 */
    132	xtrb0	r0, r20
    133	xtrb0	r2, r21
    134	subu	r0, r2
    135	br	.L_return
    136# endif /* !__CSKYBE__ */
    137
    138/* Compare when s1 is not aligned.  */
    139.L_s1_not_aligned:
    140	sub	r13, r19, r13
    141	sub	r2, r13
    142.L_s1_not_aligned_loop:
    143	ldb	r0, (r3, 0)
    144	ldb	r4, (r1, 0)
    145	addi	r3, 1
    146	subu	r0, r4
    147	PRE_BNEZAD (r13)
    148	addi	r1, 1
    149	bnez	r0, .L_return
    150	BNEZAD (r13, .L_s1_not_aligned_loop)
    151	br	.L_s1_aligned
    152ENDPROC(memcmp)