xref: /openbsd-src/sys/arch/i386/stand/libsa/dev_i386.c (revision a211a09ce15d8d6478c9f338c794bcdd09688210)
1*a211a09cSjsing /*	$OpenBSD: dev_i386.c,v 1.43 2016/09/11 17:52:47 jsing Exp $	*/
2df1f5d3aSweingart 
3df1f5d3aSweingart /*
4857b0937Smickey  * Copyright (c) 1996-1999 Michael Shalayeff
5df1f5d3aSweingart  * All rights reserved.
6df1f5d3aSweingart  *
7df1f5d3aSweingart  * Redistribution and use in source and binary forms, with or without
8df1f5d3aSweingart  * modification, are permitted provided that the following conditions
9df1f5d3aSweingart  * are met:
10df1f5d3aSweingart  * 1. Redistributions of source code must retain the above copyright
11df1f5d3aSweingart  *    notice, this list of conditions and the following disclaimer.
12df1f5d3aSweingart  * 2. Redistributions in binary form must reproduce the above copyright
13df1f5d3aSweingart  *    notice, this list of conditions and the following disclaimer in the
14df1f5d3aSweingart  *    documentation and/or other materials provided with the distribution.
15df1f5d3aSweingart  *
16df1f5d3aSweingart  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17857b0937Smickey  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18857b0937Smickey  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19857b0937Smickey  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
20857b0937Smickey  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21857b0937Smickey  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22857b0937Smickey  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23857b0937Smickey  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24857b0937Smickey  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
25857b0937Smickey  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26857b0937Smickey  * THE POSSIBILITY OF SUCH DAMAGE.
27df1f5d3aSweingart  */
28df1f5d3aSweingart 
29c657d8f4Sniklas #include <sys/param.h>
30300918efSjsing #include <sys/queue.h>
31300918efSjsing #include <sys/disklabel.h>
32c657d8f4Sniklas #include <dev/cons.h>
33df1f5d3aSweingart 
34531ff0cdSjsing #include "libsa.h"
35531ff0cdSjsing #include "biosdev.h"
36300918efSjsing #include "disk.h"
37300918efSjsing 
38300918efSjsing #ifdef SOFTRAID
39300918efSjsing #include <dev/biovar.h>
40300918efSjsing #include <dev/softraidvar.h>
41*a211a09cSjsing #include <lib/libsa/softraid.h>
4265f4a3c7Sjsing #include "softraid_i386.h"
43300918efSjsing #endif
44531ff0cdSjsing 
458f73cbb7Smickey extern int debug;
468f73cbb7Smickey 
47dc3210baSmickey /* XXX use slot for 'rd' for 'hd' pseudo-device */
4841a5b770Smickey const char bdevs[][4] = {
49d3d1d3b8Stedu 	"wd", "", "fd", "", "sd", "st", "cd", "",
503692301cStedu 	"", "", "", "", "", "", "", "", "", "hd", ""
511e251da8Smickey };
52cf92b8d0Sjasper const int nbdevs = nitems(bdevs);
531e251da8Smickey 
54c657d8f4Sniklas const char cdevs[][4] = {
5554d6f5f3Smickey 	"cn", "", "", "", "", "", "", "",
56c657d8f4Sniklas 	"com", "", "", "", "pc"
57c657d8f4Sniklas };
58cf92b8d0Sjasper const int ncdevs = nitems(cdevs);
59c657d8f4Sniklas 
60df1f5d3aSweingart /* pass dev_t to the open routines */
61df1f5d3aSweingart int
devopen(struct open_file * f,const char * fname,char ** file)62df1f5d3aSweingart devopen(struct open_file *f, const char *fname, char **file)
63df1f5d3aSweingart {
64df1f5d3aSweingart 	struct devsw *dp = devsw;
651e251da8Smickey 	register int i, rc = 1;
66df1f5d3aSweingart 
67df1f5d3aSweingart 	*file = (char *)fname;
68df1f5d3aSweingart 
69395612f5Smickey #ifdef DEBUG
70a96455dbSmickey 	if (debug)
71395612f5Smickey 		printf("devopen:");
72395612f5Smickey #endif
73395612f5Smickey 
74395612f5Smickey 	for (i = 0; i < ndevs && rc != 0; dp++, i++) {
75395612f5Smickey #ifdef DEBUG
76a96455dbSmickey 		if (debug)
77857b0937Smickey 			printf(" %s: ", dp->dv_name);
78395612f5Smickey #endif
79df1f5d3aSweingart 		if ((rc = (*dp->dv_open)(f, file)) == 0) {
80df1f5d3aSweingart 			f->f_dev = dp;
81df1f5d3aSweingart 			return 0;
82df1f5d3aSweingart 		}
83395612f5Smickey #ifdef DEBUG
84a96455dbSmickey 		else if (debug)
85857b0937Smickey 			printf("%d", rc);
86395612f5Smickey #endif
87395612f5Smickey 
88395612f5Smickey 	}
89395612f5Smickey #ifdef DEBUG
90a96455dbSmickey 	if (debug)
91395612f5Smickey 		putchar('\n');
92395612f5Smickey #endif
93df1f5d3aSweingart 
94df1f5d3aSweingart 	if ((f->f_flags & F_NODEV) == 0)
95df1f5d3aSweingart 		f->f_dev = dp;
96df1f5d3aSweingart 
97df1f5d3aSweingart 	return rc;
98df1f5d3aSweingart }
99df1f5d3aSweingart 
100df1f5d3aSweingart void
devboot(dev_t bootdev,char * p)101599546b3Sderaadt devboot(dev_t bootdev, char *p)
102395612f5Smickey {
103531ff0cdSjsing #ifdef SOFTRAID
104531ff0cdSjsing 	struct sr_boot_volume *bv;
105531ff0cdSjsing 	struct sr_boot_chunk *bc;
106531ff0cdSjsing 	struct diskinfo *dip = NULL;
107531ff0cdSjsing #endif
108531ff0cdSjsing 	int sr_boot_vol = -1;
109531ff0cdSjsing 	int part_type = FS_UNUSED;
110531ff0cdSjsing 
111531ff0cdSjsing #ifdef SOFTRAID
112531ff0cdSjsing 	/*
113531ff0cdSjsing 	 * Determine the partition type for the 'a' partition of the
114531ff0cdSjsing 	 * boot device.
115531ff0cdSjsing 	 */
116531ff0cdSjsing 	TAILQ_FOREACH(dip, &disklist, list)
117531ff0cdSjsing 		if (dip->bios_info.bios_number == bootdev &&
118531ff0cdSjsing 		    (dip->bios_info.flags & BDI_BADLABEL) == 0)
119531ff0cdSjsing 			part_type = dip->disklabel.d_partitions[0].p_fstype;
120531ff0cdSjsing 
121531ff0cdSjsing 	/*
122531ff0cdSjsing 	 * See if we booted from a disk that is a member of a bootable
123531ff0cdSjsing 	 * softraid volume.
124531ff0cdSjsing 	 */
125531ff0cdSjsing 	SLIST_FOREACH(bv, &sr_volumes, sbv_link) {
126531ff0cdSjsing 		if (bv->sbv_flags & BIOC_SCBOOTABLE)
127531ff0cdSjsing 			SLIST_FOREACH(bc, &bv->sbv_chunks, sbc_link)
128531ff0cdSjsing 				if (bc->sbc_disk == bootdev)
129531ff0cdSjsing 					sr_boot_vol = bv->sbv_unit;
130531ff0cdSjsing 		if (sr_boot_vol != -1)
131531ff0cdSjsing 			break;
132531ff0cdSjsing 	}
133531ff0cdSjsing #endif
134531ff0cdSjsing 
135531ff0cdSjsing 	if (sr_boot_vol != -1 && part_type != FS_BSDFFS) {
136531ff0cdSjsing 		*p++ = 's';
137531ff0cdSjsing 		*p++ = 'r';
138531ff0cdSjsing 		*p++ = '0' + sr_boot_vol;
139531ff0cdSjsing 	} else if (bootdev & 0x100) {
140285601acStom 		*p++ = 'c';
141285601acStom 		*p++ = 'd';
142285601acStom 		*p++ = '0';
143285601acStom 	} else {
144395612f5Smickey 		if (bootdev & 0x80)
145395612f5Smickey 			*p++ = 'h';
146395612f5Smickey 		else
147395612f5Smickey 			*p++ = 'f';
148395612f5Smickey 		*p++ = 'd';
149395612f5Smickey 		*p++ = '0' + (bootdev & 0x7f);
150285601acStom 	}
151395612f5Smickey 	*p++ = 'a';
152395612f5Smickey 	*p = '\0';
153395612f5Smickey }
154395612f5Smickey 
1559f2d58dfSderaadt char ttyname_buf[8];
156599546b3Sderaadt 
1571bfcf543Smickey char *
ttyname(int fd)158599546b3Sderaadt ttyname(int fd)
1591bfcf543Smickey {
1601ee9984cSderaadt 	snprintf(ttyname_buf, sizeof ttyname_buf, "%s%d",
16161acb34aStom 	    cdevs[major(cn_tab->cn_dev)], minor(cn_tab->cn_dev));
16261acb34aStom 
16361acb34aStom 	return ttyname_buf;
164c657d8f4Sniklas }
165c657d8f4Sniklas 
166c657d8f4Sniklas dev_t
ttydev(char * name)167599546b3Sderaadt ttydev(char *name)
168c657d8f4Sniklas {
169c657d8f4Sniklas 	int i, unit = -1;
170c657d8f4Sniklas 	char *no = name + strlen(name) - 1;
171c657d8f4Sniklas 
172c657d8f4Sniklas 	while (no >= name && *no >= '0' && *no <= '9')
173c657d8f4Sniklas 		unit = (unit < 0 ? 0 : (unit * 10)) + *no-- - '0';
174c657d8f4Sniklas 	if (no < name || unit < 0)
17561acb34aStom 		return NODEV;
176c657d8f4Sniklas 	for (i = 0; i < ncdevs; i++)
177c657d8f4Sniklas 		if (strncmp(name, cdevs[i], no - name + 1) == 0)
178ae539668Sjsing 			return makedev(i, unit);
17961acb34aStom 	return NODEV;
1801bfcf543Smickey }
1815f80766bSmickey 
1825f80766bSmickey int
cnspeed(dev_t dev,int sp)183599546b3Sderaadt cnspeed(dev_t dev, int sp)
1845f80766bSmickey {
1855f80766bSmickey 	if (major(dev) == 8)	/* comN */
186ae539668Sjsing 		return comspeed(dev, sp);
18761acb34aStom 
1885f80766bSmickey 	/* pc0 and anything else */
1895f80766bSmickey 	return 9600;
1905f80766bSmickey }
191