From 376c7285eedf5b235a414accf9f5253a4d55633e Mon Sep 17 00:00:00 2001 From: Rick Strong Date: Thu, 29 Nov 2007 00:22:46 -0500 Subject: 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 --- src/sim/syscall_emul.cc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'src/sim/syscall_emul.cc') 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]); -- cgit v1.2.3