diff options
author | Gordon Willem Klok <gwk@cvs.openbsd.org> | 2007-04-22 20:17:04 +0000 |
---|---|---|
committer | Gordon Willem Klok <gwk@cvs.openbsd.org> | 2007-04-22 20:17:04 +0000 |
commit | ef87ec7354a7ae7113394a2113b2577f6b76d24c (patch) | |
tree | c5cb8be0fb8fad920a91b53ccf2c3197761c870f /sys/arch/macppc/dev | |
parent | 9f391c7371f8b4356529103026371297ea800551 (diff) |
Add sysbutton a driver for the 'System identifier' button found on the
fornt panel of the xserve (the button with the triangle on it). This driver
will dump you into ddb at the press of a button if the ddb.console sysctl
is set. The bug still has one unresolved issue if ddb.console is not set
and you press and hold the button you will cause a interrupt storm that will
slow the system down. So if you keep your xserve near a toddler or you
yourself are a toddler you might want to consider disabling this device
remember buttons arn't toys.
ok deraadt.
Diffstat (limited to 'sys/arch/macppc/dev')
-rw-r--r-- | sys/arch/macppc/dev/sysbutton.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/sys/arch/macppc/dev/sysbutton.c b/sys/arch/macppc/dev/sysbutton.c new file mode 100644 index 00000000000..a8845a84c5d --- /dev/null +++ b/sys/arch/macppc/dev/sysbutton.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2007 Gordon Willem Klok <gwk@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/types.h> +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/proc.h> +#include <sys/device.h> + +#include <ddb/db_var.h> +#include <dev/ofw/openfirm.h> + +#include <machine/bus.h> +#include <machine/autoconf.h> + +struct sysbutton_softc { + struct device sc_dev; + int sc_node; + int sc_intr; +}; + +int sysbutton_match(struct device *, void *, void *); +void sysbutton_attach(struct device *, struct device *, void *); +int sysbutton_intr(void *); + +struct cfattach sysbutton_ca = { + sizeof(struct sysbutton_softc), sysbutton_match, + sysbutton_attach +}; + +struct cfdriver sysbutton_cd = { + NULL, "sysbutton", DV_DULL +}; + +int +sysbutton_match(struct device *parent, void *arg, void *aux) +{ + struct confargs *ca = aux; + + if (strcmp(ca->ca_name, "indicatorSwitch-gpio") == 0) + return 1; + + return 0; +} + +void +sysbutton_attach(struct device *parent, struct device *self, void *aux) +{ + struct sysbutton_softc *sc = (struct sysbutton_softc *)self; + struct confargs *ca = aux; + int intr[2]; + + sc->sc_node = ca->ca_node; + + OF_getprop(sc->sc_node, "interrupts", intr, sizeof(intr)); + sc->sc_intr = intr[0]; + + printf(": irg %d\n", sc->sc_intr); + + mac_intr_establish(parent, sc->sc_intr, IST_LEVEL, + IPL_NONE, sysbutton_intr, sc, sc->sc_dev.dv_xname); +} + +int +sysbutton_intr(void *v) +{ + + /* + * XXX: Holding this button causes an interrupt storm if + * ddb.console=0. + */ +#ifdef DDB + if (db_console) + Debugger(); +#endif + + return 1; +} |