diff options
author | Ali Saidi <Ali.Saidi@ARM.com> | 2014-04-17 16:55:05 -0500 |
---|---|---|
committer | Ali Saidi <Ali.Saidi@ARM.com> | 2014-04-17 16:55:05 -0500 |
commit | c4a2f76fea6f9361363afd901c40290abf3344d9 (patch) | |
tree | fe4c8e6d63d351683397418f9f8c4eecf4d0bac9 | |
parent | f5c3f60601c8877196f11f8fc7f79d57e9775426 (diff) | |
download | gem5-c4a2f76fea6f9361363afd901c40290abf3344d9.tar.xz |
sim, arm: implement more of the at variety syscalls
Needed for new AArch64 binaries
-rw-r--r-- | src/arch/arm/linux/process.cc | 4 | ||||
-rw-r--r-- | src/sim/syscall_emul.cc | 23 | ||||
-rw-r--r-- | src/sim/syscall_emul.hh | 34 |
3 files changed, 53 insertions, 8 deletions
diff --git a/src/arch/arm/linux/process.cc b/src/arch/arm/linux/process.cc index 7f8f9ccd6..faa39fd34 100644 --- a/src/arch/arm/linux/process.cc +++ b/src/arch/arm/linux/process.cc @@ -536,7 +536,7 @@ static SyscallDesc syscallDescs64[] = { /* 45 */ SyscallDesc("truncate64", unimplementedFunc), /* 46 */ SyscallDesc("ftruncate64", ftruncate64Func), /* 47 */ SyscallDesc("fallocate", unimplementedFunc), - /* 48 */ SyscallDesc("faccessat", unimplementedFunc), + /* 48 */ SyscallDesc("faccessat", faccessatFunc<ArmLinux64>), /* 49 */ SyscallDesc("chdir", unimplementedFunc), /* 50 */ SyscallDesc("fchdir", unimplementedFunc), /* 51 */ SyscallDesc("chroot", unimplementedFunc), @@ -566,7 +566,7 @@ static SyscallDesc syscallDescs64[] = { /* 75 */ SyscallDesc("vmsplice", unimplementedFunc), /* 76 */ SyscallDesc("splice", unimplementedFunc), /* 77 */ SyscallDesc("tee", unimplementedFunc), - /* 78 */ SyscallDesc("readlinkat", unimplementedFunc), + /* 78 */ SyscallDesc("readlinkat", readlinkatFunc<ArmLinux64>), /* 79 */ SyscallDesc("fstatat64", fstatat64Func<ArmLinux64>), /* 80 */ SyscallDesc("fstat64", fstat64Func<ArmLinux64>), /* 81 */ SyscallDesc("sync", unimplementedFunc), diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc index a86065317..935193e7f 100644 --- a/src/sim/syscall_emul.cc +++ b/src/sim/syscall_emul.cc @@ -351,13 +351,20 @@ getcwdFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc) return (result == -1) ? -errno : result; } +/// Target open() handler. +SyscallReturn +readlinkFunc(SyscallDesc *desc, int callnum, LiveProcess *process, + ThreadContext *tc) +{ + return readlinkFunc(desc, callnum, process, tc, 0); +} SyscallReturn -readlinkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc) +readlinkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc, + int index) { string path; - int index = 0; if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index))) return (TheISA::IntReg)-EFAULT; @@ -852,10 +859,9 @@ cloneFunc(SyscallDesc *desc, int callnum, LiveProcess *process, } SyscallReturn -accessFunc(SyscallDesc *desc, int callnum, LiveProcess *p, ThreadContext *tc) +accessFunc(SyscallDesc *desc, int callnum, LiveProcess *p, ThreadContext *tc, + int index) { - int index = 0; - string path; if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index))) return (TheISA::IntReg)-EFAULT; @@ -868,3 +874,10 @@ accessFunc(SyscallDesc *desc, int callnum, LiveProcess *p, ThreadContext *tc) int result = access(path.c_str(), mode); return (result == -1) ? -errno : result; } + +SyscallReturn +accessFunc(SyscallDesc *desc, int callnum, LiveProcess *p, ThreadContext *tc) +{ + return accessFunc(desc, callnum, p, tc, 0); +} + diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index ac01ba1e8..e971902cb 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -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 |