Annotation of sys/arch/i386/i386/autoconf.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: autoconf.c,v 1.75 2007/06/01 19:25:10 deraadt Exp $ */
2: /* $NetBSD: autoconf.c,v 1.20 1996/05/03 19:41:56 christos Exp $ */
3:
4: /*-
5: * Copyright (c) 1990 The Regents of the University of California.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to Berkeley by
9: * William Jolitz.
10: *
11: * Redistribution and use in source and binary forms, with or without
12: * modification, are permitted provided that the following conditions
13: * are met:
14: * 1. Redistributions of source code must retain the above copyright
15: * notice, this list of conditions and the following disclaimer.
16: * 2. Redistributions in binary form must reproduce the above copyright
17: * notice, this list of conditions and the following disclaimer in the
18: * documentation and/or other materials provided with the distribution.
19: * 3. Neither the name of the University nor the names of its contributors
20: * may be used to endorse or promote products derived from this software
21: * without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33: * SUCH DAMAGE.
34: *
35: * @(#)autoconf.c 7.1 (Berkeley) 5/9/91
36: */
37:
38: /*
39: * Setup the system to run on the current machine.
40: *
41: * cpu_configure() is called at boot time and initializes the vba
42: * device tables and the memory controller monitoring. Available
43: * devices are determined (from possibilities mentioned in ioconf.c),
44: * and the drivers are initialized.
45: */
46: #include <sys/param.h>
47: #include <sys/systm.h>
48: #include <sys/user.h>
49: #include <sys/buf.h>
50: #include <sys/dkstat.h>
51: #include <sys/disklabel.h>
52: #include <sys/conf.h>
53: #include <sys/reboot.h>
54: #include <sys/device.h>
55: #include <sys/socket.h>
56: #include <sys/socketvar.h>
57:
58: #include <net/if.h>
59: #include <net/if_types.h>
60: #include <netinet/in.h>
61: #include <netinet/if_ether.h>
62:
63: #include <uvm/uvm_extern.h>
64:
65: #include <machine/pte.h>
66: #include <machine/cpu.h>
67: #include <machine/gdt.h>
68: #include <machine/biosvar.h>
69: #include <machine/kvm86.h>
70:
71: #include <dev/cons.h>
72:
73: #include "ioapic.h"
74:
75: #if NIOAPIC > 0
76: #include <machine/i82093var.h>
77: #endif
78:
79: /*
80: * The following several variables are related to
81: * the configuration process, and are used in initializing
82: * the machine.
83: */
84: extern dev_t bootdev;
85:
86: /* Support for VIA C3 RNG */
87: #ifdef I686_CPU
88: extern struct timeout viac3_rnd_tmo;
89: extern int viac3_rnd_present;
90: void viac3_rnd(void *);
91:
92: #ifdef CRYPTO
93: void viac3_crypto_setup(void);
94: extern int i386_has_xcrypt;
95: #endif /* CRYPTO */
96: #endif
97:
98: /*
99: * Determine i/o configuration for a machine.
100: */
101: void
102: cpu_configure(void)
103: {
104: /*
105: * Note, on i386, configure is not running under splhigh unlike other
106: * architectures. This fact is used by the pcmcia irq line probing.
107: */
108:
109: startrtclock();
110:
111: gdt_init(); /* XXX - pcibios uses gdt stuff */
112:
113: /* Set up proc0's TSS and LDT */
114: i386_proc0_tss_ldt_init();
115:
116: #ifdef KVM86
117: kvm86_init();
118: #endif
119:
120: if (config_rootfound("mainbus", NULL) == NULL)
121: panic("cpu_configure: mainbus not configured");
122:
123: #if NIOAPIC > 0
124: if (nioapics > 0)
125: goto nomasks;
126: #endif
127: printf("biomask %x netmask %x ttymask %x\n", (u_short)IMASK(IPL_BIO),
128: (u_short)IMASK(IPL_NET), (u_short)IMASK(IPL_TTY));
129:
130: #if NIOAPIC > 0
131: nomasks:
132: ioapic_enable();
133: #endif
134:
135: proc0.p_addr->u_pcb.pcb_cr0 = rcr0();
136:
137: #ifdef MULTIPROCESSOR
138: /* propagate TSS and LDT configuration to the idle pcb's. */
139: cpu_init_idle_pcbs();
140: #endif
141: spl0();
142:
143: /*
144: * We can not know which is our root disk, defer
145: * until we can checksum blocks to figure it out.
146: */
147: cold = 0;
148:
149: #ifdef I686_CPU
150: /*
151: * At this point the RNG is running, and if FSXR is set we can
152: * use it. Here we setup a periodic timeout to collect the data.
153: */
154: if (viac3_rnd_present) {
155: timeout_set(&viac3_rnd_tmo, viac3_rnd, &viac3_rnd_tmo);
156: viac3_rnd(&viac3_rnd_tmo);
157: }
158: #ifdef CRYPTO
159: /*
160: * Also, if the chip has crypto available, enable it.
161: */
162: if (i386_has_xcrypt)
163: viac3_crypto_setup();
164: #endif /* CRYPTO */
165: #endif
166: }
167:
168: void
169: device_register(struct device *dev, void *aux)
170: {
171: }
172:
173: /*
174: * Now that we are fully operational, we can checksum the
175: * disks, and using some heuristics, hopefully are able to
176: * always determine the correct root disk.
177: */
178: void
179: diskconf(void)
180: {
181: int majdev, unit, part = 0;
182: struct device *bootdv = NULL;
183: dev_t tmpdev;
184: char buf[128];
185: #if defined(NFSCLIENT)
186: extern bios_bootmac_t *bios_bootmac;
187: #endif
188:
189: dkcsumattach();
190:
191: if ((bootdev & B_MAGICMASK) == (u_int)B_DEVMAGIC) {
192: majdev = B_TYPE(bootdev);
193: unit = B_UNIT(bootdev);
194: part = B_PARTITION(bootdev);
195: snprintf(buf, sizeof buf, "%s%d%c", findblkname(majdev),
196: unit, part + 'a');
197: bootdv = parsedisk(buf, strlen(buf), part, &tmpdev);
198: }
199:
200: #if defined(NFSCLIENT)
201: if (bios_bootmac) {
202: struct ifnet *ifp;
203:
204: printf("PXE boot MAC address %s, ",
205: ether_sprintf(bios_bootmac->mac));
206: for (ifp = TAILQ_FIRST(&ifnet); ifp != NULL;
207: ifp = TAILQ_NEXT(ifp, if_list)) {
208: if ((ifp->if_type == IFT_ETHER ||
209: ifp->if_type == IFT_FDDI) &&
210: bcmp(bios_bootmac->mac,
211: ((struct arpcom *)ifp)->ac_enaddr,
212: ETHER_ADDR_LEN) == 0)
213: break;
214: }
215: if (ifp) {
216: printf("interface %s\n", ifp->if_xname);
217: mountroot = nfs_mountroot; /* potentially */
218: bootdv = parsedisk(ifp->if_xname, strlen(ifp->if_xname),
219: 0, &tmpdev);
220: part = 0;
221: } else
222: printf("unknown interface\n");
223: }
224: #endif
225:
226: setroot(bootdv, part, RB_USERREQ);
227: dumpconf();
228: }
229:
230: struct nam2blk nam2blk[] = {
231: { "wd", 0 },
232: { "fd", 2 },
233: { "sd", 4 },
234: { "cd", 6 },
235: { "mcd", 7 },
236: { "rd", 17 },
237: { "raid", 19 },
238: { NULL, -1 }
239: };
CVSweb