From 4810597f3128163fba97b3780b78bb70cf3396f5 Mon Sep 17 00:00:00 2001 From: jmcneill Date: Sat, 3 Sep 2011 19:07:32 +0000 Subject: [PATCH] add a workaround for kern/45327 --- sys/arch/usermode/dev/ld_thunkbus.c | 35 ++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/sys/arch/usermode/dev/ld_thunkbus.c b/sys/arch/usermode/dev/ld_thunkbus.c index 75ae9f86664c..1f1e584396c1 100644 --- a/sys/arch/usermode/dev/ld_thunkbus.c +++ b/sys/arch/usermode/dev/ld_thunkbus.c @@ -1,4 +1,4 @@ -/* $NetBSD: ld_thunkbus.c,v 1.7 2011/09/03 15:00:28 jmcneill Exp $ */ +/* $NetBSD: ld_thunkbus.c,v 1.8 2011/09/03 19:07:32 jmcneill Exp $ */ /*- * Copyright (c) 2011 Jared D. McNeill @@ -26,8 +26,10 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#define BROKEN_SIGINFO + #include -__KERNEL_RCSID(0, "$NetBSD: ld_thunkbus.c,v 1.7 2011/09/03 15:00:28 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ld_thunkbus.c,v 1.8 2011/09/03 19:07:32 jmcneill Exp $"); #include #include @@ -69,6 +71,10 @@ struct ld_thunkbus_softc { struct ld_thunkbus_transfer sc_tt; }; +#ifdef BROKEN_SIGINFO +struct ld_thunkbus_transfer *ld_thunkbus_tt; +#endif + CFATTACH_DECL_NEW(ld_thunkbus, sizeof(struct ld_thunkbus_softc), ld_thunkbus_match, ld_thunkbus_attach, NULL, NULL); @@ -80,6 +86,12 @@ ld_thunkbus_match(device_t parent, cfdata_t match, void *opaque) if (taa->taa_type != THUNKBUS_TYPE_DISKIMAGE) return 0; +#ifdef BROKEN_SIGINFO + /* We can only have one instance if siginfo doesn't work */ + if (ld_thunkbus_tt != NULL) + return 0; +#endif + return 1; } @@ -105,6 +117,10 @@ ld_thunkbus_attach(device_t parent, device_t self, void *opaque) return; } +#ifdef BROKEN_SIGINFO + ld_thunkbus_tt = &sc->sc_tt; +#endif + aprint_naive("\n"); aprint_normal(": %s (%lld)\n", path, (long long)size); @@ -132,15 +148,22 @@ ld_thunkbus_attach(device_t parent, device_t self, void *opaque) static void ld_thunkbus_sig(int sig, siginfo_t *info, void *ctx) { - struct ld_thunkbus_transfer *tt; + struct ld_thunkbus_transfer *tt = NULL; struct ld_thunkbus_softc *sc; curcpu()->ci_idepth++; if (info->si_signo == SIGIO) { - tt = info->si_value.sival_ptr; - sc = tt->tt_sc; - softint_schedule(sc->sc_ih); +#ifdef BROKEN_SIGINFO + tt = ld_thunkbus_tt; +#else + if (info->si_code == SI_ASYNCIO) + tt = info->si_value.sival_ptr; +#endif + if (tt) { + sc = tt->tt_sc; + softint_schedule(sc->sc_ih); + } } curcpu()->ci_idepth--;