Exemplo n.º 1
0
void devread(void)
{
	long offset, sector = bnum;
	int dosdev = (int) inode.i_dev;
	for (offset = 0; offset < cnt; offset += BPS)
	{
		Bread(dosdev, badsect(dosdev, sector++));
		bcopy(I_ADDR, iodest+offset, BPS);
	}
}
Exemplo n.º 2
0
Arquivo: disk.c Projeto: metacore/spin
/*
 * Be aware that cnt is rounded up to N*BPS
 */
void
devread(char *iodest, int sector, int cnt)
{
	int offset;
	char *p;
	int dosdev_copy;

	for (offset = 0; offset < cnt; offset += BPS)
	{
		dosdev_copy = dosdev;
		p = Bread(dosdev_copy, badsect(sector++));
		bcopy(p, iodest+offset, BPS);
	}
}
Exemplo n.º 3
0
int disk_read(int sector, int nbytes, vm_offset_t addr)
{
	int retry;
	int cyl, head, secnum;
	int saved_cyl = -1;
	int saved_head =  -1;
	int saved_secnum =  -1;
	int nsect;
	int rc = 0;
	int size;
	int sect;
	int interrupted = 0;
	
        nsect = 0;
	size = nbytes;

#ifdef	DEBUG
	if(debug) {
		printf("disk_read(%x, %x, %x)\n", sector, nbytes, addr);
		printf("dev %d, unit %d, spc %d, spt %d\n", dev, unit, spc, spt);
	}
#endif
	while(nbytes > 0) {
	    sect = badsect(sector);
	    cyl = sect/spc;
	    head = (sect%spc)/spt;
	    secnum = sect%spt;
	    if (cyl != saved_cyl || head != saved_head || size <=0) {
	        if (nsect) {
		    retry = 3;
		    while(retry-- && !interrupted) {
		  	interrupted = is_intr_char();
#ifdef	DEBUG
			if(debug)
		       	    printf("@%x: biosread(%x, %x, %x, %x, %x, %x)\n",
				   (int)&retry,
				   BDEV(dev,unit),
				   saved_cyl,
				   saved_head,
				   saved_secnum,
				   nsect,
				   addr);
#endif
			rc = biosread(BDEV(dev,unit),
						  saved_cyl,
						  saved_head,
						  saved_secnum,
						  nsect,
						  addr);
			if (rc) {
			     if (nsect > 1) { /* try 1 sector at a time */
			         int j;
#ifdef	DEBUG
				 if(debug)
				     printf("Retry: C:%d H:%d S:%d (%d sects @ 0x%x) error code 0x%x\n",
					    saved_cyl,saved_head,
					    saved_secnum, nsect, addr, rc);
#endif
				 for (j = 0; j < nsect; j++)
				     if (disk_read(sector-nsect+j,
						   BPS, addr+j*BPS))
					return(1);
				 break;
			     } else
				 printf("Error %x on C:%d H:%d S:%d @%x\n",
					rc, saved_cyl,saved_head,
					saved_secnum, addr);
		    	} else
			  	break;
		    }
		    if (rc || interrupted)
			return(1);
		    nbytes -= nsect*BPS;
		    addr += nsect*BPS;
		}
		saved_cyl = cyl;
		saved_head = head;
		saved_secnum = secnum;
		nsect = 0;
	    }
	    sector++;
	    nsect++;
	    size -= BPS;
	}
#ifdef	DEBUG
	if(debug)
		printf("disk_read done\n");
#endif
	
	return(0);
}