summaryrefslogtreecommitdiff
path: root/src/sim/syscall_emul.cc
diff options
context:
space:
mode:
authorRick Strong <rstrong@cs.ucsd.edu>2007-11-29 00:22:46 -0500
committerRick Strong <rstrong@cs.ucsd.edu>2007-11-29 00:22:46 -0500
commit376c7285eedf5b235a414accf9f5253a4d55633e (patch)
tree1382af9b9573e5948df9720d0c1a2465aca6bd9d /src/sim/syscall_emul.cc
parentab598eadbfeefceb6501d4cca13147b660642d9e (diff)
downloadgem5-376c7285eedf5b235a414accf9f5253a4d55633e.tar.xz
Serialization: Fix serialization of file descriptors. Make sure open
file descriptors are reopened and the file pointer is in the same place as when the checkpoint occured. Signed-off by: Ali Saidi --HG-- extra : convert_revision : d9d2cd388c9c02f60e1269d6845891c35f94fc47
Diffstat (limited to 'src/sim/syscall_emul.cc')
-rw-r--r--src/sim/syscall_emul.cc10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc
index 876f39e99..f4b9b7ae3 100644
--- a/src/sim/syscall_emul.cc
+++ b/src/sim/syscall_emul.cc
@@ -350,12 +350,13 @@ SyscallReturn
dupFunc(SyscallDesc *desc, int num, LiveProcess *process, ThreadContext *tc)
{
int fd = process->sim_fd(tc->getSyscallArg(0));
-
if (fd < 0)
return -EBADF;
+ Process::FdMap *fdo = process->sim_fd_obj(tc->getSyscallArg(0));
+
int result = dup(fd);
- return (result == -1) ? -errno : process->alloc_fd(result);
+ return (result == -1) ? -errno : process->alloc_fd(result, fdo->filename, fdo->flags, fdo->mode, false);
}
@@ -442,9 +443,10 @@ pipePseudoFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
return pipe_retval;
}
- sim_fds[0] = process->alloc_fd(fds[0]);
- sim_fds[1] = process->alloc_fd(fds[1]);
+ sim_fds[0] = process->alloc_fd(fds[0], "PIPE-READ", O_WRONLY, -1, true);
+ sim_fds[1] = process->alloc_fd(fds[1], "PIPE-WRITE", O_RDONLY, -1, true);
+ process->setReadPipeSource(sim_fds[0], sim_fds[1]);
// Alpha Linux convention for pipe() is that fd[0] is returned as
// the return value of the function, and fd[1] is returned in r20.
tc->setIntReg(SyscallPseudoReturnReg, sim_fds[1]);