Port-luna68k archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

luna68k and x68k MI softintr(9)



I'm not sure how many luna68k and x68k users there are
outside of Japan, but I'd also post a patch that
adds MI softintr(9) support (which is now mandatory
after newlock2 merge) based on hp300 implementation
(using VAX REI emulation and trap).

Changes are simple, just copy hp300/softintr.c into
m68k/softintr.c, modify it, and put several tweaks in each
MD files.

This patch also contains which create a.out kernel for
the luna68k PROM monitor, but I'm not sure if it's really work. 

Pre-compiled kernels are also available:
http://www.ceres.dti.ne.jp/~tsutsui/netbsd/netbsd-luna68k-GENERIC-20070303.gz
http://www.ceres.dti.ne.jp/~tsutsui/netbsd/netbsd-luna68k-GENERIC.aout-20070303.gz
http://www.ceres.dti.ne.jp/~tsutsui/netbsd/netbsd-x68k-GENERIC-20070303.gz

---
Izumi Tsutsui


Index: arch/cats/conf/Makefile.cats.inc
===================================================================
RCS file: /cvsroot/src/sys/arch/cats/conf/Makefile.cats.inc,v
retrieving revision 1.17
diff -u -r1.17 Makefile.cats.inc
--- arch/cats/conf/Makefile.cats.inc    24 Nov 2005 12:54:29 -0000      1.17
+++ arch/cats/conf/Makefile.cats.inc    3 Mar 2007 11:54:00 -0000
@@ -17,7 +17,7 @@
 
 SYSTEM_LD_HEAD_EXTRA+=; \
        ( cat ${ARM}/conf/kern.ldscript.head ; \
-         OBJDUMP=${OBJDUMP} ${HOST_SH} ${ARM}/conf/mkldscript.sh \
+         OBJDUMP=${OBJDUMP} ${HOST_SH} $S/conf/mkldscript.sh \
                ${SYSTEM_OBJ} ; \
          cat ${ARM}/conf/kern.ldscript.tail ) > ldscript
 
Index: arch/hp300/conf/files.hp300
===================================================================
RCS file: /cvsroot/src/sys/arch/hp300/conf/files.hp300,v
retrieving revision 1.75
diff -u -r1.75 files.hp300
--- arch/hp300/conf/files.hp300 20 Jul 2006 13:21:38 -0000      1.75
+++ arch/hp300/conf/files.hp300 3 Mar 2007 11:54:01 -0000
@@ -188,7 +188,6 @@
 file   arch/hp300/hp300/leds.c                 useleds
 file   arch/hp300/hp300/mem.c
 file   arch/hp300/hp300/pmap_bootstrap.c       compile-with "${NOPROF_C}"
-file   arch/hp300/hp300/softintr.c
 file   arch/hp300/hp300/trap.c
 file   arch/hp300/hp300/disksubr.c
 file   arch/m68k/m68k/cacheops.c
@@ -196,6 +195,7 @@
 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
 
Index: arch/hp300/include/intr.h
===================================================================
RCS file: /cvsroot/src/sys/arch/hp300/include/intr.h,v
retrieving revision 1.19
diff -u -r1.19 intr.h
--- arch/hp300/include/intr.h   16 Feb 2007 02:53:46 -0000      1.19
+++ arch/hp300/include/intr.h   3 Mar 2007 11:54:01 -0000
@@ -69,20 +69,6 @@
 #define        IPL_LOCK        IPL_HIGH
 #define        NIPL            12
 
-#define        SI_SOFTSERIAL   0       /* serial software interrupts */
-#define        SI_SOFTNET      1       /* network software interrupts */
-#define        SI_SOFTCLOCK    2       /* clock software interrupts */
-#define        SI_SOFT         3       /* other software interrupts */
-
-#define        SI_NQUEUES      4
-
-#define        SI_QUEUENAMES {                                                 
\
-       "serial",                                                       \
-       "net",                                                          \
-       "clock",                                                        \
-       "misc",                                                         \
-}
-
 /*
  * Convert PSL values to m68k CPU IPLs and vice-versa.
  * Note: CPU IPL values are different from IPL_* used by splraiseipl().
@@ -150,43 +136,6 @@
        struct evcnt hi_evcnt;
 };
 
-/*
- * Software Interrupts.
- */
-
-struct hp300_soft_intrhand {
-       LIST_ENTRY(hp300_soft_intrhand) sih_q;
-       struct hp300_soft_intr *sih_intrhead;
-       void (*sih_fn)(void *);
-       void *sih_arg;
-       volatile int sih_pending;
-};
-
-struct hp300_soft_intr {
-       LIST_HEAD(, hp300_soft_intrhand) hsi_q;
-       struct evcnt hsi_evcnt;
-       uint8_t hsi_ipl;
-};
-
-void   *softintr_establish(int, void (*)(void *), void *);
-void   softintr_disestablish(void *);
-void   softintr_init(void);
-void   softintr_dispatch(void);
-
-extern volatile uint8_t ssir;
-#define setsoft(x)     ssir |= (1<<(x))
-
-#define softintr_schedule(arg)                         \
-do {                                                   \
-       struct hp300_soft_intrhand *__sih = (arg);      \
-       __sih->sih_pending = 1;                         \
-       setsoft(__sih->sih_intrhead->hsi_ipl);          \
-} while (0)
-
-/* XXX For legacy software interrupts */
-extern struct hp300_soft_intrhand *softnet_intrhand;
-#define setsoftnet()   softintr_schedule(softnet_intrhand)
-
 /* locore.s */
 int    spl0(void);
 
