From: Alan Cox Date: Mon, 25 Jul 2016 16:34:00 +0000 (+0100) Subject: devio: add helpers to start rationalising the I/O paths X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=69f29dcbd2f95ba2c6cb827b59910b51b737f272;p=FUZIX.git devio: add helpers to start rationalising the I/O paths --- diff --git a/Kernel/devio.c b/Kernel/devio.c index ae82ec41..e7dd5312 100644 --- a/Kernel/devio.c +++ b/Kernel/devio.c @@ -234,24 +234,28 @@ Any device other than a disk will have only raw access. 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)); } @@ -310,6 +314,23 @@ int d_flush(uint16_t dev) 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 */ diff --git a/Kernel/include/kernel.h b/Kernel/include/kernel.h index ef0f878a..c9a000e2 100644 --- a/Kernel/include/kernel.h +++ b/Kernel/include/kernel.h @@ -447,6 +447,13 @@ typedef struct u_data { 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; @@ -735,6 +742,7 @@ extern int d_open(uint16_t dev, uint8_t flag); 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); @@ -843,9 +851,6 @@ extern int _select(void); /* 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);