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

word-at-a-time.h (1321B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef __ASM_SH_WORD_AT_A_TIME_H
      3#define __ASM_SH_WORD_AT_A_TIME_H
      4
      5#ifdef CONFIG_CPU_BIG_ENDIAN
      6# include <asm-generic/word-at-a-time.h>
      7#else
      8/*
      9 * Little-endian version cribbed from x86.
     10 */
     11struct word_at_a_time {
     12	const unsigned long one_bits, high_bits;
     13};
     14
     15#define WORD_AT_A_TIME_CONSTANTS { REPEAT_BYTE(0x01), REPEAT_BYTE(0x80) }
     16
     17/* Carl Chatfield / Jan Achrenius G+ version for 32-bit */
     18static inline long count_masked_bytes(long mask)
     19{
     20	/* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */
     21	long a = (0x0ff0001+mask) >> 23;
     22	/* Fix the 1 for 00 case */
     23	return a & mask;
     24}
     25
     26/* Return nonzero if it has a zero */
     27static inline unsigned long has_zero(unsigned long a, unsigned long *bits, const struct word_at_a_time *c)
     28{
     29	unsigned long mask = ((a - c->one_bits) & ~a) & c->high_bits;
     30	*bits = mask;
     31	return mask;
     32}
     33
     34static inline unsigned long prep_zero_mask(unsigned long a, unsigned long bits, const struct word_at_a_time *c)
     35{
     36	return bits;
     37}
     38
     39static inline unsigned long create_zero_mask(unsigned long bits)
     40{
     41	bits = (bits - 1) & ~bits;
     42	return bits >> 7;
     43}
     44
     45/* The mask we created is directly usable as a bytemask */
     46#define zero_bytemask(mask) (mask)
     47
     48static inline unsigned long find_zero(unsigned long mask)
     49{
     50	return count_masked_bytes(mask);
     51}
     52#endif
     53
     54#endif