@@ -196,8 +145,9 @@
 void   intr_disestablish(void *);
 void   intr_dispatch(int);
 void   intr_printlevels(void);
-void   netintr(void);
 
 #endif /* _KERNEL */
 
+#include <m68k/softintr.h>
+
 #endif /* _HP300_INTR_H_ */
Index: arch/luna68k/conf/Makefile.luna68k
===================================================================
RCS file: /cvsroot/src/sys/arch/luna68k/conf/Makefile.luna68k,v
retrieving revision 1.18
diff -u -r1.18 Makefile.luna68k
--- arch/luna68k/conf/Makefile.luna68k  11 Dec 2005 12:17:51 -0000      1.18
+++ arch/luna68k/conf/Makefile.luna68k  3 Mar 2007 11:54:04 -0000
@@ -54,8 +54,25 @@
 ##
 ## (5) link settings
 ##
-LINKFORMAT=    -N
-TEXTADDR?=     0xc000
+LINKFORMAT=    -T ldscript
+.if (${OBJECT_FMT} == "ELF")
+# Need to convert the kernel from ELF to a.out so that OpenFirmware
+# can load it.
+
+LINKFLAGS=      -T ldscript
+
+SYSTEM_LD_HEAD_EXTRA+=; \
+       ( cat ${LUNA68K}/conf/kern.ldscript.head ; \
+         OBJDUMP=${OBJDUMP} ${HOST_SH} $S/conf/mkldscript.sh \
+               ${SYSTEM_OBJ} ; \
+         cat ${LUNA68K}/conf/kern.ldscript.tail ) > ldscript
+
+SYSTEM_LD_TAIL_EXTRA+=; \
+       echo \
+        "${OBJCOPY} -O a.out-m68k-netbsd -R .ident -R .comment -R 
.note.netbsd.ident $@ $@.aout"; \
+       ${OBJCOPY} -O a.out-m68k-netbsd \
+           -R .ident -R .comment -R .note.netbsd.ident $@ $@.aout
+.endif
 
 ##
 ## (6) port specific target dependencies
Index: arch/luna68k/conf/files.luna68k
===================================================================
RCS file: /cvsroot/src/sys/arch/luna68k/conf/files.luna68k,v
retrieving revision 1.17
diff -u -r1.17 files.luna68k
--- arch/luna68k/conf/files.luna68k     11 Dec 2005 12:17:52 -0000      1.17
+++ arch/luna68k/conf/files.luna68k     3 Mar 2007 11:54:04 -0000
@@ -19,6 +19,7 @@
 file arch/m68k/m68k/db_memrw.c         ddb | 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
 file dev/cons.c
Index: arch/luna68k/include/cpu.h
===================================================================
RCS file: /cvsroot/src/sys/arch/luna68k/include/cpu.h,v
retrieving revision 1.14
diff -u -r1.14 cpu.h
--- arch/luna68k/include/cpu.h  16 Feb 2007 02:53:48 -0000      1.14
+++ arch/luna68k/include/cpu.h  3 Mar 2007 11:54:04 -0000
@@ -158,22 +158,6 @@
 extern int     astpending;     /* need to trap before returning to user mode */
 extern int     want_resched;   /* resched() was called */
 
-/*
- * simulated software interrupt register
- */
-extern unsigned char ssir;
-
-#define SIR_NET                0x1
-#define SIR_CLOCK      0x2
-
-#define siron(x)       \
-       __asm volatile ("orb %0,%1" : : "di" ((u_char)(x)), "g" (ssir))
-#define siroff(x)      \
-       __asm volatile ("andb %0,%1" : : "di" ((u_char)~(x)), "g" (ssir))
-
-#define setsoftnet()   siron(SIR_NET)
-#define setsoftclock() siron(SIR_CLOCK)
-
 #endif /* _KERNEL */
 
 /*
Index: arch/luna68k/include/intr.h
===================================================================
RCS file: /cvsroot/src/sys/arch/luna68k/include/intr.h,v
retrieving revision 1.6
diff -u -r1.6 intr.h
--- arch/luna68k/include/intr.h 16 Feb 2007 02:53:48 -0000      1.6
+++ arch/luna68k/include/intr.h 3 Mar 2007 11:54:04 -0000
@@ -47,16 +47,18 @@
 #include <machine/psl.h>
 
 #define splnone()      spl0()
-#define splsoftclock()  splraise1()
-#define splsoftnet()    splraise1()
-#define splbio()        spl2()
-#define splnet()        spl3()
-#define spltty()        spl6()
-#define splclock()      spl5()
-#define splstatclock() spl5()
-#define splvm()         spl7()
-#define splhigh()       spl7()
-#define splsched()      spl7()
+#define splsoft()      splraise1()
+#define splsoftclock() splsoft()
+#define splsoftnet()   splsoft()
+#define splsoftserial()        splsoft()
+#define splbio()       splraise2()
+#define splnet()       splraise3()
+#define spltty()       splraise6()
+#define splclock()     splraise5()
+#define splstatclock() splraise5()
+#define splvm()                spl7()
+#define splhigh()      spl7()
+#define splsched()     spl7()
 #define spllock()      spl7()
 
 /* watch out for side effects */
