9os

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

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:
Mdrivers/.gitignore | 2++
Mdrivers/Makefile.drv | 7++++++-
Ddrivers/blob.h | 10----------
Ddrivers/devblob.c | 137-------------------------------------------------------------------------------
Mdrivers/devroot.c | 47++++++++++++++++++++++++++++++++++++++++++++---
Mdrivers/dump | 31++++++++++++++-----------------
Mdrivers/mkblob | 25+++++++++++--------------
Adrivers/mkblobh | 34++++++++++++++++++++++++++++++++++
Mtarget/hosted/rcode | 12+++++-------
Mtarget/hosted/rom.c | 3++-
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