x86, sim: add some syscalls to X86
authorTony Gutierrez <anthony.gutierrez@amd.com>
Thu, 4 Aug 2016 16:32:21 +0000 (12:32 -0400)
committerTony Gutierrez <anthony.gutierrez@amd.com>
Thu, 4 Aug 2016 16:32:21 +0000 (12:32 -0400)
this patch adds an implementation for the pwrite64 syscall and
enables it for x86_64, and enables fstatfs for x86_64.

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

index 665815c301f9bfacabe9c398643d916c1ffa75bf..08137b94380d1b9f5bad29c0534100403d4da1ba 100644 (file)
@@ -236,7 +236,7 @@ static SyscallDesc syscallDescs64[] = {
     /*  15 */ SyscallDesc("rt_sigreturn", unimplementedFunc),
     /*  16 */ SyscallDesc("ioctl", ioctlFunc<X86Linux64>),
     /*  17 */ SyscallDesc("pread64", unimplementedFunc),
-    /*  18 */ SyscallDesc("pwrite64", unimplementedFunc),
+    /*  18 */ SyscallDesc("pwrite64", pwrite64Func<X86Linux64>),
     /*  19 */ SyscallDesc("readv", unimplementedFunc),
     /*  20 */ SyscallDesc("writev", writevFunc<X86Linux64>),
     /*  21 */ SyscallDesc("access", ignoreFunc),
@@ -356,7 +356,7 @@ static SyscallDesc syscallDescs64[] = {
     /* 135 */ SyscallDesc("personality", unimplementedFunc),
     /* 136 */ SyscallDesc("ustat", unimplementedFunc),
     /* 137 */ SyscallDesc("statfs", unimplementedFunc),
-    /* 138 */ SyscallDesc("fstatfs", unimplementedFunc),
+    /* 138 */ SyscallDesc("fstatfs", fstatfsFunc<X86Linux64>),
     /* 139 */ SyscallDesc("sysfs", unimplementedFunc),
     /* 140 */ SyscallDesc("getpriority", unimplementedFunc),
     /* 141 */ SyscallDesc("setpriority", unimplementedFunc),
index e9ed130f08f46bd45fa30a9d431604189c731a85..906a01edbb8df6de1f869cd67051b05bee3550b0 100644 (file)
@@ -1389,6 +1389,28 @@ mmapImpl(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc,
     return start;
 }
 
+template <class OS>
+SyscallReturn
+pwrite64Func(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
+{
+    int index = 0;
+    int tgt_fd = p->getSyscallArg(tc, index);
+    Addr bufPtr = p->getSyscallArg(tc, index);
+    int nbytes = p->getSyscallArg(tc, index);
+    int offset = p->getSyscallArg(tc, index);
+
+    int sim_fd = p->getSimFD(tgt_fd);
+    if (sim_fd < 0)
+        return -EBADF;
+
+    BufferArg bufArg(bufPtr, nbytes);
+    bufArg.copyIn(tc->getMemProxy());
+
+    int bytes_written = pwrite64(sim_fd, bufArg.bufferPtr(), nbytes, offset);
+
+    return (bytes_written == -1) ? -errno : bytes_written;
+}
+
 /// Target mmap() handler.
 template <class OS>
 SyscallReturn