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:
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