syscall_emul.cc revision 2426
17139Sgblack@eecs.umich.edu/* 27139Sgblack@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan 37139Sgblack@eecs.umich.edu * All rights reserved. 47139Sgblack@eecs.umich.edu * 57139Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 67139Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 77139Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 87139Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 97139Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 107139Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 117139Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 127139Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 137139Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 147139Sgblack@eecs.umich.edu * this software without specific prior written permission. 157139Sgblack@eecs.umich.edu * 167139Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177139Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187139Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197139Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207139Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217139Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227139Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237139Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 247139Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 257139Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 267139Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277139Sgblack@eecs.umich.edu */ 287139Sgblack@eecs.umich.edu 297139Sgblack@eecs.umich.edu#include <fcntl.h> 307139Sgblack@eecs.umich.edu#include <unistd.h> 317139Sgblack@eecs.umich.edu 327139Sgblack@eecs.umich.edu#include <string> 337139Sgblack@eecs.umich.edu#include <iostream> 347139Sgblack@eecs.umich.edu 357139Sgblack@eecs.umich.edu#include "sim/syscall_emul.hh" 367139Sgblack@eecs.umich.edu#include "base/trace.hh" 377139Sgblack@eecs.umich.edu#include "cpu/exec_context.hh" 387243Sgblack@eecs.umich.edu#include "cpu/base.hh" 397243Sgblack@eecs.umich.edu#include "sim/process.hh" 407243Sgblack@eecs.umich.edu 417243Sgblack@eecs.umich.edu#include "sim/sim_events.hh" 427243Sgblack@eecs.umich.edu 437243Sgblack@eecs.umich.eduusing namespace std; 447243Sgblack@eecs.umich.eduusing namespace TheISA; 457243Sgblack@eecs.umich.edu 467243Sgblack@eecs.umich.eduvoid 477243Sgblack@eecs.umich.eduSyscallDesc::doSyscall(int callnum, Process *process, ExecContext *xc) 487243Sgblack@eecs.umich.edu{ 497243Sgblack@eecs.umich.edu DPRINTFR(SyscallVerbose, "%s: syscall %s called\n", 507243Sgblack@eecs.umich.edu xc->getCpuPtr()->name(), name); 517243Sgblack@eecs.umich.edu 527243Sgblack@eecs.umich.edu SyscallReturn retval = (*funcPtr)(this, callnum, process, xc); 537243Sgblack@eecs.umich.edu 547139Sgblack@eecs.umich.edu DPRINTFR(SyscallVerbose, "%s: syscall %s returns %d\n", 557188Sgblack@eecs.umich.edu xc->getCpuPtr()->name(), name, retval.value()); 567188Sgblack@eecs.umich.edu 577188Sgblack@eecs.umich.edu if (!(flags & SyscallDesc::SuppressReturnValue)) 587188Sgblack@eecs.umich.edu xc->setSyscallReturn(retval); 597188Sgblack@eecs.umich.edu} 607139Sgblack@eecs.umich.edu 617139Sgblack@eecs.umich.edu 627139Sgblack@eecs.umich.eduSyscallReturn 637139Sgblack@eecs.umich.eduunimplementedFunc(SyscallDesc *desc, int callnum, Process *process, 647188Sgblack@eecs.umich.edu ExecContext *xc) 657188Sgblack@eecs.umich.edu{ 667188Sgblack@eecs.umich.edu fatal("syscall %s (#%d) unimplemented.", desc->name, callnum); 677188Sgblack@eecs.umich.edu} 687188Sgblack@eecs.umich.edu 697188Sgblack@eecs.umich.edu 707139Sgblack@eecs.umich.eduSyscallReturn 717146Sgblack@eecs.umich.eduignoreFunc(SyscallDesc *desc, int callnum, Process *process, 727141Sgblack@eecs.umich.edu ExecContext *xc) 737139Sgblack@eecs.umich.edu{ 747139Sgblack@eecs.umich.edu warn("ignoring syscall %s(%d, %d, ...)", desc->name, 757139Sgblack@eecs.umich.edu xc->getSyscallArg(0), xc->getSyscallArg(1)); 767146Sgblack@eecs.umich.edu 777141Sgblack@eecs.umich.edu return 0; 787139Sgblack@eecs.umich.edu} 797146Sgblack@eecs.umich.edu 807141Sgblack@eecs.umich.edu 817139Sgblack@eecs.umich.eduSyscallReturn 827139Sgblack@eecs.umich.eduexitFunc(SyscallDesc *desc, int callnum, Process *process, 837139Sgblack@eecs.umich.edu ExecContext *xc) 847139Sgblack@eecs.umich.edu{ 857139Sgblack@eecs.umich.edu new SimExitEvent("syscall caused exit", xc->getSyscallArg(0) & 0xff); 867188Sgblack@eecs.umich.edu 877188Sgblack@eecs.umich.edu return 1; 887188Sgblack@eecs.umich.edu} 897188Sgblack@eecs.umich.edu 907188Sgblack@eecs.umich.edu 917188Sgblack@eecs.umich.eduSyscallReturn 927188Sgblack@eecs.umich.edugetpagesizeFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 937188Sgblack@eecs.umich.edu{ 947188Sgblack@eecs.umich.edu return (int)VMPageSize; 957188Sgblack@eecs.umich.edu} 967188Sgblack@eecs.umich.edu 977188Sgblack@eecs.umich.edu 987188Sgblack@eecs.umich.eduSyscallReturn 997188Sgblack@eecs.umich.eduobreakFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 1007188Sgblack@eecs.umich.edu{ 1017188Sgblack@eecs.umich.edu // change brk addr to first arg 1027188Sgblack@eecs.umich.edu Addr new_brk = xc->getSyscallArg(0); 1037188Sgblack@eecs.umich.edu if (new_brk != 0) 1047188Sgblack@eecs.umich.edu { 1057188Sgblack@eecs.umich.edu p->brk_point = xc->getSyscallArg(0); 1067139Sgblack@eecs.umich.edu } 1077139Sgblack@eecs.umich.edu DPRINTF(SyscallVerbose, "Break Point changed to: %#X\n", p->brk_point); 1087139Sgblack@eecs.umich.edu return p->brk_point; 1097139Sgblack@eecs.umich.edu} 1107139Sgblack@eecs.umich.edu 1117139Sgblack@eecs.umich.edu 1127139Sgblack@eecs.umich.eduSyscallReturn 1137139Sgblack@eecs.umich.educloseFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 1147139Sgblack@eecs.umich.edu{ 1157139Sgblack@eecs.umich.edu int target_fd = xc->getSyscallArg(0); 1167139Sgblack@eecs.umich.edu int status = close(p->sim_fd(target_fd)); 1177139Sgblack@eecs.umich.edu if (status >= 0) 1187139Sgblack@eecs.umich.edu p->free_fd(target_fd); 1197139Sgblack@eecs.umich.edu return status; 1207139Sgblack@eecs.umich.edu} 1217139Sgblack@eecs.umich.edu 1227139Sgblack@eecs.umich.edu 1237139Sgblack@eecs.umich.eduSyscallReturn 1247139Sgblack@eecs.umich.edureadFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 1257139Sgblack@eecs.umich.edu{ 1267139Sgblack@eecs.umich.edu int fd = p->sim_fd(xc->getSyscallArg(0)); 1277188Sgblack@eecs.umich.edu int nbytes = xc->getSyscallArg(2); 1287188Sgblack@eecs.umich.edu BufferArg bufArg(xc->getSyscallArg(1), nbytes); 1297188Sgblack@eecs.umich.edu 1307188Sgblack@eecs.umich.edu int bytes_read = read(fd, bufArg.bufferPtr(), nbytes); 1317139Sgblack@eecs.umich.edu 1327188Sgblack@eecs.umich.edu if (bytes_read != -1) 1337139Sgblack@eecs.umich.edu bufArg.copyOut(xc->getMemPort()); 1347188Sgblack@eecs.umich.edu 1357139Sgblack@eecs.umich.edu return bytes_read; 1367139Sgblack@eecs.umich.edu} 1377139Sgblack@eecs.umich.edu 1387139Sgblack@eecs.umich.eduSyscallReturn 1397139Sgblack@eecs.umich.eduwriteFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 1407139Sgblack@eecs.umich.edu{ 1417139Sgblack@eecs.umich.edu int fd = p->sim_fd(xc->getSyscallArg(0)); 1427139Sgblack@eecs.umich.edu int nbytes = xc->getSyscallArg(2); 1437210Sgblack@eecs.umich.edu BufferArg bufArg(xc->getSyscallArg(1), nbytes); 1447210Sgblack@eecs.umich.edu 1457210Sgblack@eecs.umich.edu bufArg.copyIn(xc->getMemPort()); 1467210Sgblack@eecs.umich.edu 1477210Sgblack@eecs.umich.edu int bytes_written = write(fd, bufArg.bufferPtr(), nbytes); 1487210Sgblack@eecs.umich.edu 1497210Sgblack@eecs.umich.edu fsync(fd); 1507227Sgblack@eecs.umich.edu 1517227Sgblack@eecs.umich.edu return bytes_written; 1527227Sgblack@eecs.umich.edu} 1537227Sgblack@eecs.umich.edu 1547227Sgblack@eecs.umich.edu 1557227Sgblack@eecs.umich.eduSyscallReturn 1567227Sgblack@eecs.umich.edulseekFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 1577227Sgblack@eecs.umich.edu{ 1587210Sgblack@eecs.umich.edu int fd = p->sim_fd(xc->getSyscallArg(0)); 1597237Sgblack@eecs.umich.edu uint64_t offs = xc->getSyscallArg(1); 1607237Sgblack@eecs.umich.edu int whence = xc->getSyscallArg(2); 1617237Sgblack@eecs.umich.edu 1627237Sgblack@eecs.umich.edu off_t result = lseek(fd, offs, whence); 1637237Sgblack@eecs.umich.edu 1647237Sgblack@eecs.umich.edu return (result == (off_t)-1) ? -errno : result; 1657237Sgblack@eecs.umich.edu} 1667210Sgblack@eecs.umich.edu 1677227Sgblack@eecs.umich.edu 1687210Sgblack@eecs.umich.eduSyscallReturn 1697227Sgblack@eecs.umich.edumunmapFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 1707210Sgblack@eecs.umich.edu{ 1717210Sgblack@eecs.umich.edu // given that we don't really implement mmap, munmap is really easy 1727210Sgblack@eecs.umich.edu return 0; 1737210Sgblack@eecs.umich.edu} 1747210Sgblack@eecs.umich.edu 1757240Sgblack@eecs.umich.edu 1767235Sgblack@eecs.umich.educonst char *hostname = "m5.eecs.umich.edu"; 1777235Sgblack@eecs.umich.edu 1787235Sgblack@eecs.umich.eduSyscallReturn 1797235Sgblack@eecs.umich.edugethostnameFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 1807235Sgblack@eecs.umich.edu{ 1817235Sgblack@eecs.umich.edu int name_len = xc->getSyscallArg(1); 1827240Sgblack@eecs.umich.edu BufferArg name(xc->getSyscallArg(0), name_len); 1837240Sgblack@eecs.umich.edu 1847240Sgblack@eecs.umich.edu strncpy((char *)name.bufferPtr(), hostname, name_len); 1857240Sgblack@eecs.umich.edu 1867240Sgblack@eecs.umich.edu name.copyOut(xc->getMemPort()); 1877240Sgblack@eecs.umich.edu 1887240Sgblack@eecs.umich.edu return 0; 1897240Sgblack@eecs.umich.edu} 1907240Sgblack@eecs.umich.edu 1917240Sgblack@eecs.umich.eduSyscallReturn 1927210Sgblack@eecs.umich.eduunlinkFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 1937210Sgblack@eecs.umich.edu{ 1947210Sgblack@eecs.umich.edu string path; 1957210Sgblack@eecs.umich.edu 1967210Sgblack@eecs.umich.edu if (xc->getMemPort()->readStringFunctional(path, xc->getSyscallArg(0)) != NoFault) 1977227Sgblack@eecs.umich.edu return (TheISA::IntReg)-EFAULT; 1987227Sgblack@eecs.umich.edu 1997227Sgblack@eecs.umich.edu int result = unlink(path.c_str()); 2007227Sgblack@eecs.umich.edu return (result == -1) ? -errno : result; 2017227Sgblack@eecs.umich.edu} 2027227Sgblack@eecs.umich.edu 2037210Sgblack@eecs.umich.eduSyscallReturn 2047235Sgblack@eecs.umich.edurenameFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 2057235Sgblack@eecs.umich.edu{ 2067235Sgblack@eecs.umich.edu string old_name; 2077235Sgblack@eecs.umich.edu 2087235Sgblack@eecs.umich.edu if (xc->getMemPort()->readStringFunctional(old_name, xc->getSyscallArg(0)) != NoFault) 2097235Sgblack@eecs.umich.edu return -EFAULT; 2107235Sgblack@eecs.umich.edu 2117235Sgblack@eecs.umich.edu string new_name; 2127210Sgblack@eecs.umich.edu 2137235Sgblack@eecs.umich.edu if (xc->getMemPort()->readStringFunctional(new_name, xc->getSyscallArg(1)) != NoFault) 2147210Sgblack@eecs.umich.edu return -EFAULT; 2157235Sgblack@eecs.umich.edu 2167210Sgblack@eecs.umich.edu int64_t result = rename(old_name.c_str(), new_name.c_str()); 2177210Sgblack@eecs.umich.edu return (result == -1) ? -errno : result; 2187210Sgblack@eecs.umich.edu} 2197210Sgblack@eecs.umich.edu 2207210Sgblack@eecs.umich.eduSyscallReturn 2217211Sgblack@eecs.umich.edutruncateFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 2227211Sgblack@eecs.umich.edu{ 2237211Sgblack@eecs.umich.edu string path; 2247210Sgblack@eecs.umich.edu 2257235Sgblack@eecs.umich.edu if (xc->getMemPort()->readStringFunctional(path, xc->getSyscallArg(0)) != NoFault) 2267235Sgblack@eecs.umich.edu return -EFAULT; 2277235Sgblack@eecs.umich.edu 2287235Sgblack@eecs.umich.edu off_t length = xc->getSyscallArg(1); 2297235Sgblack@eecs.umich.edu 2307235Sgblack@eecs.umich.edu int result = truncate(path.c_str(), length); 2317235Sgblack@eecs.umich.edu return (result == -1) ? -errno : result; 2327235Sgblack@eecs.umich.edu} 2337210Sgblack@eecs.umich.edu 2347235Sgblack@eecs.umich.eduSyscallReturn 2357210Sgblack@eecs.umich.eduftruncateFunc(SyscallDesc *desc, int num, Process *process, ExecContext *xc) 2367235Sgblack@eecs.umich.edu{ 2377210Sgblack@eecs.umich.edu int fd = process->sim_fd(xc->getSyscallArg(0)); 2387210Sgblack@eecs.umich.edu 2397211Sgblack@eecs.umich.edu if (fd < 0) 2407211Sgblack@eecs.umich.edu return -EBADF; 2417211Sgblack@eecs.umich.edu 2427210Sgblack@eecs.umich.edu off_t length = xc->getSyscallArg(1); 2437210Sgblack@eecs.umich.edu 2447210Sgblack@eecs.umich.edu int result = ftruncate(fd, length); 2457210Sgblack@eecs.umich.edu return (result == -1) ? -errno : result; 2467235Sgblack@eecs.umich.edu} 2477235Sgblack@eecs.umich.edu 2487235Sgblack@eecs.umich.eduSyscallReturn 2497235Sgblack@eecs.umich.educhownFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 2507235Sgblack@eecs.umich.edu{ 2517235Sgblack@eecs.umich.edu string path; 2527235Sgblack@eecs.umich.edu 2537235Sgblack@eecs.umich.edu if (xc->getMemPort()->readStringFunctional(path, xc->getSyscallArg(0)) != NoFault) 2547210Sgblack@eecs.umich.edu return -EFAULT; 2557235Sgblack@eecs.umich.edu 2567210Sgblack@eecs.umich.edu /* XXX endianess */ 2577235Sgblack@eecs.umich.edu uint32_t owner = xc->getSyscallArg(1); 2587210Sgblack@eecs.umich.edu uid_t hostOwner = owner; 2597210Sgblack@eecs.umich.edu uint32_t group = xc->getSyscallArg(2); 2607210Sgblack@eecs.umich.edu gid_t hostGroup = group; 2617210Sgblack@eecs.umich.edu 2627210Sgblack@eecs.umich.edu int result = chown(path.c_str(), hostOwner, hostGroup); 2637227Sgblack@eecs.umich.edu return (result == -1) ? -errno : result; 2647227Sgblack@eecs.umich.edu} 2657227Sgblack@eecs.umich.edu 2667227Sgblack@eecs.umich.eduSyscallReturn 2677227Sgblack@eecs.umich.edufchownFunc(SyscallDesc *desc, int num, Process *process, ExecContext *xc) 2687227Sgblack@eecs.umich.edu{ 2697210Sgblack@eecs.umich.edu int fd = process->sim_fd(xc->getSyscallArg(0)); 2707235Sgblack@eecs.umich.edu 2717235Sgblack@eecs.umich.edu if (fd < 0) 2727235Sgblack@eecs.umich.edu return -EBADF; 2737235Sgblack@eecs.umich.edu 2747235Sgblack@eecs.umich.edu /* XXX endianess */ 2757235Sgblack@eecs.umich.edu uint32_t owner = xc->getSyscallArg(1); 2767235Sgblack@eecs.umich.edu uid_t hostOwner = owner; 2777235Sgblack@eecs.umich.edu uint32_t group = xc->getSyscallArg(2); 2787210Sgblack@eecs.umich.edu gid_t hostGroup = group; 2797235Sgblack@eecs.umich.edu 2807210Sgblack@eecs.umich.edu int result = fchown(fd, hostOwner, hostGroup); 2817235Sgblack@eecs.umich.edu return (result == -1) ? -errno : result; 2827210Sgblack@eecs.umich.edu} 2837210Sgblack@eecs.umich.edu 2847210Sgblack@eecs.umich.edu 2857210Sgblack@eecs.umich.eduSyscallReturn 2867210Sgblack@eecs.umich.edufcntlFunc(SyscallDesc *desc, int num, Process *process, 2877210Sgblack@eecs.umich.edu ExecContext *xc) 2887210Sgblack@eecs.umich.edu{ 2897235Sgblack@eecs.umich.edu int fd = xc->getSyscallArg(0); 2907235Sgblack@eecs.umich.edu 2917235Sgblack@eecs.umich.edu if (fd < 0 || process->sim_fd(fd) < 0) 2927235Sgblack@eecs.umich.edu return -EBADF; 2937235Sgblack@eecs.umich.edu 2947235Sgblack@eecs.umich.edu int cmd = xc->getSyscallArg(1); 2957235Sgblack@eecs.umich.edu switch (cmd) { 2967235Sgblack@eecs.umich.edu case 0: // F_DUPFD 2977210Sgblack@eecs.umich.edu // if we really wanted to support this, we'd need to do it 2987235Sgblack@eecs.umich.edu // in the target fd space. 2997210Sgblack@eecs.umich.edu warn("fcntl(%d, F_DUPFD) not supported, error returned\n", fd); 3007235Sgblack@eecs.umich.edu return -EMFILE; 3017210Sgblack@eecs.umich.edu 3027210Sgblack@eecs.umich.edu case 1: // F_GETFD (get close-on-exec flag) 3037211Sgblack@eecs.umich.edu case 2: // F_SETFD (set close-on-exec flag) 3047211Sgblack@eecs.umich.edu return 0; 3057211Sgblack@eecs.umich.edu 3067210Sgblack@eecs.umich.edu case 3: // F_GETFL (get file flags) 3077210Sgblack@eecs.umich.edu case 4: // F_SETFL (set file flags) 3087210Sgblack@eecs.umich.edu // not sure if this is totally valid, but we'll pass it through 3097210Sgblack@eecs.umich.edu // to the underlying OS 3107210Sgblack@eecs.umich.edu warn("fcntl(%d, %d) passed through to host\n", fd, cmd); 3117210Sgblack@eecs.umich.edu return fcntl(process->sim_fd(fd), cmd); 3127210Sgblack@eecs.umich.edu // return 0; 3137210Sgblack@eecs.umich.edu 3147194Sgblack@eecs.umich.edu case 7: // F_GETLK (get lock) 3157194Sgblack@eecs.umich.edu case 8: // F_SETLK (set lock) 3167194Sgblack@eecs.umich.edu case 9: // F_SETLKW (set lock and wait) 3177194Sgblack@eecs.umich.edu // don't mess with file locking... just act like it's OK 3187194Sgblack@eecs.umich.edu warn("File lock call (fcntl(%d, %d)) ignored.\n", fd, cmd); 3197194Sgblack@eecs.umich.edu return 0; 3207194Sgblack@eecs.umich.edu 3217194Sgblack@eecs.umich.edu default: 3227194Sgblack@eecs.umich.edu warn("Unknown fcntl command %d\n", cmd); 3237194Sgblack@eecs.umich.edu return 0; 3247194Sgblack@eecs.umich.edu } 3257194Sgblack@eecs.umich.edu} 3267194Sgblack@eecs.umich.edu 3277216Sgblack@eecs.umich.eduSyscallReturn 3287194Sgblack@eecs.umich.edupipePseudoFunc(SyscallDesc *desc, int callnum, Process *process, 3297224Sgblack@eecs.umich.edu ExecContext *xc) 3307194Sgblack@eecs.umich.edu{ 3317224Sgblack@eecs.umich.edu int fds[2], sim_fds[2]; 3327194Sgblack@eecs.umich.edu int pipe_retval = pipe(fds); 3337218Sgblack@eecs.umich.edu 3347194Sgblack@eecs.umich.edu if (pipe_retval < 0) { 3357216Sgblack@eecs.umich.edu // error 3367194Sgblack@eecs.umich.edu return pipe_retval; 3377218Sgblack@eecs.umich.edu } 3387194Sgblack@eecs.umich.edu 3397194Sgblack@eecs.umich.edu sim_fds[0] = process->alloc_fd(fds[0]); 3407194Sgblack@eecs.umich.edu sim_fds[1] = process->alloc_fd(fds[1]); 3417194Sgblack@eecs.umich.edu 3427194Sgblack@eecs.umich.edu // Alpha Linux convention for pipe() is that fd[0] is returned as 3437194Sgblack@eecs.umich.edu // the return value of the function, and fd[1] is returned in r20. 3447194Sgblack@eecs.umich.edu xc->setIntReg(SyscallPseudoReturnReg, sim_fds[1]); 3457194Sgblack@eecs.umich.edu return sim_fds[0]; 3467194Sgblack@eecs.umich.edu} 3477194Sgblack@eecs.umich.edu 3487194Sgblack@eecs.umich.edu 3497194Sgblack@eecs.umich.eduSyscallReturn 3507194Sgblack@eecs.umich.edugetpidPseudoFunc(SyscallDesc *desc, int callnum, Process *process, 3517194Sgblack@eecs.umich.edu ExecContext *xc) 3527194Sgblack@eecs.umich.edu{ 3537194Sgblack@eecs.umich.edu // Make up a PID. There's no interprocess communication in 3547194Sgblack@eecs.umich.edu // fake_syscall mode, so there's no way for a process to know it's 3557194Sgblack@eecs.umich.edu // not getting a unique value. 3567194Sgblack@eecs.umich.edu 3577194Sgblack@eecs.umich.edu xc->setIntReg(SyscallPseudoReturnReg, 99); 3587194Sgblack@eecs.umich.edu return 100; 3597231Sgblack@eecs.umich.edu} 3607194Sgblack@eecs.umich.edu 3617231Sgblack@eecs.umich.edu 3627194Sgblack@eecs.umich.eduSyscallReturn 3637231Sgblack@eecs.umich.edugetuidPseudoFunc(SyscallDesc *desc, int callnum, Process *process, 3647194Sgblack@eecs.umich.edu ExecContext *xc) 3657231Sgblack@eecs.umich.edu{ 3667194Sgblack@eecs.umich.edu // Make up a UID and EUID... it shouldn't matter, and we want the 3677231Sgblack@eecs.umich.edu // simulation to be deterministic. 3687194Sgblack@eecs.umich.edu 3697231Sgblack@eecs.umich.edu // EUID goes in r20. 3707194Sgblack@eecs.umich.edu xc->setIntReg(SyscallPseudoReturnReg, 100); //EUID 3717194Sgblack@eecs.umich.edu return 100; // UID 3727194Sgblack@eecs.umich.edu} 3737194Sgblack@eecs.umich.edu 3747194Sgblack@eecs.umich.edu 3757194Sgblack@eecs.umich.eduSyscallReturn 3767194Sgblack@eecs.umich.edugetgidPseudoFunc(SyscallDesc *desc, int callnum, Process *process, 3777194Sgblack@eecs.umich.edu ExecContext *xc) 3787222Sgblack@eecs.umich.edu{ 3797194Sgblack@eecs.umich.edu // Get current group ID. EGID goes in r20. 3807222Sgblack@eecs.umich.edu xc->setIntReg(SyscallPseudoReturnReg, 100); //EGID 3817194Sgblack@eecs.umich.edu return 100; 3827222Sgblack@eecs.umich.edu} 3837194Sgblack@eecs.umich.edu 3847222Sgblack@eecs.umich.edu 3857194Sgblack@eecs.umich.eduSyscallReturn 3867222Sgblack@eecs.umich.edusetuidFunc(SyscallDesc *desc, int callnum, Process *process, 3877194Sgblack@eecs.umich.edu ExecContext *xc) 3887222Sgblack@eecs.umich.edu{ 3897194Sgblack@eecs.umich.edu // can't fathom why a benchmark would call this. 3907194Sgblack@eecs.umich.edu warn("Ignoring call to setuid(%d)\n", xc->getSyscallArg(0)); 3917194Sgblack@eecs.umich.edu return 0; 3927194Sgblack@eecs.umich.edu} 3937194Sgblack@eecs.umich.edu 3947220Sgblack@eecs.umich.eduSyscallReturn 3957194Sgblack@eecs.umich.edugetpidFunc(SyscallDesc *desc, int callnum, Process *process, 3967220Sgblack@eecs.umich.edu ExecContext *xc) 3977194Sgblack@eecs.umich.edu{ 3987220Sgblack@eecs.umich.edu // Make up a PID. There's no interprocess communication in 3997194Sgblack@eecs.umich.edu // fake_syscall mode, so there's no way for a process to know it's 4007220Sgblack@eecs.umich.edu // not getting a unique value. 4017194Sgblack@eecs.umich.edu 4027220Sgblack@eecs.umich.edu xc->setIntReg(SyscallPseudoReturnReg, 99); //PID 4037194Sgblack@eecs.umich.edu return 100; 4047220Sgblack@eecs.umich.edu} 4057194Sgblack@eecs.umich.edu 4067194Sgblack@eecs.umich.eduSyscallReturn 4077194Sgblack@eecs.umich.edugetppidFunc(SyscallDesc *desc, int callnum, Process *process, 4087194Sgblack@eecs.umich.edu ExecContext *xc) 4097194Sgblack@eecs.umich.edu{ 4107231Sgblack@eecs.umich.edu return 99; 4117194Sgblack@eecs.umich.edu} 4127231Sgblack@eecs.umich.edu 4137194Sgblack@eecs.umich.eduSyscallReturn 4147231Sgblack@eecs.umich.edugetuidFunc(SyscallDesc *desc, int callnum, Process *process, 4157194Sgblack@eecs.umich.edu ExecContext *xc) 4167231Sgblack@eecs.umich.edu{ 4177194Sgblack@eecs.umich.edu return 100; // UID 4187231Sgblack@eecs.umich.edu} 4197194Sgblack@eecs.umich.edu 4207231Sgblack@eecs.umich.eduSyscallReturn 4217194Sgblack@eecs.umich.edugeteuidFunc(SyscallDesc *desc, int callnum, Process *process, 4227194Sgblack@eecs.umich.edu ExecContext *xc) 4237194Sgblack@eecs.umich.edu{ 4247194Sgblack@eecs.umich.edu return 100; // UID 4257194Sgblack@eecs.umich.edu} 4267194Sgblack@eecs.umich.edu 4277194Sgblack@eecs.umich.eduSyscallReturn 4287194Sgblack@eecs.umich.edugetgidFunc(SyscallDesc *desc, int callnum, Process *process, 4297194Sgblack@eecs.umich.edu ExecContext *xc) 4307139Sgblack@eecs.umich.edu{ 4317188Sgblack@eecs.umich.edu return 100; 4327188Sgblack@eecs.umich.edu} 4337188Sgblack@eecs.umich.edu 4347188Sgblack@eecs.umich.eduSyscallReturn 4357188Sgblack@eecs.umich.edugetegidFunc(SyscallDesc *desc, int callnum, Process *process, 4367188Sgblack@eecs.umich.edu ExecContext *xc) 4377188Sgblack@eecs.umich.edu{ 4387188Sgblack@eecs.umich.edu return 100; 4397139Sgblack@eecs.umich.edu} 4407188Sgblack@eecs.umich.edu 4417139Sgblack@eecs.umich.edu 4427188Sgblack@eecs.umich.edu