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

bpf_rand.h (3169B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef __BPF_RAND__
      3#define __BPF_RAND__
      4
      5#include <stdint.h>
      6#include <stdlib.h>
      7#include <time.h>
      8
      9static inline uint64_t bpf_rand_mask(uint64_t mask)
     10{
     11	return (((uint64_t)(uint32_t)rand()) |
     12	        ((uint64_t)(uint32_t)rand() << 32)) & mask;
     13}
     14
     15#define bpf_rand_ux(x, m)			\
     16static inline uint64_t bpf_rand_u##x(int shift)	\
     17{						\
     18	return bpf_rand_mask((m)) << shift;	\
     19}
     20
     21bpf_rand_ux( 8,               0xffULL)
     22bpf_rand_ux(16,             0xffffULL)
     23bpf_rand_ux(24,           0xffffffULL)
     24bpf_rand_ux(32,         0xffffffffULL)
     25bpf_rand_ux(40,       0xffffffffffULL)
     26bpf_rand_ux(48,     0xffffffffffffULL)
     27bpf_rand_ux(56,   0xffffffffffffffULL)
     28bpf_rand_ux(64, 0xffffffffffffffffULL)
     29
     30static inline void bpf_semi_rand_init(void)
     31{
     32	srand(time(NULL));
     33}
     34
     35static inline uint64_t bpf_semi_rand_get(void)
     36{
     37	switch (rand() % 39) {
     38	case  0: return 0x000000ff00000000ULL | bpf_rand_u8(0);
     39	case  1: return 0xffffffff00000000ULL | bpf_rand_u16(0);
     40	case  2: return 0x00000000ffff0000ULL | bpf_rand_u16(0);
     41	case  3: return 0x8000000000000000ULL | bpf_rand_u32(0);
     42	case  4: return 0x00000000f0000000ULL | bpf_rand_u32(0);
     43	case  5: return 0x0000000100000000ULL | bpf_rand_u24(0);
     44	case  6: return 0x800ff00000000000ULL | bpf_rand_u32(0);
     45	case  7: return 0x7fffffff00000000ULL | bpf_rand_u32(0);
     46	case  8: return 0xffffffffffffff00ULL ^ bpf_rand_u32(24);
     47	case  9: return 0xffffffffffffff00ULL | bpf_rand_u8(0);
     48	case 10: return 0x0000000010000000ULL | bpf_rand_u32(0);
     49	case 11: return 0xf000000000000000ULL | bpf_rand_u8(0);
     50	case 12: return 0x0000f00000000000ULL | bpf_rand_u8(8);
     51	case 13: return 0x000000000f000000ULL | bpf_rand_u8(16);
     52	case 14: return 0x0000000000000f00ULL | bpf_rand_u8(32);
     53	case 15: return 0x00fff00000000f00ULL | bpf_rand_u8(48);
     54	case 16: return 0x00007fffffffffffULL ^ bpf_rand_u32(1);
     55	case 17: return 0xffff800000000000ULL | bpf_rand_u8(4);
     56	case 18: return 0xffff800000000000ULL | bpf_rand_u8(20);
     57	case 19: return (0xffffffc000000000ULL + 0x80000ULL) | bpf_rand_u32(0);
     58	case 20: return (0xffffffc000000000ULL - 0x04000000ULL) | bpf_rand_u32(0);
     59	case 21: return 0x0000000000000000ULL | bpf_rand_u8(55) | bpf_rand_u32(20);
     60	case 22: return 0xffffffffffffffffULL ^ bpf_rand_u8(3) ^ bpf_rand_u32(40);
     61	case 23: return 0x0000000000000000ULL | bpf_rand_u8(bpf_rand_u8(0) % 64);
     62	case 24: return 0x0000000000000000ULL | bpf_rand_u16(bpf_rand_u8(0) % 64);
     63	case 25: return 0xffffffffffffffffULL ^ bpf_rand_u8(bpf_rand_u8(0) % 64);
     64	case 26: return 0xffffffffffffffffULL ^ bpf_rand_u40(bpf_rand_u8(0) % 64);
     65	case 27: return 0x0000800000000000ULL;
     66	case 28: return 0x8000000000000000ULL;
     67	case 29: return 0x0000000000000000ULL;
     68	case 30: return 0xffffffffffffffffULL;
     69	case 31: return bpf_rand_u16(bpf_rand_u8(0) % 64);
     70	case 32: return bpf_rand_u24(bpf_rand_u8(0) % 64);
     71	case 33: return bpf_rand_u32(bpf_rand_u8(0) % 64);
     72	case 34: return bpf_rand_u40(bpf_rand_u8(0) % 64);
     73	case 35: return bpf_rand_u48(bpf_rand_u8(0) % 64);
     74	case 36: return bpf_rand_u56(bpf_rand_u8(0) % 64);
     75	case 37: return bpf_rand_u64(bpf_rand_u8(0) % 64);
     76	default: return bpf_rand_u64(0);
     77	}
     78}
     79
     80#endif /* __BPF_RAND__ */