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

memchr.S (1411B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (C) 2021 Arm Ltd.
      4 */
      5
      6#include <linux/linkage.h>
      7#include <asm/assembler.h>
      8
      9/*
     10 * Find a character in an area of memory.
     11 *
     12 * Parameters:
     13 *	x0 - buf
     14 *	x1 - c
     15 *	x2 - n
     16 * Returns:
     17 *	x0 - address of first occurrence of 'c' or 0
     18 */
     19
     20#define L(label) .L ## label
     21
     22#define REP8_01 0x0101010101010101
     23#define REP8_7f 0x7f7f7f7f7f7f7f7f
     24
     25#define srcin		x0
     26#define chrin		w1
     27#define cntin		x2
     28
     29#define result		x0
     30
     31#define wordcnt		x3
     32#define rep01		x4
     33#define repchr		x5
     34#define cur_word	x6
     35#define cur_byte	w6
     36#define tmp		x7
     37#define tmp2		x8
     38
     39	.p2align 4
     40	nop
     41SYM_FUNC_START(__pi_memchr)
     42	and	chrin, chrin, #0xff
     43	lsr	wordcnt, cntin, #3
     44	cbz	wordcnt, L(byte_loop)
     45	mov	rep01, #REP8_01
     46	mul	repchr, x1, rep01
     47	and	cntin, cntin, #7
     48L(word_loop):
     49	ldr	cur_word, [srcin], #8
     50	sub	wordcnt, wordcnt, #1
     51	eor	cur_word, cur_word, repchr
     52	sub	tmp, cur_word, rep01
     53	orr	tmp2, cur_word, #REP8_7f
     54	bics	tmp, tmp, tmp2
     55	b.ne	L(found_word)
     56	cbnz	wordcnt, L(word_loop)
     57L(byte_loop):
     58	cbz	cntin, L(not_found)
     59	ldrb	cur_byte, [srcin], #1
     60	sub	cntin, cntin, #1
     61	cmp	cur_byte, chrin
     62	b.ne	L(byte_loop)
     63	sub	srcin, srcin, #1
     64	ret
     65L(found_word):
     66CPU_LE(	rev	tmp, tmp)
     67	clz	tmp, tmp
     68	sub	tmp, tmp, #64
     69	add	result, srcin, tmp, asr #3
     70	ret
     71L(not_found):
     72	mov	result, #0
     73	ret
     74SYM_FUNC_END(__pi_memchr)
     75SYM_FUNC_ALIAS_WEAK(memchr, __pi_memchr)
     76EXPORT_SYMBOL_NOKASAN(memchr)