Moves genbuf into kthreads
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 15 Oct 2013 22:34:01 +0000 (15:34 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 19:08:48 +0000 (11:08 -0800)
So we can have independent syscalls from the same process in the
kernel...

We should consider finding a better way to do the genbuf.  Though I
guess it's not as bad as the waserror()/poperror() stuff on performance.

kern/include/kthread.h
kern/include/syscall.h
kern/src/syscall.c

index 11b6c75..dd92d6a 100644 (file)
@@ -20,6 +20,8 @@ struct semaphore;
 TAILQ_HEAD(kthread_tailq, kthread);
 TAILQ_HEAD(semaphore_tailq, semaphore);
 
+#define GENBUF_SZ 128  /* plan9 uses this as a scratch space, per syscall */
+
 /* This captures the essence of a kernel context that we want to suspend.  When
  * a kthread is running, we make sure its stacktop is the default kernel stack,
  * meaning it will receive the interrupts from userspace. */
@@ -33,6 +35,7 @@ struct kthread {
        /* ID, other shit, etc */
        bool                                            is_ktask;       /* default is FALSE */
        char                                            *name;
+       char                                            generic_buf[GENBUF_SZ];
 };
 
 /* Semaphore for kthreads to sleep on.  0 or less means you need to sleep */
index 13bf72b..a195d72 100644 (file)
@@ -49,6 +49,7 @@ void set_errstr(char *errstr, ...);
 char *current_errstr(void);
 struct errbuf *get_cur_errbuf(void);
 void set_cur_errbuf(struct errbuf *ebuf);
+char *get_cur_genbuf(void);
 void __signal_syscall(struct syscall *sysc, struct proc *p);
 
 /* Tracing functions */
index 9c8e494..2903c29 100644 (file)
@@ -136,6 +136,13 @@ void set_cur_errbuf(struct errbuf *ebuf)
        pcpui->cur_kthread->errbuf = ebuf;
 }
 
+char *get_cur_genbuf(void)
+{
+       struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
+       assert(pcpui->cur_kthread);
+       return pcpui->cur_kthread->generic_buf;
+}
+
 /************** Utility Syscalls **************/
 
 static int sys_null(void)