summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2001-08-10 04:48:48 +0000
committerjake <jake@FreeBSD.org>2001-08-10 04:48:48 +0000
commit3aedfd619614c9599301adf94dc0e607a5ef8347 (patch)
treec337e8454834af702fc9a000a47bfffe335e29a2
parentea3624730c64c3c8c5b5c09011ca50458db3acb9 (diff)
downloadFreeBSD-src-3aedfd619614c9599301adf94dc0e607a5ef8347.zip
FreeBSD-src-3aedfd619614c9599301adf94dc0e607a5ef8347.tar.gz
Add early code to support interrupts.
-rw-r--r--sys/conf/files.sparc642
-rw-r--r--sys/sparc64/include/intr_machdep.h86
-rw-r--r--sys/sparc64/sparc64/intr_machdep.c76
3 files changed, 164 insertions, 0 deletions
diff --git a/sys/conf/files.sparc64 b/sys/conf/files.sparc64
index 594f4d7..45829a3 100644
--- a/sys/conf/files.sparc64
+++ b/sys/conf/files.sparc64
@@ -21,6 +21,7 @@ sparc64/sparc64/elf_machdep.c standard
# sparc64/sparc64/locore.s standard
# sparc64/sparc64/exception.s standard
sparc64/sparc64/fp.c standard
+sparc64/sparc64/intr_machdep.c standard
sparc64/sparc64/machdep.c standard
sparc64/sparc64/pmap.c standard
sparc64/sparc64/procfs_machdep.c standard
@@ -28,6 +29,7 @@ sparc64/sparc64/pv.c standard
sparc64/sparc64/support.s standard
sparc64/sparc64/sys_machdep.c standard
sparc64/sparc64/swtch.s standard
+sparc64/sparc64/tick.c standard
sparc64/sparc64/trap.c standard
sparc64/sparc64/tsb.c standard
sparc64/sparc64/upa.c standard
diff --git a/sys/sparc64/include/intr_machdep.h b/sys/sparc64/include/intr_machdep.h
new file mode 100644
index 0000000..e55a5cc
--- /dev/null
+++ b/sys/sparc64/include/intr_machdep.h
@@ -0,0 +1,86 @@
+/*-
+ * Copyright (c) 2001 Jake Burkholder.
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_INTR_MACHDEP_H_
+#define _MACHINE_INTR_MACHDEP_H_
+
+#define NPIL (1 << 4)
+#define NIV (1 << 11)
+
+#define IQ_SIZE (NPIL * 2)
+#define IQ_MASK (IQ_SIZE - 1)
+
+#define IQE_SHIFT 5
+#define IV_SHIFT 5
+
+#define PIL_TICK 14
+
+typedef void ih_func_t(struct trapframe *);
+typedef void iv_func_t(void *);
+
+struct intr_handler {
+ ih_func_t *ih_func;
+};
+
+struct iqe {
+ u_int iqe_tag;
+ u_int iqe_pri;
+ u_long iqe_vec;
+ iv_func_t *iqe_func;
+ void *iqe_arg;
+};
+
+struct intr_queue {
+ struct iqe iq_queue[IQ_SIZE]; /* must be first */
+ u_long iq_head;
+ u_long iq_tail;
+};
+
+struct intr_vector {
+ iv_func_t *iv_func; /* must be first */
+ void *iv_arg;
+ u_int iv_pri;
+ u_int iv_pad[3];
+};
+
+extern struct intr_handler intr_handlers[];
+extern struct intr_queue intr_queues[];
+extern struct intr_vector intr_vectors[];
+
+static __inline void
+intr_dispatch(int level, struct trapframe *tf)
+{
+ intr_handlers[level].ih_func(tf);
+}
+
+void intr_setup(int level, ih_func_t *ihf, int pri, iv_func_t *ivf,
+ void *iva);
+
+ih_func_t intr_dequeue;
+
+#endif
diff --git a/sys/sparc64/sparc64/intr_machdep.c b/sys/sparc64/sparc64/intr_machdep.c
new file mode 100644
index 0000000..edb906f
--- /dev/null
+++ b/sys/sparc64/sparc64/intr_machdep.c
@@ -0,0 +1,76 @@
+/*-
+ * Copyright (c) 2001 Jake Burkholder.
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/pcpu.h>
+
+#include <machine/frame.h>
+#include <machine/globals.h>
+#include <machine/intr_machdep.h>
+
+#define NCPU MAXCPU
+
+struct intr_handler intr_handlers[NPIL];
+struct intr_queue intr_queues[NCPU];
+struct intr_vector intr_vectors[NIV];
+
+void
+intr_dequeue(struct trapframe *tf)
+{
+ struct intr_queue *iq;
+ struct iqe *iqe;
+ u_long head;
+ u_long next;
+ u_long tail;
+
+ iq = PCPU_GET(iq);
+ for (head = iq->iq_head;; head = next) {
+ for (tail = iq->iq_tail; tail != head;) {
+ iqe = &iq->iq_queue[tail];
+ if (iqe->iqe_func != NULL)
+ iqe->iqe_func(iqe->iqe_arg);
+ tail = (tail + 1) & IQ_MASK;
+ }
+ iq->iq_tail = tail;
+ next = iq->iq_head;
+ if (head == next)
+ break;
+ }
+}
+
+void
+intr_setup(int pri, ih_func_t *ihf, int vec, iv_func_t *ivf, void *iva)
+{
+ if (vec != -1) {
+ intr_vectors[vec].iv_func = ivf;
+ intr_vectors[vec].iv_arg = iva;
+ intr_vectors[vec].iv_pri = pri;
+ }
+ intr_handlers[pri].ih_func = ihf;
+}
OpenPOWER on IntegriCloud