Commit | Line | Data |
---|---|---|
da7c5cc6 KM |
1 | /* |
2 | * Copyright (c) 1982 Regents of the University of California. | |
3 | * All rights reserved. The Berkeley software License Agreement | |
4 | * specifies the terms and conditions for redistribution. | |
5 | * | |
25cfc74b | 6 | * @(#)swapgeneric.c 6.5 (Berkeley) %G% |
da7c5cc6 | 7 | */ |
2c4a4e47 SL |
8 | |
9 | #include "mba.h" | |
10 | ||
1884f3f6 | 11 | #include "pte.h" |
961945a8 | 12 | |
1884f3f6 JB |
13 | #include "param.h" |
14 | #include "conf.h" | |
15 | #include "buf.h" | |
16 | #include "vm.h" | |
17 | #include "systm.h" | |
18 | #include "reboot.h" | |
e8a9f30f | 19 | |
1884f3f6 JB |
20 | #include "cons.h" |
21 | #include "mtpr.h" | |
e8a9f30f BJ |
22 | #include "../vaxmba/mbareg.h" |
23 | #include "../vaxmba/mbavar.h" | |
24 | #include "../vaxuba/ubareg.h" | |
25 | #include "../vaxuba/ubavar.h" | |
26 | ||
2c4a4e47 SL |
27 | /* |
28 | * Generic configuration; all in one | |
29 | */ | |
25cfc74b | 30 | dev_t rootdev = NODEV; |
80688ea3 MK |
31 | dev_t argdev = NODEV; |
32 | dev_t dumpdev = NODEV; | |
2c4a4e47 | 33 | int nswap; |
9f0281aa SL |
34 | struct swdevt swdevt[] = { |
35 | { -1, 1, 0 }, | |
36 | { 0, 0, 0 }, | |
2c4a4e47 SL |
37 | }; |
38 | long dumplo; | |
da1b4b92 | 39 | int dmmin, dmmax, dmtext; |
9f0281aa | 40 | |
2c4a4e47 SL |
41 | extern struct mba_driver hpdriver; |
42 | extern struct uba_driver scdriver; | |
43 | extern struct uba_driver hkdriver; | |
c859d954 | 44 | extern struct uba_driver idcdriver; |
96b24bab | 45 | extern struct uba_driver hldriver; |
2c4a4e47 SL |
46 | extern struct uba_driver udadriver; |
47 | ||
48 | struct genericconf { | |
49 | caddr_t gc_driver; | |
50 | char *gc_name; | |
51 | dev_t gc_root; | |
2c4a4e47 | 52 | } genericconf[] = { |
da1b4b92 SL |
53 | { (caddr_t)&hpdriver, "hp", makedev(0, 0), }, |
54 | { (caddr_t)&scdriver, "up", makedev(2, 0), }, | |
55 | { (caddr_t)&udadriver, "ra", makedev(9, 0), }, | |
56 | { (caddr_t)&idcdriver, "rb", makedev(11, 0), }, | |
96b24bab | 57 | { (caddr_t)&hldriver, "rl", makedev(14, 0), }, |
da1b4b92 | 58 | { (caddr_t)&hkdriver, "hk", makedev(3, 0), }, |
80688ea3 | 59 | { (caddr_t)&hkdriver, "rk", makedev(3, 0), }, |
9f0281aa | 60 | { 0 }, |
2c4a4e47 SL |
61 | }; |
62 | ||
63 | setconf() | |
64 | { | |
65 | register struct mba_device *mi; | |
66 | register struct uba_device *ui; | |
67 | register struct genericconf *gc; | |
830dc1ae | 68 | int unit, swaponroot = 0; |
2c4a4e47 | 69 | |
25cfc74b MK |
70 | if (rootdev != NODEV) |
71 | goto doswap; | |
2c4a4e47 SL |
72 | if (boothowto & RB_ASKNAME) { |
73 | char name[128]; | |
74 | retry: | |
75 | printf("root device? "); | |
76 | gets(name); | |
77 | for (gc = genericconf; gc->gc_driver; gc++) | |
78 | if (gc->gc_name[0] == name[0] && | |
79 | gc->gc_name[1] == name[1]) | |
80 | goto gotit; | |
81 | goto bad; | |
82 | gotit: | |
830dc1ae BJ |
83 | if (name[3] == '*') { |
84 | name[3] = name[4]; | |
85 | swaponroot++; | |
86 | } | |
2c4a4e47 SL |
87 | if (name[2] >= '0' && name[2] <= '7' && name[3] == 0) { |
88 | unit = name[2] - '0'; | |
89 | goto found; | |
90 | } | |
91 | printf("bad/missing unit number\n"); | |
92 | bad: | |
c859d954 | 93 | printf("use hp%%d, up%%d, ra%%d, rb%%d, rl%%d or hk%%d\n"); |
2c4a4e47 SL |
94 | goto retry; |
95 | } | |
96 | unit = 0; | |
97 | for (gc = genericconf; gc->gc_driver; gc++) { | |
98 | for (mi = mbdinit; mi->mi_driver; mi++) { | |
99 | if (mi->mi_alive == 0) | |
100 | continue; | |
101 | if (mi->mi_unit == 0 && mi->mi_driver == | |
102 | (struct mba_driver *)gc->gc_driver) { | |
9f0281aa SL |
103 | printf("root on %s0\n", |
104 | mi->mi_driver->md_dname); | |
2c4a4e47 SL |
105 | goto found; |
106 | } | |
107 | } | |
108 | for (ui = ubdinit; ui->ui_driver; ui++) { | |
109 | if (ui->ui_alive == 0) | |
110 | continue; | |
111 | if (ui->ui_unit == 0 && ui->ui_driver == | |
112 | (struct uba_driver *)gc->gc_driver) { | |
113 | printf("root on %s0\n", | |
114 | ui->ui_driver->ud_dname); | |
115 | goto found; | |
116 | } | |
117 | } | |
118 | } | |
119 | printf("no suitable root\n"); | |
120 | asm("halt"); | |
121 | found: | |
122 | gc->gc_root = makedev(major(gc->gc_root), unit*8); | |
830dc1ae | 123 | rootdev = gc->gc_root; |
25cfc74b | 124 | doswap: |
2c4a4e47 SL |
125 | swdevt[0].sw_dev = argdev = dumpdev = |
126 | makedev(major(rootdev), minor(rootdev)+1); | |
da1b4b92 | 127 | /* swap size and dumplo set during autoconfigure */ |
830dc1ae BJ |
128 | if (swaponroot) |
129 | rootdev = dumpdev; | |
2c4a4e47 SL |
130 | } |
131 | ||
132 | getchar() | |
133 | { | |
134 | register c; | |
135 | ||
9f0281aa | 136 | while ((mfpr(RXCS)&RXCS_DONE) == 0) |
2c4a4e47 SL |
137 | ; |
138 | c = mfpr(RXDB)&0177; | |
9f0281aa | 139 | if (c == '\r') |
2c4a4e47 SL |
140 | c = '\n'; |
141 | cnputc(c); | |
9f0281aa | 142 | return (c); |
2c4a4e47 SL |
143 | } |
144 | ||
145 | gets(cp) | |
146 | char *cp; | |
147 | { | |
148 | register char *lp; | |
149 | register c; | |
150 | ||
151 | lp = cp; | |
152 | for (;;) { | |
153 | c = getchar() & 0177; | |
9f0281aa | 154 | switch (c) { |
2c4a4e47 SL |
155 | case '\n': |
156 | case '\r': | |
157 | *lp++ = '\0'; | |
158 | return; | |
159 | case '\b': | |
160 | case '#': | |
80688ea3 | 161 | case '\177': |
2c4a4e47 SL |
162 | lp--; |
163 | if (lp < cp) | |
164 | lp = cp; | |
165 | continue; | |
166 | case '@': | |
167 | case 'u'&037: | |
168 | lp = cp; | |
169 | cnputc('\n'); | |
170 | continue; | |
171 | default: | |
172 | *lp++ = c; | |
173 | } | |
174 | } | |
175 | } |