Provides current_errstr()
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 24 Aug 2013 00:06:14 +0000 (17:06 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 00:32:02 +0000 (16:32 -0800)
Instead of using the per-proc current->errstr, now use the per-syscall errstr.

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

index 665c946..7e9082f 100644 (file)
@@ -46,6 +46,7 @@ intreg_t syscall(struct proc *p, uintreg_t sc_num, uintreg_t a0, uintreg_t a1,
                  uintreg_t a2, uintreg_t a3, uintreg_t a4, uintreg_t a5);
 void set_errno(int errno);
 void set_errstr(char *errstr);
+char *current_errstr(void);
 void __signal_syscall(struct syscall *sysc, struct proc *p);
 
 /* Tracing functions */
index 42f8aca..aa85f2a 100644 (file)
@@ -105,15 +105,21 @@ void set_errno(int errno)
 void set_errstr(char *errstr)
 {
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
-       size_t errstrlen;
        if (!pcpui->cur_sysc)
                return;
-       errstrlen = MIN(strlen(errstr) + 1, MAX_ERRSTR_LEN);
-       memcpy(pcpui->cur_sysc->errstr, errstr, errstrlen);
+       strncpy(pcpui->cur_sysc->errstr, errstr, MAX_ERRSTR_LEN);
        /* enforce null termination */
        pcpui->cur_sysc->errstr[MAX_ERRSTR_LEN - 1] = '\0';
 }
 
+char *current_errstr(void)
+{
+       struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
+       /* no one should call this that doesn't have a sysc */
+       assert(!pcpui->cur_sysc);
+       return pcpui->cur_sysc->errstr;
+}
+
 /************** Utility Syscalls **************/
 
 static int sys_null(void)