@@ -67,18 +69,20 @@
 #define        IPL_NONE        0
 #define        IPL_SOFTCLOCK   1
 #define        IPL_SOFTNET     2
-#define        IPL_BIO         3
-#define        IPL_NET         4
-#define        IPL_CLOCK       5
-#define        IPL_STATCLOCK   6
-#define        IPL_TTY         7
-#define        IPL_VM          8
-#define        IPL_SCHED       9
-#define        IPL_HIGH        10
-#define        IPL_LOCK        11
-#define        NIPLS           12
+#define        IPL_SOFTSERIAL  3
+#define        IPL_SOFT        4
+#define        IPL_BIO         5
+#define        IPL_NET         6
+#define        IPL_CLOCK       7
+#define        IPL_STATCLOCK   8
+#define        IPL_TTY         9
+#define        IPL_VM          10
+#define        IPL_SCHED       11
+#define        IPL_HIGH        12
+#define        IPL_LOCK        13
+#define        NIPL            14
 
-extern const int ipl2spl_table[NIPLS];
+extern const int ipl2spl_table[NIPL];
 
 typedef int ipl_t;
 typedef struct {
@@ -100,4 +104,6 @@
 }
 #endif /* _KERNEL */
 
+#include <m68k/softintr.h>
+
 #endif /* _MACHINE_INTR_H */
Index: arch/luna68k/include/types.h
===================================================================
RCS file: /cvsroot/src/sys/arch/luna68k/include/types.h,v
retrieving revision 1.3
diff -u -r1.3 types.h
--- arch/luna68k/include/types.h        14 Sep 2006 15:04:07 -0000      1.3
+++ arch/luna68k/include/types.h        3 Mar 2007 11:54:04 -0000
@@ -6,6 +6,7 @@
 #include <m68k/types.h>
 
 #define        __HAVE_TIMECOUNTER
+#define        __HAVE_GENERIC_SOFT_INTERRUPTS
 #define        __HAVE_GENERIC_TODR
 
 #endif
Index: arch/luna68k/luna68k/autoconf.c
===================================================================
RCS file: /cvsroot/src/sys/arch/luna68k/luna68k/autoconf.c,v
retrieving revision 1.6
diff -u -r1.6 autoconf.c
--- arch/luna68k/luna68k/autoconf.c     11 Dec 2005 12:17:52 -0000      1.6
+++ arch/luna68k/luna68k/autoconf.c     3 Mar 2007 11:54:04 -0000
@@ -64,6 +64,7 @@
 
        (void)splhigh();
        isrinit();
+       softintr_init();
        if (config_rootfound("mainbus", NULL) == NULL)
                panic("autoconfig failed, no root");
 
Index: arch/luna68k/luna68k/isr.c
===================================================================
RCS file: /cvsroot/src/sys/arch/luna68k/luna68k/isr.c,v
retrieving revision 1.9
diff -u -r1.9 isr.c
--- arch/luna68k/luna68k/isr.c  21 Dec 2006 15:55:23 -0000      1.9
+++ arch/luna68k/luna68k/isr.c  3 Mar 2007 11:54:04 -0000
@@ -296,17 +296,19 @@
 
 }
 
