9os

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

commit 9d8e279acb98c81dc2e828817e83d89d58b42b9c
parent 8be45eb61d70f166d9863d2685a51f113d65aa0e
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Fri,  2 Oct 2020 22:19:44 +0200

os9: Rework printk()

All the printing system was using file descriptors,
that is an abstraction that is part of the user space
instead of being part of the kernel. It is needed a
better separation between os9.h and io.h, using the
second one only for user space and the second for
kernel space.

Change-Id: I57d091ae09c868d4da8a8f9ee74ce127322cff77

Diffstat:
Minclude/features.h | 7+++----
Minclude/libk.h | 33++++++++++++++++++++-------------
Ainclude/os9/const.h | 9+++++++++
Minclude/os9/io.h | 39++++-----------------------------------
Minclude/os9/os9.h | 62+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
Mscripts/rules.mk | 4+---
Msrc/Makefile | 2+-
Dsrc/lib9p/Makefile | 17-----------------
Dsrc/lib9p/closedir.c | 14--------------
Dsrc/lib9p/dirstat.c | 17-----------------
Dsrc/lib9p/dirtop9.c | 35-----------------------------------
Dsrc/lib9p/opendir.c | 36------------------------------------
Dsrc/lib9p/p9todir.c | 42------------------------------------------
Dsrc/lib9p/readdir.c | 24------------------------
Asrc/libio/Makefile | 15+++++++++++++++
Asrc/libio/closedir.c | 13+++++++++++++
Asrc/libio/opendir.c | 31+++++++++++++++++++++++++++++++
Asrc/libio/readdir.c | 23+++++++++++++++++++++++
Msrc/libk/Makefile | 32+++++++++++++++-----------------
Dsrc/libk/__assert.c | 10----------
Asrc/libk/dirstat.c | 20++++++++++++++++++++
Asrc/libk/dirtop9.c | 35+++++++++++++++++++++++++++++++++++
Msrc/libk/doprnt.c | 26++++++++++++++++----------
Msrc/libk/fromstring.c | 1+
Asrc/libk/kassert.c | 9+++++++++
Dsrc/libk/kerror.c | 12------------
Dsrc/libk/kgetc.c | 11-----------
Msrc/libk/kgets.c | 6+++---
Msrc/libk/kprint.c | 3+--
Dsrc/libk/kputc.c | 11-----------
Dsrc/libk/kputs.c | 11-----------
Msrc/libk/ksnprint.c | 1-
Dsrc/libk/kstd.c | 3---
Msrc/libk/kvprint.c | 3+--
Dsrc/libk/loadimg.c | 42------------------------------------------
Asrc/libk/p9todir.c | 39+++++++++++++++++++++++++++++++++++++++
Msrc/libk/stream.h | 1-
Msrc/libk/tostring.c | 1+
Msrc/os9/arch/arm64/main.c | 96++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Msrc/os9/arch/arm64/panic.c | 23++++++++++++-----------
Msrc/os9/arch/arm64/svc.c | 12++++++------
Msrc/os9/dev/Makefile.drv | 8+++++---
Msrc/os9/dev/dev.c | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
Msrc/os9/dev/dev.h | 10----------
Msrc/os9/dev/devar.c | 12+++++-------
Msrc/os9/dev/devblk.c | 2--
Msrc/os9/dev/devcons.c | 8+++-----
Msrc/os9/dev/devfip.c | 13++++++-------
Msrc/os9/dev/devproc.c | 1-
Msrc/os9/dev/devroot.c | 1-
Msrc/os9/dev/devuart.c | 2+-
Msrc/os9/dev/dummyblk.c | 3---
Msrc/os9/dev/dummyuart.c | 1-
Msrc/os9/dev/mkdev | 2+-
Msrc/os9/dev/pl011.c | 1-
Msrc/os9/dlang.c | 97++++++++++++++++++++++++++++++++++---------------------------------------------
Msrc/os9/hosted/arch.c | 5++---
Msrc/os9/hosted/main.c | 81+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
58 files changed, 559 insertions(+), 603 deletions(-)

