|
|
1.1 ! root 1: /* $Header: /usr/src/sys/i8086/ibm_at/RCS/md2.c,v 1.1 88/03/24 17:33:38 src Exp $ */ ! 2: /* (lgl- ! 3: * The information contained herein is a trade secret of Mark Williams ! 4: * Company, and is confidential information. It is provided under a ! 5: * license agreement, and may be copied or disclosed only under the ! 6: * terms of that agreement. Any reproduction or disclosure of this ! 7: * material without the express written authorization of Mark Williams ! 8: * Company or persuant to the license agreement is unlawful. ! 9: * ! 10: * COHERENT Version 2.3.37 ! 11: * Copyright (c) 1982, 1983, 1984. ! 12: * An unpublished work by Mark Williams Company, Chicago. ! 13: * All rights reserved. ! 14: -lgl) */ ! 15: /* ! 16: * 8086/8088 Coherent. ! 17: * IBM PC. ! 18: * ! 19: * $Log: /usr/src/sys/i8086/ibm_at/RCS/md2.c,v $ ! 20: * Revision 1.1 88/03/24 17:33:38 src ! 21: * Initial revision ! 22: * ! 23: * 87/10/26 Allan Cornish /usr/src/sys/i8086/ibm_at/md2.c ! 24: * Clrivec() now properly resets the interrupt vector for intr 2 in slot 9. ! 25: */ ! 26: #include <sys/coherent.h> ! 27: #include <sys/i8086.h> ! 28: #include <sys/clist.h> ! 29: #include <errno.h> ! 30: #include <sys/inode.h> ! 31: #include <sys/proc.h> ! 32: #include <sys/seg.h> ! 33: #include <signal.h> ! 34: #include <sys/uproc.h> ! 35: ! 36: int nirqslave; ! 37: /* ! 38: * Set an interrupt vector. ! 39: * Make an entry in the "vecs" table, for ! 40: * use by the assist. Make sure that the channel ! 41: * on the 8259 is armed. ! 42: * Note that interrupt vectors 2 and 9 are mapped into channel 9. ! 43: */ ! 44: setivec(level, fun) ! 45: register int level; ! 46: int (*fun)(); ! 47: { ! 48: register int picm; ! 49: extern int (*vecs[])(); ! 50: extern int vret(); ! 51: ! 52: if ((level &= 0x0F) == 2) ! 53: level = 9; ! 54: if (level==0 || vecs[level]!=&vret) { ! 55: u.u_error = EDBUSY; ! 56: return; ! 57: } ! 58: vecs[level] = fun; ! 59: if ( level >= 8 ) { ! 60: ++nirqslave; ! 61: picm = inb(SPICM); ! 62: picm &= ~(0x01 << (level-8)); ! 63: outb(SPICM, picm); ! 64: level = 2; ! 65: } ! 66: picm = inb(PICM); ! 67: picm &= ~(0x01 << level); ! 68: outb(PICM, picm); ! 69: } ! 70: ! 71: /* ! 72: * Clear an interrupt vector. ! 73: */ ! 74: clrivec(level) ! 75: register int level; ! 76: { ! 77: register int picm; ! 78: extern int (*vecs[])(); ! 79: extern int vret(); ! 80: ! 81: if ((level &= 0x0F) == 2) ! 82: level = 9; ! 83: if (level == 0) ! 84: panic("clrivec: level=%d", level); ! 85: vecs[level] = &vret; ! 86: if (level >= 8) { ! 87: --nirqslave; ! 88: picm = inb(SPICM); ! 89: picm |= (0x01 << (level-8)); ! 90: outb(SPICM, picm); ! 91: level = 2; ! 92: } ! 93: if ((level != 2) || (nirqslave == 0)) { ! 94: picm = inb(PICM); ! 95: picm |= (0x01 << level); ! 96: outb(PICM, picm); ! 97: } ! 98: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.