9os

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

commit bb1366b34d9d464835871fcdb8f2f3003f81cb74
parent 2f98131b4b6e03f39c3b78e68951c73378c82a88
Author: Roberto Vargas <roberto.vargas@arm.com>
Date:   Tue, 27 Nov 2018 12:55:21 +0000

[drivers] Begin the rework of the driver model

Change-Id: I89af1a52f6c233eea13a831015b9d689c68a3d79

Diffstat:
Mdrivers/dev.c | 295+++----------------------------------------------------------------------------
Mdrivers/dev.h | 33++++++++++++++-------------------
Mdrivers/devroot.c | 97+++----------------------------------------------------------------------------
Mdrivers/devuart.c | 13+++++--------
Minclude/rcode.h | 40++--------------------------------------
Msrc/ramfw/fs.c | 2+-
Msrc/romfw/dlang.c | 3++-
7 files changed, 35 insertions(+), 448 deletions(-)

diff --git a/drivers/dev.c b/drivers/dev.c @@ -1,297 +1,18 @@ #include <errno.h> -#include <string.h> - #include <rcode.h> #include "dev.h" -static File * -validfd(int fd) -{ - if (fd < 0 || fd >= NR_FILS) { - errno = 1; - return NULL; - } - return &bss->filtbl[fd]; -} +struct devdata { + Chan fd[NR_CHANS]; +}; -static int -dentry(const char **name, int *len) +static Chan * +fd2chan(int fd) { - const char *t, *s = *name; - - while (*s == '/') - ++s; - *name = s; - - if (*s == '\0') - return 0; - - for (t = s; *t != '/' && *t != '\0'; t++) - ; - *len = t - s; - - return 1; -} - -Walk * -walk(const char *name, Walk *wp) -{ - const char *s; - Dev **dp; - char id; - int len; - extern Dev *devtab[]; - - if (*name != '#') { - id = '/'; - } else { - id = name[1]; - name += 2; - } - if (*name != '/') { - errno = 1; - return NULL; - } - - for (dp = devtab; *dp && (*dp)->id != id; ++dp) - ; - - if ((wp->dev = *dp) == NULL) { - errno = 1; + if (fd < 0 || fd >= NR_CHANS) { + errno = EBADF; return NULL; } - - for (s = name; dentry(&s, &len); s+= len) { - if (len == 1 && *s == '.') - continue; - if (!(*wp->dev->walk)(wp, s, len)) - break; - } - wp->remaning = s; - - return wp; -} - -int -bind(const char *name, char *where) -{ - Walk w1, w2; - Entry *e1, *e2; - - if (!walk(name, &w1) || !walk(where, &w2)) - return -1; - - if (!w1.entry) { - errno = 1; - return -1; - } - - if (!w2.entry || (w2.entry->flags & ODIR) == 0) { - errno = 1; - return -1; - } - - e1 = w1.entry; - e2 = w2.entry; - e2->dev = w1.dev; - e2->arg = e1->arg; - e2->flags = e1->flags; - - return 0; -} - -int -open(const char *name, int flags) -{ - Walk w; - File *fp, *lim; - int (*fn)(File *fp, Walk *wp, int flags); - - if (flags == 0 || (flags & ~(OREAD|OWRITE)) != 0) { - errno = 1; - return -1; - } - - - lim = &bss->filtbl[NR_FILS]; - for (fp = bss->filtbl; fp < lim && !fp->dev; fp++) - ; - - if (fp == lim) { - errno = 1; - return -1; - } - - if (!walk(name, &w)) - return -1; - - if (w.remaning) { - errno = 1; - return -1; - } - - fn = w.dev->open; - if (fn && (*fn)(fp, &w, flags) < 0) - return -1; - - fp->off = 0; - fp->dev = w.dev; - fp->flags = flags; - - return fp - bss->filtbl; -} - -int -close(int fd) -{ - File *fp; - int (*fn)(File *fp); - - if ((fp = validfd(fd)) == NULL) - return -1; - - fn = fp->dev->close; - if (fn && (*fn)(fp) < 0) - return -1; - - fp->entry = NULL; - fp->off = 0; - fp->dev = NULL; - fp->flags = 0; - - return 0; -} - -int -read(int fd, void *buf, int n) -{ - File *fp; - int (*fn)(File *fp, void *buf, int n); - - if ((fp = validfd(fd)) == NULL) - return -1; - - if ((fp->flags & OREAD) == 0) { - errno = 1; - return -1; - } - - fn = fp->dev->read; - if (!fn) { - errno = 1; - return -1; - } - - return (*fn)(fp, buf, n); -} - -int -write(int fd, void *buf, int n) -{ - File *fp; - int (*fn)(File *fp, void *buf, int n); - - if ((fp = validfd(fd)) == NULL) - return -1; - - if ((fp->flags & OWRITE) == 0) { - errno = 1; - return -1; - } - - fn = fp->dev->write; - if (!fn) { - errno = 1; - return -1; - } - - return (*fn)(fp, buf, n); -} - -int -seek(int fd, off_t off, int whence) -{ - File *fp; - int (*fn)(File *fp, off_t off, int whence); - - if ((fp = validfd(fd)) == NULL) - return -1; - - fn = fp->dev->seek; - if (!fn) { - errno = 1; - return -1; - } - - return (*fn)(fp, off, whence); -} - -static int -validname(const char *name) -{ - const char *s; - size_t len; - - if (!name) - return 0; - - len = strlen(name); - if (len == 0 || len >= DIRLEN) - return 0; - - for (s = name; *s; ++s) { - switch (*s) { - case '/': - case ' ': - case '\n': - case '\t': - return 0; - } - } - return 1; -} - -int -create(const char *name, int flags) -{ - Entry *ep, *lim; - Walk w; - int mode; - - mode = flags & (OREAD|OWRITE); - if (mode == 0) { - errno = 1; - return -1; - } - - if (!walk(name, &w)) - return -1; - - if (!validname(w.remaning)) { - errno = 2; - return -1; - } - - if ((w.entry->flags & OCREATE) == 0) { - errno = 3; - return -1; - } - - lim = &bss->enttbl[NR_ENTS]; - for (ep = bss->enttbl; ep < lim && ep->dev ; ep++) - ; - if (ep == lim) { - errno = 4; - return -1; - } - - ep->size = 0; - ep->flags = flags; - ep->arg = NULL; - ep->name = w.remaning; - ep->dev = w.dev; - ep->next = w.entry->arg; - w.entry->arg = ep; - return 0; + return NULL; } diff --git a/drivers/dev.h b/drivers/dev.h @@ -1,27 +1,22 @@ #include <stddef.h> -typedef int off_t; -typedef struct dev Dev; -typedef struct walk Walk; -typedef struct entry Entry; -typedef struct file File; +#define NR_CHANS 4 -struct walk { - const Dev *dev; - Entry *entry; - const char *remaning; -}; +typedef struct dev Dev; +typedef struct chan Chan; struct dev { char id; - const char *name; - unsigned short flags; - int (*open)(File *fp, Walk *wp, int flags); - int (*close)(File *fp); - int (*read)(File *fp, void *buf, int n); - int (*write)(File *fp, void *buf, int n); - int (*seek)(File *fp, off_t off, int whence); - int (*walk)(Walk *wp, const char *name, int len); + char *name; +}; + +struct chan { + unsigned char type; + unsigned char dev; + unsigned short qid; + unsigned char mode; + unsigned char iref; + unsigned long long offset; /* 2 bytes of padding here */ }; -extern Walk *walk(const char *name, Walk *wp); +extern Dev *const devtab[]; diff --git a/drivers/devroot.c b/drivers/devroot.c @@ -1,97 +1,6 @@ -#include <errno.h> -#include <string.h> - -#include <libk.h> -#include <rcode.h> - #include "dev.h" -static int -ropen(File *fp, Walk *wp, int flags) -{ - fp->entry->arg = wp->entry->arg; - return 0; -} - -static int -rwalk(Walk *wp, const char *name, int len) -{ - Entry *ep; - - for (ep = wp->entry->arg; ep; ep = ep->next) { - if (!strncmp(name, ep->name, len)) - break; - } - if (!ep) - return 0; - wp->dev = ep->dev; - wp->entry = ep; - - return 1; -} - -static int -rwrite(File *fp, void *buf, int n) -{ - Entry *ep; - - ep = fp->entry->arg; - if (!ep) - return 0; - - if ((ep->flags & OWRITE) == 0) { - errno = 1; - return -1; - } - return 0; -} - -static int -rread(File *fp, void *buf, int n) -{ - int len; - Entry *ep; - off_t off; - - ep = fp->entry; - if ((fp->flags & OREAD) == 0) { - errno = 1; - return -1; - } - - if ((ep->flags & ODIR) == 0) { - len = 0; - } else { - off = 0; - for (ep = ep->arg; ep; ep = ep->next) { - if (fp->off == off) - break; - off++; - } - - if (!ep) - return 0; - - len = ksnprint(buf, n, - "%c%c%c %s %llu", - (ep->flags & ODIR) ? 'd' : '-', - (ep->flags & OREAD) ? 'r' : '-', - (ep->flags & OWRITE) ? 'r' : '-', - ep->name, - (unsigned long long) ep->size); - if (len >= n) { - errno = 1; - return -1; - } - fp->off++; - } - - return len; -} - -Dev dirfs = { - .open = ropen, - .read = rread, - .write = rwrite, - .walk = rwalk, +const Dev devroot = { + .id = '/', + .name = "root", }; diff --git a/drivers/devuart.c b/drivers/devuart.c @@ -1,8 +1,6 @@ -#include <uart.h> -#include <rcode.h> +#include "dev.h" -#define NRETRY 10000 - -#define CR 0x30 -#define FBRD 0x28 -#define IBRD 0x2 -\ No newline at end of file +const Dev devuart = { + .id = 't', + .name = "uart", +}; diff --git a/include/rcode.h b/include/rcode.h @@ -17,16 +17,6 @@ #define IENABLE 1 #define IDISABLE 0 -#define NR_ENTS 20 /* TODO: This must go away of here */ -#define NR_FILS 8 /* TODO: This must go away of here */ -#define DIRLEN 10 - -typedef struct rmucmd Rmucmd; -typedef int off_t; -typedef struct entry Entry; /* TODO: This must go away of here */ -typedef struct file File; /* TODO: This must go away of here */ -typedef struct dev Dev; /* TODO: This must go away of here */ - enum devflags { OCREATE = 1 << 0, OREAD = 1 << 1, @@ -34,21 +24,7 @@ enum devflags { ODIR = 1 << 3, }; -struct entry { - const char *name; - const Dev *dev; - void *arg; - size_t size; - unsigned short flags; - Entry *next; -}; - -struct file { - off_t off; - const Dev *dev; - Entry *entry; - unsigned short flags; -}; +typedef struct rmucmd Rmucmd; struct bssmap { unsigned char in_panic; @@ -69,13 +45,6 @@ struct bssmap { unsigned char hascrypto; /* System-wide memory encryption */ int errno_; - int ndir; - int nfil; - Entry root; - Entry driver; - Entry *cwd; - Entry enttbl[NR_ENTS]; - File filtbl[NR_FILS]; }; struct rowidx { @@ -113,11 +82,6 @@ struct rmucmd { unsigned class, func; }; -struct tree { - char *name; - int flags; -}; - extern noreturn void halt(void); extern noreturn void panic(const char *msg); extern noreturn void swtch(struct trapframe *fp); @@ -132,7 +96,7 @@ extern int open(const char *name, int flags); extern int close(int fd); extern int read(int fd, void *buf, int n); extern int write(int fd, void *buf, int n); -extern int seek(int fd, off_t off, int whence); +extern int seek(int fd, long long off, int whence); extern int bind(const char *path, char *where); /* architectural functions */ diff --git a/src/ramfw/fs.c b/src/ramfw/fs.c @@ -5,6 +5,6 @@ int open(const char *name, int flags){return 0;} int close(int fd){return 0;} int read(int fd, void *buf, int n){return 0;} int write(int fd, void *buf, int n){return 0;} -int seek(int fd, off_t off, int whence){return 0;} +int seek(int fd, long long off, int whence){return 0;} int chdir(const char *path){return 0;} int bind(const char *path, char *where){return 0;} diff --git a/src/romfw/dlang.c b/src/romfw/dlang.c @@ -238,9 +238,9 @@ do_help(const struct cmd *cmd, struct args *args) static int do_cat(const struct cmd *cmd, struct args *args) { +#if 0 int fd, n; char buf[100]; - if ((fd = open(args->argv[1], OREAD)) < 0) return -1; @@ -249,6 +249,7 @@ do_cat(const struct cmd *cmd, struct args *args) if (close(fd) < 0 || n < 0) return -1; +#endif return 0; }