|
|
1.1 root 1: #define _DDI_DKI 1
2: #define _SYSV3 1
3:
4: /*
5: * This file contains supplementary definitions used to deal with or aid the
6: * implementation of the automatically generated device configuration code
7: * in the "conf.c" file.
8: *
9: * Note that we are in the _SYSV3 world because we touch <sys/uproc.h>
10: */
11: /*
12: *-IMPORTS:
13: * <common/ccompat.h>
14: * __USE_PROTO__
15: * __ARGS ()
16: * <common/xdebug.h>
17: * __LOCAL__
18: * <sys/debug.h>
19: * ASSERT ()
20: * <sys/types.h>
21: * cred_t
22: * n_dev_t
23: * o_dev_t
24: * makedevice ()
25: * <sys/cmn_err.h>
26: * CE_PANIC
27: * cmn_err ()
28: * <sys/file.h>
29: * FREAD
30: * FWRITE
31: * FNDELAY
32: * FNONBLOCK
33: * FEXCL
34: * <sys/open.h>
35: * OTYP_BLK
36: * OTYP_CHR
37: * OTYP_LYR
38: * <sys/uio.h>
39: * iovec_t
40: * uio_t
41: * <stddef.h>
42: * NULL
43: * <sys/errno.h>
44: * ENXIO
45: */
46:
47: #include <common/ccompat.h>
48: #include <common/xdebug.h>
49: #include <kernel/strmlib.h>
50: #include <sys/debug.h>
51: #include <sys/types.h>
52: #include <sys/cmn_err.h>
53: #include <sys/file.h>
54: #include <sys/open.h>
55: #include <sys/errno.h>
56: #include <sys/uio.h>
57: #include <stddef.h>
58:
59: #include <sys/confinfo.h>
60: #include <kernel/ddi_base.h>
61:
62: /*
63: * These are Coherent header files! Treat with all the caution you would
64: * normally use for handling toxic waste!
65: *
66: * <sys/stat.h>
67: * major ()
68: * minor ()
69: * <sys/con.h>
70: * DFBLK
71: *
72: * The following values which used to be in Coherent <sys/inode.h> have been
73: * moved here so we can use them. <sys/inode.h> is too much of a mess.
74: *
75: * <sys/file.h>
76: * IPR
77: * IPW
78: * IPNDLY
79: * IPEXCL
80: *
81: * Note that the actual magic u area variable 'u' is extern'ed in
82: * <kernel/ddi_base.h>
83: */
84:
85: #include <sys/stat.h>
86:
87: #if __COHERENT__
88:
89: #define SETUERROR(e) u.u_error = (e)
90:
91: #else
92:
93: #define SETUERROR(e) ASSERT (e == 0 || "Hit error" == NULL)
94:
95: #endif
96:
97:
98: /*
99: * This function initialises a cred_t structure from Coherent's internal data
100: * structures. This function would normally be local, but it is also called
101: * upon by code in "drv_ddi.c" to implement the drv_getparm () and
102: * drv_setparm () utilities, and also by the STREAMS equivalent to the
103: * character-driver interface routines.
104: */
105:
106: #if __USE_PROTO__
107: cred_t * (MAKE_CRED) (cred_t * credp)
108: #else
109: cred_t *
110: MAKE_CRED __ARGS ((credp))
111: cred_t * credp;
112: #endif
113: {
114: credp->cr_ref = 1;
115: credp->cr_ngroups = 0; /* no supplementary groups */
116:
117: #ifdef __MSDOS__
118: credp->cr_uid = credp->cr_ruid = credp->cr_suid = 0;
119: credp->cr_gid = credp->cr_rgid = credp->cr_sgid = 0;
120: #else
121: credp->cr_uid = u.u_uid;
122: credp->cr_gid = u.u_gid;
123: credp->cr_ruid = u.u_ruid;
124: credp->cr_rgid = u.u_rgid;
125: credp->cr_suid = u.u_euid; /* u.u_euid is saved effective uid */
126: credp->cr_sgid = u.u_egid; /* u.u_egid is saved effective gid */
127: #endif
128: return credp;
129: }
130:
131:
132: /*
133: * This local function is called to build a "uio_t" structure from Coherent's
134: * UIO structure. This function would be local, but it is called by the
135: * STREAMS equivalent of the mapping routines.
136: */
137:
138: #if __USE_PROTO__
139: uio_t * (MAKE_UIO) (uio_t * uiop, iovec_t * iovp, int mode, IO * iop)
140: #else
141: uio_t *
142: MAKE_UIO __ARGS ((uiop, iovp, mode, iop))
143: uio_t * uiop;
144: iovec_t * iovp;
145: int mode;
146: IO * iop;
147: #endif
148: {
149: uiop->uio_iov = iovp;
150: uiop->uio_iovcnt = 1;
151: uiop->uio_offset = iop->io_seek;
152: uiop->uio_segflg = iop->io_seg == IOSYS ? UIO_SYSSPACE : UIO_USERSPACE;
153: uiop->uio_fmode = mode | ((iop->io_flag & IONDLY) != 0 ? FNDELAY : 0);
154: uiop->uio_resid = iop->io_ioc;
155:
156: #ifdef _I386
157: iovp->iov_base = iop->io.vbase;
158: #else
159: iovp->iov_base = iop->io_base;
160: #endif
161: iovp->iov_len = iop->io_ioc;
162:
163: return uiop;
164: }
165:
166:
167: /*
168: * This function is used to copy back the information from a "uio_t" structure
169: * into a Coherent IO structure.
170: */
171:
172: #if __USE_PROTO__
173: void (DESTROY_UIO) (uio_t * uiop, IO * iop)
174: #else
175: void
176: DESTROY_UIO __ARGS ((uiop, iop))
177: uio_t * uiop;
178: IO * iop;
179: #endif
180: {
181: ASSERT (uiop->uio_iov != NULL);
182: ASSERT (uiop->uio_iov->iov_len == uiop->uio_resid);
183:
184: iop->io_ioc = uiop->uio_resid;
185: iop->io_seek = uiop->uio_offset;
186: #ifdef _I386
187: iop->io.vbase = uiop->uio_iov->iov_base;
188: #else
189: iop->io_base = uiop->uio_iov->iov_base;
190: #endif
191: }
192:
193:
194: /*
195: * This function is called upon by the machine-generated code in "conf.c" to
196: * forward a Coherent device open request to a System V device.
197: */
198:
199: #if __USE_PROTO__
200: int (_forward_open) (o_dev_t dev, int mode, int flags, ddi_open_t funcp)
201: #else
202: int
203: _forward_open __ARGS ((dev, mode, flags, funcp))
204: o_dev_t dev;
205: int mode;
206: int flags;
207: ddi_open_t funcp;
208: #endif
209: {
210: n_dev_t newdev = makedevice (major (dev), minor (dev));
211: cred_t cred;
212: int newmode;
213: int ret;
214:
215: newmode = 0;
216:
217: /*
218: * These are the flags documented by the Coherent driver kit. In
219: * actual fact, there are more (corresponding to the DDI/DKI flags)
220: * that are passed down from the system file table's flag entry. The
221: * fact that the others are not documented probably reflects the fact
222: * that calls to dread () either pass only IPR or IPW directly, while
223: * the existence of the other flags can only be discovered by tracing
224: * many layers of calls.
225: */
226:
227: if ((mode & IPR) != 0)
228: newmode |= FREAD;
229: if ((mode & IPW) != 0)
230: newmode |= FWRITE;
231:
232: /*
233: * And the other flags. There is no equivalent for FNONBLOCK.
234: */
235:
236: if ((mode & IPEXCL) != 0)
237: newmode |= FEXCL;
238: if ((mode & IPNDLY) != 0)
239: newmode |= FNDELAY;
240:
241: flags = (flags & DFBLK) != 0 ? OTYP_BLK : OTYP_CHR;
242:
243: ret = (* funcp) (& newdev, newmode, flags, MAKE_CRED (& cred));
244:
245: SETUERROR (ret);
246: return ret;
247: }
248:
249:
250: /*
251: * This function is called upon by the machine-generated code in "conf.c" to
252: * forward a Coherent device close request to a System V device.
253: */
254:
255: #if __USE_PROTO__
256: int (_forward_close) (o_dev_t dev, int mode, int flags, ddi_close_t funcp)
257: #else
258: int
259: _forward_close __ARGS ((dev, mode, flags, funcp))
260: o_dev_t dev;
261: int mode;
262: int flags;
263: ddi_close_t funcp;
264: #endif
265: {
266: n_dev_t newdev = makedevice (major (dev), minor (dev));
267: cred_t cred;
268: int newmode;
269: int ret;
270:
271: newmode = 0;
272:
273: /*
274: * These are the flags documented by the Coherent driver kit. In
275: * actual fact, there are more (corresponding to the DDI/DKI flags)
276: * that are passed down from the system file table's flag entry. The
277: * fact that the others are not documented probably reflects the fact
278: * that calls to dread () either pass only IPR or IPW directly, while
279: * the existence of the other flags can only be discovered by tracing
280: * many layers of calls.
281: */
282:
283: if ((mode & IPR) != 0)
284: newmode |= FREAD;
285: if ((mode & IPW) != 0)
286: newmode |= FWRITE;
287:
288: /*
289: * And the other flags. There is no equivalent for FNONBLOCK.
290: */
291:
292: if ((mode & IPEXCL) != 0)
293: newmode |= FEXCL;
294: if ((mode & IPNDLY) != 0)
295: newmode |= FNDELAY;
296:
297: flags = (flags & DFBLK) != 0 ? OTYP_BLK : OTYP_CHR;
298:
299: ret = (* funcp) (newdev, newmode, flags, MAKE_CRED (& cred));
300:
301: SETUERROR (ret);
302: return ret;
303: }
304:
305:
306: /*
307: * This function is called upon by the machine-generated code in "conf.c" to
308: * forward a Coherent device read request to a System V device.
309: */
310:
311: #if __USE_PROTO__
312: int (_forward_read) (o_dev_t dev, IO * iop, ddi_read_t funcp)
313: #else
314: int
315: _forward_read __ARGS ((dev, iop, funcp))
316: o_dev_t dev;
317: IO * iop;
318: ddi_read_t funcp;
319: #endif
320: {
321: n_dev_t newdev = makedevice (major (dev), minor (dev));
322: cred_t cred;
323: iovec_t iov;
324: uio_t uio;
325: int ret;
326:
327: ret = (* funcp) (newdev, MAKE_UIO (& uio, & iov, FREAD, iop),
328: MAKE_CRED (& cred));
329: DESTROY_UIO (& uio, iop);
330: SETUERROR (ret);
331: return ret;
332: }
333:
334:
335: /*
336: * This function is called upon by the machine-generated code in "conf.c" to
337: * forward a Coherent device write request to a System V device.
338: */
339:
340: #if __USE_PROTO__
341: int (_forward_write) (o_dev_t dev, IO * iop, ddi_write_t funcp)
342: #else
343: int
344: _forward_write __ARGS ((dev, iop, funcp))
345: o_dev_t dev;
346: IO * iop;
347: ddi_write_t funcp;
348: #endif
349: {
350: n_dev_t newdev = makedevice (major (dev), minor (dev));
351: cred_t cred;
352: iovec_t iov;
353: uio_t uio;
354: int ret;
355:
356: ret = (* funcp) (newdev, MAKE_UIO (& uio, & iov, FWRITE, iop),
357: MAKE_CRED (& cred));
358: DESTROY_UIO (& uio, iop);
359: SETUERROR (ret);
360: return ret;
361: }
362:
363:
364: /*
365: * This function is called upon by the machine-generated code in "conf.c" to
366: * forward a Coherent device ioctl request to a System V device.
367: */
368:
369: #if __USE_PROTO__
370: int (_forward_ioctl) (o_dev_t dev, int cmd, _VOID * arg, int mode,
371: ddi_ioctl_t funcp)
372: #else
373: int
374: _forward_ioctl __ARGS ((dev, cmd, arg, mode, funcp))
375: o_dev_t dev;
376: int cmd;
377: _VOID * arg;
378: int mode;
379: ddi_ioctl_t funcp;
380: #endif
381: {
382: n_dev_t newdev = makedevice (major (dev), minor (dev));
383: cred_t cred;
384: int rval;
385: int newmode;
386: int ret;
387:
388: newmode = 0;
389:
390: /*
391: * These are the flags documented by the Coherent driver kit. In
392: * actual fact, there are more (corresponding to the DDI/DKI flags)
393: * that are passed down from the system file table's flag entry. The
394: * fact that the others are not documented probably reflects the fact
395: * that calls to dread () either pass only IPR or IPW directly, while
396: * the existence of the other flags can only be discovered by tracing
397: * many layers of calls.
398: */
399:
400: if ((mode & IPR) != 0)
401: newmode |= FREAD;
402: if ((mode & IPW) != 0)
403: newmode |= FWRITE;
404:
405: /*
406: * And the other flags. There is no equivalent for FNONBLOCK.
407: */
408:
409: if ((mode & IPEXCL) != 0)
410: newmode |= FEXCL;
411: if ((mode & IPNDLY) != 0)
412: newmode |= FNDELAY;
413:
414: ret = (* funcp) (newdev, cmd, arg, mode, MAKE_CRED (& cred), & rval);
415:
416: SETUERROR (ret);
417: return rval;
418: }
419:
420:
421:
422: #if 0
423: /*
424: * This function is called upon by the machine-generated code in "conf.c" to
425: * forward a Coherent device block request to a System V device.
426: */
427:
428: #if __USE_PROTO__
429: int (_forward_strategy) (BUF * buf, ddi_strategy_t funcp)
430: #else
431: int
432: _forward_strategy __ARGS ((buf, funcp))
433: BUF * buf;
434: ddi_strategy_t funcp;
435: #endif
436: {
437: cmn_err (CE_PANIC, "DDI/DKI block drivers not yet supported");
438: }
439: #endif
440:
441:
442: /*
443: * This function is called upon by the machine-generated code in "conf.c" to
444: * forward a Coherent device poll request to a System V device.
445: */
446:
447: #if __USE_PROTO__
448: int (_forward_poll) (o_dev_t dev, int events, int msec, ddi_chpoll_t funcp)
449: #else
450: int
451: _forward_poll __ARGS ((dev, events, msec, funcp))
452: o_dev_t dev;
453: int events;
454: int msec;
455: ddi_chpoll_t funcp;
456: #endif
457: {
458: int ret;
459:
460: cmn_err (CE_PANIC, "DDI/DKI polling not yet supported");
461:
462: #if 0
463: ret = (* funcp) (newdev, events, msec == 0, & revents, pollhead);
464: #else
465: ret = EIO;
466: #endif
467: SETUERROR (ret);
468: return 0;
469: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.