+
+#define DBSIZE 20
+
+updump(dev)
+ dev_t dev;
+{
+ struct device *upaddr;
+ char *start;
+ int num, blk, unit, nsect, ntrak, nspc;
+ struct size *sizes;
+#if VAX==780
+ register struct uba_regs *up = (struct uba_regs *)PHYSUBA0;
+ register short *rp;
+ int bdp;
+
+ up->uba_cr = ADINIT;
+ up->uba_cr = IFS|BRIE|USEFIE|SUEFIE;
+ while ((up->uba_cnfgr & UBIC) == 0)
+ ;
+#endif
+ DELAY(1000000);
+ while ((UPADDR->upcs1&DVA) == 0)
+ ;
+ num = maxfree;
+ start = 0;
+ unit = minor(dev) >> 3;
+ if (unit >= NUP) {
+ printf("bad unit\n");
+ return (-1);
+ }
+ upaddr = UPPHYS;
+ upaddr->upcs2 = unit;
+ if ((upaddr->upds & VV) == 0) {
+ upaddr->upcs1 = DCLR|GO;
+ upaddr->upcs1 = PRESET|GO;
+ upaddr->upof = FMT22;
+ }
+ if ((upaddr->upds & (DPR|MOL)) != (DPR|MOL)) {
+ printf("up !DPR || !MOL\n");
+ return (-1);
+ }
+ nsect = NSECT; ntrak = NTRAC; sizes = up_sizes;
+ if (dumplo < 0 || dumplo + num >= sizes[minor(dev)&07].nblocks) {
+ printf("dumplo+num, sizes %d %d\n", dumplo+num, sizes[minor(dev)&07].nblocks);
+ return (-1);
+ }
+ nspc = nsect * ntrak;
+ while (num > 0) {
+ register struct pte *io;
+ register int i;
+ int cn, sn, tn;
+ daddr_t bn;
+
+ blk = num > DBSIZE ? DBSIZE : num;
+ bdp = 1; /* trick pcc */
+ ((struct uba_regs *)PHYSUBA0)->uba_dpr[bdp] |= BNE;
+ io = ((struct uba_regs *)PHYSUBA0)->uba_map;
+ for (i = 0; i < blk; i++)
+ *(int *)io++ = (btop(start)+i) | (1<<21) | MRV;
+ *(int *)io = 0;
+ bn = dumplo + btop(start);
+ cn = bn/nspc + sizes[minor(dev)&07].cyloff;
+ sn = bn%nspc;
+ tn = sn/nsect;
+ sn = sn%nsect;
+ upaddr->updc = cn;
+ rp = (short *) &upaddr->upda;
+ *rp = (tn << 8) + sn;
+ *--rp = 0;
+ *--rp = -blk*NBPG / sizeof (short);
+ *--rp = GO|WCOM;
+ do {
+ DELAY(25);
+ } while ((upaddr->upcs1 & RDY) == 0);
+ if (upaddr->upcs1&ERR) {
+ printf("up dump dsk err: (%d,%d,%d) cs1=%x, er1=%x\n",
+ cn, tn, sn, upaddr->upcs1, upaddr->uper1);
+ return (-1);
+ }
+ start += blk*NBPG;
+ num -= blk;
+ }
+ bdp = 1; /* crud to fool c compiler */
+ ((struct uba_regs *)PHYSUBA0)->uba_dpr[bdp] |= BNE;
+ return (0);
+}
+#endif