Subject: atari softintr(9) patch
To: None <port-atari@NetBSD.org>
From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
List: port-atari
Date: 03/07/2007 01:51:52
(please cc: me on replies since I don't subscribe port-atari)
Here is one for atari.
There are two concerns on implementation:
- Many drivers on this port heavily depend on add_sicallback() function
which uses setsoftcback() in (now obsolete) MD softintr functions.
Some of functions which use this callback should be rewritten to
use MI softintr(9) directly.
- According to <machine/scu.h> and lev1intr() hander in locore.s,
at least _ATARIHW_ machines (ATARITT and HADES?) seem to have
some hardware support which can initiate real hardware interrupt
at ipl 1 for software interrupt. But as per <machine/mtpr.h>,
this feature has not been used at all on setsoft*() calls and
traditional hp300 derived ssir (simulated software interrupt
request) on VAX REI emulation in locore.s is used.
If we'll make this port use this hardware support for softintr(9),
we can't use MI m68k/softintr.c and have to prepare its own
softintr dispatcher.
Anyway, if this patch works, it's enough for intermediate fix,
I believe...
---
Izumi Tsutsui
Index: atari/autoconf.c
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/atari/autoconf.c,v
retrieving revision 1.52
diff -u -r1.52 autoconf.c
--- atari/autoconf.c 11 Dec 2005 12:16:54 -0000 1.52
+++ atari/autoconf.c 6 Mar 2007 16:34:53 -0000
@@ -63,6 +63,9 @@
atari_realconfig = 1;
+ softintr_init();
+ init_sicallback();
+
if (config_rootfound("mainbus", __UNCONST("mainbus")) == NULL)
panic("no mainbus found");
}
Index: atari/intr.c
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/atari/intr.c,v
retrieving revision 1.11
diff -u -r1.11 intr.c
--- atari/intr.c 11 Dec 2005 12:16:54 -0000 1.11
+++ atari/intr.c 6 Mar 2007 16:34:54 -0000
@@ -321,3 +321,26 @@
else
printf("intr_dispatch: stray level %d interrupt\n", vector);
}
+
+static const int ipl2psl_table[] = {
+ [IPL_NONE] = PSL_IPL0,
+ [IPL_SOFT] = PSL_IPL1,
+ [IPL_SOFTCLOCK] = PSL_IPL1,
+ [IPL_SOFTNET] = PSL_IPL1,
+ [IPL_SOFTSERIAL] = PSL_IPL1,
+ [IPL_BIO] = PSL_IPL3,
+ [IPL_NET] = PSL_IPL3,
+ [IPL_TTY] = PSL_IPL4,
+ /* IPL_LPT == IPL_TTY */
+ [IPL_VM] = PSL_IPL4,
+ [IPL_SERIAL] = PSL_IPL5,
+ [IPL_CLOCK] = PSL_IPL6,
+ [IPL_HIGH] = PSL_IPL7,
+};
+
+ipl_cookie_t
+makeiplcookie(ipl_t ipl)
+{
+
+ return (ipl_cookie_t){._psl = ipl2psl_table[ipl] | PSL_S};
+}
Index: atari/locore.s
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/atari/locore.s,v
retrieving revision 1.96
diff -u -r1.96 locore.s
--- atari/locore.s 1 Sep 2006 19:11:56 -0000 1.96
+++ atari/locore.s 6 Mar 2007 16:34:54 -0000
@@ -758,7 +758,7 @@
movl _C_LABEL(stio_addr),%a0 | get KVA of ST-IO area
moveb #0, %a0@(SCU_SOFTINT) | Turn off software interrupt
addql #1,_C_LABEL(intrcnt)+16 | add another software interrupt
- jbsr _C_LABEL(softint) | handle software interrupts
+ jbsr _C_LABEL(softintr_dispatch) | XXX handle software interrupts
moveml %sp@+,%d0-%d1/%a0-%a1
addql #1,_C_LABEL(uvmexp)+UVMEXP_INTRS
jra _ASM_LABEL(rei)
@@ -803,7 +803,6 @@
* point for coprocessor mid-instruction frames (type 9), but we also test
* for bus error frames (type 10 and 11).
*/
- BSS(ssir,1)
ASENTRY_NOPROFILE(rei)
#ifdef DEBUG
tstl _C_LABEL(panicstr) | have we paniced?
Index: atari/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/atari/machdep.c,v
retrieving revision 1.143
diff -u -r1.143 machdep.c
--- atari/machdep.c 4 Mar 2007 05:59:39 -0000 1.143
+++ atari/machdep.c 6 Mar 2007 16:34:54 -0000
@@ -133,7 +133,6 @@
static void bootsync __P((void));
static void call_sicallbacks __P((void));
static void identifycpu __P((void));
-static void netintr __P((void));
void straymfpint __P((int, u_short));
void straytrap __P((int, u_short));
@@ -695,30 +694,6 @@
evec & 0xFFF, pc);
}
-/*
- * Simulated software interrupt handler
- */
-void
-softint()
-{
- if(ssir & SIR_NET) {
- siroff(SIR_NET);
- uvmexp.softs++;
- netintr();
- }
- if(ssir & SIR_CLOCK) {
- siroff(SIR_CLOCK);
- uvmexp.softs++;
- /* XXXX softclock(&frame.f_stackadj); */
- softclock(NULL);
- }
- if (ssir & SIR_CBACK) {
- siroff(SIR_CBACK);
- uvmexp.softs++;
- call_sicallbacks();
- }
-}
-
int *nofault;
int
@@ -755,25 +730,6 @@
}
/*
- * Network interrupt handling
- */
-static void
-netintr()
-{
-#define DONETISR(bit, fn) do { \
- if (netisr & (1 << bit)) { \
- netisr &= ~(1 << bit); \
- fn(); \
- } \
-} while (0)
-
-#include <net/netisr_dispatch.h>
-
-#undef DONETISR
-}
-
-
-/*
* this is a handy package to have asynchronously executed
* function calls executed at very low interrupt priority.
* Example for use is keyboard repeat, where the repeat
@@ -782,18 +738,29 @@
* Note: the installed functions are currently called in a
* LIFO fashion, might want to change this to FIFO
* later.
+ *
+ * XXX: Some of functions which use this callback should be rewritten
+ * XXX: to use MI softintr(9) directly.
*/
struct si_callback {
struct si_callback *next;
void (*function) __P((void *rock1, void *rock2));
void *rock1, *rock2;
};
+static void *si_callback_cookie;
static struct si_callback *si_callbacks;
static struct si_callback *si_free;
#ifdef DIAGNOSTIC
static int ncbd; /* number of callback blocks dynamically allocated */
#endif
+void init_sicallback(void)
+{
+
+ si_callback_cookie = softintr_establish(IPL_SOFT,
+ (void (*)(void *))call_sicallbacks, NULL);
+}
+
void add_sicallback (function, rock1, rock2)
void (*function) __P((void *rock1, void *rock2));
void *rock1, *rock2;
@@ -832,8 +799,17 @@
/*
* and cause a software interrupt (spl1). This interrupt might
* happen immediately, or after returning to a safe enough level.
+ *
+ * XXX:
+ * According to <machine/scu.h> and lev1intr() hander in locore.s,
+ * at least _ATARIHW_ machines (ATARITT and HADES?) seem to have
+ * some hardware support which can initiate real hardware interrupt
+ * at ipl 1 for software interrupt. But as per <machine/mtpr.h>,
+ * this feature was not used at all on setsoft*() calls and
+ * traditional hp300 derived ssir (simulated software interrupt
+ * request) on VAX REI emulation in locore.s is used.
*/
- setsoftcback();
+ softintr_schedule(si_callback_cookie);
}
void rem_sicallback(function)
@@ -880,7 +856,7 @@
rock2 = si->rock2;
s = splhigh ();
if(si_callbacks)
- setsoftcback();
+ softintr_schedule(si_callback_cookie);
si->next = si_free;
si_free = si;
splx(s);
Index: atari/trap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/atari/trap.c,v
retrieving revision 1.87
diff -u -r1.87 trap.c
--- atari/trap.c 4 Mar 2007 05:59:39 -0000 1.87
+++ atari/trap.c 6 Mar 2007 16:34:54 -0000
@@ -107,7 +107,6 @@
#include <machine/trap.h>
#include <machine/cpu.h>
#include <machine/reg.h>
-#include <machine/mtpr.h>
#include <machine/pte.h>
#ifdef DDB
#include <machine/db_machdep.h>
@@ -599,8 +598,9 @@
*/
case T_SSIR:
case T_SSIR|T_USER:
- if(ssir)
- softint();
+
+ softintr_dispatch();
+
/*
* If this was not an AST trap, we are all done.
*/
Index: conf/files.atari
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/conf/files.atari,v
retrieving revision 1.108
diff -u -r1.108 files.atari
--- conf/files.atari 11 Dec 2005 12:16:54 -0000 1.108
+++ conf/files.atari 6 Mar 2007 16:34:54 -0000
@@ -211,6 +211,7 @@
file arch/m68k/m68k/cacheops.c
file arch/m68k/m68k/db_memrw.c ddb
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
Index: include/cpu.h
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/include/cpu.h,v
retrieving revision 1.51
diff -u -r1.51 cpu.h
--- include/cpu.h 4 Mar 2007 05:59:41 -0000 1.51
+++ include/cpu.h 6 Mar 2007 16:34:55 -0000
@@ -164,9 +164,6 @@
extern int astpending; /* need trap before returning to user mode */
extern int want_resched; /* resched() was called */
-/* include support for software interrupts */
-#include <machine/mtpr.h>
-
/*
* The rest of this should probably be moved to ../atari/ataricpu.h,
* although some of it could probably be put into generic 68k headers.
@@ -268,11 +265,11 @@
* Prototypes from machdep.c:
*/
typedef void (*si_farg)(void *, void *); /* XXX */
+void init_sicallback __P((void)); /* XXX */
void add_sicallback __P((si_farg, void *, void *));
void rem_sicallback __P((si_farg));
void dumpsys __P((void));
vaddr_t reserve_dumppages __P((vaddr_t));
-void softint __P((void));
/*
Index: include/intr.h
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/include/intr.h,v
retrieving revision 1.13
diff -u -r1.13 intr.h
--- include/intr.h 16 Feb 2007 02:53:45 -0000 1.13
+++ include/intr.h 6 Mar 2007 16:34:55 -0000
@@ -37,16 +37,22 @@
#define _ATARI_INTR_H_
#define IPL_NONE 0 /* disable no interrupts */
-#define IPL_BIO (PSL_S|PSL_IPL3) /* disable block I/O interrupts */
-#define IPL_NET (PSL_S|PSL_IPL3) /* disable network interrupts */
-#define IPL_TTY (PSL_S|PSL_IPL4) /* disable terminal interrupts */
+#define IPL_SOFTCLOCK 1
+#define IPL_SOFTNET 2
+#define IPL_SOFTSERIAL 3
+#define IPL_SOFT 4
+#define IPL_BIO 5 /* disable block I/O interrupts */
+#define IPL_NET 6 /* disable network interrupts */
+#define IPL_TTY 7 /* disable terminal interrupts */
#define IPL_LPT IPL_TTY
-#define IPL_VM (PSL_S|PSL_IPL4)
-#define IPL_CLOCK (PSL_S|PSL_IPL6) /* disable clock interrupts */
+#define IPL_VM 8
+#define IPL_SERIAL 9
+#define IPL_CLOCK 10 /* disable clock interrupts */
#define IPL_STATCLOCK IPL_CLOCK
-#define IPL_HIGH (PSL_S|PSL_IPL7) /* disable all interrupts */
+#define IPL_HIGH 11 /* disable all interrupts */
#define IPL_SCHED IPL_HIGH
#define IPL_LOCK IPL_HIGH
+#define NIPL 12
#define IST_UNUSABLE -1 /* interrupt cannot be used */
#define IST_NONE 0 /* none (dummy) */
@@ -63,13 +69,15 @@
#define splnone() spl0()
-#define splsoftclock() splraise1()
-#define splsoftnet() splraise1()
-
-#define splbio() _splraise(PSL_S|PSL_IPL3)
-#define splnet() _splraise(PSL_S|PSL_IPL3)
-#define spltty() _splraise(PSL_S|PSL_IPL4)
-#define splvm() _splraise(PSL_S|PSL_IPL4)
+#define splsoft() splraise1()
+#define splsoftclock() splsoft()
+#define splsoftnet() splsoft()
+#define splsoftserial() splsoft()
+
+#define splbio() splraise3()
+#define splnet() splraise3()
+#define spltty() splraise4()
+#define splvm() splraise4()
#define spllpt() spltty()
@@ -86,22 +94,20 @@
typedef int ipl_t;
typedef struct {
- int _ipl;
+ int _psl;
} ipl_cookie_t;
-static inline ipl_cookie_t
-makeiplcookie(ipl_t ipl)
-{
-
- 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 <m68k/softintr.h>
+
#endif /* _KERNEL */
#endif /* _ATARI_INTR_H_ */
Index: include/types.h
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/include/types.h,v
retrieving revision 1.8
diff -u -r1.8 types.h
--- include/types.h 28 Feb 2002 03:17:32 -0000 1.8
+++ include/types.h 6 Mar 2007 16:34:55 -0000
@@ -4,5 +4,6 @@
#define _MACHINE_TYPES_H_
#include <m68k/types.h>
+#define __HAVE_GENERIC_SOFT_INTERRUPTS
#endif