Giacomo Travaglini has submitted this change. ( https://gem5-review.googlesource.com/c/public/gem5/+/51047 )

Change subject: sim-se: Rewrite some syscalls to use a syscallImpl function
......................................................................

sim-se: Rewrite some syscalls to use a syscallImpl function

The following at suffixed syscalls are implemented on top of their
CWD version

* readlinkat -> readlink
* unlinkat -> unlink
* renameat -> rename
* faccessat -> access

With this patch we are decoupling interface from implementation, moving
the latter into a separate syscallImpl function which will by called by
both syscall flavours

This is a required step towards properly implementing AT based syscalls

JIRA: https://gem5.atlassian.net/browse/GEM5-1098

Change-Id: I022e9876a2a0b9ddf2d70d10cd4e6851ba7ff094
Signed-off-by: Giacomo Travaglini <giacomo.travagl...@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/51047
Maintainer: Bobby R. Bruce <bbr...@ucdavis.edu>
Tested-by: kokoro <noreply+kok...@google.com>
Reviewed-by: Gabe Black <gabe.bl...@gmail.com>
Reviewed-by: Richard Cooper <richard.coo...@arm.com>
---
M src/sim/syscall_emul.cc
M src/sim/syscall_emul.hh
2 files changed, 100 insertions(+), 11 deletions(-)

Approvals:
  Gabe Black: Looks good to me, approved
  Richard Cooper: Looks good to me, but someone else must approve
  Bobby R. Bruce: Looks good to me, approved
  kokoro: Regressions pass




diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc
index a8b1221..2f73800 100644
--- a/src/sim/syscall_emul.cc
+++ b/src/sim/syscall_emul.cc
@@ -403,11 +403,18 @@
              VPtr<> pathname, VPtr<> buf_ptr, size_t bufsiz)
 {
     std::string path;
-    auto p = tc->getProcessPtr();
-
     if (!SETranslatingPortProxy(tc).tryReadString(path, pathname))
         return -EFAULT;

+    return readlinkImpl(desc, tc, path, buf_ptr, bufsiz);
+}
+
+SyscallReturn
+readlinkImpl(SyscallDesc *desc, ThreadContext *tc,
+             std::string path, VPtr<> buf_ptr, size_t bufsiz)
+{
+    auto p = tc->getProcessPtr();
+
     // Adjust path for cwd and redirection
     path = p->checkPathRedirect(path);

@@ -460,11 +467,16 @@
 unlinkFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> pathname)
 {
     std::string path;
-    auto p = tc->getProcessPtr();
-
     if (!SETranslatingPortProxy(tc).tryReadString(path, pathname))
         return -EFAULT;

+    return unlinkImpl(desc, tc, path);
+}
+
+SyscallReturn
+unlinkImpl(SyscallDesc *desc, ThreadContext *tc, std::string path)
+{
+    auto p = tc->getProcessPtr();
     path = p->checkPathRedirect(path);

     int result = unlink(path.c_str());
@@ -531,8 +543,6 @@
 renameFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> oldpath,
            VPtr<> newpath)
 {
-    auto p = tc->getProcessPtr();
-
     SETranslatingPortProxy proxy(tc);
     std::string old_name;
     if (!proxy.tryReadString(old_name, oldpath))
@@ -542,6 +552,15 @@
     if (!proxy.tryReadString(new_name, newpath))
         return -EFAULT;

+    return renameImpl(desc, tc, old_name, new_name);
+}
+
+SyscallReturn
+renameImpl(SyscallDesc *desc, ThreadContext *tc,
+           std::string old_name, std::string new_name)
+{
+    auto p = tc->getProcessPtr();
+
     // Adjust path for cwd and redirection
     old_name = p->checkPathRedirect(old_name);
     new_name = p->checkPathRedirect(new_name);
@@ -550,6 +569,7 @@
     return (result == -1) ? -errno : result;
 }

+
 SyscallReturn
 truncateFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> pathname,
         off_t length)
