1 | /* $NetBSD: conf.h,v 1.146 2016/01/17 23:16:46 christos Exp $ */ |
2 | |
3 | /*- |
4 | * Copyright (c) 1990, 1993 |
5 | * The Regents of the University of California. All rights reserved. |
6 | * (c) UNIX System Laboratories, Inc. |
7 | * All or some portions of this file are derived from material licensed |
8 | * to the University of California by American Telephone and Telegraph |
9 | * Co. or Unix System Laboratories, Inc. and are reproduced herein with |
10 | * the permission of UNIX System Laboratories, Inc. |
11 | * |
12 | * Redistribution and use in source and binary forms, with or without |
13 | * modification, are permitted provided that the following conditions |
14 | * are met: |
15 | * 1. Redistributions of source code must retain the above copyright |
16 | * notice, this list of conditions and the following disclaimer. |
17 | * 2. Redistributions in binary form must reproduce the above copyright |
18 | * notice, this list of conditions and the following disclaimer in the |
19 | * documentation and/or other materials provided with the distribution. |
20 | * 3. Neither the name of the University nor the names of its contributors |
21 | * may be used to endorse or promote products derived from this software |
22 | * without specific prior written permission. |
23 | * |
24 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
25 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
27 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
28 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
30 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
31 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
32 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
33 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
34 | * SUCH DAMAGE. |
35 | * |
36 | * @(#)conf.h 8.5 (Berkeley) 1/9/95 |
37 | */ |
38 | |
39 | #ifndef _SYS_CONF_H_ |
40 | #define _SYS_CONF_H_ |
41 | |
42 | /* |
43 | * Definitions of device driver entry switches |
44 | */ |
45 | |
46 | #include <sys/queue.h> |
47 | #include <sys/device_if.h> |
48 | |
49 | struct buf; |
50 | struct knote; |
51 | struct lwp; |
52 | struct tty; |
53 | struct uio; |
54 | struct vnode; |
55 | |
56 | /* |
57 | * Types for d_flag |
58 | */ |
59 | #define D_OTHER 0x0000 |
60 | #define D_TAPE 0x0001 |
61 | #define D_DISK 0x0002 |
62 | #define D_TTY 0x0003 |
63 | #define D_TYPEMASK 0x00ff |
64 | #define D_MPSAFE 0x0100 |
65 | #define D_NEGOFFSAFE 0x0200 |
66 | |
67 | /* |
68 | * Block device switch table |
69 | */ |
70 | struct bdevsw { |
71 | int (*d_open)(dev_t, int, int, struct lwp *); |
72 | int (*d_close)(dev_t, int, int, struct lwp *); |
73 | void (*d_strategy)(struct buf *); |
74 | int (*d_ioctl)(dev_t, u_long, void *, int, struct lwp *); |
75 | int (*d_dump)(dev_t, daddr_t, void *, size_t); |
76 | int (*d_psize)(dev_t); |
77 | int (*d_discard)(dev_t, off_t, off_t); |
78 | int d_flag; |
79 | }; |
80 | |
81 | /* |
82 | * Character device switch table |
83 | */ |
84 | struct cdevsw { |
85 | int (*d_open)(dev_t, int, int, struct lwp *); |
86 | int (*d_close)(dev_t, int, int, struct lwp *); |
87 | int (*d_read)(dev_t, struct uio *, int); |
88 | int (*d_write)(dev_t, struct uio *, int); |
89 | int (*d_ioctl)(dev_t, u_long, void *, int, struct lwp *); |
90 | void (*d_stop)(struct tty *, int); |
91 | struct tty * (*d_tty)(dev_t); |
92 | int (*d_poll)(dev_t, int, struct lwp *); |
93 | paddr_t (*d_mmap)(dev_t, off_t, int); |
94 | int (*d_kqfilter)(dev_t, struct knote *); |
95 | int (*d_discard)(dev_t, off_t, off_t); |
96 | int d_flag; |
97 | }; |
98 | |
99 | #ifdef _KERNEL |
100 | |
101 | #include <sys/mutex.h> |
102 | extern kmutex_t device_lock; |
103 | |
104 | int devsw_attach(const char *, const struct bdevsw *, devmajor_t *, |
105 | const struct cdevsw *, devmajor_t *); |
106 | int devsw_detach(const struct bdevsw *, const struct cdevsw *); |
107 | const struct bdevsw *bdevsw_lookup(dev_t); |
108 | const struct cdevsw *cdevsw_lookup(dev_t); |
109 | devmajor_t bdevsw_lookup_major(const struct bdevsw *); |
110 | devmajor_t cdevsw_lookup_major(const struct cdevsw *); |
111 | |
112 | #define dev_type_open(n) int n (dev_t, int, int, struct lwp *) |
113 | #define dev_type_close(n) int n (dev_t, int, int, struct lwp *) |
114 | #define dev_type_read(n) int n (dev_t, struct uio *, int) |
115 | #define dev_type_write(n) int n (dev_t, struct uio *, int) |
116 | #define dev_type_ioctl(n) \ |
117 | int n (dev_t, u_long, void *, int, struct lwp *) |
118 | #define dev_type_stop(n) void n (struct tty *, int) |
119 | #define dev_type_tty(n) struct tty * n (dev_t) |
120 | #define dev_type_poll(n) int n (dev_t, int, struct lwp *) |
121 | #define dev_type_mmap(n) paddr_t n (dev_t, off_t, int) |
122 | #define dev_type_strategy(n) void n (struct buf *) |
123 | #define dev_type_dump(n) int n (dev_t, daddr_t, void *, size_t) |
124 | #define dev_type_size(n) int n (dev_t) |
125 | #define dev_type_kqfilter(n) int n (dev_t, struct knote *) |
126 | #define dev_type_discard(n) int n (dev_t, off_t, off_t) |
127 | |
128 | #define noopen ((dev_type_open((*)))enodev) |
129 | #define noclose ((dev_type_close((*)))enodev) |
130 | #define noread ((dev_type_read((*)))enodev) |
131 | #define nowrite ((dev_type_write((*)))enodev) |
132 | #define noioctl ((dev_type_ioctl((*)))enodev) |
133 | #define nostop ((dev_type_stop((*)))enodev) |
134 | #define notty NULL |
135 | #define nopoll seltrue |
136 | #define nommap ((dev_type_mmap((*)))enodev) |
137 | #define nodump ((dev_type_dump((*)))enodev) |
138 | #define nosize NULL |
139 | #define nokqfilter seltrue_kqfilter |
140 | #define nodiscard ((dev_type_discard((*)))enodev) |
141 | |
142 | #define nullopen ((dev_type_open((*)))nullop) |
143 | #define nullclose ((dev_type_close((*)))nullop) |
144 | #define nullread ((dev_type_read((*)))nullop) |
145 | #define nullwrite ((dev_type_write((*)))nullop) |
146 | #define nullioctl ((dev_type_ioctl((*)))nullop) |
147 | #define nullstop ((dev_type_stop((*)))nullop) |
148 | #define nullpoll ((dev_type_poll((*)))nullop) |
149 | #define nullmmap ((dev_type_mmap((*)))nullop) |
150 | #define nulldump ((dev_type_dump((*)))nullop) |
151 | #define nullkqfilter ((dev_type_kqfilter((*)))eopnotsupp) |
152 | #define nulldiscard ((dev_type_discard((*)))nullop) |
153 | |
154 | /* device access wrappers. */ |
155 | |
156 | dev_type_open(bdev_open); |
157 | dev_type_close(bdev_close); |
158 | dev_type_strategy(bdev_strategy); |
159 | dev_type_ioctl(bdev_ioctl); |
160 | dev_type_dump(bdev_dump); |
161 | dev_type_size(bdev_size); |
162 | dev_type_discard(bdev_discard); |
163 | |
164 | dev_type_open(cdev_open); |
165 | dev_type_close(cdev_close); |
166 | dev_type_read(cdev_read); |
167 | dev_type_write(cdev_write); |
168 | dev_type_ioctl(cdev_ioctl); |
169 | dev_type_stop(cdev_stop); |
170 | dev_type_tty(cdev_tty); |
171 | dev_type_poll(cdev_poll); |
172 | dev_type_mmap(cdev_mmap); |
173 | dev_type_kqfilter(cdev_kqfilter); |
174 | dev_type_discard(cdev_discard); |
175 | |
176 | int cdev_type(dev_t); |
177 | int bdev_type(dev_t); |
178 | |
179 | /* symbolic sleep message strings */ |
180 | extern const char devopn[], devio[], devwait[], devin[], devout[]; |
181 | extern const char devioc[], devcls[]; |
182 | |
183 | #endif /* _KERNEL */ |
184 | |
185 | /* |
186 | * Line discipline switch table |
187 | */ |
188 | struct linesw { |
189 | const char *l_name; /* Linesw name */ |
190 | |
191 | LIST_ENTRY(linesw) l_list; |
192 | u_int l_refcnt; /* locked by ttyldisc_list_slock */ |
193 | int l_no; /* legacy discipline number (for TIOCGETD) */ |
194 | |
195 | int (*l_open) (dev_t, struct tty *); |
196 | int (*l_close) (struct tty *, int); |
197 | int (*l_read) (struct tty *, struct uio *, int); |
198 | int (*l_write) (struct tty *, struct uio *, int); |
199 | int (*l_ioctl) (struct tty *, u_long, void *, int, |
200 | struct lwp *); |
201 | int (*l_rint) (int, struct tty *); |
202 | int (*l_start) (struct tty *); |
203 | int (*l_modem) (struct tty *, int); |
204 | int (*l_poll) (struct tty *, int, struct lwp *); |
205 | }; |
206 | |
207 | #ifdef _KERNEL |
208 | void ttyldisc_init(void); |
209 | int ttyldisc_attach(struct linesw *); |
210 | int ttyldisc_detach(struct linesw *); |
211 | struct linesw *ttyldisc_lookup(const char *); |
212 | struct linesw *ttyldisc_lookup_bynum(int); |
213 | struct linesw *ttyldisc_default(void); |
214 | void ttyldisc_release(struct linesw *); |
215 | |
216 | /* For those defining their own line disciplines: */ |
217 | #define ttynodisc ((int (*)(dev_t, struct tty *))enodev) |
218 | #define ttyerrclose ((int (*)(struct tty *, int))enodev) |
219 | #define ttyerrio ((int (*)(struct tty *, struct uio *, int))enodev) |
220 | #define ttyerrinput ((int (*)(int, struct tty *))enodev) |
221 | #define ttyerrstart ((int (*)(struct tty *))enodev) |
222 | |
223 | int ttyerrpoll (struct tty *, int, struct lwp *); |
224 | int ttynullioctl(struct tty *, u_long, void *, int, struct lwp *); |
225 | |
226 | int iskmemdev(dev_t); |
227 | int seltrue_kqfilter(dev_t, struct knote *); |
228 | #endif |
229 | |
230 | #ifdef _KERNEL |
231 | |
232 | #define DEV_MEM 0 /* minor device 0 is physical memory */ |
233 | #define DEV_KMEM 1 /* minor device 1 is kernel memory */ |
234 | #define DEV_NULL 2 /* minor device 2 is EOF/rathole */ |
235 | #ifdef COMPAT_16 |
236 | #define _DEV_ZERO_oARM 3 /* reserved: old ARM /dev/zero minor */ |
237 | #endif |
238 | #define DEV_FULL 11 /* minor device 11 is '\0'/ENOSPC */ |
239 | #define DEV_ZERO 12 /* minor device 12 is '\0'/rathole */ |
240 | |
241 | enum devnode_class { |
242 | DEVNODE_DONTBOTHER, |
243 | DEVNODE_SINGLE, |
244 | DEVNODE_VECTOR, |
245 | }; |
246 | #define DEVNODE_FLAG_LINKZERO 0x01 /* create name -> name0 link */ |
247 | #define DEVNODE_FLAG_ISMINOR0 0x02 /* vector[0] specifies minor */ |
248 | #ifdef notyet |
249 | #define DEVNODE_FLAG_ISMINOR1 0x04 /* vector[1] specifies starting minor */ |
250 | #endif |
251 | |
252 | struct devsw_conv { |
253 | const char *d_name; |
254 | devmajor_t d_bmajor; |
255 | devmajor_t d_cmajor; |
256 | |
257 | /* information about /dev nodes related to the device */ |
258 | enum devnode_class d_class; |
259 | int d_flags; |
260 | int d_vectdim[2]; |
261 | }; |
262 | |
263 | void devsw_init(void); |
264 | const char *devsw_blk2name(devmajor_t); |
265 | const char *cdevsw_getname(devmajor_t); |
266 | const char *bdevsw_getname(devmajor_t); |
267 | devmajor_t devsw_name2blk(const char *, char *, size_t); |
268 | devmajor_t devsw_name2chr(const char *, char *, size_t); |
269 | dev_t devsw_chr2blk(dev_t); |
270 | dev_t devsw_blk2chr(dev_t); |
271 | |
272 | void mm_init(void); |
273 | #endif /* _KERNEL */ |
274 | |
275 | #ifdef _KERNEL |
276 | void setroot(device_t, int); |
277 | void rootconf(void); |
278 | void swapconf(void); |
279 | #endif /* _KERNEL */ |
280 | |
281 | #endif /* !_SYS_CONF_H_ */ |
282 | |