out some scheme to do a bank call here - do we need a dev_tab bank
entry perhaps ? */
+static void bdsetup(bufptr bp)
+{
+ udata.u_buf = bp;
+ udata.u_block = bp->bf_blk;
+ udata.u_blkoff = 0;
+ udata.u_nblock = 1;
+ udata.u_dptr = bp->bf_data;
+}
+
int bdread(bufptr bp)
{
uint16_t dev = bp->bf_dev;
-
validchk(dev, PANIC_BDR);
-
- udata.u_buf = bp;
+ bdsetup(bp);
return ((*dev_tab[major(dev)].dev_read) (minor(dev), 0, 0));
}
-
int bdwrite(bufptr bp)
{
uint16_t dev = bp->bf_dev;
-
validchk(dev, PANIC_BDW);
-
- udata.u_buf = bp;
+ bdsetup(bp);
return ((*dev_tab[major(dev)].dev_write) (minor(dev), 0, 0));
}
return r;
}
+/* 128, 256, 512 supported for now */
+static uint16_t masks[] = { 0x7F, 0xFF, 0x1FF };
+
+/* This is not a commonly used path so can be slower */
+int d_blkoff(uint8_t shift)
+{
+ uint16_t m = masks[shift - 7];
+ udata.u_block = udata.u_offset >> shift;
+ if (udata.u_offset & m) {
+ udata.u_error = EIO;
+ return -1;
+ }
+ udata.u_nblock = (udata.u_count + m) >> shift;
+ udata.u_dptr = udata.u_base;
+ return 0;
+}
+
/*
* No such device handler
*/
inoptr u_root; /* Index into inode table of / */
inoptr u_rename; /* Used in n_open for rename() checking */
inoptr u_ctty; /* Controlling tty */
+
+ /* Temporaries used for block I/O */
+ blkno_t u_block; /* Block number */
+ uint16_t u_blkoff; /* Offset in block */
+ uint16_t u_nblock; /* Number of blocks */
+ uint8_t *u_dptr; /* Address for I/O */
+
#ifdef CONFIG_LEVEL_2
uint16_t u_groups[NGROUP]; /* Group list */
uint8_t u_ngroup;
extern int d_close(uint16_t dev);
extern int d_ioctl(uint16_t dev, uint16_t request, char *data);
extern int d_flush(uint16_t dev);
+extern int d_blkoff(uint8_t bits);
extern int cdwrite(uint16_t dev, uint8_t flag);
extern bool insq(struct s_queue *q, unsigned char c);
extern bool remq(struct s_queue *q, unsigned char *cp);
/* swap.c */
extern uint16_t swappage;
-extern uint8_t *swapbase;
-extern unsigned int swapcnt;
-extern blkno_t swapblk;
extern int swapread(uint16_t dev, blkno_t blkno, unsigned int nbytes,
uint16_t buf, uint16_t page);