Annotation of sys/arch/sparc/include/psl.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: psl.h,v 1.23 2007/05/16 19:37:06 thib Exp $ */
2: /* $NetBSD: psl.h,v 1.12 1997/03/10 21:49:11 pk Exp $ */
3:
4: /*
5: * Copyright (c) 1992, 1993
6: * The Regents of the University of California. All rights reserved.
7: *
8: * This software was developed by the Computer Systems Engineering group
9: * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
10: * contributed to Berkeley.
11: *
12: * All advertising materials mentioning features or use of this software
13: * must display the following acknowledgement:
14: * This product includes software developed by the University of
15: * California, Lawrence Berkeley Laboratory.
16: *
17: * Redistribution and use in source and binary forms, with or without
18: * modification, are permitted provided that the following conditions
19: * are met:
20: * 1. Redistributions of source code must retain the above copyright
21: * notice, this list of conditions and the following disclaimer.
22: * 2. Redistributions in binary form must reproduce the above copyright
23: * notice, this list of conditions and the following disclaimer in the
24: * documentation and/or other materials provided with the distribution.
25: * 3. Neither the name of the University nor the names of its contributors
26: * may be used to endorse or promote products derived from this software
27: * without specific prior written permission.
28: *
29: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39: * SUCH DAMAGE.
40: *
41: * @(#)psl.h 8.1 (Berkeley) 6/11/93
42: */
43:
44: #ifndef PSR_IMPL
45:
46: /*
47: * SPARC Process Status Register (in psl.h for hysterical raisins).
48: *
49: * The picture in the Sun manuals looks like this:
50: * 1 1
51: * 31 28 27 24 23 20 19 14 3 2 11 8 7 6 5 4 0
52: * +-------+-------+-------+-----------+-+-+-------+-+-+-+---------+
53: * | impl | ver | icc | reserved |E|E| pil |S|P|E| CWP |
54: * | | |n z v c| |C|F| | |S|T| |
55: * +-------+-------+-------+-----------+-+-+-------+-+-+-+---------+
56: */
57:
58: #define PSR_IMPL 0xf0000000 /* implementation */
59: #define PSR_VER 0x0f000000 /* version */
60: #define PSR_ICC 0x00f00000 /* integer condition codes */
61: #define PSR_N 0x00800000 /* negative */
62: #define PSR_Z 0x00400000 /* zero */
63: #define PSR_O 0x00200000 /* overflow */
64: #define PSR_C 0x00100000 /* carry */
65: #define PSR_EC 0x00002000 /* coprocessor enable */
66: #define PSR_EF 0x00001000 /* FP enable */
67: #define PSR_PIL 0x00000f00 /* interrupt level */
68: #define PSR_S 0x00000080 /* supervisor (kernel) mode */
69: #define PSR_PS 0x00000040 /* previous supervisor mode (traps) */
70: #define PSR_ET 0x00000020 /* trap enable */
71: #define PSR_CWP 0x0000001f /* current window pointer */
72:
73: #define PSR_BITS "\20\16EC\15EF\10S\7PS\6ET"
74:
75: /*
76: * Various interrupt levels.
77: */
78: #define IPL_NONE 0
79: #define IPL_SOFTINT 1
80: #define IPL_SOFTCLOCK IPL_SOFTINT /* softclock() interrupts */
81: #define IPL_SOFTNET IPL_SOFTINT /* soft network interrupts */
82: #define IPL_AUSOFT 4 /* audio soft interrupts */
83: #define IPL_FDSOFT 4 /* floppy soft interrupts */
84: #define IPL_BIO 5 /* block devices are at 5 and below */
85: #define IPL_TTY 6 /* tty soft interrupts */
86: #define IPL_NET 7 /* network hardware at 7 or below */
87: #define IPL_VM 7 /* max(BIO, NET, TTY) */
88: #define IPL_FB 9 /* framebuffer interrupts */
89: #define IPL_CLOCK 10 /* hardclock() */
90: #define IPL_FD 11 /* hard floppy interrupts. */
91: #define IPL_ZS 12 /* zs interrupts */
92: /*
93: * XXX - this is called AUHARD instead of AUDIO because of some confusion
94: * with how MI audio code handles this. Stay tuned for a change in the future
95: */
96: #define IPL_AUHARD 13 /* hard audio interrupts */
97: #define IPL_STATCLOCK 14 /* statclock() */
98: #define IPL_SCHED IPL_STATCLOCK
99: #define IPL_HIGH 15 /* splhigh() */
100:
101: #if defined(_KERNEL) && !defined(_LOCORE)
102:
103: static __inline int getpsr(void);
104: static __inline void setpsr(int);
105: static __inline int spl0(void);
106: static __inline int splhigh(void);
107: static __inline void splx(int);
108: static __inline int getmid(void);
109:
110: /*
111: * GCC pseudo-functions for manipulating PSR (primarily PIL field).
112: */
113: static __inline int
114: getpsr()
115: {
116: int psr;
117:
118: __asm __volatile("rd %%psr,%0" : "=r" (psr));
119: return (psr);
120: }
121:
122: static __inline int
123: getmid()
124: {
125: int mid;
126:
127: __asm __volatile("rd %%tbr,%0" : "=r" (mid));
128: return ((mid >> 20) & 0x3);
129: }
130:
131: static __inline void
132: setpsr(newpsr)
133: int newpsr;
134: {
135: __asm __volatile("wr %0,0,%%psr" : : "r" (newpsr));
136: __asm __volatile("nop");
137: __asm __volatile("nop");
138: __asm __volatile("nop");
139: }
140:
141: static __inline int
142: spl0()
143: {
144: int psr, oldipl;
145:
146: /*
147: * wrpsr xors two values: we choose old psr and old ipl here,
148: * which gives us the same value as the old psr but with all
149: * the old PIL bits turned off.
150: */
151: __asm __volatile("rd %%psr,%0" : "=r" (psr));
152: oldipl = psr & PSR_PIL;
153: __asm __volatile("wr %0,%1,%%psr" : : "r" (psr), "r" (oldipl));
154:
155: /*
156: * Three instructions must execute before we can depend
157: * on the bits to be changed.
158: */
159: __asm __volatile("nop; nop; nop");
160: return (oldipl);
161: }
162:
163: #ifdef DIAGNOSTIC
164: /*
165: * Although this function is implemented in MI code, it must be in this MD
166: * header because we don't want this header to include MI includes.
167: */
168: void splassert_fail(int, int, const char *);
169: extern int splassert_ctl;
170: void splassert_check(int, const char *);
171: #define splassert(__wantipl) do { \
172: if (splassert_ctl > 0) { \
173: splassert_check(__wantipl, __func__); \
174: } \
175: } while (0)
176: #else
177: #define splassert(wantipl) do { /* nada */ } while (0)
178: #endif
179:
180: /*
181: * PIL 1 through 14 can use this macro.
182: * (spl0 and splhigh are special since they put all 0s or all 1s
183: * into the ipl field.)
184: */
185: #define SPL(name, newipl) \
186: static __inline int name(void); \
187: static __inline int name() \
188: { \
189: int psr, oldipl; \
190: __asm __volatile("rd %%psr,%0" : "=r" (psr)); \
191: oldipl = psr & PSR_PIL; \
192: psr &= ~oldipl; \
193: __asm __volatile("wr %0,%1,%%psr" : : \
194: "r" (psr), "n" ((newipl) << 8)); \
195: __asm __volatile("nop; nop; nop"); \
196: __asm __volatile("":::"memory"); /* protect from reordering */ \
197: return (oldipl); \
198: }
199: /* A non-priority-decreasing version of SPL */
200: #define SPLHOLD(name, newipl) \
201: static __inline int name(void); \
202: static __inline int name() \
203: { \
204: int psr, oldipl; \
205: __asm __volatile("rd %%psr,%0" : "=r" (psr)); \
206: oldipl = psr & PSR_PIL; \
207: if ((newipl << 8) <= oldipl) \
208: return oldipl; \
209: psr &= ~oldipl; \
210: __asm __volatile("wr %0,%1,%%psr" : : \
211: "r" (psr), "n" ((newipl) << 8)); \
212: __asm __volatile("nop; nop; nop"); \
213: __asm __volatile("":::"memory"); /* protect from reordering */ \
214: return (oldipl); \
215: }
216:
217: SPLHOLD(splsoftint, IPL_SOFTINT)
218: #define splsoftclock splsoftint
219: #define splsoftnet splsoftint
220: SPLHOLD(splausoft, IPL_AUSOFT)
221: SPLHOLD(splfdsoft, IPL_FDSOFT)
222: SPLHOLD(splbio, IPL_BIO)
223: SPLHOLD(splnet, IPL_NET)
224: SPLHOLD(spltty, IPL_TTY)
225: SPLHOLD(splvm, IPL_VM)
226: SPLHOLD(splclock, IPL_CLOCK)
227: SPLHOLD(splfd, IPL_FD)
228: SPLHOLD(splzs, IPL_ZS)
229: SPLHOLD(splaudio, IPL_AUHARD)
230: SPLHOLD(splsched, IPL_SCHED)
231: SPLHOLD(splstatclock, IPL_STATCLOCK)
232:
233: static __inline int splhigh()
234: {
235: int psr, oldipl;
236:
237: __asm __volatile("rd %%psr,%0" : "=r" (psr));
238: __asm __volatile("wr %0,0,%%psr" : : "r" (psr | PSR_PIL));
239: __asm __volatile("and %1,%2,%0; nop; nop" : "=r" (oldipl) : \
240: "r" (psr), "n" (PSR_PIL));
241: __asm __volatile("":::"memory"); /* protect from reordering */
242: return (oldipl);
243: }
244:
245: /* splx does not have a return value */
246: static __inline void splx(newipl)
247: int newipl;
248: {
249: int psr;
250:
251: __asm __volatile("":::"memory"); /* protect from reordering */
252: __asm __volatile("rd %%psr,%0" : "=r" (psr));
253: __asm __volatile("wr %0,%1,%%psr" : : \
254: "r" (psr & ~PSR_PIL), "rn" (newipl));
255: __asm __volatile("nop; nop; nop");
256: }
257: #endif /* KERNEL && !_LOCORE */
258:
259: #endif /* PSR_IMPL */
CVSweb