int devread(Xfs *xf, int32_t addr, void *buf, int32_t n) { int32_t nread; if(xf->dev < 0) return -1; nread = pread(xf->dev, buf, n, xf->offset+(int64_t)addr*Sectorsize); if (nread == n) return 0; return deverror("read", xf, addr, n, nread); }
int devwrite(Xfs *xf, int32_t addr, void *buf, int32_t n) { int32_t nwrite; if(xf->omode==OREAD) return -1; if(xf->dev < 0) return -1; nwrite = pwrite(xf->dev, buf, n, xf->offset+(int64_t)addr*Sectorsize); if (nwrite == n) return 0; return deverror("write", xf, addr, n, nwrite); }
/* * This is the disk interrupt service routine. */ static void ideISR(int irq, InterruptContext *icp) { unsigned int diskCtrl; struct buf *bp; /* set process priority, re-enable interrupts */ spl5(); enableInt(); /* clear done bit und thus the yet pending irq */ diskCtrl = *DISK_CTRL; *DISK_CTRL = diskCtrl & (unsigned)~(DISK_CTRL_DONE | DISK_CTRL_STRT); if (ideTab.b_active == 0) { return; } bp = ideTab.b_actf; ideTab.b_active = 0; if (diskCtrl & DISK_CTRL_ERR) { /* an error occurred */ deverror(bp->b_dev, bp->b_blkno, diskCtrl); if (++ideTab.b_errcnt <= 10) { ideStart(); return; } bp->b_flags |= B_ERROR; } else { if (bp->b_flags & B_READ) { /* this was a read operation - transfer block from disk buffer */ copyWords((unsigned int *) bp->b_un.b_addr, DISK_BUFFER, WPB); } } ideTab.b_errcnt = 0; ideTab.b_actf = bp->av_forw; bp->b_resid = 0; /* hand buffer back to buffer cache */ iodone(bp); /* start next operation */ ideStart(); }