1 /* 2 * Copyright (c) 1982,1986 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 * 6 * @(#)autoconf.c 7.17 (Berkeley) 09/02/88 7 */ 8 9 /* 10 * Setup the system to run on the current machine. 11 * 12 * Configure() is called at boot time and initializes the uba and mba 13 * device tables and the memory controller monitoring. Available 14 * devices are determined (from possibilities mentioned in ioconf.c), 15 * and the drivers are initialized. 16 */ 17 18 #include "mba.h" 19 #include "uba.h" 20 #include "kra.h" /* XXX wrong file */ 21 22 #include "param.h" 23 #include "systm.h" 24 #include "map.h" 25 #include "buf.h" 26 #include "dkstat.h" 27 #include "vm.h" 28 #include "malloc.h" 29 #include "conf.h" 30 #include "dmap.h" 31 #include "reboot.h" 32 33 #include "pte.h" 34 #include "cpu.h" 35 #include "mem.h" 36 #include "mtpr.h" 37 #include "nexus.h" 38 #include "scb.h" 39 #include "ioa.h" 40 #include "../vaxbi/bireg.h" 41 #include "../vaxmba/mbareg.h" 42 #include "../vaxmba/mbavar.h" 43 #include "../vaxuba/ubareg.h" 44 #include "../vaxuba/ubavar.h" 45 46 /* 47 * The following several variables are related to 48 * the configuration process, and are used in initializing 49 * the machine. 50 */ 51 int cold; /* if 1, still working on cold-start */ 52 int dkn; /* number of iostat dk numbers assigned so far */ 53 int cpuspeed = 1; /* relative cpu speed */ 54 55 /* 56 * Addresses of the (locore) routines which bootstrap us from 57 * hardware traps to C code. Filled into the system control block 58 * as necessary. 59 * 60 * RIDICULOUS! CONFIG SHOULD GENERATE AN ioconf.h FOR US, with 61 * mba glue also in `glue.s'. (Unibus adapter glue is special, though.) 62 */ 63 #if NMBA > 0 64 int (*mbaintv[4])() = { Xmba0int, Xmba1int, Xmba2int, Xmba3int }; 65 #if NMBA > 4 66 Need to expand the table for more than 4 massbus adaptors 67 #endif 68 #endif 69 #if defined(VAX780) || defined(VAX8600) 70 int (*ubaintv[])() = 71 { 72 Xua0int, Xua1int, Xua2int, Xua3int, 73 #if NUBA > 4 74 Xua4int, Xua5int, Xua6int, Xua7int, 75 #endif 76 #if NUBA > 8 77 Need to expand the table for more than 8 unibus adaptors 78 #endif 79 }; 80 #endif 81 #if NKDB > 0 82 /* kdb50 driver does not appear in udminit[] (not without csr!) */ 83 int Xkdbintr0(); /* generated by autoconf */ 84 int (*kdbintv[])() = { Xkdbintr0 }; 85 #if NKDB > 1 86 Need to expand the table for more than 1 KDB adapter 87 #endif 88 #endif 89 90 /* 91 * This allocates the space for the per-uba information, 92 * such as buffered data path usage. 93 */ 94 struct uba_hd uba_hd[NUBA]; 95 96 /* 97 * Determine mass storage and memory configuration for a machine. 98 * Get cpu type, and then switch out to machine specific procedures 99 * which will probe adaptors to see what is out there. 100 */ 101 configure() 102 { 103 union cpusid cpusid; 104 register struct percpu *ocp; 105 register struct pte *ip; 106 107 cpusid.cpusid = mfpr(SID); 108 switch (cpusid.cpuany.cp_type) { 109 #if VAX8600 110 case VAX_8600: 111 printf("VAX 8600, serial# %d(%d), hardware ECO level %d(%d)\n", 112 cpusid.cpu8600.cp_sno, cpusid.cpu8600.cp_plant, 113 cpusid.cpu8600.cp_eco >> 4, cpusid.cpu8600.cp_eco); 114 break; 115 #endif 116 #if VAX8200 117 case VAX_8200: 118 printf("\ 119 VAX 82%c0, hardware rev %d, ucode patch rev %d, sec patch %d, ucode rev %d\n", 120 cpusid.cpu8200.cp_5 ? '5' : '0', 121 cpusid.cpu8200.cp_hrev, cpusid.cpu8200.cp_patch, 122 cpusid.cpu8200.cp_secp, cpusid.cpu8200.cp_urev); 123 mastercpu = mfpr(BINID); 124 break; 125 #endif 126 #if VAX780 127 case VAX_780: 128 printf("\ 129 VAX 11/78%c, serial# %d(%d), hardware ECO level %d(%d)\n", 130 cpusid.cpu780.cp_5 ? '5' : '0', 131 cpusid.cpu780.cp_sno, cpusid.cpu780.cp_plant, 132 cpusid.cpu780.cp_eco >> 4, cpusid.cpu780.cp_eco); 133 break; 134 #endif 135 #if VAX750 136 case VAX_750: 137 printf("VAX 11/750, hardware rev %d, ucode rev %d\n", 138 cpusid.cpu750.cp_hrev, cpusid.cpu750.cp_urev); 139 break; 140 #endif 141 #if VAX730 142 case VAX_730: 143 printf("VAX 11/730, ucode rev %d\n", cpusid.cpu730.cp_urev); 144 break; 145 #endif 146 #if VAX630 147 case VAX_630: 148 printf("MicroVAX-II\n"); 149 break; 150 #endif 151 #if VAX650 152 case VAX_650: 153 printf("MicroVAX 3000, ucode rev %d\n", cpusid.cpu650.cp_urev); 154 break; 155 #endif 156 } 157 for (ocp = percpu; ocp->pc_cputype; ocp++) 158 if (ocp->pc_cputype == cpusid.cpuany.cp_type) { 159 cpuspeed = ocp->pc_cpuspeed; 160 cpuops = ocp->pc_ops; 161 if (cpuops->cpu_init != NULL) 162 (*cpuops->cpu_init)(); 163 probeio(ocp); 164 /* 165 * Write protect the scb and UNIBUS interrupt vectors. 166 * It is strange that this code is here, but this is 167 * as soon as we are done mucking with it, and the 168 * write-enable was done in assembly language 169 * to which we will never return. 170 */ 171 for (ip = kvtopte(scb); ip < kvtopte(eUNIvec); ip++) { 172 *(int *)ip &= ~PG_PROT; 173 *(int *)ip |= PG_KR; 174 } 175 mtpr(TBIA, 0); 176 #if GENERIC 177 if ((boothowto & RB_ASKNAME) == 0) 178 setroot(); 179 setconf(); 180 #else 181 setroot(); 182 #endif 183 /* 184 * Configure swap area and related system 185 * parameter based on device(s) used. 186 */ 187 swapconf(); 188 cold = 0; 189 memenable(); 190 return; 191 } 192 printf("cpu type %d not configured\n", cpusid.cpuany.cp_type); 193 asm("halt"); 194 } 195 196 #if VAX8600 || VAX780 || VAX750 || VAX730 197 int nexnum; /* current nexus number */ 198 int nsbi; /* current sbi number */ 199 #endif 200 #if VAX8200 201 int numkdb; /* current ``kdb'' number */ 202 int bi_nodes; /* XXX remembers found bi nodes */ 203 #endif 204 205 /* 206 * Probe the main IO bus(es). 207 * The percpu structure gives us a handle on the addresses and/or types. 208 */ 209 probeio(pcpu) 210 register struct percpu *pcpu; 211 { 212 register struct iobus *iob; 213 int ioanum; 214 215 ioanum = 0; 216 for (iob = pcpu->pc_io; ioanum < pcpu->pc_nioa; ioanum++, iob++) { 217 218 switch (iob->io_type) { 219 220 #if VAX630 || VAX650 221 case IO_QBUS: 222 probeqbus((struct qbus *)iob->io_details); 223 break; 224 #endif 225 226 #if VAX780 || VAX750 || VAX730 227 case IO_SBI780: 228 case IO_CMI750: 229 case IO_XXX730: 230 probenexi((struct nexusconnect *)iob->io_details); 231 break; 232 #endif 233 234 #if VAX8600 235 case IO_ABUS: 236 probe_Abus(ioanum, iob); 237 break; 238 #endif 239 240 #if VAX8200 241 case IO_BI: 242 probe_bi((struct bibus *)iob->io_details); 243 break; 244 #endif 245 246 default: 247 if (iob->io_addr) { 248 printf( 249 "IO adaptor %d, type %d, at address 0x%x is unsupported\n", 250 ioanum, iob->io_type, iob->io_addr); 251 } else 252 printf("IO adaptor %d, type %d, is unsupported\n", 253 ioanum, iob->io_type); 254 break; 255 } 256 } 257 } 258 259 #if VAX8600 260 probe_Abus(ioanum, iob) 261 register struct iobus *iob; 262 { 263 register struct ioa *ioap; 264 union ioacsr ioacsr; 265 int type; 266 struct sbia_regs *sbiaregs; 267 #ifdef notyet 268 int sbi1fail(), sbi1alert(), sbi1fault(), sbi1err(); 269 #endif 270 271 ioap = &ioa[ioanum]; 272 ioaccess(iob->io_addr, Ioamap[ioanum], iob->io_size); 273 if (badaddr((caddr_t)ioap, 4)) 274 return; 275 ioacsr.ioa_csr = ioap->ioacsr.ioa_csr; 276 type = ioacsr.ioa_type & IOA_TYPMSK; 277 278 switch (type) { 279 280 case IOA_SBIA: 281 printf("SBIA%d at IO adaptor %d address 0x%x\n", 282 nsbi, ioanum, iob->io_addr); 283 #ifdef notyet 284 /* I AM NOT SURE THESE ARE IN THE SAME PLACES */ 285 if (nscb == 1) { 286 scb[1].scb_sbifail = scbentry(sbi1fail, SCB_ISTACK); 287 /* maybe not sbifail, maybe scb1.scb_cmrd */ 288 /* but how can I find out without a broken SBIA1? */ 289 scb[1].scb_sbialert = scbentry(sbi1alert, SCB_ISTACK); 290 scb[1].scb_sbifault = scbentry(sbi1fault, SCB_ISTACK); 291 scb[1].scb_sbierr = scbentry(sbi1err, SCB_ISTACK); 292 } 293 #endif 294 probenexi((struct nexusconnect *)iob->io_details); 295 nsbi++; 296 sbiaregs = (struct sbia_regs *)ioap; 297 sbiaregs->sbi_errsum = -1; 298 sbiaregs->sbi_error = 0x1000; 299 sbiaregs->sbi_fltsts = 0xc0000; 300 break; 301 302 default: 303 printf("IOA%d at address 0x%x is unsupported (type = 0x%x)\n", 304 ioanum, iob->io_addr, ioacsr.ioa_type); 305 break; 306 } 307 } 308 #endif 309 310 #if VAX8600 || VAX780 || VAX750 || VAX730 311 /* 312 * Probe nexus space, finding the interconnects 313 * and setting up and probing mba's and uba's for devices. 314 */ 315 probenexi(pnc) 316 register struct nexusconnect *pnc; 317 { 318 register struct nexus *nxv; 319 struct nexus *nxp = pnc->psb_nexbase; 320 union nexcsr nexcsr; 321 int i; 322 323 ioaccess((caddr_t)nxp, Nexmap[nsbi * NNEXSBI], 324 pnc->psb_nnexus * sizeof(struct nexus)); 325 nxv = &nexus[nsbi * NNEXSBI]; 326 for (nexnum = 0; nexnum < pnc->psb_nnexus; nexnum++, nxp++, nxv++) { 327 if (badaddr((caddr_t)nxv, 4)) 328 continue; 329 if (pnc->psb_nextype && pnc->psb_nextype[nexnum] != NEX_ANY) 330 nexcsr.nex_csr = pnc->psb_nextype[nexnum]; 331 else 332 nexcsr = nxv->nexcsr; 333 if (nexcsr.nex_csr&NEX_APD) 334 continue; 335 switch (nexcsr.nex_type) { 336 337 case NEX_MBA: 338 printf("mba%d at tr%d\n", nummba, nexnum); 339 if (nummba >= NMBA) { 340 printf("%d mba's", ++nummba); 341 goto unconfig; 342 } 343 #if NMBA > 0 344 mbafind(nxv, nxp); 345 nummba++; 346 #endif 347 break; 348 349 case NEX_UBA0: 350 case NEX_UBA1: 351 case NEX_UBA2: 352 case NEX_UBA3: 353 printf("uba%d at tr%d\n", numuba, nexnum); 354 if (numuba >= NUBA) { 355 printf("%d uba's", ++numuba); 356 goto unconfig; 357 } 358 #if NUBA > 0 359 #if VAX750 360 if (numuba >= 2 && cpu == VAX_750) { 361 printf("More than 2 UBA's"); 362 goto unsupp; 363 } 364 #endif 365 #if defined(VAX780) || defined(VAX8600) 366 if (cpu == VAX_780 || cpu == VAX_8600) 367 setscbnex(ubaintv[numuba]); 368 #endif 369 i = nexcsr.nex_type - NEX_UBA0; 370 probeuba((struct uba_regs *)nxv, (struct uba_regs *)nxp, 371 pnc->psb_umaddr[i]); 372 #endif /* NUBA */ 373 break; 374 375 case NEX_DR32: 376 /* there can be more than one... are there other codes??? */ 377 printf("dr32"); 378 goto unsupp; 379 380 case NEX_MEM4: 381 case NEX_MEM4I: 382 case NEX_MEM16: 383 case NEX_MEM16I: 384 printf("mcr%d at tr%d\n", nmcr, nexnum); 385 if (nmcr >= MAXNMCR) { 386 printf("%d mcr's", ++nmcr); 387 goto unconfig; 388 } 389 switch (cpu) { 390 #if VAX780 391 case VAX_780: 392 /* only ka780 code looks at type */ 393 mcrtype[nmcr] = M780C; 394 break; 395 #endif 396 default: 397 break; 398 } 399 mcraddr[nmcr++] = (caddr_t)nxv; 400 break; 401 402 #if VAX780 403 case NEX_MEM64I: 404 case NEX_MEM64L: 405 case NEX_MEM64LI: 406 case NEX_MEM256I: 407 case NEX_MEM256L: 408 case NEX_MEM256LI: 409 printf("mcr%d (el) at tr%d\n", nmcr, nexnum); 410 if (nmcr >= MAXNMCR) { 411 printf("%d mcr's", ++nmcr); 412 goto unconfig; 413 } 414 mcrtype[nmcr] = M780EL; 415 mcraddr[nmcr++] = (caddr_t)nxv; 416 if (nexcsr.nex_type != NEX_MEM64I && 417 nexcsr.nex_type != NEX_MEM256I) 418 break; 419 /* fall into ... */ 420 421 case NEX_MEM64U: 422 case NEX_MEM64UI: 423 case NEX_MEM256U: 424 case NEX_MEM256UI: 425 printf("mcr%d (eu) at tr%d\n", nmcr, nexnum); 426 if (nmcr >= MAXNMCR) { 427 printf("%d mcr's", ++nmcr); 428 goto unconfig; 429 } 430 mcrtype[nmcr] = M780EU; 431 mcraddr[nmcr++] = (caddr_t)nxv; 432 break; 433 #endif 434 435 case NEX_MPM0: 436 case NEX_MPM1: 437 case NEX_MPM2: 438 case NEX_MPM3: 439 printf("mpm"); 440 goto unsupp; 441 442 case NEX_CI: 443 printf("ci"); 444 goto unsupp; 445 446 default: 447 printf("nexus type %x", nexcsr.nex_type); 448 unsupp: 449 printf(" unsupported (at tr %d)\n", nexnum); 450 continue; 451 unconfig: 452 printf(" not configured\n"); 453 continue; 454 } 455 } 456 if (nummba > NMBA) 457 nummba = NMBA; 458 if (numuba > NUBA) 459 numuba = NUBA; 460 if (nmcr > MAXNMCR) 461 nmcr = MAXNMCR; 462 } 463 464 setscbnex(fn) 465 int (*fn)(); 466 { 467 register struct scb *scbp = &scb[nsbi]; 468 469 scbp->scb_ipl14[nexnum] = scbp->scb_ipl15[nexnum] = 470 scbp->scb_ipl16[nexnum] = scbp->scb_ipl17[nexnum] = 471 scbentry(fn, SCB_ISTACK); 472 } 473 #endif 474 475 #include "bi.h" 476 #if NBI > 0 477 /* 478 * Probe BI node space. 479 * 480 * THIS DEPENDS ON BI SPACE == NEXUS SPACE 481 * THIS WILL NOT WORK FOR MULTIPLE BIs 482 */ 483 probe_bi(p) 484 register struct bibus *p; 485 { 486 register struct bi_node *biv, *bip; 487 register int node; 488 short dtype; 489 490 /* must ignore BI errors while configuring */ 491 bip = p->pbi_base; 492 ioaccess((caddr_t)bip, Nexmap[0], sizeof(*bip) * NNODEBI);/* XXX */ 493 printf("vaxbi0 at address 0x%x\n", bip); 494 biv = (struct bi_node *) &nexus[0]; /* XXX */ 495 for (node = 0; node < NNODEBI; node++, bip++, biv++) { 496 if (badaddr((caddr_t)biv, 4)) 497 continue; 498 bi_nodes |= 1 << node; /* XXX */ 499 dtype = biv->biic.bi_dtype; 500 /* clear bus errors */ 501 biv->biic.bi_ber = ~(BIBER_MBZ|BIBER_NMR|BIBER_UPEN); 502 switch (dtype) { 503 504 case BIDT_KA820: { 505 /* is this right?? */ 506 int cp5 = biv->biic.bi_revs & 0x8000 ? '5' : '0'; 507 508 if (node != mastercpu) { 509 printf("slave ka82%c cpu", cp5); 510 goto unsupp; 511 } 512 printf("ka82%c cpu at node %x\n", cp5, node); 513 biv->biic.bi_intrdes = 1 << mastercpu; 514 biv->biic.bi_csr |= BICSR_SEIE | BICSR_HEIE; 515 break; 516 } 517 518 case BIDT_DWBUA: 519 if (numuba >= NUBA || /*XXX*/numuba > 2) { 520 printf("%d uba's", ++numuba); 521 goto unconfig; 522 } 523 #if NUBA > 0 524 printf("uba%d at node %x\n", numuba, node); 525 526 /* 527 * Run a self test reset to drop any `old' errors, 528 * so that they cannot cause a BI bus error. 529 */ 530 (void) bi_selftest(&biv->biic); 531 532 /* 533 * Enable interrupts. DWBUAs must have 534 * high priority. 535 */ 536 biv->biic.bi_intrdes = 1 << mastercpu; 537 biv->biic.bi_csr = (biv->biic.bi_csr&~BICSR_ARB_MASK) | 538 BICSR_ARB_HIGH; 539 probeuba((struct uba_regs *)biv, (struct uba_regs *)bip, 540 (caddr_t)UMEM8200(node)); 541 #endif /* NUBA */ 542 break; 543 544 case BIDT_MS820: 545 printf("mcr%d at node %x\n", nmcr, node); 546 if (nmcr >= MAXNMCR) { 547 printf("%d mcr's", ++nmcr); 548 goto unconfig; 549 } 550 mcraddr[nmcr++] = (caddr_t)biv; 551 biv->biic.bi_intrdes = 1 << mastercpu; 552 biv->biic.bi_csr |= BICSR_SEIE | BICSR_HEIE; 553 break; 554 555 case BIDT_KDB50: 556 if (numkdb >= NKDB) { 557 printf("%d kdb's", ++numkdb); 558 goto unconfig; 559 } 560 #if NKDB > 0 561 printf("kdb%d at node %x\n", numkdb, node); 562 kdbconfig(numkdb, (struct biiregs *)biv, 563 (struct biiregs *)bip, 564 (int)&scb[0].scb_ipl15[node] - (int)&scb[0]); 565 scb[0].scb_ipl15[node] = 566 scbentry(kdbintv[numkdb], SCB_ISTACK); 567 kdbfind(numkdb); 568 #endif 569 numkdb++; 570 break; 571 572 case BIDT_DEBNA: 573 case BIDT_DEBNK: 574 printf("debna/debnk ethernet"); 575 goto unsupp; 576 577 default: 578 printf("node type 0x%x ", dtype); 579 unsupp: 580 printf(" unsupported (at node %x)\n", node); 581 break; 582 unconfig: 583 printf(" not configured (at node %x)\n", node); 584 continue; 585 } 586 #ifdef DO_EINTRCSR 587 biv->biic.bi_eintrcsr = BIEIC_IPL17 | 588 (int)&scb[0].scb_bierr - (int)&scb[0]; 589 /* but bi reset will need to restore this */ 590 #endif 591 } 592 if (numuba > NUBA) 593 numuba = NUBA; 594 if (numkdb > NKDB) 595 numkdb = NKDB; 596 if (nmcr > MAXNMCR) 597 nmcr = MAXNMCR; 598 } 599 600 #if NKDB > 0 601 /* 602 * Find drives attached to a particular KDB50. 603 */ 604 kdbfind(kdbnum) 605 int kdbnum; 606 { 607 extern struct uba_driver kdbdriver; 608 register struct uba_device *ui; 609 register struct uba_driver *udp = &kdbdriver; 610 int t; 611 612 for (ui = ubdinit; ui->ui_driver; ui++) { 613 /* ui->ui_ubanum is trash */ 614 if (ui->ui_driver != udp || ui->ui_alive || 615 ui->ui_ctlr != kdbnum && ui->ui_ctlr != '?') 616 continue; 617 t = ui->ui_ctlr; 618 ui->ui_ctlr = kdbnum; 619 if ((*udp->ud_slave)(ui) == 0) { 620 ui->ui_ctlr = t; 621 continue; 622 } 623 ui->ui_alive = 1; 624 ui->ui_ubanum = -1; 625 626 /* make these invalid so we can see if someone uses them */ 627 /* might as well make each one different too */ 628 ui->ui_hd = (struct uba_hd *)0xc0000010; 629 ui->ui_addr = (caddr_t)0xc0000014; 630 ui->ui_physaddr = (caddr_t)0xc0000018; 631 ui->ui_mi = (struct uba_ctlr *)0xc000001c; 632 633 if (ui->ui_dk && dkn < DK_NDRIVE) 634 ui->ui_dk = dkn++; 635 else 636 ui->ui_dk = -1; 637 /* ui_type comes from driver */ 638 udp->ud_dinfo[ui->ui_unit] = ui; 639 printf("%s%d at %s%d slave %d\n", 640 udp->ud_dname, ui->ui_unit, 641 udp->ud_mname, ui->ui_ctlr, ui->ui_slave); 642 (*udp->ud_attach)(ui); 643 } 644 } 645 #endif /* NKDB > 0 */ 646 #endif /* NBI > 0 */ 647 648 #if NMBA > 0 649 struct mba_device *mbaconfig(); 650 /* 651 * Find devices attached to a particular mba 652 * and look for each device found in the massbus 653 * initialization tables. 654 */ 655 mbafind(nxv, nxp) 656 struct nexus *nxv, *nxp; 657 { 658 register struct mba_regs *mdp; 659 register struct mba_drv *mbd; 660 register struct mba_device *mi; 661 register struct mba_slave *ms; 662 int dn, dt, sn; 663 struct mba_device fnd; 664 665 mdp = (struct mba_regs *)nxv; 666 mba_hd[nummba].mh_mba = mdp; 667 mba_hd[nummba].mh_physmba = (struct mba_regs *)nxp; 668 setscbnex(mbaintv[nummba]); 669 mdp->mba_cr = MBCR_INIT; 670 mdp->mba_cr = MBCR_IE; 671 fnd.mi_mba = mdp; 672 fnd.mi_mbanum = nummba; 673 for (mbd = mdp->mba_drv, dn = 0; mbd < &mdp->mba_drv[8]; mbd++, dn++) { 674 if ((mbd->mbd_ds&MBDS_DPR) == 0) 675 continue; 676 mdp->mba_sr |= MBSR_NED; /* si kludge */ 677 dt = mbd->mbd_dt & 0xffff; 678 if (dt == 0) 679 continue; 680 if (mdp->mba_sr&MBSR_NED) 681 continue; /* si kludge */ 682 if (dt == MBDT_MOH) 683 continue; 684 fnd.mi_drive = dn; 685 #define qeq(a, b) ( a == b || a == '?' ) 686 if ((mi = mbaconfig(&fnd, dt)) && (dt & MBDT_TAP)) 687 for (sn = 0; sn < 8; sn++) { 688 mbd->mbd_tc = sn; 689 for (ms = mbsinit; ms->ms_driver; ms++) 690 if (ms->ms_driver == mi->mi_driver && 691 ms->ms_alive == 0 && 692 qeq(ms->ms_ctlr, mi->mi_unit) && 693 qeq(ms->ms_slave, sn) && 694 (*ms->ms_driver->md_slave)(mi, ms, sn)) { 695 printf("%s%d at %s%d slave %d\n" 696 , ms->ms_driver->md_sname 697 , ms->ms_unit 698 , mi->mi_driver->md_dname 699 , mi->mi_unit 700 , sn 701 ); 702 ms->ms_alive = 1; 703 ms->ms_ctlr = mi->mi_unit; 704 ms->ms_slave = sn; 705 break; 706 } 707 } 708 } 709 } 710 711 /* 712 * Have found a massbus device; 713 * see if it is in the configuration table. 714 * If so, fill in its data. 715 */ 716 struct mba_device * 717 mbaconfig(ni, type) 718 register struct mba_device *ni; 719 register int type; 720 { 721 register struct mba_device *mi; 722 register short *tp; 723 register struct mba_hd *mh; 724 725 for (mi = mbdinit; mi->mi_driver; mi++) { 726 if (mi->mi_alive) 727 continue; 728 tp = mi->mi_driver->md_type; 729 for (mi->mi_type = 0; *tp; tp++, mi->mi_type++) 730 if (*tp == (type&MBDT_TYPE)) 731 goto found; 732 continue; 733 found: 734 #define match(fld) (ni->fld == mi->fld || mi->fld == '?') 735 if (!match(mi_drive) || !match(mi_mbanum)) 736 continue; 737 printf("%s%d at mba%d drive %d", 738 mi->mi_driver->md_dname, mi->mi_unit, 739 ni->mi_mbanum, ni->mi_drive); 740 mi->mi_alive = 1; 741 mh = &mba_hd[ni->mi_mbanum]; 742 mi->mi_hd = mh; 743 mh->mh_mbip[ni->mi_drive] = mi; 744 mh->mh_ndrive++; 745 mi->mi_mba = ni->mi_mba; 746 mi->mi_drv = &mi->mi_mba->mba_drv[ni->mi_drive]; 747 mi->mi_mbanum = ni->mi_mbanum; 748 mi->mi_drive = ni->mi_drive; 749 /* 750 * If drive has never been seen before, 751 * give it a dkn for statistics. 752 */ 753 if (mi->mi_driver->md_info[mi->mi_unit] == 0) { 754 mi->mi_driver->md_info[mi->mi_unit] = mi; 755 if (mi->mi_dk && dkn < DK_NDRIVE) 756 mi->mi_dk = dkn++; 757 else 758 mi->mi_dk = -1; 759 } 760 (*mi->mi_driver->md_attach)(mi); 761 printf("\n"); 762 return (mi); 763 } 764 return (0); 765 } 766 #endif 767 768 /* 769 * Fixctlrmask fixes the masks of the driver ctlr routines 770 * which otherwise save r10 and r11 where the interrupt and br 771 * level are passed through. 772 */ 773 fixctlrmask() 774 { 775 register struct uba_ctlr *um; 776 register struct uba_device *ui; 777 register struct uba_driver *ud; 778 #define phys(a,b) ((b)(((int)(a))&0x7fffffff)) 779 780 for (um = ubminit; ud = phys(um->um_driver, struct uba_driver *); um++) 781 *phys(ud->ud_probe, short *) &= ~0xc00; 782 for (ui = ubdinit; ud = phys(ui->ui_driver, struct uba_driver *); ui++) 783 *phys(ud->ud_probe, short *) &= ~0xc00; 784 } 785 786 #ifdef QBA 787 /* 788 * Configure a Q-bus. 789 */ 790 probeqbus(qb) 791 struct qbus *qb; 792 { 793 register struct uba_hd *uhp = &uba_hd[numuba]; 794 795 ioaccess((caddr_t)qb->qb_map, Nexmap[0], 796 qb->qb_memsize * sizeof (struct pte)); 797 uhp->uh_type = qb->qb_type; 798 uhp->uh_uba = (struct uba_regs *)0xc0000000; /* no uba adaptor regs */ 799 uhp->uh_mr = (struct pte *)&nexus[0]; 800 /* 801 * The map registers start right at 20088000 on the 802 * ka630, so we have to subtract out the 2k offset to make the 803 * pointers work.. 804 */ 805 uhp->uh_physuba = (struct uba_regs *)(((u_long)qb->qb_map)-0x800); 806 807 uhp->uh_memsize = qb->qb_memsize; 808 ioaccess(qb->qb_maddr, UMEMmap[numuba], uhp->uh_memsize * NBPG); 809 uhp->uh_mem = umem[numuba]; 810 811 /* 812 * The I/O page is mapped to the 8K of the umem address space 813 * immediately after the memory section that is mapped. 814 */ 815 ioaccess(qb->qb_iopage, UMEMmap[numuba] + uhp->uh_memsize, 816 UBAIOPAGES * NBPG); 817 uhp->uh_iopage = umem[numuba] + (uhp->uh_memsize * NBPG); 818 819 unifind(uhp, qb->qb_iopage); 820 } 821 #endif 822 823 #if NUBA > 0 824 probeuba(vubp, pubp, pumem) 825 struct uba_regs *vubp, *pubp; 826 caddr_t pumem; 827 { 828 register struct uba_hd *uhp = &uba_hd[numuba]; 829 830 /* 831 * Save virtual and physical addresses of adaptor. 832 */ 833 switch (cpu) { 834 #ifdef DW780 835 case VAX_8600: 836 case VAX_780: 837 uhp->uh_type = DW780; 838 break; 839 #endif 840 #ifdef DW750 841 case VAX_750: 842 uhp->uh_type = DW750; 843 break; 844 #endif 845 #ifdef DW730 846 case VAX_730: 847 uhp->uh_type = DW730; 848 break; 849 #endif 850 #ifdef DWBUA 851 case VAX_8200: 852 uhp->uh_type = DWBUA; 853 break; 854 #endif 855 default: 856 panic("unknown UBA type"); 857 /*NOTREACHED*/ 858 } 859 uhp->uh_uba = vubp; 860 uhp->uh_physuba = pubp; 861 uhp->uh_mr = vubp->uba_map; 862 uhp->uh_memsize = UBAPAGES; 863 864 ioaccess(pumem, UMEMmap[numuba], (UBAPAGES + UBAIOPAGES) * NBPG); 865 uhp->uh_mem = umem[numuba]; 866 uhp->uh_iopage = umem[numuba] + (uhp->uh_memsize * NBPG); 867 868 unifind(uhp, pumem + (uhp->uh_memsize * NBPG)); 869 } 870 871 /* 872 * Find devices on a UNIBUS. 873 * Uses per-driver routine to set <br,cvec> into <r11,r10>, 874 * and then fills in the tables, with help from a per-driver 875 * slave initialization routine. 876 */ 877 unifind(uhp0, pumem) 878 struct uba_hd *uhp0; 879 caddr_t pumem; 880 { 881 #ifndef lint 882 register int br, cvec; /* MUST BE r11, r10 */ 883 #else 884 /* 885 * Lint doesn't realize that these 886 * can be initialized asynchronously 887 * when devices interrupt. 888 */ 889 register int br = 0, cvec = 0; 890 #endif 891 register struct uba_device *ui; 892 register struct uba_ctlr *um; 893 register struct uba_hd *uhp = uhp0; 894 u_short *reg, *ap, addr; 895 struct uba_driver *udp; 896 int i, (**ivec)(); 897 caddr_t ualloc; 898 extern quad catcher[128]; 899 #if DW780 || DWBUA 900 struct uba_regs *vubp = uhp->uh_uba; 901 #endif 902 903 /* 904 * Initialize the UNIBUS, by freeing the map 905 * registers and the buffered data path registers 906 */ 907 uhp->uh_map = (struct map *) 908 malloc((u_long)(UAMSIZ * sizeof (struct map)), M_DEVBUF, 909 M_NOWAIT); 910 if (uhp->uh_map == 0) 911 panic("no mem for unibus map"); 912 bzero((caddr_t)uhp->uh_map, (unsigned)(UAMSIZ * sizeof (struct map))); 913 ubainitmaps(uhp); 914 915 /* 916 * Initialize space for the UNIBUS interrupt vectors. 917 * On the 8600, can't use first slot in UNIvec 918 * (the vectors for the second SBI overlap it); 919 * move each set of vectors forward. 920 */ 921 #if VAX8600 922 if (cpu == VAX_8600) 923 uhp->uh_vec = UNIvec[numuba + 1]; 924 else 925 #endif 926 uhp->uh_vec = UNIvec[numuba]; 927 for (i = 0; i < 128; i++) 928 uhp->uh_vec[i] = scbentry(&catcher[i], SCB_ISTACK); 929 /* 930 * Set last free interrupt vector for devices with 931 * programmable interrupt vectors. Use is to decrement 932 * this number and use result as interrupt vector. 933 */ 934 uhp->uh_lastiv = 0x200; 935 936 #ifdef DWBUA 937 if (uhp->uh_type == DWBUA) 938 BUA(vubp)->bua_offset = (int)uhp->uh_vec - (int)&scb[0]; 939 #endif 940 941 #ifdef DW780 942 if (uhp->uh_type == DW780) { 943 vubp->uba_sr = vubp->uba_sr; 944 vubp->uba_cr = UBACR_IFS|UBACR_BRIE; 945 } 946 #endif 947 /* 948 * First configure devices that have unibus memory, 949 * allowing them to allocate the correct map registers. 950 */ 951 ubameminit(numuba); 952 /* 953 * Grab some memory to record the umem address space we allocate, 954 * so we can be sure not to place two devices at the same address. 955 * 956 * We could use just 1/8 of this (we only want a 1 bit flag) but 957 * we are going to give it back anyway, and that would make the 958 * code here bigger (which we can't give back), so ... 959 * 960 * One day, someone will make a unibus with something other than 961 * an 8K i/o address space, & screw this totally. 962 */ 963 ualloc = (caddr_t)malloc((u_long)(8 * 1024), M_TEMP, M_NOWAIT); 964 if (ualloc == (caddr_t)0) 965 panic("no mem for unifind"); 966 bzero(ualloc, 8*1024); 967 968 /* 969 * Map the first page of UNIBUS i/o 970 * space to the first page of memory 971 * for devices which will need to dma 972 * output to produce an interrupt. 973 */ 974 *(int *)(&uhp->uh_mr[0]) = UBAMR_MRV; 975 976 #define ubaddr(uhp, off) (u_short *)((int)(uhp)->uh_iopage + ubdevreg(off)) 977 /* 978 * Check each unibus mass storage controller. 979 * For each one which is potentially on this uba, 980 * see if it is really there, and if it is record it and 981 * then go looking for slaves. 982 */ 983 for (um = ubminit; udp = um->um_driver; um++) { 984 if (um->um_ubanum != numuba && um->um_ubanum != '?' || 985 um->um_alive) 986 continue; 987 addr = (u_short)um->um_addr; 988 /* 989 * use the particular address specified first, 990 * or if it is given as "0", of there is no device 991 * at that address, try all the standard addresses 992 * in the driver til we find it 993 */ 994 for (ap = udp->ud_addr; addr || (addr = *ap++); addr = 0) { 995 996 if (ualloc[ubdevreg(addr)]) 997 continue; 998 reg = ubaddr(uhp, addr); 999 if (badaddr((caddr_t)reg, 2)) 1000 continue; 1001 #ifdef DW780 1002 if (uhp->uh_type == DW780 && vubp->uba_sr) { 1003 vubp->uba_sr = vubp->uba_sr; 1004 continue; 1005 } 1006 #endif 1007 cvec = 0x200; 1008 i = (*udp->ud_probe)(reg, um->um_ctlr, um); 1009 #ifdef DW780 1010 if (uhp->uh_type == DW780 && vubp->uba_sr) { 1011 vubp->uba_sr = vubp->uba_sr; 1012 continue; 1013 } 1014 #endif 1015 if (i == 0) 1016 continue; 1017 printf("%s%d at uba%d csr %o ", 1018 udp->ud_mname, um->um_ctlr, numuba, addr); 1019 if (cvec == 0) { 1020 printf("zero vector\n"); 1021 continue; 1022 } 1023 if (cvec == 0x200) { 1024 printf("didn't interrupt\n"); 1025 continue; 1026 } 1027 printf("vec %o, ipl %x\n", cvec, br); 1028 csralloc(ualloc, addr, i); 1029 um->um_alive = 1; 1030 um->um_ubanum = numuba; 1031 um->um_hd = uhp; 1032 um->um_addr = (caddr_t)reg; 1033 udp->ud_minfo[um->um_ctlr] = um; 1034 for (cvec /= 4, ivec = um->um_intr; *ivec; cvec++, ivec++) 1035 uhp->uh_vec[cvec] = scbentry(*ivec, SCB_ISTACK); 1036 for (ui = ubdinit; ui->ui_driver; ui++) { 1037 int t; 1038 1039 if (ui->ui_driver != udp || ui->ui_alive || 1040 ui->ui_ctlr != um->um_ctlr && ui->ui_ctlr != '?' || 1041 ui->ui_ubanum != numuba && ui->ui_ubanum != '?') 1042 continue; 1043 t = ui->ui_ctlr; 1044 ui->ui_ctlr = um->um_ctlr; 1045 if ((*udp->ud_slave)(ui, reg) == 0) 1046 ui->ui_ctlr = t; 1047 else { 1048 ui->ui_alive = 1; 1049 ui->ui_ubanum = numuba; 1050 ui->ui_hd = uhp; 1051 ui->ui_addr = (caddr_t)reg; 1052 ui->ui_physaddr = pumem + ubdevreg(addr); 1053 if (ui->ui_dk && dkn < DK_NDRIVE) 1054 ui->ui_dk = dkn++; 1055 else 1056 ui->ui_dk = -1; 1057 ui->ui_mi = um; 1058 /* ui_type comes from driver */ 1059 udp->ud_dinfo[ui->ui_unit] = ui; 1060 printf("%s%d at %s%d slave %d", 1061 udp->ud_dname, ui->ui_unit, 1062 udp->ud_mname, um->um_ctlr, ui->ui_slave); 1063 (*udp->ud_attach)(ui); 1064 printf("\n"); 1065 } 1066 } 1067 break; 1068 } 1069 } 1070 /* 1071 * Now look for non-mass storage peripherals. 1072 */ 1073 for (ui = ubdinit; udp = ui->ui_driver; ui++) { 1074 if (ui->ui_ubanum != numuba && ui->ui_ubanum != '?' || 1075 ui->ui_alive || ui->ui_slave != -1) 1076 continue; 1077 addr = (u_short)ui->ui_addr; 1078 1079 for (ap = udp->ud_addr; addr || (addr = *ap++); addr = 0) { 1080 1081 if (ualloc[ubdevreg(addr)]) 1082 continue; 1083 reg = ubaddr(uhp, addr); 1084 if (badaddr((caddr_t)reg, 2)) 1085 continue; 1086 #ifdef DW780 1087 if (uhp->uh_type == DW780 && vubp->uba_sr) { 1088 vubp->uba_sr = vubp->uba_sr; 1089 continue; 1090 } 1091 #endif 1092 cvec = 0x200; 1093 i = (*udp->ud_probe)(reg, ui); 1094 #ifdef DW780 1095 if (uhp->uh_type == DW780 && vubp->uba_sr) { 1096 vubp->uba_sr = vubp->uba_sr; 1097 continue; 1098 } 1099 #endif 1100 if (i == 0) 1101 continue; 1102 printf("%s%d at uba%d csr %o ", 1103 ui->ui_driver->ud_dname, ui->ui_unit, numuba, addr); 1104 if (cvec == 0) { 1105 printf("zero vector\n"); 1106 continue; 1107 } 1108 if (cvec == 0x200) { 1109 printf("didn't interrupt\n"); 1110 continue; 1111 } 1112 printf("vec %o, ipl %x\n", cvec, br); 1113 csralloc(ualloc, addr, i); 1114 ui->ui_hd = uhp; 1115 for (cvec /= 4, ivec = ui->ui_intr; *ivec; cvec++, ivec++) 1116 uhp->uh_vec[cvec] = scbentry(*ivec, SCB_ISTACK); 1117 ui->ui_alive = 1; 1118 ui->ui_ubanum = numuba; 1119 ui->ui_addr = (caddr_t)reg; 1120 ui->ui_physaddr = pumem + ubdevreg(addr); 1121 ui->ui_dk = -1; 1122 /* ui_type comes from driver */ 1123 udp->ud_dinfo[ui->ui_unit] = ui; 1124 (*udp->ud_attach)(ui); 1125 break; 1126 } 1127 } 1128 1129 #ifdef DW780 1130 if (uhp->uh_type == DW780) 1131 uhp->uh_uba->uba_cr = UBACR_IFS | UBACR_BRIE | 1132 UBACR_USEFIE | UBACR_SUEFIE | 1133 (uhp->uh_uba->uba_cr & 0x7c000000); 1134 #endif 1135 numuba++; 1136 1137 #ifdef AUTO_DEBUG 1138 printf("Unibus allocation map"); 1139 for (i = 0; i < 8*1024; ) { 1140 register n, m; 1141 1142 if ((i % 128) == 0) { 1143 printf("\n%6o:", i); 1144 for (n = 0; n < 128; n++) 1145 if (ualloc[i+n]) 1146 break; 1147 if (n == 128) { 1148 i += 128; 1149 continue; 1150 } 1151 } 1152 1153 for (n = m = 0; n < 16; n++) { 1154 m <<= 1; 1155 m |= ualloc[i++]; 1156 } 1157 1158 printf(" %4x", m); 1159 } 1160 printf("\n"); 1161 #endif 1162 1163 free(ualloc, M_TEMP); 1164 } 1165 #endif /* NUBA */ 1166 1167 /* 1168 * Mark addresses starting at "addr" and continuing 1169 * "size" bytes as allocated in the map "ualloc". 1170 * Warn if the new allocation overlaps a previous allocation. 1171 */ 1172 static 1173 csralloc(ualloc, addr, size) 1174 caddr_t ualloc; 1175 u_short addr; 1176 register int size; 1177 { 1178 register caddr_t p; 1179 int warned = 0; 1180 1181 p = &ualloc[ubdevreg(addr+size)]; 1182 while (--size >= 0) { 1183 if (*--p && !warned) { 1184 printf( 1185 "WARNING: device registers overlap those for a previous device!\n"); 1186 warned = 1; 1187 } 1188 *p = 1; 1189 } 1190 } 1191 1192 /* 1193 * Make an IO register area accessible at physical address physa 1194 * by mapping kernel ptes starting at pte. 1195 */ 1196 ioaccess(physa, pte, size) 1197 caddr_t physa; 1198 register struct pte *pte; 1199 int size; 1200 { 1201 register int i = btoc(size); 1202 register unsigned v = btop(physa); 1203 1204 do 1205 *(int *)pte++ = PG_V|PG_KW|v++; 1206 while (--i > 0); 1207 mtpr(TBIA, 0); 1208 } 1209 1210 /* 1211 * Configure swap space and related parameters. 1212 */ 1213 swapconf() 1214 { 1215 register struct swdevt *swp; 1216 register int nblks; 1217 1218 for (swp = swdevt; swp->sw_dev; swp++) 1219 if (bdevsw[major(swp->sw_dev)].d_psize) { 1220 nblks = 1221 (*bdevsw[major(swp->sw_dev)].d_psize)(swp->sw_dev); 1222 if (nblks != -1 && 1223 (swp->sw_nblks == 0 || swp->sw_nblks > nblks)) 1224 swp->sw_nblks = nblks; 1225 } 1226 if (dumplo == 0 && dumpdev != NODEV && bdevsw[major(dumpdev)].d_psize) 1227 dumplo = (*bdevsw[major(dumpdev)].d_psize)(dumpdev) - physmem; 1228 if (dumplo < 0) 1229 dumplo = 0; 1230 } 1231 1232 #define DOSWAP /* Change swdevt, argdev, and dumpdev too */ 1233 u_long bootdev; /* should be dev_t, but not until 32 bits */ 1234 1235 static char devname[][2] = { 1236 'h','p', /* 0 = hp */ 1237 0,0, /* 1 = ht */ 1238 'u','p', /* 2 = up */ 1239 'r','k', /* 3 = hk */ 1240 0,0, /* 4 = sw */ 1241 0,0, /* 5 = tm */ 1242 0,0, /* 6 = ts */ 1243 0,0, /* 7 = mt */ 1244 0,0, /* 8 = tu */ 1245 'r','a', /* 9 = ra */ 1246 0,0, /* 10 = ut */ 1247 'r','b', /* 11 = rb */ 1248 0,0, /* 12 = uu */ 1249 0,0, /* 13 = rx */ 1250 'r','l', /* 14 = rl */ 1251 0,0, /* 15 = tmscp */ 1252 'k','r', /* 16 = ra on kdb50 */ 1253 }; 1254 1255 #define PARTITIONMASK 0x7 1256 #define PARTITIONSHIFT 3 1257 1258 /* 1259 * Attempt to find the device from which we were booted. 1260 * If we can do so, and not instructed not to do so, 1261 * change rootdev to correspond to the load device. 1262 */ 1263 setroot() 1264 { 1265 int majdev, mindev, unit, part, controller, adaptor; 1266 dev_t temp, orootdev; 1267 struct swdevt *swp; 1268 1269 if (boothowto & RB_DFLTROOT || 1270 (bootdev & B_MAGICMASK) != (u_long)B_DEVMAGIC) 1271 return; 1272 majdev = B_TYPE(bootdev); 1273 if (majdev >= sizeof(devname) / sizeof(devname[0])) 1274 return; 1275 adaptor = B_ADAPTOR(bootdev); 1276 controller = B_CONTROLLER(bootdev); 1277 part = B_PARTITION(bootdev); 1278 unit = B_UNIT(bootdev); 1279 if (majdev == 0) { /* MBA device */ 1280 #if NMBA > 0 1281 register struct mba_device *mbap; 1282 int mask; 1283 1284 /* 1285 * The MBA number used at boot time is not necessarily the same as the 1286 * MBA number used by the kernel. In order to change the rootdev we need to 1287 * convert the boot MBA number to the kernel MBA number. The address space 1288 * for an MBA used by the boot code is 0x20010000 + 0x2000 * MBA_number 1289 * on the 78? and 86?0, 0xf28000 + 0x2000 * MBA_number on the 750. 1290 * Therefore we can search the mba_hd table for the MBA that has the physical 1291 * address corresponding to the boot MBA number. 1292 */ 1293 #define PHYSADRSHFT 13 1294 #define PHYSMBAMASK780 0x7 1295 #define PHYSMBAMASK750 0x3 1296 1297 switch (cpu) { 1298 1299 case VAX_780: 1300 case VAX_8600: 1301 default: 1302 mask = PHYSMBAMASK780; 1303 break; 1304 1305 case VAX_750: 1306 mask = PHYSMBAMASK750; 1307 break; 1308 } 1309 for (mbap = mbdinit; mbap->mi_driver; mbap++) 1310 if (mbap->mi_alive && mbap->mi_drive == unit && 1311 (((long)mbap->mi_hd->mh_physmba >> PHYSADRSHFT) 1312 & mask) == adaptor) 1313 break; 1314 if (mbap->mi_driver == 0) 1315 return; 1316 mindev = mbap->mi_unit; 1317 #else 1318 return; 1319 #endif 1320 } else { 1321 register struct uba_device *ubap; 1322 1323 for (ubap = ubdinit; ubap->ui_driver; ubap++) 1324 if (ubap->ui_alive && ubap->ui_slave == unit && 1325 ubap->ui_ctlr == controller && 1326 ubap->ui_ubanum == adaptor && 1327 ubap->ui_driver->ud_dname[0] == devname[majdev][0] && 1328 ubap->ui_driver->ud_dname[1] == devname[majdev][1]) 1329 break; 1330 1331 if (ubap->ui_driver == 0) 1332 return; 1333 mindev = ubap->ui_unit; 1334 } 1335 mindev = (mindev << PARTITIONSHIFT) + part; 1336 orootdev = rootdev; 1337 rootdev = makedev(majdev, mindev); 1338 /* 1339 * If the original rootdev is the same as the one 1340 * just calculated, don't need to adjust the swap configuration. 1341 */ 1342 if (rootdev == orootdev) 1343 return; 1344 1345 printf("Changing root device to %c%c%d%c\n", 1346 devname[majdev][0], devname[majdev][1], 1347 mindev >> PARTITIONSHIFT, part + 'a'); 1348 1349 #ifdef DOSWAP 1350 mindev &= ~PARTITIONMASK; 1351 for (swp = swdevt; swp->sw_dev; swp++) { 1352 if (majdev == major(swp->sw_dev) && 1353 mindev == (minor(swp->sw_dev) & ~PARTITIONMASK)) { 1354 temp = swdevt[0].sw_dev; 1355 swdevt[0].sw_dev = swp->sw_dev; 1356 swp->sw_dev = temp; 1357 break; 1358 } 1359 } 1360 if (swp->sw_dev == 0) 1361 return; 1362 1363 /* 1364 * If argdev and dumpdev were the same as the old primary swap 1365 * device, move them to the new primary swap device. 1366 */ 1367 if (temp == dumpdev) 1368 dumpdev = swdevt[0].sw_dev; 1369 if (temp == argdev) 1370 argdev = swdevt[0].sw_dev; 1371 #endif 1372 } 1373