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:
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;
}