Implement a new generic mechanism for attaching handler functions to

events, in order to pave the way for removing a number of the ad-hoc
implementations currently in use.

Retire the at_shutdown family of functions and replace them with
new event handler lists.

Rework kern_shutdown.c to take greater advantage of the use of event
handlers.

Reviewed by:	green
This commit is contained in:
Mike Smith 1999-08-21 06:24:40 +00:00
parent 2a67fa4383
commit fcb893a801
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=50107
30 changed files with 496 additions and 263 deletions

View File

@ -25,7 +25,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: scsi_da.c,v 1.32 1999/08/14 11:40:31 phk Exp $
* $Id: scsi_da.c,v 1.33 1999/08/15 23:34:40 mjacob Exp $
*/
#include "opt_hw_wdog.h"
@ -38,6 +38,7 @@
#include <sys/dkbad.h>
#include <sys/disklabel.h>
#include <sys/diskslice.h>
#include <sys/eventhandler.h>
#include <sys/malloc.h>
#include <sys/conf.h>
#include <sys/cons.h>
@ -198,7 +199,7 @@ static void daprevent(struct cam_periph *periph, int action);
static void dasetgeom(struct cam_periph *periph,
struct scsi_read_capacity_data * rdcap);
static timeout_t dasendorderedtag;
static void dashutdown(int howto, void *arg);
static void dashutdown(void *arg, int howto);
#ifndef DA_DEFAULT_TIMEOUT
#define DA_DEFAULT_TIMEOUT 60 /* Timeout in seconds */
@ -815,7 +816,6 @@ dainit(void)
printf("da: Failed to attach master async callback "
"due to status 0x%x!\n", status);
} else {
int err;
/* If we were successfull, register our devsw */
cdevsw_add(&da_cdevsw);
@ -827,9 +827,10 @@ dainit(void)
timeout(dasendorderedtag, NULL,
(DA_DEFAULT_TIMEOUT * hz) / DA_ORDEREDTAG_INTERVAL);
if ((err = at_shutdown(dashutdown, NULL,
SHUTDOWN_POST_SYNC)) != 0)
printf("dainit: at_shutdown returned %d!\n", err);
/* Register our shutdown event handler */
if ((EVENTHANDLER_REGISTER(shutdown_post_sync, dashutdown,
NULL, SHUTDOWN_PRI_DEFAULT)) == NULL)
printf("dainit: shutdown event registration failed!\n");
}
}
@ -1553,7 +1554,7 @@ dasendorderedtag(void *arg)
* sync the disk cache to physical media.
*/
static void
dashutdown(int howto, void *arg)
dashutdown(void * arg, int howto)
{
struct cam_periph *periph;
struct da_softc *softc;

View File

@ -306,6 +306,7 @@ kern/subr_bus.c standard
kern/subr_devstat.c standard
kern/subr_diskslice.c standard
kern/subr_dkbad.c standard
kern/subr_eventhandler.c standard
kern/subr_log.c standard
kern/subr_module.c standard
kern/subr_prf.c standard

View File

@ -36,7 +36,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: aic7xxx.c,v 1.31 1999/05/23 18:55:58 gibbs Exp $
* $Id: aic7xxx.c,v 1.32 1999/08/16 22:49:28 gibbs Exp $
*/
/*
* A few notes on features of the driver.
@ -96,6 +96,7 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
#include <sys/eventhandler.h>
#include <sys/buf.h>
#include <sys/proc.h>
@ -209,7 +210,7 @@ static bus_dmamap_callback_t ahcdmamapcb;
#if UNUSED
static void ahc_dump_targcmd(struct target_cmd *cmd);
#endif
static void ahc_shutdown(int howto, void *arg);
static void ahc_shutdown(void *arg, int howto);
static cam_status
ahc_find_tmode_devs(struct ahc_softc *ahc,
struct cam_sim *sim, union ccb *ccb,
@ -4291,7 +4292,7 @@ ahc_init(struct ahc_softc *ahc)
ahc_loadseq(ahc);
/* We have to wait until after any system dumps... */
at_shutdown(ahc_shutdown, ahc, SHUTDOWN_FINAL);
EVENTHANDLER_REGISTER(shutdown_final, ahc_shutdown, ahc, SHUTDOWN_PRI_DEFAULT);
return (0);
}
@ -6436,7 +6437,7 @@ ahc_dump_targcmd(struct target_cmd *cmd)
#endif
static void
ahc_shutdown(int howto, void *arg)
ahc_shutdown(void *arg, int howto)
{
struct ahc_softc *ahc;
int i;

View File

@ -5126,7 +5126,7 @@ static struct pci_device dedevice = {
COMPAT_PCI_DRIVER(de, dedevice);
static void
tulip_shutdown(int howto, void *arg)
tulip_shutdown(void *arg, int howto)
{
tulip_softc_t * const sc = arg;
TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
@ -5313,7 +5313,8 @@ tulip_pci_attach(pcici_t config_id, int unit)
return;
}
}
at_shutdown(tulip_shutdown, sc, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, tulip_shutdown, sc,
SHUTDOWN_PRI_DEFAULT);
#if defined(TULIP_USE_SOFTINTR)
if (sc->tulip_unit > tulip_softintr_max_unit)
tulip_softintr_max_unit = sc->tulip_unit;

View File

@ -43,7 +43,7 @@
* arrays that span controllers (Wow!).
*/
#ident "$Id: dpt_scsi.c,v 1.23 1999/05/06 20:16:22 ken Exp $"
#ident "$Id: dpt_scsi.c,v 1.24 1999/08/16 01:49:35 gibbs Exp $"
#define _DPT_C_
@ -155,7 +155,7 @@ static void dptprocesserror(dpt_softc_t *dpt, dpt_ccb_t *dccb,
u_int scsi_stat, u_int32_t resid);
static void dpttimeout(void *arg);
static void dptshutdown(int howto, void *arg);
static void dptshutdown(void *arg, int howto);
/* ================= Private Inline Function definitions ====================*/
static __inline int
@ -1407,7 +1407,8 @@ dpt_attach(dpt_softc_t *dpt)
}
if (i > 0)
at_shutdown(dptshutdown, dpt, SHUTDOWN_FINAL);
EVENTHANDLER_REGISTER(shutdown_final, dptshutdown,
dpt, SHUTDOWN_PRI_DEFAULT);
return (i);
}
@ -1639,10 +1640,10 @@ dpttimeout(void *arg)
/*
* Shutdown the controller and ensure that the cache is completely flushed.
* Called via at_shutdown(9) after all disk access has completed.
* Called from the shutdown_final event after all disk access has completed.
*/
static void
dptshutdown(int howto, void *arg)
dptshutdown(void *arg, int howto)
{
dpt_softc_t *dpt;

View File

@ -70,7 +70,7 @@
static void en_pci_attach __P((pcici_t, int));
static const char *en_pci_probe __P((pcici_t, pcidi_t));
static void en_pci_shutdown __P((int, void *));
static void en_pci_shutdown __P((void *, int));
/*
* local structures
@ -266,7 +266,8 @@ int unit;
* doing so could allow DMA to corrupt kernel memory during the
* reboot before the driver initializes.
*/
at_shutdown(en_pci_shutdown, scp, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, en_pci_shutdown, scp,
SHUTDOWN_PRI_DEFAULT);
if (!pci_map_int(config_id, en_intr, (void *) sc, &net_imask)) {
printf("%s: couldn't establish interrupt\n", sc->sc_dev.dv_xname);
@ -304,8 +305,8 @@ int unit;
static void
en_pci_shutdown(
int howto,
void *sc)
void *sc,
int howto)
{
struct en_pci_softc *psc = (struct en_pci_softc *)sc;

View File

@ -23,7 +23,7 @@
* Copies of this Software may be made, however, the above copyright
* notice must be reproduced on all copies.
*
* @(#) $Id: eni.c,v 1.7 1999/05/09 17:07:27 peter Exp $
* @(#) $Id: eni.c,v 1.8 1999/05/10 22:53:41 mks Exp $
*
*/
@ -42,7 +42,7 @@
#include <dev/hea/eni_var.h>
#ifndef lint
__RCSID("@(#) $Id: eni.c,v 1.7 1999/05/09 17:07:27 peter Exp $");
__RCSID("@(#) $Id: eni.c,v 1.8 1999/05/10 22:53:41 mks Exp $");
#endif
/*
@ -57,7 +57,7 @@ static void eni_read_seeprom __P((Eni_unit *));
#if BSD < 199506
static int eni_pci_shutdown __P((struct kern_devconf *, int));
#else
static void eni_pci_shutdown __P((int, void *));
static void eni_pci_shutdown __P((void *, int));
#endif
static void eni_pci_reset __P((Eni_unit *));
#endif /* __FreeBSD__ */
@ -549,7 +549,9 @@ eni_pci_attach ( pcici_t config_id, int unit )
/*
* Add hook to out shutdown function
*/
at_shutdown ( (bootlist_fn)eni_pci_shutdown, eup, SHUTDOWN_POST_SYNC );
EVENTHANDLER_REGISTER(shutdown_post_sync, eni_pci_shutdown, eup,
SHUTDOWN_PRI_DEFAULT);
#endif
/*
@ -654,9 +656,9 @@ eni_pci_shutdown ( kdc, force )
*
*/
static void
eni_pci_shutdown ( howto, eup )
int howto;
eni_pci_shutdown ( eup, howto )
void *eup;
int howto;
{
/* Do device reset */

View File

@ -23,7 +23,7 @@
* Copies of this Software may be made, however, the above copyright
* notice must be reproduced on all copies.
*
* @(#) $Id: fore_load.c,v 1.8 1999/05/10 22:53:45 mks Exp $
* @(#) $Id: fore_load.c,v 1.9 1999/05/30 16:51:25 phk Exp $
*
*/
@ -38,7 +38,7 @@
#include <dev/hfa/fore_include.h>
#ifndef lint
__RCSID("@(#) $Id: fore_load.c,v 1.8 1999/05/10 22:53:45 mks Exp $");
__RCSID("@(#) $Id: fore_load.c,v 1.9 1999/05/30 16:51:25 phk Exp $");
#endif
@ -59,7 +59,7 @@ static void fore_pci_attach __P((pcici_t, int));
#if BSD < 199506
static int fore_pci_shutdown __P((struct kern_devconf *, int));
#else
static void fore_pci_shutdown __P((int, void *));
static void fore_pci_shutdown __P((void *, int));
#endif
#endif
static void fore_unattach __P((Fore_unit *));
@ -1055,7 +1055,8 @@ fore_pci_attach(config_id, unit)
/*
* Add hook to our shutdown function
*/
at_shutdown(fore_pci_shutdown, fup, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, fore_pci_shutdown, fup,
SHUTDOWN_PRI_DEFAULT);
#endif
/*
@ -1125,9 +1126,9 @@ fore_pci_shutdown(kdc, force)
*
*/
static void
fore_pci_shutdown(howto, fup)
int howto;
fore_pci_shutdown(fup, howto)
void *fup;
int howto;
{
fore_reset((Fore_unit *) fup);

View File

@ -47,7 +47,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: if_ie.c,v 1.64 1999/08/20 14:12:13 mdodd Exp $
* $Id: if_ie.c,v 1.65 1999/08/20 14:36:40 mdodd Exp $
*/
/*
@ -190,7 +190,7 @@ static void ee16_eeprom_outbits(struct ie_softc * ie, int edata, int cnt);
static void ee16_eeprom_clock(struct ie_softc * ie, int state);
static u_short ee16_read_eeprom(struct ie_softc * ie, int location);
static int ee16_eeprom_inbits(struct ie_softc * ie);
static void ee16_shutdown(int howto, void *sc);
static void ee16_shutdown(void *sc, int howto);
static void iereset(int unit);
static void ie_readframe(int unit, struct ie_softc * ie, int bufno);
@ -550,7 +550,7 @@ ni_probe(struct isa_device *dvp)
static void
ee16_shutdown(int howto, void *sc)
ee16_shutdown(void *sc, int howto)
{
struct ie_softc *ie = (struct ie_softc *)sc;
int unit = ie - &ie_softc[0];
@ -832,7 +832,8 @@ ieattach(struct isa_device *dvp)
ifp->if_hdrlen = 14;
if (ie->hard_type == IE_EE16)
at_shutdown(ee16_shutdown, ie, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, ee16_shutdown,
ie, SHUTDOWN_PRI_DEFAULT);
#if NBPF > 0
bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header));

View File

@ -21,7 +21,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.
*
* $Id: if_fpa.c,v 1.9 1999/04/24 20:14:00 peter Exp $
* $Id: if_fpa.c,v 1.10 1999/05/09 17:06:54 peter Exp $
*
*/
@ -128,7 +128,7 @@ pdq_pci_ifintr(
#endif /* __FreeBSD && BSD */
#if defined(__FreeBSD__)
static void pdq_pci_shutdown(int, void *);
static void pdq_pci_shutdown(void *, int);
/*
* This is the PCI configuration support. Since the PDQ is available
@ -192,14 +192,15 @@ pdq_pci_attach(
pdqs_pci[unit] = sc;
pdq_ifattach(sc, pdq_pci_ifwatchdog);
pci_map_int(config_id, pdq_pci_ifintr, (void*) sc, &net_imask);
at_shutdown(pdq_pci_shutdown, (void *) sc, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, pdq_pci_shutdown, sc,
SHUTDOWN_PRI_DEFAULT);
}
static void
pdq_pci_shutdown(
int howto,
void *sc)
void *sc,
int howto)
{
pdq_hwreset(((pdq_softc_t *)sc)->sc_pdq);
}

View File

@ -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.
*
* $Id: syscons.c,v 1.317 1999/08/13 16:17:54 dt Exp $
* $Id: syscons.c,v 1.318 1999/08/17 22:06:17 billf Exp $
*/
#include "sc.h"
@ -39,6 +39,7 @@
#if NSC > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/eventhandler.h>
#include <sys/reboot.h>
#include <sys/conf.h>
#include <sys/proc.h>
@ -140,7 +141,7 @@ static void scinit(int unit, int flags);
#if __i386__
static void scterm(int unit, int flags);
#endif
static void scshutdown(int howto, void *arg);
static void scshutdown(void *arg, int howto);
static u_int scgetc(sc_softc_t *sc, u_int flags);
#define SCGETC_CN 1
#define SCGETC_NONBLOCK 2
@ -359,7 +360,8 @@ sc_attach_unit(int unit, int flags)
/* register a shutdown callback for the kernel console */
if (sc_console_unit == unit)
at_shutdown(scshutdown, (void *)(uintptr_t)unit, SHUTDOWN_PRE_SYNC);
EVENTHANDLER_REGISTER(shutdown_pre_sync, scshutdown,
(void *)(uintptr_t)unit, SHUTDOWN_PRI_DEFAULT);
/*
* syscons's cdevsw must be registered from here. As syscons and
@ -3380,7 +3382,7 @@ scterm(int unit, int flags)
#endif
static void
scshutdown(int howto, void *arg)
scshutdown(void *arg, int howto)
{
/* assert(sc_console != NULL) */

View File

@ -1,5 +1,5 @@
/* $OpenBSD: if_tx.c,v 1.3 1998/10/10 04:30:09 jason Exp $ */
/* $Id: if_tx.c,v 1.28 1999/07/03 20:17:05 peter Exp $ */
/* $Id: if_tx.c,v 1.29 1999/07/06 19:23:30 des Exp $ */
/*-
* Copyright (c) 1997 Semen Ustimenko (semen@iclub.nsu.ru)
@ -378,7 +378,7 @@ epic_shutdown(
static const char* epic_freebsd_probe __P((pcici_t, pcidi_t));
static void epic_freebsd_attach __P((pcici_t, int));
static void epic_shutdown __P((int, void *));
static void epic_shutdown __P((void *, int));
/* Global variables */
static u_long epic_pci_count;
@ -546,7 +546,8 @@ epic_freebsd_attach(
}
/* Set shut down routine to stop DMA processes on reboot */
at_shutdown(epic_shutdown, sc, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, epic_shutdown, sc,
SHUTDOWN_PRI_DEFAULT);
/* Attach to if manager */
if_attach(ifp);
@ -565,8 +566,8 @@ epic_freebsd_attach(
static void
epic_shutdown(
int howto,
void *sc)
void *sc,
int howto)
{
epic_stop(sc);
}

View File

@ -44,14 +44,14 @@
#include <dev/vx/if_vxreg.h>
static void vx_pci_shutdown(int, void *);
static void vx_pci_shutdown(void *, int);
static const char *vx_pci_probe(pcici_t, pcidi_t);
static void vx_pci_attach(pcici_t, int unit);
static void
vx_pci_shutdown(
int howto,
void *sc)
void *sc,
int howto)
{
vxstop(sc);
vxfree(sc);
@ -122,7 +122,8 @@ vx_pci_attach(
* doing do could allow DMA to corrupt kernel memory during the
* reboot before the driver initializes.
*/
at_shutdown(vx_pci_shutdown, sc, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, vx_pci_shutdown, sc,
SHUTDOWN_PRI_DEFAULT);
pci_map_int(config_id, vxintr, (void *) sc, &net_imask);
}

View File

@ -29,7 +29,7 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: if_wi.c,v 1.7 1999/07/04 14:40:22 wpaul Exp $
* $Id: if_wi.c,v 1.8 1999/07/06 19:22:53 des Exp $
*/
/*
@ -116,7 +116,7 @@
#if !defined(lint)
static const char rcsid[] =
"$Id: if_wi.c,v 1.7 1999/07/04 14:40:22 wpaul Exp $";
"$Id: if_wi.c,v 1.8 1999/07/06 19:22:53 des Exp $";
#endif
static struct wi_softc wi_softc[NWI];
@ -136,7 +136,7 @@ static void wi_init __P((void *));
static void wi_start __P((struct ifnet *));
static void wi_stop __P((struct wi_softc *));
static void wi_watchdog __P((struct ifnet *));
static void wi_shutdown __P((int, void *));
static void wi_shutdown __P((void *, int));
static void wi_rxeof __P((struct wi_softc *));
static void wi_txeof __P((struct wi_softc *, int));
static void wi_update_stats __P((struct wi_softc *));
@ -367,7 +367,8 @@ static int wi_attach(isa_dev)
bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header));
#endif
at_shutdown(wi_shutdown, sc, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, wi_shutdown, sc,
SHUTDOWN_PRI_DEFAULT);
}
return(0);
@ -1336,9 +1337,9 @@ static void wi_watchdog(ifp)
return;
}
static void wi_shutdown(howto, arg)
int howto;
static void wi_shutdown(arg, howto)
void *arg;
int howto;
{
struct wi_softc *sc;

View File

@ -15,13 +15,14 @@
*
* Sep, 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD)
*
* $Id: apm.c,v 1.98 1999/08/02 18:46:34 msmith Exp $
* $Id: apm.c,v 1.99 1999/08/14 18:39:40 iwasaki Exp $
*/
#include "opt_devfs.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/eventhandler.h>
#include <sys/conf.h>
#include <sys/kernel.h>
#ifdef DEVFS
@ -302,7 +303,7 @@ apm_display(int newstate)
* Turn off the entire system.
*/
static void
apm_power_off(int howto, void *junk)
apm_power_off(void *junk, int howto)
{
struct apm_softc *sc = &apm_softc;
@ -1047,7 +1048,8 @@ apm_attach(device_t dev)
apm_hook_establish(APM_HOOK_RESUME , &sc->sc_resume);
/* Power the system off using APM */
at_shutdown_pri(apm_power_off, NULL, SHUTDOWN_FINAL, SHUTDOWN_PRI_LAST);
EVENTHANDLER_REGISTER(shutdown_final, apm_power_off, NULL,
SHUTDOWN_PRI_LAST);
sc->initialized = 1;

View File

@ -15,13 +15,14 @@
*
* Sep, 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD)
*
* $Id: apm.c,v 1.98 1999/08/02 18:46:34 msmith Exp $
* $Id: apm.c,v 1.99 1999/08/14 18:39:40 iwasaki Exp $
*/
#include "opt_devfs.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/eventhandler.h>
#include <sys/conf.h>
#include <sys/kernel.h>
#ifdef DEVFS
@ -302,7 +303,7 @@ apm_display(int newstate)
* Turn off the entire system.
*/
static void
apm_power_off(int howto, void *junk)
apm_power_off(void *junk, int howto)
{
struct apm_softc *sc = &apm_softc;
@ -1047,7 +1048,8 @@ apm_attach(device_t dev)
apm_hook_establish(APM_HOOK_RESUME , &sc->sc_resume);
/* Power the system off using APM */
at_shutdown_pri(apm_power_off, NULL, SHUTDOWN_FINAL, SHUTDOWN_PRI_LAST);
EVENTHANDLER_REGISTER(shutdown_final, apm_power_off, NULL,
SHUTDOWN_PRI_LAST);
sc->initialized = 1;

View File

@ -47,7 +47,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: if_ie.c,v 1.64 1999/08/20 14:12:13 mdodd Exp $
* $Id: if_ie.c,v 1.65 1999/08/20 14:36:40 mdodd Exp $
*/
/*
@ -190,7 +190,7 @@ static void ee16_eeprom_outbits(struct ie_softc * ie, int edata, int cnt);
static void ee16_eeprom_clock(struct ie_softc * ie, int state);
static u_short ee16_read_eeprom(struct ie_softc * ie, int location);
static int ee16_eeprom_inbits(struct ie_softc * ie);
static void ee16_shutdown(int howto, void *sc);
static void ee16_shutdown(void *sc, int howto);
static void iereset(int unit);
static void ie_readframe(int unit, struct ie_softc * ie, int bufno);
@ -550,7 +550,7 @@ ni_probe(struct isa_device *dvp)
static void
ee16_shutdown(int howto, void *sc)
ee16_shutdown(void *sc, int howto)
{
struct ie_softc *ie = (struct ie_softc *)sc;
int unit = ie - &ie_softc[0];
@ -832,7 +832,8 @@ ieattach(struct isa_device *dvp)
ifp->if_hdrlen = 14;
if (ie->hard_type == IE_EE16)
at_shutdown(ee16_shutdown, ie, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, ee16_shutdown,
ie, SHUTDOWN_PRI_DEFAULT);
#if NBPF > 0
bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header));

View File

@ -29,7 +29,7 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: if_wi.c,v 1.7 1999/07/04 14:40:22 wpaul Exp $
* $Id: if_wi.c,v 1.8 1999/07/06 19:22:53 des Exp $
*/
/*
@ -116,7 +116,7 @@
#if !defined(lint)
static const char rcsid[] =
"$Id: if_wi.c,v 1.7 1999/07/04 14:40:22 wpaul Exp $";
"$Id: if_wi.c,v 1.8 1999/07/06 19:22:53 des Exp $";
#endif
static struct wi_softc wi_softc[NWI];
@ -136,7 +136,7 @@ static void wi_init __P((void *));
static void wi_start __P((struct ifnet *));
static void wi_stop __P((struct wi_softc *));
static void wi_watchdog __P((struct ifnet *));
static void wi_shutdown __P((int, void *));
static void wi_shutdown __P((void *, int));
static void wi_rxeof __P((struct wi_softc *));
static void wi_txeof __P((struct wi_softc *, int));
static void wi_update_stats __P((struct wi_softc *));
@ -367,7 +367,8 @@ static int wi_attach(isa_dev)
bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header));
#endif
at_shutdown(wi_shutdown, sc, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, wi_shutdown, sc,
SHUTDOWN_PRI_DEFAULT);
}
return(0);
@ -1336,9 +1337,9 @@ static void wi_watchdog(ifp)
return;
}
static void wi_shutdown(howto, arg)
int howto;
static void wi_shutdown(arg, howto)
void *arg;
int howto;
{
struct wi_softc *sc;

View File

@ -23,12 +23,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: kern_module.c,v 1.17 1999/05/08 13:01:57 peter Exp $
* $Id: kern_module.c,v 1.18 1999/05/20 00:00:58 peter Exp $
*/
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/systm.h>
#include <sys/eventhandler.h>
#include <sys/malloc.h>
#include <sys/sysproto.h>
#include <sys/sysent.h>
@ -56,19 +57,20 @@ struct module {
static modulelist_t modules;
static int nextid = 1;
static void module_shutdown(int, void*);
static void module_shutdown(void*, int);
static void
module_init(void* arg)
{
TAILQ_INIT(&modules);
at_shutdown(module_shutdown, 0, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, module_shutdown, NULL,
SHUTDOWN_PRI_DEFAULT);
}
SYSINIT(module, SI_SUB_KLD, SI_ORDER_FIRST, module_init, 0);
static void
module_shutdown(int arg1, void* arg2)
module_shutdown(void* arg1, int arg2)
{
module_t mod;

View File

@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)kern_shutdown.c 8.3 (Berkeley) 1/21/94
* $Id: kern_shutdown.c,v 1.59 1999/08/11 14:02:20 alfred Exp $
* $Id: kern_shutdown.c,v 1.60 1999/08/13 10:29:21 phk Exp $
*/
#include "opt_ddb.h"
@ -46,6 +46,7 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/eventhandler.h>
#include <sys/buf.h>
#include <sys/reboot.h>
#include <sys/proc.h>
@ -107,34 +108,26 @@ watchdog_tickle_fn wdog_tickler = NULL;
*/
const char *panicstr;
/*
* callout list for things to do a shutdown
*/
typedef struct shutdown_list_element {
LIST_ENTRY(shutdown_list_element) links;
bootlist_fn function;
void *arg;
int priority;
} *sle_p;
/*
* There are three shutdown lists. Some things need to be shut down
* earlier than others.
*/
LIST_HEAD(shutdown_list, shutdown_list_element);
static struct shutdown_list shutdown_lists[SHUTDOWN_FINAL + 1];
static void boot __P((int)) __dead2;
static void dumpsys __P((void));
static int setdumpdev __P((dev_t dev));
static void poweroff_wait __P((void *, int));
static void shutdown_halt __P((void *junk, int howto));
static void shutdown_panic __P((void *junk, int howto));
static void shutdown_reset __P((void *junk, int howto));
/* register various local shutdown events */
static void
shutdown_conf(void *unused)
{
EVENTHANDLER_REGISTER(shutdown_final, poweroff_wait, NULL, SHUTDOWN_PRI_FIRST);
EVENTHANDLER_REGISTER(shutdown_final, shutdown_halt, NULL, SHUTDOWN_PRI_LAST + 100);
EVENTHANDLER_REGISTER(shutdown_final, shutdown_panic, NULL, SHUTDOWN_PRI_LAST + 100);
EVENTHANDLER_REGISTER(shutdown_final, shutdown_reset, NULL, SHUTDOWN_PRI_LAST + 200);
}
SYSINIT(shutdown_conf, SI_SUB_INTRINSIC, SI_ORDER_ANY, shutdown_conf, NULL)
#ifndef _SYS_SYSPROTO_H_
struct reboot_args {
int opt;
};
#endif
/* ARGSUSED */
/*
@ -181,7 +174,6 @@ static void
boot(howto)
int howto;
{
sle_p ep;
#ifdef SMP
if (smp_active) {
@ -191,8 +183,7 @@ boot(howto)
/*
* Do any callouts that should be done BEFORE syncing the filesystems.
*/
LIST_FOREACH(ep, &shutdown_lists[SHUTDOWN_PRE_SYNC], links)
(*ep->function)(howto, ep->arg);
EVENTHANDLER_INVOKE(shutdown_pre_sync, howto);
/*
* Now sync filesystems
@ -282,8 +273,7 @@ boot(howto)
* Ok, now do things that assume all filesystem activity has
* been completed.
*/
LIST_FOREACH(ep, &shutdown_lists[SHUTDOWN_POST_SYNC], links)
(*ep->function)(howto, ep->arg);
EVENTHANDLER_INVOKE(shutdown_post_sync, howto);
splhigh();
if ((howto & (RB_HALT|RB_DUMP)) == RB_DUMP && !cold) {
savectx(&dumppcb);
@ -294,9 +284,18 @@ boot(howto)
}
/* Now that we're going to really halt the system... */
LIST_FOREACH(ep, &shutdown_lists[SHUTDOWN_FINAL], links)
(*ep->function)(howto, ep->arg);
EVENTHANDLER_INVOKE(shutdown_final, howto);
for(;;) ; /* safety against shutdown_reset not working */
/* NOTREACHED */
}
/*
* If the shutdown was a clean halt, behave accordingly.
*/
static void
shutdown_halt(void *junk, int howto)
{
if (howto & RB_HALT) {
printf("\n");
printf("The operating system has halted.\n");
@ -309,12 +308,21 @@ boot(howto)
howto &= ~RB_HALT;
break;
}
} else if (howto & RB_DUMP) {
/* System Paniced */
}
}
/*
* Check to see if the system paniced, pause and then reboot
* according to the specified delay.
*/
static void
shutdown_panic(void *junk, int howto)
{
int loop;
if (howto & RB_DUMP) {
if (PANIC_REBOOT_WAIT_TIME != 0) {
if (PANIC_REBOOT_WAIT_TIME != -1) {
int loop;
printf("Automatic reboot in %d seconds - "
"press a key on the console to abort\n",
PANIC_REBOOT_WAIT_TIME);
@ -326,21 +334,27 @@ boot(howto)
break;
}
if (!loop)
goto die;
return;
}
} else { /* zero time specified - reboot NOW */
goto die;
return;
}
printf("--> Press a key on the console to reboot <--\n");
cngetc();
}
die:
}
/*
* Everything done, now reset
*/
static void
shutdown_reset(void *junk, int howto)
{
printf("Rebooting...\n");
DELAY(1000000); /* wait 1 sec for printf's to complete and be read */
/* cpu_boot(howto); */ /* doesn't do anything at the moment */
cpu_reset();
for(;;) ;
/* NOTREACHED */
/* NOTREACHED */ /* assuming reset worked */
}
/*
@ -515,90 +529,6 @@ panic(const char *fmt, ...)
boot(bootopt);
}
/*
* Three routines to handle adding/deleting items on the
* shutdown callout lists
*
* at_shutdown():
* Take the arguments given and put them onto the shutdown callout list.
* However first make sure that it's not already there.
* returns 0 on success.
*/
int
at_shutdown(bootlist_fn function, void *arg, int queue)
{
return(at_shutdown_pri(function, arg, queue, SHUTDOWN_PRI_DEFAULT));
}
/*
* at_shutdown_pri():
* Take the arguments given and put them onto the shutdown callout list
* with the given execution priority.
* returns 0 on success.
*/
int
at_shutdown_pri(bootlist_fn function, void *arg, int queue, int pri)
{
sle_p op, ep, ip;
op = NULL; /* shut up gcc */
if (queue < SHUTDOWN_PRE_SYNC
|| queue > SHUTDOWN_FINAL) {
printf("at_shutdown: bad exit callout queue %d specified\n",
queue);
return (EINVAL);
}
if (rm_at_shutdown(function, arg))
printf("at_shutdown: exit callout entry was already present\n");
ep = malloc(sizeof(*ep), M_TEMP, M_NOWAIT);
if (ep == NULL)
return (ENOMEM);
ep->function = function;
ep->arg = arg;
ep->priority = pri;
/* Sort into list of items on this queue */
ip = LIST_FIRST(&shutdown_lists[queue]);
if (ip == NULL) {
LIST_INSERT_HEAD(&shutdown_lists[queue], ep, links);
} else {
for (; ip != NULL; op = ip, ip = LIST_NEXT(ip, links)) {
if (ep->priority < ip->priority) {
LIST_INSERT_BEFORE(ip, ep, links);
ep = NULL;
break;
}
}
if (ep != NULL)
LIST_INSERT_AFTER(op, ep, links);
}
return (0);
}
/*
* Scan the exit callout lists for the given items and remove them.
* Returns the number of items removed.
*/
int
rm_at_shutdown(bootlist_fn function, void *arg)
{
sle_p ep;
int count;
int queue;
count = 0;
for (queue = SHUTDOWN_PRE_SYNC; queue < SHUTDOWN_FINAL; queue++) {
LIST_FOREACH(ep, &shutdown_lists[queue], links) {
if ((ep->function == function) && (ep->arg == arg)) {
LIST_REMOVE(ep, links);
free(ep, M_TEMP);
count++;
}
}
}
return (count);
}
/*
* Support for poweroff delay.
*/
@ -606,19 +536,10 @@ static int poweroff_delay = 0;
SYSCTL_INT(_kern_shutdown, OID_AUTO, poweroff_delay, CTLFLAG_RW,
&poweroff_delay, 0, "");
static void poweroff_wait(int howto, void *unused)
static void
poweroff_wait(void *junk, int howto)
{
if(!(howto & RB_POWEROFF) || poweroff_delay <= 0)
return;
DELAY(poweroff_delay * 1000);
}
/*
* XXX OK? This implies I know SHUTDOWN_PRI_LAST > SHUTDOWN_PRI_FIRST
*/
static void poweroff_conf(void *unused)
{
at_shutdown_pri(poweroff_wait, NULL, SHUTDOWN_FINAL, SHUTDOWN_PRI_FIRST);
}
SYSINIT(poweroff_conf, SI_SUB_INTRINSIC, SI_ORDER_ANY, poweroff_conf, NULL)

View File

@ -0,0 +1,140 @@
/*-
* Copyright (c) 1999 Michael Smith <msmith@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id$
*/
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/systm.h>
#include <sys/eventhandler.h>
MALLOC_DEFINE(M_EVENTHANDLER, "eventhandler", "Event handler records");
/* List of 'slow' lists */
static TAILQ_HEAD(, eventhandler_list) eventhandler_lists;
static int eventhandler_lists_initted = 0;
struct eventhandler_entry_generic
{
struct eventhandler_entry ee;
void (* func)(void);
};
/*
* Insertion is O(n) due to the priority scan, but optimises to O(1)
* if all priorities are identical.
*/
eventhandler_tag
eventhandler_register(struct eventhandler_list *list, char *name,
void *func, void *arg, int priority)
{
struct eventhandler_entry_generic *eg;
struct eventhandler_entry *ep;
/* avoid the need for a SYSINIT just to init the list */
if (!eventhandler_lists_initted) {
TAILQ_INIT(&eventhandler_lists);
eventhandler_lists_initted = 1;
}
/* Do we need to find/create the (slow) list? */
if (list == NULL) {
/* look for a matching, existing list */
list = eventhandler_find_list(name);
/* Do we need to create the list? */
if (list == NULL) {
if ((list = malloc(sizeof(struct eventhandler_list) + strlen(name) + 1,
M_EVENTHANDLER, M_NOWAIT)) == NULL)
return(NULL);
list->el_flags = 0;
list->el_name = (char *)list + sizeof(struct eventhandler_list);
strcpy(list->el_name, name);
TAILQ_INSERT_HEAD(&eventhandler_lists, list, el_link);
}
}
if (!(list->el_flags & EHE_INITTED)) {
TAILQ_INIT(&list->el_entries);
list->el_flags = EHE_INITTED;
}
/* allocate an entry for this handler, populate it */
if ((eg = malloc(sizeof(struct eventhandler_entry_generic),
M_EVENTHANDLER, M_NOWAIT)) == NULL)
return(NULL);
eg->func = func;
eg->ee.ee_arg = arg;
eg->ee.ee_priority = priority;
/* sort it into the list */
for (ep = TAILQ_FIRST(&list->el_entries);
ep != NULL;
ep = TAILQ_NEXT(ep, ee_link)) {
if (eg->ee.ee_priority < ep->ee_priority) {
TAILQ_INSERT_BEFORE(ep, &eg->ee, ee_link);
break;
}
}
if (ep == NULL)
TAILQ_INSERT_TAIL(&list->el_entries, &eg->ee, ee_link);
return(&eg->ee);
}
void
eventhandler_deregister(struct eventhandler_list *list, eventhandler_tag tag)
{
struct eventhandler_entry *ep = tag;
/* XXX insert diagnostic check here? */
if (ep != NULL) {
/* remove just this entry */
TAILQ_REMOVE(&list->el_entries, ep, ee_link);
free(ep, M_EVENTHANDLER);
} else {
/* remove entire list */
while (!TAILQ_EMPTY(&list->el_entries)) {
ep = TAILQ_FIRST(&list->el_entries);
TAILQ_REMOVE(&list->el_entries, list->el_entries.tqh_first, ee_link);
free(ep, M_EVENTHANDLER);
}
}
}
struct eventhandler_list *
eventhandler_find_list(char *name)
{
struct eventhandler_list *list;
/* scan looking for the requested list */
for (list = TAILQ_FIRST(&eventhandler_lists);
list != NULL;
list = TAILQ_NEXT(list, el_link)) {
if (!strcmp(name, list->el_name))
break;
}
return(list);
}

View File

@ -29,7 +29,7 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: if_al.c,v 1.5 1999/07/02 04:17:12 peter Exp $
* $Id: if_al.c,v 1.6 1999/07/06 19:23:22 des Exp $
*/
/*
@ -90,7 +90,7 @@
#ifndef lint
static const char rcsid[] =
"$Id: if_al.c,v 1.5 1999/07/02 04:17:12 peter Exp $";
"$Id: if_al.c,v 1.6 1999/07/06 19:23:22 des Exp $";
#endif
/*
@ -137,7 +137,7 @@ static int al_ioctl __P((struct ifnet *, u_long, caddr_t));
static void al_init __P((void *));
static void al_stop __P((struct al_softc *));
static void al_watchdog __P((struct ifnet *));
static void al_shutdown __P((int, void *));
static void al_shutdown __P((void *, int));
static int al_ifmedia_upd __P((struct ifnet *));
static void al_ifmedia_sts __P((struct ifnet *, struct ifmediareq *));
@ -1069,7 +1069,8 @@ al_attach(config_id, unit)
#if NBPF > 0
bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header));
#endif
at_shutdown(al_shutdown, sc, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, al_shutdown, sc,
SHUTDOWN_PRI_DEFAULT);
fail:
splx(s);
@ -1976,9 +1977,9 @@ static void al_stop(sc)
* Stop all chip I/O so that the kernel's probe routines don't
* get confused by errant DMAs when rebooting.
*/
static void al_shutdown(howto, arg)
int howto;
static void al_shutdown(arg, howto)
void *arg;
int howto;
{
struct al_softc *sc = (struct al_softc *)arg;

View File

@ -5126,7 +5126,7 @@ static struct pci_device dedevice = {
COMPAT_PCI_DRIVER(de, dedevice);
static void
tulip_shutdown(int howto, void *arg)
tulip_shutdown(void *arg, int howto)
{
tulip_softc_t * const sc = arg;
TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
@ -5313,7 +5313,8 @@ tulip_pci_attach(pcici_t config_id, int unit)
return;
}
}
at_shutdown(tulip_shutdown, sc, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, tulip_shutdown, sc,
SHUTDOWN_PRI_DEFAULT);
#if defined(TULIP_USE_SOFTINTR)
if (sc->tulip_unit > tulip_softintr_max_unit)
tulip_softintr_max_unit = sc->tulip_unit;

View File

@ -70,7 +70,7 @@
static void en_pci_attach __P((pcici_t, int));
static const char *en_pci_probe __P((pcici_t, pcidi_t));
static void en_pci_shutdown __P((int, void *));
static void en_pci_shutdown __P((void *, int));
/*
* local structures
@ -266,7 +266,8 @@ int unit;
* doing so could allow DMA to corrupt kernel memory during the
* reboot before the driver initializes.
*/
at_shutdown(en_pci_shutdown, scp, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, en_pci_shutdown, scp,
SHUTDOWN_PRI_DEFAULT);
if (!pci_map_int(config_id, en_intr, (void *) sc, &net_imask)) {
printf("%s: couldn't establish interrupt\n", sc->sc_dev.dv_xname);
@ -304,8 +305,8 @@ int unit;
static void
en_pci_shutdown(
int howto,
void *sc)
void *sc,
int howto)
{
struct en_pci_softc *psc = (struct en_pci_softc *)sc;

View File

@ -21,7 +21,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.
*
* $Id: if_fpa.c,v 1.9 1999/04/24 20:14:00 peter Exp $
* $Id: if_fpa.c,v 1.10 1999/05/09 17:06:54 peter Exp $
*
*/
@ -128,7 +128,7 @@ pdq_pci_ifintr(
#endif /* __FreeBSD && BSD */
#if defined(__FreeBSD__)
static void pdq_pci_shutdown(int, void *);
static void pdq_pci_shutdown(void *, int);
/*
* This is the PCI configuration support. Since the PDQ is available
@ -192,14 +192,15 @@ pdq_pci_attach(
pdqs_pci[unit] = sc;
pdq_ifattach(sc, pdq_pci_ifwatchdog);
pci_map_int(config_id, pdq_pci_ifintr, (void*) sc, &net_imask);
at_shutdown(pdq_pci_shutdown, (void *) sc, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, pdq_pci_shutdown, sc,
SHUTDOWN_PRI_DEFAULT);
}
static void
pdq_pci_shutdown(
int howto,
void *sc)
void *sc,
int howto)
{
pdq_hwreset(((pdq_softc_t *)sc)->sc_pdq);
}

View File

@ -29,7 +29,7 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: if_rl.c,v 1.19 1999/07/06 19:23:28 des Exp $
* $Id: if_rl.c,v 1.20 1999/07/22 20:56:49 wpaul Exp $
*/
/*
@ -127,7 +127,7 @@
#ifndef lint
static const char rcsid[] =
"$Id: if_rl.c,v 1.19 1999/07/06 19:23:28 des Exp $";
"$Id: if_rl.c,v 1.20 1999/07/22 20:56:49 wpaul Exp $";
#endif
/*
@ -177,7 +177,7 @@ static int rl_ioctl __P((struct ifnet *, u_long, caddr_t));
static void rl_init __P((void *));
static void rl_stop __P((struct rl_softc *));
static void rl_watchdog __P((struct ifnet *));
static void rl_shutdown __P((int, void *));
static void rl_shutdown __P((void *, int));
static int rl_ifmedia_upd __P((struct ifnet *));
static void rl_ifmedia_sts __P((struct ifnet *, struct ifmediareq *));
@ -1234,7 +1234,8 @@ rl_attach(config_id, unit)
#if NBPF > 0
bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header));
#endif
at_shutdown(rl_shutdown, sc, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, rl_shutdown, sc,
SHUTDOWN_PRI_DEFAULT);
fail:
splx(s);
@ -1925,9 +1926,9 @@ static void rl_stop(sc)
* Stop all chip I/O so that the kernel's probe routines don't
* get confused by errant DMAs when rebooting.
*/
static void rl_shutdown(howto, arg)
int howto;
static void rl_shutdown(arg, howto)
void *arg;
int howto;
{
struct rl_softc *sc = (struct rl_softc *)arg;

View File

@ -1,5 +1,5 @@
/* $OpenBSD: if_tx.c,v 1.3 1998/10/10 04:30:09 jason Exp $ */
/* $Id: if_tx.c,v 1.28 1999/07/03 20:17:05 peter Exp $ */
/* $Id: if_tx.c,v 1.29 1999/07/06 19:23:30 des Exp $ */
/*-
* Copyright (c) 1997 Semen Ustimenko (semen@iclub.nsu.ru)
@ -378,7 +378,7 @@ epic_shutdown(
static const char* epic_freebsd_probe __P((pcici_t, pcidi_t));
static void epic_freebsd_attach __P((pcici_t, int));
static void epic_shutdown __P((int, void *));
static void epic_shutdown __P((void *, int));
/* Global variables */
static u_long epic_pci_count;
@ -546,7 +546,8 @@ epic_freebsd_attach(
}
/* Set shut down routine to stop DMA processes on reboot */
at_shutdown(epic_shutdown, sc, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, epic_shutdown, sc,
SHUTDOWN_PRI_DEFAULT);
/* Attach to if manager */
if_attach(ifp);
@ -565,8 +566,8 @@ epic_freebsd_attach(
static void
epic_shutdown(
int howto,
void *sc)
void *sc,
int howto)
{
epic_stop(sc);
}

View File

@ -44,14 +44,14 @@
#include <dev/vx/if_vxreg.h>
static void vx_pci_shutdown(int, void *);
static void vx_pci_shutdown(void *, int);
static const char *vx_pci_probe(pcici_t, pcidi_t);
static void vx_pci_attach(pcici_t, int unit);
static void
vx_pci_shutdown(
int howto,
void *sc)
void *sc,
int howto)
{
vxstop(sc);
vxfree(sc);
@ -122,7 +122,8 @@ vx_pci_attach(
* doing do could allow DMA to corrupt kernel memory during the
* reboot before the driver initializes.
*/
at_shutdown(vx_pci_shutdown, sc, SHUTDOWN_POST_SYNC);
EVENTHANDLER_REGISTER(shutdown_post_sync, vx_pci_shutdown, sc,
SHUTDOWN_PRI_DEFAULT);
pci_map_int(config_id, vxintr, (void *) sc, &net_imask);
}

155
sys/sys/eventhandler.h Normal file
View File

@ -0,0 +1,155 @@
/*-
* Copyright (c) 1999 Michael Smith <msmith@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id$
*/
#include <sys/queue.h>
#ifndef SYS_EVENTHANDLER_H
#define SYS_EVENTHANDLER_H
struct eventhandler_entry
{
TAILQ_ENTRY(eventhandler_entry) ee_link;
int ee_priority;
void *ee_arg;
};
struct eventhandler_list
{
TAILQ_ENTRY(eventhandler_list) el_link;
char *el_name;
int el_flags;
#define EHE_INITTED (1<<0)
TAILQ_HEAD(,eventhandler_entry) el_entries;
};
typedef struct eventhandler_entry *eventhandler_tag;
/*
* Fast handler lists require the eventhandler list be present
* at link time. They don't allow addition of entries to
* unknown eventhandler lists, ie. each list must have an
* "owner".
*
* Fast handler lists must be defined once by the owner
* of the eventhandler list, and the declaration must be in
* scope at any point the list is manipulated.
*/
#define EVENTHANDLER_FAST_DECLARE(name, type) \
extern struct eventhandler_list Xeventhandler_list_ ## name ; \
struct eventhandler_entry_ ## name \
{ \
struct eventhandler_entry ee; \
type eh_func; \
};
#define EVENTHANDLER_FAST_DEFINE(name, type) \
struct eventhandler_list Xeventhandler_list_ ## name = { #name };
#define EVENTHANDLER_FAST_INVOKE(name, args...) \
do { \
struct eventhandler_list *_el = &Xeventhandler_list ## name ; \
struct eventhandler_entry *_ep = TAILQ_FIRST(&(_el->el_entries)); \
\
while (_ep != NULL) { \
((struct eventhandler_entry_ ## name *)_ep)->eh_func(_ep->ee_arg , ## args); \
_ep = TAILQ_NEXT(_ep, ee_link); \
} \
} while (0);
#define EVENTHANDLER_FAST_REGISTER(name, func, arg, priority) \
eventhandler_register(Xeventhandler_list_ ## name, #name, func, arg, priority)
#define EVENTHANDLER_FAST_DEREGISTER(name, tag, func) \
eventhandler_deregister(Xeventhandler_list ## name, tag, func)
/*
* Slow handlerss are entirely dynamic; lists are created
* when entries are added to them, and thus have no concept of "owner",
*
* Slow handlerss need to be declared, but do not need to be defined. The
* declaration must be in scope wherever the handler is to be invoked.
*/
#define EVENTHANDLER_DECLARE(name, type) \
struct eventhandler_entry_ ## name \
{ \
struct eventhandler_entry ee; \
type eh_func; \
};
#define EVENTHANDLER_INVOKE(name, args...) \
do { \
struct eventhandler_list *_el; \
struct eventhandler_entry *_ep; \
\
if ((_el = eventhandler_find_list(#name)) != NULL) { \
for (_ep = TAILQ_FIRST(&(_el->el_entries)); \
_ep != NULL; \
_ep = TAILQ_NEXT(_ep, ee_link)) { \
((struct eventhandler_entry_ ## name *)_ep)->eh_func(_ep->ee_arg , ## args); \
} \
} \
} while (0);
#define EVENTHANDLER_REGISTER(name, func, arg, priority) \
eventhandler_register(NULL, #name, func, arg, priority)
#define EVENTHANDLER_DEREGISTER(name, tag, func) \
do { \
struct eventhandler_list *_el; \
\
if ((_el = eventhandler_find_list(#name)) != NULL) \
eventhandler_deregister(_el, tag, func); \
} while(0);
extern eventhandler_tag eventhandler_register(struct eventhandler_list *list,
char *name,
void *func,
void *arg,
int priority);
extern void eventhandler_deregister(struct eventhandler_list *list,
eventhandler_tag tag);
extern struct eventhandler_list *eventhandler_find_list(char *name);
/*
* Standard system event queues.
*/
/* Shutdown events */
typedef void (*shutdown_fn) __P((void *, int));
#define SHUTDOWN_PRI_FIRST 0
#define SHUTDOWN_PRI_DEFAULT 10000
#define SHUTDOWN_PRI_LAST 20000
EVENTHANDLER_DECLARE(shutdown_pre_sync, shutdown_fn); /* before fs sync */
EVENTHANDLER_DECLARE(shutdown_post_sync, shutdown_fn); /* after fs sync */
EVENTHANDLER_DECLARE(shutdown_final, shutdown_fn);
#endif /* SYS_EVENTHANDLER_H */

View File

@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)systm.h 8.7 (Berkeley) 3/29/95
* $Id: systm.h,v 1.94 1999/07/23 23:45:50 alc Exp $
* $Id: systm.h,v 1.95 1999/07/24 09:34:11 dfr Exp $
*/
#ifndef _SYS_SYSTM_H_
@ -269,20 +269,6 @@ typedef void (*forklist_fn) __P((struct proc *parent, struct proc *child,
int at_fork __P((forklist_fn function));
int rm_at_fork __P((forklist_fn function));
/* Shutdown callout list definitions and declarations. */
#define SHUTDOWN_PRE_SYNC 0
#define SHUTDOWN_POST_SYNC 1
#define SHUTDOWN_FINAL 2
#define SHUTDOWN_PRI_FIRST 0
#define SHUTDOWN_PRI_DEFAULT 10000
#define SHUTDOWN_PRI_LAST 20000
typedef void (*bootlist_fn) __P((int, void *));
int at_shutdown __P((bootlist_fn function, void *arg, int position));
int at_shutdown_pri __P((bootlist_fn function, void *arg, int position, int pri));
int rm_at_shutdown __P((bootlist_fn function, void *arg));
/*
* Not exactly a callout LIST, but a callout entry.
* Allow an external module to define a hardware watchdog tickler.