Have switch_{to,back} use an opaque uintptr_t
[akaros.git] / kern / src / ns / sysfile.c
index cc983fe..0d4d171 100644 (file)
@@ -1,4 +1,31 @@
-// INFERNO
+/* Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
+ * Portions Copyright © 1997-1999 Vita Nuova Limited
+ * Portions Copyright © 2000-2007 Vita Nuova Holdings Limited
+ *                                (www.vitanuova.com)
+ * Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
+ *
+ * Modified for the Akaros operating system:
+ * Copyright (c) 2013-2014 The Regents of the University of California
+ * Copyright (c) 2013-2015 Google Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE. */
+
 #include <vfs.h>
 #include <kfs.h>
 #include <slab.h>
@@ -75,7 +102,7 @@ long kchanio(void *vc, void *buf, int n, int mode)
        else if (mode == O_WRITE)
                r = devtab[c->type].write(c, buf, n, c->offset);
        else
-               error(EFAIL, "kchanio: use only O_READ xor O_WRITE");
+               error(ENOSYS, "kchanio: use only O_READ xor O_WRITE");
 
        spin_lock(&c->lock);
        c->offset += r;
@@ -173,7 +200,7 @@ int syscreate(char *path, int mode, uint32_t perm)
        }
        fd = newfd(c, mode);    /* 9ns mode is the O_FLAGS and perm is glibc mode */
        if (fd < 0)
-               error(fd, NULL);
+               error(-fd, NULL);
        poperror();
 
        poperror();
@@ -198,7 +225,7 @@ int sysdup(int old)
        fd = newfd(c, 0);
        if (fd < 0) {
                cclose(c);
-               error(fd, NULL);
+               error(-fd, NULL);
        }
        poperror();
        return fd;
@@ -287,7 +314,7 @@ int sysfauth(int fd, char *aname)
 
        fd = newfd(ac, 0);
        if (fd < 0)
-               error(fd, NULL);
+               error(-fd, NULL);
        poperror();     /* ac */
 
        poperror();
@@ -363,10 +390,10 @@ int syspipe(int fd[2])
        c[1] = d->open(c[1], O_RDWR);
        fd[0] = newfd(c[0], 0);
        if (fd[0] < 0)
-               error(fd[0], NULL);
+               error(-fd[0], NULL);
        fd[1] = newfd(c[1], 0);
        if (fd[1] < 0)
-               error(fd[1], NULL);
+               error(-fd[1], NULL);
        poperror();
        return 0;
 }
@@ -544,7 +571,7 @@ int sysopenat(int fromfd, char *path, int vfs_flags)
        }
        fd = newfd(c, vfs_flags);
        if (fd < 0)
-               error(fd, NULL);
+               error(-fd, NULL);
        poperror();
        return fd;
 }
@@ -575,9 +602,9 @@ long unionread(struct chan *c, void *va, long n)
                /* Error causes component of union to be skipped */
                if (mount->to) {
                        /* normally we want to discard the error, but for our ghetto kdirent
-                        * hack, we need to repeat unionread if we saw a Eshort */
+                        * hack, we need to repeat unionread if we saw a ENODATA */
                        if (waserror()) {
-                               if (!strcmp(current_errstr(), Eshort)) {
+                               if (!strcmp(current_errstr(), errno_to_string(ENODATA))) {
                                        runlock(&m->lock);
                                        qunlock(&c->umqlock);
                                        nexterror();
@@ -733,9 +760,9 @@ out:
 }
 
 /* Reads exactly n bytes from chan c, starting at its offset.  Can block, but if
- * we get 0 back too soon (EOF or error), then we'll error out with Eshort.
+ * we get 0 back too soon (EOF or error), then we'll error out with ENODATA.
  * That might need a little work - if there was a previous error, then we
- * clobbered it and only know Eshort but not why we completed early. */
+ * clobbered it and only know ENODATA but not why we completed early. */
 void read_exactly_n(struct chan *c, void *vp, long n)
 {
        char *p;
@@ -747,7 +774,7 @@ void read_exactly_n(struct chan *c, void *vp, long n)
                nn = devtab[c->type].read(c, p, n, c->offset);
                printd("readn: Got %d@%lld\n", nn, c->offset);
                if (nn == 0)
-                       error(EFAIL, "%s: wanted %d, got %d", Eshort, want, total);
+                       error(ENODATA, "wanted %d, got %d", want, total);
                spin_lock(&c->lock);
                c->offset += nn;
                spin_unlock(&c->lock);
@@ -1308,7 +1335,7 @@ void print_chaninfo(struct chan *c)
 int plan9setup(struct proc *new_proc, struct proc *parent, int flags)
 {
        
-       struct proc *old_current;
+       uintptr_t old_current;
        struct kref *new_dot_ref;
        ERRSTACK(1);
        if (waserror()) {