MI softintr(9)'fy. Tested by bouyer@.
See also: http://mail-index.netbsd.org/port-next68k/2007/03/06/0000.html
This commit is contained in:
parent
ab9a36c548
commit
0d7a1d1146
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: files.next68k,v 1.36 2005/12/11 12:18:25 christos Exp $
|
# $NetBSD: files.next68k,v 1.37 2007/03/08 16:37:43 tsutsui Exp $
|
||||||
|
|
||||||
# next68k-specific configuration info
|
# next68k-specific configuration info
|
||||||
|
|
||||||
@ -37,6 +37,7 @@ file arch/m68k/m68k/db_memrw.c ddb | kgdb
|
|||||||
file arch/m68k/m68k/kgdb_machdep.c kgdb
|
file arch/m68k/m68k/kgdb_machdep.c kgdb
|
||||||
file arch/m68k/m68k/pmap_motorola.c
|
file arch/m68k/m68k/pmap_motorola.c
|
||||||
file arch/m68k/m68k/procfs_machdep.c procfs
|
file arch/m68k/m68k/procfs_machdep.c procfs
|
||||||
|
file arch/m68k/m68k/softintr.c
|
||||||
file arch/m68k/m68k/sys_machdep.c
|
file arch/m68k/m68k/sys_machdep.c
|
||||||
file arch/m68k/m68k/vm_machdep.c
|
file arch/m68k/m68k/vm_machdep.c
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: zs.c,v 1.27 2005/12/11 12:18:25 christos Exp $ */
|
/* $NetBSD: zs.c,v 1.28 2007/03/08 16:37:43 tsutsui Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1996 The NetBSD Foundation, Inc.
|
* Copyright (c) 1996 The NetBSD Foundation, Inc.
|
||||||
@ -50,7 +50,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: zs.c,v 1.27 2005/12/11 12:18:25 christos Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: zs.c,v 1.28 2007/03/08 16:37:43 tsutsui Exp $");
|
||||||
|
|
||||||
#include "opt_ddb.h"
|
#include "opt_ddb.h"
|
||||||
#include "opt_kgdb.h"
|
#include "opt_kgdb.h"
|
||||||
@ -176,7 +176,6 @@ static int zs_attached;
|
|||||||
|
|
||||||
/* Interrupt handlers. */
|
/* Interrupt handlers. */
|
||||||
static int zshard(void *);
|
static int zshard(void *);
|
||||||
static void zssoft(void *);
|
|
||||||
|
|
||||||
static int zs_get_speed(struct zs_chanstate *);
|
static int zs_get_speed(struct zs_chanstate *);
|
||||||
|
|
||||||
@ -209,7 +208,7 @@ zs_attach(struct device *parent, struct device *self, void *aux)
|
|||||||
struct zsc_attach_args zsc_args;
|
struct zsc_attach_args zsc_args;
|
||||||
volatile struct zschan *zc;
|
volatile struct zschan *zc;
|
||||||
struct zs_chanstate *cs;
|
struct zs_chanstate *cs;
|
||||||
int s, channel, sir;
|
int s, channel;
|
||||||
|
|
||||||
zs_attached = 1;
|
zs_attached = 1;
|
||||||
|
|
||||||
@ -275,13 +274,10 @@ zs_attach(struct device *parent, struct device *self, void *aux)
|
|||||||
}
|
}
|
||||||
|
|
||||||
isrlink_autovec(zshard, NULL, NEXT_I_IPL(NEXT_I_SCC), 0, NULL);
|
isrlink_autovec(zshard, NULL, NEXT_I_IPL(NEXT_I_SCC), 0, NULL);
|
||||||
|
zsc->zsc_softintr_cookie = softintr_establish(IPL_SOFTSERIAL,
|
||||||
|
(void (*)(void *))zsc_intr_soft, zsc);
|
||||||
INTR_ENABLE(NEXT_I_SCC);
|
INTR_ENABLE(NEXT_I_SCC);
|
||||||
|
|
||||||
sir = allocate_sir(zssoft, zsc);
|
|
||||||
if (sir != SIR_SERIAL) {
|
|
||||||
panic("Unexpected zssoft sir");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the master interrupt enable and interrupt vector.
|
* Set the master interrupt enable and interrupt vector.
|
||||||
* (common to both channels, do it on A)
|
* (common to both channels, do it on A)
|
||||||
@ -319,12 +315,12 @@ static int
|
|||||||
zshard(void *arg)
|
zshard(void *arg)
|
||||||
{
|
{
|
||||||
struct zsc_softc *zsc;
|
struct zsc_softc *zsc;
|
||||||
int unit, rr3, rval, softreq;
|
int unit, rr3, rval;
|
||||||
|
|
||||||
if (!INTR_OCCURRED(NEXT_I_SCC))
|
if (!INTR_OCCURRED(NEXT_I_SCC))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
rval = softreq = 0;
|
rval = 0;
|
||||||
for (unit = 0; unit < zsc_cd.cd_ndevs; unit++) {
|
for (unit = 0; unit < zsc_cd.cd_ndevs; unit++) {
|
||||||
zsc = zsc_cd.cd_devs[unit];
|
zsc = zsc_cd.cd_devs[unit];
|
||||||
if (zsc == NULL)
|
if (zsc == NULL)
|
||||||
@ -335,52 +331,14 @@ zshard(void *arg)
|
|||||||
rval |= rr3;
|
rval |= rr3;
|
||||||
zsc->zsc_intrcnt.ev_count++;
|
zsc->zsc_intrcnt.ev_count++;
|
||||||
}
|
}
|
||||||
softreq |= zsc->zsc_cs[0]->cs_softreq;
|
/* We are at splzs here, so no need to lock. */
|
||||||
softreq |= zsc->zsc_cs[1]->cs_softreq;
|
if (zsc->zsc_cs[0]->cs_softreq || zsc->zsc_cs[1]->cs_softreq)
|
||||||
|
softintr_schedule(zsc->zsc_softintr_cookie);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We are at splzs here, so no need to lock. */
|
|
||||||
if (softreq && (zssoftpending == 0)) {
|
|
||||||
zssoftpending = 1;
|
|
||||||
setsoftserial();
|
|
||||||
}
|
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Similar scheme as for zshard (look at all of them)
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
zssoft(void *arg)
|
|
||||||
{
|
|
||||||
struct zsc_softc *zsc;
|
|
||||||
int s, unit;
|
|
||||||
|
|
||||||
/* This is not the only ISR on this IPL. */
|
|
||||||
if (zssoftpending == 0)
|
|
||||||
panic("zssoft not pending");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The soft intr. bit will be set by zshard only if
|
|
||||||
* the variable zssoftpending is zero. The order of
|
|
||||||
* these next two statements prevents our clearing
|
|
||||||
* the soft intr bit just after zshard has set it.
|
|
||||||
*/
|
|
||||||
/* ienab_bic(IE_ZSSOFT); */
|
|
||||||
zssoftpending = 0;
|
|
||||||
|
|
||||||
/* Make sure we call the tty layer at spltty. */
|
|
||||||
s = spltty();
|
|
||||||
for (unit = 0; unit < zsc_cd.cd_ndevs; unit++) {
|
|
||||||
zsc = zsc_cd.cd_devs[unit];
|
|
||||||
if (zsc == NULL)
|
|
||||||
continue;
|
|
||||||
(void)zsc_intr_soft(zsc);
|
|
||||||
}
|
|
||||||
splx(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compute the current baud rate given a ZS channel.
|
* Compute the current baud rate given a ZS channel.
|
||||||
*/
|
*/
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: intr.h,v 1.17 2007/02/16 02:53:49 ad Exp $ */
|
/* $NetBSD: intr.h,v 1.18 2007/03/08 16:37:43 tsutsui Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1997 Scott Reynolds
|
* Copyright (C) 1997 Scott Reynolds
|
||||||
@ -42,72 +42,60 @@
|
|||||||
/* watch out for side effects */
|
/* watch out for side effects */
|
||||||
#define splx(s) ((s) & PSL_IPL ? _spl(s) : spl0())
|
#define splx(s) ((s) & PSL_IPL ? _spl(s) : spl0())
|
||||||
|
|
||||||
|
#define splsoft() splraise1()
|
||||||
|
#define splsoftnet() splsoft()
|
||||||
|
#define splsoftclock() splsoft()
|
||||||
|
#define splsoftserial() splsoft()
|
||||||
|
#define splbio() splraise3()
|
||||||
|
#define splnet() splraise3()
|
||||||
|
#define spltty() splraise3()
|
||||||
|
#define splserial() splraise5()
|
||||||
|
#define splvm() splraise6()
|
||||||
|
#define splclock() splraise3() /* ??? */
|
||||||
|
#define splstatclock() splclock()
|
||||||
|
#define splhigh() spl7()
|
||||||
|
#define splsched() spl7()
|
||||||
|
#define spllock() spl7()
|
||||||
|
|
||||||
|
#define spldma() splraise6()
|
||||||
|
|
||||||
/****************************************************************/
|
/****************************************************************/
|
||||||
|
|
||||||
#define IPL_HIGH (PSL_S|PSL_IPL7)
|
|
||||||
#define IPL_SERIAL (PSL_S|PSL_IPL5)
|
|
||||||
#define IPL_SCHED (PSL_S|PSL_IPL7)
|
|
||||||
#define IPL_LOCK (PSL_S|PSL_IPL7)
|
|
||||||
#define IPL_CLOCK (PSL_S|PSL_IPL3)
|
|
||||||
#define IPL_STATCLOCK IPL_CLOCK
|
|
||||||
#define IPL_VM (PSL_S|PSL_IPL6)
|
|
||||||
#define IPL_TTY (PSL_S|PSL_IPL3)
|
|
||||||
#define IPL_BIO (PSL_S|PSL_IPL3)
|
|
||||||
#define IPL_NET (PSL_S|PSL_IPL3)
|
|
||||||
#define IPL_SOFTNET (PSL_S|PSL_IPL2)
|
|
||||||
#define IPL_SOFTCLOCK (PSL_S|PSL_IPL1)
|
|
||||||
#define IPL_NONE 0
|
#define IPL_NONE 0
|
||||||
|
#define IPL_SOFTCLOCK 1
|
||||||
|
#define IPL_SOFTNET 2
|
||||||
|
#define IPL_SOFTSERIAL 3
|
||||||
|
#define IPL_SOFT 4
|
||||||
|
#define IPL_BIO 5
|
||||||
|
#define IPL_NET 6
|
||||||
|
#define IPL_TTY 7
|
||||||
|
#define IPL_SERIAL 8
|
||||||
|
#define IPL_VM 9
|
||||||
|
#define IPL_CLOCK 10
|
||||||
|
#define IPL_STATCLOCK IPL_CLOCK
|
||||||
|
#define IPL_HIGH 11
|
||||||
|
#define IPL_LOCK IPL_HIGH
|
||||||
|
#define IPL_SCHED IPL_HIGH
|
||||||
|
#define NIPL 12
|
||||||
|
|
||||||
typedef int ipl_t;
|
typedef int ipl_t;
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ipl_t _ipl;
|
ipl_t _psl;
|
||||||
} ipl_cookie_t;
|
} ipl_cookie_t;
|
||||||
|
|
||||||
static inline ipl_cookie_t
|
extern const int ipl2psl_table[NIPL];
|
||||||
makeiplcookie(ipl_t ipl)
|
|
||||||
{
|
|
||||||
|
|
||||||
return (ipl_cookie_t){._ipl = ipl};
|
ipl_cookie_t makeiplcookie(ipl_t);
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
splraiseipl(ipl_cookie_t icookie)
|
splraiseipl(ipl_cookie_t icookie)
|
||||||
{
|
{
|
||||||
|
|
||||||
return _splraise(icookie._ipl);
|
return _splraise(icookie._psl);
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <sys/spl.h>
|
|
||||||
|
|
||||||
#define spldma() _splraise(PSL_S|PSL_IPL6)
|
|
||||||
|
|
||||||
/****************************************************************/
|
/****************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* simulated software interrupt register
|
|
||||||
*/
|
|
||||||
extern volatile u_int8_t ssir;
|
|
||||||
|
|
||||||
#define SIR_NET 0x01
|
|
||||||
#define SIR_CLOCK 0x02
|
|
||||||
#define SIR_SERIAL 0x04
|
|
||||||
#define SIR_DTMGR 0x08
|
|
||||||
#define SIR_ADB 0x10
|
|
||||||
|
|
||||||
#define siron(mask) \
|
|
||||||
__asm volatile ( "orb %1,%0" : "=m" (ssir) : "i" (mask))
|
|
||||||
#define siroff(mask) \
|
|
||||||
__asm volatile ( "andb %1,%0" : "=m" (ssir) : "ir" (~(mask)));
|
|
||||||
|
|
||||||
#define setsoftnet() siron(SIR_NET)
|
|
||||||
#define setsoftclock() siron(SIR_CLOCK)
|
|
||||||
#define setsoftserial() siron(SIR_SERIAL)
|
|
||||||
#define setsoftdtmgr() siron(SIR_DTMGR)
|
|
||||||
#define setsoftadb() siron(SIR_ADB)
|
|
||||||
|
|
||||||
extern u_long allocate_sir(void (*)(void *),void *);
|
|
||||||
extern void init_sir(void);
|
|
||||||
|
|
||||||
/* locore.s */
|
/* locore.s */
|
||||||
int spl0(void);
|
int spl0(void);
|
||||||
|
|
||||||
@ -118,6 +106,8 @@ extern volatile u_long *intrmask;
|
|||||||
#define INTR_DISABLE(x) (*intrmask &= (~NEXT_I_BIT(x)))
|
#define INTR_DISABLE(x) (*intrmask &= (~NEXT_I_BIT(x)))
|
||||||
#define INTR_OCCURRED(x) (*intrstat & NEXT_I_BIT(x))
|
#define INTR_OCCURRED(x) (*intrstat & NEXT_I_BIT(x))
|
||||||
|
|
||||||
|
#include <m68k/softintr.h>
|
||||||
|
|
||||||
#endif /* _KERNEL */
|
#endif /* _KERNEL */
|
||||||
|
|
||||||
#endif /* _NEXT68K_INTR_H_ */
|
#endif /* _NEXT68K_INTR_H_ */
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/* $NetBSD: types.h,v 1.2 2006/09/11 15:07:50 gdamore Exp $ */
|
/* $NetBSD: types.h,v 1.3 2007/03/08 16:37:43 tsutsui Exp $ */
|
||||||
|
|
||||||
#include <m68k/types.h>
|
#include <m68k/types.h>
|
||||||
|
|
||||||
#define __HAVE_TIMECOUNTER
|
#define __HAVE_TIMECOUNTER
|
||||||
|
#define __HAVE_GENERIC_SOFT_INTERRUPTS
|
||||||
#define __HAVE_GENERIC_TODR
|
#define __HAVE_GENERIC_TODR
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: z8530var.h,v 1.5 2005/12/11 12:18:25 christos Exp $ */
|
/* $NetBSD: z8530var.h,v 1.6 2007/03/08 16:37:43 tsutsui Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1992, 1993
|
* Copyright (c) 1992, 1993
|
||||||
@ -50,6 +50,7 @@ struct zsc_softc {
|
|||||||
/* Machine-dependent part follows... */
|
/* Machine-dependent part follows... */
|
||||||
struct evcnt zsc_intrcnt; /* count interrupts */
|
struct evcnt zsc_intrcnt; /* count interrupts */
|
||||||
struct zs_chanstate zsc_cs_store[2];
|
struct zs_chanstate zsc_cs_store[2];
|
||||||
|
void *zsc_softintr_cookie;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: autoconf.c,v 1.18 2005/12/11 12:18:29 christos Exp $ */
|
/* $NetBSD: autoconf.c,v 1.19 2007/03/08 16:37:43 tsutsui Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1982, 1986, 1990, 1993
|
* Copyright (c) 1982, 1986, 1990, 1993
|
||||||
@ -85,7 +85,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.18 2005/12/11 12:18:29 christos Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.19 2007/03/08 16:37:43 tsutsui Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
@ -159,7 +159,7 @@ cpu_configure(void)
|
|||||||
|
|
||||||
INTR_SETMASK(0);
|
INTR_SETMASK(0);
|
||||||
|
|
||||||
init_sir();
|
softintr_init();
|
||||||
|
|
||||||
if (config_rootfound("mainbus", NULL) == NULL)
|
if (config_rootfound("mainbus", NULL) == NULL)
|
||||||
panic("autoconfig failed, no root");
|
panic("autoconfig failed, no root");
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: isr.c,v 1.22 2005/12/11 12:18:29 christos Exp $ */
|
/* $NetBSD: isr.c,v 1.23 2007/03/08 16:37:44 tsutsui Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file was taken from mvme68k/mvme68k/isr.c
|
* This file was taken from mvme68k/mvme68k/isr.c
|
||||||
@ -48,7 +48,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: isr.c,v 1.22 2005/12/11 12:18:29 christos Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: isr.c,v 1.23 2007/03/08 16:37:44 tsutsui Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
@ -386,36 +386,6 @@ isrdispatch_vectored(int ipl, struct clockframe *frame)
|
|||||||
isr->isr_evcnt->ev_count++;
|
isr->isr_evcnt->ev_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* netisr junk...
|
|
||||||
* should use an array of chars instead of
|
|
||||||
* a bitmask to avoid atomicity locking issues.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
netintr(void)
|
|
||||||
{
|
|
||||||
int n, s;
|
|
||||||
|
|
||||||
s = splhigh();
|
|
||||||
n = netisr;
|
|
||||||
netisr = 0;
|
|
||||||
splx(s);
|
|
||||||
|
|
||||||
#define DONETISR(bit, fn) do { \
|
|
||||||
if (n & (1 << bit)) \
|
|
||||||
fn(); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
s = splsoftnet();
|
|
||||||
|
|
||||||
#include <net/netisr_dispatch.h>
|
|
||||||
|
|
||||||
#undef DONETISR
|
|
||||||
|
|
||||||
splx(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
static int
|
static int
|
||||||
@ -425,3 +395,25 @@ spurintr(void *arg)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const int ipl2psl_table[NIPL] = {
|
||||||
|
[IPL_NONE] = PSL_IPL0,
|
||||||
|
[IPL_SOFTCLOCK] = PSL_IPL1,
|
||||||
|
[IPL_SOFTNET] = PSL_IPL1,
|
||||||
|
[IPL_SOFTSERIAL] = PSL_IPL1,
|
||||||
|
[IPL_SOFT] = PSL_IPL1,
|
||||||
|
[IPL_BIO] = PSL_IPL3,
|
||||||
|
[IPL_NET] = PSL_IPL3,
|
||||||
|
[IPL_TTY] = PSL_IPL3,
|
||||||
|
[IPL_SERIAL] = PSL_IPL5,
|
||||||
|
[IPL_VM] = PSL_IPL6,
|
||||||
|
[IPL_CLOCK] = PSL_IPL3, /* ??? */
|
||||||
|
[IPL_HIGH] = PSL_IPL7,
|
||||||
|
};
|
||||||
|
|
||||||
|
ipl_cookie_t
|
||||||
|
makeiplcookie(ipl_t ipl)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (ipl_cookie_t){._psl = ipl2psl_table[ipl] | PSL_S};
|
||||||
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: locore.s,v 1.45 2005/12/11 12:18:29 christos Exp $ */
|
/* $NetBSD: locore.s,v 1.46 2007/03/08 16:37:44 tsutsui Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1998 Darrin B. Jewell
|
* Copyright (c) 1998 Darrin B. Jewell
|
||||||
@ -1018,8 +1018,6 @@ Lintrhand_exit:
|
|||||||
* necessitating a stack cleanup.
|
* necessitating a stack cleanup.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
BSS(ssir,1)
|
|
||||||
|
|
||||||
ASENTRY_NOPROFILE(rei)
|
ASENTRY_NOPROFILE(rei)
|
||||||
tstl _C_LABEL(astpending) | AST pending?
|
tstl _C_LABEL(astpending) | AST pending?
|
||||||
jeq Lchksir | no, go check for SIR
|
jeq Lchksir | no, go check for SIR
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: trap.c,v 1.64 2007/03/04 06:00:27 christos Exp $ */
|
/* $NetBSD: trap.c,v 1.65 2007/03/08 16:37:44 tsutsui Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file was taken from mvme68k/mvme68k/trap.c
|
* This file was taken from mvme68k/mvme68k/trap.c
|
||||||
@ -84,7 +84,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.64 2007/03/04 06:00:27 christos Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.65 2007/03/08 16:37:44 tsutsui Exp $");
|
||||||
|
|
||||||
#include "opt_ddb.h"
|
#include "opt_ddb.h"
|
||||||
#include "opt_execfmt.h"
|
#include "opt_execfmt.h"
|
||||||
@ -220,12 +220,6 @@ int mmupid = -1;
|
|||||||
#define MDB_ISPID(p) ((p) == mmupid)
|
#define MDB_ISPID(p) ((p) == mmupid)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define NSIR 32
|
|
||||||
void (*sir_routines[NSIR])(void *);
|
|
||||||
void *sir_args[NSIR];
|
|
||||||
int next_sir;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* trap and syscall both need the following work done before returning
|
* trap and syscall both need the following work done before returning
|
||||||
* to user mode.
|
* to user mode.
|
||||||
@ -315,7 +309,6 @@ trap(int type, unsigned code, unsigned v, struct frame frame)
|
|||||||
ksiginfo_t ksi;
|
ksiginfo_t ksi;
|
||||||
int s;
|
int s;
|
||||||
u_quad_t sticks = 0 /* XXX initialiser works around compiler bug */;
|
u_quad_t sticks = 0 /* XXX initialiser works around compiler bug */;
|
||||||
int bit;
|
|
||||||
static int panicking = 0;
|
static int panicking = 0;
|
||||||
|
|
||||||
uvmexp.traps++;
|
uvmexp.traps++;
|
||||||
@ -585,13 +578,9 @@ trap(int type, unsigned code, unsigned v, struct frame frame)
|
|||||||
|
|
||||||
case T_SSIR: /* software interrupt */
|
case T_SSIR: /* software interrupt */
|
||||||
case T_SSIR|T_USER:
|
case T_SSIR|T_USER:
|
||||||
while ((bit = ffs(ssir))) {
|
|
||||||
--bit;
|
softintr_dispatch();
|
||||||
ssir &= ~(1 << bit);
|
|
||||||
uvmexp.softs++;
|
|
||||||
if (sir_routines[bit])
|
|
||||||
sir_routines[bit](sir_args[bit]);
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* If this was not an AST trap, we are all done.
|
* If this was not an AST trap, we are all done.
|
||||||
*/
|
*/
|
||||||
@ -1039,29 +1028,3 @@ dumpwb(int num, u_short s, u_int a, u_int d)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Allocation routines for software interrupts.
|
|
||||||
*/
|
|
||||||
u_long
|
|
||||||
allocate_sir(void (*proc)(void *), void *arg)
|
|
||||||
{
|
|
||||||
int bit;
|
|
||||||
|
|
||||||
if( next_sir >= NSIR )
|
|
||||||
panic("allocate_sir: none left");
|
|
||||||
bit = next_sir++;
|
|
||||||
sir_routines[bit] = proc;
|
|
||||||
sir_args[bit] = arg;
|
|
||||||
return (1 << bit);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
init_sir(void)
|
|
||||||
{
|
|
||||||
extern void netintr(void);
|
|
||||||
|
|
||||||
sir_routines[0] = (void (*)(void *))netintr;
|
|
||||||
sir_routines[1] = softclock;
|
|
||||||
next_sir = 2;
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user