Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/random/random_infra.c
Show First 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | |||||
#if defined(RANDOM_LOADABLE) | #if defined(RANDOM_LOADABLE) | ||||
static void | static void | ||||
null_read_random(void *dummy __unused, u_int dummy2 __unused) | null_read_random(void *dummy __unused, u_int dummy2 __unused) | ||||
{ | { | ||||
panic("%s: no random module is loaded", __func__); | panic("%s: no random module is loaded", __func__); | ||||
} | } | ||||
static bool | |||||
null_is_random_seeded(void) | |||||
{ | |||||
return (false); | |||||
} | |||||
struct random_readers { | struct random_readers { | ||||
int (*read_random_uio)(struct uio *, bool); | int (*read_random_uio)(struct uio *, bool); | ||||
void (*read_random)(void *, u_int); | void (*read_random)(void *, u_int); | ||||
bool (*is_random_seeded)(void); | |||||
} random_reader_context = { | } random_reader_context = { | ||||
(int (*)(struct uio *, bool))nullop, | (int (*)(struct uio *, bool))nullop, | ||||
null_read_random, | null_read_random, | ||||
null_is_random_seeded, | |||||
}; | }; | ||||
struct sx randomdev_config_lock; | struct sx randomdev_config_lock; | ||||
static void | static void | ||||
random_infra_sysinit(void *dummy __unused) | random_infra_sysinit(void *dummy __unused) | ||||
{ | { | ||||
RANDOM_CONFIG_INIT_LOCK(); | RANDOM_CONFIG_INIT_LOCK(); | ||||
} | } | ||||
SYSINIT(random_device_h_init, SI_SUB_RANDOM, SI_ORDER_FIRST, random_infra_sysinit, NULL); | SYSINIT(random_device_h_init, SI_SUB_RANDOM, SI_ORDER_FIRST, random_infra_sysinit, NULL); | ||||
void | void | ||||
random_infra_init(int (*p_random_read_uio)(struct uio *, bool), void (*p_random_read)(void *, u_int)) | random_infra_init(int (*p_random_read_uio)(struct uio *, bool), | ||||
void (*p_random_read)(void *, u_int), | |||||
bool (*p_is_random_seeded)(void)) | |||||
{ | { | ||||
RANDOM_CONFIG_X_LOCK(); | RANDOM_CONFIG_X_LOCK(); | ||||
random_reader_context.read_random_uio = p_random_read_uio; | random_reader_context.read_random_uio = p_random_read_uio; | ||||
random_reader_context.read_random = p_random_read; | random_reader_context.read_random = p_random_read; | ||||
random_reader_context.is_random_seeded = p_is_random_seeded; | |||||
RANDOM_CONFIG_X_UNLOCK(); | RANDOM_CONFIG_X_UNLOCK(); | ||||
} | } | ||||
void | void | ||||
random_infra_uninit(void) | random_infra_uninit(void) | ||||
{ | { | ||||
RANDOM_CONFIG_X_LOCK(); | RANDOM_CONFIG_X_LOCK(); | ||||
random_reader_context.read_random_uio = (int (*)(struct uio *, bool))nullop; | random_reader_context.read_random_uio = (int (*)(struct uio *, bool))nullop; | ||||
random_reader_context.read_random = null_read_random; | random_reader_context.read_random = null_read_random; | ||||
random_reader_context.is_random_seeded = null_is_random_seeded; | |||||
RANDOM_CONFIG_X_UNLOCK(); | RANDOM_CONFIG_X_UNLOCK(); | ||||
} | } | ||||
static void | static void | ||||
random_infra_sysuninit(void *dummy __unused) | random_infra_sysuninit(void *dummy __unused) | ||||
{ | { | ||||
RANDOM_CONFIG_DEINIT_LOCK(); | RANDOM_CONFIG_DEINIT_LOCK(); | ||||
Show All 14 Lines | |||||
void | void | ||||
read_random(void *buf, u_int len) | read_random(void *buf, u_int len) | ||||
{ | { | ||||
RANDOM_CONFIG_S_LOCK(); | RANDOM_CONFIG_S_LOCK(); | ||||
random_reader_context.read_random(buf, len); | random_reader_context.read_random(buf, len); | ||||
RANDOM_CONFIG_S_UNLOCK(); | RANDOM_CONFIG_S_UNLOCK(); | ||||
} | } | ||||
bool | |||||
is_random_seeded(void) | |||||
{ | |||||
RANDOM_CONFIG_S_LOCK(); | |||||
random_reader_context.is_random_seeded(); | |||||
RANDOM_CONFIG_S_UNLOCK(); | |||||
} | |||||
#endif /* defined(RANDOM_LOADABLE) */ | #endif /* defined(RANDOM_LOADABLE) */ |