|
|
1.1 root 1: /* $Header: /kernel/kersrc/ldrv/RCS/setivec.c,v 1.1 92/07/17 15:27:57 bin Exp Locker: bin $ */
2: /*
3: * The information contained herein is a trade secret of INETCO
4: * Systems, and is confidential information. It is provided under
5: * a license agreement, and may be copied or disclosed only under
6: * the terms of that agreement. Any reproduction or disclosure of
7: * this material without the express written authorization of
8: * INETCO Systems or persuant to the license agreement is unlawful.
9: *
10: * Copyright (c) 1987
11: * An unpublished work by INETCO Systems, Ltd.
12: * All rights reserved.
13: */
14:
15: /*
16: * Loadable Driver - Enable/Disable Interrupts.
17: *
18: * $Log: setivec.c,v $
19: * Revision 1.1 92/07/17 15:27:57 bin
20: * Initial revision
21: *
22: * Revision 1.1 88/03/24 16:31:02 src
23: * Initial revision
24: *
25: * 87/12/03 Allan Cornish /usr/src/sys/ldrv/setivec.c
26: * Initial version.
27: */
28: #include <sys/coherent.h>
29: #include <errno.h>
30: #include <sys/con.h>
31: #include <sys/uproc.h>
32:
33: /*
34: * Interrupt entry points [within kernel] for loadable drivers.
35: */
36: extern void (*ldrvint[16])();
37:
38: /*
39: * Interrupt handlers [within driver] for loadable drivers.
40: * ldrvics[n]: Interrupt handler code segment.
41: * ldrvipc[n]: Interrupt handler program counter.
42: */
43: extern saddr_t ldrvics[16];
44: extern void (*ldrvipc[16])();
45:
46: setivec( level, func )
47: int level;
48: void (*func)();
49: {
50: extern void Ksetivec();
51: extern saddr_t ucs;
52:
53: u.u_error = 0;
54: level &= 15;
55:
56: /*
57: * Ensure interrupt is not already in use.
58: */
59: if ( (ldrvics[level] != 0) || (ldrvipc[level] != NULL) ) {
60: u.u_error = EDBUSY;
61: return;
62: }
63:
64: /*
65: * Record interrupt function BEFORE enabling interrupt.
66: */
67: ldrvipc[level] = func;
68: ldrvics[level] = ucs;
69:
70: /*
71: * Attempt to enable interrupt.
72: */
73: kcall( Ksetivec, level, ldrvint[level] );
74:
75: /*
76: * Interrupt is in use by a resident driver.
77: */
78: if ( u.u_error ) {
79: ldrvipc[level] = NULL;
80: ldrvics[level] = 0;
81: }
82: }
83:
84: clrivec( level )
85: register int level;
86: {
87: extern void Kclrivec();
88: extern saddr_t ucs;
89:
90: level &= 15;
91:
92: /*
93: * Ensure interrupt belongs to our process.
94: */
95: if ( ldrvics[level] != ucs ) {
96: u.u_error = EPERM;
97: return;
98: }
99:
100: /*
101: * Disable interrupt.
102: */
103: kcall( Kclrivec, level );
104:
105: /*
106: * Erase interrupt function AFTER disabling interrupt.
107: */
108: ldrvipc[level] = NULL;
109: ldrvics[level] = 0;
110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.