On Tue, Jan 10, 2017 at 02:19:35PM +1100, Jonathan Gray wrote: > Hyper-V hosts make 64 bytes of entropy available to guests in the form > of a OEM0 acpi table. Feed that into the 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). >
This reads ok to me. ok mlarkin@ > Index: sys/dev/acpi/files.acpi > =================================================================== > RCS file: /cvs/src/sys/dev/acpi/files.acpi,v > retrieving revision 1.35 > diff -u -p -r1.35 files.acpi > --- sys/dev/acpi/files.acpi 3 Aug 2016 17:23:38 -0000 1.35 > +++ sys/dev/acpi/files.acpi 9 Jan 2017 12:47:20 -0000 > @@ -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 > Index: sys/arch/amd64/conf/GENERIC > =================================================================== > RCS file: /cvs/src/sys/arch/amd64/conf/GENERIC,v > retrieving revision 1.437 > diff -u -p -r1.437 GENERIC > --- sys/arch/amd64/conf/GENERIC 13 Dec 2016 19:47:32 -0000 1.437 > +++ sys/arch/amd64/conf/GENERIC 9 Jan 2017 12:48:09 -0000 > @@ -67,6 +67,7 @@ sdhc* at acpi? > acpicbkbd* at acpi? > acpials* at acpi? > tpm* at acpi? > +acpihve* at acpi? > > mpbios0 at bios0 > > --- /dev/null Tue Jan 10 13:56:15 2017 > +++ sys/dev/acpi/acpihve.c Tue Jan 10 13:55:28 2017 > @@ -0,0 +1,89 @@ > +/* $OpenBSD$ */ > + > +/* > + * Copyright (c) 2017 Jonathan Gray <[email protected]> > + * > + * 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++; > + > + /* should be 64 bytes of entropy */ > + if (oem0->hdr.length != sizeof(*oem0)) { > + printf(": unexpected table length %u\n", oem0->hdr.length); > + return; > + } > + > + for (i = 0; i < nitems(oem0->entropy); i++) > + add_true_randomness(oem0->entropy[i]); > + > + printf(": added %lu bytes of entropy\n", sizeof(oem0->entropy)); > +} > --- /dev/null Tue Jan 10 13:56:29 2017 > +++ share/man/man4/acpihve.4 Tue Jan 10 13:49:52 2017 > @@ -0,0 +1,38 @@ > +.\" $OpenBSD$ > +.\" > +.\" Copyright (c) 2017 Jonathan Gray <[email protected]> > +.\" > +.\" 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. > +.\" > +.Dd $Mdocdate$ > +.Dt ACPIHVE 4 > +.Os > +.Sh NAME > +.Nm acpihve > +.Nd Hyper-V entropy > +.Sh SYNOPSIS > +.Cd "acpihve* at acpi?" > +.Sh DESCRIPTION > +Hyper-V and Azure hosts make entropy available to guests in a OEM0 acpi > +table. > +The > +.Nm > +driver feeds the entropy into the kernel's entropy pool. > +.Sh SEE ALSO > +.Xr acpi 4 , > +.Xr add_true_randomness 9 > +.Sh HISTORY > +The > +.Nm > +device driver first appeared in > +.Ox 6.1 . > Index: share/man/man4/Makefile > =================================================================== > RCS file: /cvs/src/share/man/man4/Makefile,v > retrieving revision 1.648 > diff -u -p -r1.648 Makefile > --- share/man/man4/Makefile 3 Jan 2017 20:35:46 -0000 1.648 > +++ share/man/man4/Makefile 10 Jan 2017 02:51:28 -0000 > @@ -2,7 +2,7 @@ > > MAN= aac.4 ac97.4 acphy.4 \ > acpi.4 acpiac.4 acpials.4 acpiasus.4 acpibat.4 \ > - acpibtn.4 acpicbkbd.4 acpicpu.4 acpidock.4 \ > + acpibtn.4 acpicbkbd.4 acpicpu.4 acpidock.4 acpihve.4 \ > acpiec.4 acpihpet.4 acpimadt.4 acpimcfg.4 acpiprt.4 acpipwrres.4 \ > acpisony.4 acpithinkpad.4 acpitoshiba.4 acpitimer.4 acpivideo.4 \ > acpivout.4 acpitz.4 \ > Index: share/man/man4/acpi.4 > =================================================================== > RCS file: /cvs/src/share/man/man4/acpi.4,v > retrieving revision 1.51 > diff -u -p -r1.51 acpi.4 > --- share/man/man4/acpi.4 23 Aug 2016 18:58:53 -0000 1.51 > +++ share/man/man4/acpi.4 10 Jan 2017 03:14:53 -0000 > @@ -58,6 +58,8 @@ ACPI docking station > ACPI embedded controller > .It Xr acpihpet 4 > ACPI high precision event timer > +.It Xr acpihve 4 > +Hyper-V entropy > .It Xr acpimadt 4 > ACPI APIC configuration > .It Xr acpimcfg 4 >