@@ -1011,10 +1031,17 @@
            VPtr<> pathname, mode_t mode)
 {
     std::string path;
-    auto p = tc->getProcessPtr();
     if (!SETranslatingPortProxy(tc).tryReadString(path, pathname))
         return -EFAULT;

+    return accessImpl(desc, tc, path, mode);
+}
+
+SyscallReturn
+accessImpl(SyscallDesc *desc, ThreadContext *tc,
+           std::string path, mode_t mode)
+{
+    auto p = tc->getProcessPtr();
     // Adjust path for cwd and redirection
     path = p->checkPathRedirect(path);

diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh
index 8929f90..d98076d 100644
--- a/src/sim/syscall_emul.hh
+++ b/src/sim/syscall_emul.hh
@@ -191,10 +191,14 @@
 /// Target readlink() handler.
 SyscallReturn readlinkFunc(SyscallDesc *desc, ThreadContext *tc,
                            VPtr<> pathname, VPtr<> buf, size_t bufsiz);
+SyscallReturn readlinkImpl(SyscallDesc *desc, ThreadContext *tc,
+                           std::string path, VPtr<> buf, size_t bufsiz);

 /// Target unlink() handler.
 SyscallReturn unlinkFunc(SyscallDesc *desc, ThreadContext *tc,
                          VPtr<> pathname);
+SyscallReturn unlinkImpl(SyscallDesc *desc, ThreadContext *tc,
+                         std::string path);

 /// Target link() handler
 SyscallReturn linkFunc(SyscallDesc *desc, ThreadContext *tc,
@@ -221,6 +225,8 @@
 /// Target rename() handler.
 SyscallReturn renameFunc(SyscallDesc *desc, ThreadContext *tc,
                          VPtr<> oldpath, VPtr<> newpath);
+SyscallReturn renameImpl(SyscallDesc *desc, ThreadContext *tc,
+                         std::string oldpath, std::string newpath);


 /// Target truncate() handler.
@@ -353,6 +359,8 @@
 /// Target access() handler
 SyscallReturn accessFunc(SyscallDesc *desc, ThreadContext *tc,
                          VPtr<> pathname, mode_t mode);
+SyscallReturn accessImpl(SyscallDesc *desc, ThreadContext *tc,
+                         std::string path, mode_t mode);

 // Target getsockopt() handler.
 SyscallReturn getsockoptFunc(SyscallDesc *desc, ThreadContext *tc,
@@ -916,10 +924,14 @@
 SyscallReturn
unlinkatFunc(SyscallDesc *desc, ThreadContext *tc, int dirfd, VPtr<> pathname)
 {
+    std::string path;
+    if (!SETranslatingPortProxy(tc).tryReadString(path, pathname))
+        return -EFAULT;
+
     if (dirfd != OS::TGT_AT_FDCWD)
         warn("unlinkat: first argument not AT_FDCWD; unlikely to work");

-    return unlinkFunc(desc, tc, pathname);
+    return unlinkImpl(desc, tc, path);
 }

 /// Target facessat() handler
@@ -928,9 +940,14 @@
 faccessatFunc(SyscallDesc *desc, ThreadContext *tc,
               int dirfd, VPtr<> pathname, int mode)
 {
+    std::string path;
+    if (!SETranslatingPortProxy(tc).tryReadString(path, pathname))
+        return -EFAULT;
+
     if (dirfd != OS::TGT_AT_FDCWD)
         warn("faccessat: first argument not AT_FDCWD; unlikely to work");
-    return accessFunc(desc, tc, pathname, mode);
+
+    return accessImpl(desc, tc, path, mode);
 }

 /// Target readlinkat() handler
@@ -939,9 +956,14 @@
 readlinkatFunc(SyscallDesc *desc, ThreadContext *tc,
                int dirfd, VPtr<> pathname, VPtr<> buf, size_t bufsiz)
 {
+    std::string path;
+    if (!SETranslatingPortProxy(tc).tryReadString(path, pathname))
+        return -EFAULT;
+
     if (dirfd != OS::TGT_AT_FDCWD)
         warn("openat: first argument not AT_FDCWD; unlikely to work");
-    return readlinkFunc(desc, tc, pathname, buf, bufsiz);
+
+    return readlinkImpl(desc, tc, path, buf, bufsiz);
 }

 /// Target renameat() handler.
@@ -950,13 +972,22 @@
 renameatFunc(SyscallDesc *desc, ThreadContext *tc,
              int olddirfd, VPtr<> oldpath, int newdirfd, VPtr<> newpath)
 {
+    SETranslatingPortProxy proxy(tc);
+    std::string old_name;
+    if (!proxy.tryReadString(old_name, oldpath))
+        return -EFAULT;
+
+    std::string new_name;
+    if (!proxy.tryReadString(new_name, newpath))
+        return -EFAULT;
+
     if (olddirfd != OS::TGT_AT_FDCWD)
         warn("renameat: first argument not AT_FDCWD; unlikely to work");

     if (newdirfd != OS::TGT_AT_FDCWD)
         warn("renameat: third argument not AT_FDCWD; unlikely to work");

-    return renameFunc(desc, tc, oldpath, newpath);
+    return renameImpl(desc, tc, old_name, new_name);
 }

 /// Target sysinfo() handler.

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/51047
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I022e9876a2a0b9ddf2d70d10cd4e6851ba7ff094
Gerrit-Change-Number: 51047
Gerrit-PatchSet: 3
Gerrit-Owner: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-Reviewer: Bobby R. Bruce <bbr...@ucdavis.edu>
Gerrit-Reviewer: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-Reviewer: Jason Lowe-Power <power...@gmail.com>
Gerrit-Reviewer: Richard Cooper <richard.coo...@arm.com>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to