ref: 5c5f712127bd65cdfe70d520d69e75e78edd1837
parent: 94cb585132563082a7db68d7a61bb59e885c5b20
author: halfwit <michaelmisch1985@gmail.com>
date: Wed Dec 31 17:50:28 EST 2025
More kernel fixes and device tweaks
--- a/aan.c
+++ b/aan.c
@@ -211,8 +211,8 @@
c->timeout = 60;
reconnect(c);
c->timeout = timeout;
- c->writer = kproc("aanwriter", aanwriter, c);- c->reader = kproc("aanreader", aanreader, c);- c->syncer = kproc("aansyncer", aansyncer, c);+ kproc("aanwriter", aanwriter, c);+ kproc("aanreader", aanreader, c);+ kproc("aansyncer", aansyncer, c);return pfd[0];
}
--- a/drawcpu.h
+++ b/drawcpu.h
@@ -1,3 +1,4 @@
extern char *getuser(void);
extern int aanclient(char*, int);
+extern void mntgen(char*, char*);
extern int dbg;
\ No newline at end of file
--- a/gui-cocoa/screen.m
+++ b/gui-cocoa/screen.m
@@ -313,7 +313,7 @@
static void
mainproc(void *aux)
{- cpubody();
+ //cpubody();
}
- (void) applicationDidFinishLaunching:(NSNotification *)aNotification
--- a/include/user.h
+++ b/include/user.h
@@ -24,6 +24,7 @@
#define unmount sysunmount
#define pipe syspipe
#define rendezvous sysrendezvous
+#define kprocint syskprocint
#define getpid sysgetpid
#define time systime
#define nsec sysnsec
@@ -53,6 +54,7 @@
extern long read(int, void*, long);
extern long readn(int, void*, long);
extern int remove(char*);
+extern void kprocint(void *);
extern int rfork(int);
extern vlong seek(int, vlong, int);
extern int stat(char*, uchar*, int);
@@ -89,7 +91,7 @@
extern long pread(int, void*, long, vlong);
extern long pwrite(int, void*, long, vlong);
extern void* rendezvous(void*, void*);
-extern int kproc(char*, void(*)(void*), void*);
+extern void* kproc(char*, void(*)(void*), void*);
extern int getpid(void);
extern void panic(char*, ...);
extern void sleep(int);
--- a/kern/arm.c
+++ b/kern/arm.c
@@ -33,7 +33,8 @@
void
invalid(u32int instr)
{- panic("undefined instruction %.8ux @ %.8ux", instr, up->R[15] - 4);+ print("%s: undefined instruction %.8ux @ %.8ux", (char*)up->arg, instr, up->R[15] - 4);+ pexit("invalid", 1);}
u32int
--- a/kern/devcons.c
+++ b/kern/devcons.c
@@ -201,7 +201,7 @@
if(panicking++) hang();
splhi();
- strcpy(buf, "panic: ");
+ strcpy(buf, smprint("%s panic: ", up->arg));va_start(arg, fmt);
n = vseprint(buf+strlen(buf), buf+sizeof(buf), fmt, arg) - buf;
va_end(arg);
@@ -210,7 +210,7 @@
putstrn(buf, n+1);
if(screenputs) hang();
setterm(0);
- exit(1);
+ pexit("panic", 1);}
int
--- a/kern/devdup.c
+++ b/kern/devdup.c
@@ -9,12 +9,13 @@
static int
dupgen(Chan *c, char *, Dirtab*, int, int s, Dir *dp)
{- Fgrp *fgrp = up->fgrp;
+ Fgrp *fgrp;
Chan *f;
static int perm[] = { 0400, 0200, 0600, 0 };int p;
Qid q;
+ fgrp = up->fgrp;
if(s == DEVDOTDOT){devdir(c, c->qid, ".", 0, eve, 0555, dp);
return 1;
--- a/kern/devmnt.c
+++ b/kern/devmnt.c
@@ -279,7 +279,6 @@
r->request.uname = up->user;
r->request.aname = spec;
mountrpc(m, r);
-
c->qid = r->reply.aqid;
c->mchan = m->c;
incref(&m->c->ref);
--- a/kern/fns.h
+++ b/kern/fns.h
@@ -95,7 +95,7 @@
#define islo() (0)
int kbdputc(Queue*, int);
void kbdkey(Rune, int);
-int kproc(char*, void(*)(void*), void*);
+void* kproc(char*, void(*)(void*), void*);
void ksetenv(char*, char*, int);
void kstrcpy(char*, char*, int);
void kstrdup(char**, char*);
--- a/kern/procinit.c
+++ b/kern/procinit.c
@@ -53,7 +53,7 @@
return nil;
}
-int
+void *
kproc(char *name, void (*fn)(void*), void *arg)
{Proc *p;
@@ -79,7 +79,7 @@
strecpy(p->text, p->text+sizeof p->text, name);
osproc(p);
- return p->pid;
+ return (void*)p;
}
void
--- a/kern/syscall.c
+++ b/kern/syscall.c
@@ -54,6 +54,14 @@
}
static void
+_sysr1(void)
+{+ if(!iseve())
+ error(Eperm);
+ up->R[0] = 0;
+}
+
+static void
_sysopen(void)
{u32int name, flags;
@@ -314,6 +322,12 @@
}
static void
+_sys_errstr(void)
+{+ /* Old binaries, implement if needed */
+}
+
+static void
_syserrstr(void)
{char buf[ERRMAX], *srct;
@@ -502,6 +516,8 @@
oldt = copyifnec(old, -1, &copiedold);
if(aname) {anamet = copyifnec(aname, -1, &copiedaname);
+ if(!anamet)
+ anamet = "";
if(debug)
print("sysmount: aname=%s\n", anamet); } else {@@ -565,6 +581,49 @@
}
static void
+_sys_fsession(void)
+{+ /* deprecated; backwards compatibility only */
+}
+
+
+static void
+_sysfauth(void)
+{+ u32int name;
+ Chan *c, *ac;
+ char *aname;
+ int fd, afd, copied;
+
+ fd = arg(0);
+ name = arg(1);
+ aname = copyifnec(name, -1, &copied);
+ if(!aname || aname[0] == '\0') {+ up->R[0] = -1;
+ return;
+ }
+ c = fdtochan(fd, ORDWR, 0, 1);
+ if(waserror()){+ cclose(c);
+ nexterror();
+ }
+ ac = mntauth(c, aname);
+ /* at this point ac is responsible for keeping c alive */
+ poperror(); /* c */
+ cclose(c);
+
+ if(waserror()){+ cclose(ac);
+ nexterror();
+ }
+
+ afd = newfd(ac);
+ setcexec(up->fd, afd, ORDWR|OCEXEC);
+ up->R[0] = afd;
+ poperror(); /* ac */
+}
+
+static void
_sysremove(void)
{u32int file;
@@ -624,39 +683,61 @@
void
_syscall(void)
{+
u32int n;
static void (*calls[])(void) = {- [EXITS] = _sysexits,
- [CLOSE] = _sysclose,
- [OPEN] = _sysopen,
- [CREATE] = _syscreate,
- [PREAD] = _syspread,
- [PWRITE] = _syspwrite,
- [BRK_] = _sysbrk,
- [ERRSTR] = _syserrstr,
- [STAT] = _sysstat,
- [FSTAT] = _sysfstat,
- [WSTAT] = _syswstat,
- [FWSTAT] = _sysfwstat,
- [SEEK] = _sysseek,
- [CHDIR] = _syschdir,
- [FD2PATH] = _sysfd2path,
- [NOTIFY] = _sysnotify,
- [NOTED] = _sysnoted,
- [RFORK] = _sysrfork,
- [EXEC] = _sysexec,
- [PIPE] = _syspipe,
- [SLEEP] = _syssleep,
- [RENDEZVOUS]= _sysrendezvous,
- [BIND] = _sysbind,
- [UNMOUNT] = _sysunmount,
- [DUP] = _sysdup,
- [MOUNT] = _sysmount,
- [REMOVE] = _sysremove,
- [ALARM] = _sysalarm,
- [AWAIT] = _sysawait,
- [SEMACQUIRE]= _syssemacquire,
- [SEMRELEASE]= _syssemrelease,
+ [SYSR1] = _sysr1,
+ [_ERRSTR] = _sys_errstr,
+ [BIND] = _sysbind,
+ [CHDIR] = _syschdir,
+ [CLOSE] = _sysclose,
+ [DUP] = _sysdup,
+ [ALARM] = _sysalarm,
+ [EXEC] = _sysexec,
+ [EXITS] = _sysexits,
+ [_FSESSION] = _sys_fsession,
+ [FAUTH] = _sysfauth,
+ [_FSTAT] = _sysfstat,
+ //[SEGBRK] = _syssegbrk,
+ [_MOUNT] = _sysmount,
+ [OPEN] = _sysopen,
+ //[_READ] = _sys_read,
+ //[OSEEK] = _sysoseek,
+ [SLEEP] = _syssleep,
+ [_STAT] = _sysstat,
+ [RFORK] = _sysrfork,
+ //[_WRITE] = _sys_write,
+ [PIPE] = _syspipe,
+ [CREATE] = _syscreate,
+ [FD2PATH] = _sysfd2path,
+ [BRK_] = _sysbrk,
+ [REMOVE] = _sysremove,
+ [_WSTAT] = _syswstat,
+ [_FWSTAT] = _sysfwstat,
+ [NOTIFY] = _sysnotify,
+ [NOTED] = _sysnoted,
+ //[SEGATTACH] = _syssegattach,
+ //[SEGDETACH] = _syssegdetach,
+ //[SEGFREE] = _syssegfree,
+ //[SEGFLUSH] = _syssegflush,
+ [RENDEZVOUS] = _sysrendezvous,
+ [UNMOUNT] = _sysunmount,
+ //[_WAIT] = _sys_wait,
+ [SEMACQUIRE] = _syssemacquire,
+ [SEMRELEASE] = _syssemrelease,
+ [SEEK] = _sysseek,
+ //[FVERSION] = _sysfversion,
+ [ERRSTR] = _syserrstr,
+ [STAT] = _sysstat,
+ [FSTAT] = _sysfstat,
+ [WSTAT] = _sysfwstat,
+ [FWSTAT] = _sysfwstat,
+ [MOUNT] = _sysmount,
+ [AWAIT] = _sysawait,
+ [PREAD] = _syspread,
+ [PWRITE] = _syspwrite,
+ //[TSEMACQUIRE] = _systsemacquire,
+ //[_NSEC] = _sys_nsec,
};
n = up->R[0];
--- a/kern/sysproc.c
+++ b/kern/sysproc.c
@@ -381,6 +381,7 @@
fd = open(file, OREAD);
if(fd < 0) return -1;
+ up->arg = strdup(file);
if(pread(fd, buf, 2, 0) == 2 && buf[0] == '#' && buf[1] == '!')
return loadscript(fd, file, argc, argv);
seek(fd, 0, 0);
@@ -559,10 +560,10 @@
poperror();
if(flag & (RFFDG|RFCFDG)) {- if(flag & RFCFDG)
- p->fgrp = dupfgrp(nil);
- else
+ if(flag & RFFDG)
p->fgrp = dupfgrp(up->fgrp);
+ else
+ p->fgrp = dupfgrp(nil);
}
else {p->fgrp = up->fgrp;
--- a/main.c
+++ b/main.c
@@ -33,7 +33,7 @@
static void
usage(void)
{- fprintf(stderr, "usage: drawcpu [-d]\n");
+ fprintf(stderr, "usage: drawcpu [-d] -f <fileserver> -a <authserver>\n");
exit(1);
}
@@ -66,9 +66,10 @@
main(int argc, char **argv)
{extern ulong kerndate;
- char *fs, *sysname;
+ char *fs, *auth, *sysname;
int sfd, fd, tls = 0;
+ fs = auth = nil;
debug = 0;
kerndate = seconds();
eve = getuser();
@@ -77,6 +78,9 @@
case 'd':
debug++;
break;
+ case 'a':
+ auth = EARGF(usage());
+ break;
case 'f':
fs = EARGF(usage());
break;
@@ -93,6 +97,8 @@
usage();
} ARGEND;
+ if(!auth || !fs)
+ usage();
/* We don't use argv for the root loadtext */
argv[0] = "";
@@ -117,34 +123,26 @@
bind("#s", "/srv", MREPL|MCREATE);//bind -q #σ /shr MREPL
bind("#¤", "/dev", MAFTER);+ bind("#I", "/net", MAFTER);+ bind("#a", "/net", MAFTER);open(cons, OREAD);
open(cons, OWRITE);
open(cons, OWRITE);
- //bind("#l", "/net", MAFTER);- bind("#I", "/net", MAFTER);- //bind("#a", "/net", MAFTER);-
- // TODO: This might be incorrect port
fd = dial(netmkaddr(fs, tls ? "tls" : "tcp", "9fs"), nil, nil, nil);
if(fd < 0)
panic("dial fs: %r");postsrv(fd, "boot");
- close(fd);
+ mntgen("slashn", "/n");+ mntgen("slashmnt", "/mnt");+ mntgen("slashexport", "/mnt/exportfs");/* Set up our root */
sfd = open("/srv/boot", ORDWR);- mount(sfd, -1, "/root", MREPL|MCREATE, "");
+ mount(sfd, -1, "/root", MREPL|MCREATE|MCACHE, "");
close(sfd);
- // TODO: mntgen -s slashmnt /mnt
- //postsrv(fd, "slashmnt");
- // TODO: mntget -s slashn /n
- //postsrv(fd, "slashn");
- // TODO: mntgen -s slashexport /mnt/exportfs
- //postsrv(fd, "slashexport");
-
/* Used for `os` */
bind("#C", "/mnt/term/", MAFTER); bind("#U", "/mnt/cpu", MAFTER);@@ -154,12 +152,12 @@
/* Build our /bin directory */
if(bind("/arm/bin", "/bin", MCREATE|MREPL) < 0 || bind("/rc/bin", "/bin", MAFTER) < 0) panic("bind bin: %r");- chdir(smprint("/usr/%s", eve)); loadtext("/bin/rc", 1, argv); ksetenv("cputype", "arm", 0); // cputype being anything but arm should fail for now ksetenv("objtype", "arm", 0); ksetenv("rootdir", "/root", 0);+ ksetenv("auth", auth, 0); ksetenv("user", eve, 0); ksetenv("service", "cpu", 0); ksetenv("sysname", sysname, 0);@@ -168,6 +166,5 @@
/* Run machine */
procrun(0);
-
exits(0);
}
--
⑨