Lines Matching refs:r
297 #define ENTROPY_BITS(r) ((r)->entropy_count >> ENTROPY_SHIFT) argument
492 static void _mix_pool_bytes(struct entropy_store *r, const void *in, in _mix_pool_bytes() argument
497 int wordmask = r->poolinfo->poolwords - 1; in _mix_pool_bytes()
501 tap1 = r->poolinfo->tap1; in _mix_pool_bytes()
502 tap2 = r->poolinfo->tap2; in _mix_pool_bytes()
503 tap3 = r->poolinfo->tap3; in _mix_pool_bytes()
504 tap4 = r->poolinfo->tap4; in _mix_pool_bytes()
505 tap5 = r->poolinfo->tap5; in _mix_pool_bytes()
507 input_rotate = r->input_rotate; in _mix_pool_bytes()
508 i = r->add_ptr; in _mix_pool_bytes()
516 w ^= r->pool[i]; in _mix_pool_bytes()
517 w ^= r->pool[(i + tap1) & wordmask]; in _mix_pool_bytes()
518 w ^= r->pool[(i + tap2) & wordmask]; in _mix_pool_bytes()
519 w ^= r->pool[(i + tap3) & wordmask]; in _mix_pool_bytes()
520 w ^= r->pool[(i + tap4) & wordmask]; in _mix_pool_bytes()
521 w ^= r->pool[(i + tap5) & wordmask]; in _mix_pool_bytes()
524 r->pool[i] = (w >> 3) ^ twist_table[w & 7]; in _mix_pool_bytes()
535 r->input_rotate = input_rotate; in _mix_pool_bytes()
536 r->add_ptr = i; in _mix_pool_bytes()
539 static void __mix_pool_bytes(struct entropy_store *r, const void *in, in __mix_pool_bytes() argument
542 trace_mix_pool_bytes_nolock(r->name, nbytes, _RET_IP_); in __mix_pool_bytes()
543 _mix_pool_bytes(r, in, nbytes); in __mix_pool_bytes()
546 static void mix_pool_bytes(struct entropy_store *r, const void *in, in mix_pool_bytes() argument
551 trace_mix_pool_bytes(r->name, nbytes, _RET_IP_); in mix_pool_bytes()
552 spin_lock_irqsave(&r->lock, flags); in mix_pool_bytes()
553 _mix_pool_bytes(r, in, nbytes); in mix_pool_bytes()
554 spin_unlock_irqrestore(&r->lock, flags); in mix_pool_bytes()
616 static void credit_entropy_bits(struct entropy_store *r, int nbits) in credit_entropy_bits() argument
619 const int pool_size = r->poolinfo->poolfracbits; in credit_entropy_bits()
626 entropy_count = orig = ACCESS_ONCE(r->entropy_count); in credit_entropy_bits()
653 const int s = r->poolinfo->poolbitshift + ENTROPY_SHIFT + 2; in credit_entropy_bits()
668 r->name, entropy_count); in credit_entropy_bits()
673 if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig) in credit_entropy_bits()
676 r->entropy_total += nbits; in credit_entropy_bits()
677 if (!r->initialized && r->entropy_total > 128) { in credit_entropy_bits()
678 r->initialized = 1; in credit_entropy_bits()
679 r->entropy_total = 0; in credit_entropy_bits()
680 if (r == &nonblocking_pool) { in credit_entropy_bits()
684 pr_notice("random: %s pool is initialized\n", r->name); in credit_entropy_bits()
688 trace_credit_entropy_bits(r->name, nbits, in credit_entropy_bits()
690 r->entropy_total, _RET_IP_); in credit_entropy_bits()
692 if (r == &input_pool) { in credit_entropy_bits()
706 r->initialized && in credit_entropy_bits()
707 r->entropy_total >= 2*random_read_wakeup_bits) { in credit_entropy_bits()
719 r->entropy_total = 0; in credit_entropy_bits()
725 static void credit_entropy_bits_safe(struct entropy_store *r, int nbits) in credit_entropy_bits_safe() argument
733 credit_entropy_bits(r, nbits); in credit_entropy_bits_safe()
791 struct entropy_store *r; in add_timer_randomness() local
804 r = nonblocking_pool.initialized ? &input_pool : &nonblocking_pool; in add_timer_randomness()
805 mix_pool_bytes(r, &sample, sizeof(sample)); in add_timer_randomness()
839 credit_entropy_bits(r, min_t(int, fls(delta>>1), 11)); in add_timer_randomness()
896 struct entropy_store *r; in add_interrupt_randomness() local
924 r = nonblocking_pool.initialized ? &input_pool : &nonblocking_pool; in add_interrupt_randomness()
925 if (!spin_trylock(&r->lock)) in add_interrupt_randomness()
929 __mix_pool_bytes(r, &fast_pool->pool, sizeof(fast_pool->pool)); in add_interrupt_randomness()
938 __mix_pool_bytes(r, &seed, sizeof(seed)); in add_interrupt_randomness()
941 spin_unlock(&r->lock); in add_interrupt_randomness()
946 credit_entropy_bits(r, credit + 1); in add_interrupt_randomness()
967 static ssize_t extract_entropy(struct entropy_store *r, void *buf,
975 static void _xfer_secondary_pool(struct entropy_store *r, size_t nbytes);
976 static void xfer_secondary_pool(struct entropy_store *r, size_t nbytes) in xfer_secondary_pool() argument
978 if (!r->pull || in xfer_secondary_pool()
979 r->entropy_count >= (nbytes << (ENTROPY_SHIFT + 3)) || in xfer_secondary_pool()
980 r->entropy_count > r->poolinfo->poolfracbits) in xfer_secondary_pool()
983 if (r->limit == 0 && random_min_urandom_seed) { in xfer_secondary_pool()
987 r->last_pulled + random_min_urandom_seed * HZ)) in xfer_secondary_pool()
989 r->last_pulled = now; in xfer_secondary_pool()
992 _xfer_secondary_pool(r, nbytes); in xfer_secondary_pool()
995 static void _xfer_secondary_pool(struct entropy_store *r, size_t nbytes) in _xfer_secondary_pool() argument
1000 int rsvd_bytes = r->limit ? 0 : random_read_wakeup_bits / 4; in _xfer_secondary_pool()
1008 trace_xfer_secondary_pool(r->name, bytes * 8, nbytes * 8, in _xfer_secondary_pool()
1009 ENTROPY_BITS(r), ENTROPY_BITS(r->pull)); in _xfer_secondary_pool()
1010 bytes = extract_entropy(r->pull, tmp, bytes, in _xfer_secondary_pool()
1012 mix_pool_bytes(r, tmp, bytes); in _xfer_secondary_pool()
1013 credit_entropy_bits(r, bytes*8); in _xfer_secondary_pool()
1024 struct entropy_store *r = container_of(work, struct entropy_store, in push_to_pool() local
1026 BUG_ON(!r); in push_to_pool()
1027 _xfer_secondary_pool(r, random_read_wakeup_bits/8); in push_to_pool()
1028 trace_push_to_pool(r->name, r->entropy_count >> ENTROPY_SHIFT, in push_to_pool()
1029 r->pull->entropy_count >> ENTROPY_SHIFT); in push_to_pool()
1036 static size_t account(struct entropy_store *r, size_t nbytes, int min, in account() argument
1042 BUG_ON(r->entropy_count > r->poolinfo->poolfracbits); in account()
1046 entropy_count = orig = ACCESS_ONCE(r->entropy_count); in account()
1049 if (r->limit) { in account()
1061 r->name, entropy_count); in account()
1071 if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig) in account()
1074 trace_debit_entropy(r->name, 8 * ibytes); in account()
1076 (r->entropy_count >> ENTROPY_SHIFT) < random_write_wakeup_bits) { in account()
1090 static void extract_buf(struct entropy_store *r, __u8 *out) in extract_buf() argument
1113 spin_lock_irqsave(&r->lock, flags); in extract_buf()
1114 for (i = 0; i < r->poolinfo->poolwords; i += 16) in extract_buf()
1115 sha_transform(hash.w, (__u8 *)(r->pool + i), workspace); in extract_buf()
1126 __mix_pool_bytes(r, hash.w, sizeof(hash.w)); in extract_buf()
1127 spin_unlock_irqrestore(&r->lock, flags); in extract_buf()
1153 static ssize_t extract_entropy(struct entropy_store *r, void *buf, in extract_entropy() argument
1162 spin_lock_irqsave(&r->lock, flags); in extract_entropy()
1163 if (!r->last_data_init) { in extract_entropy()
1164 r->last_data_init = 1; in extract_entropy()
1165 spin_unlock_irqrestore(&r->lock, flags); in extract_entropy()
1166 trace_extract_entropy(r->name, EXTRACT_SIZE, in extract_entropy()
1167 ENTROPY_BITS(r), _RET_IP_); in extract_entropy()
1168 xfer_secondary_pool(r, EXTRACT_SIZE); in extract_entropy()
1169 extract_buf(r, tmp); in extract_entropy()
1170 spin_lock_irqsave(&r->lock, flags); in extract_entropy()
1171 memcpy(r->last_data, tmp, EXTRACT_SIZE); in extract_entropy()
1173 spin_unlock_irqrestore(&r->lock, flags); in extract_entropy()
1176 trace_extract_entropy(r->name, nbytes, ENTROPY_BITS(r), _RET_IP_); in extract_entropy()
1177 xfer_secondary_pool(r, nbytes); in extract_entropy()
1178 nbytes = account(r, nbytes, min, reserved); in extract_entropy()
1181 extract_buf(r, tmp); in extract_entropy()
1184 spin_lock_irqsave(&r->lock, flags); in extract_entropy()
1185 if (!memcmp(tmp, r->last_data, EXTRACT_SIZE)) in extract_entropy()
1187 memcpy(r->last_data, tmp, EXTRACT_SIZE); in extract_entropy()
1188 spin_unlock_irqrestore(&r->lock, flags); in extract_entropy()
1207 static ssize_t extract_entropy_user(struct entropy_store *r, void __user *buf, in extract_entropy_user() argument
1214 trace_extract_entropy_user(r->name, nbytes, ENTROPY_BITS(r), _RET_IP_); in extract_entropy_user()
1215 xfer_secondary_pool(r, nbytes); in extract_entropy_user()
1216 nbytes = account(r, nbytes, 0, 0); in extract_entropy_user()
1228 extract_buf(r, tmp); in extract_entropy_user()
1367 static void init_std_data(struct entropy_store *r) in init_std_data() argument
1373 r->last_pulled = jiffies; in init_std_data()
1374 mix_pool_bytes(r, &now, sizeof(now)); in init_std_data()
1375 for (i = r->poolinfo->poolbytes; i > 0; i -= sizeof(rv)) { in init_std_data()
1379 mix_pool_bytes(r, &rv, sizeof(rv)); in init_std_data()
1381 mix_pool_bytes(r, utsname(), sizeof(*(utsname()))); in init_std_data()
1491 write_pool(struct entropy_store *r, const char __user *buffer, size_t count) in write_pool() argument
1505 mix_pool_bytes(r, buf, bytes); in write_pool()