9os

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 895c6ce13608b721fc8cfd04f4ea8a397d1bc87b
parent c08d939b47b910e5d09da04c5c490a3dc0ff15d1
Author: Roberto Vargas <roberto.vargas@arm.com>
Date:   Mon, 20 May 2019 10:07:09 +0100

Merge changes from topic 'av/block'

* changes:
  [dev] Stop marking blocks as dirty after a read
  [drivers] Add dummy blk driver for hosted
  [dev] Fix overflow in devblk

Diffstat:
Mdrivers/blk.h | 3+++
Mdrivers/devblk.c | 17+++++++++--------
Mdrivers/devroot.c | 2++
Adrivers/dummyblk.c | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtarget/hosted/rcode | 1+
Mtarget/hosted/rom.c | 4++++
Mtarget/native/rcode | 1+
7 files changed, 74 insertions(+), 8 deletions(-)

diff --git a/drivers/blk.h b/drivers/blk.h @@ -1,9 +1,12 @@ +#define BLKSIZ 512 + typedef struct blk Blk; typedef struct blkphy Blkphy; struct blk { mutex_t m; Blkphy *phy; + void *data; }; struct blkphy { diff --git a/drivers/devblk.c b/drivers/devblk.c @@ -11,7 +11,6 @@ #define NR_BUFFERS 1 #define NR_BLKS 2 -#define BLKSIZ 512 typedef struct buffer Buffer; @@ -41,7 +40,7 @@ static Buffer bcache[NR_BUFFERS]; static const Dirtab dirtab[] = { {"raw", Qraw, 0, O_READ | O_WRITE}, - {"ctl", Qctl, 0, O_READ | O_WRITE} + {"ctl", Qctl, 0, O_READ | O_WRITE} }; static Blk *blks[NR_BLKS]; @@ -56,7 +55,7 @@ blkwalk(Chan *c, const char *name) static int blkstat(Chan *c, char *file, unsigned char *buf, int n) { - return devstat(c, file, buf, n, dirtab, NELEM(dirtab), devgen); + return devstat(c, file, buf, n, dirtab, NELEM(dirtab), devgen); } static Buffer * @@ -93,7 +92,10 @@ repeat: case -1: bp->flags |= BERROR; break; - case 1: + case 0: + // EOF: no flag set + break; + default: bp->flags |= BVALID; break; } @@ -123,7 +125,7 @@ brelse(Buffer *bp) r = -1; } } - bp->flags &= ~(BBUSY|BDIRTY); + bp->flags &= ~(BBUSY|BDIRTY); unlock(&bp->mutex); return r; @@ -156,7 +158,6 @@ rawread(Chan *c, void *buf, int nbytes) memcpy(ptr, bp->ptr + off, n); ptr += n; c->offset += n; - bp->flags |= BDIRTY; brelse(bp); break; } @@ -202,8 +203,8 @@ rawwrite(Chan *c, void *buf, int nbytes) return -1; case BVALID: n = BLKSIZ - off; - if (n > nbytes) - n = nbytes; + if (n > nbytes - cnt) + n = nbytes - cnt; memcpy(bp->ptr + off, ptr, n); ptr += n; c->offset += n; diff --git a/drivers/devroot.c b/drivers/devroot.c @@ -12,6 +12,7 @@ enum Orootqid { Qdevuart2, Qdevuart3, Qdevcons, + Qdevblk, Qrealm, Qarfs, Qfip, @@ -37,6 +38,7 @@ static const Dirtab devfstab[] = { {"uart2", CHDIR | Qdevuart2, 0, O_READ}, {"uart3", CHDIR | Qdevuart3, 0, O_READ}, {"cons", CHDIR | Qdevcons, 0, O_READ}, + {"blk", CHDIR | Qdevblk, 0, O_READ}, }; static int diff --git a/drivers/dummyblk.c b/drivers/dummyblk.c @@ -0,0 +1,54 @@ +#include <stdio.h> + +#include <rcode/rcode.h> +#include <rcode/io.h> + +#include "../src/libc/syscall.h" +#include "dev.h" +#include "blk.h" + +/* + * A block file filled with zeros can be created with: + * dd bs=512 count=2 if=/dev/zero of=blkfile + */ + +void +dummyblkinit(Blk *dev, Attr *attr) +{ + static char filename[] = "blkfile"; + int fd; + fd = _open(filename, 0x2); + if (fd < 0) { + kerror("ERR blkinit"); + panic("blkinit"); + } + dev->data = alloc(sizeof(fd)); + *(int *)dev->data = fd; + return; +} + +int +dummyblkbread(Blk *dev, long blkno, void *buf) +{ + int fd; + + fd = *(int *) dev->data; + _lseek(fd, blkno * BLKSIZ, 0); + return _read(fd, buf, BLKSIZ); +} + +int +dummyblkbwrite(Blk *dev, long blkno, void *buf) +{ + int fd; + + fd = *(int *) dev->data; + _lseek(fd, blkno * BLKSIZ, 0); + return _write(fd, buf, BLKSIZ); +} + +const Blkphy dummyblkphy = { + .init = dummyblkinit, + .bread = dummyblkbread, + .bwrite = dummyblkbwrite +}; diff --git a/target/hosted/rcode b/target/hosted/rcode @@ -5,6 +5,7 @@ dev dummyuart base=0x1c0c0100,clk=24000000 #t1 cons blk + dummyblk ar blob bios 0x100,0x400 diff --git a/target/hosted/rom.c b/target/hosted/rom.c @@ -83,6 +83,10 @@ namespace(void) kerror("bind:/dev/cons"); goto error; } + if (bind("#b", "/dev/blk") < 0) { + kerror("bind:/dev/blk"); + goto error; + } if ((fd = open("/dev/cons/ctl", O_WRITE)) < 0) { kerror("open:/dev/cons/ctl write"); diff --git a/target/native/rcode b/target/native/rcode @@ -5,6 +5,7 @@ dev pl011 base=0x1c0c0000,clk=24000000,rate=115200 cons fip + blk blob fip.bin 0x8000000,0x80000 end