diff options
author | Steve Reinhardt <stever@eecs.umich.edu> | 2006-08-28 07:39:56 -0700 |
---|---|---|
committer | Steve Reinhardt <stever@eecs.umich.edu> | 2006-08-28 07:39:56 -0700 |
commit | c5384366b6e5fa487e0a25db6c539b5a9d54ca7b (patch) | |
tree | 14f07ddcde4dae918d9177b74d05eee33983fa68 /src | |
parent | dc68512222596fdd81e62e685def20497f6e63d1 (diff) | |
download | gem5-c5384366b6e5fa487e0a25db6c539b5a9d54ca7b.tar.xz |
Add dup() support (from Antti Miettinen).
--HG--
extra : convert_revision : 72c834666afa3c353da026617ad5e7a762eb645f
Diffstat (limited to 'src')
-rw-r--r-- | src/arch/alpha/linux/process.cc | 2 | ||||
-rw-r--r-- | src/sim/syscall_emul.cc | 13 | ||||
-rw-r--r-- | src/sim/syscall_emul.hh | 4 |
3 files changed, 18 insertions, 1 deletions
diff --git a/src/arch/alpha/linux/process.cc b/src/arch/alpha/linux/process.cc index 997c78ac9..357ebdada 100644 --- a/src/arch/alpha/linux/process.cc +++ b/src/arch/alpha/linux/process.cc @@ -162,7 +162,7 @@ SyscallDesc AlphaLinuxProcess::syscallDescs[] = { /* 38 */ SyscallDesc("osf_old_stat", unimplementedFunc), /* 39 */ SyscallDesc("setpgid", unimplementedFunc), /* 40 */ SyscallDesc("osf_old_lstat", unimplementedFunc), - /* 41 */ SyscallDesc("dup", unimplementedFunc), + /* 41 */ SyscallDesc("dup", dupFunc), /* 42 */ SyscallDesc("pipe", pipePseudoFunc), /* 43 */ SyscallDesc("osf_set_program_attributes", unimplementedFunc), /* 44 */ SyscallDesc("osf_profil", unimplementedFunc), diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc index e72890612..cf90d8f84 100644 --- a/src/sim/syscall_emul.cc +++ b/src/sim/syscall_emul.cc @@ -301,6 +301,19 @@ fchownFunc(SyscallDesc *desc, int num, Process *process, ThreadContext *tc) SyscallReturn +dupFunc(SyscallDesc *desc, int num, Process *process, ThreadContext *tc) +{ + int fd = process->sim_fd(tc->getSyscallArg(0)); + + if (fd < 0) + return -EBADF; + + int result = dup(fd); + return (result == -1) ? -errno : process->alloc_fd(result); +} + + +SyscallReturn fcntlFunc(SyscallDesc *desc, int num, Process *process, ThreadContext *tc) { diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index a3ff006ef..69ef31421 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -245,6 +245,10 @@ SyscallReturn chownFunc(SyscallDesc *desc, int num, SyscallReturn fchownFunc(SyscallDesc *desc, int num, Process *p, ThreadContext *tc); +/// Target dup() handler. +SyscallReturn dupFunc(SyscallDesc *desc, int num, + Process *process, ThreadContext *tc); + /// Target fnctl() handler. SyscallReturn fcntlFunc(SyscallDesc *desc, int num, Process *process, ThreadContext *tc); |