sim, arm: implement more of the at variety syscalls
Needed for new AArch64 binaries
This commit is contained in:
parent
f5c3f60601
commit
c4a2f76fea
3 changed files with 53 additions and 8 deletions
|
@ -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),
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue