Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/random/random_harvestq.c
Show All 12 Lines | |||||
struct random_sources { | struct random_sources { | ||||
CK_LIST_ENTRY(random_sources) rrs_entries; | CK_LIST_ENTRY(random_sources) rrs_entries; | ||||
struct random_source *rrs_source; | struct random_source *rrs_source; | ||||
}; | }; | ||||
static CK_LIST_HEAD(sources_head, random_sources) source_list = | static CK_LIST_HEAD(sources_head, random_sources) source_list = | ||||
CK_LIST_HEAD_INITIALIZER(source_list); | CK_LIST_HEAD_INITIALIZER(source_list); | ||||
SYSCTL_NODE(_kern_random, OID_AUTO, harvest, CTLFLAG_RW, 0, | SYSCTL_NODE(_kern_random, OID_AUTO, harvest, CTLFLAG_RW | CTLFLAG_MPSAFE, 0, | ||||
"Entropy Device Parameters"); | "Entropy Device Parameters"); | ||||
/* | /* | ||||
* Put all the harvest queue context stuff in one place. | * Put all the harvest queue context stuff in one place. | ||||
* this make is a bit easier to lock and protect. | * this make is a bit easier to lock and protect. | ||||
*/ | */ | ||||
static struct harvest_context { | static struct harvest_context { | ||||
/* The harvest mutex protects all of harvest_context and | /* The harvest mutex protects all of harvest_context and | ||||
Show All 24 Lines | |||||
/* | /* | ||||
* Disallow userspace modification of pure entropy sources. | * Disallow userspace modification of pure entropy sources. | ||||
*/ | */ | ||||
hc_source_mask = (value & ~user_immutable_mask) | | hc_source_mask = (value & ~user_immutable_mask) | | ||||
(orig_value & user_immutable_mask); | (orig_value & user_immutable_mask); | ||||
return (0); | return (0); | ||||
} | } | ||||
SYSCTL_PROC(_kern_random_harvest, OID_AUTO, mask, CTLTYPE_UINT | CTLFLAG_RW, | SYSCTL_PROC(_kern_random_harvest, OID_AUTO, mask, | ||||
NULL, 0, random_check_uint_harvestmask, "IU", "Entropy harvesting mask"); | CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, NULL, 0, | ||||
random_check_uint_harvestmask, "IU", | |||||
"Entropy harvesting mask"); | |||||
/* ARGSUSED */ | /* ARGSUSED */ | ||||
static int | static int | ||||
random_print_harvestmask(SYSCTL_HANDLER_ARGS) | random_print_harvestmask(SYSCTL_HANDLER_ARGS) | ||||
{ | { | ||||
struct sbuf sbuf; | struct sbuf sbuf; | ||||
int error, i; | int error, i; | ||||
error = sysctl_wire_old_buffer(req, 0); | error = sysctl_wire_old_buffer(req, 0); | ||||
if (error == 0) { | if (error == 0) { | ||||
sbuf_new_for_sysctl(&sbuf, NULL, 128, req); | sbuf_new_for_sysctl(&sbuf, NULL, 128, req); | ||||
for (i = ENTROPYSOURCE - 1; i >= 0; i--) | for (i = ENTROPYSOURCE - 1; i >= 0; i--) | ||||
sbuf_cat(&sbuf, (hc_source_mask & (1 << i)) ? "1" : "0"); | sbuf_cat(&sbuf, (hc_source_mask & (1 << i)) ? "1" : "0"); | ||||
error = sbuf_finish(&sbuf); | error = sbuf_finish(&sbuf); | ||||
sbuf_delete(&sbuf); | sbuf_delete(&sbuf); | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
SYSCTL_PROC(_kern_random_harvest, OID_AUTO, mask_bin, | SYSCTL_PROC(_kern_random_harvest, OID_AUTO, mask_bin, | ||||
CTLTYPE_STRING | CTLFLAG_RD, NULL, 0, random_print_harvestmask, "A", | CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, NULL, 0, | ||||
random_print_harvestmask, "A", | |||||
"Entropy harvesting mask (printable)"); | "Entropy harvesting mask (printable)"); | ||||
static const char *random_source_descr[ENTROPYSOURCE] = { | static const char *random_source_descr[ENTROPYSOURCE] = { | ||||
[RANDOM_CACHED] = "CACHED", | [RANDOM_CACHED] = "CACHED", | ||||
[RANDOM_ATTACH] = "ATTACH", | [RANDOM_ATTACH] = "ATTACH", | ||||
[RANDOM_KEYBOARD] = "KEYBOARD", | [RANDOM_KEYBOARD] = "KEYBOARD", | ||||
[RANDOM_MOUSE] = "MOUSE", | [RANDOM_MOUSE] = "MOUSE", | ||||
[RANDOM_NET_TUN] = "NET_TUN", | [RANDOM_NET_TUN] = "NET_TUN", | ||||
Show All 24 Lines | |||||
first = false; | first = false; | ||||
} | } | ||||
error = sbuf_finish(&sbuf); | error = sbuf_finish(&sbuf); | ||||
sbuf_delete(&sbuf); | sbuf_delete(&sbuf); | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
SYSCTL_PROC(_kern_random_harvest, OID_AUTO, mask_symbolic, | SYSCTL_PROC(_kern_random_harvest, OID_AUTO, mask_symbolic, | ||||
CTLTYPE_STRING | CTLFLAG_RD, NULL, 0, random_print_harvestmask_symbolic, | CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, NULL, 0, | ||||
"A", "Entropy harvesting mask (symbolic)"); | random_print_harvestmask_symbolic, "A", | ||||
"Entropy harvesting mask (symbolic)"); | |||||
/* ARGSUSED */ | /* ARGSUSED */ | ||||
static void | static void | ||||
random_harvestq_init(void *unused __unused) | random_harvestq_init(void *unused __unused) | ||||
{ | { | ||||
static const u_int almost_everything_mask = | static const u_int almost_everything_mask = | ||||
(((1 << (RANDOM_ENVIRONMENTAL_END + 1)) - 1) & | (((1 << (RANDOM_ENVIRONMENTAL_END + 1)) - 1) & | ||||
~_RANDOM_HARVEST_ETHER_OFF & ~_RANDOM_HARVEST_UMA_OFF); | ~_RANDOM_HARVEST_ETHER_OFF & ~_RANDOM_HARVEST_UMA_OFF); | ||||
Show All 12 Lines |