1 /* $OpenBSD: acpihve.c,v 1.3 2020/05/29 04:42:24 deraadt Exp $ */ 2 3 /* 4 * Copyright (c) 2017 Jonathan Gray <jsg@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #include <sys/param.h> 20 #include <sys/systm.h> 21 #include <sys/device.h> 22 23 #include <dev/acpi/acpireg.h> 24 #include <dev/acpi/acpivar.h> 25 26 int acpihve_match(struct device *, void *, void *); 27 void acpihve_attach(struct device *, struct device *, void *); 28 29 struct acpi_oem0 { 30 struct acpi_table_header hdr; 31 uint32_t entropy[16]; 32 } __packed; 33 34 struct acpihve_softc { 35 struct device sc_dev; 36 }; 37 38 struct cfattach acpihve_ca = { 39 sizeof(struct acpihve_softc), acpihve_match, acpihve_attach 40 }; 41 42 struct cfdriver acpihve_cd = { 43 NULL, "acpihve", DV_DULL 44 }; 45 46 int acpihve_attached; 47 48 int 49 acpihve_match(struct device *parent, void *match, void *aux) 50 { 51 struct acpi_attach_args *aaa = aux; 52 struct acpi_table_header *hdr; 53 54 /* 55 * If we do not have a table, it is not us; attach only once 56 */ 57 if (acpihve_attached || aaa->aaa_table == NULL) 58 return (0); 59 60 hdr = (struct acpi_table_header *)aaa->aaa_table; 61 if (memcmp(hdr->signature, "OEM0", 4) != 0 || 62 memcmp(hdr->oemid, "VRTUAL", 6) != 0 || 63 memcmp(hdr->oemtableid, "MICROSFT", 8) != 0) 64 return (0); 65 66 return (1); 67 } 68 69 void 70 acpihve_attach(struct device *parent, struct device *self, void *aux) 71 { 72 struct acpi_attach_args *aaa = aux; 73 struct acpi_oem0 *oem0 = (struct acpi_oem0 *)aaa->aaa_table; 74 int i; 75 76 acpihve_attached++; 77 78 if (oem0->hdr.length != sizeof(*oem0)) { 79 printf(": unexpected table length %u\n", oem0->hdr.length); 80 return; 81 } 82 83 /* 64 bytes of entropy from OEM0 table */ 84 for (i = 0; i < nitems(oem0->entropy); i++) 85 enqueue_randomness(oem0->entropy[i]); 86 87 printf("\n"); 88 } 89