Annotation of sys/arch/hppa64/stand/libsa/dev_hppa64.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: dev_hppa64.c,v 1.2 2005/05/29 18:53:54 miod Exp $ */
2:
3: /*
4: * Copyright (c) 2005 Michael Shalayeff
5: * All rights reserved.
6: *
7: * Permission to use, copy, modify, and distribute this software for any
8: * purpose with or without fee is hereby granted, provided that the above
9: * copyright notice and this permission notice appear in all copies.
10: *
11: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15: * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
16: * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
17: * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18: */
19:
20: #include "libsa.h"
21: #include <sys/param.h>
22: #include <sys/disklabel.h>
23: #include <sys/reboot.h>
24: #include <dev/cons.h>
25:
26: #include <machine/iomod.h>
27:
28: #include "dev_hppa64.h"
29:
30: extern int debug;
31:
32: const char cdevs[][4] = {
33: "ite", "", "", "", "", "", "", "",
34: "", "", "", "", ""
35: };
36: const int ncdevs = NENTS(cdevs);
37:
38: const struct pdc_devs {
39: char name[3];
40: int dev_type;
41: } pdc_devs[] = {
42: { "dk", 0 },
43: { "ct", 1 },
44: { "lf", 2 },
45: { "", -1 },
46: { "rd", -1 },
47: { "sw", -1 },
48: { "fl", -1 },
49: };
50:
51: /* pass dev_t to the open routines */
52: int
53: devopen(f, fname, file)
54: struct open_file *f;
55: const char *fname;
56: char **file;
57: {
58: struct hppa_dev *hpd;
59: const struct pdc_devs *dp = pdc_devs;
60: int rc = 1;
61:
62: if (!(*file = strchr(fname, ':')))
63: return ENODEV;
64: else
65: (*file)++;
66:
67: #ifdef DEBUGBUG
68: if (debug)
69: printf("devopen: ");
70: #endif
71:
72: for (dp = pdc_devs; dp < &pdc_devs[NENTS(pdc_devs)]; dp++)
73: if (!strncmp(fname, dp->name, sizeof(dp->name)-1))
74: break;
75:
76: if (dp >= &pdc_devs[NENTS(pdc_devs)] || dp->dev_type < 0)
77: return ENODEV;
78: #ifdef DEBUGBUG
79: if (debug)
80: printf("%s\n", dp->name);
81: #endif
82:
83: if (!(hpd = alloc(sizeof *hpd))) {
84: #ifdef DEBUG
85: printf ("devopen: no mem\n");
86: #endif
87: } else {
88: bzero(hpd, sizeof *hpd);
89: hpd->bootdev = bootdev;
90: hpd->buf = (char *)(((u_long)hpd->ua_buf + IODC_MINIOSIZ-1) &
91: ~(IODC_MINIOSIZ-1));
92: f->f_devdata = hpd;
93: if ((rc = (*devsw[dp->dev_type].dv_open)(f, file)) == 0) {
94: f->f_dev = &devsw[dp->dev_type];
95: return 0;
96: }
97: free (hpd, 0);
98: f->f_devdata = NULL;
99: }
100:
101: if (!(f->f_flags & F_NODEV))
102: f->f_dev = &devsw[dp->dev_type];
103:
104: if (!f->f_devdata)
105: *file = NULL;
106:
107: return rc;
108: }
109:
110: void
111: devboot(dev, p)
112: dev_t dev;
113: char *p;
114: {
115: const char *q;
116: int unit;
117:
118: if (!dev) {
119: int type;
120:
121: switch (PAGE0->mem_boot.pz_class) {
122: case PCL_RANDOM:
123: type = 0;
124: unit = PAGE0->mem_boot.pz_layers[0];
125: break;
126: case PCL_SEQU:
127: type = 1;
128: unit = PAGE0->mem_boot.pz_layers[0];
129: break;
130: case PCL_NET_MASK|PCL_SEQU:
131: type = 2;
132: unit = 0;
133: break;
134: default:
135: type = 0;
136: unit = 0;
137: break;
138: }
139: dev = bootdev = MAKEBOOTDEV(type, 0, 0, unit, B_PARTITION(dev));
140: }
141: #ifdef _TEST
142: *p++ = '/';
143: *p++ = 'd';
144: *p++ = 'e';
145: *p++ = 'v';
146: *p++ = '/';
147: *p++ = 'r';
148: #endif
149: /* quick copy device name */
150: for (q = pdc_devs[B_TYPE(dev)].name; (*p++ = *q++););
151: unit = B_UNIT(dev);
152: if (unit >= 10) {
153: p[-1] = '0' + unit / 10;
154: *p++ = '0' + (unit % 10);
155: } else
156: p[-1] = '0' + unit;
157: *p++ = 'a' + B_PARTITION(dev);
158: *p = '\0';
159: }
160:
161: int pch_pos;
162:
163: void
164: putchar(c)
165: int c;
166: {
167: switch(c) {
168: case '\177': /* DEL erases */
169: cnputc('\b');
170: cnputc(' ');
171: case '\b':
172: cnputc('\b');
173: if (pch_pos)
174: pch_pos--;
175: break;
176: case '\t':
177: do
178: cnputc(' ');
179: while(++pch_pos % 8);
180: break;
181: case '\n':
182: case '\r':
183: cnputc(c);
184: pch_pos=0;
185: break;
186: default:
187: cnputc(c);
188: pch_pos++;
189: break;
190: }
191: }
192:
193: int
194: getchar()
195: {
196: int c = cngetc();
197:
198: if (c == '\r')
199: c = '\n';
200:
201: if ((c < ' ' && c != '\n') || c == '\177')
202: return(c);
203:
204: putchar(c);
205:
206: return(c);
207: }
208:
209: char ttyname_buf[8];
210: char *
211: ttyname(fd)
212: int fd;
213: {
214: snprintf(ttyname_buf, sizeof ttyname_buf, "%s%d",
215: cdevs[major(cn_tab->cn_dev)],
216: minor(cn_tab->cn_dev));
217: return (ttyname_buf);
218: }
219:
220: dev_t
221: ttydev(name)
222: char *name;
223: {
224: int i, unit = -1;
225: char *no = name + strlen(name) - 1;
226:
227: while (no >= name && *no >= '0' && *no <= '9')
228: unit = (unit < 0 ? 0 : (unit * 10)) + *no-- - '0';
229: if (no < name || unit < 0)
230: return (NODEV);
231: for (i = 0; i < ncdevs; i++)
232: if (strncmp(name, cdevs[i], no - name + 1) == 0)
233: return (makedev(i, unit));
234: return (NODEV);
235: }
CVSweb