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 | * | |
0880b18e | 6 | * @(#)swapgeneric.c 7.1 (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 | */ | |
80688ea3 MK |
30 | dev_t rootdev; |
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 SL |
69 | |
70 | if (boothowto & RB_ASKNAME) { | |
71 | char name[128]; | |
72 | retry: | |
73 | printf("root device? "); | |
74 | gets(name); | |
75 | for (gc = genericconf; gc->gc_driver; gc++) | |
76 | if (gc->gc_name[0] == name[0] && | |
77 | gc->gc_name[1] == name[1]) | |
78 | goto gotit; | |
79 | goto bad; | |
80 | gotit: | |
830dc1ae BJ |
81 | if (name[3] == '*') { |
82 | name[3] = name[4]; | |
83 | swaponroot++; | |
84 | } | |
2c4a4e47 SL |
85 | if (name[2] >= '0' && name[2] <= '7' && name[3] == 0) { |
86 | unit = name[2] - '0'; | |
87 | goto found; | |
88 | } | |
89 | printf("bad/missing unit number\n"); | |
90 | bad: | |
c859d954 | 91 | printf("use hp%%d, up%%d, ra%%d, rb%%d, rl%%d or hk%%d\n"); |
2c4a4e47 SL |
92 | goto retry; |
93 | } | |
94 | unit = 0; | |
95 | for (gc = genericconf; gc->gc_driver; gc++) { | |
96 | for (mi = mbdinit; mi->mi_driver; mi++) { | |
97 | if (mi->mi_alive == 0) | |
98 | continue; | |
99 | if (mi->mi_unit == 0 && mi->mi_driver == | |
100 | (struct mba_driver *)gc->gc_driver) { | |
9f0281aa SL |
101 | printf("root on %s0\n", |
102 | mi->mi_driver->md_dname); | |
2c4a4e47 SL |
103 | goto found; |
104 | } | |
105 | } | |
106 | for (ui = ubdinit; ui->ui_driver; ui++) { | |
107 | if (ui->ui_alive == 0) | |
108 | continue; | |
109 | if (ui->ui_unit == 0 && ui->ui_driver == | |
110 | (struct uba_driver *)gc->gc_driver) { | |
111 | printf("root on %s0\n", | |
112 | ui->ui_driver->ud_dname); | |
113 | goto found; | |
114 | } | |
115 | } | |
116 | } | |
117 | printf("no suitable root\n"); | |
118 | asm("halt"); | |
119 | found: | |
120 | gc->gc_root = makedev(major(gc->gc_root), unit*8); | |
830dc1ae | 121 | rootdev = gc->gc_root; |
2c4a4e47 SL |
122 | swdevt[0].sw_dev = argdev = dumpdev = |
123 | makedev(major(rootdev), minor(rootdev)+1); | |
da1b4b92 | 124 | /* swap size and dumplo set during autoconfigure */ |
830dc1ae BJ |
125 | if (swaponroot) |
126 | rootdev = dumpdev; | |
2c4a4e47 SL |
127 | } |
128 | ||
129 | getchar() | |
130 | { | |
131 | register c; | |
132 | ||
9f0281aa | 133 | while ((mfpr(RXCS)&RXCS_DONE) == 0) |
2c4a4e47 SL |
134 | ; |
135 | c = mfpr(RXDB)&0177; | |
9f0281aa | 136 | if (c == '\r') |
2c4a4e47 SL |
137 | c = '\n'; |
138 | cnputc(c); | |
9f0281aa | 139 | return (c); |
2c4a4e47 SL |
140 | } |
141 | ||
142 | gets(cp) | |
143 | char *cp; | |
144 | { | |
145 | register char *lp; | |
146 | register c; | |
147 | ||
148 | lp = cp; | |
149 | for (;;) { | |
150 | c = getchar() & 0177; | |
9f0281aa | 151 | switch (c) { |
2c4a4e47 SL |
152 | case '\n': |
153 | case '\r': | |
154 | *lp++ = '\0'; | |
155 | return; | |
156 | case '\b': | |
157 | case '#': | |
80688ea3 | 158 | case '\177': |
2c4a4e47 SL |
159 | lp--; |
160 | if (lp < cp) | |
161 | lp = cp; | |
162 | continue; | |
163 | case '@': | |
164 | case 'u'&037: | |
165 | lp = cp; | |
166 | cnputc('\n'); | |
167 | continue; | |
168 | default: | |
169 | *lp++ = c; | |
170 | } | |
171 | } | |
172 | } |