diff options
author | Rick Strong <rstrong@cs.ucsd.edu> | 2007-11-29 00:22:46 -0500 |
---|---|---|
committer | Rick Strong <rstrong@cs.ucsd.edu> | 2007-11-29 00:22:46 -0500 |
commit | 376c7285eedf5b235a414accf9f5253a4d55633e (patch) | |
tree | 1382af9b9573e5948df9720d0c1a2465aca6bd9d /src/sim/syscall_emul.cc | |
parent | ab598eadbfeefceb6501d4cca13147b660642d9e (diff) | |
download | gem5-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.cc | 10 |
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]); |