Date: Fri, 9 Apr 2004 09:41:48 -0700 (PDT) From: Warner Losh <imp@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 50721 for review Message-ID: <200404091641.i39GfmEv080406@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=50721 Change 50721 by imp@imp_pacopaco on 2004/04/09 09:41:42 IFC @50716 Affected files ... .. //depot/projects/power/sys/conf/files#9 integrate .. //depot/projects/power/sys/dev/acpica/acpi.c#17 integrate .. //depot/projects/power/sys/dev/acpica/acpi_package.c#3 integrate .. //depot/projects/power/sys/dev/acpica/acpi_pci.c#11 integrate .. //depot/projects/power/sys/dev/acpica/acpi_pcib_acpi.c#3 integrate .. //depot/projects/power/sys/dev/acpica/acpi_powerres.c#3 integrate .. //depot/projects/power/sys/dev/acpica/acpi_thermal.c#6 integrate .. //depot/projects/power/sys/dev/acpica/acpivar.h#10 integrate .. //depot/projects/power/sys/dev/md/md.c#9 integrate .. //depot/projects/power/sys/dev/pci/pci.c#10 integrate .. //depot/projects/power/sys/dev/pci/pci_pci.c#8 integrate .. //depot/projects/power/sys/dev/pci/pci_private.h#6 integrate .. //depot/projects/power/sys/dev/random/harvest.c#4 integrate .. //depot/projects/power/sys/dev/random/hash.c#3 integrate .. //depot/projects/power/sys/dev/random/hash.h#2 integrate .. //depot/projects/power/sys/dev/random/nehemiah.c#1 branch .. //depot/projects/power/sys/dev/random/nehemiah.h#1 branch .. //depot/projects/power/sys/dev/random/probe.c#1 branch .. //depot/projects/power/sys/dev/random/randomdev.c#4 integrate .. //depot/projects/power/sys/dev/random/randomdev.h#3 integrate .. //depot/projects/power/sys/dev/random/randomdev_soft.c#1 branch .. //depot/projects/power/sys/dev/random/randomdev_soft.h#1 branch .. //depot/projects/power/sys/dev/random/yarrow.c#3 integrate .. //depot/projects/power/sys/dev/random/yarrow.h#2 integrate .. //depot/projects/power/sys/i386/i386/identcpu.c#5 integrate .. //depot/projects/power/sys/kern/kern_linker.c#4 integrate .. //depot/projects/power/sys/kern/sched_ule.c#8 integrate .. //depot/projects/power/sys/kern/uipc_socket.c#9 integrate .. //depot/projects/power/sys/modules/random/Makefile#2 integrate .. //depot/projects/power/sys/sys/wait.h#4 integrate Differences ... ==== //depot/projects/power/sys/conf/files#9 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/files,v 1.882 2004/04/08 18:17:13 mlaier Exp $ +# $FreeBSD: src/sys/conf/files,v 1.883 2004/04/09 15:47:10 markm Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -608,6 +608,9 @@ dev/puc/pucdata.c optional puc pci dev/random/harvest.c standard dev/random/randomdev.c optional random +dev/random/randomdev_soft.c optional random +dev/random/nehemiah.c optional random +dev/random/probe.c optional random dev/random/yarrow.c optional random dev/random/hash.c optional random crypto/rijndael/rijndael-alg-fst.c optional random ==== //depot/projects/power/sys/dev/acpica/acpi.c#17 (text+ko) ==== @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/acpica/acpi.c,v 1.135 2004/04/08 16:45:12 njl Exp $ + * $FreeBSD: src/sys/dev/acpica/acpi.c,v 1.136 2004/04/09 06:40:03 njl Exp $ */ #include "opt_acpi.h" @@ -1993,9 +1993,11 @@ acpi_device_enable_wake_event(ACPI_HANDLE h) { struct acpi_softc *sc; + uint32_t gpe_bit, lowest_wake; + ACPI_HANDLE handle; ACPI_STATUS status; ACPI_BUFFER prw_buffer; - ACPI_OBJECT *res; + ACPI_OBJECT *res, *res2; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); @@ -2004,67 +2006,72 @@ return; /* - * _PRW object is only required for devices that have the ability - * to wake the system from a system sleeping state. + * The _PRW object (7.2.9) is only required for devices that have the + * ability to wake the system from a sleeping state. */ + prw_buffer.Pointer = NULL; prw_buffer.Length = ACPI_ALLOCATE_BUFFER; status = AcpiEvaluateObject(h, "_PRW", NULL, &prw_buffer); if (ACPI_FAILURE(status)) return; - res = (ACPI_OBJECT *)prw_buffer.Pointer; if (res == NULL) return; - - if ((res->Type != ACPI_TYPE_PACKAGE) || (res->Package.Count < 2)) { + if (!ACPI_PKG_VALID(res, 2)) goto out; - } /* - * The element 1 of the _PRW object: - * The lowest power system sleeping state that can be entered - * while still providing wake functionality. - * The sleeping state being entered must be greater or equal to - * the power state declared in element 1 of the _PRW object. + * Element 1 of the _PRW object: + * The lowest power system sleeping state that can be entered while still + * providing wake functionality. The sleeping state being entered must + * be less than (i.e., higher power) or equal to this value. */ - if (res->Package.Elements[1].Type != ACPI_TYPE_INTEGER) + if (acpi_PkgInt32(res, 1, &lowest_wake) != 0) goto out; - - if (sc->acpi_sstate > res->Package.Elements[1].Integer.Value) + if (sc->acpi_sstate > lowest_wake) goto out; /* - * The element 0 of the _PRW object: + * Element 0 of the _PRW object: */ - switch(res->Package.Elements[0].Type) { + switch (res->Package.Elements[0].Type) { case ACPI_TYPE_INTEGER: - /* + /* * If the data type of this package element is numeric, then this * _PRW package element is the bit index in the GPEx_EN, in the * GPE blocks described in the FADT, of the enable bit that is * enabled for the wake event. */ - - status = AcpiEnableGpe(NULL, res->Package.Elements[0].Integer.Value, - ACPI_EVENT_WAKE_ENABLE); + gpe_bit = res->Package.Elements[0].Integer.Value; + status = AcpiEnableGpe(NULL, gpe_bit, ACPI_EVENT_WAKE_ENABLE); if (ACPI_FAILURE(status)) - printf("%s: EnableEvent Failed\n", __func__); + printf("wake enable: AcpiEnableGpe failed for %u\n", + gpe_bit); break; case ACPI_TYPE_PACKAGE: /* - * XXX TBD - * * If the data type of this package element is a package, then this * _PRW package element is itself a package containing two - * elements. The first is an object reference to the GPE Block + * elements. The first is an object reference to the GPE Block * device that contains the GPE that will be triggered by the wake - * event. The second element is numeric and it contains the bit + * event. The second element is numeric and it contains the bit * index in the GPEx_EN, in the GPE Block referenced by the * first element in the package, of the enable bit that is enabled for * the wake event. + * * For example, if this field is a package then it is of the form: * Package() {\_SB.PCI0.ISA.GPE, 2} */ + res2 = &res->Package.Elements[0]; + if (!ACPI_PKG_VALID(res2, 2)) + goto out; + handle = acpi_GetReference(NULL, &res2->Package.Elements[0]); + if (handle == NULL || acpi_PkgInt32(res2, 1, &gpe_bit) != 0) + goto out; + status = AcpiEnableGpe(handle, gpe_bit, ACPI_EVENT_WAKE_ENABLE); + if (ACPI_FAILURE(status)) + printf("wake enable: AcpiEnableGpe (package) failed for %u\n", + gpe_bit); break; default: break; ==== //depot/projects/power/sys/dev/acpica/acpi_package.c#3 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/acpica/acpi_package.c,v 1.2 2003/12/23 18:26:53 njl Exp $ + * $FreeBSD: src/sys/dev/acpica/acpi_package.c,v 1.3 2004/04/09 06:40:03 njl Exp $ */ #include <sys/param.h> @@ -123,3 +123,34 @@ return (0); } + +ACPI_HANDLE +acpi_GetReference(ACPI_HANDLE scope, ACPI_OBJECT *obj) +{ + ACPI_HANDLE h; + + if (obj == NULL) + return (NULL); + + switch (obj->Type) { + case ACPI_TYPE_LOCAL_REFERENCE: + case ACPI_TYPE_ANY: + h = obj->Reference.Handle; + break; + case ACPI_TYPE_STRING: + /* + * The String object usually contains a fully-qualified path, so + * scope can be NULL. + * + * XXX This may not always be the case. + */ + if (ACPI_FAILURE(AcpiGetHandle(scope, obj->String.Pointer, &h))) + h = NULL; + break; + default: + h = NULL; + break; + } + + return (h); +} ==== //depot/projects/power/sys/dev/acpica/acpi_pci.c#11 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci.c,v 1.10 2004/04/07 19:42:21 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci.c,v 1.11 2004/04/09 15:44:34 imp Exp $"); #include "opt_bus.h" @@ -87,7 +87,7 @@ DEVMETHOD(bus_probe_nomatch, pci_probe_nomatch), DEVMETHOD(bus_read_ivar, acpi_pci_read_ivar), DEVMETHOD(bus_write_ivar, pci_write_ivar), - DEVMETHOD(bus_driver_added, bus_generic_driver_added), + DEVMETHOD(bus_driver_added, pci_driver_added), DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), ==== //depot/projects/power/sys/dev/acpica/acpi_pcib_acpi.c#3 (text+ko) ==== @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/acpica/acpi_pcib_acpi.c,v 1.30 2004/03/03 18:34:42 njl Exp $ + * $FreeBSD: src/sys/dev/acpica/acpi_pcib_acpi.c,v 1.31 2004/04/09 15:44:34 imp Exp $ */ #include "opt_acpi.h" #include <sys/param.h> @@ -70,6 +70,10 @@ u_int32_t data, int bytes); static int acpi_pcib_acpi_route_interrupt(device_t pcib, device_t dev, int pin); +static struct resource *acpi_pcib_acpi_alloc_resource(device_t dev, + device_t child, int type, int *rid, + u_long start, u_long end, u_long count, + u_int flags); static device_method_t acpi_pcib_acpi_methods[] = { /* Device interface */ @@ -83,7 +87,7 @@ DEVMETHOD(bus_print_child, bus_generic_print_child), DEVMETHOD(bus_read_ivar, acpi_pcib_read_ivar), DEVMETHOD(bus_write_ivar, acpi_pcib_write_ivar), - DEVMETHOD(bus_alloc_resource, bus_generic_alloc_resource), + DEVMETHOD(bus_alloc_resource, acpi_pcib_acpi_alloc_resource), DEVMETHOD(bus_release_resource, bus_generic_release_resource), DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), @@ -289,3 +293,20 @@ sc = device_get_softc(pcib); return (acpi_pcib_route_interrupt(pcib, dev, pin, &sc->ap_prt)); } + +struct resource * +acpi_pcib_acpi_alloc_resource(device_t dev, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + /* + * If no memory preference is given, use upper 256MB slot most + * bioses use for their memory window. Typically other bridges + * before us get in the way to assert their preferences on memory. + * Hardcoding like this sucks, so a more MD/MI way needs to be + * found to do it. + */ + if (type == SYS_RES_MEMORY && start == 0UL && end == ~0UL) + start = 0xf0000000; + return (bus_generic_alloc_resource(dev, child, type, rid, start, end, + count, flags)); +} ==== //depot/projects/power/sys/dev/acpica/acpi_powerres.c#3 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_powerres.c,v 1.19 2004/03/03 18:34:42 njl Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_powerres.c,v 1.20 2004/04/09 06:55:50 njl Exp $"); #include "opt_acpi.h" #include <sys/param.h> @@ -488,30 +488,10 @@ ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - /* check the object type */ - switch (obj->Type) { - case ACPI_TYPE_ANY: - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "building reference from %s to %s\n", - acpi_name(pc->ac_consumer), - acpi_name(obj->Reference.Handle))); - res = obj->Reference.Handle; - break; - case ACPI_TYPE_STRING: - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "building reference from %s to %s\n", - acpi_name(pc->ac_consumer), obj->String.Pointer)); - - /* Get the handle of the resource */ - status = AcpiGetHandle(NULL, obj->String.Pointer, &res); - if (ACPI_FAILURE(status)) { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, - "couldn't find power resource %s\n", - obj->String.Pointer)); - return_VOID; - } - break; - default: + res = acpi_GetReference(NULL, obj); + if (res == NULL) { ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, - "can't create a power reference for object type %d\n", + "can't create a power reference for object type %d\n", obj->Type)); return_VOID; } ==== //depot/projects/power/sys/dev/acpica/acpi_thermal.c#6 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.40 2004/03/05 18:06:31 njl Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.41 2004/04/09 06:55:50 njl Exp $"); #include "opt_acpi.h" #include <sys/param.h> @@ -550,38 +550,27 @@ static void acpi_tz_switch_cooler_off(ACPI_OBJECT *obj, void *arg) { - ACPI_HANDLE cooler; + struct acpi_tz_softc *sc = (struct acpi_tz_softc *)arg; + ACPI_HANDLE cooler; + ACPI_STATUS status; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); ACPI_ASSERTLOCK; - switch(obj->Type) { - case ACPI_TYPE_ANY: - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "called to turn %s off\n", - acpi_name(obj->Reference.Handle))); + cooler = acpi_GetReference(NULL, obj); + if (cooler == NULL) { + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "can't get handle\n")); + return_VOID; + } - acpi_pwr_switch_consumer(obj->Reference.Handle, ACPI_STATE_D3); - break; - case ACPI_TYPE_STRING: - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "called to turn %s off\n", - obj->String.Pointer)); - - /* - * Find the handle for the device and turn it off. - * The String object here seems to contain a fully-qualified path, so we - * don't have to search for it in our parents. - * - * XXX This may not always be the case. - */ - if (ACPI_SUCCESS(AcpiGetHandle(NULL, obj->String.Pointer, &cooler))) - acpi_pwr_switch_consumer(cooler, ACPI_STATE_D3); - break; - default: - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, - "called to handle unsupported object type %d\n", - obj->Type)); - break; + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "called to turn %s off\n", + acpi_name(cooler))); + status = acpi_pwr_switch_consumer(cooler, ACPI_STATE_D3); + if (ACPI_FAILURE(status)) { + ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev), + "failed to deactivate %s - %s\n", acpi_name(cooler), + AcpiFormatException(status)); } return_VOID; @@ -591,7 +580,7 @@ * Given an object, verify that it's a reference to a device of some sort, * and try to switch it on. * - * XXX replication of off/on function code is bad, mmmkay? + * XXX replication of off/on function code is bad. */ static void acpi_tz_switch_cooler_on(ACPI_OBJECT *obj, void *arg) @@ -604,47 +593,19 @@ ACPI_ASSERTLOCK; - switch(obj->Type) { - case ACPI_TYPE_ANY: - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "called to turn %s on\n", - acpi_name(obj->Reference.Handle))); + cooler = acpi_GetReference(NULL, obj); + if (cooler == NULL) { + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "can't get handle\n")); + return_VOID; + } - status = acpi_pwr_switch_consumer(obj->Reference.Handle, ACPI_STATE_D0); - if (ACPI_FAILURE(status)) { - ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev), - "failed to activate %s - %s\n", - acpi_name(obj->Reference.Handle), - AcpiFormatException(status)); - } - break; - case ACPI_TYPE_STRING: - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "called to turn %s on\n", - obj->String.Pointer)); - - /* - * Find the handle for the device and turn it off. - * The String object here seems to contain a fully-qualified path, so we - * don't have to search for it in our parents. - * - * XXX This may not always be the case. - */ - if (ACPI_SUCCESS(AcpiGetHandle(NULL, obj->String.Pointer, &cooler))) { - status = acpi_pwr_switch_consumer(cooler, ACPI_STATE_D0); - if (ACPI_FAILURE(status)) { - ACPI_VPRINT(sc->tz_dev, - acpi_device_get_parent_softc(sc->tz_dev), - "failed to activate %s - %s\n", - obj->String.Pointer, AcpiFormatException(status)); - } - } else { - ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev), - "couldn't find %s\n", obj->String.Pointer); - } - break; - default: - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "unsupported object type %d\n", - obj->Type)); - break; + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "called to turn %s on\n", + acpi_name(cooler))); + status = acpi_pwr_switch_consumer(cooler, ACPI_STATE_D0); + if (ACPI_FAILURE(status)) { + ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev), + "failed to activate %s - %s\n", acpi_name(cooler), + AcpiFormatException(status)); } return_VOID; ==== //depot/projects/power/sys/dev/acpica/acpivar.h#10 (text+ko) ==== @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/acpica/acpivar.h,v 1.59 2004/04/01 04:21:33 njl Exp $ + * $FreeBSD: src/sys/dev/acpica/acpivar.h,v 1.60 2004/04/09 06:53:50 njl Exp $ */ #include "bus_if.h" @@ -361,6 +361,7 @@ int acpi_PkgStr(ACPI_OBJECT *res, int idx, void *dst, size_t size); int acpi_PkgGas(device_t dev, ACPI_OBJECT *res, int idx, int *rid, struct resource **dst); +ACPI_HANDLE acpi_GetReference(ACPI_HANDLE scope, ACPI_OBJECT *obj); #if __FreeBSD_version >= 500000 #ifndef ACPI_MAX_THREADS ==== //depot/projects/power/sys/dev/md/md.c#9 (text+ko) ==== @@ -6,7 +6,7 @@ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp * ---------------------------------------------------------------------------- * - * $FreeBSD: src/sys/dev/md/md.c,v 1.121 2004/04/07 20:45:57 imp Exp $ + * $FreeBSD: src/sys/dev/md/md.c,v 1.122 2004/04/09 05:12:47 imp Exp $ * */ @@ -19,6 +19,10 @@ * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * + * This code is derived from software contributed to Berkeley by + * the Systems Programming Group of the University of Utah Computer + * Science Department. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: ==== //depot/projects/power/sys/dev/pci/pci.c#10 (text+ko) ==== @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/pci/pci.c,v 1.237 2003/12/24 02:01:22 imp Exp $ + * $FreeBSD: src/sys/dev/pci/pci.c,v 1.238 2004/04/09 15:44:33 imp Exp $ * */ ==== //depot/projects/power/sys/dev/pci/pci_pci.c#8 (text+ko) ==== @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/pci/pci_pci.c,v 1.30 2004/01/17 21:54:04 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/pci/pci_pci.c,v 1.31 2004/04/09 15:44:34 imp Exp $"); /* * PCI:PCI bridge support. @@ -321,7 +321,7 @@ } } else { ok = 1; -#if 0 +#if 1 if (start < sc->iobase && end > sc->iolimit) { start = sc->iobase; end = sc->iolimit; @@ -377,7 +377,7 @@ } } else if (!ok) { ok = 1; /* subtractive bridge: always ok */ -#if 0 +#if 1 if (pcib_is_nonprefetch_open(sc)) { if (start < sc->membase && end > sc->memlimit) { start = sc->membase; ==== //depot/projects/power/sys/dev/pci/pci_private.h#6 (text+ko) ==== @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/pci/pci_private.h,v 1.11 2003/09/17 08:32:44 iwasaki Exp $ + * $FreeBSD: src/sys/dev/pci/pci_private.h,v 1.12 2004/04/09 15:44:34 imp Exp $ * */ ==== //depot/projects/power/sys/dev/random/harvest.c#4 (text+ko) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000, 2001, 2002, 2003 Mark R V Murray + * Copyright (c) 2000-2004 Mark R V Murray * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/random/harvest.c,v 1.22 2004/03/05 22:42:17 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/random/harvest.c,v 1.23 2004/04/09 15:47:09 markm Exp $"); #include <sys/param.h> #include <sys/kthread.h> @@ -37,29 +37,29 @@ #include <sys/queue.h> #include <sys/random.h> #include <sys/selinfo.h> +#include <sys/systm.h> #include <sys/sysctl.h> -#include <sys/systm.h> #include <machine/cpu.h> -#include <dev/random/randomdev.h> +#include <dev/random/randomdev_soft.h> static int read_random_phony(void *, int); /* Structure holding the desired entropy sources */ -struct harvest_select harvest = { 0, 0, 0 }; +struct harvest_select harvest = { 0, 0, 0, 0 }; /* hold the address of the routine which is actually called if * the randomdev is loaded */ -static void (*reap_func)(u_int64_t, void *, u_int, u_int, u_int, enum esource) - = NULL; +static void (*reap_func)(u_int64_t, const void *, u_int, u_int, u_int, + enum esource) = NULL; static int (*read_func)(void *, int) = read_random_phony; /* Initialise the harvester at load time */ void -random_init_harvester(void (*reaper)(u_int64_t, void *, u_int, u_int, u_int, - enum esource), int (*reader)(void *, int)) +random_yarrow_init_harvester(void (*reaper)(u_int64_t, const void *, u_int, + u_int, u_int, enum esource), int (*reader)(void *, int)) { reap_func = reaper; read_func = reader; @@ -67,7 +67,7 @@ /* Deinitialise the harvester at unload time */ void -random_deinit_harvester(void) +random_yarrow_deinit_harvester(void) { reap_func = NULL; read_func = read_random_phony; @@ -91,7 +91,7 @@ int read_random(void *buf, int count) { - return (*read_func)(buf, count); + return ((*read_func)(buf, count)); } /* If the entropy device is not loaded, make a token effort to @@ -109,13 +109,11 @@ /* Fill buf[] with random(9) output */ for (i = 0; i < count; i+= (int)sizeof(u_long)) { randval = random(); - size = (count - i) < (int)sizeof(u_long) - ? (count - i) - : sizeof(u_long); + size = MIN(count - i, sizeof(u_long)); memcpy(&((char *)buf)[i], &randval, (size_t)size); } - return count; + return (count); } /* Helper routine to enable kthread_exit() to work while the module is ==== //depot/projects/power/sys/dev/random/hash.c#3 (text+ko) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000, 2001, 2002, 2003 Mark R V Murray + * Copyright (c) 2000-2004 Mark R V Murray * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/random/hash.c,v 1.11 2003/11/17 23:02:21 markm Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/random/hash.c,v 1.12 2004/04/09 15:47:09 markm Exp $"); #include <sys/param.h> #include <sys/systm.h> ==== //depot/projects/power/sys/dev/random/hash.h#2 (text+ko) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000 Mark R V Murray + * Copyright (c) 2000-2004 Mark R V Murray * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,7 +23,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/random/hash.h,v 1.4 2002/07/15 13:58:35 markm Exp $ + * $FreeBSD: src/sys/dev/random/hash.h,v 1.5 2004/04/09 15:47:09 markm Exp $ */ #define KEYSIZE 32 /* (in bytes) 32 bytes == 256 bits */ ==== //depot/projects/power/sys/dev/random/randomdev.c#4 (text+ko) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000, 2001, 2002, 2003 Mark R V Murray + * Copyright (c) 2000-2004 Mark R V Murray * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/random/randomdev.c,v 1.48 2004/02/21 21:10:45 phk Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/random/randomdev.c,v 1.49 2004/04/09 15:47:09 markm Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -41,9 +41,7 @@ #include <sys/mutex.h> #include <sys/poll.h> #include <sys/proc.h> -#include <sys/random.h> #include <sys/selinfo.h> -#include <sys/sysctl.h> #include <sys/uio.h> #include <sys/unistd.h> #include <sys/vnode.h> @@ -53,150 +51,96 @@ #include <dev/random/randomdev.h> -static d_close_t random_close; -static d_read_t random_read; -static d_write_t random_write; -static d_ioctl_t random_ioctl; -static d_poll_t random_poll; - #define RANDOM_MINOR 0 -#define RANDOM_FIFO_MAX 256 /* How many events to queue up */ +static d_close_t random_close; +static d_read_t random_read; +static d_write_t random_write; +static d_ioctl_t random_ioctl; +static d_poll_t random_poll; static struct cdevsw random_cdevsw = { - .d_version = D_VERSION, - .d_flags = D_NEEDGIANT, - .d_close = random_close, - .d_read = random_read, - .d_write = random_write, - .d_ioctl = random_ioctl, - .d_poll = random_poll, - .d_name = "random", + .d_version = D_VERSION, + .d_close = random_close, + .d_read = random_read, + .d_write = random_write, + .d_ioctl = random_ioctl, + .d_poll = random_poll, + .d_name = "random", }; -static void random_kthread(void *); -static void random_harvest_internal(u_int64_t, void *, u_int, u_int, u_int, enum esource); -static void random_write_internal(void *, int); +static void *random_buf; -MALLOC_DEFINE(M_ENTROPY, "entropy", "Entropy harvesting buffers"); - -/* Lockable FIFO queue holding entropy buffers */ -struct entropyfifo { - struct mtx lock; - int count; - STAILQ_HEAD(harvestlist, harvest) head; -}; - -/* Empty entropy buffers */ -static struct entropyfifo emptyfifo; -#define EMPTYBUFFERS 1024 - -/* Harvested entropy */ -static struct entropyfifo harvestfifo[ENTROPYSOURCE]; - -static struct random_systat { - u_int seeded; /* 0 causes blocking 1 allows normal output */ - struct selinfo rsel; /* For poll(2) */ -} random_systat; +struct random_systat random_systat; -/* <0 to end the kthread, 0 to let it run */ -static int random_kthread_control = 0; - -static struct proc *random_kthread_proc; - /* For use with make_dev(9)/destroy_dev(9). */ -static dev_t random_dev; +static dev_t random_dev; -/* ARGSUSED */ -static int -random_check_boolean(SYSCTL_HANDLER_ARGS) +/* Used to fake out unused random calls in random_systat */ +void +random_null_func(void) { - if (oidp->oid_arg1 != NULL && *(u_int *)(oidp->oid_arg1) != 0) - *(u_int *)(oidp->oid_arg1) = 1; - return sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req); } -SYSCTL_NODE(_kern, OID_AUTO, random, CTLFLAG_RW, - 0, "Random Number Generator"); -SYSCTL_NODE(_kern_random, OID_AUTO, sys, CTLFLAG_RW, - 0, "Entropy Device Parameters"); -SYSCTL_PROC(_kern_random_sys, OID_AUTO, seeded, - CTLTYPE_INT|CTLFLAG_RW, &random_systat.seeded, 1, - random_check_boolean, "I", "Seeded State"); -SYSCTL_NODE(_kern_random_sys, OID_AUTO, harvest, CTLFLAG_RW, - 0, "Entropy Sources"); -SYSCTL_PROC(_kern_random_sys_harvest, OID_AUTO, ethernet, - CTLTYPE_INT|CTLFLAG_RW, &harvest.ethernet, 0, - random_check_boolean, "I", "Harvest NIC entropy"); -SYSCTL_PROC(_kern_random_sys_harvest, OID_AUTO, point_to_point, - CTLTYPE_INT|CTLFLAG_RW, &harvest.point_to_point, 0, - random_check_boolean, "I", "Harvest serial net entropy"); -SYSCTL_PROC(_kern_random_sys_harvest, OID_AUTO, interrupt, - CTLTYPE_INT|CTLFLAG_RW, &harvest.interrupt, 0, - random_check_boolean, "I", "Harvest IRQ entropy"); -SYSCTL_PROC(_kern_random_sys_harvest, OID_AUTO, swi, - CTLTYPE_INT|CTLFLAG_RW, &harvest.swi, 0, - random_check_boolean, "I", "Harvest SWI entropy"); - /* ARGSUSED */ static int -random_close(dev_t dev __unused, int flags, int fmt __unused, struct thread *td) +random_close(dev_t dev __unused, int flags, int fmt __unused, + struct thread *td) { - if (flags & FWRITE) { - if (suser(td) == 0 && securelevel_gt(td->td_ucred, 0) == 0) - random_reseed(); + if ((flags & FWRITE) && (suser(td) == 0) + && (securelevel_gt(td->td_ucred, 0) == 0)) { + mtx_lock(&random_systat.lock); + (*random_systat.reseed)(); + random_systat.seeded = 1; + mtx_unlock(&random_systat.lock); } - return 0; + return (0); } /* ARGSUSED */ static int random_read(dev_t dev __unused, struct uio *uio, int flag) { - int c, ret; - int error = 0; - void *random_buf; + int c, error = 0; - while (!random_systat.seeded) { + /* Blocking logic */ + while (!random_systat.seeded && !error) { if (flag & IO_NDELAY) - error = EWOULDBLOCK; + error = EWOULDBLOCK; else - error = tsleep(&random_systat, PUSER|PCATCH, - "block", 0); - if (error != 0) - return error; + error = tsleep(&random_systat, + PUSER | PCATCH, "block", 0); } - c = uio->uio_resid < PAGE_SIZE ? uio->uio_resid : PAGE_SIZE; - random_buf = (void *)malloc((u_long)c, M_TEMP, M_WAITOK); - while (uio->uio_resid > 0 && error == 0) { - ret = read_random_real(random_buf, c); - error = uiomove(random_buf, ret, uio); + + /* The actual read */ + if (!error) { + mtx_lock(&random_systat.lock); + while (uio->uio_resid > 0 && !error) { + c = MIN(uio->uio_resid, PAGE_SIZE); + c = (*random_systat.read)(random_buf, c); + error = uiomove(random_buf, c, uio); + } + mtx_unlock(&random_systat.lock); } - free(random_buf, M_TEMP); - return error; + return (error); } /* ARGSUSED */ static int random_write(dev_t dev __unused, struct uio *uio, int flag __unused) { - int c; - int error; - void *random_buf; + int c, error = 0; - error = 0; - random_buf = (void *)malloc(PAGE_SIZE, M_TEMP, M_WAITOK); + mtx_lock(&random_systat.lock); while (uio->uio_resid > 0) { - c = (int)(uio->uio_resid < PAGE_SIZE - ? uio->uio_resid - : PAGE_SIZE); + c = MIN((int)uio->uio_resid, PAGE_SIZE); error = uiomove(random_buf, c, uio); if (error) break; - random_write_internal(random_buf, c); + (*random_systat.write)(random_buf, c); } - free(random_buf, M_TEMP); - return error; + mtx_unlock(&random_systat.lock); + return (error); } /* ARGSUSED */ @@ -204,264 +148,70 @@ random_ioctl(dev_t dev __unused, u_long cmd, caddr_t addr __unused, int flags __unused, struct thread *td __unused) { + int error = 0; + switch (cmd) { - /* Really handled in upper layer */ + /* Really handled in upper layer */ case FIOASYNC: case FIONBIO: - return 0; + break; default: - return ENOTTY; + error = ENOTTY; } + return (error); } /* ARGSUSED */ static int random_poll(dev_t dev __unused, int events, struct thread *td) { - int revents; + int revents = 0; - revents = 0; if (events & (POLLIN | POLLRDNORM)) { if (random_systat.seeded) revents = events & (POLLIN | POLLRDNORM); else selrecord(td, &random_systat.rsel); } - return revents; + return (revents); } /* ARGSUSED */ static int random_modevent(module_t mod __unused, int type, void *data __unused) { - int error, i; - struct harvest *np; + int error = 0; - switch(type) { + switch (type) { case MOD_LOAD: - random_init(); + random_buf = (void *)malloc(PAGE_SIZE, M_TEMP, M_WAITOK); + random_ident_hardware(&random_systat); + mtx_init(&random_systat.lock, "entropy device lock", + NULL, MTX_DEF); + (*random_systat.init)(); - /* This can be turned off by the very paranoid - * a reseed will turn it back on. - */ - random_systat.seeded = 1; + printf("random: <entropy source, %s>\n", random_systat.ident); - /* Initialise the harvest fifos */ >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200404091641.i39GfmEv080406>
