Fixes mmap() to use all six args (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 12 Nov 2010 06:22:10 +0000 (22:22 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:56 +0000 (17:35 -0700)
Rebuild your cross compiler.

sys_mmap() doesn't have to do the ghetto 6-arg hack, now that the kernel
can take real 6-arg syscalls.

kern/src/syscall.c
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/i386/tls.h
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/mmap.c
user/parlib/syscall.c

index 06119a2..60469ac 100644 (file)
@@ -584,13 +584,10 @@ static ssize_t sys_trywait(env_t* e, pid_t pid, int* status)
 
 /************** Memory Management Syscalls **************/
 
-static void *sys_mmap(struct proc *p, uintreg_t a1, uintreg_t a2, uintreg_t a3,
-                      uintreg_t *a456)
+static void *sys_mmap(struct proc *p, uintptr_t addr, size_t len, int prot,
+                      int flags, int fd, off_t offset)
 {
-       uintreg_t _a456[3];
-       if (memcpy_from_user(p, _a456, a456, 3 * sizeof(uintreg_t)))
-               sys_proc_destroy(p, p->pid, -1);
-       return mmap(p, a1, a2, a3, _a456[0], _a456[1], _a456[2]);
+       return mmap(p, addr, len, prot, flags, fd, offset);
 }
 
 static intreg_t sys_mprotect(struct proc *p, void *addr, size_t len, int prot)
index 0a9b0bb..dc70913 100644 (file)
@@ -447,12 +447,11 @@ static const char* tls_init_tp(void* thrdescr)
   {
     size_t sz= (sizeof(segdesc_t)*__procinfo.max_vcores+PGSIZE-1)/PGSIZE*PGSIZE;
     
-    // Can't directly call mmap because it tries to set errno, and errno doesn't
-    // exist yet (it relies on tls, and we are currently in the process of setting 
-    // it up...)
-    intreg_t params[3] = { MAP_ANONYMOUS | MAP_POPULATE, -1, 0 };
+       /* Can't directly call mmap because it tries to set errno, and errno doesn't
+        * exist yet (it relies on tls, and we are currently in the process of
+        * setting it up...) */
        void *ldt = (void*)__ros_syscall(SYS_mmap, 0, sz, PROT_READ | PROT_WRITE,
-                                        (long)params, 0, 0, NULL);
+                                        MAP_ANONYMOUS | MAP_POPULATE, -1, 0, NULL);
     if (ldt == MAP_FAILED)
       return "tls couldn't allocate memory\n";
 
index 96ed3af..47dd4f8 100644 (file)
@@ -41,8 +41,7 @@ __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
   }
   offset /= PGSIZE;
 
-  volatile int args[3] = {flags,fd,offset};
-  return (__ptr_t)ros_syscall(SYS_mmap, addr, len, prot, args, 0, 0);
+  return (__ptr_t)ros_syscall(SYS_mmap, addr, len, prot, flags, fd, offset);
 }
 
 weak_alias (__mmap, mmap)
index 43d5acb..ab54b0f 100644 (file)
@@ -106,24 +106,10 @@ int sys_proc_run(int pid)
        return ros_syscall(SYS_proc_run, pid, 0, 0, 0, 0, 0);
 }
 
-/* We need to do some hackery to pass 6 arguments.  Arg4 pts to the real arg4,
- * arg5, and arg6.  Keep this in sync with kern/src/syscall.c.
- * TODO: consider a syscall_multi that can take more args, and keep it in sync
- * with the kernel.  Maybe wait til we fix sysenter to have 5 or 6 args. */
 void *CT(length) sys_mmap(void *SNT addr, size_t length, int prot, int flags,
                           int fd, size_t offset)
 {
-       struct args {
-               int _flags;
-               int _fd;
-               size_t _offset;
-       } extra_args;
-       extra_args._flags = flags;
-       extra_args._fd = fd;
-       extra_args._offset = offset;
-       // TODO: deputy bitches about this
-       return (void*CT(length))TC(ros_syscall(SYS_mmap, addr, length,
-                                              prot, &extra_args, 0, 0));
+       return (void*)ros_syscall(SYS_mmap, addr, length, prot, flags, fd, offset);
 }
 
 int sys_notify(int pid, unsigned int notif, struct notif_event *ne)