Merge tag 'riscv-for-linus-5.13-rc7' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / tools / testing / selftests / bpf / bpf_rand.h
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
9 static 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)                       \
16 static inline uint64_t bpf_rand_u##x(int shift) \
17 {                                               \
18         return bpf_rand_mask((m)) << shift;     \
19 }
20
21 bpf_rand_ux( 8,               0xffULL)
22 bpf_rand_ux(16,             0xffffULL)
23 bpf_rand_ux(24,           0xffffffULL)
24 bpf_rand_ux(32,         0xffffffffULL)
25 bpf_rand_ux(40,       0xffffffffffULL)
26 bpf_rand_ux(48,     0xffffffffffffULL)
27 bpf_rand_ux(56,   0xffffffffffffffULL)
28 bpf_rand_ux(64, 0xffffffffffffffffULL)
29
30 static inline void bpf_semi_rand_init(void)
31 {
32         srand(time(NULL));
33 }
34
35 static 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__ */