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:
tsutsui 2007-03-08 16:37:43 +00:00
parent ab9a36c548
commit 0d7a1d1146
9 changed files with 89 additions and 185 deletions

View File

@ -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
@ -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/pmap_motorola.c
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/vm_machdep.c

View File

@ -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.
@ -50,7 +50,7 @@
*/
#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_kgdb.h"
@ -176,7 +176,6 @@ static int zs_attached;
/* Interrupt handlers. */
static int zshard(void *);
static void zssoft(void *);
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;
volatile struct zschan *zc;
struct zs_chanstate *cs;
int s, channel, sir;
int s, channel;
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);
zsc->zsc_softintr_cookie = softintr_establish(IPL_SOFTSERIAL,
(void (*)(void *))zsc_intr_soft, zsc);
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.
* (common to both channels, do it on A)
@ -319,12 +315,12 @@ static int
zshard(void *arg)
{
struct zsc_softc *zsc;
int unit, rr3, rval, softreq;
int unit, rr3, rval;
if (!INTR_OCCURRED(NEXT_I_SCC))
return 0;
rval = softreq = 0;
rval = 0;
for (unit = 0; unit < zsc_cd.cd_ndevs; unit++) {
zsc = zsc_cd.cd_devs[unit];
if (zsc == NULL)
@ -335,52 +331,14 @@ zshard(void *arg)
rval |= rr3;
zsc->zsc_intrcnt.ev_count++;
}
softreq |= zsc->zsc_cs[0]->cs_softreq;
softreq |= zsc->zsc_cs[1]->cs_softreq;
/* We are at splzs here, so no need to lock. */
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);
}
/*
* 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.
*/

View File

@ -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
@ -42,72 +42,60 @@
/* watch out for side effects */
#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_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 struct {
ipl_t _ipl;
ipl_t _psl;
} ipl_cookie_t;
static inline ipl_cookie_t
makeiplcookie(ipl_t ipl)
{
extern const int ipl2psl_table[NIPL];
return (ipl_cookie_t){._ipl = ipl};
}
ipl_cookie_t makeiplcookie(ipl_t);
static inline int
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 */
int spl0(void);
@ -118,6 +106,8 @@ extern volatile u_long *intrmask;
#define INTR_DISABLE(x) (*intrmask &= (~NEXT_I_BIT(x)))
#define INTR_OCCURRED(x) (*intrstat & NEXT_I_BIT(x))
#include <m68k/softintr.h>
#endif /* _KERNEL */
#endif /* _NEXT68K_INTR_H_ */

View File

@ -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>
#define __HAVE_TIMECOUNTER
#define __HAVE_GENERIC_TODR
#define __HAVE_GENERIC_SOFT_INTERRUPTS
#define __HAVE_GENERIC_TODR

View File

@ -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
@ -50,6 +50,7 @@ struct zsc_softc {
/* Machine-dependent part follows... */
struct evcnt zsc_intrcnt; /* count interrupts */
struct zs_chanstate zsc_cs_store[2];
void *zsc_softintr_cookie;
};
/*

View File

@ -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
@ -85,7 +85,7 @@
*/
#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/systm.h>
@ -159,7 +159,7 @@ cpu_configure(void)
INTR_SETMASK(0);
init_sir();
softintr_init();
if (config_rootfound("mainbus", NULL) == NULL)
panic("autoconfig failed, no root");

View File

@ -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
@ -48,7 +48,7 @@
*/
#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/systm.h>
@ -386,36 +386,6 @@ isrdispatch_vectored(int ipl, struct clockframe *frame)
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
/* ARGSUSED */
static int
@ -425,3 +395,25 @@ spurintr(void *arg)
return (1);
}
#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};
}

View File

@ -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
@ -1018,8 +1018,6 @@ Lintrhand_exit:
* necessitating a stack cleanup.
*/
BSS(ssir,1)
ASENTRY_NOPROFILE(rei)
tstl _C_LABEL(astpending) | AST pending?
jeq Lchksir | no, go check for SIR

View File

@ -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
@ -84,7 +84,7 @@
*/
#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_execfmt.h"
@ -220,12 +220,6 @@ int mmupid = -1;
#define MDB_ISPID(p) ((p) == mmupid)
#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
* to user mode.
@ -315,7 +309,6 @@ trap(int type, unsigned code, unsigned v, struct frame frame)
ksiginfo_t ksi;
int s;
u_quad_t sticks = 0 /* XXX initialiser works around compiler bug */;
int bit;
static int panicking = 0;
uvmexp.traps++;
@ -585,13 +578,9 @@ trap(int type, unsigned code, unsigned v, struct frame frame)
case T_SSIR: /* software interrupt */
case T_SSIR|T_USER:
while ((bit = ffs(ssir))) {
--bit;
ssir &= ~(1 << bit);
uvmexp.softs++;
if (sir_routines[bit])
sir_routines[bit](sir_args[bit]);
}
softintr_dispatch();
/*
* 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
/*
* 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;
}