diff options
author | Giacomo Gabrielli <Giacomo.Gabrielli@arm.com> | 2015-05-26 03:21:35 -0400 |
---|---|---|
committer | Giacomo Gabrielli <Giacomo.Gabrielli@arm.com> | 2015-05-26 03:21:35 -0400 |
commit | cc2346e8ca7ad247c701ec58ffddd98fa9f03574 (patch) | |
tree | 8e648af761bc413d8d7f7feb68f7e85076d9bc0f | |
parent | 0cc350d2c59d0e1b19cc377814ae7ef0860ee7ab (diff) | |
download | gem5-cc2346e8ca7ad247c701ec58ffddd98fa9f03574.tar.xz |
arm: Implement some missing syscalls (SE mode)
Adding a few syscalls that were previously considered unimplemented.
-rw-r--r-- | src/arch/arm/linux/linux.hh | 12 | ||||
-rw-r--r-- | src/arch/arm/linux/process.cc | 10 | ||||
-rw-r--r-- | src/sim/syscall_emul.hh | 38 |
3 files changed, 53 insertions, 7 deletions
diff --git a/src/arch/arm/linux/linux.hh b/src/arch/arm/linux/linux.hh index fbf5d2185..0dd1df373 100644 --- a/src/arch/arm/linux/linux.hh +++ b/src/arch/arm/linux/linux.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011-2012 ARM Limited + * Copyright (c) 2010, 2011-2012, 2015 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -108,6 +108,11 @@ class ArmLinux32 : public Linux int32_t tv_usec; //!< microseconds }; + struct timespec { + int32_t tv_sec; //!< seconds + int32_t tv_nsec; //!< nanoseconds + }; + // For writev/readv struct tgt_iovec { uint32_t iov_base; // void * @@ -297,6 +302,11 @@ class ArmLinux64 : public Linux int64_t tv_usec; //!< microseconds }; + struct timespec { + int64_t tv_sec; //!< seconds + int64_t tv_nsec; //!< nanoseconds + }; + // For writev/readv struct tgt_iovec { uint64_t iov_base; // void * diff --git a/src/arch/arm/linux/process.cc b/src/arch/arm/linux/process.cc index 223db7afd..89a085002 100644 --- a/src/arch/arm/linux/process.cc +++ b/src/arch/arm/linux/process.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 ARM Limited + * Copyright (c) 2010-2013, 2015 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -382,7 +382,7 @@ static SyscallDesc syscallDescs32[] = { /* 260 */ SyscallDesc("timer_getoverrun", unimplementedFunc), /* 261 */ SyscallDesc("timer_delete", unimplementedFunc), /* 262 */ SyscallDesc("clock_settime", unimplementedFunc), - /* 263 */ SyscallDesc("clock_gettime", unimplementedFunc), + /* 263 */ SyscallDesc("clock_gettime", clock_gettimeFunc<ArmLinux32>), /* 264 */ SyscallDesc("clock_getres", unimplementedFunc), /* 265 */ SyscallDesc("clock_nanosleep", unimplementedFunc), /* 266 */ SyscallDesc("statfs64", unimplementedFunc), @@ -526,7 +526,7 @@ static SyscallDesc syscallDescs64[] = { /* 35 */ SyscallDesc("unlinkat", unlinkatFunc<ArmLinux64>), /* 36 */ SyscallDesc("symlinkat", unimplementedFunc), /* 37 */ SyscallDesc("linkat", unimplementedFunc), - /* 38 */ SyscallDesc("renameat", unimplementedFunc), + /* 38 */ SyscallDesc("renameat", renameatFunc<ArmLinux64>), /* 39 */ SyscallDesc("umount2", unimplementedFunc), /* 40 */ SyscallDesc("mount", unimplementedFunc), /* 41 */ SyscallDesc("pivot_root", unimplementedFunc), @@ -601,7 +601,7 @@ static SyscallDesc syscallDescs64[] = { /* 110 */ SyscallDesc("timer_settime", unimplementedFunc), /* 111 */ SyscallDesc("timer_delete", unimplementedFunc), /* 112 */ SyscallDesc("clock_settime", unimplementedFunc), - /* 113 */ SyscallDesc("clock_gettime", unimplementedFunc), + /* 113 */ SyscallDesc("clock_gettime", clock_gettimeFunc<ArmLinux64>), /* 114 */ SyscallDesc("clock_getres", unimplementedFunc), /* 115 */ SyscallDesc("clock_nanosleep", unimplementedFunc), /* 116 */ SyscallDesc("syslog", unimplementedFunc), @@ -1521,7 +1521,7 @@ static SyscallDesc syscallDescs64[] = { /* 1030 */ SyscallDesc("mkdir", mkdirFunc), /* 1031 */ SyscallDesc("rmdir", unimplementedFunc), /* 1032 */ SyscallDesc("lchown", unimplementedFunc), - /* 1033 */ SyscallDesc("access", unimplementedFunc), + /* 1033 */ SyscallDesc("access", accessFunc), /* 1034 */ SyscallDesc("rename", renameFunc), /* 1035 */ SyscallDesc("readlink", readlinkFunc), /* 1036 */ SyscallDesc("symlink", unimplementedFunc), diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index 05f87fd7d..07b910727 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2013 ARM Limited + * Copyright (c) 2012-2013, 2015 ARM Limited * Copyright (c) 2015 Advanced Micro Devices, Inc. * All rights reserved * @@ -715,6 +715,42 @@ readlinkatFunc(SyscallDesc *desc, int callnum, LiveProcess *process, return readlinkFunc(desc, callnum, process, tc, 1); } +/// Target renameat() handler. +template <class OS> +SyscallReturn +renameatFunc(SyscallDesc *desc, int callnum, LiveProcess *process, + ThreadContext *tc) +{ + int index = 0; + + int olddirfd = process->getSyscallArg(tc, index); + if (olddirfd != OS::TGT_AT_FDCWD) + warn("renameat: first argument not AT_FDCWD; unlikely to work"); + + std::string old_name; + + if (!tc->getMemProxy().tryReadString(old_name, + process->getSyscallArg(tc, index))) + return -EFAULT; + + int newdirfd = process->getSyscallArg(tc, index); + if (newdirfd != OS::TGT_AT_FDCWD) + warn("renameat: third argument not AT_FDCWD; unlikely to work"); + + std::string new_name; + + if (!tc->getMemProxy().tryReadString(new_name, + process->getSyscallArg(tc, index))) + return -EFAULT; + + // Adjust path for current working directory + old_name = process->fullPath(old_name); + new_name = process->fullPath(new_name); + + int result = rename(old_name.c_str(), new_name.c_str()); + return (result == -1) ? -errno : result; +} + /// Target sysinfo() handler. template <class OS> SyscallReturn |