1
2
3#ifndef _LINUX_RANDOM_H
4#define _LINUX_RANDOM_H
5
6#include <linux/bug.h>
7#include <linux/kernel.h>
8#include <linux/list.h>
9#include <linux/once.h>
10
11#include <uapi/linux/random.h>
12
13struct notifier_block;
14
15extern void add_device_randomness(const void *, size_t);
16extern void add_bootloader_randomness(const void *, size_t);
17
18#if defined(LATENT_ENTROPY_PLUGIN) && !defined(__CHECKER__)
19static inline void add_latent_entropy(void)
20{
21 add_device_randomness((const void *)&latent_entropy,
22 sizeof(latent_entropy));
23}
24#else
25static inline void add_latent_entropy(void) {}
26#endif
27
28extern void add_input_randomness(unsigned int type, unsigned int code,
29 unsigned int value) __latent_entropy;
30extern void add_interrupt_randomness(int irq) __latent_entropy;
31extern void add_hwgenerator_randomness(const void *buffer, size_t count,
32 size_t entropy);
33#if IS_ENABLED(CONFIG_VMGENID)
34extern void add_vmfork_randomness(const void *unique_vm_id, size_t size);
35extern int register_random_vmfork_notifier(struct notifier_block *nb);
36extern int unregister_random_vmfork_notifier(struct notifier_block *nb);
37#else
38static inline int register_random_vmfork_notifier(struct notifier_block *nb) { return 0; }
39static inline int unregister_random_vmfork_notifier(struct notifier_block *nb) { return 0; }
40#endif
41
42extern void get_random_bytes(void *buf, size_t nbytes);
43extern int wait_for_random_bytes(void);
44extern int __init rand_initialize(void);
45extern bool rng_is_initialized(void);
46extern int register_random_ready_notifier(struct notifier_block *nb);
47extern int unregister_random_ready_notifier(struct notifier_block *nb);
48extern size_t __must_check get_random_bytes_arch(void *buf, size_t nbytes);
49
50#ifndef MODULE
51extern const struct file_operations random_fops, urandom_fops;
52#endif
53
54u32 get_random_u32(void);
55u64 get_random_u64(void);
56static inline unsigned int get_random_int(void)
57{
58 return get_random_u32();
59}
60static inline unsigned long get_random_long(void)
61{
62#if BITS_PER_LONG == 64
63 return get_random_u64();
64#else
65 return get_random_u32();
66#endif
67}
68
69
70
71
72
73#ifdef CONFIG_64BIT
74# ifdef __LITTLE_ENDIAN
75# define CANARY_MASK 0xffffffffffffff00UL
76# else
77# define CANARY_MASK 0x00ffffffffffffffUL
78# endif
79#else
80# define CANARY_MASK 0xffffffffUL
81#endif
82
83static inline unsigned long get_random_canary(void)
84{
85 unsigned long val = get_random_long();
86
87 return val & CANARY_MASK;
88}
89
90
91
92static inline int get_random_bytes_wait(void *buf, size_t nbytes)
93{
94 int ret = wait_for_random_bytes();
95 get_random_bytes(buf, nbytes);
96 return ret;
97}
98
99#define declare_get_random_var_wait(var) \
100 static inline int get_random_ ## var ## _wait(var *out) { \
101 int ret = wait_for_random_bytes(); \
102 if (unlikely(ret)) \
103 return ret; \
104 *out = get_random_ ## var(); \
105 return 0; \
106 }
107declare_get_random_var_wait(u32)
108declare_get_random_var_wait(u64)
109declare_get_random_var_wait(int)
110declare_get_random_var_wait(long)
111#undef declare_get_random_var
112
113unsigned long randomize_page(unsigned long start, unsigned long range);
114
115
116
117
118
119
120#include <linux/prandom.h>
121
122#ifdef CONFIG_ARCH_RANDOM
123# include <asm/archrandom.h>
124#else
125static inline bool __must_check arch_get_random_long(unsigned long *v)
126{
127 return false;
128}
129static inline bool __must_check arch_get_random_int(unsigned int *v)
130{
131 return false;
132}
133static inline bool __must_check arch_get_random_seed_long(unsigned long *v)
134{
135 return false;
136}
137static inline bool __must_check arch_get_random_seed_int(unsigned int *v)
138{
139 return false;
140}
141#endif
142
143
144
145
146
147#ifndef arch_get_random_seed_long_early
148static inline bool __init arch_get_random_seed_long_early(unsigned long *v)
149{
150 WARN_ON(system_state != SYSTEM_BOOTING);
151 return arch_get_random_seed_long(v);
152}
153#endif
154
155#ifndef arch_get_random_long_early
156static inline bool __init arch_get_random_long_early(unsigned long *v)
157{
158 WARN_ON(system_state != SYSTEM_BOOTING);
159 return arch_get_random_long(v);
160}
161#endif
162
163#ifdef CONFIG_SMP
164extern int random_prepare_cpu(unsigned int cpu);
165extern int random_online_cpu(unsigned int cpu);
166#endif
167
168#endif
169