diff -r ad9146bb5598 -r 09d30f60c31a src/arch/arm/linux/process.cc --- a/src/arch/arm/linux/process.cc Tue Dec 02 22:01:51 2014 -0800 +++ b/src/arch/arm/linux/process.cc Thu Dec 04 17:19:42 2014 -0800 @@ -523,7 +523,7 @@ /* 32 */ SyscallDesc("flock", unimplementedFunc), /* 33 */ SyscallDesc("mknodat", unimplementedFunc), /* 34 */ SyscallDesc("mkdirat", unimplementedFunc), - /* 35 */ SyscallDesc("unlinkat", unimplementedFunc), + /* 35 */ SyscallDesc("unlinkat", unlinkatFunc), /* 36 */ SyscallDesc("symlinkat", unimplementedFunc), /* 37 */ SyscallDesc("linkat", unimplementedFunc), /* 38 */ SyscallDesc("renameat", unimplementedFunc), diff -r ad9146bb5598 -r 09d30f60c31a src/sim/syscall_emul.hh --- a/src/sim/syscall_emul.hh Tue Dec 02 22:01:51 2014 -0800 +++ b/src/sim/syscall_emul.hh Thu Dec 04 17:19:42 2014 -0800 @@ -195,6 +195,9 @@ LiveProcess *p, ThreadContext *tc); /// Target unlink() handler. +SyscallReturn unlinkHelper(SyscallDesc *desc, int num, + LiveProcess *p, ThreadContext *tc, + int index); SyscallReturn unlinkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc); @@ -655,6 +658,20 @@ return openFunc(desc, callnum, process, tc, 1); } +/// Target unlinkat() handler. +template +SyscallReturn +unlinkatFunc(SyscallDesc *desc, int callnum, LiveProcess *process, + ThreadContext *tc) +{ + int index = 0; + int dirfd = process->getSyscallArg(tc, index); + if (dirfd != OS::TGT_AT_FDCWD) + warn("unlinkat: first argument not AT_FDCWD; unlikely to work"); + + return unlinkHelper(desc, callnum, process, tc, 1); +} + /// Target facessat() handler template SyscallReturn diff -r ad9146bb5598 -r 09d30f60c31a src/sim/syscall_emul.cc --- a/src/sim/syscall_emul.cc Tue Dec 02 22:01:51 2014 -0800 +++ b/src/sim/syscall_emul.cc Thu Dec 04 17:19:42 2014 -0800 @@ -400,9 +400,15 @@ SyscallReturn unlinkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc) { + return unlinkHelper(desc, num, p, tc, 0); +} + +SyscallReturn +unlinkHelper(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 -EFAULT;