shithub: drawcpu

Download patch

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