arm: Implement some missing syscalls (SE mode)
authorGiacomo Gabrielli <Giacomo.Gabrielli@arm.com>
Tue, 26 May 2015 07:21:35 +0000 (03:21 -0400)
committerGiacomo Gabrielli <Giacomo.Gabrielli@arm.com>
Tue, 26 May 2015 07:21:35 +0000 (03:21 -0400)
Adding a few syscalls that were previously considered unimplemented.

src/arch/arm/linux/linux.hh
src/arch/arm/linux/process.cc
src/sim/syscall_emul.hh

index fbf5d21856d2329f120393745e4ed82bb422fe65..0dd1df373967c3aff801e4a14257191f98ef2490 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2011-2012 ARM Limited
+ * Copyright (c) 2010, 2011-2012, 2015 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -108,6 +108,11 @@ class ArmLinux32 : public Linux
         int32_t tv_usec;        //!< microseconds
     };
 
+    struct timespec {
+        int32_t tv_sec;   //!< seconds
+        int32_t tv_nsec;  //!< nanoseconds
+    };
+
     // For writev/readv
     struct tgt_iovec {
         uint32_t iov_base; // void *
@@ -297,6 +302,11 @@ class ArmLinux64 : public Linux
         int64_t tv_usec;        //!< microseconds
     };
 
+    struct timespec {
+        int64_t tv_sec;   //!< seconds
+        int64_t tv_nsec;  //!< nanoseconds
+    };
+
     // For writev/readv
     struct tgt_iovec {
         uint64_t iov_base; // void *
index 223db7afd11b1132fa56b22963f3a7d4277859d8..89a085002bce6dbe7fcd8a6a66194c35d9f63aa3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2013 ARM Limited
+ * Copyright (c) 2010-2013, 2015 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -382,7 +382,7 @@ static SyscallDesc syscallDescs32[] = {
     /* 260 */ SyscallDesc("timer_getoverrun", unimplementedFunc),
     /* 261 */ SyscallDesc("timer_delete", unimplementedFunc),
     /* 262 */ SyscallDesc("clock_settime", unimplementedFunc),
-    /* 263 */ SyscallDesc("clock_gettime", unimplementedFunc),
+    /* 263 */ SyscallDesc("clock_gettime", clock_gettimeFunc<ArmLinux32>),
     /* 264 */ SyscallDesc("clock_getres", unimplementedFunc),
     /* 265 */ SyscallDesc("clock_nanosleep", unimplementedFunc),
     /* 266 */ SyscallDesc("statfs64", unimplementedFunc),
@@ -526,7 +526,7 @@ static SyscallDesc syscallDescs64[] = {
     /*   35 */ SyscallDesc("unlinkat", unlinkatFunc<ArmLinux64>),
     /*   36 */ SyscallDesc("symlinkat", unimplementedFunc),
     /*   37 */ SyscallDesc("linkat", unimplementedFunc),
-    /*   38 */ SyscallDesc("renameat", unimplementedFunc),
+    /*   38 */ SyscallDesc("renameat", renameatFunc<ArmLinux64>),
     /*   39 */ SyscallDesc("umount2", unimplementedFunc),
     /*   40 */ SyscallDesc("mount", unimplementedFunc),
     /*   41 */ SyscallDesc("pivot_root", unimplementedFunc),
@@ -601,7 +601,7 @@ static SyscallDesc syscallDescs64[] = {
     /*  110 */ SyscallDesc("timer_settime", unimplementedFunc),
     /*  111 */ SyscallDesc("timer_delete", unimplementedFunc),
     /*  112 */ SyscallDesc("clock_settime", unimplementedFunc),
-    /*  113 */ SyscallDesc("clock_gettime", unimplementedFunc),
+    /*  113 */ SyscallDesc("clock_gettime", clock_gettimeFunc<ArmLinux64>),
     /*  114 */ SyscallDesc("clock_getres", unimplementedFunc),
     /*  115 */ SyscallDesc("clock_nanosleep", unimplementedFunc),
     /*  116 */ SyscallDesc("syslog", unimplementedFunc),
@@ -1521,7 +1521,7 @@ static SyscallDesc syscallDescs64[] = {
     /* 1030 */ SyscallDesc("mkdir", mkdirFunc),
     /* 1031 */ SyscallDesc("rmdir", unimplementedFunc),
     /* 1032 */ SyscallDesc("lchown", unimplementedFunc),
-    /* 1033 */ SyscallDesc("access", unimplementedFunc),
+    /* 1033 */ SyscallDesc("access", accessFunc),
     /* 1034 */ SyscallDesc("rename", renameFunc),
     /* 1035 */ SyscallDesc("readlink", readlinkFunc),
     /* 1036 */ SyscallDesc("symlink", unimplementedFunc),
index 05f87fd7d956c4a2aaec60d31e8017dd02f91da1..07b910727ce35c1f14e48f8ebcc57dc0db40c4bc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013 ARM Limited
+ * Copyright (c) 2012-2013, 2015 ARM Limited
  * Copyright (c) 2015 Advanced Micro Devices, Inc.
  * All rights reserved
  *
@@ -715,6 +715,42 @@ readlinkatFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
     return readlinkFunc(desc, callnum, process, tc, 1);
 }
 
+/// Target renameat() handler.
+template <class OS>
+SyscallReturn
+renameatFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
+             ThreadContext *tc)
+{
+    int index = 0;
+
+    int olddirfd = process->getSyscallArg(tc, index);
+    if (olddirfd != OS::TGT_AT_FDCWD)
+        warn("renameat: first argument not AT_FDCWD; unlikely to work");
+
+    std::string old_name;
+
+    if (!tc->getMemProxy().tryReadString(old_name,
+                                         process->getSyscallArg(tc, index)))
+        return -EFAULT;
+
+    int newdirfd = process->getSyscallArg(tc, index);
+    if (newdirfd != OS::TGT_AT_FDCWD)
+        warn("renameat: third argument not AT_FDCWD; unlikely to work");
+
+    std::string new_name;
+
+    if (!tc->getMemProxy().tryReadString(new_name,
+                                         process->getSyscallArg(tc, index)))
+        return -EFAULT;
+
+    // Adjust path for current working directory
+    old_name = process->fullPath(old_name);
+    new_name = process->fullPath(new_name);
+
+    int result = rename(old_name.c_str(), new_name.c_str());
+    return (result == -1) ? -errno : result;
+}
+
 /// Target sysinfo() handler.
 template <class OS>
 SyscallReturn