Lines Matching refs:r

297 #define ENTROPY_BITS(r) ((r)->entropy_count >> ENTROPY_SHIFT)  argument
489 static void _mix_pool_bytes(struct entropy_store *r, const void *in, in _mix_pool_bytes() argument
494 int wordmask = r->poolinfo->poolwords - 1; in _mix_pool_bytes()
498 tap1 = r->poolinfo->tap1; in _mix_pool_bytes()
499 tap2 = r->poolinfo->tap2; in _mix_pool_bytes()
500 tap3 = r->poolinfo->tap3; in _mix_pool_bytes()
501 tap4 = r->poolinfo->tap4; in _mix_pool_bytes()
502 tap5 = r->poolinfo->tap5; in _mix_pool_bytes()
504 input_rotate = r->input_rotate; in _mix_pool_bytes()
505 i = r->add_ptr; in _mix_pool_bytes()
513 w ^= r->pool[i]; in _mix_pool_bytes()
514 w ^= r->pool[(i + tap1) & wordmask]; in _mix_pool_bytes()
515 w ^= r->pool[(i + tap2) & wordmask]; in _mix_pool_bytes()
516 w ^= r->pool[(i + tap3) & wordmask]; in _mix_pool_bytes()
517 w ^= r->pool[(i + tap4) & wordmask]; in _mix_pool_bytes()
518 w ^= r->pool[(i + tap5) & wordmask]; in _mix_pool_bytes()
521 r->pool[i] = (w >> 3) ^ twist_table[w & 7]; in _mix_pool_bytes()
532 r->input_rotate = input_rotate; in _mix_pool_bytes()
533 r->add_ptr = i; in _mix_pool_bytes()
536 static void __mix_pool_bytes(struct entropy_store *r, const void *in, in __mix_pool_bytes() argument
539 trace_mix_pool_bytes_nolock(r->name, nbytes, _RET_IP_); in __mix_pool_bytes()
540 _mix_pool_bytes(r, in, nbytes); in __mix_pool_bytes()
543 static void mix_pool_bytes(struct entropy_store *r, const void *in, in mix_pool_bytes() argument
548 trace_mix_pool_bytes(r->name, nbytes, _RET_IP_); in mix_pool_bytes()
549 spin_lock_irqsave(&r->lock, flags); in mix_pool_bytes()
550 _mix_pool_bytes(r, in, nbytes); in mix_pool_bytes()
551 spin_unlock_irqrestore(&r->lock, flags); in mix_pool_bytes()
597 static void credit_entropy_bits(struct entropy_store *r, int nbits) in credit_entropy_bits() argument
600 const int pool_size = r->poolinfo->poolfracbits; in credit_entropy_bits()
607 entropy_count = orig = ACCESS_ONCE(r->entropy_count); in credit_entropy_bits()
634 const int s = r->poolinfo->poolbitshift + ENTROPY_SHIFT + 2; in credit_entropy_bits()
649 r->name, entropy_count); in credit_entropy_bits()
654 if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig) in credit_entropy_bits()
657 r->entropy_total += nbits; in credit_entropy_bits()
658 if (!r->initialized && r->entropy_total > 128) { in credit_entropy_bits()
659 r->initialized = 1; in credit_entropy_bits()
660 r->entropy_total = 0; in credit_entropy_bits()
661 if (r == &nonblocking_pool) { in credit_entropy_bits()
664 pr_notice("random: %s pool is initialized\n", r->name); in credit_entropy_bits()
668 trace_credit_entropy_bits(r->name, nbits, in credit_entropy_bits()
670 r->entropy_total, _RET_IP_); in credit_entropy_bits()
672 if (r == &input_pool) { in credit_entropy_bits()
686 r->initialized && in credit_entropy_bits()
687 r->entropy_total >= 2*random_read_wakeup_bits) { in credit_entropy_bits()
699 r->entropy_total = 0; in credit_entropy_bits()
705 static void credit_entropy_bits_safe(struct entropy_store *r, int nbits) in credit_entropy_bits_safe() argument
713 credit_entropy_bits(r, nbits); in credit_entropy_bits_safe()
771 struct entropy_store *r; in add_timer_randomness() local
784 r = nonblocking_pool.initialized ? &input_pool : &nonblocking_pool; in add_timer_randomness()
785 mix_pool_bytes(r, &sample, sizeof(sample)); in add_timer_randomness()
819 credit_entropy_bits(r, min_t(int, fls(delta>>1), 11)); in add_timer_randomness()
876 struct entropy_store *r; in add_interrupt_randomness() local
904 r = nonblocking_pool.initialized ? &input_pool : &nonblocking_pool; in add_interrupt_randomness()
905 if (!spin_trylock(&r->lock)) in add_interrupt_randomness()
909 __mix_pool_bytes(r, &fast_pool->pool, sizeof(fast_pool->pool)); in add_interrupt_randomness()
918 __mix_pool_bytes(r, &seed, sizeof(seed)); in add_interrupt_randomness()
921 spin_unlock(&r->lock); in add_interrupt_randomness()
926 credit_entropy_bits(r, credit + 1); in add_interrupt_randomness()
947 static ssize_t extract_entropy(struct entropy_store *r, void *buf,
955 static void _xfer_secondary_pool(struct entropy_store *r, size_t nbytes);
956 static void xfer_secondary_pool(struct entropy_store *r, size_t nbytes) in xfer_secondary_pool() argument
958 if (!r->pull || in xfer_secondary_pool()
959 r->entropy_count >= (nbytes << (ENTROPY_SHIFT + 3)) || in xfer_secondary_pool()
960 r->entropy_count > r->poolinfo->poolfracbits) in xfer_secondary_pool()
963 if (r->limit == 0 && random_min_urandom_seed) { in xfer_secondary_pool()
967 r->last_pulled + random_min_urandom_seed * HZ)) in xfer_secondary_pool()
969 r->last_pulled = now; in xfer_secondary_pool()
972 _xfer_secondary_pool(r, nbytes); in xfer_secondary_pool()
975 static void _xfer_secondary_pool(struct entropy_store *r, size_t nbytes) in _xfer_secondary_pool() argument
980 int rsvd_bytes = r->limit ? 0 : random_read_wakeup_bits / 4; in _xfer_secondary_pool()
988 trace_xfer_secondary_pool(r->name, bytes * 8, nbytes * 8, in _xfer_secondary_pool()
989 ENTROPY_BITS(r), ENTROPY_BITS(r->pull)); in _xfer_secondary_pool()
990 bytes = extract_entropy(r->pull, tmp, bytes, in _xfer_secondary_pool()
992 mix_pool_bytes(r, tmp, bytes); in _xfer_secondary_pool()
993 credit_entropy_bits(r, bytes*8); in _xfer_secondary_pool()
1004 struct entropy_store *r = container_of(work, struct entropy_store, in push_to_pool() local
1006 BUG_ON(!r); in push_to_pool()
1007 _xfer_secondary_pool(r, random_read_wakeup_bits/8); in push_to_pool()
1008 trace_push_to_pool(r->name, r->entropy_count >> ENTROPY_SHIFT, in push_to_pool()
1009 r->pull->entropy_count >> ENTROPY_SHIFT); in push_to_pool()
1016 static size_t account(struct entropy_store *r, size_t nbytes, int min, in account() argument
1022 BUG_ON(r->entropy_count > r->poolinfo->poolfracbits); in account()
1026 entropy_count = orig = ACCESS_ONCE(r->entropy_count); in account()
1029 if (r->limit) { in account()
1041 r->name, entropy_count); in account()
1051 if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig) in account()
1054 trace_debit_entropy(r->name, 8 * ibytes); in account()
1056 (r->entropy_count >> ENTROPY_SHIFT) < random_write_wakeup_bits) { in account()
1070 static void extract_buf(struct entropy_store *r, __u8 *out) in extract_buf() argument
1093 spin_lock_irqsave(&r->lock, flags); in extract_buf()
1094 for (i = 0; i < r->poolinfo->poolwords; i += 16) in extract_buf()
1095 sha_transform(hash.w, (__u8 *)(r->pool + i), workspace); in extract_buf()
1106 __mix_pool_bytes(r, hash.w, sizeof(hash.w)); in extract_buf()
1107 spin_unlock_irqrestore(&r->lock, flags); in extract_buf()
1133 static ssize_t extract_entropy(struct entropy_store *r, void *buf, in extract_entropy() argument
1142 spin_lock_irqsave(&r->lock, flags); in extract_entropy()
1143 if (!r->last_data_init) { in extract_entropy()
1144 r->last_data_init = 1; in extract_entropy()
1145 spin_unlock_irqrestore(&r->lock, flags); in extract_entropy()
1146 trace_extract_entropy(r->name, EXTRACT_SIZE, in extract_entropy()
1147 ENTROPY_BITS(r), _RET_IP_); in extract_entropy()
1148 xfer_secondary_pool(r, EXTRACT_SIZE); in extract_entropy()
1149 extract_buf(r, tmp); in extract_entropy()
1150 spin_lock_irqsave(&r->lock, flags); in extract_entropy()
1151 memcpy(r->last_data, tmp, EXTRACT_SIZE); in extract_entropy()
1153 spin_unlock_irqrestore(&r->lock, flags); in extract_entropy()
1156 trace_extract_entropy(r->name, nbytes, ENTROPY_BITS(r), _RET_IP_); in extract_entropy()
1157 xfer_secondary_pool(r, nbytes); in extract_entropy()
1158 nbytes = account(r, nbytes, min, reserved); in extract_entropy()
1161 extract_buf(r, tmp); in extract_entropy()
1164 spin_lock_irqsave(&r->lock, flags); in extract_entropy()
1165 if (!memcmp(tmp, r->last_data, EXTRACT_SIZE)) in extract_entropy()
1167 memcpy(r->last_data, tmp, EXTRACT_SIZE); in extract_entropy()
1168 spin_unlock_irqrestore(&r->lock, flags); in extract_entropy()
1187 static ssize_t extract_entropy_user(struct entropy_store *r, void __user *buf, in extract_entropy_user() argument
1194 trace_extract_entropy_user(r->name, nbytes, ENTROPY_BITS(r), _RET_IP_); in extract_entropy_user()
1195 xfer_secondary_pool(r, nbytes); in extract_entropy_user()
1196 nbytes = account(r, nbytes, 0, 0); in extract_entropy_user()
1208 extract_buf(r, tmp); in extract_entropy_user()
1289 static void init_std_data(struct entropy_store *r) in init_std_data() argument
1295 r->last_pulled = jiffies; in init_std_data()
1296 mix_pool_bytes(r, &now, sizeof(now)); in init_std_data()
1297 for (i = r->poolinfo->poolbytes; i > 0; i -= sizeof(rv)) { in init_std_data()
1301 mix_pool_bytes(r, &rv, sizeof(rv)); in init_std_data()
1303 mix_pool_bytes(r, utsname(), sizeof(*(utsname()))); in init_std_data()
1413 write_pool(struct entropy_store *r, const char __user *buffer, size_t count) in write_pool() argument
1427 mix_pool_bytes(r, buf, bytes); in write_pool()