LCOV - code coverage report
Current view: top level - include/linux - prandom.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 8 8 100.0 %
Date: 2023-04-06 08:38:28 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : /*
       3             :  * include/linux/prandom.h
       4             :  *
       5             :  * Include file for the fast pseudo-random 32-bit
       6             :  * generation.
       7             :  */
       8             : #ifndef _LINUX_PRANDOM_H
       9             : #define _LINUX_PRANDOM_H
      10             : 
      11             : #include <linux/types.h>
      12             : #include <linux/once.h>
      13             : #include <linux/percpu.h>
      14             : #include <linux/random.h>
      15             : 
      16             : struct rnd_state {
      17             :         __u32 s1, s2, s3, s4;
      18             : };
      19             : 
      20             : u32 prandom_u32_state(struct rnd_state *state);
      21             : void prandom_bytes_state(struct rnd_state *state, void *buf, size_t nbytes);
      22             : void prandom_seed_full_state(struct rnd_state __percpu *pcpu_state);
      23             : 
      24             : #define prandom_init_once(pcpu_state)                   \
      25             :         DO_ONCE(prandom_seed_full_state, (pcpu_state))
      26             : 
      27             : /*
      28             :  * Handle minimum values for seeds
      29             :  */
      30             : static inline u32 __seed(u32 x, u32 m)
      31             : {
      32         656 :         return (x < m) ? x + m : x;
      33             : }
      34             : 
      35             : /**
      36             :  * prandom_seed_state - set seed for prandom_u32_state().
      37             :  * @state: pointer to state structure to receive the seed.
      38             :  * @seed: arbitrary 64-bit value to use as a seed.
      39             :  */
      40         164 : static inline void prandom_seed_state(struct rnd_state *state, u64 seed)
      41             : {
      42         164 :         u32 i = ((seed >> 32) ^ (seed << 10) ^ seed) & 0xffffffffUL;
      43             : 
      44         164 :         state->s1 = __seed(i,   2U);
      45         164 :         state->s2 = __seed(i,   8U);
      46         164 :         state->s3 = __seed(i,  16U);
      47         164 :         state->s4 = __seed(i, 128U);
      48         164 : }
      49             : 
      50             : /* Pseudo random number generator from numerical recipes. */
      51             : static inline u32 next_pseudo_random32(u32 seed)
      52             : {
      53             :         return seed * 1664525 + 1013904223;
      54             : }
      55             : 
      56             : #endif

Generated by: LCOV version 1.14