intr.h revision 1.2
1/*	$NetBSD: intr.h,v 1.2 1999/03/16 16:30:21 minoura Exp $	*/
2
3/*
4 *
5 * Copyright (c) 1998 NetBSD Foundation, Inc.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to The NetBSD Foundation
9 * by Minoura Makoto and Jason R. Thorpe.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 *    must display the following acknowledgement:
21 *      This product includes software developed by Charles D. Cranor and
22 *      Washington University.
23 * 4. The name of the author may not be used to endorse or promote products
24 *    derived from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#ifndef _X68K_INTR_H_
39#define	_X68K_INTR_H_
40
41/*
42 * spl functions; all but spl0 are done in-line
43 */
44#include <machine/psl.h>
45
46#define _spl(s)								\
47({									\
48	register int _spl_r;						\
49									\
50	__asm __volatile ("clrl %0; movew sr,%0; movew %1,sr" :		\
51	    "&=d" (_spl_r) : "di" (s));					\
52	_spl_r;								\
53})
54
55#define	_splraise(s)							\
56({									\
57	int _spl_r;							\
58									\
59	__asm __volatile ("						\
60		clrl	d0					;	\
61		movw	sr,d0					;	\
62		movl	d0,%0					;	\
63		andw	#0x700,d0				;	\
64		movw	%1,d1					;	\
65		andw	#0x700,d1				;	\
66		cmpw	d0,d1					;	\
67		jle	1f					;	\
68		movw	%1,sr					;	\
69	    1:"							:	\
70		    "&=d" (_spl_r)				:	\
71		    "di" (s)					:	\
72		    "d0", "d1");					\
73	_spl_r;								\
74})
75
76/* spl0 requires checking for software interrupts */
77void	spl0 __P((void));
78#define spl1()  _spl(PSL_S|PSL_IPL1)
79#define spl2()  _spl(PSL_S|PSL_IPL2)
80#define spl3()  _spl(PSL_S|PSL_IPL3)
81#define spl4()  _spl(PSL_S|PSL_IPL4)
82#define spl5()  _spl(PSL_S|PSL_IPL5)
83#define spl6()  _spl(PSL_S|PSL_IPL6)
84#define spl7()  _spl(PSL_S|PSL_IPL7)
85
86#define splnone()       spl0()
87#define splsoftclock()  spl1()  /* disallow softclock */
88#define splsoftnet()	spl1()	/* disallow softnet */
89#define splnet()        _splraise(PSL_S|PSL_IPL4) /* disallow network */
90#define splbio()        _splraise(PSL_S|PSL_IPL3) /* disallow block I/O */
91#define splimp()        _splraise(PSL_S|PSL_IPL4) /* disallow imput */
92#define spltty()        _splraise(PSL_S|PSL_IPL4) /* disallow tty interrupts */
93#define splzs()         spl5()	/* disallow serial interrupts */
94#define splclock()      spl6()	/* disallow clock interrupt */
95#define splstatclock()  spl6()	/* disallow clock interrupt */
96#define splvm()         _splraise(PSL_S|PSL_IPL4) /* disallow virtual memory operations */
97#define splhigh()       spl7()	/* disallow everything */
98#define splsched()      spl7()	/* disallow scheduling */
99
100/* watch out for side effects */
101#define splx(s)         ((s) & PSL_IPL ? _spl(s) : spl0())
102
103/*
104 * simulated software interrupt register
105 */
106extern unsigned char ssir;
107
108#define SIR_NET		0x1
109#define SIR_CLOCK	0x2
110#define SIR_SERIAL	0x4
111#define SIR_KBD		0x8
112
113#define siroff(x)	ssir &= ~(x)
114#define setsoftnet()	ssir |= SIR_NET
115#define setsoftclock()	ssir |= SIR_CLOCK
116#define setsoftserial() ssir |= SIR_SERIAL
117#define setsoftkbd()    ssir |= SIR_KBD
118
119#endif
120