commit 174dfea4a1552a6305a9be107ff865f7d2fcfeb1
parent 515727833e8a5e5b317c6c8c69ee44b407731353
Author: Roberto Vargas <roberto.vargas@arm.com>
Date: Mon, 11 Mar 2019 16:07:47 +0000
[dev] Remove devblob
It makes more sense to extend devroot with this functionality
instead of providing a dev only for blobs.
Change-Id: I884c9b5701921713da92adca428a164af79beef0
Diffstat:
10 files changed, 118 insertions(+), 190 deletions(-)
diff --git a/drivers/.gitignore b/drivers/.gitignore
@@ -1,3 +1,5 @@
devs.mk
devc.c
blobs.mk
+blobfil.h
+blobs.h
diff --git a/drivers/Makefile.drv b/drivers/Makefile.drv
@@ -15,5 +15,10 @@ builtin.o: $(OBJS)
devc.c: $(TARGETDIR)/rcode
mkdevc $(TARGETDIR)/rcode
+devroot.c: blobfil.h blob.h
+
+blob.h: $(TARGETDIR)/rcode
+ mkblobh $(TARGETDIR)/rcode
+
clean:
- rm -f $(BLOBS) blobs.mk devs.mk devc.c
+ rm -f blobfil.h blob.h blobs.mk devs.mk devc.c
diff --git a/drivers/blob.h b/drivers/blob.h
@@ -1,10 +0,0 @@
-typedef struct blobphy Blobphy;
-
-struct attr;
-
-struct blobphy {
- void *addr;
- size_t size;
-};
-
-extern void bloblink(Blobphy *phy, struct attr *attr);
diff --git a/drivers/devblob.c b/drivers/devblob.c
@@ -1,137 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-
-#include <libk.h>
-
-#include <rcode/rcode.h>
-#include <rcode/9p.h>
-
-#include "dev.h"
-#include "blob.h"
-
-#define NR_BLOBS 2
-
-enum Oblobqid {
- Qblobfs,
- Qctl,
-};
-
-static Dirtab blobfstab[NR_BLOBS+1] = {
- {"ctl", Qctl, 0, O_READ | O_WRITE},
-};
-
-static int nblobs;
-
-static int
-blobwalk(Chan *c, const char *name)
-{
- return devwalk(c, name, blobfstab, nblobs+1, devgen);
-}
-
-static int
-blobstatus(Chan *c, void *buf, int n)
-{
- int i, len;
- Dirtab *dp;
- char info[NR_BLOBS * (NAMELEN + 20)];
-
- for (len = i = 0; i < nblobs; i++) {
- dp = &blobfstab[i+1];
- len += ksnprint(info+len,
- sizeof(info) - len,
- "%s 0x%p %llu\n",
- dp->name,
- dp->data,
- dp->length);
- }
- if (len == sizeof(info))
- panic("blobstatus");
-
- return buf2chan(c, buf, info, n, len);
-}
-
-static int
-blobread(Chan *c, void *buf, int n)
-{
- Qid qid = c->qid & ~CHDIR;
- Dirtab *dp;
-
- switch (qid) {
- case Qblobfs:
- return dirread(c, buf, n, blobfstab, nblobs+1, devgen);
- case Qctl:
- return blobstatus(c, buf, n);
- default:
- dp = &blobfstab[qid - 1];
- return buf2chan(c, buf, dp->data, n, dp->length);
- }
-}
-
-static int
-newblob(char *name, void *addr, size_t len)
-{
- Qid qid;
- Dirtab *dp;
-
- if (nblobs == NR_BLOBS || strlen(name) >= NAMELEN)
- return 0;
-
- qid = ++nblobs + Qctl;
- dp = &blobfstab[qid-1];
- dp->qid = qid;
- dp->perm = O_READ;
- dp->length = len;
- dp->data = addr;
- strcpy(dp->name, name);
-
- return 1;
-}
-
-void
-bloblink(Blobphy *phy, Attr *attr)
-{
- Attr *p;
-
- for (p = attr; p->key && strcmp(p->key, "file"); p++)
- ;
-
- if (!p->key || !newblob(p->value, phy->addr, phy->size))
- panic("bloblink");
-}
-
-static int
-blobwrite(Chan *c, void *buf, int n)
-{
- char line[100], *name, *addr, *size;
- void *p;
- size_t s;
-
- if (c->qid != Qctl)
- return -1;
-
- if (n > sizeof(buf)-1)
- return -1;
- memcpy(line, buf, n);
- line[n] = '\0';
-
- name = strtok(buf, " \t\r");
- addr = strtok(NULL, " \t\r");
- size = strtok(NULL, " \t\r");
-
- if (!name || !addr || !size)
- return -1;
-
- p = (void *) strtoll(addr, NULL, 0);
- s = strtoll(size, NULL, 0);
- if (!newblob(name, p, s))
- return -1;
-
- return n;
-}
-
-const Dev blobdevtab = {
- .id = 'b',
- .walk = blobwalk,
- .read = blobread,
- .write = blobwrite,
-};
diff --git a/drivers/devroot.c b/drivers/devroot.c
@@ -1,5 +1,6 @@
#include <rcode/rcode.h>
#include <rcode/9p.h>
+#include <libk.h>
#include "dev.h"
@@ -9,11 +10,15 @@ enum Orootqid {
Qdevuart,
Qdevcons,
Qrealm,
- Qblobs,
Qarfs,
- Qmax,
+ Qblobs,
+ Qblobctl,
};
+#include "blobfil.h"
+#include "blobs.h"
+
+
static const Dirtab dirtab[] = {
{"dev", CHDIR | Qdev, 0, O_READ},
{"realm", CHDIR | Qrealm, 0, O_READ},
@@ -38,6 +43,10 @@ rootgen(Chan *c, const Dirtab *tab, int ntab, int n, Dir *dir)
tab = devfstab;
ntab = NELEM(devfstab);
break;
+ case Qblobs:
+ tab = blobtab;
+ ntab = NELEM(blobtab);
+ break;
default:
return 0;
}
@@ -52,9 +61,41 @@ rootwalk(Chan *c, const char *name)
}
static int
+blobstatus(Chan *c, void *buf, int n)
+{
+ int i, len;
+ Dirtab *dp;
+ char info[NELEM(blobtab) * (NAMELEN + 20)];
+
+ len = 0;
+ for (i = 1; i < NELEM(blobtab); i++) {
+ dp = &blobtab[i];
+ len += ksnprint(info+len,
+ sizeof(info) - len,
+ "%s 0x%p %llu\n",
+ dp->name,
+ dp->data,
+ dp->length);
+ }
+ if (len == sizeof(info))
+ panic("blobstatus");
+
+ return buf2chan(c, buf, info, n, len);
+}
+
+static int
rootread(Chan *c, void *buf, int n)
{
- return dirread(c, buf, n, NULL, 0, rootgen);
+ const Dirtab *dp;
+
+ if ((c->qid & CHDIR) != 0)
+ return dirread(c, buf, n, NULL, 0, rootgen);
+
+ if (c->qid == Qblobctl)
+ return blobstatus(c, buf, n);
+
+ dp = &blobtab[c->qid - Qblobctl];
+ return buf2chan(c, buf, dp->data, n, dp->length);
}
const Dev rootdevtab = {
diff --git a/drivers/dump b/drivers/dump
@@ -1,25 +1,22 @@
#!/bin/sh
set -e
+rm -f blob.h
trap 'r=$?; rm -f $$.tmp; exit $r' EXIT HUP INT QUIT TERM
-file=$1
-sym=$2
+for i
+do
+ file=$i
+ sym=`basename $i | sed 's/\..*//'`
-cat <<EOF > $$.tmp && mv $$.tmp $sym.c
-#include <stddef.h>
+ cat <<-EOF
-#include "blob.h"
+ `od -td1 -v -A n $file |
+ tr ' \t' '\n' |
+ awk -v sym=$sym '
+ BEGIN {printf "char %s[] = {\n", sym}
+ NF == 1 {printf "\t%d,\n", $1}
+ END {print "};"}'`
-`od -td1 -v -A n $file |
-tr ' \t' '\n' |
-awk -v sym=$sym '
-BEGIN {printf "char %s[] = {\n", sym}
-NF == 1 {printf "\t%d,\n", $1}
-END {print "};"}'`
-
-Blobphy ${sym}phy = {
- .addr = $sym,
- .size = sizeof($sym),
-};
-EOF
+ EOF
+done > $$.tmp && mv $$.tmp blobfil.h
diff --git a/drivers/mkblob b/drivers/mkblob
@@ -1,25 +1,22 @@
#!/bin/sh
+set -e
trap 'r=$?; rm -f $$.tmp; exit $r' EXIT HUP INT QUIT TERM
+rm -f blobs.mk
section blob $@ |
-awk '{blobs[$1] = $2}
-END {mkvar()
- mkrules()}
+awk -v type=${type=k} '
+NF==1 {blobfil[$1] = 1}
+END {mkrules()}
-function mkvar()
+function mkrules()
{
print "BLOBS = \\"
- for (i in blobs)
- printf "\t%s.c\\\n", i
+ for (i in blobfil)
+ printf "\t%s\\\n", i
print ""
-}
-function mkrules()
-{
- for (i in blobs) {
- printf "%s.c: %s\n", i, blobs[i]
- printf "\tdump %s %s\n", blobs[i], i
- }
+ printf "blobfil.h: $(BLOBS)\n"
+ printf "\tdump $(BLOBS)\n"
}
-' > $$.tmp && mv $$.tmp blobs.mk
+'> $$.tmp && mv $$.tmp blobs.mk
diff --git a/drivers/mkblobh b/drivers/mkblobh
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+set -e
+trap 'r=$?; rm -f $$.tmp; exit $r' EXIT HUP INT QUIT TERM
+rm -f blobs.h
+
+
+section blob $@ |
+awk -v type=${type=k} '
+NF==2 {blobaddr[$1] = $2}
+ {blob[$1] = 1}
+END {mkblob()}
+
+function mkblob()
+{
+
+ printf "static const Dirtab blobtab[] = {\n"
+ printf "\t{\"ctl\", Qblobctl, 0, O_READ},\n"
+ for (file in blob) {
+ if (blobaddr[file]) {
+ split(blobaddr[file], v, ",")
+ addr = "(void *) " v[1]
+ siz = v[2]
+ } else {
+ gsub(/.*\//, "", file)
+ addr=file
+ gsub(/\..*/, "", addr)
+ siz = "sizeof(" addr ")"
+ }
+ printf "\t{\"%s\", Qblobctl+%d, %s, O_READ, %s},\n",
+ file, ++n, siz, addr
+ }
+ printf "};\n"
+}' > $$.tmp && mv $$.tmp blobs.h
diff --git a/target/hosted/rcode b/target/hosted/rcode
@@ -1,13 +1,11 @@
dev
root
uart
- pl011 base=0x1c0c0000,clk=24000000,cfg=b115200 l8 #t0
- pl011 base=0x1c0c0100,clk=24000000 #t1
- blob
- archive file=archive.ar
- romc file=rom.c
+ pl011 base=0x1c0c0000,clk=24000000,cfg=b115200 l8 #t0
+ pl011 base=0x1c0c0100,clk=24000000 #t1
ar
blob
- archive ../target/hosted/example.ar
- romc ../target/hosted/rom.c
+ bios 0x100,0x400
+ ../target/hosted/example.ar
+ ../target/hosted/rom.c
end
diff --git a/target/hosted/rom.c b/target/hosted/rom.c
@@ -55,7 +55,7 @@ namespace(void)
{
if (bind("#t0", "/dev/uart") < 0)
goto error;
- if (bind("#b", "/blobs") < 0)
+ if (bind("#r", "/arfs") < 0)
goto error;
if (arnew("/blobs/example.ar") < 0)
goto error;
@@ -63,6 +63,7 @@ namespace(void)
error:
kerror("namespace");
+ panic("namespace");
}
int