Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
/*
 * 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();
}