-const int ipl2spl_table[NIPLS] = {
-       [IPL_NONE] = PSL_S|PSL_IPL0,
-       [IPL_SOFTCLOCK] = PSL_S|PSL_IPL1,
-       [IPL_SOFTNET] = PSL_S|PSL_IPL1,
-       [IPL_BIO] = PSL_S|PSL_IPL2,
-       [IPL_NET] = PSL_S|PSL_IPL3,
-       [IPL_CLOCK] = PSL_S|PSL_IPL5,
-       [IPL_STATCLOCK] = PSL_S|PSL_IPL5,
-       [IPL_TTY] = PSL_S|PSL_IPL6,
-       [IPL_VM] = PSL_S|PSL_IPL7,
-       [IPL_SCHED] = PSL_S|PSL_IPL7,
-       [IPL_HIGH] = PSL_S|PSL_IPL7,
-       [IPL_LOCK] = PSL_S|PSL_IPL7,
+const int ipl2spl_table[NIPL] = {
+       [IPL_NONE]       = PSL_S|PSL_IPL0,
+       [IPL_SOFTCLOCK]  = PSL_S|PSL_IPL1,
+       [IPL_SOFTNET]    = PSL_S|PSL_IPL1,
+       [IPL_SOFTSERIAL] = PSL_S|PSL_IPL1,
+       [IPL_SOFT]       = PSL_S|PSL_IPL1,
+       [IPL_BIO]        = PSL_S|PSL_IPL2,
+       [IPL_NET]        = PSL_S|PSL_IPL3,
+       [IPL_CLOCK]      = PSL_S|PSL_IPL5,
+       [IPL_STATCLOCK]  = PSL_S|PSL_IPL5,
+       [IPL_TTY]        = PSL_S|PSL_IPL6,
+       [IPL_VM]         = PSL_S|PSL_IPL7,
+       [IPL_SCHED]      = PSL_S|PSL_IPL7,
+       [IPL_HIGH]       = PSL_S|PSL_IPL7,
+       [IPL_LOCK]       = PSL_S|PSL_IPL7,
 };
Index: arch/luna68k/luna68k/locore.s
===================================================================
RCS file: /cvsroot/src/sys/arch/luna68k/luna68k/locore.s,v
retrieving revision 1.23
diff -u -r1.23 locore.s
--- arch/luna68k/luna68k/locore.s       11 Dec 2005 12:17:52 -0000      1.23
+++ arch/luna68k/luna68k/locore.s       3 Mar 2007 11:54:04 -0000
@@ -866,7 +866,6 @@
  * This code is complicated by the fact that sendsig may have been called
  * necessitating a stack cleanup.
  */
-BSS(ssir,1)
 
 ASENTRY_NOPROFILE(rei)
        tstl    _C_LABEL(astpending)    | AST pending?
Index: arch/luna68k/luna68k/trap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/luna68k/luna68k/trap.c,v
retrieving revision 1.40
diff -u -r1.40 trap.c
--- arch/luna68k/luna68k/trap.c 9 Feb 2007 21:55:05 -0000       1.40
+++ arch/luna68k/luna68k/trap.c 3 Mar 2007 11:54:04 -0000
@@ -514,17 +514,9 @@
 
        case T_SSIR:            /* software interrupt */
        case T_SSIR|T_USER:
-               if (ssir & SIR_NET) {
-                       void netintr __P((void));
-                       siroff(SIR_NET);
-                       uvmexp.softs++;
-                       netintr();
-               }
-               if (ssir & SIR_CLOCK) {
-                       siroff(SIR_CLOCK);
-                       uvmexp.softs++;
-                       softclock(NULL);
-               }
+
+               softintr_dispatch();
+
                /*
                 * If this was not an AST trap, we are all done.
                 */
Index: arch/shark/conf/Makefile.shark.inc
===================================================================
RCS file: /cvsroot/src/sys/arch/shark/conf/Makefile.shark.inc,v
retrieving revision 1.6
diff -u -r1.6 Makefile.shark.inc
--- arch/shark/conf/Makefile.shark.inc  24 Nov 2005 12:54:30 -0000      1.6
+++ arch/shark/conf/Makefile.shark.inc  3 Mar 2007 11:54:06 -0000
@@ -12,7 +12,7 @@
 
 SYSTEM_LD_HEAD_EXTRA+=; \
        ( cat ${ARM}/conf/kern.ldscript.head ; \
-         OBJDUMP=${OBJDUMP} ${HOST_SH} ${ARM}/conf/mkldscript.sh \
+         OBJDUMP=${OBJDUMP} ${HOST_SH} $S/conf/mkldscript.sh \
                ${SYSTEM_OBJ} ; \
          cat ${ARM}/conf/kern.ldscript.tail ) > ldscript
 
Index: arch/x68k/conf/files.x68k
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/conf/files.x68k,v
retrieving revision 1.61
diff -u -r1.61 files.x68k
--- arch/x68k/conf/files.x68k   11 Dec 2005 12:19:37 -0000      1.61
+++ arch/x68k/conf/files.x68k   3 Mar 2007 11:54:08 -0000
@@ -39,6 +39,7 @@
 file   arch/m68k/m68k/db_memrw.c       ddb
 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
 
Index: arch/x68k/dev/kbd.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/dev/kbd.c,v
retrieving revision 1.26
diff -u -r1.26 kbd.c
--- arch/x68k/dev/kbd.c 24 Jan 2007 13:08:11 -0000      1.26
+++ arch/x68k/dev/kbd.c 3 Mar 2007 11:54:08 -0000
@@ -67,11 +67,12 @@
 
        int sc_event_mode;      /* if true, collect events, else pass to ite */
        struct evvar sc_events; /* event queue state */
+       void *sc_softintr_cookie;
 };
 
 void   kbdenable(int);
 int    kbdintr (void *);
-void   kbdsoftint(void);
+void   kbdsoftint(void *);
 void   kbd_bell(int);
 int    kbdcngetc(void);
 void   kbd_setLED(void);
