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

string.h (3385B)


      1/*
      2 * include/asm-xtensa/string.h
      3 *
      4 * These trivial string functions are considered part of the public domain.
      5 *
      6 * This file is subject to the terms and conditions of the GNU General Public
      7 * License.  See the file "COPYING" in the main directory of this archive
      8 * for more details.
      9 *
     10 * Copyright (C) 2001 - 2005 Tensilica Inc.
     11 */
     12
     13/* We should optimize these. See arch/xtensa/lib/strncpy_user.S */
     14
     15#ifndef _XTENSA_STRING_H
     16#define _XTENSA_STRING_H
     17
     18#define __HAVE_ARCH_STRCPY
     19static inline char *strcpy(char *__dest, const char *__src)
     20{
     21	register char *__xdest = __dest;
     22	unsigned long __dummy;
     23
     24	__asm__ __volatile__("1:\n\t"
     25		"l8ui	%2, %1, 0\n\t"
     26		"s8i	%2, %0, 0\n\t"
     27		"addi	%1, %1, 1\n\t"
     28		"addi	%0, %0, 1\n\t"
     29		"bnez	%2, 1b\n\t"
     30		: "=r" (__dest), "=r" (__src), "=&r" (__dummy)
     31		: "0" (__dest), "1" (__src)
     32		: "memory");
     33
     34	return __xdest;
     35}
     36
     37#define __HAVE_ARCH_STRNCPY
     38static inline char *strncpy(char *__dest, const char *__src, size_t __n)
     39{
     40	register char *__xdest = __dest;
     41	unsigned long __dummy;
     42
     43	if (__n == 0)
     44		return __xdest;
     45
     46	__asm__ __volatile__(
     47		"1:\n\t"
     48		"l8ui	%2, %1, 0\n\t"
     49		"s8i	%2, %0, 0\n\t"
     50		"addi	%1, %1, 1\n\t"
     51		"addi	%0, %0, 1\n\t"
     52		"beqz	%2, 2f\n\t"
     53		"bne	%1, %5, 1b\n"
     54		"2:"
     55		: "=r" (__dest), "=r" (__src), "=&r" (__dummy)
     56		: "0" (__dest), "1" (__src), "r" ((uintptr_t)__src+__n)
     57		: "memory");
     58
     59	return __xdest;
     60}
     61
     62#define __HAVE_ARCH_STRCMP
     63static inline int strcmp(const char *__cs, const char *__ct)
     64{
     65	register int __res;
     66	unsigned long __dummy;
     67
     68	__asm__ __volatile__(
     69		"1:\n\t"
     70		"l8ui	%3, %1, 0\n\t"
     71		"addi	%1, %1, 1\n\t"
     72		"l8ui	%2, %0, 0\n\t"
     73		"addi	%0, %0, 1\n\t"
     74		"beqz	%2, 2f\n\t"
     75		"beq	%2, %3, 1b\n"
     76		"2:\n\t"
     77		"sub	%2, %2, %3"
     78		: "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&r" (__dummy)
     79		: "0" (__cs), "1" (__ct));
     80
     81	return __res;
     82}
     83
     84#define __HAVE_ARCH_STRNCMP
     85static inline int strncmp(const char *__cs, const char *__ct, size_t __n)
     86{
     87	register int __res;
     88	unsigned long __dummy;
     89
     90	__asm__ __volatile__(
     91		"mov	%2, %3\n"
     92		"1:\n\t"
     93		"beq	%0, %6, 2f\n\t"
     94		"l8ui	%3, %1, 0\n\t"
     95		"addi	%1, %1, 1\n\t"
     96		"l8ui	%2, %0, 0\n\t"
     97		"addi	%0, %0, 1\n\t"
     98		"beqz	%2, 2f\n\t"
     99		"beqz	%3, 2f\n\t"
    100		"beq	%2, %3, 1b\n"
    101		"2:\n\t"
    102		"sub	%2, %2, %3"
    103		: "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&r" (__dummy)
    104		: "0" (__cs), "1" (__ct), "r" ((uintptr_t)__cs+__n));
    105
    106	return __res;
    107}
    108
    109#define __HAVE_ARCH_MEMSET
    110extern void *memset(void *__s, int __c, size_t __count);
    111extern void *__memset(void *__s, int __c, size_t __count);
    112
    113#define __HAVE_ARCH_MEMCPY
    114extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
    115extern void *__memcpy(void *__to, __const__ void *__from, size_t __n);
    116
    117#define __HAVE_ARCH_MEMMOVE
    118extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
    119extern void *__memmove(void *__dest, __const__ void *__src, size_t __n);
    120
    121/* Don't build bcopy at all ...  */
    122#define __HAVE_ARCH_BCOPY
    123
    124#if defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__)
    125
    126/*
    127 * For files that are not instrumented (e.g. mm/slub.c) we
    128 * should use not instrumented version of mem* functions.
    129 */
    130
    131#define memcpy(dst, src, len) __memcpy(dst, src, len)
    132#define memmove(dst, src, len) __memmove(dst, src, len)
    133#define memset(s, c, n) __memset(s, c, n)
    134
    135#ifndef __NO_FORTIFY
    136#define __NO_FORTIFY /* FORTIFY_SOURCE uses __builtin_memcpy, etc. */
    137#endif
    138#endif
    139
    140#endif	/* _XTENSA_STRING_H */