|
|
1.1 root 1: /*
2: * File: main.c
3: */
4:
5: /*
6: * Includes.
7: */
8: #include <sys/coherent.h>
9: #include <sys/devices.h>
10: #include <sys/fdisk.h>
11: #include <sys/proc.h>
12: #include <sys/seg.h>
13: #include <sys/stat.h>
14: #include <sys/typed.h>
15: #include <sys/param.h>
16:
17: /*
18: * Definitions.
19: * Constants.
20: * Macros with argument lists.
21: * Typedefs.
22: * Enums.
23: */
24: #ifndef VERSION /* This should be specified at compile time */
25: #define VERSION "..."
26: #endif
27: #ifndef RELEASE
28: #define RELEASE "0"
29: #endif
30:
31: /*
32: * Functions.
33: * Import Functions.
34: * Export Functions.
35: * Local Functions.
36: */
37: int read_cmos();
38:
39: static void atcount();
40: static void rpdev();
41:
42: /*
43: * Global Data.
44: * Import Variables.
45: * Export Variables.
46: * Local Variables.
47: */
48: extern dev_t rootdev;
49: extern dev_t pipedev;
50: extern int ronflag;
51: extern int PHYS_MEM;
52:
53: /*
54: * Patchable variable.
55: *
56: * PS1DRIVES is the number of PS1 type drives in the system. It is 0 unless you
57: * are actually on a PS1.
58: */
59: int PS1DRIVES = 0;
60:
61: short n_atdr;
62: char version[] = VERSION;
63: char release[] = RELEASE;
64: char copyright[] = "Copyright 1982,1993 Mark Williams Company\n";
65:
66: unsigned long _entry = 0; /* really the serial number */
67: unsigned long __ = 0; /* really the serial number also */
68:
69: main()
70: {
71: register SEG *sp;
72: #ifdef _I386
73: extern int BPFMAX;
74: int speed1, speed2;
75: char * ndpTypeName();
76: extern int (*ndpEmFn)();
77: extern short ndpType;
78: #else
79: extern int realmode;
80: #endif
81:
82: CHIRP('a');
83:
84: #ifdef _I386
85: wrNdpUser(0);
86: wrNdpSaved(0);
87: u.u_bpfmax = BPFMAX;
88: #endif
89: u.u_error = 0;
90: bufinit();
91: _CHIRP('0', 156);
92: cltinit();
93: _CHIRP('1', 156);
94: pcsinit();
95: _CHIRP('2', 156);
96: seginit();
97: _CHIRP('3', 156);
98: atcount();
99: _CHIRP('4', 156);
100: rpdev();
101: _CHIRP('5', 156);
102: devinit();
103: _CHIRP('6', 156);
104: #ifdef _I386
105: rlinit();
106: _CHIRP('7', 156);
107:
108: putchar_init();
109: _CHIRP('8', 156);
110: printf("*** COHERENT Version %s - 386 Mode. %uKB free memory. ***\n",
111: release, ctob(allocno())/1024);
112: if ((int11() & 0x30) == 0x30)
113: printf("Monochrome. ");
114: else
115: printf("Color. ");
116: senseNdp();
117: printf(ndpTypeName());
118: if (ndpType <= 1 && ndpEmFn)
119: printf("FP Emulation. ");
120: #if 0
121: if (int11() & 2)
122: printf("x87. ");
123: else
124: printf("No x87. ");
125: #endif
126: #else
127: printf("*** COHERENT Version %s - %s Mode. %uKB free memory. ***\n",
128: release, (realmode ? "Real" : "Protected"), msize);
129: #endif
130: printf( "%u buffers. %u clists.\n", NBUF, NCLIST);
131: printf( "%uKB kalloc pool. %u KB phys pool.\n",
132: ALLSIZE/1024, PHYS_MEM/1024);
133: printf(copyright);
134:
135: #ifdef _I386
136: /*
137: * Make sure that we get a speed rating that does not cross 0.
138: */
139: do {
140: speed1 = read_t0();
141: speed2 = read_t0();
142: } while (speed1 < speed2);
143:
144: T_PIGGY(0x400,printf("CPU snail rating: %d\n", speed1 - speed2));
145: #endif /* _I386 */
146:
147: if (_entry) {
148: printf("Serial Number ");
149: printf("%U\n", _entry);
150: }
151:
152: /*
153: * Verify correct serial number
154: */
155: if (_entry != __)
156: panic("Verification error - call Mark Williams Company at +1-708-291-6700\n");
157:
158: /*
159: * Turn on clock, mount root device, start off processes
160: * and return.
161: */
162: batflag = 1;
163: #ifdef _I386
164: iprocp = SELF;
165: CHIRP('b');
166: if (pfork()) {
167: CHIRP('i');
168: idle();
169: } else {
170: fsminit();
171: CHIRP('-');
172: eprocp = SELF;
173: eveinit();
174: CHIRP('=');
175: }
176: #else
177: if ((sp=salloc((fsize_t)UPASIZE, SFNCLR|SFNSWP)) == NULL)
178: panic("Cannot allocate user area");
179: if ((iprocp=process(idle))==NULL || (eprocp=process(NULL))==NULL)
180: panic("Cannot create process");
181: eveinit(sp);
182: fsminit();
183: #endif
184: CHIRP('c');
185: }
186:
187: /*
188: * atcount()
189: *
190: * Read CMOS and return 0,1, or 2 as number of installed "at" drives.
191: */
192: void
193: atcount()
194: {
195: int u;
196: n_atdr = 0;
197:
198: if (PS1DRIVES > 0)
199: n_atdr = PS1DRIVES;
200: else {
201: /*
202: * Count nonzero drive types.
203: *
204: * High nibble of CMOS 0x12 is drive 0's type.
205: * Low nibble of CMOS 0x12 is drive 1's type.
206: */
207: u = read_cmos(0x12);
208: if (u & 0x00F0)
209: n_atdr++;
210: if (u & 0x000F)
211: n_atdr++;
212: }
213: }
214:
215: /*
216: * rpdev()
217: *
218: * If rootdev is zero, try to use data from tboot to set it.
219: * If pipedev is zero, make it 0x883 if ronflag == 1, else make it rootdev.
220: * Call rpdev() AFTER calling atcount().
221: */
222: static void rpdev()
223: {
224: FIFO *ffp;
225: typed_space *tp;
226: int found;
227: extern typed_space boot_gift;
228: unsigned root_ptn, root_drv, root_maj, root_min;
229:
230: if (rootdev == makedev(0,0)) {
231: found = 0;
232: if (ffp = fifo_open(&boot_gift, 0)) {
233: int rc;
234:
235: for (rc = 0; !found && (tp = fifo_read(ffp)); rc++) {
236: BIOS_ROOTDEV *brp = (BIOS_ROOTDEV *)tp->ts_data;
237: if (T_BIOS_ROOTDEV == tp->ts_type) {
238: found = 1;
239: root_ptn = brp->rd_partition;
240: }
241: }
242: fifo_close(ffp);
243:
244: }
245:
246: if (found) {
247: /*
248: * root_drv = BIOS # of root drive
249: * root_ptn = partition # in range 0..3
250: * if root on second "at" device, add 4 to minor #
251: * if root on second scsi device, add 16 to minor #
252: */
253: root_drv = root_ptn/NPARTN;
254: root_ptn %= NPARTN;
255: if (n_atdr > root_drv) {
256: root_maj = AT_MAJOR;
257: root_min = root_drv*NPARTN + root_ptn;
258: } else { /* root on SCSI device */
259: root_maj = SCSI_MAJOR;
260: root_min = (root_drv-n_atdr)*16 + root_ptn;
261: }
262: rootdev = makedev(root_maj, root_min);
263: printf("rootdev=(%d,%d)\n", root_maj, root_min);
264: }
265: }
266: if (pipedev == makedev(0,0)) {
267: if (ronflag)
268: pipedev = makedev(RM_MAJOR, 0x83);
269: else
270: pipedev = rootdev;
271: printf("pipedev=(%d,%d)\n", (pipedev>>8)&0xff, pipedev&0xff);
272: }
273: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.