diff --git a/include/features.h b/include/features.h @@ -1,9 +1,10 @@ #ifndef FEATURES_H_ #define FEATURES_H_ +#define USED(x) ((void) x) +#define NELEM(tab) (sizeof(tab) / sizeof((tab)[0])) + #if __GNUC__ || __clang__ - #define KPRINTFMT __attribute__ ((format (printf, 2, 3))) - #define KSNPRINTFMT __attribute__ ((format (printf, 3, 4))) #define noreturn __attribute__((__noreturn__)) #else #if __STDC_VERSION__ >= 201112L @@ -11,8 +12,6 @@ #else #define noreturn #endif - #define KPRINTFMT - #define KSNPRINTFMT #endif #endif diff --git a/include/libk.h b/include/libk.h @@ -1,18 +1,25 @@ #include <stdarg.h> #include <stddef.h> -#include <os9/io.h> +#undef assert +#ifndef NDEBUG +# define assert(exp) ((exp) ? (void) 0 : kassert(#exp, __FILE__, __LINE__)) +#else +# define assert(exp) ((void)0) +#endif -#include "features.h" - -extern int kprint(int fd, const char *fmt, ...) KPRINTFMT; -extern int ksnprint(char *str, size_t len, const char *fmt, ...) KSNPRINTFMT; -extern char *kgets(int fd, char *s, int n); -extern int kgetc(int fd); -extern int kputc(int fd, int ch); -extern int kputs(int fd, const char *s); -extern int kvprint(int fd, const char *fmt, va_list va); -extern void kerror(const char *s); -extern int putenv(char *name); +extern int kprint(const char *fmt, ...); +extern int ksnprint(char *str, size_t len, const char *fmt, ...); +extern int kvprint(const char *fmt, va_list va); +extern char *kgets(char *s, int n); extern int tokenize(char *line, int siz, char *tokens[], int ntoks); -extern int loadimg(char *name, void *dst, long *n); +extern void kassert(char *exp, char *file, long line); + +#ifdef OS9_H +extern int p9todir(Dir *, unsigned char *, int); +extern int dirtop9(Dir *, unsigned char *, int); +extern int dirstat(char *name, Dir *dir); +#endif + +extern int getch(void); +extern void putch(int c); diff --git a/include/os9/const.h b/include/os9/const.h @@ -0,0 +1,9 @@ +#define NAMELEN 14 /* Maximum length of a file name */ +#define PATHLEN 41 /* Maximum length of a path */ +#define STATLEN 41 /* Size of static part of dir format */ +#define ROOTLEN (2 + 4) /* Size needed to encode root string */ +#define FILNAMLEN (2 + NAMELEN) /* Size needed to encode filename */ +#define DIRLEN (STATLEN + FILNAMLEN + 3*ROOTLEN) /* Size of dir entry */ + +#define USERLEN 20 +#define LINELEN 80 diff --git a/include/os9/io.h b/include/os9/io.h @@ -1,21 +1,11 @@ #ifndef IO_H #define IO_H -#define NAMELEN 14 /* Maximum length of a file name */ -#define PATHLEN 41 /* Maximum length of a path */ -#define STATLEN 41 /* Size of static part of dir format */ -#define ROOTLEN (2 + 4) /* Size needed to encode root string */ -#define FILNAMLEN (2 + NAMELEN) /* Size needed to encode filename */ -#define DIRLEN (STATLEN + FILNAMLEN + 3*ROOTLEN) /* Size of dir entry */ +#include <os9/const.h> -#define KSEEK_SET 0 -#define KSEEK_CUR 1 -#define KSEEK_END 2 - -#define QID(t, v, p) ((Qid) {.type = (t), .vers = (v), .path = (p)}) - -typedef struct dir Dir; -typedef struct qid Qid; +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 enum devflags { O_READ = 1 << 0, @@ -26,21 +16,6 @@ enum devflags { O_STAT = 1 << 5, }; -struct qid { - unsigned long long path; - unsigned long vers; - unsigned char type; -}; - -struct dir { - char name[NAMELEN]; - long length; - unsigned char mode; - unsigned char type; - unsigned char dev; - Qid qid; -}; - struct dirent { char d_name[NAMELEN]; }; @@ -50,13 +25,9 @@ typedef struct { unsigned char buf[DIRLEN]; } DIR; -extern int dirtop9(Dir *dp, unsigned char *buf, int n); -extern int p9todir(Dir *dp, unsigned char *buf, int n); - extern DIR *opendir(char *name); extern int readdir(DIR *dir, struct dirent *ent); extern int closedir(DIR *dir); -extern int dirstat(char *name, Dir *dir); /* driver functions */ extern int mount(char *srv, char *mnt, char *spec); @@ -71,6 +42,4 @@ extern int stat(char *path, void *buf, int n); extern int fsync(int fd); extern void sync(void); -extern int kin, kout, kerr; - #endif /* IO_H */ diff --git a/include/os9/os9.h b/include/os9/os9.h @@ -1,24 +1,23 @@ #include <stddef.h> #include <stdint.h> -#include <setjmp.h> #include <arch/types.h> +#include <os9/const.h> #include "../features.h" +#define OS9_H + #ifndef NDEBUG #define dbg kprint #else #define dbg #endif -#define NELEM(tab) (sizeof(tab) / sizeof((tab)[0])) - #define NR_TASKS 16 #define NR_PROCS 32 #define NR_WINS 32 -#define LINELEN 80 #define PAGESIZE 4096 #define ENABLE 1 #define DISABLE 0 @@ -27,10 +26,33 @@ #define MiB (1024u * KiB) #define GiB (1024ul * MiB) +#define QID(t, v, p) ((Qid) {.type = (t), .vers = (v), .path = (p)}) + +#ifdef SEEK_SET +#error stdio included +#endif + +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#define EOF -1 + typedef struct context Context; typedef struct proc Proc; typedef struct task Task; typedef struct win Win; +typedef struct chan Chan; +typedef struct qid Qid; +typedef struct dir Dir; + +enum devflags { + O_READ = 1 << 0, + O_WRITE = 1 << 1, + O_RDWR = 1 << 2, + O_BIND = 1 << 3, + O_DIR = 1 << 4, + O_STAT = 1 << 5, +}; enum pstates { PSYSTEM = 1 << 0, @@ -61,6 +83,30 @@ enum start_reason { SNORMAL, }; +struct qid { + unsigned long long path; + unsigned long vers; + unsigned char type; +}; + +struct dir { + char name[NAMELEN]; + long length; + unsigned char mode; + unsigned char type; + unsigned char dev; + Qid qid; +}; + +struct chan { + long offset; + Qid qid; + unsigned char type; + unsigned char dev; + unsigned char mode; + mutex_t mutex; +}; + struct task { int tid; @@ -134,6 +180,12 @@ extern void lock(mutex_t *m); extern void unlock(mutex_t *m); extern int trylock(mutex_t *m); +/* devices functions */ +extern Chan *devopen(char *name, int mode); +extern int devwrite(Chan *c, void *buf, int n); +extern int devread(Chan *c, void *buf, int n); +extern int devclose(Chan *c); + /* sched.c */ extern Proc *getproc(int); extern Proc *getnproc(int); @@ -142,8 +194,8 @@ extern Task *gettask(Proc *, int); extern void sched(void); /* globals */ -extern jmp_buf dbgrecover; extern const char *const regnames[]; +extern Chan *console; /* per cpu globals */ extern Proc *proc; diff --git a/scripts/rules.mk b/scripts/rules.mk @@ -12,7 +12,7 @@ SRCDIR = $(PROJECTDIR)/src SCRIPTDIR = $(PROJECTDIR)/scripts CONFDIR = $(PROJECTDIR)/config INCLUDES = -I$(INCDIR) -I$(INCDIR)/bits/$(ARCH)/ -I$(INCDIR)/bits/$(SYS) -LIBS = -l9p -lk -lc +LIBS = -lk -lc ENVIRON = $(SCRIPTDIR)/env.sh LIBDEP = $(LIBDIR)/libk.a \ @@ -42,8 +42,6 @@ PROJ_LDLIBS = $(MORELDLIBS) \ $(SYSLDLIBS) \ $(LDLIBS) -EMUCMD = $(EMU) $(EMUFLAGS) - CC = $(CROSS_COMPILE)$(COMP) AS = $(CROSS_COMPILE)$(ASM) LD = $(CROSS_COMPILE)$(LINKER) diff --git a/src/Makefile b/src/Makefile @@ -3,7 +3,7 @@ PROJECTDIR=.. include $(PROJECTDIR)/scripts/rules.mk LIBS =\ - lib9p\ + libio\ libk\ libc\ diff --git a/src/lib9p/Makefile b/src/lib9p/Makefile @@ -1,17 +0,0 @@ -.POSIX: -PROJECTDIR=../.. -include $(PROJECTDIR)/scripts/rules.mk - -OBJS = dirtop9.o \ - p9todir.o \ - opendir.o \ - readdir.o \ - closedir.o \ - dirstat.o \ - -TARGET = $(LIBDIR)/lib9p.a - -all: $(TARGET) - -$(TARGET): $(OBJS) - mklib -o $@ $? diff --git a/src/lib9p/closedir.c b/src/lib9p/closedir.c @@ -1,14 +0,0 @@ -#include <errno.h> -#include <string.h> - -#include <os9/io.h> -#include <os9/os9.h> - -int -closedir(DIR *dir) -{ - int fd = dir->fd; - - dir->fd = 0; - return close(fd); -} diff --git a/src/lib9p/dirstat.c b/src/lib9p/dirstat.c @@ -1,17 +0,0 @@ -#include <errno.h> -#include <os9/io.h> - -int -dirstat(char *name, Dir *dir) -{ - unsigned char buf[DIRLEN]; - int n; - - if ((n = stat(name, buf, sizeof(buf))) < 0) - return -1; - - if (p9todir(dir, buf, n) < 0) - return -1; - - return 0; -} diff --git a/src/lib9p/dirtop9.c b/src/lib9p/dirtop9.c @@ -1,35 +0,0 @@ -#include <assert.h> -#include <serialize.h> - -#include <os9/io.h> - -int -dirtop9(Dir *dp, unsigned char *buf, int n) -{ - int len; - unsigned char *p; - - if (n < DIRLEN) - return 0; - - p = buf + 2; - SHORT(dp->type, p); /* type */ - LONG(dp->dev, p); /* dev */ - CHAR(dp->qid.type, p); /* qid.type */ - LONG(dp->qid.vers, p); /* qid.vers */ - LLONG(dp->qid.path, p);/* qid.path */ - LONG(0, p); /* mode */ - LONG(0, p); /* atime */ - LONG(0, p); /* mtime */ - LLONG(dp->length, p); /* length */ - STRING("root", p); /* uid */ - STRING("root", p); /* gid */ - STRING("root", p); /* muid */ - STRING(dp->name, p); /* name */ - len = p - buf; - SHORT(len, buf); /* size */ - - assert(len < DIRLEN); - - return len; -} diff --git a/src/lib9p/opendir.c b/src/lib9p/opendir.c @@ -1,36 +0,0 @@ -#include <errno.h> -#include <string.h> - -#include <os9/io.h> -#include <os9/os9.h> - -#define NR_DIRS 2 - - -/* - * This code assumes that open is not going to - * return 0 because it is the console fd. - */ -DIR * -opendir(char *name) -{ - int fd; - DIR *dir; - static DIR dirs[NR_DIRS]; - - for (dir = dirs; dir < &dirs[NR_DIRS] && dir->fd; ++dir) - ; - - if (dir == &dirs[NR_DIRS]) { - errno = ENOMEM; - return NULL; - } - - if ((fd = open(name, O_READ)) < 0) - return NULL; - dir->fd = fd; - - /* TODO: check that it is actually a directory */ - - return dir; -} diff --git a/src/lib9p/p9todir.c b/src/lib9p/p9todir.c @@ -1,42 +0,0 @@ -#include <assert.h> -#include <deserialize.h> -#include <errno.h> -#include <stddef.h> - -#include <os9/io.h> - -#define USED(x) ((void) x) -#define USERLEN 20 - -int -p9todir(Dir *dp, unsigned char *buf, int size) -{ - int n, len, type; - long l, vers; - unsigned long long path; - - n = 0; - SHORT(len, buf, n, size); /* len */ - SHORT(dp->type, buf, n, size); /* type */ - LONG(dp->dev, buf, n, size); /* dev */ - CHAR(type, buf, n, size); /* qid.type */ - LONG(vers, buf, n, size); /* qid.vers */ - LLONG(path, buf, n, size); /* qid.path */ - LONG(l, buf, n, size); /* mode */ - LONG(l, buf, n, size); /* atime */ - LONG(l, buf, n, size); /* mtime */ - LLONG(dp->length, buf, n, size); /* length */ - STRING(NULL, USERLEN, buf, n, size); /* uid */ - STRING(NULL, USERLEN, buf, n, size); /* gid */ - STRING(NULL, USERLEN, buf, n, size); /* muid */ - STRING(dp->name, NAMELEN, buf, n, size); /* name */ - USED(l); - - if (len != n) { - errno = EINVAL; - return -1; - } - dp->qid = QID(type, vers, path); - - return n; -} diff --git a/src/lib9p/readdir.c b/src/lib9p/readdir.c @@ -1,24 +0,0 @@ -#include <errno.h> -#include <string.h> - -#include <os9/io.h> -#include <os9/os9.h> - -int -readdir(DIR *dir, struct dirent *ent) -{ - int n; - Dir dentry; - - if ((n = read(dir->fd, dir->buf, sizeof(dir->buf))) <= 0) - return n; - - if (p9todir(&dentry, dir->buf, n) < 0) { - errno = EINVAL; - return -1; - } - - strcpy(ent->d_name, dentry.name); - - return 1; -} diff --git a/src/libio/Makefile b/src/libio/Makefile @@ -0,0 +1,15 @@ +.POSIX: +PROJECTDIR=../.. +include $(PROJECTDIR)/scripts/rules.mk + +OBJS =\ + opendir.o \ + readdir.o \ + closedir.o \ + +TARGET = $(LIBDIR)/lib9p.a + +all: $(TARGET) + +$(TARGET): $(OBJS) + mklib -o $@ $? diff --git a/src/libio/closedir.c b/src/libio/closedir.c @@ -0,0 +1,13 @@ +#include <errno.h> +#include <string.h> + +#include <os9/io.h> + +int +closedir(DIR *dir) +{ + int fd = dir->fd; + + dir->fd = 0; + return close(fd); +} diff --git a/src/libio/opendir.c b/src/libio/opendir.c @@ -0,0 +1,31 @@ +#include <errno.h> +#include <string.h> + +#include <os9/io.h> + +#define NR_DIRS 12 + + +DIR * +opendir(char *name) +{ + int fd; + DIR *dir; + static DIR dirs[NR_DIRS]; + + for (dir = dirs; dir < &dirs[NR_DIRS] && dir->fd; ++dir) + ; + + if (dir == &dirs[NR_DIRS]) { + errno = ENOMEM; + return NULL; + } + + if ((fd = open(name, O_READ)) < 0) + return NULL; + dir->fd = fd; + + /* TODO: check that it is actually a directory */ + + return dir; +} diff --git a/src/libio/readdir.c b/src/libio/readdir.c @@ -0,0 +1,23 @@ +#include <errno.h> +#include <string.h> + +#include <os9/io.h> + +int +readdir(DIR *dir, struct dirent *ent) +{ + int n; +/* + Dir dentry; + + if ((n = read(dir->fd, dir->buf, sizeof(dir->buf))) <= 0) + return n; + + if (p9todir(&dentry, dir->buf, n) < 0) { + return -1; + } + strcpy(ent->d_name, dentry.name); +*/ + + return 1; +} diff --git a/src/libk/Makefile b/src/libk/Makefile @@ -2,23 +2,21 @@ PROJECTDIR=../.. include $(PROJECTDIR)/scripts/rules.mk -OBJS = doprnt.o \ - kprint.o \ - ksnprint.o \ - kgetc.o \ - kputc.o \ - kputs.o \ - kvprint.o \ - kgets.o \ - kerror.o \ - tokenize.o \ - kstd.o \ - frombytes.o \ - fromstring.o \ - tobytes.o \ - tostring.o \ - loadimg.o \ - __assert.o \ +OBJS =\ + doprnt.o\ + kprint.o\ + ksnprint.o\ + kvprint.o\ + kgets.o\ + tokenize.o\ + frombytes.o\ + fromstring.o\ + tobytes.o\ + tostring.o\ + kassert.o\ + dirtop9.o\ + p9todir.o\ + dirstat.o\ TARGET = $(LIBDIR)/libk.a diff --git a/src/libk/__assert.c b/src/libk/__assert.c @@ -1,10 +0,0 @@ -#include <assert.h> -#include <stdlib.h> - -#include <libk.h> - -void __assert(char *exp, char *file, long line) -{ - kprint(kerr, "%s:%ld: assertion failed '%s'\n", file, line, exp); - abort(); -} diff --git a/src/libk/dirstat.c b/src/libk/dirstat.c @@ -0,0 +1,20 @@ +#include <os9/os9.h> + +#include <errno.h> + +#include <libk.h> + +int +dirstat(char *name, Dir *dir) +{ + unsigned char buf[DIRLEN]; + int n; + + if ((n = stat(name, buf, sizeof(buf))) < 0) + return -1; + + if (p9todir(dir, buf, n) < 0) + return -1; + + return 0; +} diff --git a/src/libk/dirtop9.c b/src/libk/dirtop9.c @@ -0,0 +1,35 @@ +#include <os9/os9.h> + +#include <libk.h> +#include <serialize.h> + +int +dirtop9(Dir *dp, unsigned char *buf, int n) +{ + int len; + unsigned char *p; + + if (n < DIRLEN) + return 0; + + p = buf + 2; + SHORT(dp->type, p); /* type */ + LONG(dp->dev, p); /* dev */ + CHAR(dp->qid.type, p); /* qid.type */ + LONG(dp->qid.vers, p); /* qid.vers */ + LLONG(dp->qid.path, p);/* qid.path */ + LONG(0, p); /* mode */ + LONG(0, p); /* atime */ + LONG(0, p); /* mtime */ + LLONG(dp->length, p); /* length */ + STRING("root", p); /* uid */ + STRING("root", p); /* gid */ + STRING("root", p); /* muid */ + STRING(dp->name, p); /* name */ + len = p - buf; + SHORT(len, buf); /* size */ + + assert(len < DIRLEN); + + return len; +} diff --git a/src/libk/doprnt.c b/src/libk/doprnt.c @@ -1,19 +1,20 @@ +#include <errno.h> #include <stdarg.h> #include <stddef.h> +#include <string.h> #include <libk.h> #include "stream.h" -#include "../libc/syscall.h" static void -putch(Stream *sp, int c) +printc(Stream *sp, int c) { - if (sp->fd < 0) { + if (sp->base) { if (sp->cnt < sp->len) sp->base[sp->cnt++] = c; } else { - kputc(sp->fd, c); + putch(c); sp->cnt++; } } @@ -40,7 +41,7 @@ printn(Stream *sp, long long n, int base, int sign, int fill) if (sign && n < 0) { n = -n; - putch(sp, '-'); + printc(sp, '-'); } for (first = 1; div > 0; div /= base) { @@ -48,7 +49,7 @@ printn(Stream *sp, long long n, int base, int sign, int fill) if (d == 0 && first && div != 1 && !fill) continue; n -= d * div; - putch(sp, digits[d]); + printc(sp, digits[d]); first = 0; } } @@ -82,7 +83,7 @@ doprnt(Stream *sp, const char *fmt, va_list va) va_copy(va2, va); while (( c = *fmt++) != '\0') { if (c != '%') { - putch(sp, c); + printc(sp, c); continue; } @@ -115,14 +116,19 @@ flags: print_number: printn(sp, getnum(&va2, size), base, sign, fill); break; + case 'e': + s = strerror(errno); + goto printout; case 's': - for (s = va_arg(va2, char *); *s; s++) - putch(sp, *s); + s = va_arg(va2, char *); + printout: + while (*s) + printc(sp, *s++); break; case 'c': c = va_arg(va2, int); case '%': - putch(sp, c); + printc(sp, c); break; case '\0': goto out_loop; diff --git a/src/libk/fromstring.c b/src/libk/fromstring.c @@ -1,4 +1,5 @@ #include <string.h> + #include <deserialize.h> char * diff --git a/src/libk/kassert.c b/src/libk/kassert.c @@ -0,0 +1,9 @@ +#include <os9/os9.h> + +#include <libk.h> + +void kassert(char *exp, char *file, long line) +{ + kprint("%s:%ld: assertion failed '%s'\n", file, line, exp); + halt(); +} diff --git a/src/libk/kerror.c b/src/libk/kerror.c @@ -1,12 +0,0 @@ -#include <errno.h> -#include <string.h> - -#include <libk.h> - -void -kerror(const char *s) -{ - char *msg = strerror(errno); - - kprint(kerr, "%s: %s\n", s, msg); -} diff --git a/src/libk/kgetc.c b/src/libk/kgetc.c @@ -1,11 +0,0 @@ -#include <stdio.h> - -#include <libk.h> - -int -kgetc(int fd) -{ - char ch; - - return (read(fd, &ch, 1) < 0) ? EOF : ch; -} diff --git a/src/libk/kgets.c b/src/libk/kgets.c @@ -1,14 +1,14 @@ -#include <stdio.h> +#include <os9/os9.h> #include <libk.h> char * -kgets(int fd, char *s, int n) +kgets(char *s, int n) { int ch = 0; char *t = s; - while (--n > 0 && (ch = kgetc(fd)) != EOF) { + while (--n > 0 && (ch = getch()) != EOF) { if ((*t++ = ch) == '\n') break; } diff --git a/src/libk/kprint.c b/src/libk/kprint.c @@ -5,12 +5,11 @@ #include "stream.h" int -kprint(int fd, const char *fmt, ...) +kprint(const char *fmt, ...) { va_list ap; Stream stream; - stream.fd = fd; stream.base = NULL; stream.len = 0; stream.cnt = 0; diff --git a/src/libk/kputc.c b/src/libk/kputc.c @@ -1,11 +0,0 @@ -#include <stdio.h> - -#include <libk.h> - -int -kputc(int fd, int ch) -{ - char c = ch; - - return (write(fd, &c, 1) < 0) ? EOF : 1; -} diff --git a/src/libk/kputs.c b/src/libk/kputs.c @@ -1,11 +0,0 @@ -#include <stdio.h> - -#include <libk.h> - -int -kputs(int fd, const char *s) -{ - for ( ; *s && kputc(fd, *s) != EOF; ++s) - ; - return (*s != '\0') ? EOF : 0; -} diff --git a/src/libk/ksnprint.c b/src/libk/ksnprint.c @@ -11,7 +11,6 @@ ksnprint(char *str, size_t len, const char *fmt, ...) va_list ap; Stream stream; - stream.fd = -1; stream.base = str; stream.len = len; stream.cnt = 0; diff --git a/src/libk/kstd.c b/src/libk/kstd.c @@ -1,3 +0,0 @@ -#include <os9/io.h> - -int kin, kout, kerr; diff --git a/src/libk/kvprint.c b/src/libk/kvprint.c @@ -6,13 +6,12 @@ #include "stream.h" int -kvprint(int fd, const char *fmt, va_list va) +kvprint(const char *fmt, va_list va) { va_list ap; Stream stream; va_copy(ap, va); - stream.fd = fd; stream.base = NULL; stream.len = 0; stream.cnt = 0; diff --git a/src/libk/loadimg.c b/src/libk/loadimg.c @@ -1,42 +0,0 @@ -#include <errno.h> - -#include <libk.h> -#include <limits.h> -#include <os9/os9.h> - -int -loadimg(char *name, void *dst, long *n) -{ - int err = -1; - int fd; - Dir dir; - long cnt, r; - char *d = dst; - - if (dirstat(name, &dir) < 0) - goto err0; - if ((fd = open(name, O_READ)) < 0) - goto err0; - - if (n && dir.length > *n && *n > 0) - dir.length = *n; - - for (cnt = dir.length; cnt > 0; cnt -= r) { - r = (cnt > INT_MAX) ? INT_MAX : cnt; - r = read(fd, d, r); - if (r == 0) - break; - if (r < 0) - goto err1; - d += r; - } - - if (n) - *n = dir.length - cnt; - err = 0; - -err1: - close(fd); -err0: - return err; -} diff --git a/src/libk/p9todir.c b/src/libk/p9todir.c @@ -0,0 +1,39 @@ +#include <os9/os9.h> + +#include <errno.h> + +#include <deserialize.h> +#include <libk.h> + +int +p9todir(Dir *dp, unsigned char *buf, int size) +{ + int n, len, type; + long l, vers; + unsigned long long path; + + n = 0; + SHORT(len, buf, n, size); /* len */ + SHORT(dp->type, buf, n, size); /* type */ + LONG(dp->dev, buf, n, size); /* dev */ + CHAR(type, buf, n, size); /* qid.type */ + LONG(vers, buf, n, size); /* qid.vers */ + LLONG(path, buf, n, size); /* qid.path */ + LONG(l, buf, n, size); /* mode */ + LONG(l, buf, n, size); /* atime */ + LONG(l, buf, n, size); /* mtime */ + LLONG(dp->length, buf, n, size); /* length */ + STRING(NULL, USERLEN, buf, n, size); /* uid */ + STRING(NULL, USERLEN, buf, n, size); /* gid */ + STRING(NULL, USERLEN, buf, n, size); /* muid */ + STRING(dp->name, NAMELEN, buf, n, size); /* name */ + USED(l); + + if (len != n) { + errno = EINVAL; + return -1; + } + dp->qid = QID(type, vers, path); + + return n; +} diff --git a/src/libk/stream.h b/src/libk/stream.h @@ -2,7 +2,6 @@ typedef struct stream Stream; struct stream { - int fd; char *base; size_t len; size_t cnt; diff --git a/src/libk/tostring.c b/src/libk/tostring.c @@ -1,4 +1,5 @@ #include <string.h> + #include <serialize.h> unsigned char * diff --git a/src/os9/arch/arm64/main.c b/src/os9/arch/arm64/main.c @@ -1,11 +1,10 @@ +#include <os9/os9.h> + #include <errno.h> #include <stdint.h> -#include <stdlib.h> #include <string.h> #include <libk.h> -#include <limits.h> -#include <os9/os9.h> #include "version.h" #include "sysreg.h" @@ -14,6 +13,34 @@ #define DEVICE 7 #define NORMAL 0 +Chan *console; + +int +getch(void) +{ + char ch; + + if (console) { + devread(console, &ch, 1); + return ch; + } else { + return *(char *) 0x1C090000; + } +} + +void +putch(int c) +{ + char ch; + + if (console) { + ch = c; + devwrite(console, &ch, 1); + } else { + *(char *) 0x1C090000 = c; + } +} + static unsigned long long firstmap(Mach *m) { @@ -75,51 +102,34 @@ imach(Mach *m) static void info(void) { - dbg(kout, - "os9: version %s\n", + dbg("os9: version %s\n", OS9VERSION); } static void -namespace(void) +icons(void) { - int fd; - static char setin[] = "addin /dev/uart0/raw\n"; - static char setout[] = "addout /dev/uart0/raw\n"; + static char setin[] = "addin #t0/raw\n"; + static char setout[] = "addout #t0/raw\n"; static char echo[] = "echo on\n"; static char cooked[] = "cooked on\n"; - - /* Standard input set to 0 */ - if ((kin = open("#c/raw", O_READ)) < 0) - panic("open:#c/raw read"); - - /* Standard output set to 1 */ - if ((kout = open("#c/raw", O_WRITE)) < 0) - panic("open:#c/raw write"); - - /* Standard error set to 2 */ - if ((kerr = open("#c/raw", O_WRITE)) < 0) - panic("open:#c/raw write"); - - if (bind("#c", "/dev/cons") < 0) - panic("bind:/dev/cons"); - if (bind("#t0", "/dev/uart0") < 0) - panic("bind:/dev/uart0"); - if (bind("#t1", "/dev/uart3") < 0) - panic("bind:/dev/uart3"); - - if ((fd = open("/dev/cons/ctl", O_WRITE)) < 0) - panic("open:/dev/cons/ctl write"); - if (write(fd, setin, sizeof(setin)) < 0) - panic("write:setin"); - if (write(fd, setout, sizeof(setout)) < 0) - panic("write:setout"); - if (write(fd, echo, sizeof(echo)) < 0) - panic("write:echo"); - if (write(fd, cooked, sizeof(cooked)) < 0) - panic("write:cooked"); - if (close(fd) < 0) - panic("close:/dev/cons/ctl"); + Chan *c; + + if ((c = devopen("#c/ctl", O_WRITE)) == NULL) + panic("namec:/dev/cons/ctl write"); + if (devwrite(c, setin, sizeof(setin)) < 0) + panic("devwrite:setin"); + if (devwrite(c, setout, sizeof(setout)) < 0) + panic("devwrite:setout"); + if (devwrite(c, echo, sizeof(echo)) < 0) + panic("devwrite:echo"); + if (devwrite(c, cooked, sizeof(cooked)) < 0) + panic("devwrite:cooked"); + if (devclose(c) < 0) + panic("devclose"); + + if ((console = devopen("#c/raw", O_RDWR)) == NULL) + panic("namec:#c/raw read"); } void @@ -130,8 +140,8 @@ main(Mach *m) idev(); interrupt(ENABLE); barrier(ISB); - namespace(); + icons(); info(); debug(); - panic("main"); + panic("out of sync"); } diff --git a/src/os9/arch/arm64/panic.c b/src/os9/arch/arm64/panic.c @@ -44,15 +44,16 @@ const char *const regnames[] = { }; void -dumpregs(Context *ctx, int fd) +dumpregs(Context *ctx) { int i; - for (i = 0; i < NR_REGS; i++) - kprint(fd, "%s=0x%llx%c", regnames[i], ctx->r[i], + for (i = 0; i < NR_REGS; i++) { + kprint("%s=0x%llx%c", regnames[i], ctx->r[i], (i > 0 && i % 3 == 0) ? '\n' : ' '); + } if (i % 4 != 3) - kputc(fd, '\n'); + kprint("\n'"); } static void @@ -60,10 +61,10 @@ backtrace(Context *ctx) { void **bp; - kprint(kerr, "backtrace:\n"); - kprint(kerr, "%0llx\n", ctx->r[X30]); + kprint("backtrace:\n"); + kprint("%0llx\n", ctx->r[X30]); for (bp = (void **) ctx->r[X29]; *bp; bp = (void **) *bp) - kprint(kerr, "%p\n", bp[1]); + kprint("%p\n", bp[1]); } static void @@ -71,10 +72,10 @@ dumpstack(Context *ctx) { long long *sp, i; - kprint(kerr, "stack dump:\n"); + kprint("stack dump:\n"); sp = (long long *) ctx->r[SP]; for (i = 1; i <= 16; i++) - kprint(kerr, "%0llx%c", *sp++, (i % 4 == 0) ? '\n' : ' '); + kprint("%0llx%c", *sp++, (i % 4 == 0) ? '\n' : ' '); } void @@ -86,8 +87,8 @@ panic(const char *msg) if (first) { first = 0; getctx(&ctx); - kprint(kerr, "panic: %s\n", msg); - dumpregs(&ctx, kerr); + kprint("panic: %s\n", msg); + dumpregs(&ctx); backtrace(&ctx); dumpstack(&ctx); } diff --git a/src/os9/arch/arm64/svc.c b/src/os9/arch/arm64/svc.c @@ -7,6 +7,11 @@ #include "ec.h" #include "arch.h" +static void +svc(int numsvc) +{ +} + void trap(Context *ctx) { @@ -14,7 +19,7 @@ trap(Context *ctx) const char *msg; int numsvc; - dbg(kerr, "exception handler\n"); + dbg("exception handler\n"); ec = (ctx->r[ESR] >> 26) & 0x3f; if (ec != SVC) { @@ -27,8 +32,3 @@ trap(Context *ctx) svc(numsvc); swtch(ctx); } - -void -svc(int numsvc) -{ -} diff --git a/src/os9/dev/Makefile.drv b/src/os9/dev/Makefile.drv @@ -4,9 +4,11 @@ include $(PROJECTDIR)/scripts/rules.mk include devs.mk include blobs.mk -OBJS = $(DEVS) \ - devc.o \ - +OBJS =\ + dev.o\ + devc.o \ + $(DEVS) \ + all: builtin.o builtin.o: $(OBJS) diff --git a/src/os9/dev/dev.c b/src/os9/dev/dev.c @@ -1,9 +1,10 @@ +#include <os9/os9.h> + #include <ctype.h> #include <errno.h> #include <string.h> -#include <os9/os9.h> -#include <os9/io.h> +#include <libk.h> #include "dev.h" @@ -372,32 +373,43 @@ devgen(Chan *c, Dirtab *tab, int ntab, int n, Dir *dir) return 1; } +Chan * +devopen(char *fname, int mode) +{ + if (!validmode(mode)) + return NULL; + return namec(fname, mode); +} + int open(char *fname, int mode) { - Chan *c; int r; + Chan *c; - if (!validmode(mode)) - return -1; - - if ((c = namec(fname, mode)) == NULL) + if ((c = devopen(fname, mode)) == NULL) return -1; - r = chan2fd(c); unlock(&c->mutex); + return r; } int +devclose(Chan *c) +{ + delchan(c); + return 0; +} + +int close(int fd) { Chan *c; if ((c = fd2chan(fd)) == NULL) return -1; - delchan(c); - return 0; + return devclose(c); } int @@ -479,38 +491,60 @@ stat(char *path, void *buf, int n) } int -read(int fd, void *buf, int n) +devread(Chan *c, void *buf, int n) { - Chan *c; int r = -1; - if ((c = fd2chan(fd)) == NULL) - return -1; - - if (c->qid.type == CHDIR && n < DIRLEN) + if (c->qid.type == CHDIR && n < DIRLEN) { + r = -1; errno = EINVAL; - else + } else { r = devtab[c->type]->read(c, buf, n); + } - unlock(&c->mutex); return r; } int -write(int fd, void *buf, int n) +read(int fd, void *buf, int n) { + int r; Chan *c; - int r = -1; if ((c = fd2chan(fd)) == NULL) return -1; + r = devread(c, buf, n); + unlock(&c->mutex); - if (c->qid.type == CHDIR) + return r; +} + +int +devwrite(Chan *c, void *buf, int n) +{ + int r = -1; + + if (c->qid.type == CHDIR) { + r = -1; errno = EISDIR; - else + } else { r = devtab[c->type]->write(c, buf, n); + } + + return r; +} + +int +write(int fd, void *buf, int n) +{ + int r; + Chan *c; + if ((c = fd2chan(fd)) == NULL) + return -1; + r = devwrite(c, buf, n); unlock(&c->mutex); + return r; } @@ -587,13 +621,13 @@ int devseek(Chan *c, long off, int whence) { switch (whence) { - case KSEEK_SET: + case SEEK_SET: c->offset = off; break; - case KSEEK_CUR: + case SEEK_CUR: c->offset += off; break; - case KSEEK_END: + case SEEK_END: panic("seek"); /* TODO */ break; } diff --git a/src/os9/dev/dev.h b/src/os9/dev/dev.h @@ -12,7 +12,6 @@ #define SYNCALL 1 typedef struct dev Dev; -typedef struct chan Chan; typedef struct dirtab Dirtab; typedef int Devgen(Chan *, Dirtab *, int, int, Dir *); typedef struct attr Attr; @@ -38,15 +37,6 @@ struct dev { Chan *(*mount)(Chan *c, char *spec); }; -struct chan { - long offset; - Qid qid; - unsigned char type; - unsigned char dev; - unsigned char mode; - mutex_t mutex; -}; - struct attr { char *key; char *value; diff --git a/src/os9/dev/devar.c b/src/os9/dev/devar.c @@ -1,11 +1,9 @@ -#include <assert.h> +#include <os9/os9.h> + #include <errno.h> #include <stdlib.h> #include <string.h> -#include <os9/os9.h> -#include <os9/io.h> - #include "dev.h" #define NR_ARS 2 @@ -78,7 +76,7 @@ argen(Chan *c, Dirtab *tab, int ntab, int n, Dir *dir) if (ar->offset[i] == -1) return 0; off = ar->offset[i]; - if (devtab[c->type]->seek(&nc, off, KSEEK_SET) < 0) + if (devtab[c->type]->seek(&nc, off, SEEK_SET) < 0) return -1; if ((r = gethdr(&nc, &hdr)) <= 0) return r; @@ -142,7 +140,7 @@ arread(Chan *c, void *buf, int n) n = size - c->offset; off = ar->offset[path] + c->offset + sizeof(struct ar_hdr); - if (devtab[cs.type]->seek(&cs, off, KSEEK_SET) < 0) + if (devtab[cs.type]->seek(&cs, off, SEEK_SET) < 0) return -1; n = devtab[cs.type]->read(&cs, buf, n); @@ -198,7 +196,7 @@ armount(Chan *c, char *spec) len++; t = cspec->type; - if (devtab[t]->seek(cspec, len, KSEEK_CUR) < 0) + if (devtab[t]->seek(cspec, len, SEEK_CUR) < 0) goto err; break; } diff --git a/src/os9/dev/devblk.c b/src/os9/dev/devblk.c @@ -1,10 +1,8 @@ -#include <assert.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <os9/os9.h> -#include <os9/io.h> #include "dev.h" #include "blk.h" diff --git a/src/os9/dev/devcons.c b/src/os9/dev/devcons.c @@ -1,11 +1,9 @@ -#include <assert.h> #include <os9/os9.h> -#include <os9/io.h> + +#include <libk.h> + #include <ctype.h> #include <errno.h> -#include <libk.h> -#include <stdio.h> -#include <stdlib.h> #include <string.h> #include "dev.h" diff --git a/src/os9/dev/devfip.c b/src/os9/dev/devfip.c @@ -1,12 +1,11 @@ -#include <assert.h> -#include <deserialize.h> +#include <os9/os9.h> + #include <errno.h> #include <limits.h> #include <stdlib.h> #include <string.h> -#include <os9/os9.h> -#include <os9/io.h> +#include <deserialize.h> #include "dev.h" #include "fip.h" @@ -158,7 +157,7 @@ fipgen(Chan *c, Dirtab *tab, int ntab, int n, Dir *dir) for (i = 0; i <= n; i++) { if (fip->offset[i] == -1) return 0; - if (devtab[nc.type]->seek(&nc, off, KSEEK_SET) < 0) + if (devtab[nc.type]->seek(&nc, off, SEEK_SET) < 0) return -1; if ((r = getntry(&nc, &ntry)) <= 0) return r; @@ -229,7 +228,7 @@ fipread(Chan *c, void *buf, int n) n = size - c->offset; off = fip->offset[path] + c->offset; - if (devtab[cs.type]->seek(&cs, off, KSEEK_SET) < 0) + if (devtab[cs.type]->seek(&cs, off, SEEK_SET) < 0) return -1; n = devtab[cs.type]->read(&cs, buf, n); @@ -273,7 +272,7 @@ fipmount(Chan *c, char *spec) } t = cspec->type; - if (devtab[t]->seek(cspec, STOC_HEADER, KSEEK_SET) < 0) + if (devtab[t]->seek(cspec, STOC_HEADER, SEEK_SET) < 0) goto err; for (n = 0; n < NR_FILES; n++) { switch (getntry(cspec, &ntry)) { diff --git a/src/os9/dev/devproc.c b/src/os9/dev/devproc.c @@ -1,5 +1,4 @@ #include <os9/os9.h> -#include <os9/io.h> #include <libk.h> #include "dev.h" diff --git a/src/os9/dev/devroot.c b/src/os9/dev/devroot.c @@ -1,5 +1,4 @@ #include <os9/os9.h> -#include <os9/io.h> #include <libk.h> #include "dev.h" diff --git a/src/os9/dev/devuart.c b/src/os9/dev/devuart.c @@ -1,5 +1,5 @@ #include <os9/os9.h> -#include <os9/io.h> + #include <ctype.h> #include <errno.h> #include <libk.h> diff --git a/src/os9/dev/dummyblk.c b/src/os9/dev/dummyblk.c @@ -1,7 +1,4 @@ -#include <stdio.h> - #include <os9/os9.h> -#include <os9/io.h> #include "../src/libc/syscall.h" #include "dev.h" diff --git a/src/os9/dev/dummyuart.c b/src/os9/dev/dummyuart.c @@ -1,5 +1,4 @@ #include <os9/os9.h> -#include <os9/io.h> #include "dev.h" #include "uart.h" diff --git a/src/os9/dev/mkdev b/src/os9/dev/mkdev @@ -4,7 +4,7 @@ trap 'rm -f $$.tmp' EXIT HUP INT QUIT TERM section dev $@ | awk ' -BEGIN {print "DEVS = dev.o\\"} +BEGIN {print "DEVS =\\"} /^\t\t/ {objs[$1 ".o"] = 1; next} /^\t/ {objs["dev" $1 ".o"] = 1; next} END {for (i in objs) diff --git a/src/os9/dev/pl011.c b/src/os9/dev/pl011.c @@ -1,5 +1,4 @@ #include <os9/os9.h> -#include <os9/io.h> #include "dev.h" #include "uart.h" diff --git a/src/os9/dlang.c b/src/os9/dlang.c @@ -1,14 +1,14 @@ +#include <os9/os9.h> + +#include <libk.h> + #include <ctype.h> #include <errno.h> #include <setjmp.h> #include <stdarg.h> -#include <stdio.h> #include <stdlib.h> #include <string.h> -#include <libk.h> -#include <os9/os9.h> - #define PREFIX "> " #define NR_ARGC_MAX 5 @@ -37,35 +37,16 @@ error(char *fmt, ...) va_list va; va_start(va, fmt); - kputs(kerr, PREFIX "ERR "); - kvprint(kerr, fmt, va); - kputc(kerr, '\n'); + kprint(PREFIX "ERR "); + kvprint(fmt, va); + kprint("\n"); longjmp(dbgrecover, 1); } static void ready(void) { - kputs(kout, PREFIX "READY\n"); -} - -/* - * Read a value in a given base between 2 and 16 0 means default base; - * 10, unless the string begins with "0x" or "0b" - */ -static unsigned long long -estrtoull(char *str, int base) -{ - unsigned long long val; - char *endptr; - - errno = 0; - val = strtoull(str, &endptr, base); - if (*str == '\0' || *endptr != '\0') - error("estrtoull: %s: not an integer", str); - if (errno) - error("estrtoull: %s: %s", strerror(errno)); - return val; + kprint(PREFIX "READY\n"); } /* Get cmd struct for named cmd */ @@ -86,7 +67,7 @@ do_exit(const struct cmd *cmd, struct args *args) { args->status = 0; if (args->argc == 2) - args->status = estrtoull(args->argv[1], 0); + args->status = atoi(args->argv[1]); return -1; } @@ -95,7 +76,7 @@ do_help(const struct cmd *cmd, struct args *args) { for (cmd = cmds; cmd->name; cmd++) { char *s = cmd->helpmsg; - kprint(kout, "%s\n", s); + kprint("%s\n", s); } return 0; } @@ -103,22 +84,23 @@ do_help(const struct cmd *cmd, struct args *args) static int do_cat(const struct cmd *cmd, struct args *args) { - int fd, n; + int n; + Chan *c; char buf[100]; - if ((fd = open(args->argv[1], O_READ)) < 0) + if ((c = devopen(args->argv[1], O_READ)) == NULL) goto err; - while ((n = read(fd, buf, sizeof(buf))) > 0) - write(kin, buf, n); + while ((n = devread(c, buf, sizeof(buf))) > 0) + devwrite(console, buf, n); - if (close(fd) < 0 || n < 0) + if (devclose(c) < 0 || n < 0) goto err; return 0; err: - kerror(PREFIX "ERR cat"); + kprint(PREFIX "ERR cat: %e\n"); return 0; } @@ -126,32 +108,39 @@ static int do_ls(const struct cmd *cmd, struct args *args) { int n; - DIR *dir; - struct dirent d; + Chan *c; + Dir dentry; + unsigned char buf[DIRLEN]; - if ((dir = opendir(args->argv[1])) == NULL) + if ((c = devopen(args->argv[1], O_READ)) == NULL) goto err; - while ((n = readdir(dir, &d)) > 0) - kprint(kout, "%s\n", d.d_name); + while ((n = devread(c, buf, DIRLEN)) > 0) { + if (p9todir(&dentry, buf, n) < 0) + goto err; + kprint("%s\n", dentry.name); + } + + devclose(c); - if (closedir(dir) < 0 || n < 0) + if ( n < 0) goto err; return 0; err: - kerror(PREFIX "ERR ls"); + kprint(PREFIX "ERR ls:%e"); return 0; } static int do_echo(const struct cmd *cmd, struct args *args) { - int fd, i, len, offset, n; + int i, len, offset, n; + Chan *c; char *s, buffer[LINELEN]; - if ((fd = open(args->argv[1], O_WRITE)) < 0) + if ((c = devopen(args->argv[1], O_WRITE)) == NULL) goto err; offset = 0; @@ -165,14 +154,14 @@ do_echo(const struct cmd *cmd, struct args *args) buffer[offset++] = ' '; } buffer[offset] = '\n'; - n = write(fd, buffer, offset); + n = devwrite(c, buffer, offset); - if (close(fd) < 0 || n < 0) + if (devclose(c) < 0 || n < 0) goto err; return 0; err: - kerror(PREFIX "ERR echo"); + kprint(PREFIX "ERR echo:%e"); return 0; } @@ -183,8 +172,7 @@ do_stat(const struct cmd *cmd, struct args *args) if (dirstat(args->argv[1], &dir) < 0) goto err; - kprint(kout, - "name: %s\n" + kprint("name: %s\n" "length: %ld\n" "mode: %x\n" "type: %d\n" @@ -195,13 +183,12 @@ do_stat(const struct cmd *cmd, struct args *args) dir.mode, dir.type, dir.dev, - dir.qid.type, dir.qid.vers, dir.qid.path - ); + dir.qid.type, dir.qid.vers, dir.qid.path); return 0; err: - kerror(PREFIX "ERR stat"); + kprint(PREFIX "ERR stat:%e"); return 0; } @@ -235,7 +222,7 @@ run(struct args *args) size_t len; char buffer[LINELEN]; - if (kgets(kin, buffer, sizeof(buffer)) == NULL) { + if (kgets(buffer, sizeof(buffer)) == NULL) { args->status = 1; return -1; } @@ -265,13 +252,13 @@ debug(void) { struct args args; - kprint(kout, "begin debug language interface\n"); + kprint("begin debug language interface\n"); in_debug = 1; setjmp(dbgrecover); for (ready(); !run(&args); ready()) ; - kprint(kout, "end debug language interface\n"); + kprint("end debug language interface\n"); in_debug = 0; return args.status; diff --git a/src/os9/hosted/arch.c b/src/os9/hosted/arch.c @@ -1,10 +1,9 @@ +#include <os9/os9.h> + #include <setjmp.h> -#include <stdio.h> #include <stdlib.h> #include <string.h> -#include <os9/os9.h> - #include "hosted.h" jmp_buf recover; diff --git a/src/os9/hosted/main.c b/src/os9/hosted/main.c @@ -6,13 +6,42 @@ #include <os9/os9.h> #include "hosted.h" +#include "../../libc/syscall.h" noreturn void longjmp(jmp_buf env, int val); +Chan *console; + +int +getch(void) +{ + char ch; + + if (console) { + devread(console, &ch, 1); + } else { + _read(0, &ch, 1); + } + + return ch; +} + +void +putch(int c) +{ + char ch = c; + + if (console) { + devwrite(console, &ch, 1); + } else { + _write(1, &ch, 1); + } +} + void panic(const char *msg) { - kprint(kerr, "panic %s\n", msg); + kprint("panic %s\n", msg); longjmp(recover, 1); } @@ -24,41 +53,23 @@ imach(void) } static void -namespace(void) +icons(void) { - int fd; - static char setin[] = "addin /dev/uart0/raw\n"; - static char setout[] = "addout /dev/uart0/raw\n"; - - /* Standard input set to 0 */ - if ((kin = open("#c/raw", O_READ)) < 0) - panic("open:#c/raw read"); - - /* Standard output set to 1 */ - if ((kout = open("#c/raw", O_WRITE)) < 0) - panic("open:#c/raw write"); - - /* Standard error set to 2 */ - if ((kerr = open("#c/raw", O_WRITE)) < 0) - panic("open:#c/raw write"); + static char setin[] = "addin #t0/raw\n"; + static char setout[] = "addout #t0/raw\n"; + Chan *c; - if (bind("#t0", "/dev/uart0") < 0) - panic("bind:/dev/uart0"); - if (bind("#c", "/dev/cons") < 0) - panic("bind:/dev/cons"); - if (bind("#b", "/dev/blk") < 0) - panic("bind:/dev/blk"); - if (bind("#p", "/proc") < 0) - panic("bind:/proc"); - - if ((fd = open("/dev/cons/ctl", O_WRITE)) < 0) - panic("open:/dev/cons/ctl write"); - if (write(fd, setin, sizeof(setin)) < 0) + if ((c = devopen("#c/ctl", O_WRITE)) <0) + panic("namec:/dev/cons/ctl write"); + if (devwrite(c, setin, sizeof(setin)) < 0) panic("write:setin"); - if (write(fd, setout, sizeof(setout)) < 0) + if (devwrite(c, setout, sizeof(setout)) < 0) + panic("write:setout"); + if (devclose(c) < 0) panic("write:setout"); - if (close(fd) < 0) - panic("close:/dev/cons/ctl"); + + if ((console = devopen("#c/raw", O_RDWR)) < 0) + panic("devopen:#c/raw read"); } int @@ -66,7 +77,7 @@ main(int argc, char *argv[]) { imach(); idev(); - namespace(); - - return debug(); + icons(); + debug(); + panic("out of sync"); }