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