Annotation of sys/arch/i386/stand/libsa/dev_i386.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: dev_i386.c,v 1.30 2007/06/27 20:29:37 mk Exp $ */
2:
3: /*
4: * Copyright (c) 1996-1999 Michael Shalayeff
5: * All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: *
16: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19: * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
20: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22: * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
25: * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26: * THE POSSIBILITY OF SUCH DAMAGE.
27: */
28:
29: #include "libsa.h"
30: #include "biosdev.h"
31: #include <sys/param.h>
32: #include <dev/cons.h>
33:
34: extern int debug;
35:
36: /* XXX use slot for 'rd' for 'hd' pseudo-device */
37: const char bdevs[][4] = {
38: "wd", "", "fd", "", "sd", "st", "cd", "mcd",
39: "", "", "", "", "", "", "", "scd", "", "hd", ""
40: };
41: const int nbdevs = NENTS(bdevs);
42:
43: const char cdevs[][4] = {
44: "cn", "", "", "", "", "", "", "",
45: "com", "", "", "", "pc"
46: };
47: const int ncdevs = NENTS(cdevs);
48:
49: /* pass dev_t to the open routines */
50: int
51: devopen(struct open_file *f, const char *fname, char **file)
52: {
53: struct devsw *dp = devsw;
54: register int i, rc = 1;
55:
56: *file = (char *)fname;
57:
58: #ifdef DEBUG
59: if (debug)
60: printf("devopen:");
61: #endif
62:
63: for (i = 0; i < ndevs && rc != 0; dp++, i++) {
64: #ifdef DEBUG
65: if (debug)
66: printf(" %s: ", dp->dv_name);
67: #endif
68: if ((rc = (*dp->dv_open)(f, file)) == 0) {
69: f->f_dev = dp;
70: return 0;
71: }
72: #ifdef DEBUG
73: else if (debug)
74: printf("%d", rc);
75: #endif
76:
77: }
78: #ifdef DEBUG
79: if (debug)
80: putchar('\n');
81: #endif
82:
83: if ((f->f_flags & F_NODEV) == 0)
84: f->f_dev = dp;
85:
86: return rc;
87: }
88:
89: void
90: devboot(dev_t bootdev, char *p)
91: {
92: #ifdef _TEST
93: *p++ = '/';
94: *p++ = 'd';
95: *p++ = 'e';
96: *p++ = 'v';
97: *p++ = '/';
98: *p++ = 'r';
99: #endif
100: if (bootdev & 0x100) {
101: *p++ = 'c';
102: *p++ = 'd';
103: *p++ = '0';
104: } else {
105: if (bootdev & 0x80)
106: *p++ = 'h';
107: else
108: *p++ = 'f';
109: *p++ = 'd';
110: *p++ = '0' + (bootdev & 0x7f);
111: }
112: *p++ = 'a';
113: *p = '\0';
114: }
115:
116: int pch_pos = 0;
117:
118: void
119: putchar(int c)
120: {
121: switch (c) {
122: case '\177': /* DEL erases */
123: cnputc('\b');
124: cnputc(' ');
125: case '\b':
126: cnputc('\b');
127: if (pch_pos)
128: pch_pos--;
129: break;
130: case '\t':
131: do
132: cnputc(' ');
133: while (++pch_pos % 8);
134: break;
135: case '\n':
136: case '\r':
137: cnputc(c);
138: pch_pos=0;
139: break;
140: default:
141: cnputc(c);
142: pch_pos++;
143: break;
144: }
145: }
146:
147: int
148: getchar(void)
149: {
150: register int c = cngetc();
151:
152: if (c == '\r')
153: c = '\n';
154:
155: if ((c < ' ' && c != '\n') || c == '\177')
156: return c;
157:
158: putchar(c);
159:
160: return c;
161: }
162:
163: char ttyname_buf[8];
164:
165: char *
166: ttyname(int fd)
167: {
168: snprintf(ttyname_buf, sizeof ttyname_buf, "%s%d",
169: cdevs[major(cn_tab->cn_dev)], minor(cn_tab->cn_dev));
170:
171: return ttyname_buf;
172: }
173:
174: dev_t
175: ttydev(char *name)
176: {
177: int i, unit = -1;
178: char *no = name + strlen(name) - 1;
179:
180: while (no >= name && *no >= '0' && *no <= '9')
181: unit = (unit < 0 ? 0 : (unit * 10)) + *no-- - '0';
182: if (no < name || unit < 0)
183: return NODEV;
184: for (i = 0; i < ncdevs; i++)
185: if (strncmp(name, cdevs[i], no - name + 1) == 0)
186: return (makedev(i, unit));
187: return NODEV;
188: }
189:
190: int
191: cnspeed(dev_t dev, int sp)
192: {
193: if (major(dev) == 8) /* comN */
194: return (comspeed(dev, sp));
195:
196: /* pc0 and anything else */
197: return 9600;
198: }
CVSweb