diff options
author | Jonathan Gray <jsg@cvs.openbsd.org> | 2017-01-10 08:54:15 +0000 |
---|---|---|
committer | Jonathan Gray <jsg@cvs.openbsd.org> | 2017-01-10 08:54:15 +0000 |
commit | 37f1b5d5fe9fff46d0b5fffc16c2569ae4b0b749 (patch) | |
tree | e8351b9b8f58d178e41e90dddbd0f5ff3150591f /sys/dev/acpi | |
parent | 9acc024467fd20d76335114b7d3db3e067e06245 (diff) |
Hyper-V hosts make 64 bytes of entropy available to guests in the form
of a OEM0 ACPI table. acpihve(4) feeds this data into the kernel
entropy pool.
This is less interesting for machines with rdrand, but there are still
pre ivy bridge machines running Hyper-V (including parts of Azure).
ok mikeb@ reyk@ deraadt@ mlarkin@
Diffstat (limited to 'sys/dev/acpi')
-rw-r--r-- | sys/dev/acpi/acpihve.c | 89 | ||||
-rw-r--r-- | sys/dev/acpi/files.acpi | 7 |
2 files changed, 95 insertions, 1 deletions
diff --git a/sys/dev/acpi/acpihve.c b/sys/dev/acpi/acpihve.c new file mode 100644 index 00000000000..6b573a837e6 --- /dev/null +++ b/sys/dev/acpi/acpihve.c @@ -0,0 +1,89 @@ +/* $OpenBSD: acpihve.c,v 1.1 2017/01/10 08:54:14 jsg Exp $ */ + +/* + * Copyright (c) 2017 Jonathan Gray <jsg@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/device.h> + +#include <dev/acpi/acpireg.h> +#include <dev/acpi/acpivar.h> +#include <dev/rndvar.h> + +int acpihve_match(struct device *, void *, void *); +void acpihve_attach(struct device *, struct device *, void *); + +struct acpi_oem0 { + struct acpi_table_header hdr; + uint32_t entropy[16]; +} __packed; + +struct acpihve_softc { + struct device sc_dev; +}; + +struct cfattach acpihve_ca = { + sizeof(struct acpihve_softc), acpihve_match, acpihve_attach +}; + +struct cfdriver acpihve_cd = { + NULL, "acpihve", DV_DULL +}; + +int acpihve_attached; + +int +acpihve_match(struct device *parent, void *match, void *aux) +{ + struct acpi_attach_args *aaa = aux; + struct acpi_table_header *hdr; + + /* + * If we do not have a table, it is not us; attach only once + */ + if (acpihve_attached || aaa->aaa_table == NULL) + return (0); + + hdr = (struct acpi_table_header *)aaa->aaa_table; + if (memcmp(hdr->signature, "OEM0", 4) != 0 || + memcmp(hdr->oemid, "VRTUAL", 6) != 0 || + memcmp(hdr->oemtableid, "MICROSFT", 8) != 0) + return (0); + + return (1); +} + +void +acpihve_attach(struct device *parent, struct device *self, void *aux) +{ + struct acpi_attach_args *aaa = aux; + struct acpi_oem0 *oem0 = (struct acpi_oem0 *)aaa->aaa_table; + int i; + + acpihve_attached++; + + if (oem0->hdr.length != sizeof(*oem0)) { + printf(": unexpected table length %u\n", oem0->hdr.length); + return; + } + + /* 64 bytes of entropy from OEM0 table */ + for (i = 0; i < nitems(oem0->entropy); i++) + add_true_randomness(oem0->entropy[i]); + + printf("\n"); +} diff --git a/sys/dev/acpi/files.acpi b/sys/dev/acpi/files.acpi index 793e623aef3..8c60193dc69 100644 --- a/sys/dev/acpi/files.acpi +++ b/sys/dev/acpi/files.acpi @@ -1,4 +1,4 @@ -# $OpenBSD: files.acpi,v 1.35 2016/08/03 17:23:38 jcs Exp $ +# $OpenBSD: files.acpi,v 1.36 2017/01/10 08:54:14 jsg Exp $ # # Config file and device description for machine-independent ACPI code. # Included by ports that need it. @@ -145,3 +145,8 @@ file dev/acpi/acpials.c acpials device tpm attach tpm at acpi file dev/acpi/tpm.c tpm + +# Hyper-V Entropy +device acpihve +attach acpihve at acpi +file dev/acpi/acpihve.c acpihve |