syscalls: Add a bunch of missing system calls.
authorMichael Adler <Michael.Adler@intel.com>
Wed, 23 Jul 2008 21:41:33 +0000 (14:41 -0700)
committerMichael Adler <Michael.Adler@intel.com>
Wed, 23 Jul 2008 21:41:33 +0000 (14:41 -0700)
readlink, umask, truncate, ftruncate, mkdir, and getcwd.

src/arch/alpha/linux/process.cc
src/arch/alpha/tru64/process.cc
src/arch/mips/linux/process.cc
src/arch/sparc/linux/syscalls.cc
src/arch/sparc/solaris/process.cc
src/sim/process.hh
src/sim/syscall_emul.cc
src/sim/syscall_emul.hh

index ec47992bdcb9c381e3c76656b36892d287de1431..0a9d2f1a3f414fa16291881ba5c872a3b46b245e 100644 (file)
@@ -179,9 +179,9 @@ SyscallDesc AlphaLinuxProcess::syscallDescs[] = {
     /* 55 */ SyscallDesc("osf_reboot", unimplementedFunc),
     /* 56 */ SyscallDesc("osf_revoke", unimplementedFunc),
     /* 57 */ SyscallDesc("symlink", unimplementedFunc),
-    /* 58 */ SyscallDesc("readlink", unimplementedFunc),
+    /* 58 */ SyscallDesc("readlink", readlinkFunc),
     /* 59 */ SyscallDesc("execve", unimplementedFunc),
-    /* 60 */ SyscallDesc("umask", unimplementedFunc),
+    /* 60 */ SyscallDesc("umask", umaskFunc),
     /* 61 */ SyscallDesc("chroot", unimplementedFunc),
     /* 62 */ SyscallDesc("osf_old_fstat", unimplementedFunc),
     /* 63 */ SyscallDesc("getpgrp", unimplementedFunc),
@@ -250,14 +250,14 @@ SyscallDesc AlphaLinuxProcess::syscallDescs[] = {
     /* 126 */ SyscallDesc("setreuid", unimplementedFunc),
     /* 127 */ SyscallDesc("setregid", unimplementedFunc),
     /* 128 */ SyscallDesc("rename", renameFunc),
-    /* 129 */ SyscallDesc("truncate", unimplementedFunc),
-    /* 130 */ SyscallDesc("ftruncate", unimplementedFunc),
+    /* 129 */ SyscallDesc("truncate", truncateFunc),
+    /* 130 */ SyscallDesc("ftruncate", ftruncateFunc),
     /* 131 */ SyscallDesc("flock", unimplementedFunc),
     /* 132 */ SyscallDesc("setgid", unimplementedFunc),
     /* 133 */ SyscallDesc("sendto", unimplementedFunc),
     /* 134 */ SyscallDesc("shutdown", unimplementedFunc),
     /* 135 */ SyscallDesc("socketpair", unimplementedFunc),
-    /* 136 */ SyscallDesc("mkdir", unimplementedFunc),
+    /* 136 */ SyscallDesc("mkdir", mkdirFunc),
     /* 137 */ SyscallDesc("rmdir", unimplementedFunc),
     /* 138 */ SyscallDesc("osf_utimes", unimplementedFunc),
     /* 139 */ SyscallDesc("osf_old_sigreturn", unimplementedFunc),
@@ -491,7 +491,7 @@ SyscallDesc AlphaLinuxProcess::syscallDescs[] = {
     /* 364 */ SyscallDesc("getrusage", getrusageFunc<AlphaLinux>),
     /* 365 */ SyscallDesc("wait4", unimplementedFunc),
     /* 366 */ SyscallDesc("adjtimex", unimplementedFunc),
-    /* 367 */ SyscallDesc("getcwd", unimplementedFunc),
+    /* 367 */ SyscallDesc("getcwd", getcwdFunc),
     /* 368 */ SyscallDesc("capget", unimplementedFunc),
     /* 369 */ SyscallDesc("capset", unimplementedFunc),
     /* 370 */ SyscallDesc("sendfile", unimplementedFunc),
index 6823d820add268d50effe390c8e73188e8ce9c89..e9f7b6be15e6d37844f322e827d79f732f8e1ac3 100644 (file)
@@ -260,9 +260,9 @@ SyscallDesc AlphaTru64Process::syscallDescs[] = {
     /* 55 */ SyscallDesc("reboot", unimplementedFunc),
     /* 56 */ SyscallDesc("revoke", unimplementedFunc),
     /* 57 */ SyscallDesc("symlink", unimplementedFunc),
-    /* 58 */ SyscallDesc("readlink", unimplementedFunc),
+    /* 58 */ SyscallDesc("readlink", readlinkFunc),
     /* 59 */ SyscallDesc("execve", unimplementedFunc),
-    /* 60 */ SyscallDesc("umask", unimplementedFunc),
+    /* 60 */ SyscallDesc("umask", umaskFunc),
     /* 61 */ SyscallDesc("chroot", unimplementedFunc),
     /* 62 */ SyscallDesc("old_fstat", unimplementedFunc),
     /* 63 */ SyscallDesc("getpgrp", unimplementedFunc),
@@ -339,7 +339,7 @@ SyscallDesc AlphaTru64Process::syscallDescs[] = {
     /* 133 */ SyscallDesc("sendto", unimplementedFunc),
     /* 134 */ SyscallDesc("shutdown", unimplementedFunc),
     /* 135 */ SyscallDesc("socketpair", unimplementedFunc),
-    /* 136 */ SyscallDesc("mkdir", unimplementedFunc),
+    /* 136 */ SyscallDesc("mkdir", mkdirFunc),
     /* 137 */ SyscallDesc("rmdir", unimplementedFunc),
     /* 138 */ SyscallDesc("utimes", unimplementedFunc),
     /* 139 */ SyscallDesc("obsolete 4.2 sigreturn", unimplementedFunc),
index 06e6e2cf46be1cf150b1462fff26a9de341ef4bb..8a13d0f183c9f8714dcd018a71dd2578f4c42a4d 100644 (file)
@@ -160,7 +160,7 @@ SyscallDesc MipsLinuxProcess::syscallDescs[] = {
     /* 36 */ SyscallDesc("sync", unimplementedFunc),
     /* 37 */ SyscallDesc("kill", unimplementedFunc),
     /* 38 */ SyscallDesc("rename", unimplementedFunc),
-    /* 39 */ SyscallDesc("mkdir", unimplementedFunc),
+    /* 39 */ SyscallDesc("mkdir", mkdirFunc),
     /* 40 */ SyscallDesc("rmdir", unimplementedFunc),
     /* 41 */ SyscallDesc("dup", unimplementedFunc),
     /* 42 */ SyscallDesc("pipe", pipePseudoFunc),
@@ -181,7 +181,7 @@ SyscallDesc MipsLinuxProcess::syscallDescs[] = {
     /* 57 */ SyscallDesc("setpgid", unimplementedFunc),
     /* 58 */ SyscallDesc("ulimit", unimplementedFunc),
     /* 59 */ SyscallDesc("unused#59", unimplementedFunc),
-    /* 60 */ SyscallDesc("umask", unimplementedFunc),
+    /* 60 */ SyscallDesc("umask", umaskFunc),
     /* 61 */ SyscallDesc("chroot", unimplementedFunc),
     /* 62 */ SyscallDesc("ustat", unimplementedFunc),
     /* 63 */ SyscallDesc("dup2", unimplementedFunc),
@@ -206,7 +206,7 @@ SyscallDesc MipsLinuxProcess::syscallDescs[] = {
     /* 82 */ SyscallDesc("reserved#82", unimplementedFunc),
     /* 83 */ SyscallDesc("symlink", unimplementedFunc),
     /* 84 */ SyscallDesc("unused#84", unimplementedFunc),
-    /* 85 */ SyscallDesc("readlink", unimplementedFunc),
+    /* 85 */ SyscallDesc("readlink", readlinkFunc),
     /* 86 */ SyscallDesc("uselib", unimplementedFunc),
     /* 87 */ SyscallDesc("swapon", gethostnameFunc),
     /* 88 */ SyscallDesc("reboot", unimplementedFunc),
@@ -324,7 +324,7 @@ SyscallDesc MipsLinuxProcess::syscallDescs[] = {
     /* 200 */ SyscallDesc("pread64", unimplementedFunc),
     /* 201 */ SyscallDesc("pwrite64", unimplementedFunc),
     /* 202 */ SyscallDesc("chown", unimplementedFunc),
-    /* 203 */ SyscallDesc("getcwd", unimplementedFunc),
+    /* 203 */ SyscallDesc("getcwd", getcwdFunc),
     /* 204 */ SyscallDesc("capget", unimplementedFunc),
     /* 205 */ SyscallDesc("capset", unimplementedFunc),
     /* 206 */ SyscallDesc("sigalstack", unimplementedFunc),
index 03c8bafe2231a3ec4952367c5c09b6cee8dfa3e9..2964b3c1a75e4f9816fa8e5db2ca028065f85efc 100644 (file)
@@ -147,7 +147,7 @@ SyscallDesc SparcLinuxProcess::syscall32Descs[] = {
     /*  55 */ SyscallDesc("reboot", unimplementedFunc), //32 bit
     /*  56 */ SyscallDesc("mmap2", unimplementedFunc), //32 bit
     /*  57 */ SyscallDesc("symlink", unimplementedFunc),
-    /*  58 */ SyscallDesc("readlink", unimplementedFunc), //32 bit
+    /*  58 */ SyscallDesc("readlink", readlinkFunc), //32 bit
     /*  59 */ SyscallDesc("execve", unimplementedFunc), //32 bit
     /*  60 */ SyscallDesc("umask", unimplementedFunc), //32 bit
     /*  61 */ SyscallDesc("chroot", unimplementedFunc),
@@ -208,7 +208,7 @@ SyscallDesc SparcLinuxProcess::syscall32Descs[] = {
     /* 116 */ SyscallDesc("gettimeofday", unimplementedFunc), //32 bit
     /* 117 */ SyscallDesc("getrusage", unimplementedFunc), //32 bit
     /* 118 */ SyscallDesc("getsockopt", unimplementedFunc),
-    /* 119 */ SyscallDesc("getcwd", unimplementedFunc),
+    /* 119 */ SyscallDesc("getcwd", getcwdFunc),
     /* 120 */ SyscallDesc("readv", unimplementedFunc),
     /* 121 */ SyscallDesc("writev", unimplementedFunc),
     /* 122 */ SyscallDesc("settimeofday", unimplementedFunc), //32 bit
@@ -225,7 +225,7 @@ SyscallDesc SparcLinuxProcess::syscall32Descs[] = {
     /* 133 */ SyscallDesc("sendto", unimplementedFunc),
     /* 134 */ SyscallDesc("shutdown", unimplementedFunc),
     /* 135 */ SyscallDesc("socketpair", unimplementedFunc),
-    /* 136 */ SyscallDesc("mkdir", unimplementedFunc), //32 bit
+    /* 136 */ SyscallDesc("mkdir", mkdirFunc), //32 bit
     /* 137 */ SyscallDesc("rmdir", unimplementedFunc),
     /* 138 */ SyscallDesc("utimes", unimplementedFunc), //32 bit
     /* 139 */ SyscallDesc("stat64", unimplementedFunc),
@@ -450,7 +450,7 @@ SyscallDesc SparcLinuxProcess::syscallDescs[] = {
     /* 55 */ SyscallDesc("reboot", unimplementedFunc),
     /* 56 */ SyscallDesc("mmap2", unimplementedFunc),
     /* 57 */ SyscallDesc("symlink", unimplementedFunc),
-    /* 58 */ SyscallDesc("readlink", unimplementedFunc),
+    /* 58 */ SyscallDesc("readlink", readlinkFunc),
     /* 59 */ SyscallDesc("execve", unimplementedFunc),
     /* 60 */ SyscallDesc("umask", unimplementedFunc),
     /* 61 */ SyscallDesc("chroot", unimplementedFunc),
@@ -528,7 +528,7 @@ SyscallDesc SparcLinuxProcess::syscallDescs[] = {
     /* 133 */ SyscallDesc("sendto", unimplementedFunc),
     /* 134 */ SyscallDesc("shutdown", unimplementedFunc),
     /* 135 */ SyscallDesc("socketpair", unimplementedFunc),
-    /* 136 */ SyscallDesc("mkdir", unimplementedFunc),
+    /* 136 */ SyscallDesc("mkdir", mkdirFunc),
     /* 137 */ SyscallDesc("rmdir", unimplementedFunc),
     /* 138 */ SyscallDesc("utimes", unimplementedFunc),
     /* 139 */ SyscallDesc("stat64", unimplementedFunc),
index 40d172690f36bea853ca9c344dc19fdee7b96136..e0c3eaa4b108fb5d31abc35bf9c4c0d2a0419e06 100644 (file)
@@ -123,7 +123,7 @@ SyscallDesc SparcSolarisProcess::syscallDescs[] = {
     /* 57 */ SyscallDesc("utssys", unimplementedFunc),
     /* 58 */ SyscallDesc("fdsync", unimplementedFunc),
     /* 59 */ SyscallDesc("execve", unimplementedFunc),
-    /* 60 */ SyscallDesc("umask", unimplementedFunc),
+    /* 60 */ SyscallDesc("umask", umaskFunc),
     /* 61 */ SyscallDesc("chroot", unimplementedFunc),
     /* 62 */ SyscallDesc("fcntl", unimplementedFunc),
     /* 63 */ SyscallDesc("ulimit", unimplementedFunc),
@@ -153,7 +153,7 @@ SyscallDesc SparcSolarisProcess::syscallDescs[] = {
     /* 87 */ SyscallDesc("poll", unimplementedFunc),
     /* 88 */ SyscallDesc("lstat", unimplementedFunc),
     /* 89 */ SyscallDesc("symlink", unimplementedFunc),
-    /* 90 */ SyscallDesc("readlink", unimplementedFunc),
+    /* 90 */ SyscallDesc("readlink", readlinkFunc),
     /* 91 */ SyscallDesc("setgroups", unimplementedFunc),
     /* 92 */ SyscallDesc("getgroups", unimplementedFunc),
     /* 93 */ SyscallDesc("fchmod", unimplementedFunc),
index 29d6e5aae2dbd36cbbf521458e88c13f10a241df..55bae2542859ce7c1a139063922ec25368d62d84 100644 (file)
@@ -303,6 +303,8 @@ class LiveProcess : public Process
         return full + filename;
     }
 
+    std::string getcwd() const { return cwd; }
+
     virtual void syscall(int64_t callnum, ThreadContext *tc);
 
     virtual SyscallDesc* getDesc(int callnum) = 0;
index f4b9b7ae3985f02a10dd605ade6bdd1dde939023..3a0db10163f058bb8a54905682f0322eff8de1fe 100644 (file)
@@ -239,6 +239,59 @@ gethostnameFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
     return 0;
 }
 
+SyscallReturn
+getcwdFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
+{
+    int result = 0;
+    unsigned long size = tc->getSyscallArg(1);
+    BufferArg buf(tc->getSyscallArg(0), size);
+
+    // Is current working directory defined?
+    string cwd = p->getcwd();
+    if (!cwd.empty()) {
+        if (cwd.length() >= size) {
+            // Buffer too small
+            return -ERANGE;
+        }
+        strncpy((char *)buf.bufferPtr(), cwd.c_str(), size);
+        result = cwd.length();
+    }
+    else {
+        if (getcwd((char *)buf.bufferPtr(), size) != NULL) {
+            result = strlen((char *)buf.bufferPtr());
+        }
+        else {
+            result = -1;
+        }
+    }
+
+    buf.copyOut(tc->getMemPort());
+
+    return (result == -1) ? -errno : result;
+}
+
+
+SyscallReturn
+readlinkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
+{
+    string path;
+
+    if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
+        return (TheISA::IntReg)-EFAULT;
+
+    // Adjust path for current working directory
+    path = p->fullPath(path);
+
+    size_t bufsiz = tc->getSyscallArg(2);
+    BufferArg buf(tc->getSyscallArg(1), bufsiz);
+
+    int result = readlink(path.c_str(), (char *)buf.bufferPtr(), bufsiz);
+
+    buf.copyOut(tc->getMemPort());
+
+    return (result == -1) ? -errno : result;
+}
+
 SyscallReturn
 unlinkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
 {
@@ -254,6 +307,24 @@ unlinkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
     return (result == -1) ? -errno : result;
 }
 
+
+SyscallReturn
+mkdirFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
+{
+    string path;
+
+    if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
+        return (TheISA::IntReg)-EFAULT;
+
+    // Adjust path for current working directory
+    path = p->fullPath(path);
+
+    mode_t mode = tc->getSyscallArg(1);
+
+    int result = mkdir(path.c_str(), mode);
+    return (result == -1) ? -errno : result;
+}
+
 SyscallReturn
 renameFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
 {
@@ -306,6 +377,17 @@ ftruncateFunc(SyscallDesc *desc, int num, LiveProcess *process, ThreadContext *t
     return (result == -1) ? -errno : result;
 }
 
+SyscallReturn
+umaskFunc(SyscallDesc *desc, int num, LiveProcess *process, ThreadContext *tc)
+{
+    // Letting the simulated program change the simulator's umask seems like
+    // a bad idea.  Compromise by just returning the current umask but not
+    // changing anything.
+    mode_t oldMask = umask(0);
+    umask(oldMask);
+    return oldMask;
+}
+
 SyscallReturn
 chownFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
 {
index e35b0a75b29cde974dd345056c1b8d51b5385f5d..6dafee34c9f65dd96c022b02fc4931b9ef6ebd7e 100644 (file)
@@ -223,10 +223,22 @@ SyscallReturn munmapFunc(SyscallDesc *desc, int num,
 SyscallReturn gethostnameFunc(SyscallDesc *desc, int num,
                               LiveProcess *p, ThreadContext *tc);
 
+/// Target getcwd() handler.
+SyscallReturn getcwdFunc(SyscallDesc *desc, int num,
+                         LiveProcess *p, ThreadContext *tc);
+
+/// Target unlink() handler.
+SyscallReturn readlinkFunc(SyscallDesc *desc, int num,
+                           LiveProcess *p, ThreadContext *tc);
+
 /// Target unlink() handler.
 SyscallReturn unlinkFunc(SyscallDesc *desc, int num,
                          LiveProcess *p, ThreadContext *tc);
 
+/// Target mkdir() handler.
+SyscallReturn mkdirFunc(SyscallDesc *desc, int num,
+                        LiveProcess *p, ThreadContext *tc);
+
 /// Target rename() handler.
 SyscallReturn renameFunc(SyscallDesc *desc, int num,
                          LiveProcess *p, ThreadContext *tc);
@@ -242,6 +254,11 @@ SyscallReturn ftruncateFunc(SyscallDesc *desc, int num,
                             LiveProcess *p, ThreadContext *tc);
 
 
+/// Target umask() handler.
+SyscallReturn umaskFunc(SyscallDesc *desc, int num,
+                        LiveProcess *p, ThreadContext *tc);
+
+
 /// Target chown() handler.
 SyscallReturn chownFunc(SyscallDesc *desc, int num,
                         LiveProcess *p, ThreadContext *tc);