@@ -113,8 +114,8 @@
 static void 
 kbdattach(struct device *parent, struct device *self, void *aux)
 {
-       struct kbd_softc *k = (void*) self;
-       struct mfp_softc *mfp = (void*) parent;
+       struct kbd_softc *sc = (void *)self;
+       struct mfp_softc *mfp = (void *)parent;
        int s;
 
        kbd_attached = 1;
@@ -122,11 +123,12 @@
        s = spltty();
 
        /* MFP interrupt #12 is for USART receive buffer full */
-       intio_intr_establish(mfp->sc_intr + 12, "kbd", kbdintr, self);
+       intio_intr_establish(mfp->sc_intr + 12, "kbd", kbdintr, sc);
+       sc->sc_softintr_cookie = softintr_establish(IPL_SOFT, kbdsoftint, sc);
 
        kbdenable(1);
-       k->sc_event_mode = 0;
-       k->sc_events.ev_io = 0;
+       sc->sc_event_mode = 0;
+       sc->sc_events.ev_io = 0;
        splx(s);
 
        printf("\n");
@@ -318,7 +320,7 @@
 kbdintr(void *arg)
 {
        u_char c, st;
-       struct kbd_softc *k = arg; /* XXX */
+       struct kbd_softc *sc = arg;
        struct firm_event *fe;
        int put;
 
@@ -331,9 +333,9 @@
                return 0;       /* intr caused by an err -- no char received */
 
        /* if not in event mode, deliver straight to ite to process key stroke 
*/
-       if (! k->sc_event_mode) {
+       if (!sc->sc_event_mode) {
                kbdbuf[kbdputoff++ & KBDBUFMASK] = c;
-               setsoftkbd();
+               softintr_schedule(sc->sc_softintr_cookie);
                return 0;
        }
 
@@ -341,24 +343,24 @@
           event and put it in the queue.  If the queue is full, the
           keystroke is lost (sorry!). */
 
-       put = k->sc_events.ev_put;
-       fe = &k->sc_events.ev_q[put];
+       put = sc->sc_events.ev_put;
+       fe = &sc->sc_events.ev_q[put];
        put = (put + 1) % EV_QSIZE;
-       if (put == k->sc_events.ev_get) {
+       if (put == sc->sc_events.ev_get) {
                log(LOG_WARNING, "keyboard event queue overflow\n"); /* ??? */
                return 0;
        }
        fe->id = KEY_CODE(c);
        fe->value = KEY_UP(c) ? VKEY_UP : VKEY_DOWN;
        getmicrotime(&fe->time);
-       k->sc_events.ev_put = put;
-       EV_WAKEUP(&k->sc_events);
+       sc->sc_events.ev_put = put;
+       EV_WAKEUP(&sc->sc_events);
 
        return 0;
 }
 
 void 
-kbdsoftint(void)                       /* what if ite is not configured? */
+kbdsoftint(void *arg)                  /* what if ite is not configured? */
 {
        int s;
 
Index: arch/x68k/dev/zs.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/dev/zs.c,v
retrieving revision 1.29
diff -u -r1.29 zs.c
--- arch/x68k/dev/zs.c  28 Mar 2006 17:38:28 -0000      1.29
+++ arch/x68k/dev/zs.c  3 Mar 2007 11:54:08 -0000
@@ -139,7 +139,6 @@
 extern struct cfdriver zsc_cd;
 
 static int zshard(void *);
-int zssoft(void *);
 static int zs_get_speed(struct zs_chanstate *);
 
 
@@ -277,6 +276,8 @@
         */
        if (intio_intr_establish(ia->ia_intr, "zs", zshard, zsc))
                panic("zs_attach: interrupt vector busy");
+       zsc->zsc_softintr_cookie = softintr_establish(IPL_SOFTSERIAL,
+           (void (*)(void *))zsc_intr_soft, zsc);
        /* XXX; evcnt_attach() ? */
 
        /*
@@ -329,35 +330,12 @@
 
        /* We are at splzs here, so no need to lock. */
        if (zsc->zsc_cs[0]->cs_softreq || zsc->zsc_cs[1]->cs_softreq)
-               setsoftserial();
+               softintr_schedule(zsc->zsc_softintr_cookie);
 
        return (rval);
 }
 
 /*
- * Shared among the all chips. We have to look at all of them.
- */
-int 
-zssoft(void *arg)
-{
-       struct zsc_softc *zsc;
-       int s, unit;
-
-       /* 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);
-
-       return (1);
-}
-
-
-/*
  * Compute the current baud rate given a ZS channel.
  */
 static int 
Index: arch/x68k/include/intr.h
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/include/intr.h,v
retrieving revision 1.12
diff -u -r1.12 intr.h
--- arch/x68k/include/intr.h    16 Feb 2007 02:53:51 -0000      1.12
+++ arch/x68k/include/intr.h    3 Mar 2007 11:54:08 -0000
@@ -46,6 +46,21 @@
 /* spl0 requires checking for software interrupts */
 void   spl0(void);
 
+#define splsoft()      splraise1()
+#define splsoftclock() splsoft()
+#define splsoftnet()   splsoft()
+#define splsoftserial()        splsoft()
+#define splbio()       splraise3()
+#define splnet()        splraise4()
+#define spltty()        splraise4()
+#define splvm()         splraise4()
+#define splserial()     splraise5()
+#define splclock()      splraise6()
+#define splstatclock()  splclock()
+#define splhigh()       spl7()
+#define splsched()      spl7()
+#define spllock()       spl7()
+
 #define        splnone()       spl0()
 #define        splzs()         splraise5()     /* disallow serial interrupts */
 
@@ -53,54 +68,38 @@
 #define splx(s)         ((s) & PSL_IPL ? _spl(s) : spl0())
 
 #define        IPL_NONE        0
-#define        IPL_SOFTCLOCK   (PSL_S|PSL_IPL1)
-#define        IPL_SOFTNET     (PSL_S|PSL_IPL1)
-#define        IPL_BIO         (PSL_S|PSL_IPL3)
-#define        IPL_NET         (PSL_S|PSL_IPL4)
-#define        IPL_TTY         (PSL_S|PSL_IPL4)
-#define        IPL_VM          (PSL_S|PSL_IPL4)
-#define        IPL_CLOCK       (PSL_S|PSL_IPL6)
-#define        IPL_STATCLOCK   (PSL_S|PSL_IPL6)
-#define        IPL_SCHED       (PSL_S|PSL_IPL7)
-#define        IPL_HIGH        (PSL_S|PSL_IPL7)
-#define        IPL_LOCK        (PSL_S|PSL_IPL7)
+#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_VM          8
+#define        IPL_SERIAL      9
+#define        IPL_CLOCK       10
+#define        IPL_STATCLOCK   IPL_CLOCK
+#define        IPL_HIGH        11
+#define        IPL_SCHED       IPL_HIGH
+#define        IPL_LOCK        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)
-{
-
-       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>
+#endif /* _KERNEL && ! _LOCORE */
 
-/*
- * simulated software interrupt register
- */
-extern unsigned char ssir;
-
-#define SIR_NET                0x1
-#define SIR_CLOCK      0x2
-#define SIR_SERIAL     0x4
-#define SIR_KBD                0x8
-
-#define siroff(x)      ssir &= ~(x)
-#define setsoftnet()   ssir |= SIR_NET
-#define setsoftclock() ssir |= SIR_CLOCK
-#define setsoftserial() ssir |= SIR_SERIAL
-#define setsoftkbd()    ssir |= SIR_KBD
+#include <m68k/softintr.h>
 
-#endif /* _KERNEL && ! _LOCORE */
-#endif
+#endif /* !_X68K_INTR_H_ */
Index: arch/x68k/include/types.h
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/include/types.h,v
retrieving revision 1.11
diff -u -r1.11 types.h
--- arch/x68k/include/types.h   19 Sep 2006 10:13:10 -0000      1.11
+++ arch/x68k/include/types.h   3 Mar 2007 11:54:08 -0000
@@ -6,6 +6,7 @@
 #include <m68k/types.h>
 
 #define        __HAVE_DEVICE_REGISTER
+#define        __HAVE_GENERIC_SOFT_INTERRUPTS
 #define        __HAVE_GENERIC_TODR
 #define        __HAVE_TIMECOUNTER
 
Index: arch/x68k/include/z8530var.h
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/include/z8530var.h,v
retrieving revision 1.6
diff -u -r1.6 z8530var.h
--- arch/x68k/include/z8530var.h        11 Dec 2005 12:19:44 -0000      1.6
+++ arch/x68k/include/z8530var.h        3 Mar 2007 11:54:08 -0000
@@ -138,6 +138,7 @@
        /* Machine-dependent part follows... */
        struct zs_chanstate  zsc_cs_store[2];
        struct zsdevice *zsc_addr;
+       void *zsc_softintr_cookie;
 };
 
 /*
Index: arch/x68k/x68k/autoconf.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/x68k/autoconf.c,v
retrieving revision 1.49
diff -u -r1.49 autoconf.c
--- arch/x68k/x68k/autoconf.c   24 Nov 2006 22:04:24 -0000      1.49
+++ arch/x68k/x68k/autoconf.c   3 Mar 2007 11:54:09 -0000
@@ -73,6 +73,8 @@
 {
        x68k_realconfig = 1;
 
+       softintr_init();
+
        if (config_rootfound("mainbus", NULL) == NULL)
                panic("no mainbus found");
 
Index: arch/x68k/x68k/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/x68k/machdep.c,v
retrieving revision 1.135
diff -u -r1.135 machdep.c
--- arch/x68k/x68k/machdep.c    22 Feb 2007 06:49:34 -0000      1.135
+++ arch/x68k/x68k/machdep.c    3 Mar 2007 11:54:09 -0000
@@ -903,28 +903,31 @@
        return(0);
 }
 
-void netintr(void);
-
 void
-netintr(void)
+intrhand(int sr)
 {
-
-#define DONETISR(bit, fn) do {         \
-       if (netisr & (1 << bit)) {      \
-               netisr &= ~(1 << bit);  \
-               fn();                   \
-       }                               \
-} while (0)
-
-#include <net/netisr_dispatch.h>
-
-#undef DONETISR
+       printf("intrhand: unexpected sr 0x%x\n", sr);
 }
 
-void
-intrhand(int sr)
+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_IPL4,
+       [IPL_TTY]        = PSL_IPL4,
+       [IPL_VM]         = PSL_IPL4,
+       [IPL_CLOCK]      = PSL_IPL6,
+       [IPL_HIGH]       = PSL_IPL7,
+};
+
+ipl_cookie_t
+makeiplcookie(ipl_t ipl)
 {
-       printf("intrhand: unexpected sr 0x%x\n", sr);
+
+       return (ipl_cookie_t){._psl = ipl2psl_table[ipl] | PSL_S};
 }
 
 #if (defined(DDB) || defined(DEBUG)) && !defined(PANICBUTTON)
Index: arch/x68k/x68k/trap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/x68k/trap.c,v
retrieving revision 1.84
diff -u -r1.84 trap.c
--- arch/x68k/x68k/trap.c       22 Feb 2007 06:49:34 -0000      1.84
+++ arch/x68k/x68k/trap.c       3 Mar 2007 11:54:09 -0000
@@ -596,39 +596,9 @@
 
        case T_SSIR:            /* software interrupt */
        case T_SSIR|T_USER:
-               if (ssir & SIR_NET) {
-                       void netintr(void);
-                       siroff(SIR_NET);
-                       uvmexp.softs++;
-                       netintr();
-               }
-               if (ssir & SIR_CLOCK) {
-                       siroff(SIR_CLOCK);
-                       uvmexp.softs++;
-                       softclock(NULL);
-               }
-               if (ssir & SIR_SERIAL) {
-#include "zsc.h"
-#if NZSC > 0
-                       void zssoft(int);
-#endif
-                       siroff(SIR_SERIAL);
-                       uvmexp.softs++;
-#if NZSC > 0
-                       zssoft(0);
-#endif
-               }
-               if (ssir & SIR_KBD) {
-#include "kbd.h"
-#if NKBD > 0
-                       void    kbdsoftint(void);
-#endif
-                       siroff(SIR_KBD);
-                       uvmexp.softs++;
-#if NKBD > 0
-                       kbdsoftint();
-#endif
-               }
+
+               softintr_dispatch();
+
                /*
                 * If this was not an AST trap, we are all done.
                 */
--- /dev/null   2007-03-03 20:17:41.000000000 +0900
+++ arch/luna68k/conf/kern.ldscript.head        2007-03-03 19:50:25.000000000 
+0900
@@ -0,0 +1,14 @@
+/*     $NetBSD$        */
+
+OUTPUT_FORMAT("elf32-m68k")
+OUTPUT_ARCH(m68k)
+SECTIONS
+{
+  . = 0x0000c020;      /* 0x20 == sizeof(a.out header) */
+
+  /* Read-only sections, merged into text segment: */
+  .text :
+  {
+    *(.text)
+    *(.text.*)
+    *(.rodata) *(.rodata.*)
--- /dev/null   2007-03-03 20:17:41.000000000 +0900
+++ arch/luna68k/conf/kern.ldscript.tail        2007-03-03 19:34:45.000000000 
+0900
@@ -0,0 +1,35 @@
+/*     $NetBSD$        */
+
+  } =0
+  PROVIDE (__etext = .);
+  PROVIDE (_etext = .);
+  PROVIDE (etext = .);
+  . = ALIGN(0x1000);
+  .data :
+  {
+    __data_start = . ;
+    *(.data)
+    *(.data.*)
+    *(.sdata)
+    *(.sdata.*)
+  }
+  _edata = .;
+  PROVIDE (edata = .);
+  __bss_start = .;
+  __bss_start__ = .;
+  .bss       :
+  {
+   *(.dynbss)
+   *(.bss)
+   *(.bss.*)
+   *(COMMON)
+   /* Align here to ensure that the .bss section occupies space up to
+      _end.  Align after .bss to ensure correct alignment even if the
+      .bss section disappears because there are no input sections.  */
+   . = ALIGN(32 / 8);
+  }
+  . = ALIGN(32 / 8);
+  _end = .;
+  _bss_end__ = . ; __bss_end__ = . ; __end__ = . ;
+  PROVIDE (end = .);
+}
--- /dev/null   2007-03-03 20:17:41.000000000 +0900
+++ arch/m68k/include/softintr.h        2007-03-03 14:00:05.000000000 +0900
@@ -0,0 +1,96 @@
+/*     $NetBSD$        */
+
+/*-
+ * Copyright (c) 1996, 1997, 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+#ifndef _M68K_SOFTINTR_H_
+#define        _M68K_SOFTINTR_H_
+
+#define        SI_SOFTSERIAL   0       /* serial software interrupts */
+#define        SI_SOFTNET      1       /* network software interrupts */
+#define        SI_SOFTCLOCK    2       /* clock software interrupts */
+#define        SI_SOFT         3       /* other software interrupts */
+
+#define        SI_NQUEUES      4
+
+#define        SI_QUEUENAMES {                                                 
\
+       "serial",                                                       \
+       "net",                                                          \
+       "clock",                                                        \
+       "misc",                                                         \
+}
+
+#ifdef _KERNEL
+#include <sys/device.h>
+#include <sys/queue.h>
+#include <machine/psl.h>
+
+struct m68k_soft_intrhand {
+       LIST_ENTRY(m68k_soft_intrhand) sih_q;
+       struct m68k_soft_intr *sih_intrhead;
+       void (*sih_func)(void *);
+       void *sih_arg;
+       volatile int sih_pending;
+};
+
+struct m68k_soft_intr {
+       LIST_HEAD(, m68k_soft_intrhand) msi_q;
+       struct evcnt msi_evcnt;
+       uint8_t msi_ipl;
+};
+
+void *softintr_establish(int, void (*)(void *), void *);
+void softintr_disestablish(void *);
+void softintr_init(void);
+void softintr_dispatch(void);
+
+extern volatile uint8_t ssir;
+#define setsoft(x)     ssir |= (1 << (x))
+
+#define softintr_schedule(arg)                         \
+do {                                                   \
+       struct m68k_soft_intrhand *__sih = (arg);       \
+       __sih->sih_pending = 1;                         \
+       setsoft(__sih->sih_intrhead->msi_ipl);          \
+} while (/* CONSTCOND */0)
+
+/* XXX For legacy software interrupts */
+extern struct m68k_soft_intrhand *softnet_intrhand;
+#define setsoftnet()   softintr_schedule(softnet_intrhand)
+
+#endif /* _KERNEL */
+
+#endif /* _M68K_SOFTINTR_H_ */
--- /dev/null   2007-03-03 20:17:41.000000000 +0900
+++ arch/m68k/m68k/softintr.c   2007-03-03 13:59:29.000000000 +0900
@@ -0,0 +1,239 @@
+/*     $NetBSD$        */
+
+/*-
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Steve C. Woodford and Jason R. Thorpe.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+/*
+ * Generic soft interrupt implementation for m68k ports which use
+ * hp300 style simulated software interrupt with VAX REI emulation.
+ *
+ * Based heavily on the alpha implementation by Jason Thorpe.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/malloc.h>
+#include <sys/sched.h>
+
+#include <net/netisr.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <m68k/asm_single.h>
+
+#include <machine/cpu.h>
+#include <machine/intr.h>
+
+struct m68k_soft_intrhand *softnet_intrhand;
+volatile uint8_t ssir;
+
+static struct m68k_soft_intr m68k_soft_intrs[SI_NQUEUES];
+
+static void netintr(void);
+
+/*
+ * softintr_init()
+ *
+ *     Initialise hp300 style software interrupt subsystem.
+ */
+void
+softintr_init(void)
+{
+       static const char *softintr_names[] = SI_QUEUENAMES;
+       struct m68k_soft_intr *msi;
+       int i;
+
+       for (i = 0; i < SI_NQUEUES; i++) {
+               msi = &m68k_soft_intrs[i];
+               LIST_INIT(&msi->msi_q);
+               msi->msi_ipl = i;
+               evcnt_attach_dynamic(&msi->msi_evcnt, EVCNT_TYPE_INTR,
+                   NULL, "soft", softintr_names[i]);
+       }
+
+       /* Establish legacy software interrupt handlers */
+       softnet_intrhand = softintr_establish(IPL_SOFTNET,
+           (void (*)(void *))netintr, NULL);
+
+       KASSERT(softnet_intrhand != NULL);
+}
+
+/*
+ * softintr_dispatch()
+ *
+ *     Internal function for running queued soft interrupts.
+ */
+void
+softintr_dispatch(void)
+{
+       struct m68k_soft_intr *msi;
+       struct m68k_soft_intrhand *sih;
+       bool handled;
+       uint8_t mask;
+
+       do {
+               handled = false;
+               mask = 0x01;
+               for (msi = m68k_soft_intrs;
+                   msi < &m68k_soft_intrs[SI_NQUEUES];
+                   msi++, mask <<= 1) {
+
+                       if ((ssir & mask) == 0)
+                               continue;
+
+                       msi->msi_evcnt.ev_count++;
+                       handled = true;
+                       single_inst_bclr_b(ssir, mask);
+
+                       for (sih = LIST_FIRST(&msi->msi_q);
+                            sih != NULL;
+                            sih = LIST_NEXT(sih, sih_q)) {
+                               if (sih->sih_pending) {
+                                       uvmexp.softs++;
+                                       sih->sih_pending = 0;
+                                       (*sih->sih_func)(sih->sih_arg);
+                               }
+                       }
+               }
+       } while (handled);
+}
+
+static int
+ipl2si(ipl_t ipl)
+{
+       int si;
+
+       switch (ipl) {
+       case IPL_SOFTNET:
+               si = SI_SOFTNET;
+               break;
+       case IPL_SOFTCLOCK:
+               si = SI_SOFTCLOCK;
+               break;
+       case IPL_SOFTSERIAL:
+               si = SI_SOFTSERIAL;
+               break;
+       default:
+               si = SI_SOFT;
+               break;
+       }
+
+       return si;
+}
+
+/*
+ * softintr_establish()                [interface]
+ *
+ *     Register a software interrupt handler.
+ */
+void *
+softintr_establish(int ipl, void (*func)(void *), void *arg)
+{
+       struct m68k_soft_intr *msi;
+       struct m68k_soft_intrhand *sih;
+       int s;
+
+       if (__predict_false(ipl >= NIPL || ipl < 0 || func == NULL))
+               panic("%s: invalid ipl (%d) or function", __func__, ipl);
+
+       msi = &m68k_soft_intrs[ipl2si(ipl)];
+
+       sih = malloc(sizeof(struct m68k_soft_intrhand), M_DEVBUF, M_NOWAIT);
+       if (__predict_true(sih != NULL)) {
+               sih->sih_intrhead = msi;
+               sih->sih_func = func;
+               sih->sih_arg = arg;
+               sih->sih_pending = 0;
+               s = splsoft();
+               LIST_INSERT_HEAD(&msi->msi_q, sih, sih_q);
+               splx(s);
+       }
+       return sih;
+}
+
+/*
+ * softintr_disestablish()     [interface]
+ *
+ *     Unregister a software interrupt handler.
+ */
+void
+softintr_disestablish(void *arg)
+{
+       struct m68k_soft_intrhand *sih;
+       int s;
+
+       sih = arg;
+
+       s = splsoft();
+       LIST_REMOVE(sih, sih_q);
+       splx(s);
+
+       free(sih, M_DEVBUF);
+}
+
+void
+netintr(void)
+{
+       int s, isr;
+
+       for (;;) {
+               s = splhigh();
+               isr = netisr;
+               netisr = 0;
+               splx(s);
+
+               if (isr == 0)
+                       return;
+
+#define DONETISR(bit, func)                                            \
+               do {                                                    \
+                       if (isr & (1 << bit))                           \
+                               func();                                 \
+               } while (/* CONSTCOND */0)
+
+               s = splsoftnet();
+
+#include <net/netisr_dispatch.h>
+
+#undef DONETISR
+
+               splx(s);
+       }
+}
--- /dev/null   2007-03-03 20:17:41.000000000 +0900
+++ conf/mkldscript.sh  2007-03-03 20:06:55.000000000 +0900
@@ -0,0 +1,15 @@
+#!/bin/sh
+#      $NetBSD$
+
+TEMPLATE=$1
+shift
+
+SETS=`$OBJDUMP -x $* | fgrep "RELOCATION RECORDS FOR [link_set" | \
+        sort -u | sed 's/^.*\[\(.*\)\]:$/\1/'`
+
+for s in $SETS; do
+        printf "    . = ALIGN(4);\n"
+        printf "    PROVIDE (__start_%s = .);\n" $s
+        printf "    *(%s)\n" $s
+        printf "    PROVIDE (__stop_%s = .);\n" $s
+done 



Home | Main Index | Thread Index | Old Index