diff options
author | jake <jake@FreeBSD.org> | 2001-08-10 04:48:48 +0000 |
---|---|---|
committer | jake <jake@FreeBSD.org> | 2001-08-10 04:48:48 +0000 |
commit | 3aedfd619614c9599301adf94dc0e607a5ef8347 (patch) | |
tree | c337e8454834af702fc9a000a47bfffe335e29a2 | |
parent | ea3624730c64c3c8c5b5c09011ca50458db3acb9 (diff) | |
download | FreeBSD-src-3aedfd619614c9599301adf94dc0e607a5ef8347.zip FreeBSD-src-3aedfd619614c9599301adf94dc0e607a5ef8347.tar.gz |
Add early code to support interrupts.
-rw-r--r-- | sys/conf/files.sparc64 | 2 | ||||
-rw-r--r-- | sys/sparc64/include/intr_machdep.h | 86 | ||||
-rw-r--r-- | sys/sparc64/sparc64/intr_machdep.c | 76 |
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; +} |