commit 1c4f3ff0aa165ed13b3706047dc001447f274f39
parent 50c4759df3100f4f8a6a8364b559796c1ce03569
Author: Roberto Vargas <roberto.vargas@arm.com>
Date: Mon, 4 Mar 2019 09:47:53 +0000
[dev] Simplify devblob
Change-Id: I9b0f4db533d42e858bafd12b1ef5da3e7ebc0746
Diffstat:
4 files changed, 51 insertions(+), 51 deletions(-)
diff --git a/drivers/dev.c b/drivers/dev.c
@@ -120,6 +120,24 @@ chanclose(Chan *c)
c->type = NODEV;
}
+int
+buf2chan(Chan *c, void *dst, void *src, int nbytes, unsigned long long len)
+{
+ char *addr = src;
+
+ if (c->offset >= len)
+ return 0;
+
+ if (c->offset + nbytes > len)
+ nbytes = len - c->offset;
+
+ memcpy(dst, addr + c->offset, nbytes);
+
+ c->offset += nbytes;
+
+ return nbytes;
+}
+
static Chan *
mntpoint(Chan *c)
{
diff --git a/drivers/dev.h b/drivers/dev.h
@@ -17,6 +17,7 @@ struct dirtab {
Qid qid;
unsigned long long length;
unsigned char perm;
+ void *data;
};
struct dev {
@@ -42,6 +43,9 @@ struct attr {
extern Chan *clone(Chan *c, Chan *nc);
extern void chanclose(Chan *c);
+extern int buf2chan(Chan *c,
+ void *dst, void *src,
+ int nbytes, unsigned long long len);
extern void devlink(void);
extern int devwrite(Chan *c, void *buf, int n);
diff --git a/drivers/devblob.c b/drivers/devblob.c
@@ -20,7 +20,6 @@ static Dirtab blobfstab[NR_BLOBS+1] = {
{"ctl", Qctl, 0, O_READ | O_WRITE},
};
-static void *addrtab[NR_BLOBS+1];
static int nblobs;
static int
@@ -30,54 +29,40 @@ blobwalk(Chan *c, const char *name)
}
static int
-blobread(Chan *c, void *buf, int n)
+blobstatus(Chan *c, void *buf, int n)
{
- Qid qid;
- int i;
- size_t length;
- char *addr;
+ 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)
+{
+ Dirtab *dp;
+
switch (c->qid & ~CHDIR) {
case Qblobfs:
return dirread(c, buf, n, blobfstab, nblobs+1, devgen);
case Qctl:
- for (length = i = 0; i < nblobs; i++) {
- dp = &blobfstab[i+1];
- length += ksnprint(info+length,
- sizeof(info) - length,
- "%s 0x%p %llu\n",
- dp->name,
- addrtab[i],
- dp->length);
- }
- addr = info;
- break;
+ return blobstatus(c, buf, n);
default:
- qid = c->qid;
- if (qid - (Qctl + 1) > nblobs)
- panic("bioread");
- qid -= 1;
- dp = &blobfstab[qid];
- qid -= Qctl;
- addr = addrtab[qid];
-
- length = dp->length;
- break;
+ return buf2chan(c, buf, dp->data, n, dp->length);
}
-
- if (c->offset >= length)
- return 0;
-
- if (c->offset + n > length)
- n = length - c->offset;
-
- memcpy(buf, addr + c->offset, n);
-
- c->offset += n;
-
- return n;
}
static int
@@ -89,14 +74,13 @@ newblob(char *name, void *addr, size_t len)
if (nblobs == NR_BLOBS || strlen(name) >= NAMELEN)
return 0;
- addrtab[nblobs] = addr;
- qid = nblobs + Qctl + 1;
+ qid = ++nblobs + Qctl;
dp = &blobfstab[qid-1];
dp->qid = qid;
dp->perm = O_READ;
dp->length = len;
+ dp->data = addr;
strcpy(dp->name, name);
- nblobs++;
return 1;
}
diff --git a/drivers/devuart.c b/drivers/devuart.c
@@ -61,16 +61,10 @@ uartstatus(Uart *up, void *buf, Chan *c, int n)
up->nstop,
up->fifo);
- if (n + offset >= len)
- n = len - offset;
+ if (len == sizeof(tmp))
+ panic("uartstatus");
- if (offset >= len || n == 0)
- return 0;
-
- c->offset += n;
-
- memcpy(buf, tmp + offset, n);
- return n;
+ return buf2chan(c, buf, tmp, n, len);
}
static void