dump(9E) エントリポイントは、システム障害やチェックポイント操作が発生した場合に、仮想アドレス空間の一部を、指定されたデバイスに直接コピーします。cpr (7) とdump(9E) のマニュアルページを参照してください。dump(9E) エントリポイントは、割り込みを使わずにこの操作を実行できる必要があります。
dump() の引数は次のとおりです。
ダンプデバイスのデバイス番号
ダンプを開始するカーネルの仮想アドレス
デバイス上の最初の出力先ブロック
ダンプするブロックの数
static int
xxdump(dev_t dev, caddr_t addr, daddr_t blkno, int nblk)
{
struct xxstate *xsp;
struct buf *bp;
struct scsi_pkt *pkt;
int rval;
int instance;
instance = getminor(dev);
xsp = ddi_get_soft_state(statep, instance);
if (tgt->suspended) {
(void) pm_raise_power(DEVINFO(tgt), 0, 1);
}
bp = getrbuf(KM_NOSLEEP);
if (bp == NULL) {
return (EIO);
}
/* Calculate block number relative to partition. */
bp->b_un.b_addr = addr;
bp->b_edev = dev;
bp->b_bcount = nblk * DEV_BSIZE;
bp->b_flags = B_WRITE | B_BUSY;
bp->b_blkno = blkno;
pkt = scsi_init_pkt(ROUTE(tgt), NULL, bp, CDB_GROUP1,
sizeof (struct scsi_arq_status),
sizeof (struct bst_pkt_private), 0, NULL_FUNC, NULL);
if (pkt == NULL) {
freerbuf(bp);
return (EIO);
}
(void) scsi_setup_cdb((union scsi_cdb *)pkt->pkt_cdbp,
SCMD_WRITE_G1, blkno, nblk, 0);
/*
* While dumping in polled mode, other cmds might complete
* and these should not be resubmitted. we set the
* dumping flag here which prevents requeueing cmds.
*/
tgt->dumping = 1;
rval = scsi_poll(pkt);
tgt->dumping = 0;
scsi_destroy_pkt(pkt);
freerbuf(bp);
if (rval != DDI_SUCCESS) {
rval = EIO;
}
return (rval);
}