2 * Mach Operating System
3 * Copyright (c) 1990 Carnegie-Mellon University
4 * Copyright (c) 1989 Carnegie-Mellon University
5 * Copyright (c) 1988 Carnegie-Mellon University
6 * Copyright (c) 1987 Carnegie-Mellon University
7 * All rights reserved. The CMU software License Agreement specifies
8 * the terms and conditions for use and redistribution.
12 * Copyright (c) 1988 Regents of the University of California.
13 * All rights reserved.
15 * Redistribution and use in source and binary forms are permitted
16 * provided that the above copyright notice and this paragraph are
17 * duplicated in all such forms and that any documentation,
18 * advertising materials, and other materials related to such
19 * distribution and use acknowledge that the software was developed
20 * by the University of California, Berkeley. The name of the
21 * University may not be used to endorse or promote products derived
22 * from this software without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
25 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27 * @(#)config.y 5.8 (Berkeley) 6/18/88
33 struct file_list *file;
95 /* following 3 are unique to CMU */
102 %token <val> FPNUMBER
105 %type <str> Opt_value
108 %type <val> optional_size
109 %type <str> device_name
110 %type <val> major_minor
111 %type <val> arg_device_spec
112 %type <val> root_device_spec
113 %type <val> dump_device_spec
114 %type <file> swap_device_spec
124 struct device *curp = 0;
127 /* char *malloc(); */
131 int finddev(dev_t dev);
132 int alreadychecked(dev_t dev, dev_t list[], dev_t *last);
133 void deverror(const char *systemname, const char *devtype);
134 void mkconf(char *sysname);
135 struct file_list *newswap(void);
136 void mkswap(struct file_list *syslist, struct file_list *fl, int size);
137 struct device *huhcon(const char *dev);
138 void check_nexus(struct device *dev, int num);
139 void check_slot(struct device *dev, int num);
140 void checksystemspec(struct file_list *fl);
141 void verifysystemspecs(void);
142 dev_t *verifyswap(struct file_list *fl, dev_t checked[], dev_t *pchecked);
143 struct device *dconnect(const char *dev, int num);
149 { verifysystemspecs(); }
159 Device_spec SEMICOLON
161 Config_spec SEMICOLON
164 { do_trace = !do_trace; } |
173 if (!strcmp($2, "vax")) {
174 machine = MACHINE_VAX;
176 } else if (!strcmp($2, "sun")) {
177 /* default to Sun 3 */
178 machine = MACHINE_SUN3;
179 machinename = "sun3";
180 } else if (!strcmp($2, "sun2")) {
181 machine = MACHINE_SUN2;
182 machinename = "sun2";
183 } else if (!strcmp($2, "sun3")) {
184 machine = MACHINE_SUN3;
185 machinename = "sun3";
186 } else if (!strcmp($2, "sun4")) {
187 machine = MACHINE_SUN4;
188 machinename = "sun4";
189 } else if (!strcmp($2, "romp")) {
190 machine = MACHINE_ROMP;
191 machinename = "romp";
192 } else if (!strcmp($2, "ca")) {
193 machine = MACHINE_ROMP;
195 } else if (!strcmp($2, "mmax")) {
196 machine = MACHINE_MMAX;
197 machinename = "mmax";
198 } else if (!strcmp($2, "sqt")) {
199 machine = MACHINE_SQT;
201 } else if (!strcmp($2, "i")) {
202 machine = MACHINE_I386;
203 machinename = "i386";
204 } else if (!strcmp($2, "i386")) {
205 machine = MACHINE_I386;
206 machinename = "i386";
207 } else if (!strcmp($2, "ix")) {
208 machine = MACHINE_IX;
210 } else if (!strcmp($2, "mipsy")) {
211 machine = MACHINE_MIPSY;
212 machinename = "mipsy";
213 } else if (!strcmp($2, "mips")) {
214 machine = MACHINE_MIPS;
215 machinename = "mips";
216 } else if (!strcmp($2, "i860")) {
217 machine = MACHINE_I860;
218 machinename = "i860";
219 } else if (!strcmp($2, "m68k")) {
220 machine = MACHINE_M68K;
221 machinename = "m68k";
222 } else if (!strcmp($2, "m88k")) {
223 machine = MACHINE_M88K;
224 machinename = "m88k";
225 } else if (!strcmp($2, "m98k")) {
226 machine = MACHINE_M98K;
227 machinename = "m98k";
228 } else if (!strcmp($2, "hppa")) {
229 machine = MACHINE_HPPA;
230 machinename = "hppa";
231 } else if (!strcmp($2, "sparc")) {
232 machine = MACHINE_SPARC;
233 machinename = "sparc";
234 } else if (!strcmp($2, "ppc")) {
235 machine = MACHINE_PPC;
237 } else if (!strcmp($2, "arm")) {
238 machine = MACHINE_ARM;
240 } else if (!strcmp($2, "x86_64")) {
241 machine = MACHINE_X86_64;
242 machinename = "x86_64";
244 yyerror("Unknown machine type");
249 (struct cputype *)malloc(sizeof (struct cputype));
250 cp->cpu_name = ns($2);
251 cp->cpu_next = cputype;
257 MAKEOPTIONS Mkopt_list
268 { build_directory = ns($2); }
271 { config_directory = ns($2); }
274 { object_directory = ns($2); }
277 { source_directory = ns($2); }
285 { checksystemspec(*confp); }
286 | System_id System_parameter_list
287 { checksystemspec(*confp); }
295 System_parameter_list:
296 System_parameter_list System_parameter
308 SWAP optional_on swap_device_list
312 swap_device_list AND swap_device
317 swap_device_spec optional_size
318 { mkswap(*confp, $1, $2); }
324 struct file_list *fl = newswap();
326 if (eq($1, "generic"))
329 fl->f_swapdev = nametodev($1, 0, 'b');
330 fl->f_fn = devtoname(fl->f_swapdev);
336 struct file_list *fl = newswap();
339 fl->f_fn = devtoname($1);
345 ROOT optional_on root_device_spec
347 struct file_list *fl = *confp;
349 if (fl && fl->f_rootdev != NODEV)
350 yyerror("extraneous root device specification");
358 { $$ = nametodev($1, 0, 'a'); }
363 DUMPS optional_on dump_device_spec
365 struct file_list *fl = *confp;
367 if (fl && fl->f_dumpdev != NODEV)
368 yyerror("extraneous dump device specification");
377 { $$ = nametodev($1, 0, 'b'); }
382 ARGS optional_on arg_device_spec
384 struct file_list *fl = *confp;
386 if (fl && fl->f_argdev != NODEV)
387 yyerror("extraneous arg device specification");
395 { $$ = nametodev($1, 0, 'b'); }
400 MAJOR NUMBER MINOR NUMBER
401 { $$ = makedev($2, $4); }
423 (void) sprintf(buf, "%s%d", $1, $2);
424 $$ = ns(buf); free($1);
430 (void) sprintf(buf, "%s%d%s", $1, $2, $3);
431 $$ = ns(buf); free($1);
436 Opt_list COMMA Option
444 struct opt *op = (struct opt *)malloc(sizeof (struct opt));
445 op->op_name = ns($1);
446 op->op_next = (struct opt *) 0;
448 if (opt == (struct opt *) 0)
451 opt_tail->op_next = op;
455 Save_id EQUALS Opt_value
457 struct opt *op = (struct opt *)malloc(sizeof (struct opt));
458 op->op_name = ns($1);
459 op->op_next = (struct opt *) 0;
460 op->op_value = ns($3);
461 if (opt == (struct opt *) 0)
464 opt_tail->op_next = op;
473 { $$ = val_id = ns($1); } |
476 (void) sprintf(nb, "%u", $1);
477 $$ = val_id = ns(nb);
479 /* lambda from MIPS -- WHY */
480 { $$ = val_id = ns(""); }
485 { $$ = temp_id = ns($1); }
489 Mkopt_list COMMA Mkoption
497 struct opt *op = (struct opt *)malloc(sizeof (struct opt));
498 op->op_name = ns($1);
499 op->op_next = (struct opt *) 0;
504 Save_id EQUALS Opt_value
506 struct opt *op = (struct opt *)malloc(sizeof (struct opt));
507 op->op_name = ns($1);
508 op->op_next = (struct opt *) 0;
509 op->op_value = ns($3);
510 if (mkopt == (struct opt *) 0)
513 mkopt_tail->op_next = op;
522 { $$ = ns("uba"); } |
524 { $$ = ns("mba"); } |
527 if (machine != MACHINE_SUN2 && machine != MACHINE_SUN3
528 && machine != MACHINE_SUN4)
529 yyerror("wrong machine type for vme16d16");
534 if (machine != MACHINE_SUN2 && machine != MACHINE_SUN3
535 && machine != MACHINE_SUN4)
536 yyerror("wrong machine type for vme24d16");
541 if (machine != MACHINE_SUN3 && machine != MACHINE_SUN4)
543 yyerror("wrong machine type for vme32d16");
548 if (machine != MACHINE_SUN3 && machine != MACHINE_SUN4)
549 yyerror("wrong machine type for vme16d32");
554 if (machine != MACHINE_SUN3 && machine != MACHINE_SUN4)
555 yyerror("wrong machine type for vme24d32");
560 if (machine != MACHINE_SUN3 && machine != MACHINE_SUN4)
561 yyerror("wrong machine type for vme32d32");
566 if (machine != MACHINE_MIPSY && machine != MACHINE_MIPS)
567 yyerror("wrong machine type for vme");
572 if (machine != MACHINE_MIPSY && machine != MACHINE_MIPS)
573 yyerror("wrong machine type for mbii");
581 DEVICE Dev_name Dev_info Int_spec
582 { cur.d_type = DEVICE; } |
583 MASTER Dev_name Dev_info Int_spec
584 { cur.d_type = MASTER; } |
585 DISK Dev_name Dev_info Int_spec
586 { cur.d_dk = 1; cur.d_type = DEVICE; } |
587 /* TAPE rule is unique to CMU */
588 TAPE Dev_name Dev_info Int_spec
589 { cur.d_type = DEVICE; } |
590 CONTROLLER Dev_name Dev_info Int_spec
591 { cur.d_type = CONTROLLER; } |
592 PSEUDO_DEVICE Init_dev Dev
595 cur.d_type = PSEUDO_DEVICE;
597 PSEUDO_DEVICE Init_dev Dev NUMBER
600 cur.d_type = PSEUDO_DEVICE;
603 PSEUDO_DEVICE Init_dev Dev INIT ID
606 cur.d_type = PSEUDO_DEVICE;
609 PSEUDO_DEVICE Init_dev Dev NUMBER INIT ID
612 cur.d_type = PSEUDO_DEVICE;
623 else if (eq($2, "uba"))
625 else if (eq($2, "mbii"))
627 else if (eq($2, "vme"))
645 if (eq(cur.d_name, "mba") || eq(cur.d_name, "uba")
646 || eq(cur.d_name, "mbii") || eq(cur.d_name, "vme")) {
647 (void) sprintf(errbuf,
648 "%s must be connected to a nexus", cur.d_name);
651 cur.d_conn = dconnect($2, $3);
652 if (machine == MACHINE_SQT)
653 dev_param(&cur, "index", cur.d_unit);
655 /* AT SLOT NUMBER rule is unique to CMU */
658 check_slot(&cur, $3);
660 cur.d_conn = TO_SLOT;
663 { check_nexus(&cur, $3); cur.d_conn = TO_NEXUS; };
675 if (machine == MACHINE_SQT) {
676 dev_param(&cur, "csr", $2);
682 if (machine == MACHINE_SQT) {
683 dev_param(&cur, "drive", $2);
688 if (cur.d_conn != 0 && cur.d_conn != TO_NEXUS &&
689 cur.d_conn->d_type == MASTER)
692 yyerror("can't specify slave--not to master");
696 { cur.d_addrmod = $2; } |
697 /* LUN NUMBER rule is unique to CMU */
700 if ((cur.d_conn != 0) && (cur.d_conn != TO_SLOT) &&
701 (cur.d_conn->d_type == CONTROLLER)) {
705 yyerror("device requires controller card");
711 if (machine == MACHINE_SQT) {
712 dev_param(&cur, "flags", $2);
717 if (machine != MACHINE_SQT)
718 yyerror("bin specification only valid on Sequent Balance");
719 if ($2 < 1 || $2 > 7)
720 yyerror("bogus bin number");
723 dev_param(&cur, "bin", $2);
728 if (machine != MACHINE_SQT)
729 yyerror("bad device spec");
730 dev_param(&cur, $1, $2);
744 { cur.d_pri = $2; } |
745 PRIORITY NUMBER Vec_spec
746 { cur.d_pri = $2; } |
747 Vec_spec PRIORITY NUMBER
748 { cur.d_pri = $3; } |
760 struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
761 a->id = $1; a->id_next = 0; $$ = a;
766 struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
767 a->id = $1; a->id_next = $2; $$ = a;
772 struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
773 a->id_next = 0; a->id = $1; $$ = a;
776 Save_id NUMBER Id_list
778 struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
779 a->id_next = $3; a->id = $1; $$ = a;
786 yyerror(const char *s)
788 fprintf(stderr, "config: line %d: %s\n", yyline, s);
792 * return the passed string in a new space
799 cp = malloc((unsigned)(strlen(str)+1));
800 (void) strcpy(cp, str);
805 * add a device to the list of devices
808 newdev(struct device *dp)
810 register struct device *np;
812 np = (struct device *) malloc(sizeof *np);
823 * note that a configuration should be made
826 mkconf(char *sysname)
828 register struct file_list *fl, **flp;
830 fl = (struct file_list *) malloc(sizeof *fl);
831 fl->f_type = SYSTEMSPEC;
832 fl->f_needs = sysname;
833 fl->f_rootdev = NODEV;
834 fl->f_argdev = NODEV;
835 fl->f_dumpdev = NODEV;
838 for (flp = confp; *flp; flp = &(*flp)->f_next)
847 struct file_list *fl = (struct file_list *)malloc(sizeof (*fl));
849 fl->f_type = SWAPSPEC;
851 fl->f_swapdev = NODEV;
859 * Add a swap device to the system's configuration
862 mkswap(struct file_list *syslist, struct file_list *fl, int size)
864 register struct file_list **flp;
866 if (syslist == 0 || syslist->f_type != SYSTEMSPEC) {
867 yyerror("\"swap\" spec precedes \"config\" specification");
871 yyerror("illegal swap partition size");
875 * Append swap description to the end of the list.
877 flp = &syslist->f_next;
878 for (; *flp && (*flp)->f_type == SWAPSPEC; flp = &(*flp)->f_next)
882 fl->f_swapsize = size;
884 * If first swap device for this system,
885 * set up f_fn field to insure swap
886 * files are created with unique names.
890 if (eq(fl->f_fn, "generic"))
891 syslist->f_fn = ns(fl->f_fn);
893 syslist->f_fn = ns(syslist->f_needs);
897 * find the pointer to connect to the given device and number.
898 * returns 0 if no such device and prints an error message
901 dconnect(const char *dev, int num)
903 register struct device *dp;
906 return (huhcon(dev));
907 for (dp = dtab; dp != 0; dp = dp->d_next) {
908 if ((num != dp->d_unit) || !eq(dev, dp->d_name))
910 if (dp->d_type != CONTROLLER && dp->d_type != MASTER) {
911 (void) sprintf(errbuf,
912 "%s connected to non-controller", dev);
918 (void) sprintf(errbuf, "%s %d not defined", dev, num);
924 * connect to an unspecific thing
927 huhcon(const char *dev)
929 register struct device *dp, *dcp;
930 struct device rdev; /* only used if dp is NULL */
933 memset(&rdev, 0, sizeof rdev);
936 * First make certain that there are some of these to wildcard on
938 for (dp = dtab; dp != 0; dp = dp->d_next)
939 if (eq(dp->d_name, dev))
942 (void) sprintf(errbuf, "no %s's to wildcard", dev);
946 oldtype = dp->d_type;
949 * Now see if there is already a wildcard entry for this device
950 * (e.g. Search for a "uba ?")
952 for (; dp != 0; dp = dp->d_next)
953 if (eq(dev, dp->d_name) && dp->d_unit == -1)
956 * If there isn't, make one because everything needs to be connected
963 dp->d_name = ns(dev);
964 dp->d_type = oldtype;
968 * Connect it to the same thing that other similar things are
969 * connected to, but make sure it is a wildcard unit
970 * (e.g. up connected to sc ?, here we make connect sc? to a
971 * uba?). If other things like this are on the NEXUS or
972 * if they aren't connected to anything, then make the same
973 * connection, else call ourself to connect to another
976 if (dcp == TO_NEXUS || dcp == 0)
979 dp->d_conn = dconnect(dcp->d_name, QUES);
985 init_dev(struct device *dp)
988 dp->d_name = "OHNO!!!";
992 dp->d_addr = dp->d_pri = dp->d_flags = dp->d_dk = 0;
993 dp->d_slave = dp->d_drive = dp->d_unit = UNKNOWN;
994 if (machine == MACHINE_SUN2 || machine == MACHINE_SUN3
995 || machine == MACHINE_SUN4){
996 dp->d_addr = UNKNOWN;
997 dp->d_mach = dp->d_bus = 0;
999 if (machine == MACHINE_MIPSY || machine == MACHINE_MIPS){
1006 * make certain that this is a reasonable type of thing to connect to a nexus
1009 check_nexus(struct device *dev, int num)
1015 if (!eq(dev->d_name, "uba") && !eq(dev->d_name, "mba"))
1016 yyerror("only uba's and mba's should be connected to the nexus");
1018 yyerror("can't give specific nexus numbers");
1022 if (!eq(dev->d_name, "mb"))
1023 yyerror("only mb's should be connected to the nexus");
1027 if (!eq(dev->d_name, "iocc"))
1028 yyerror("only iocc's should be connected to the nexus");
1031 if (!eq(dev->d_name, "virtual") &&
1032 !eq(dev->d_name, "obmem") &&
1033 !eq(dev->d_name, "obio") &&
1034 !eq(dev->d_name, "mbmem") &&
1035 !eq(dev->d_name, "mbio") &&
1036 !eq(dev->d_name, "vme16d16") &&
1037 !eq(dev->d_name, "vme24d16")) {
1038 (void)sprintf(errbuf,
1039 "unknown bus type `%s' for nexus connection on %s",
1040 dev->d_name, machinename);
1045 yyerror("don't grok 'nexus' on mmax -- try 'slot'.");
1049 if (!eq(dev->d_name, "virtual") &&
1050 !eq(dev->d_name, "obmem") &&
1051 !eq(dev->d_name, "obio") &&
1052 !eq(dev->d_name, "mbmem") &&
1053 !eq(dev->d_name, "mbio") &&
1054 !eq(dev->d_name, "vme16d16") &&
1055 !eq(dev->d_name, "vme24d16") &&
1056 !eq(dev->d_name, "vme32d16") &&
1057 !eq(dev->d_name, "vme16d32") &&
1058 !eq(dev->d_name, "vme24d32") &&
1059 !eq(dev->d_name, "vme32d32")) {
1060 (void)sprintf(errbuf,
1061 "unknown bus type `%s' for nexus connection on %s",
1062 dev->d_name, machinename);
1068 if (!eq(dev->d_name, "vme") && !eq(dev->d_name, "mbii"))
1069 yyerror("only vme's and mbii's should be connected to the nexus");
1071 yyerror("can't give specific nexus numbers");
1077 * make certain that this is a reasonable type of thing to connect to a slot
1081 check_slot(struct device *dev, int num)
1087 if (!eq(dev->d_name, "emc"))
1088 yyerror("only emc's plug into backplane slots.");
1090 yyerror("specific slot numbers must be given");
1094 if (!eq(dev->d_name, "mbad") &&
1095 !eq(dev->d_name, "zdc") &&
1096 !eq(dev->d_name, "sec")) {
1097 (void)sprintf(errbuf,
1098 "unknown bus type `%s' for slot on %s",
1099 dev->d_name, machinename);
1105 yyerror("don't grok 'slot' for this machine -- try 'nexus'.");
1111 * Check system specification and apply defaulting
1112 * rules on root, argument, dump, and swap devices.
1115 checksystemspec(struct file_list *fl)
1118 register struct file_list *swap;
1121 if (fl == 0 || fl->f_type != SYSTEMSPEC) {
1122 yyerror("internal error, bad system specification");
1126 generic = swap && swap->f_type == SWAPSPEC && eq(swap->f_fn, "generic");
1127 if (fl->f_rootdev == NODEV && !generic) {
1128 yyerror("no root device specified");
1132 * Default swap area to be in 'b' partition of root's
1133 * device. If root specified to be other than on 'a'
1134 * partition, give warning, something probably amiss.
1136 if (swap == 0 || swap->f_type != SWAPSPEC) {
1140 dev = fl->f_rootdev;
1141 if (minor(dev) & DEV_MASK) {
1143 "Warning, swap defaulted to 'b' partition with root on '%c' partition",
1144 (minor(dev) & DEV_MASK) + 'a');
1148 makedev(major(dev), (minor(dev) &~ DEV_MASK) | ('b' - 'a'));
1149 swap->f_fn = devtoname(swap->f_swapdev);
1150 mkswap(fl, swap, 0);
1153 * Make sure a generic swap isn't specified, along with
1154 * other stuff (user must really be confused).
1157 if (fl->f_rootdev != NODEV)
1158 yyerror("root device specified with generic swap");
1159 if (fl->f_argdev != NODEV)
1160 yyerror("arg device specified with generic swap");
1161 if (fl->f_dumpdev != NODEV)
1162 yyerror("dump device specified with generic swap");
1166 * Default argument device and check for oddball arrangements.
1168 if (fl->f_argdev == NODEV)
1169 fl->f_argdev = swap->f_swapdev;
1170 if (fl->f_argdev != swap->f_swapdev)
1171 yyerror("Warning, arg device different than primary swap");
1173 * Default dump device and warn if place is not a
1174 * swap area or the argument device partition.
1176 if (fl->f_dumpdev == NODEV)
1177 fl->f_dumpdev = swap->f_swapdev;
1178 if (fl->f_dumpdev != swap->f_swapdev && fl->f_dumpdev != fl->f_argdev) {
1179 struct file_list *p = swap->f_next;
1181 for (; p && p->f_type == SWAPSPEC; p = p->f_next)
1182 if (fl->f_dumpdev == p->f_swapdev)
1184 (void) sprintf(buf, "Warning, orphaned dump device, %s",
1185 "do you know what you're doing");
1191 * Verify all devices specified in the system specification
1192 * are present in the device specifications.
1195 verifysystemspecs(void)
1197 register struct file_list *fl;
1199 register dev_t *pchecked = checked;
1201 for (fl = conf_list; fl; fl = fl->f_next) {
1202 if (fl->f_type != SYSTEMSPEC)
1204 if (!finddev(fl->f_rootdev))
1205 deverror(fl->f_needs, "root");
1206 *pchecked++ = fl->f_rootdev;
1207 pchecked = verifyswap(fl->f_next, checked, pchecked);
1208 #define samedev(dev1, dev2) \
1209 ((minor(dev1) &~ DEV_MASK) != (minor(dev2) &~ DEV_MASK))
1210 if (!alreadychecked(fl->f_dumpdev, checked, pchecked)) {
1211 if (!finddev(fl->f_dumpdev))
1212 deverror(fl->f_needs, "dump");
1213 *pchecked++ = fl->f_dumpdev;
1215 if (!alreadychecked(fl->f_argdev, checked, pchecked)) {
1216 if (!finddev(fl->f_argdev))
1217 deverror(fl->f_needs, "arg");
1218 *pchecked++ = fl->f_argdev;
1224 * Do as above, but for swap devices.
1227 verifyswap(struct file_list *fl, dev_t checked[], dev_t *pchecked)
1230 for (;fl && fl->f_type == SWAPSPEC; fl = fl->f_next) {
1231 if (eq(fl->f_fn, "generic"))
1233 if (alreadychecked(fl->f_swapdev, checked, pchecked))
1235 if (!finddev(fl->f_swapdev))
1237 "config: swap device %s not configured", fl->f_fn);
1238 *pchecked++ = fl->f_swapdev;
1244 * Has a device already been checked
1245 * for it's existence in the configuration?
1248 alreadychecked(dev_t dev, dev_t list[], dev_t *last)
1252 for (p = list; p < last; p++)
1253 if (samedev(*p, dev))
1259 deverror(const char *systemname, const char *devtype)
1262 fprintf(stderr, "config: %s: %s device not configured\n",
1263 systemname, devtype);
1267 * Look for the device in the list of
1268 * configured hardware devices. Must
1269 * take into account stuff wildcarded.
1273 finddev(__unused dev_t dev)
1276 /* punt on this right now */