|
|
1.1 root 1: /*-
2: * Copyright (c) 1989, 1990 William F. Jolitz.
3: * Copyright (c) 1990 The Regents of the University of California.
4: * All rights reserved.
5: *
6: * This code is derived from software contributed to Berkeley by
7: * William Jolitz.
8: *
9: * Redistribution and use in source and binary forms, with or without
10: * modification, are permitted provided that the following conditions
11: * are met:
12: * 1. Redistributions of source code must retain the above copyright
13: * notice, this list of conditions and the following disclaimer.
14: * 2. Redistributions in binary form must reproduce the above copyright
15: * notice, this list of conditions and the following disclaimer in the
16: * documentation and/or other materials provided with the distribution.
17: * 3. All advertising materials mentioning features or use of this software
18: * must display the following acknowledgement:
19: * This product includes software developed by the University of
20: * California, Berkeley and its contributors.
21: * 4. Neither the name of the University nor the names of its contributors
22: * may be used to endorse or promote products derived from this software
23: * without specific prior written permission.
24: *
25: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35: * SUCH DAMAGE.
36: *
37: * @(#)icu.s 7.2 (Berkeley) 5/21/91
38: */
39:
40: /*
41: * AT/386
42: * Vector interrupt control section
43: */
44:
45: .data
46: .globl _imen
47: .globl _cpl
48: _cpl: .long 0xffff # current priority level (all off)
49: _imen: .long 0xffff # interrupt mask enable (all off)
50: .globl _highmask
51: _highmask: .long 0xffff
52: .globl _ttymask
53: _ttymask: .long 0
54: .globl _biomask
55: _biomask: .long 0
56: .globl _netmask
57: _netmask: .long 0
58: .globl _isa_intr
59: _isa_intr: .space 16*4
60:
61: .text
62: /*
63: * Handle return from interrupt after device handler finishes
64: */
65: doreti:
66: cli
67: popl %ebx # remove intr number
1.1.1.2 ! root 68: NOP
1.1 root 69: popl %eax # get previous priority
70: # now interrupt frame is a trap frame!
71: movw %ax,%cx
72: movw %ax,_cpl
73: orw _imen,%ax
74: outb %al,$ IO_ICU1+1 # re-enable intr?
75: NOP
76: movb %ah,%al
77: outb %al,$ IO_ICU2+1
78: NOP
79:
1.1.1.2 ! root 80: cmpw $0x1f,13*4(%esp) # to user?
! 81: je 1f # nope, leave
1.1 root 82: andw $0xffff,%cx
83: cmpw $0,%cx # returning to zero?
84: je 1f
85:
86: pop %es # nope, going to non-zero level
87: pop %ds
88: popa
89: addl $8,%esp
90: iret
91:
92: 1: cmpl $0,_netisr # check for softint s/traps
93: jne 1f
1.1.1.2 ! root 94: cmpl $0,_want_resched
! 95: jne 1f
1.1 root 96:
97: pop %es # none, going back to base pri
98: pop %ds
99: popa
100: addl $8,%esp
101: iret
102:
103: #include "../net/netisr.h"
104:
105: 1:
106:
107: #define DONET(s, c) ; \
108: .globl c ; \
1.1.1.2 ! root 109: btrl $ s ,_netisr ; \
1.1 root 110: jnb 1f ; \
111: call c ; \
112: 1:
113:
114: call _splnet
115:
116: DONET(NETISR_RAW,_rawintr)
117: #ifdef INET
118: DONET(NETISR_IP,_ipintr)
119: #endif
120: #ifdef IMP
121: DONET(NETISR_IMP,_impintr)
122: #endif
123: #ifdef NS
124: DONET(NETISR_NS,_nsintr)
125: #endif
126:
1.1.1.2 ! root 127: #ifdef notdef
! 128: NOP
1.1 root 129: popl %eax
130: movw %ax,_cpl
131: orw _imen,%ax
132: outb %al,$ IO_ICU1+1 # re-enable intr?
133: NOP
134: movb %ah,%al
135: outb %al,$ IO_ICU2+1
136: NOP
1.1.1.2 ! root 137: #else
! 138: call _spl0
! 139: #endif
1.1 root 140:
1.1.1.2 ! root 141: btrl $ NETISR_SCLK,_netisr
1.1 root 142: jnb 1f
143: # back to an interrupt frame for a moment
144: call _splsoftclock
145: pushl $0xff # dummy intr
146: call _softclock
147: popl %eax
1.1.1.2 ! root 148: call _spl0
1.1 root 149:
1.1.1.2 ! root 150: # jmp 2f
1.1 root 151:
152: 1:
153: cmpw $0x1f,13*4(%esp) # to user?
154: jne 2f # nope, leave
1.1.1.2 ! root 155: cmpl $0,_want_resched
! 156: je 2f
1.1 root 157: call _trap
158:
159: 2: pop %es
160: pop %ds
161: popal
162: addl $8,%esp
163: iret
164:
165: /*
166: * Interrupt priority mechanism
167: *
168: * Two flavors -- imlXX masks relative to ISA noemenclature (for PC compat sw)
169: * -- splXX masks with group mechanism for BSD purposes
170: */
171:
172: .globl _splhigh
173: .globl _splclock
174: _splhigh:
175: _splclock:
176: cli # disable interrupts
1.1.1.2 ! root 177: NOP
1.1 root 178: movw $0xffff,%ax # set new priority level
179: movw %ax,%dx
180: # orw _imen,%ax # mask off those not enabled yet
181: movw %ax,%cx
182: outb %al,$ IO_ICU1+1 /* update icu's */
183: NOP
184: movb %ah,%al
185: outb %al,$ IO_ICU2+1
186: NOP
187: movzwl _cpl,%eax # return old priority
188: movw %dx,_cpl # set new priority level
189: sti # enable interrupts
190: ret
191:
192: .globl _spltty # block clists
193: _spltty:
194: cli # disable interrupts
1.1.1.2 ! root 195: NOP
1.1 root 196: movw _cpl,%ax
197: orw _ttymask,%ax
198: movw %ax,%dx
199: orw _imen,%ax # mask off those not enabled yet
200: movw %ax,%cx
201: outb %al,$ IO_ICU1+1 /* update icu's */
202: NOP
203: movb %ah,%al
204: outb %al,$ IO_ICU2+1
205: NOP
206: movzwl _cpl,%eax # return old priority
207: movw %dx,_cpl # set new priority level
208: sti # enable interrupts
209: ret
210:
211: .globl _splimp
212: .globl _splnet
213: _splimp:
214: _splnet:
215: cli # disable interrupts
1.1.1.2 ! root 216: NOP
1.1 root 217: movw _cpl,%ax
218: orw _netmask,%ax
219: movw %ax,%dx
220: orw _imen,%ax # mask off those not enabled yet
221: movw %ax,%cx
222: outb %al,$ IO_ICU1+1 /* update icu's */
223: NOP
224: movb %ah,%al
225: outb %al,$ IO_ICU2+1
226: NOP
227: movzwl _cpl,%eax # return old priority
228: movw %dx,_cpl # set new priority level
229: sti # enable interrupts
230: ret
231:
232: .globl _splbio
233: _splbio:
234: cli # disable interrupts
1.1.1.2 ! root 235: NOP
1.1 root 236: movw _cpl,%ax
237: orw _biomask,%ax
238: movw %ax,%dx
239: orw _imen,%ax # mask off those not enabled yet
240: movw %ax,%cx
241: outb %al,$ IO_ICU1+1 /* update icu's */
242: NOP
243: movb %ah,%al
244: outb %al,$ IO_ICU2+1
245: NOP
246: movzwl _cpl,%eax # return old priority
247: movw %dx,_cpl # set new priority level
248: sti # enable interrupts
249: ret
250:
251: .globl _splsoftclock
252: _splsoftclock:
253: cli # disable interrupts
1.1.1.2 ! root 254: NOP
1.1 root 255: movw _cpl,%ax
256: orw $0x8000,%ax # set new priority level
257: movw %ax,%dx
258: orw _imen,%ax # mask off those not enabled yet
259: movw %ax,%cx
260: outb %al,$ IO_ICU1+1 /* update icu's */
261: NOP
262: movb %ah,%al
263: outb %al,$ IO_ICU2+1
264: NOP
265: movzwl _cpl,%eax # return old priority
266: movw %dx,_cpl # set new priority level
267: sti # enable interrupts
268: ret
269:
270: .globl _splnone
271: .globl _spl0
272: _splnone:
273: _spl0:
274: cli # disable interrupts
1.1.1.2 ! root 275: NOP
1.1 root 276: pushl _cpl # save old priority
277: movw _cpl,%ax
278: orw _netmask,%ax # mask off those network devices
279: movw %ax,_cpl # set new priority level
280: orw _imen,%ax # mask off those not enabled yet
281: outb %al,$ IO_ICU1+1 /* update icu's */
282: NOP
283: movb %ah,%al
284: outb %al,$ IO_ICU2+1
285: NOP
286: sti # enable interrupts
287:
288: DONET(NETISR_RAW,_rawintr)
289: #ifdef INET
290: DONET(NETISR_IP,_ipintr)
291: #endif
292: cli # disable interrupts
293: popl _cpl # save old priority
1.1.1.2 ! root 294: NOP
1.1 root 295: movw $0,%ax # set new priority level
296: movw %ax,%dx
297: orw _imen,%ax # mask off those not enabled yet
298: movw %ax,%cx
299: outb %al,$ IO_ICU1+1 /* update icu's */
300: NOP
301: movb %ah,%al
302: outb %al,$ IO_ICU2+1
303: NOP
304: movzwl _cpl,%eax # return old priority
305: movw %dx,_cpl # set new priority level
306: sti # enable interrupts
307: ret
308:
309: .globl _splx
310: _splx:
311: cli # disable interrupts
1.1.1.2 ! root 312: NOP
1.1 root 313: movw 4(%esp),%ax # new priority level
314: movw %ax,%dx
315: cmpw $0,%dx
316: je _spl0 # going to "zero level" is special
317:
318: orw _imen,%ax # mask off those not enabled yet
319: movw %ax,%cx
320: outb %al,$ IO_ICU1+1 /* update icu's */
321: NOP
322: movb %ah,%al
323: outb %al,$ IO_ICU2+1
324: NOP
325: movzwl _cpl,%eax # return old priority
326: movw %dx,_cpl # set new priority level
327: sti # enable interrupts
328: ret
329:
330: /* hardware interrupt catcher (IDT 32 - 47) */
331: .globl _isa_strayintr
332:
333: IDTVEC(intr0)
1.1.1.2 ! root 334: INTRSTRAY(0, _highmask, 0) ; call _isa_strayintr ; INTREXIT1
1.1 root 335:
336: IDTVEC(intr1)
1.1.1.2 ! root 337: INTRSTRAY(1, _highmask, 1) ; call _isa_strayintr ; INTREXIT1
1.1 root 338:
339: IDTVEC(intr2)
1.1.1.2 ! root 340: INTRSTRAY(2, _highmask, 2) ; call _isa_strayintr ; INTREXIT1
1.1 root 341:
342: IDTVEC(intr3)
1.1.1.2 ! root 343: INTRSTRAY(3, _highmask, 3) ; call _isa_strayintr ; INTREXIT1
1.1 root 344:
345: IDTVEC(intr4)
1.1.1.2 ! root 346: INTRSTRAY(4, _highmask, 4) ; call _isa_strayintr ; INTREXIT1
1.1 root 347:
348: IDTVEC(intr5)
1.1.1.2 ! root 349: INTRSTRAY(5, _highmask, 5) ; call _isa_strayintr ; INTREXIT1
1.1 root 350:
351: IDTVEC(intr6)
1.1.1.2 ! root 352: INTRSTRAY(6, _highmask, 6) ; call _isa_strayintr ; INTREXIT1
1.1 root 353:
354: IDTVEC(intr7)
1.1.1.2 ! root 355: INTRSTRAY(7, _highmask, 7) ; call _isa_strayintr ; INTREXIT1
1.1 root 356:
357:
358: IDTVEC(intr8)
1.1.1.2 ! root 359: INTRSTRAY(8, _highmask, 8) ; call _isa_strayintr ; INTREXIT2
1.1 root 360:
361: IDTVEC(intr9)
1.1.1.2 ! root 362: INTRSTRAY(9, _highmask, 9) ; call _isa_strayintr ; INTREXIT2
1.1 root 363:
364: IDTVEC(intr10)
1.1.1.2 ! root 365: INTRSTRAY(10, _highmask, 10) ; call _isa_strayintr ; INTREXIT2
1.1 root 366:
367: IDTVEC(intr11)
1.1.1.2 ! root 368: INTRSTRAY(11, _highmask, 11) ; call _isa_strayintr ; INTREXIT2
1.1 root 369:
370: IDTVEC(intr12)
1.1.1.2 ! root 371: INTRSTRAY(12, _highmask, 12) ; call _isa_strayintr ; INTREXIT2
1.1 root 372:
373: IDTVEC(intr13)
1.1.1.2 ! root 374: INTRSTRAY(13, _highmask, 13) ; call _isa_strayintr ; INTREXIT2
1.1 root 375:
376: IDTVEC(intr14)
1.1.1.2 ! root 377: INTRSTRAY(14, _highmask, 14) ; call _isa_strayintr ; INTREXIT2
1.1 root 378:
379: IDTVEC(intr15)
1.1.1.2 ! root 380: INTRSTRAY(15, _highmask, 15) ; call _isa_strayintr ; INTREXIT2
1.1 root 381:
1.1.1.2 ! root 382: IDTVEC(intrdefault)
! 383: INTRSTRAY(255, _highmask, 255) ; call _isa_strayintr ; INTREXIT2
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.