xref: /original-bsd/sys/i386/i386/autoconf.c (revision 3705696b)
1 /*-
2  * Copyright (c) 1990, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * William Jolitz.
7  *
8  * %sccs.include.redist.c%
9  *
10  *	@(#)autoconf.c	8.1 (Berkeley) 06/11/93
11  */
12 
13 /*
14  * Setup the system to run on the current machine.
15  *
16  * Configure() is called at boot time and initializes the vba
17  * device tables and the memory controller monitoring.  Available
18  * devices are determined (from possibilities mentioned in ioconf.c),
19  * and the drivers are initialized.
20  */
21 #include <sys/param.h>
22 #include <sys/systm.h>
23 #include <sys/map.h>
24 #include <sys/buf.h>
25 #include <sys/dkstat.h>
26 #include <sys/conf.h>
27 #include <sys/dmap.h>
28 #include <sys/reboot.h>
29 
30 #include <machine/pte.h>
31 
32 /*
33  * The following several variables are related to
34  * the configuration process, and are used in initializing
35  * the machine.
36  */
37 int	dkn;		/* number of iostat dk numbers assigned so far */
38 extern int	cold;		/* cold start flag initialized in locore.s */
39 
40 /*
41  * Determine i/o configuration for a machine.
42  */
43 configure()
44 {
45 
46 #include "isa.h"
47 #if NISA > 0
48 	isa_configure();
49 #endif
50 
51 #if GENERICxxx
52 	if ((boothowto & RB_ASKNAME) == 0)
53 		setroot();
54 	setconf();
55 #else
56 	setroot();
57 #endif
58 	/*
59 	 * Configure swap area and related system
60 	 * parameter based on device(s) used.
61 	 */
62 	swapconf();
63 	cold = 0;
64 }
65 
66 /*
67  * Configure swap space and related parameters.
68  */
69 swapconf()
70 {
71 	register struct swdevt *swp;
72 	register int nblks;
73 extern int Maxmem;
74 
75 	for (swp = swdevt; swp->sw_dev != NODEV; swp++)
76 	{
77 		if ( (u_int)swp->sw_dev >= nblkdev ) break;	/* XXX */
78 		if (bdevsw[major(swp->sw_dev)].d_psize) {
79 			nblks =
80 			  (*bdevsw[major(swp->sw_dev)].d_psize)(swp->sw_dev);
81 			if (nblks != -1 &&
82 			    (swp->sw_nblks == 0 || swp->sw_nblks > nblks))
83 				swp->sw_nblks = nblks;
84 		}
85 	}
86 	if (dumplo == 0 && bdevsw[major(dumpdev)].d_psize)
87 	/*dumplo = (*bdevsw[major(dumpdev)].d_psize)(dumpdev) - physmem;*/
88 		dumplo = (*bdevsw[major(dumpdev)].d_psize)(dumpdev) -
89 			Maxmem*NBPG/512;
90 	if (dumplo < 0)
91 		dumplo = 0;
92 }
93 
94 #define	DOSWAP			/* change swdevt and dumpdev */
95 u_long	bootdev = 0;		/* should be dev_t, but not until 32 bits */
96 
97 static	char devname[][2] = {
98 	'w','d',	/* 0 = wd */
99 	's','w',	/* 1 = sw */
100 	'f','d',	/* 2 = fd */
101 	'w','t',	/* 3 = wt */
102 	'x','d',	/* 4 = xd */
103 };
104 
105 #define	PARTITIONMASK	0x7
106 #define	PARTITIONSHIFT	3
107 
108 /*
109  * Attempt to find the device from which we were booted.
110  * If we can do so, and not instructed not to do so,
111  * change rootdev to correspond to the load device.
112  */
113 setroot()
114 {
115 	int  majdev, mindev, unit, part, adaptor;
116 	dev_t temp, orootdev;
117 	struct swdevt *swp;
118 
119 	if (boothowto & RB_DFLTROOT ||
120 	    (bootdev & B_MAGICMASK) != (u_long)B_DEVMAGIC)
121 		return;
122 	majdev = (bootdev >> B_TYPESHIFT) & B_TYPEMASK;
123 	if (majdev > sizeof(devname) / sizeof(devname[0]))
124 		return;
125 	adaptor = (bootdev >> B_ADAPTORSHIFT) & B_ADAPTORMASK;
126 	part = (bootdev >> B_PARTITIONSHIFT) & B_PARTITIONMASK;
127 	unit = (bootdev >> B_UNITSHIFT) & B_UNITMASK;
128 	mindev = (unit << PARTITIONSHIFT) + part;
129 	orootdev = rootdev;
130 	rootdev = makedev(majdev, mindev);
131 	/*
132 	 * If the original rootdev is the same as the one
133 	 * just calculated, don't need to adjust the swap configuration.
134 	 */
135 	if (rootdev == orootdev)
136 		return;
137 	printf("changing root device to %c%c%d%c\n",
138 		devname[majdev][0], devname[majdev][1],
139 		mindev >> PARTITIONSHIFT, part + 'a');
140 #ifdef DOSWAP
141 	mindev &= ~PARTITIONMASK;
142 	for (swp = swdevt; swp->sw_dev != NODEV; swp++) {
143 		if (majdev == major(swp->sw_dev) &&
144 		    mindev == (minor(swp->sw_dev) & ~PARTITIONMASK)) {
145 			temp = swdevt[0].sw_dev;
146 			swdevt[0].sw_dev = swp->sw_dev;
147 			swp->sw_dev = temp;
148 			break;
149 		}
150 	}
151 	if (swp->sw_dev == NODEV)
152 		return;
153 	/*
154 	 * If dumpdev was the same as the old primary swap
155 	 * device, move it to the new primary swap device.
156 	 */
157 	if (temp == dumpdev)
158 		dumpdev = swdevt[0].sw_dev;
159 #endif
160 }
161