syscall_emul.cc revision 2264
110515SAli.Saidi@ARM.com/* 210515SAli.Saidi@ARM.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 310515SAli.Saidi@ARM.com * All rights reserved. 410515SAli.Saidi@ARM.com * 510515SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without 610515SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are 710515SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright 810515SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer; 910515SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright 1010515SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the 1110515SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution; 1210515SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its 1310515SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from 1410515SAli.Saidi@ARM.com * this software without specific prior written permission. 1511103Snilay@cs.wisc.edu * 1610515SAli.Saidi@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710515SAli.Saidi@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810515SAli.Saidi@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911103Snilay@cs.wisc.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010515SAli.Saidi@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110515SAli.Saidi@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210515SAli.Saidi@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310515SAli.Saidi@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410515SAli.Saidi@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510515SAli.Saidi@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610515SAli.Saidi@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710515SAli.Saidi@ARM.com */ 2810515SAli.Saidi@ARM.com 2910515SAli.Saidi@ARM.com#include <fcntl.h> 3010515SAli.Saidi@ARM.com#include <unistd.h> 3111103Snilay@cs.wisc.edu 3210515SAli.Saidi@ARM.com#include <string> 3310515SAli.Saidi@ARM.com#include <iostream> 3410515SAli.Saidi@ARM.com 3510515SAli.Saidi@ARM.com#include "sim/syscall_emul.hh" 3610515SAli.Saidi@ARM.com#include "base/trace.hh" 3710515SAli.Saidi@ARM.com#include "cpu/exec_context.hh" 3810798Ssteve.reinhardt@amd.com#include "cpu/base.hh" 3910798Ssteve.reinhardt@amd.com#include "sim/process.hh" 4010515SAli.Saidi@ARM.com 4110515SAli.Saidi@ARM.com#include "sim/sim_events.hh" 4210515SAli.Saidi@ARM.com 4310515SAli.Saidi@ARM.comusing namespace std; 4410515SAli.Saidi@ARM.comusing namespace TheISA; 4511103Snilay@cs.wisc.edu 4610515SAli.Saidi@ARM.comvoid 4710515SAli.Saidi@ARM.comSyscallDesc::doSyscall(int callnum, Process *process, ExecContext *xc) 4810515SAli.Saidi@ARM.com{ 4910515SAli.Saidi@ARM.com DPRINTFR(SyscallVerbose, "%s: syscall %s called\n", 5010515SAli.Saidi@ARM.com xc->getCpuPtr()->name(), name); 5110515SAli.Saidi@ARM.com 5210515SAli.Saidi@ARM.com SyscallReturn retval = (*funcPtr)(this, callnum, process, xc); 5310515SAli.Saidi@ARM.com 5410515SAli.Saidi@ARM.com DPRINTFR(SyscallVerbose, "%s: syscall %s returns %d\n", 5510515SAli.Saidi@ARM.com xc->getCpuPtr()->name(), name, retval.value()); 5610515SAli.Saidi@ARM.com 5710515SAli.Saidi@ARM.com if (!(flags & SyscallDesc::SuppressReturnValue)) 5810515SAli.Saidi@ARM.com xc->setSyscallReturn(retval); 5910515SAli.Saidi@ARM.com} 6010515SAli.Saidi@ARM.com 6110515SAli.Saidi@ARM.com 6210515SAli.Saidi@ARM.comSyscallReturn 6310515SAli.Saidi@ARM.comunimplementedFunc(SyscallDesc *desc, int callnum, Process *process, 6410515SAli.Saidi@ARM.com ExecContext *xc) 6510515SAli.Saidi@ARM.com{ 6610515SAli.Saidi@ARM.com fatal("syscall %s (#%d) unimplemented.", desc->name, callnum); 6710515SAli.Saidi@ARM.com} 6810515SAli.Saidi@ARM.com 6910515SAli.Saidi@ARM.com 7010515SAli.Saidi@ARM.comSyscallReturn 7110515SAli.Saidi@ARM.comignoreFunc(SyscallDesc *desc, int callnum, Process *process, 7210515SAli.Saidi@ARM.com ExecContext *xc) 7310515SAli.Saidi@ARM.com{ 7410515SAli.Saidi@ARM.com warn("ignoring syscall %s(%d, %d, ...)", desc->name, 7510515SAli.Saidi@ARM.com xc->getSyscallArg(0), xc->getSyscallArg(1)); 7610515SAli.Saidi@ARM.com 7710515SAli.Saidi@ARM.com return 0; 7810515SAli.Saidi@ARM.com} 7910515SAli.Saidi@ARM.com 8010515SAli.Saidi@ARM.com 8110515SAli.Saidi@ARM.comSyscallReturn 8210515SAli.Saidi@ARM.comexitFunc(SyscallDesc *desc, int callnum, Process *process, 8310515SAli.Saidi@ARM.com ExecContext *xc) 8410515SAli.Saidi@ARM.com{ 8510515SAli.Saidi@ARM.com new SimExitEvent("syscall caused exit", xc->getSyscallArg(0) & 0xff); 8610515SAli.Saidi@ARM.com 8710515SAli.Saidi@ARM.com return 1; 8811103Snilay@cs.wisc.edu} 8910515SAli.Saidi@ARM.com 9010515SAli.Saidi@ARM.com 9110515SAli.Saidi@ARM.comSyscallReturn 9210515SAli.Saidi@ARM.comgetpagesizeFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 9310515SAli.Saidi@ARM.com{ 9410515SAli.Saidi@ARM.com return (int)VMPageSize; 9510515SAli.Saidi@ARM.com} 9610515SAli.Saidi@ARM.com 9710515SAli.Saidi@ARM.com 9810515SAli.Saidi@ARM.comSyscallReturn 9910515SAli.Saidi@ARM.comobreakFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 10010515SAli.Saidi@ARM.com{ 10110515SAli.Saidi@ARM.com // change brk addr to first arg 10210515SAli.Saidi@ARM.com Addr new_brk = xc->getSyscallArg(0); 10310515SAli.Saidi@ARM.com if (new_brk != 0) 10410515SAli.Saidi@ARM.com { 10510515SAli.Saidi@ARM.com p->brk_point = xc->getSyscallArg(0); 10610515SAli.Saidi@ARM.com } 10710515SAli.Saidi@ARM.com DPRINTF(SyscallVerbose, "Break Point changed to: %#X\n", p->brk_point); 10810515SAli.Saidi@ARM.com return p->brk_point; 10910515SAli.Saidi@ARM.com} 11010515SAli.Saidi@ARM.com 11110515SAli.Saidi@ARM.com 11210515SAli.Saidi@ARM.comSyscallReturn 11310515SAli.Saidi@ARM.comcloseFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 11410515SAli.Saidi@ARM.com{ 11510515SAli.Saidi@ARM.com int target_fd = xc->getSyscallArg(0); 11610515SAli.Saidi@ARM.com int status = close(p->sim_fd(target_fd)); 11710515SAli.Saidi@ARM.com if (status >= 0) 11810515SAli.Saidi@ARM.com p->free_fd(target_fd); 11910515SAli.Saidi@ARM.com return status; 12010515SAli.Saidi@ARM.com} 12110515SAli.Saidi@ARM.com 12210515SAli.Saidi@ARM.com 12310515SAli.Saidi@ARM.comSyscallReturn 12410515SAli.Saidi@ARM.comreadFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 12510515SAli.Saidi@ARM.com{ 12610515SAli.Saidi@ARM.com int fd = p->sim_fd(xc->getSyscallArg(0)); 12710515SAli.Saidi@ARM.com int nbytes = xc->getSyscallArg(2); 12810515SAli.Saidi@ARM.com BufferArg bufArg(xc->getSyscallArg(1), nbytes); 12910515SAli.Saidi@ARM.com 13010515SAli.Saidi@ARM.com int bytes_read = read(fd, bufArg.bufferPtr(), nbytes); 13110515SAli.Saidi@ARM.com 13210515SAli.Saidi@ARM.com if (bytes_read != -1) 13310515SAli.Saidi@ARM.com bufArg.copyOut(xc->getMemPtr()); 13410515SAli.Saidi@ARM.com 13510515SAli.Saidi@ARM.com return bytes_read; 13610515SAli.Saidi@ARM.com} 13710515SAli.Saidi@ARM.com 13810515SAli.Saidi@ARM.comSyscallReturn 13910515SAli.Saidi@ARM.comwriteFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 14010515SAli.Saidi@ARM.com{ 14110515SAli.Saidi@ARM.com int fd = p->sim_fd(xc->getSyscallArg(0)); 14210515SAli.Saidi@ARM.com int nbytes = xc->getSyscallArg(2); 14310515SAli.Saidi@ARM.com BufferArg bufArg(xc->getSyscallArg(1), nbytes); 14410515SAli.Saidi@ARM.com 14510515SAli.Saidi@ARM.com bufArg.copyIn(xc->getMemPtr()); 14610515SAli.Saidi@ARM.com 14710515SAli.Saidi@ARM.com int bytes_written = write(fd, bufArg.bufferPtr(), nbytes); 14810515SAli.Saidi@ARM.com 14910515SAli.Saidi@ARM.com fsync(fd); 15010515SAli.Saidi@ARM.com 15110515SAli.Saidi@ARM.com return bytes_written; 15210515SAli.Saidi@ARM.com} 15310515SAli.Saidi@ARM.com 15410515SAli.Saidi@ARM.com 15510515SAli.Saidi@ARM.comSyscallReturn 15610515SAli.Saidi@ARM.comlseekFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 15710515SAli.Saidi@ARM.com{ 15810515SAli.Saidi@ARM.com int fd = p->sim_fd(xc->getSyscallArg(0)); 15910515SAli.Saidi@ARM.com uint64_t offs = xc->getSyscallArg(1); 16010515SAli.Saidi@ARM.com int whence = xc->getSyscallArg(2); 16110515SAli.Saidi@ARM.com 16210515SAli.Saidi@ARM.com off_t result = lseek(fd, offs, whence); 16310515SAli.Saidi@ARM.com 16410515SAli.Saidi@ARM.com return (result == (off_t)-1) ? -errno : result; 16510515SAli.Saidi@ARM.com} 16610515SAli.Saidi@ARM.com 16710515SAli.Saidi@ARM.com 16810515SAli.Saidi@ARM.comSyscallReturn 16910515SAli.Saidi@ARM.communmapFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 17010515SAli.Saidi@ARM.com{ 17110515SAli.Saidi@ARM.com // given that we don't really implement mmap, munmap is really easy 17210515SAli.Saidi@ARM.com return 0; 17310515SAli.Saidi@ARM.com} 17410515SAli.Saidi@ARM.com 17510515SAli.Saidi@ARM.com 17610515SAli.Saidi@ARM.comconst char *hostname = "m5.eecs.umich.edu"; 17710515SAli.Saidi@ARM.com 17810515SAli.Saidi@ARM.comSyscallReturn 17910515SAli.Saidi@ARM.comgethostnameFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 18010515SAli.Saidi@ARM.com{ 18110515SAli.Saidi@ARM.com int name_len = xc->getSyscallArg(1); 18210515SAli.Saidi@ARM.com BufferArg name(xc->getSyscallArg(0), name_len); 18310515SAli.Saidi@ARM.com 18410515SAli.Saidi@ARM.com strncpy((char *)name.bufferPtr(), hostname, name_len); 18510515SAli.Saidi@ARM.com 18610515SAli.Saidi@ARM.com name.copyOut(xc->getMemPtr()); 18710515SAli.Saidi@ARM.com 18810515SAli.Saidi@ARM.com return 0; 18910515SAli.Saidi@ARM.com} 19010515SAli.Saidi@ARM.com 19110798Ssteve.reinhardt@amd.comSyscallReturn 19210515SAli.Saidi@ARM.comunlinkFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 19310515SAli.Saidi@ARM.com{ 19410515SAli.Saidi@ARM.com string path; 19510515SAli.Saidi@ARM.com 19610515SAli.Saidi@ARM.com if (xc->getMemPtr()->readString(path, xc->getSyscallArg(0)) != NoFault) 19710515SAli.Saidi@ARM.com return (TheISA::IntReg)-EFAULT; 19810515SAli.Saidi@ARM.com 19910515SAli.Saidi@ARM.com int result = unlink(path.c_str()); 20010515SAli.Saidi@ARM.com return (result == -1) ? -errno : result; 20110515SAli.Saidi@ARM.com} 20210515SAli.Saidi@ARM.com 20310515SAli.Saidi@ARM.comSyscallReturn 20411103Snilay@cs.wisc.edurenameFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 20510515SAli.Saidi@ARM.com{ 20610515SAli.Saidi@ARM.com string old_name; 20710515SAli.Saidi@ARM.com 20810515SAli.Saidi@ARM.com if (xc->getMemPtr()->readString(old_name, xc->getSyscallArg(0)) != NoFault) 20910798Ssteve.reinhardt@amd.com return -EFAULT; 21010515SAli.Saidi@ARM.com 21110515SAli.Saidi@ARM.com string new_name; 21210515SAli.Saidi@ARM.com 21310900Snilay@cs.wisc.edu if (xc->getMemPtr()->readString(new_name, xc->getSyscallArg(1)) != NoFault) 21410515SAli.Saidi@ARM.com return -EFAULT; 21510515SAli.Saidi@ARM.com 21610515SAli.Saidi@ARM.com int64_t result = rename(old_name.c_str(), new_name.c_str()); 21710515SAli.Saidi@ARM.com return (result == -1) ? -errno : result; 21810515SAli.Saidi@ARM.com} 21910515SAli.Saidi@ARM.com 22010515SAli.Saidi@ARM.comSyscallReturn 22110515SAli.Saidi@ARM.comtruncateFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 22210515SAli.Saidi@ARM.com{ 22310515SAli.Saidi@ARM.com string path; 22410515SAli.Saidi@ARM.com 22510515SAli.Saidi@ARM.com if (xc->getMemPtr()->readString(path, xc->getSyscallArg(0)) != NoFault) 22610515SAli.Saidi@ARM.com return -EFAULT; 22710515SAli.Saidi@ARM.com 22810515SAli.Saidi@ARM.com off_t length = xc->getSyscallArg(1); 22910515SAli.Saidi@ARM.com 23010515SAli.Saidi@ARM.com int result = truncate(path.c_str(), length); 23110515SAli.Saidi@ARM.com return (result == -1) ? -errno : result; 23210515SAli.Saidi@ARM.com} 23310515SAli.Saidi@ARM.com 23410515SAli.Saidi@ARM.comSyscallReturn 23510515SAli.Saidi@ARM.comftruncateFunc(SyscallDesc *desc, int num, Process *process, ExecContext *xc) 23610515SAli.Saidi@ARM.com{ 23710515SAli.Saidi@ARM.com int fd = process->sim_fd(xc->getSyscallArg(0)); 23810515SAli.Saidi@ARM.com 23910515SAli.Saidi@ARM.com if (fd < 0) 24010515SAli.Saidi@ARM.com return -EBADF; 24110515SAli.Saidi@ARM.com 24210515SAli.Saidi@ARM.com off_t length = xc->getSyscallArg(1); 24310798Ssteve.reinhardt@amd.com 24410515SAli.Saidi@ARM.com int result = ftruncate(fd, length); 24510515SAli.Saidi@ARM.com return (result == -1) ? -errno : result; 24610515SAli.Saidi@ARM.com} 24710515SAli.Saidi@ARM.com 24810515SAli.Saidi@ARM.comSyscallReturn 24910515SAli.Saidi@ARM.comchownFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 25010515SAli.Saidi@ARM.com{ 25110515SAli.Saidi@ARM.com string path; 25210515SAli.Saidi@ARM.com 25310515SAli.Saidi@ARM.com if (xc->getMemPtr()->readString(path, xc->getSyscallArg(0)) != NoFault) 25410515SAli.Saidi@ARM.com return -EFAULT; 25510515SAli.Saidi@ARM.com 25610515SAli.Saidi@ARM.com /* XXX endianess */ 25710515SAli.Saidi@ARM.com uint32_t owner = xc->getSyscallArg(1); 25810515SAli.Saidi@ARM.com uid_t hostOwner = owner; 25910515SAli.Saidi@ARM.com uint32_t group = xc->getSyscallArg(2); 26010515SAli.Saidi@ARM.com gid_t hostGroup = group; 26110515SAli.Saidi@ARM.com 26210515SAli.Saidi@ARM.com int result = chown(path.c_str(), hostOwner, hostGroup); 26310515SAli.Saidi@ARM.com return (result == -1) ? -errno : result; 26410515SAli.Saidi@ARM.com} 26510515SAli.Saidi@ARM.com 26610515SAli.Saidi@ARM.comSyscallReturn 26710515SAli.Saidi@ARM.comfchownFunc(SyscallDesc *desc, int num, Process *process, ExecContext *xc) 26810515SAli.Saidi@ARM.com{ 26910515SAli.Saidi@ARM.com int fd = process->sim_fd(xc->getSyscallArg(0)); 27010515SAli.Saidi@ARM.com 27110515SAli.Saidi@ARM.com if (fd < 0) 27210515SAli.Saidi@ARM.com return -EBADF; 27310515SAli.Saidi@ARM.com 27410515SAli.Saidi@ARM.com /* XXX endianess */ 27510515SAli.Saidi@ARM.com uint32_t owner = xc->getSyscallArg(1); 27610515SAli.Saidi@ARM.com uid_t hostOwner = owner; 27710515SAli.Saidi@ARM.com uint32_t group = xc->getSyscallArg(2); 27810515SAli.Saidi@ARM.com gid_t hostGroup = group; 27910515SAli.Saidi@ARM.com 28010515SAli.Saidi@ARM.com int result = fchown(fd, hostOwner, hostGroup); 28110515SAli.Saidi@ARM.com return (result == -1) ? -errno : result; 28210515SAli.Saidi@ARM.com} 28310515SAli.Saidi@ARM.com 28410515SAli.Saidi@ARM.com 28510515SAli.Saidi@ARM.comSyscallReturn 28610515SAli.Saidi@ARM.comfcntlFunc(SyscallDesc *desc, int num, Process *process, 28710515SAli.Saidi@ARM.com ExecContext *xc) 28810515SAli.Saidi@ARM.com{ 28910515SAli.Saidi@ARM.com int fd = xc->getSyscallArg(0); 29010515SAli.Saidi@ARM.com 29110515SAli.Saidi@ARM.com if (fd < 0 || process->sim_fd(fd) < 0) 29210515SAli.Saidi@ARM.com return -EBADF; 29310515SAli.Saidi@ARM.com 29410515SAli.Saidi@ARM.com int cmd = xc->getSyscallArg(1); 29510515SAli.Saidi@ARM.com switch (cmd) { 29610515SAli.Saidi@ARM.com case 0: // F_DUPFD 29710900Snilay@cs.wisc.edu // if we really wanted to support this, we'd need to do it 29810515SAli.Saidi@ARM.com // in the target fd space. 29910515SAli.Saidi@ARM.com warn("fcntl(%d, F_DUPFD) not supported, error returned\n", fd); 30010515SAli.Saidi@ARM.com return -EMFILE; 30110515SAli.Saidi@ARM.com 30210515SAli.Saidi@ARM.com case 1: // F_GETFD (get close-on-exec flag) 30310515SAli.Saidi@ARM.com case 2: // F_SETFD (set close-on-exec flag) 30410515SAli.Saidi@ARM.com return 0; 30510515SAli.Saidi@ARM.com 30610515SAli.Saidi@ARM.com case 3: // F_GETFL (get file flags) 30710515SAli.Saidi@ARM.com case 4: // F_SETFL (set file flags) 30810515SAli.Saidi@ARM.com // not sure if this is totally valid, but we'll pass it through 30910515SAli.Saidi@ARM.com // to the underlying OS 31010515SAli.Saidi@ARM.com warn("fcntl(%d, %d) passed through to host\n", fd, cmd); 31110900Snilay@cs.wisc.edu return fcntl(process->sim_fd(fd), cmd); 31210515SAli.Saidi@ARM.com // return 0; 31310515SAli.Saidi@ARM.com 31410515SAli.Saidi@ARM.com case 7: // F_GETLK (get lock) 31510515SAli.Saidi@ARM.com case 8: // F_SETLK (set lock) 31610515SAli.Saidi@ARM.com case 9: // F_SETLKW (set lock and wait) 31710515SAli.Saidi@ARM.com // don't mess with file locking... just act like it's OK 31810900Snilay@cs.wisc.edu warn("File lock call (fcntl(%d, %d)) ignored.\n", fd, cmd); 31910515SAli.Saidi@ARM.com return 0; 32010515SAli.Saidi@ARM.com 32110515SAli.Saidi@ARM.com default: 32210515SAli.Saidi@ARM.com warn("Unknown fcntl command %d\n", cmd); 32310515SAli.Saidi@ARM.com return 0; 32410515SAli.Saidi@ARM.com } 32510900Snilay@cs.wisc.edu} 32610515SAli.Saidi@ARM.com 32710515SAli.Saidi@ARM.comSyscallReturn 32810515SAli.Saidi@ARM.compipePseudoFunc(SyscallDesc *desc, int callnum, Process *process, 32910515SAli.Saidi@ARM.com ExecContext *xc) 33010515SAli.Saidi@ARM.com{ 33110515SAli.Saidi@ARM.com int fds[2], sim_fds[2]; 33210515SAli.Saidi@ARM.com int pipe_retval = pipe(fds); 33310515SAli.Saidi@ARM.com 33410515SAli.Saidi@ARM.com if (pipe_retval < 0) { 33510515SAli.Saidi@ARM.com // error 33610515SAli.Saidi@ARM.com return pipe_retval; 33710515SAli.Saidi@ARM.com } 33810515SAli.Saidi@ARM.com 33910900Snilay@cs.wisc.edu sim_fds[0] = process->alloc_fd(fds[0]); 34010515SAli.Saidi@ARM.com sim_fds[1] = process->alloc_fd(fds[1]); 34110515SAli.Saidi@ARM.com 34210515SAli.Saidi@ARM.com // Alpha Linux convention for pipe() is that fd[0] is returned as 34310515SAli.Saidi@ARM.com // the return value of the function, and fd[1] is returned in r20. 34410515SAli.Saidi@ARM.com xc->setIntReg(SyscallPseudoReturnReg, sim_fds[1]); 34510515SAli.Saidi@ARM.com return sim_fds[0]; 34610515SAli.Saidi@ARM.com} 34710515SAli.Saidi@ARM.com 34810515SAli.Saidi@ARM.com 34910515SAli.Saidi@ARM.comSyscallReturn 35010515SAli.Saidi@ARM.comgetpidPseudoFunc(SyscallDesc *desc, int callnum, Process *process, 35110515SAli.Saidi@ARM.com ExecContext *xc) 35210515SAli.Saidi@ARM.com{ 35310900Snilay@cs.wisc.edu // Make up a PID. There's no interprocess communication in 35410515SAli.Saidi@ARM.com // fake_syscall mode, so there's no way for a process to know it's 35510515SAli.Saidi@ARM.com // not getting a unique value. 35610515SAli.Saidi@ARM.com 35710515SAli.Saidi@ARM.com xc->setIntReg(SyscallPseudoReturnReg, 99); 35810515SAli.Saidi@ARM.com return 100; 35910515SAli.Saidi@ARM.com} 36010515SAli.Saidi@ARM.com 36110515SAli.Saidi@ARM.com 36210515SAli.Saidi@ARM.comSyscallReturn 36310515SAli.Saidi@ARM.comgetuidPseudoFunc(SyscallDesc *desc, int callnum, Process *process, 36410515SAli.Saidi@ARM.com ExecContext *xc) 36510515SAli.Saidi@ARM.com{ 36610515SAli.Saidi@ARM.com // Make up a UID and EUID... it shouldn't matter, and we want the 36710900Snilay@cs.wisc.edu // simulation to be deterministic. 36810515SAli.Saidi@ARM.com 36910515SAli.Saidi@ARM.com // EUID goes in r20. 37010515SAli.Saidi@ARM.com xc->setIntReg(SyscallPseudoReturnReg, 100); //EUID 37110515SAli.Saidi@ARM.com return 100; // UID 37210515SAli.Saidi@ARM.com} 37310515SAli.Saidi@ARM.com 37410900Snilay@cs.wisc.edu 37510515SAli.Saidi@ARM.comSyscallReturn 37610515SAli.Saidi@ARM.comgetgidPseudoFunc(SyscallDesc *desc, int callnum, Process *process, 37710515SAli.Saidi@ARM.com ExecContext *xc) 37810515SAli.Saidi@ARM.com{ 37910515SAli.Saidi@ARM.com // Get current group ID. EGID goes in r20. 38010515SAli.Saidi@ARM.com xc->setIntReg(SyscallPseudoReturnReg, 100); //EGID 38110900Snilay@cs.wisc.edu return 100; 38210515SAli.Saidi@ARM.com} 38310515SAli.Saidi@ARM.com 38410515SAli.Saidi@ARM.com 38510515SAli.Saidi@ARM.comSyscallReturn 38610515SAli.Saidi@ARM.comsetuidFunc(SyscallDesc *desc, int callnum, Process *process, 38710515SAli.Saidi@ARM.com ExecContext *xc) 38810900Snilay@cs.wisc.edu{ 38910515SAli.Saidi@ARM.com // can't fathom why a benchmark would call this. 39010515SAli.Saidi@ARM.com warn("Ignoring call to setuid(%d)\n", xc->getSyscallArg(0)); 39110515SAli.Saidi@ARM.com return 0; 39210515SAli.Saidi@ARM.com} 39310515SAli.Saidi@ARM.com 39410515SAli.Saidi@ARM.comSyscallReturn 39510900Snilay@cs.wisc.edugetpidFunc(SyscallDesc *desc, int callnum, Process *process, 39610515SAli.Saidi@ARM.com ExecContext *xc) 39710515SAli.Saidi@ARM.com{ 39810515SAli.Saidi@ARM.com // Make up a PID. There's no interprocess communication in 39910515SAli.Saidi@ARM.com // fake_syscall mode, so there's no way for a process to know it's 40010515SAli.Saidi@ARM.com // not getting a unique value. 40110515SAli.Saidi@ARM.com 40210900Snilay@cs.wisc.edu xc->setIntReg(SyscallPseudoReturnReg, 99); //PID 40310515SAli.Saidi@ARM.com return 100; 40410515SAli.Saidi@ARM.com} 40510515SAli.Saidi@ARM.com 40610515SAli.Saidi@ARM.comSyscallReturn 40710515SAli.Saidi@ARM.comgetppidFunc(SyscallDesc *desc, int callnum, Process *process, 40810515SAli.Saidi@ARM.com ExecContext *xc) 40910900Snilay@cs.wisc.edu{ 41010515SAli.Saidi@ARM.com return 99; 41110515SAli.Saidi@ARM.com} 41210515SAli.Saidi@ARM.com 41310515SAli.Saidi@ARM.comSyscallReturn 41410515SAli.Saidi@ARM.comgetuidFunc(SyscallDesc *desc, int callnum, Process *process, 41510515SAli.Saidi@ARM.com ExecContext *xc) 41610900Snilay@cs.wisc.edu{ 41710515SAli.Saidi@ARM.com return 100; // UID 41810515SAli.Saidi@ARM.com} 41910515SAli.Saidi@ARM.com 42010515SAli.Saidi@ARM.comSyscallReturn 42110515SAli.Saidi@ARM.comgeteuidFunc(SyscallDesc *desc, int callnum, Process *process, 42210515SAli.Saidi@ARM.com ExecContext *xc) 42310900Snilay@cs.wisc.edu{ 42410515SAli.Saidi@ARM.com return 100; // UID 42510515SAli.Saidi@ARM.com} 42610515SAli.Saidi@ARM.com 42710515SAli.Saidi@ARM.comSyscallReturn 42810515SAli.Saidi@ARM.comgetgidFunc(SyscallDesc *desc, int callnum, Process *process, 42910515SAli.Saidi@ARM.com ExecContext *xc) 43010900Snilay@cs.wisc.edu{ 43110515SAli.Saidi@ARM.com return 100; 43210515SAli.Saidi@ARM.com} 43310515SAli.Saidi@ARM.com 43410515SAli.Saidi@ARM.comSyscallReturn 43510515SAli.Saidi@ARM.comgetegidFunc(SyscallDesc *desc, int callnum, Process *process, 43610515SAli.Saidi@ARM.com ExecContext *xc) 43710900Snilay@cs.wisc.edu{ 43810515SAli.Saidi@ARM.com return 100; 43910515SAli.Saidi@ARM.com} 44010515SAli.Saidi@ARM.com 44110515SAli.Saidi@ARM.com 44210515SAli.Saidi@ARM.com