/* $NetBSD: intr.h,v 1.20 2008/06/22 17:34:25 tsutsui Exp $ */ /* * Copyright (c) 2001 Matt Fredette. * Copyright (c) 1998 Matt Thomas. * 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. * 3. The name of the company nor the names of the authors may be used to * endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHORS 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 _SUN68K_INTR_H_ #define _SUN68K_INTR_H_ #include #include /* * Interrupt levels. */ #define IPL_NONE 0 #define IPL_SOFTCLOCK 1 #define IPL_SOFTBIO 2 #define IPL_SOFTNET 3 #define IPL_SOFTSERIAL 4 #define IPL_VM 5 #define IPL_SCHED 6 #define IPL_HIGH 7 #define NIPL 8 #define _IPL_SOFT_LEVEL1 1 #define _IPL_SOFT_LEVEL2 2 #define _IPL_SOFT_LEVEL3 3 #define _IPL_SOFT_LEVEL_MIN 1 #define _IPL_SOFT_LEVEL_MAX 3 #ifdef _KERNEL extern int idepth; static inline bool cpu_intr_p(void) { return idepth != 0; } extern const uint16_t ipl2psl_table[NIPL]; typedef int ipl_t; typedef struct { uint16_t _psl; } ipl_cookie_t; static inline ipl_cookie_t makeiplcookie(ipl_t ipl) { return (ipl_cookie_t){._psl = ipl2psl_table[ipl]}; } static inline int splraiseipl(ipl_cookie_t icookie) { return _splraise(icookie._psl); } /* These connect interrupt handlers. */ typedef int (*isr_func_t)(void *); void isr_add_autovect(isr_func_t, void *, int); void isr_add_vectored(isr_func_t, void *, int, int); void isr_add_custom(int, void *); /* * Define inline functions for PSL manipulation. * These are as close to macros as one can get. * When not optimizing gcc will call the locore.s * functions by the same names, so breakpoints on * these functions will work normally, etc. * (See the GCC extensions info document.) */ static __inline int _getsr(void); /* Get current sr value. */ static __inline int _getsr(void) { int rv; __asm volatile ("clrl %0; movew %%sr,%0" : "=&d" (rv)); return (rv); } /* * The rest of this is sun68k specific, because other ports may * need to do special things in spl0() (i.e. simulate SIR). * Suns have a REAL interrupt register, so spl0() and splx(s) * have no need to check for any simulated interrupts, etc. */ #define spl0() _spl0() /* we have real software interrupts */ #define splx(x) _spl(x) /* IPL used by soft interrupts: netintr(), softclock() */ #define splsoftclock() splraise1() #define splsoftbio() splraise1() #define splsoftnet() splraise1() #define splsoftserial() splraise3() /* * Note that the VM code runs at spl7 during kernel * initialization, and later at spl0, so we have to * use splraise to avoid enabling interrupts early. */ #define splvm() splraise4() /* Zilog Serial hardware interrupts (hard-wired at 6) */ #define splzs() splserial() #define IPL_ZS IPL_SERIAL /* Block out all interrupts (except NMI of course). */ #define splhigh() spl7() #define splsched() spl7() /* This returns true iff the spl given is spl0. */ #define is_spl0(s) (((s) & PSL_IPL7) == 0) #endif /* _KERNEL */ #endif /* _SUN68K_INTR_H */