Added support for returning errors from syscalls
authorKevin Klues <klueska@ros-dev.(none)>
Thu, 25 Mar 2010 04:41:13 +0000 (21:41 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:37 +0000 (17:35 -0700)
12 files changed:
kern/arch/i686/env.c
kern/arch/i686/ros/syscall.h
kern/arch/i686/trap.c
kern/arch/i686/trap.h
kern/arch/i686/trapentry.S
kern/arch/sparc/trap.c
kern/include/error.h [new file with mode: 0644]
kern/include/errstrings.h [new file with mode: 0644]
kern/include/ros/errno.h [new file with mode: 0644]
kern/src/syscall.c
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/bits/errno.h
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/i386/tls.c

index 1e4f1c2..864b2da 100644 (file)
@@ -74,7 +74,6 @@ void env_pop_tf(trapframe_t *tf)
                              "addl $0x10,%%esp;        "
                              "popfl;                   "
                              "movl %%ebp,%%ecx;        "
                              "addl $0x10,%%esp;        "
                              "popfl;                   "
                              "movl %%ebp,%%ecx;        "
-                             "movl %%esi,%%edx;        "
                              "popl %%esp;              "
                              "sti;                     "
                              "sysexit                  "
                              "popl %%esp;              "
                              "sti;                     "
                              "sysexit                  "
index 0535ed3..13d2aa8 100644 (file)
@@ -8,46 +8,61 @@
 #include <sys/types.h>
 #include <stdint.h>
 #include <ros/common.h>
 #include <sys/types.h>
 #include <stdint.h>
 #include <ros/common.h>
+#include <errno.h>
 
 // TODO: fix sysenter to take all 5 params
 
 // TODO: fix sysenter to take all 5 params
-static inline intreg_t syscall_sysenter(uint16_t num, intreg_t a1,
-                                 intreg_t a2, intreg_t a3,
-                                 intreg_t a4, intreg_t a5)
+static inline intreg_t __syscall_sysenter(uint16_t num, intreg_t a1,
+                                    intreg_t a2, intreg_t a3,
+                                    intreg_t a4, intreg_t a5, intreg_t* err_loc)
 {
        // The kernel clobbers ecx and edx => put them in clobber list.
        // ebx is handled specially because of a glibc register
        // allocation problem (not enough registers).
 {
        // The kernel clobbers ecx and edx => put them in clobber list.
        // ebx is handled specially because of a glibc register
        // allocation problem (not enough registers).
-       intreg_t ret;
-       asm volatile ("  pushl %%ebp;        "
-                     "  pushl %%esi;        "
+       intreg_t ret = 0;
+       intreg_t err = 0;
+       asm volatile (""
                      "  pushl %%ebx;        "
                      "  pushl %%ebx;        "
+                     "  movl %5, %%ebx;     "
                      "  pushl %%ecx;        "
                      "  pushl %%edx;        "
                      "  pushl %%ecx;        "
                      "  pushl %%edx;        "
+                     "  pushl %%esi;        "
+                     "  pushl %%ebp;        "
                      "  movl %%esp, %%ebp;  "
                      "  movl %%esp, %%ebp;  "
-                     "  movl %4, %%ebx;     "
-                     "  leal 1f, %%esi;     "
+                     "  leal 1f, %%edx;     "
                      "  sysenter;           "
                      "1:                    "
                      "  sysenter;           "
                      "1:                    "
+                     "  popl %%ebp;         "
+                     "  movl %%esi, %1;     "
+                     "  popl %%esi;         "
                      "  popl %%edx;         "
                      "  popl %%ecx;         "
                      "  popl %%ebx;         "
                      "  popl %%edx;         "
                      "  popl %%ecx;         "
                      "  popl %%ebx;         "
-                     "  popl %%esi;         "
-                     "  popl %%ebp;         "
-                     : "=a" (ret)
+                     : "=a" (ret),
+                       "=m" (err)
                      : "a" (num),
                      : "a" (num),
-                       "d" (a1),
+                       "S" (a1),
                        "c" (a2),
                        "r" (a3),
                        "D" (a4)
                      : "cc", "memory");
                        "c" (a2),
                        "r" (a3),
                        "D" (a4)
                      : "cc", "memory");
+       if(err != 0 && err_loc != NULL)
+               *err_loc = err;
        return ret;
 }
 
        return ret;
 }
 
-static inline intreg_t syscall_trap(uint16_t num, intreg_t a1,
+static inline intreg_t syscall_sysenter(uint16_t num, intreg_t a1,
+                                  intreg_t a2, intreg_t a3,
+                                  intreg_t a4, intreg_t a5)
+{
+       return __syscall_sysenter(num, a1, a2, a3, a4, a5, &errno);
+}
+
+static inline intreg_t __syscall_trap(uint16_t num, intreg_t a1,
                              intreg_t a2, intreg_t a3,
                              intreg_t a2, intreg_t a3,
-                             intreg_t a4, intreg_t a5)
+                             intreg_t a4, intreg_t a5, intreg_t* err_loc)
 {
 {
-       uint32_t ret;
+       intreg_t ret;
+       intreg_t err;
 
        // Generic system call: pass system call number in AX,
        // up to five parameters in DX, CX, BX, DI, SI.
 
        // Generic system call: pass system call number in AX,
        // up to five parameters in DX, CX, BX, DI, SI.
@@ -61,8 +76,10 @@ static inline intreg_t syscall_trap(uint16_t num, intreg_t a1,
        // potentially change the condition codes and arbitrary
        // memory locations.
 
        // potentially change the condition codes and arbitrary
        // memory locations.
 
-       asm volatile("int %1"
-                    : "=a" (ret)
+       asm volatile(""
+                    " int %1"
+                    : "=a" (ret),
+                      "=S" (err)
                     : "i" (T_SYSCALL),
                       "a" (num),
                       "d" (a1),
                     : "i" (T_SYSCALL),
                       "a" (num),
                       "d" (a1),
@@ -71,9 +88,18 @@ static inline intreg_t syscall_trap(uint16_t num, intreg_t a1,
                       "D" (a4),
                       "S" (a5)
                     : "cc", "memory");
                       "D" (a4),
                       "S" (a5)
                     : "cc", "memory");
+       if(err != 0 && err_loc != NULL)
+               *err_loc = err;
        return ret;
 }
 
        return ret;
 }
 
+static inline intreg_t syscall_trap(uint16_t num, intreg_t a1,
+                                  intreg_t a2, intreg_t a3,
+                                  intreg_t a4, intreg_t a5)
+{
+       return __syscall_trap(num, a1, a2, a3, a4, a5, &errno);
+}
+
 static inline long __attribute__((always_inline))
 __ros_syscall(long _num, long _a0, long _a1, long _a2, long _a3, long _a4)
 {
 static inline long __attribute__((always_inline))
 __ros_syscall(long _num, long _a0, long _a1, long _a2, long _a3, long _a4)
 {
index 5a6a2bd..667a4da 100644 (file)
@@ -185,16 +185,10 @@ trap_dispatch(trapframe_t *tf)
                        // check for userspace, for now
                        assert(tf->tf_cs != GD_KT);
 
                        // check for userspace, for now
                        assert(tf->tf_cs != GD_KT);
 
-                       // default return value is 0 if syscall doesn't return
-                       // e.g. for fork or yield
-                       intreg_t syscallno = tf->tf_regs.reg_eax;
-                       tf->tf_regs.reg_eax = 0;
-                       set_errno(tf,0);
-
                        // syscall code wants an edible reference for current
                        proc_incref(current, 1);
                        tf->tf_regs.reg_eax =
                        // syscall code wants an edible reference for current
                        proc_incref(current, 1);
                        tf->tf_regs.reg_eax =
-                               syscall(current, syscallno, tf->tf_regs.reg_edx,
+                               syscall(current, tf->tf_regs.reg_eax, tf->tf_regs.reg_edx,
                                        tf->tf_regs.reg_ecx, tf->tf_regs.reg_ebx,
                                        tf->tf_regs.reg_edi, tf->tf_regs.reg_esi);
                        proc_decref(current, 1);
                                        tf->tf_regs.reg_ecx, tf->tf_regs.reg_ebx,
                                        tf->tf_regs.reg_edi, tf->tf_regs.reg_esi);
                        proc_decref(current, 1);
@@ -365,17 +359,11 @@ void sysenter_callwrapper(struct Trapframe *tf)
        // save a per-core reference to the tf
        set_current_tf(tf);
 
        // save a per-core reference to the tf
        set_current_tf(tf);
 
-       // default return value is 0 if syscall doesn't return
-       // e.g. for fork or yield
-       intreg_t syscallno = tf->tf_regs.reg_eax;
-       tf->tf_regs.reg_eax = 0;
-       set_errno(tf,0);
-
        // syscall code wants an edible reference for current
        proc_incref(current, 1);
        tf->tf_regs.reg_eax = (intreg_t) syscall(current,
        // syscall code wants an edible reference for current
        proc_incref(current, 1);
        tf->tf_regs.reg_eax = (intreg_t) syscall(current,
-                                                syscallno,
-                                                tf->tf_regs.reg_edx,
+                                                tf->tf_regs.reg_eax,
+                                                tf->tf_regs.reg_esi,
                                                 tf->tf_regs.reg_ecx,
                                                 tf->tf_regs.reg_ebx,
                                                 tf->tf_regs.reg_edi,
                                                 tf->tf_regs.reg_ecx,
                                                 tf->tf_regs.reg_ebx,
                                                 tf->tf_regs.reg_edi,
index 9a77295..53c0754 100644 (file)
@@ -102,10 +102,9 @@ typedef struct AncillaryState {
        uint32_t silly; // remove this when you actually use this struct
 } ancillary_state_t;
 
        uint32_t silly; // remove this when you actually use this struct
 } ancillary_state_t;
 
-// TODO: WE MUST DECIDE HOW TO HANDLE THIS.
 static inline void set_errno(trapframe_t* tf, uint32_t errno)
 {
 static inline void set_errno(trapframe_t* tf, uint32_t errno)
 {
-       return;
+       tf->tf_regs.reg_esi = errno;
 }
 
 #endif /* !__ASSEMBLER__ */
 }
 
 #endif /* !__ASSEMBLER__ */
index 424876a..3e95efb 100644 (file)
@@ -235,15 +235,17 @@ _allirqs:
 
 .globl sysenter_handler;
 .type sysenter_handler, @function;
 
 .globl sysenter_handler;
 .type sysenter_handler, @function;
+# All of the pushl zeros are to keep the trap frame looking the same as when we
+# receive a trap or an interrupt
 sysenter_handler:
        sti                                             # enable interrupts (things are sane here)
        cld
 sysenter_handler:
        sti                                             # enable interrupts (things are sane here)
        cld
-       pushl $0                                # esp
        pushl $0                                # ss
        pushl $0                                # ss
-       pushfl                                  # save the eflags
-       pushl $0                                # these zeros keep the trapframe looking the same
-       pushl $0                                # as when we receive a trap or interrupt
-       pushl $0                                # and CS == 0 lets the kernel know it was a sysenter
+       pushl $0                                # esp
+       pushfl                                  # eflags
+       pushl $0                                # CS == 0 lets the kernel know it was a sysenter        
+       pushl $0                                # eip
+       pushl $0                                # err 
        pushl $T_SYSCALL                # helps with print_trapframe
        pushl %ds
        pushl %es
        pushl $T_SYSCALL                # helps with print_trapframe
        pushl %ds
        pushl %es
@@ -265,6 +267,5 @@ sysenter_handler:
        addl $0x10, %esp                # pop T_SYSCALL and the three zeros
        popfl                                   # restore EFLAGS (and usually enables interrupts!)
        movl %ebp, %ecx
        addl $0x10, %esp                # pop T_SYSCALL and the three zeros
        popfl                                   # restore EFLAGS (and usually enables interrupts!)
        movl %ebp, %ecx
-       movl %esi, %edx
        sti                                             # interrupts are turned off when starting a core
        sysexit
        sti                                             # interrupts are turned off when starting a core
        sysexit
index 390750f..d7e19e6 100644 (file)
@@ -271,11 +271,6 @@ handle_syscall(trapframe_t* state)
         * are single core (PROC_RUNNING_S) */
        set_current_tf(state);
 
         * are single core (PROC_RUNNING_S) */
        set_current_tf(state);
 
-       // some syscalls don't return this way if they succed,
-       // e.g. run_binary.  so by default set the return value to success
-       state->gpr[8] = 0;
-       set_errno(current_tf,0);
-
        // syscall code wants an edible reference for current
        proc_incref(current, 1);
        state->gpr[8] = syscall(current,num,a1,a2,a3,a4,a5);
        // syscall code wants an edible reference for current
        proc_incref(current, 1);
        state->gpr[8] = syscall(current,num,a1,a2,a3,a4,a5);
diff --git a/kern/include/error.h b/kern/include/error.h
new file mode 100644 (file)
index 0000000..d1b51e3
--- /dev/null
@@ -0,0 +1,21 @@
+/* See COPYRIGHT for copyright information. */
+
+#ifndef ROS_INC_ERROR_H
+#define ROS_INC_ERROR_H
+
+#include <ros/errno.h>
+
+typedef int error_t;
+
+/* The special format for printk %e takes an integer
+ * error code and prints a string describing the error.
+ * The integer may be positive or negative,
+ * so that -ENOMEM and ENOMEM are equivalent.
+ */
+
+static const char *const error_string[] =
+{
+       #include <errstrings.h>
+};
+
+#endif // !ROS_INC_ERROR_H */
diff --git a/kern/include/errstrings.h b/kern/include/errstrings.h
new file mode 100644 (file)
index 0000000..fc0a16d
--- /dev/null
@@ -0,0 +1,151 @@
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
+"",
diff --git a/kern/include/ros/errno.h b/kern/include/ros/errno.h
new file mode 100644 (file)
index 0000000..fe497aa
--- /dev/null
@@ -0,0 +1,155 @@
+#ifndef _ROS_ERRNO_H
+#define _ROS_ERRNO_H
+
+// See below for the rest of the new error codes for ROS
+#define ESUCCESS        0  /* Success */
+
+// For compatibility with POSIX
+#define        EPERM            1      /* Operation not permitted */
+#define        ENOENT           2      /* No such file or directory */
+#define        ESRCH            3      /* No such process */
+#define        EINTR            4      /* Interrupted system call */
+#define        EIO              5      /* I/O error */
+#define        ENXIO            6      /* No such device or address */
+#define        E2BIG            7      /* Argument list too long */
+#define        ENOEXEC          8      /* Exec format error */
+#define        EBADF            9      /* Bad file number */
+#define        ECHILD          10      /* No child processes */
+#define        EAGAIN          11      /* Try again */
+#define        ENOMEM          12      /* Out of memory */
+#define        EACCES          13      /* Permission denied */
+#define        EFAULT          14      /* Bad address */
+#define        ENOTBLK         15      /* Block device required */
+#define        EBUSY           16      /* Device or resource busy */
+#define        EEXIST          17      /* File exists */
+#define        EXDEV           18      /* Cross-device link */
+#define        ENODEV          19      /* No such device */
+#define        ENOTDIR         20      /* Not a directory */
+#define        EISDIR          21      /* Is a directory */
+#define        EINVAL          22      /* Invalid argument */
+#define        ENFILE          23      /* File table overflow */
+#define        EMFILE          24      /* Too many open files */
+#define        ENOTTY          25      /* Not a typewriter */
+#define        ETXTBSY         26      /* Text file busy */
+#define        EFBIG           27      /* File too large */
+#define        ENOSPC          28      /* No space left on device */
+#define        ESPIPE          29      /* Illegal seek */
+#define        EROFS           30      /* Read-only file system */
+#define        EMLINK          31      /* Too many links */
+#define        EPIPE           32      /* Broken pipe */
+#define        EDOM            33      /* Math argument out of domain of func */
+#define        ERANGE          34      /* Math result not representable */
+
+#define        EDEADLK         35      /* Resource deadlock would occur */
+#define        ENAMETOOLONG    36      /* File name too long */
+#define        ENOLCK          37      /* No record locks available */
+#define        ENOSYS          38      /* Function not implemented */
+#define        ENOTEMPTY       39      /* Directory not empty */
+#define        ELOOP           40      /* Too many symbolic links encountered */
+#define        EWOULDBLOCK     EAGAIN  /* Operation would block */
+#define        ENOMSG          42      /* No message of desired type */
+#define        EIDRM           43      /* Identifier removed */
+#define        ECHRNG          44      /* Channel number out of range */
+#define        EL2NSYNC        45      /* Level 2 not synchronized */
+#define        EL3HLT          46      /* Level 3 halted */
+#define        EL3RST          47      /* Level 3 reset */
+#define        ELNRNG          48      /* Link number out of range */
+#define        EUNATCH         49      /* Protocol driver not attached */
+#define        ENOCSI          50      /* No CSI structure available */
+#define        EL2HLT          51      /* Level 2 halted */
+#define        EBADE           52      /* Invalid exchange */
+#define        EBADR           53      /* Invalid request descriptor */
+#define        EXFULL          54      /* Exchange full */
+#define        ENOANO          55      /* No anode */
+#define        EBADRQC         56      /* Invalid request code */
+#define        EBADSLT         57      /* Invalid slot */
+
+#define        EDEADLOCK       EDEADLK
+
+#define        EBFONT          59      /* Bad font file format */
+#define        ENOSTR          60      /* Device not a stream */
+#define        ENODATA         61      /* No data available */
+#define        ETIME           62      /* Timer expired */
+#define        ENOSR           63      /* Out of streams resources */
+#define        ENONET          64      /* Machine is not on the network */
+#define        ENOPKG          65      /* Package not installed */
+#define        EREMOTE         66      /* Object is remote */
+#define        ENOLINK         67      /* Link has been severed */
+#define        EADV            68      /* Advertise error */
+#define        ESRMNT          69      /* Srmount error */
+#define        ECOMM           70      /* Communication error on send */
+#define        EPROTO          71      /* Protocol error */
+#define        EMULTIHOP       72      /* Multihop attempted */
+#define        EDOTDOT         73      /* RFS specific error */
+#define        EBADMSG         74      /* Not a data message */
+#define        EOVERFLOW       75      /* Value too large for defined data type */
+#define        ENOTUNIQ        76      /* Name not unique on network */
+#define        EBADFD          77      /* File descriptor in bad state */
+#define        EREMCHG         78      /* Remote address changed */
+#define        ELIBACC         79      /* Can not access a needed shared library */
+#define        ELIBBAD         80      /* Accessing a corrupted shared library */
+#define        ELIBSCN         81      /* .lib section in a.out corrupted */
+#define        ELIBMAX         82      /* Attempting to link in too many shared libraries */
+#define        ELIBEXEC        83      /* Cannot exec a shared library directly */
+#define        EILSEQ          84      /* Illegal byte sequence */
+#define        ERESTART        85      /* Interrupted system call should be restarted */
+#define        ESTRPIPE        86      /* Streams pipe error */
+#define        EUSERS          87      /* Too many users */
+#define        ENOTSOCK        88      /* Socket operation on non-socket */
+#define        EDESTADDRREQ    89      /* Destination address required */
+#define        EMSGSIZE        90      /* Message too long */
+#define        EPROTOTYPE      91      /* Protocol wrong type for socket */
+#define        ENOPROTOOPT     92      /* Protocol not available */
+#define        EPROTONOSUPPORT 93      /* Protocol not supported */
+#define        ESOCKTNOSUPPORT 94      /* Socket type not supported */
+#define        EOPNOTSUPP      95      /* Operation not supported on transport endpoint */
+#define ENOTSUP                EOPNOTSUPP
+#define        EPFNOSUPPORT    96      /* Protocol family not supported */
+#define        EAFNOSUPPORT    97      /* Address family not supported by protocol */
+#define        EADDRINUSE      98      /* Address already in use */
+#define        EADDRNOTAVAIL   99      /* Cannot assign requested address */
+#define        ENETDOWN        100     /* Network is down */
+#define        ENETUNREACH     101     /* Network is unreachable */
+#define        ENETRESET       102     /* Network dropped connection because of reset */
+#define        ECONNABORTED    103     /* Software caused connection abort */
+#define        ECONNRESET      104     /* Connection reset by peer */
+#define        ENOBUFS         105     /* No buffer space available */
+#define        EISCONN         106     /* Transport endpoint is already connected */
+#define        ENOTCONN        107     /* Transport endpoint is not connected */
+#define        ESHUTDOWN       108     /* Cannot send after transport endpoint shutdown */
+#define        ETOOMANYREFS    109     /* Too many references: cannot splice */
+#define        ETIMEDOUT       110     /* Connection timed out */
+#define        ECONNREFUSED    111     /* Connection refused */
+#define        EHOSTDOWN       112     /* Host is down */
+#define        EHOSTUNREACH    113     /* No route to host */
+#define        EALREADY        114     /* Operation already in progress */
+#define        EINPROGRESS     115     /* Operation now in progress */
+#define        ESTALE          116     /* Stale NFS file handle */
+#define        EUCLEAN         117     /* Structure needs cleaning */
+#define        ENOTNAM         118     /* Not a XENIX named type file */
+#define        ENAVAIL         119     /* No XENIX semaphores available */
+#define        EISNAM          120     /* Is a named type file */
+#define        EREMOTEIO       121     /* Remote I/O error */
+#define        EDQUOT          122     /* Quota exceeded */
+
+#define        ENOMEDIUM       123     /* No medium found */
+#define        EMEDIUMTYPE     124     /* Wrong medium type */
+#define        ECANCELED       125     /* Operation Canceled */
+#define        ENOKEY          126     /* Required key not available */
+#define        EKEYEXPIRED     127     /* Key has expired */
+#define        EKEYREVOKED     128     /* Key has been revoked */
+#define        EKEYREJECTED    129     /* Key was rejected by service */
+
+/* for robust mutexes */
+#define        EOWNERDEAD      130     /* Owner died */
+#define        ENOTRECOVERABLE 131     /* State not recoverable */
+
+// New with ROS
+#define EFAIL                  132 /* Generic Failure */
+#define ENOCACHE               133 /* No memory available */
+#define EBADPROC               134 /* Bad process */
+#define ENOFREEPID             135 /* No free pid */
+#define EUNSPECIFIED   136 /* Unspecified */
+#define EMORON                 137 /* Moron */
+
+#endif
index da62c0a..c8f2cd0 100644 (file)
@@ -922,6 +922,10 @@ intreg_t sys_tcsetattr(struct proc* p, int fd, int optional_actions, const void*
 intreg_t syscall(struct proc *p, uintreg_t syscallno, uintreg_t a1,
                  uintreg_t a2, uintreg_t a3, uintreg_t a4, uintreg_t a5)
 {
 intreg_t syscall(struct proc *p, uintreg_t syscallno, uintreg_t a1,
                  uintreg_t a2, uintreg_t a3, uintreg_t a4, uintreg_t a5)
 {
+       // Initialize the return value and error code returned to 0
+       proc_set_syscall_retval(current_tf, 0);
+       set_errno(current_tf,0);
+
        typedef intreg_t (*syscall_t)(struct proc*,uintreg_t,uintreg_t,
                                      uintreg_t,uintreg_t,uintreg_t);
 
        typedef intreg_t (*syscall_t)(struct proc*,uintreg_t,uintreg_t,
                                      uintreg_t,uintreg_t,uintreg_t);
 
index 38c01ea..0a31f39 100644 (file)
@@ -6,143 +6,6 @@
   #define errno (*__errno_location())
 #endif
 
   #define errno (*__errno_location())
 #endif
 
-#define        EPERM            1      /* Operation not permitted */
-#define        ENOENT           2      /* No such file or directory */
-#define        ESRCH            3      /* No such process */
-#define        EINTR            4      /* Interrupted system call */
-#define        EIO              5      /* I/O error */
-#define        ENXIO            6      /* No such device or address */
-#define        E2BIG            7      /* Argument list too long */
-#define        ENOEXEC          8      /* Exec format error */
-#define        EBADF            9      /* Bad file number */
-#define        ECHILD          10      /* No child processes */
-#define        EAGAIN          11      /* Try again */
-#define        ENOMEM          12      /* Out of memory */
-#define        EACCES          13      /* Permission denied */
-#define        EFAULT          14      /* Bad address */
-#define        ENOTBLK         15      /* Block device required */
-#define        EBUSY           16      /* Device or resource busy */
-#define        EEXIST          17      /* File exists */
-#define        EXDEV           18      /* Cross-device link */
-#define        ENODEV          19      /* No such device */
-#define        ENOTDIR         20      /* Not a directory */
-#define        EISDIR          21      /* Is a directory */
-#define        EINVAL          22      /* Invalid argument */
-#define        ENFILE          23      /* File table overflow */
-#define        EMFILE          24      /* Too many open files */
-#define        ENOTTY          25      /* Not a typewriter */
-#define        ETXTBSY         26      /* Text file busy */
-#define        EFBIG           27      /* File too large */
-#define        ENOSPC          28      /* No space left on device */
-#define        ESPIPE          29      /* Illegal seek */
-#define        EROFS           30      /* Read-only file system */
-#define        EMLINK          31      /* Too many links */
-#define        EPIPE           32      /* Broken pipe */
-#define        EDOM            33      /* Math argument out of domain of func */
-#define        ERANGE          34      /* Math result not representable */
-
-#define        EDEADLK         35      /* Resource deadlock would occur */
-#define        ENAMETOOLONG    36      /* File name too long */
-#define        ENOLCK          37      /* No record locks available */
-#define        ENOSYS          38      /* Function not implemented */
-#define        ENOTEMPTY       39      /* Directory not empty */
-#define        ELOOP           40      /* Too many symbolic links encountered */
-#define        EWOULDBLOCK     EAGAIN  /* Operation would block */
-#define        ENOMSG          42      /* No message of desired type */
-#define        EIDRM           43      /* Identifier removed */
-#define        ECHRNG          44      /* Channel number out of range */
-#define        EL2NSYNC        45      /* Level 2 not synchronized */
-#define        EL3HLT          46      /* Level 3 halted */
-#define        EL3RST          47      /* Level 3 reset */
-#define        ELNRNG          48      /* Link number out of range */
-#define        EUNATCH         49      /* Protocol driver not attached */
-#define        ENOCSI          50      /* No CSI structure available */
-#define        EL2HLT          51      /* Level 2 halted */
-#define        EBADE           52      /* Invalid exchange */
-#define        EBADR           53      /* Invalid request descriptor */
-#define        EXFULL          54      /* Exchange full */
-#define        ENOANO          55      /* No anode */
-#define        EBADRQC         56      /* Invalid request code */
-#define        EBADSLT         57      /* Invalid slot */
-
-#define        EDEADLOCK       EDEADLK
-
-#define        EBFONT          59      /* Bad font file format */
-#define        ENOSTR          60      /* Device not a stream */
-#define        ENODATA         61      /* No data available */
-#define        ETIME           62      /* Timer expired */
-#define        ENOSR           63      /* Out of streams resources */
-#define        ENONET          64      /* Machine is not on the network */
-#define        ENOPKG          65      /* Package not installed */
-#define        EREMOTE         66      /* Object is remote */
-#define        ENOLINK         67      /* Link has been severed */
-#define        EADV            68      /* Advertise error */
-#define        ESRMNT          69      /* Srmount error */
-#define        ECOMM           70      /* Communication error on send */
-#define        EPROTO          71      /* Protocol error */
-#define        EMULTIHOP       72      /* Multihop attempted */
-#define        EDOTDOT         73      /* RFS specific error */
-#define        EBADMSG         74      /* Not a data message */
-#define        EOVERFLOW       75      /* Value too large for defined data type */
-#define        ENOTUNIQ        76      /* Name not unique on network */
-#define        EBADFD          77      /* File descriptor in bad state */
-#define        EREMCHG         78      /* Remote address changed */
-#define        ELIBACC         79      /* Can not access a needed shared library */
-#define        ELIBBAD         80      /* Accessing a corrupted shared library */
-#define        ELIBSCN         81      /* .lib section in a.out corrupted */
-#define        ELIBMAX         82      /* Attempting to link in too many shared libraries */
-#define        ELIBEXEC        83      /* Cannot exec a shared library directly */
-#define        EILSEQ          84      /* Illegal byte sequence */
-#define        ERESTART        85      /* Interrupted system call should be restarted */
-#define        ESTRPIPE        86      /* Streams pipe error */
-#define        EUSERS          87      /* Too many users */
-#define        ENOTSOCK        88      /* Socket operation on non-socket */
-#define        EDESTADDRREQ    89      /* Destination address required */
-#define        EMSGSIZE        90      /* Message too long */
-#define        EPROTOTYPE      91      /* Protocol wrong type for socket */
-#define        ENOPROTOOPT     92      /* Protocol not available */
-#define        EPROTONOSUPPORT 93      /* Protocol not supported */
-#define        ESOCKTNOSUPPORT 94      /* Socket type not supported */
-#define        EOPNOTSUPP      95      /* Operation not supported on transport endpoint */
-#define ENOTSUP                EOPNOTSUPP
-#define        EPFNOSUPPORT    96      /* Protocol family not supported */
-#define        EAFNOSUPPORT    97      /* Address family not supported by protocol */
-#define        EADDRINUSE      98      /* Address already in use */
-#define        EADDRNOTAVAIL   99      /* Cannot assign requested address */
-#define        ENETDOWN        100     /* Network is down */
-#define        ENETUNREACH     101     /* Network is unreachable */
-#define        ENETRESET       102     /* Network dropped connection because of reset */
-#define        ECONNABORTED    103     /* Software caused connection abort */
-#define        ECONNRESET      104     /* Connection reset by peer */
-#define        ENOBUFS         105     /* No buffer space available */
-#define        EISCONN         106     /* Transport endpoint is already connected */
-#define        ENOTCONN        107     /* Transport endpoint is not connected */
-#define        ESHUTDOWN       108     /* Cannot send after transport endpoint shutdown */
-#define        ETOOMANYREFS    109     /* Too many references: cannot splice */
-#define        ETIMEDOUT       110     /* Connection timed out */
-#define        ECONNREFUSED    111     /* Connection refused */
-#define        EHOSTDOWN       112     /* Host is down */
-#define        EHOSTUNREACH    113     /* No route to host */
-#define        EALREADY        114     /* Operation already in progress */
-#define        EINPROGRESS     115     /* Operation now in progress */
-#define        ESTALE          116     /* Stale NFS file handle */
-#define        EUCLEAN         117     /* Structure needs cleaning */
-#define        ENOTNAM         118     /* Not a XENIX named type file */
-#define        ENAVAIL         119     /* No XENIX semaphores available */
-#define        EISNAM          120     /* Is a named type file */
-#define        EREMOTEIO       121     /* Remote I/O error */
-#define        EDQUOT          122     /* Quota exceeded */
-
-#define        ENOMEDIUM       123     /* No medium found */
-#define        EMEDIUMTYPE     124     /* Wrong medium type */
-#define        ECANCELED       125     /* Operation Canceled */
-#define        ENOKEY          126     /* Required key not available */
-#define        EKEYEXPIRED     127     /* Key has expired */
-#define        EKEYREVOKED     128     /* Key has been revoked */
-#define        EKEYREJECTED    129     /* Key was rejected by service */
-
-/* for robust mutexes */
-#define        EOWNERDEAD      130     /* Owner died */
-#define        ENOTRECOVERABLE 131     /* State not recoverable */
+#include <ros/errno.h>
 
 #endif
 
 #endif
index 3290826..331619f 100644 (file)
@@ -9,21 +9,23 @@
 
 const char* tls_init_tp(void* thrdescr)
 {
 
 const char* tls_init_tp(void* thrdescr)
 {
-  int core_id = __hart_self();
+  int core_id = __syscall_sysenter(SYS_getvcoreid,0,0,0,0,0,NULL);
 
   static int initialized = 0;
   if(!initialized)
   {
 
   static int initialized = 0;
   if(!initialized)
   {
-    assert(core_id == 0);
     initialized = 1;
 
     size_t sz= (sizeof(segdesc_t)*__procinfo.max_harts+PGSIZE-1)/PGSIZE*PGSIZE;
     initialized = 1;
 
     size_t sz= (sizeof(segdesc_t)*__procinfo.max_harts+PGSIZE-1)/PGSIZE*PGSIZE;
-    __procdata.ldt = mmap((void*)USTACKBOT - LDT_SIZE, sz,
-                          PROT_READ | PROT_WRITE,
-                          MAP_ANONYMOUS | MAP_FIXED, -1, 0);
+    
+    intreg_t params[3] = { MAP_ANONYMOUS | MAP_FIXED, -1, 0 };
+    __procdata.ldt  = (void*) __syscall_sysenter(SYS_mmap,
+                                                 (void*)USTACKBOT - LDT_SIZE, 
+                                                 sz, PROT_READ | PROT_WRITE, 
+                                                 params, 0, NULL);
 
     // force kernel crossing
 
     // force kernel crossing
-    ros_syscall(SYS_getpid,0,0,0,0,0);
+    __syscall_sysenter(SYS_getpid,0,0,0,0,0,NULL);
     if(__procdata.ldt == MAP_FAILED)
       return "tls couldn't allocate memory\n";
   }
     if(__procdata.ldt == MAP_FAILED)
       return "tls couldn't allocate memory\n";
   }