+ /* check transfer bounds against partition size */
+ if ((dumplo < 0) || ((dumplo + num) > nblocks))
+ return(EINVAL);
+
+ sddoingadump = 1 ;
+
+ blknum = dumplo + blkoff;
+ while (num > 0)
+ {
+ if (blkcnt > MAXTRANSFER) blkcnt = MAXTRANSFER;
+ pmap_enter( kernel_pmap,
+ CADDR1,
+ trunc_page(addr),
+ VM_PROT_READ,
+ TRUE);
+#ifndef NOT_TRUSTED
+ /*******************************************************\
+ * Fill out the scsi command *
+ \*******************************************************/
+ bzero(&cmd, sizeof(cmd));
+ cmd.op_code = WRITE_BIG;
+ cmd.addr_3 = (blknum & 0xff000000) >> 24;
+ cmd.addr_2 = (blknum & 0xff0000) >> 16;
+ cmd.addr_1 = (blknum & 0xff00) >> 8;
+ cmd.addr_0 = blknum & 0xff;
+ cmd.length2 = (blkcnt & 0xff00) >> 8;
+ cmd.length1 = (blkcnt & 0xff);
+ /*******************************************************\
+ * Fill out the scsi_xfer structure *
+ * Note: we cannot sleep as we may be an interrupt *
+ \*******************************************************/
+ bzero(xs, sizeof(sx));
+ xs->flags |= SCSI_NOMASK|SCSI_NOSLEEP|INUSE;
+ xs->adapter = sd->ctlr;
+ xs->targ = sd->targ;
+ xs->lu = sd->lu;
+ xs->retries = SD_RETRIES;
+ xs->timeout = 10000;/* 10000 millisecs for a disk !*/
+ xs->cmd = (struct scsi_generic *)&cmd;
+ xs->cmdlen = sizeof(cmd);
+ xs->resid = blkcnt * 512;
+ xs->when_done = 0;
+ xs->done_arg = unit;
+ xs->done_arg2 = (int)xs;
+ xs->error = XS_NOERROR;
+ xs->bp = 0;
+ xs->data = (u_char *)CADDR1;
+ xs->datalen = blkcnt * 512;
+
+ /*******************************************************\
+ * Pass all this info to the scsi driver. *
+ \*******************************************************/
+ retval = (*(sd->sc_sw->scsi_cmd))(xs);
+ switch(retval)
+ {
+ case SUCCESSFULLY_QUEUED:
+ case HAD_ERROR:
+ return(ENXIO); /* we said not to sleep! */
+ case COMPLETE:
+ break;
+ default:
+ return(ENXIO); /* we said not to sleep! */
+ }
+#else NOT_TRUSTED
+ /* lets just talk about this first...*/
+ printf ("sd%d: dump addr 0x%x, blk %d\n",unit,addr,blknum);
+#endif NOT_TRUSTED
+
+ if ((unsigned)addr % (1024*1024) == 0) printf("%d ", num/2048) ;
+ /* update block count */
+ num -= MAXTRANSFER;
+ blknum += MAXTRANSFER ;
+ (int) addr += 512 * MAXTRANSFER;
+
+ /* operator aborting dump? */
+ if (sgetc(1))
+ return(EINTR);
+ }
+ return(0);
+}
+#else SCSIDUMP
+sddump()
+{
+ printf("\nsddump() -- not implemented\n");
+ DELAY(20000000); /* 20 seconds */
+ return(-1);
+}
+#endif SCSIDUMP