9os

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

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:
Mdrivers/dev.c | 18++++++++++++++++++
Mdrivers/dev.h | 4++++
Mdrivers/devblob.c | 68++++++++++++++++++++++++++------------------------------------------
Mdrivers/devuart.c | 12+++---------
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