dev: Use shared_ptr for Arguments::Data
[gem5.git] / src / sim / syscall_emul.hh
index ac01ba1e874c5d424f369616abeb27d068f11523..66c12f07de30b2a0ef85f51bcf9a816de01aad61 100644 (file)
@@ -253,7 +253,10 @@ SyscallReturn gethostnameFunc(SyscallDesc *desc, int num,
 SyscallReturn getcwdFunc(SyscallDesc *desc, int num,
                          LiveProcess *p, ThreadContext *tc);
 
-/// Target unlink() handler.
+/// Target readlink() handler.
+SyscallReturn readlinkFunc(SyscallDesc *desc, int num,
+                           LiveProcess *p, ThreadContext *tc,
+                           int index = 0);
 SyscallReturn readlinkFunc(SyscallDesc *desc, int num,
                            LiveProcess *p, ThreadContext *tc);
 
@@ -350,6 +353,9 @@ SyscallReturn cloneFunc(SyscallDesc *desc, int num,
 /// Target access() handler
 SyscallReturn accessFunc(SyscallDesc *desc, int num,
                                LiveProcess *p, ThreadContext *tc);
+SyscallReturn accessFunc(SyscallDesc *desc, int num,
+                               LiveProcess *p, ThreadContext *tc,
+                               int index);
 
 /// Futex system call
 ///  Implemented by Daniel Sanchez
@@ -696,6 +702,32 @@ openatFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
     return openFunc<OS>(desc, callnum, process, tc, 1);
 }
 
+/// Target facessat() handler
+template <class OS>
+SyscallReturn
+faccessatFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
+        ThreadContext *tc)
+{
+    int index = 0;
+    int dirfd = process->getSyscallArg(tc, index);
+    if (dirfd != OS::TGT_AT_FDCWD)
+        warn("faccessat: first argument not AT_FDCWD; unlikely to work");
+    return accessFunc(desc, callnum, process, tc, 1);
+}
+
+/// Target readlinkat() handler
+template <class OS>
+SyscallReturn
+readlinkatFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
+        ThreadContext *tc)
+{
+    int index = 0;
+    int dirfd = process->getSyscallArg(tc, index);
+    if (dirfd != OS::TGT_AT_FDCWD)
+        warn("openat: first argument not AT_FDCWD; unlikely to work");
+    return readlinkFunc(desc, callnum, process, tc, 1);
+}
+
 /// Target sysinfo() handler.
 template <class OS>
 SyscallReturn
@@ -790,9 +822,9 @@ mremapFunc(SyscallDesc *desc, int callnum, LiveProcess *process, ThreadContext *
     if (use_provided_address)
         provided_address = process->getSyscallArg(tc, index);
 
-    if ((start % TheISA::VMPageSize != 0) ||
-        (new_length % TheISA::VMPageSize != 0) ||
-        (provided_address % TheISA::VMPageSize != 0)) {
+    if ((start % TheISA::PageBytes != 0) ||
+        (new_length % TheISA::PageBytes != 0) ||
+        (provided_address % TheISA::PageBytes != 0)) {
         warn("mremap failing: arguments not page aligned");
         return -EINVAL;
     }
@@ -1194,8 +1226,8 @@ mmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
         }
     }
 
-    if ((start  % TheISA::VMPageSize) != 0 ||
-        (length % TheISA::VMPageSize) != 0) {
+    if ((start  % TheISA::PageBytes) != 0 ||
+        (length % TheISA::PageBytes) != 0) {
         warn("mmap failing: arguments not page-aligned: "
              "start 0x%x length 0x%x",
              start, length);