sim-se: Implement mknodat syscall
JIRA: https://gem5.atlassian.net/browse/GEM5-1098 Change-Id: Ic6b6b9350bcffdaed368373a6bffe4f9ece5feee Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/51056 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Jason Lowe-Power <power.jg@gmail.com> Maintainer: Bobby R. Bruce <bbruce@ucdavis.edu>
This commit is contained in:
@@ -928,11 +928,18 @@ SyscallReturn
|
||||
mknodFunc(SyscallDesc *desc, ThreadContext *tc,
|
||||
VPtr<> pathname, mode_t mode, dev_t dev)
|
||||
{
|
||||
auto p = tc->getProcessPtr();
|
||||
std::string path;
|
||||
if (!SETranslatingPortProxy(tc).tryReadString(path, pathname))
|
||||
return -EFAULT;
|
||||
|
||||
return mknodImpl(desc, tc, path, mode, dev);
|
||||
}
|
||||
|
||||
SyscallReturn
|
||||
mknodImpl(SyscallDesc *desc, ThreadContext *tc,
|
||||
std::string path, mode_t mode, dev_t dev)
|
||||
{
|
||||
auto p = tc->getProcessPtr();
|
||||
path = p->checkPathRedirect(path);
|
||||
|
||||
auto result = mknod(path.c_str(), mode, dev);
|
||||
|
||||
@@ -203,6 +203,8 @@ SyscallReturn mkdirImpl(SyscallDesc *desc, ThreadContext *tc,
|
||||
/// Target mknod() handler.
|
||||
SyscallReturn mknodFunc(SyscallDesc *desc, ThreadContext *tc,
|
||||
VPtr<> pathname, mode_t mode, dev_t dev);
|
||||
SyscallReturn mknodImpl(SyscallDesc *desc, ThreadContext *tc,
|
||||
std::string path, mode_t mode, dev_t dev);
|
||||
|
||||
/// Target chdir() handler.
|
||||
SyscallReturn chdirFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> pathname);
|
||||
@@ -1092,6 +1094,24 @@ mkdiratFunc(SyscallDesc *desc, ThreadContext *tc,
|
||||
return mkdirImpl(desc, tc, path, mode);
|
||||
}
|
||||
|
||||
/// Target mknodat() handler
|
||||
template <class OS>
|
||||
SyscallReturn
|
||||
mknodatFunc(SyscallDesc *desc, ThreadContext *tc,
|
||||
int dirfd, VPtr<> pathname, mode_t mode, dev_t dev)
|
||||
{
|
||||
std::string path;
|
||||
if (!SETranslatingPortProxy(tc).tryReadString(path, pathname))
|
||||
return -EFAULT;
|
||||
|
||||
// Modifying path from the directory descriptor
|
||||
if (auto res = atSyscallPath<OS>(tc, dirfd, path); !res.successful()) {
|
||||
return res;
|
||||
}
|
||||
|
||||
return mknodImpl(desc, tc, path, mode, dev);
|
||||
}
|
||||
|
||||
/// Target sysinfo() handler.
|
||||
template <class OS>
|
||||
SyscallReturn
|
||||
|
||||
Reference in New Issue
Block a user