random_infra.c (13774e82285e8d5eb3afeff63760725f747f8581) random_infra.c (f3d2512db6ec23985b10fbcbe0b3bd34ea2574df)
1/*-
2 * Copyright (c) 2015 Mark R V Murray
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 49 unchanged lines hidden (view full) ---

58#if defined(RANDOM_LOADABLE)
59
60static void
61null_read_random(void *dummy __unused, u_int dummy2 __unused)
62{
63 panic("%s: no random module is loaded", __func__);
64}
65
1/*-
2 * Copyright (c) 2015 Mark R V Murray
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 49 unchanged lines hidden (view full) ---

58#if defined(RANDOM_LOADABLE)
59
60static void
61null_read_random(void *dummy __unused, u_int dummy2 __unused)
62{
63 panic("%s: no random module is loaded", __func__);
64}
65
66static bool
67null_is_random_seeded(void)
68{
69 return (false);
70}
71
66struct random_readers {
67 int (*read_random_uio)(struct uio *, bool);
68 void (*read_random)(void *, u_int);
72struct random_readers {
73 int (*read_random_uio)(struct uio *, bool);
74 void (*read_random)(void *, u_int);
75 bool (*is_random_seeded)(void);
69} random_reader_context = {
70 (int (*)(struct uio *, bool))nullop,
71 null_read_random,
76} random_reader_context = {
77 (int (*)(struct uio *, bool))nullop,
78 null_read_random,
79 null_is_random_seeded,
72};
73
74struct sx randomdev_config_lock;
75
76static void
77random_infra_sysinit(void *dummy __unused)
78{
79
80 RANDOM_CONFIG_INIT_LOCK();
81}
82SYSINIT(random_device_h_init, SI_SUB_RANDOM, SI_ORDER_FIRST, random_infra_sysinit, NULL);
83
84void
80};
81
82struct sx randomdev_config_lock;
83
84static void
85random_infra_sysinit(void *dummy __unused)
86{
87
88 RANDOM_CONFIG_INIT_LOCK();
89}
90SYSINIT(random_device_h_init, SI_SUB_RANDOM, SI_ORDER_FIRST, random_infra_sysinit, NULL);
91
92void
85random_infra_init(int (*p_random_read_uio)(struct uio *, bool), void (*p_random_read)(void *, u_int))
93random_infra_init(int (*p_random_read_uio)(struct uio *, bool),
94 void (*p_random_read)(void *, u_int),
95 bool (*p_is_random_seeded)(void))
86{
87
88 RANDOM_CONFIG_X_LOCK();
89 random_reader_context.read_random_uio = p_random_read_uio;
90 random_reader_context.read_random = p_random_read;
96{
97
98 RANDOM_CONFIG_X_LOCK();
99 random_reader_context.read_random_uio = p_random_read_uio;
100 random_reader_context.read_random = p_random_read;
101 random_reader_context.is_random_seeded = p_is_random_seeded;
91 RANDOM_CONFIG_X_UNLOCK();
92}
93
94void
95random_infra_uninit(void)
96{
97
98 RANDOM_CONFIG_X_LOCK();
99 random_reader_context.read_random_uio = (int (*)(struct uio *, bool))nullop;
100 random_reader_context.read_random = null_read_random;
102 RANDOM_CONFIG_X_UNLOCK();
103}
104
105void
106random_infra_uninit(void)
107{
108
109 RANDOM_CONFIG_X_LOCK();
110 random_reader_context.read_random_uio = (int (*)(struct uio *, bool))nullop;
111 random_reader_context.read_random = null_read_random;
112 random_reader_context.is_random_seeded = null_is_random_seeded;
101 RANDOM_CONFIG_X_UNLOCK();
102}
103
104static void
105random_infra_sysuninit(void *dummy __unused)
106{
107
108 RANDOM_CONFIG_DEINIT_LOCK();

--- 15 unchanged lines hidden (view full) ---

124read_random(void *buf, u_int len)
125{
126
127 RANDOM_CONFIG_S_LOCK();
128 random_reader_context.read_random(buf, len);
129 RANDOM_CONFIG_S_UNLOCK();
130}
131
113 RANDOM_CONFIG_X_UNLOCK();
114}
115
116static void
117random_infra_sysuninit(void *dummy __unused)
118{
119
120 RANDOM_CONFIG_DEINIT_LOCK();

--- 15 unchanged lines hidden (view full) ---

136read_random(void *buf, u_int len)
137{
138
139 RANDOM_CONFIG_S_LOCK();
140 random_reader_context.read_random(buf, len);
141 RANDOM_CONFIG_S_UNLOCK();
142}
143
144bool
145is_random_seeded(void)
146{
147 RANDOM_CONFIG_S_LOCK();
148 random_reader_context.is_random_seeded();
149 RANDOM_CONFIG_S_UNLOCK();
150}
151
152
132#endif /* defined(RANDOM_LOADABLE) */
153#endif /* defined(RANDOM_LOADABLE) */