arm: Add unlinkat syscall implementation
authormike upton <michaelupton@gmail.com>
Sat, 3 Jan 2015 23:51:48 +0000 (17:51 -0600)
committermike upton <michaelupton@gmail.com>
Sat, 3 Jan 2015 23:51:48 +0000 (17:51 -0600)
added ARM aarch64 unlinkat syscall support, modeled on other <xxx>at syscalls.
This gets all of the cpu2006 int workloads passing in SE mode on aarch64.

Committed by: Nilay Vaish <nilay@cs.wisc.edu>

src/arch/arm/linux/process.cc
src/sim/syscall_emul.cc
src/sim/syscall_emul.hh

index faa39fd3419650eab94b768801fef9f0dacbfd3e..269e92baed5b4096f0a87e6e13d06d3d762ae8ae 100644 (file)
@@ -523,7 +523,7 @@ static SyscallDesc syscallDescs64[] = {
     /*   32 */ SyscallDesc("flock", unimplementedFunc),
     /*   33 */ SyscallDesc("mknodat", unimplementedFunc),
     /*   34 */ SyscallDesc("mkdirat", unimplementedFunc),
-    /*   35 */ SyscallDesc("unlinkat", unimplementedFunc),
+    /*   35 */ SyscallDesc("unlinkat", unlinkatFunc<ArmLinux64>),
     /*   36 */ SyscallDesc("symlinkat", unimplementedFunc),
     /*   37 */ SyscallDesc("linkat", unimplementedFunc),
     /*   38 */ SyscallDesc("renameat", unimplementedFunc),
index 37d0121c5ca40b5ad39791beeefacc88671e8672..bf7efe210aa77f2b3d7fc7232331781e87e68f61 100644 (file)
@@ -399,10 +399,16 @@ readlinkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc,
 
 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;
 
index 0c06a514712fce3465fcf7e27a4b766fec68640e..cc430b9492b1c881219f613077887e5bed856594 100644 (file)
@@ -195,6 +195,9 @@ SyscallReturn readlinkFunc(SyscallDesc *desc, int num,
                            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 @@ openatFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
     return openFunc<OS>(desc, callnum, process, tc, 1);
 }
 
+/// Target unlinkat() handler.
+template <class OS>
+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 <class OS>
 SyscallReturn