need to set swap even if setroot works on generic
[unix-history] / usr / src / sys / vax / vax / swapgeneric.c
CommitLineData
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 30dev_t rootdev = NODEV;
80688ea3
MK
31dev_t argdev = NODEV;
32dev_t dumpdev = NODEV;
2c4a4e47 33int nswap;
9f0281aa
SL
34struct swdevt swdevt[] = {
35 { -1, 1, 0 },
36 { 0, 0, 0 },
2c4a4e47
SL
37};
38long dumplo;
da1b4b92 39int dmmin, dmmax, dmtext;
9f0281aa 40
2c4a4e47
SL
41extern struct mba_driver hpdriver;
42extern struct uba_driver scdriver;
43extern struct uba_driver hkdriver;
c859d954 44extern struct uba_driver idcdriver;
96b24bab 45extern struct uba_driver hldriver;
2c4a4e47
SL
46extern struct uba_driver udadriver;
47
48struct 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
63setconf()
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];
74retry:
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;
82gotit:
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");
92bad:
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");
121found:
122 gc->gc_root = makedev(major(gc->gc_root), unit*8);
830dc1ae 123 rootdev = gc->gc_root;
25cfc74b 124doswap:
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
132getchar()
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
145gets(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}