syscall_emul.cc revision 2484
112697Santhony.gutierrez@amd.com/* 212697Santhony.gutierrez@amd.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 311308Santhony.gutierrez@amd.com * All rights reserved. 412697Santhony.gutierrez@amd.com * 511308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without 612697Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are 712697Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright 811308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer; 912697Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright 1012697Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the 1111308Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution; 1212697Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its 1312697Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from 1412697Santhony.gutierrez@amd.com * this software without specific prior written permission. 1511308Santhony.gutierrez@amd.com * 1612697Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1712697Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1812697Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911308Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2012697Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2112697Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2212697Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2312697Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2412697Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2512697Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2612697Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2712697Santhony.gutierrez@amd.com */ 2812697Santhony.gutierrez@amd.com 2912697Santhony.gutierrez@amd.com#include <fcntl.h> 3012697Santhony.gutierrez@amd.com#include <unistd.h> 3111308Santhony.gutierrez@amd.com 3212697Santhony.gutierrez@amd.com#include <string> 3311308Santhony.gutierrez@amd.com#include <iostream> 3411308Santhony.gutierrez@amd.com 3511308Santhony.gutierrez@amd.com#include "sim/syscall_emul.hh" 3611308Santhony.gutierrez@amd.com#include "base/chunk_generator.hh" 3711308Santhony.gutierrez@amd.com#include "base/trace.hh" 3813400Sodanrc@yahoo.com.br#include "cpu/exec_context.hh" 3911308Santhony.gutierrez@amd.com#include "cpu/base.hh" 4011308Santhony.gutierrez@amd.com#include "mem/page_table.hh" 4113885Sdavid.hashe@amd.com#include "sim/process.hh" 4211308Santhony.gutierrez@amd.com 4313400Sodanrc@yahoo.com.br#include "sim/sim_events.hh" 4413400Sodanrc@yahoo.com.br 4511670Sandreas.hansson@arm.comusing namespace std; 4611670Sandreas.hansson@arm.comusing namespace TheISA; 4711308Santhony.gutierrez@amd.com 4811308Santhony.gutierrez@amd.comvoid 4911308Santhony.gutierrez@amd.comSyscallDesc::doSyscall(int callnum, Process *process, ExecContext *xc) 5011308Santhony.gutierrez@amd.com{ 5111308Santhony.gutierrez@amd.com DPRINTFR(SyscallVerbose, "%s: syscall %s called\n", 5211308Santhony.gutierrez@amd.com xc->getCpuPtr()->name(), name); 5311308Santhony.gutierrez@amd.com 5411308Santhony.gutierrez@amd.com SyscallReturn retval = (*funcPtr)(this, callnum, process, xc); 5511308Santhony.gutierrez@amd.com 5611308Santhony.gutierrez@amd.com DPRINTFR(SyscallVerbose, "%s: syscall %s returns %d\n", 5711308Santhony.gutierrez@amd.com xc->getCpuPtr()->name(), name, retval.value()); 5811308Santhony.gutierrez@amd.com 5911308Santhony.gutierrez@amd.com if (!(flags & SyscallDesc::SuppressReturnValue)) 6011308Santhony.gutierrez@amd.com xc->setSyscallReturn(retval); 6111308Santhony.gutierrez@amd.com} 6211308Santhony.gutierrez@amd.com 6311308Santhony.gutierrez@amd.com 6411308Santhony.gutierrez@amd.comSyscallReturn 6511308Santhony.gutierrez@amd.comunimplementedFunc(SyscallDesc *desc, int callnum, Process *process, 6611308Santhony.gutierrez@amd.com ExecContext *xc) 6711308Santhony.gutierrez@amd.com{ 6811308Santhony.gutierrez@amd.com //warn("ignoring syscall %s(%d, %d, ...)", desc->name, 6911308Santhony.gutierrez@amd.com // xc->getSyscallArg(0), xc->getSyscallArg(1)); 7011308Santhony.gutierrez@amd.com fatal("syscall %s (#%d) unimplemented.", desc->name, callnum); 7111308Santhony.gutierrez@amd.com 7211308Santhony.gutierrez@amd.com return 1; 7311308Santhony.gutierrez@amd.com} 7411308Santhony.gutierrez@amd.com 7511308Santhony.gutierrez@amd.com 7611308Santhony.gutierrez@amd.comSyscallReturn 7711308Santhony.gutierrez@amd.comignoreFunc(SyscallDesc *desc, int callnum, Process *process, 7811308Santhony.gutierrez@amd.com ExecContext *xc) 7911308Santhony.gutierrez@amd.com{ 8011308Santhony.gutierrez@amd.com warn("ignoring syscall %s(%d, %d, ...)", desc->name, 8111308Santhony.gutierrez@amd.com xc->getSyscallArg(0), xc->getSyscallArg(1)); 8211308Santhony.gutierrez@amd.com 8311308Santhony.gutierrez@amd.com return 0; 8411308Santhony.gutierrez@amd.com} 8511308Santhony.gutierrez@amd.com 8611308Santhony.gutierrez@amd.com 8711308Santhony.gutierrez@amd.comSyscallReturn 8811308Santhony.gutierrez@amd.comexitFunc(SyscallDesc *desc, int callnum, Process *process, 8911308Santhony.gutierrez@amd.com ExecContext *xc) 9011308Santhony.gutierrez@amd.com{ 9111308Santhony.gutierrez@amd.com new SimExitEvent("target called exit()", xc->getSyscallArg(0) & 0xff); 9211308Santhony.gutierrez@amd.com 9311308Santhony.gutierrez@amd.com return 1; 9411308Santhony.gutierrez@amd.com} 9511308Santhony.gutierrez@amd.com 9611308Santhony.gutierrez@amd.com 9711308Santhony.gutierrez@amd.comSyscallReturn 9811308Santhony.gutierrez@amd.comgetpagesizeFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 9911308Santhony.gutierrez@amd.com{ 10011308Santhony.gutierrez@amd.com return (int)VMPageSize; 10111308Santhony.gutierrez@amd.com} 10211308Santhony.gutierrez@amd.com 10311308Santhony.gutierrez@amd.com 10411308Santhony.gutierrez@amd.comSyscallReturn 10511308Santhony.gutierrez@amd.comobreakFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 10611308Santhony.gutierrez@amd.com{ 10711308Santhony.gutierrez@amd.com Addr junk; 10811308Santhony.gutierrez@amd.com 10911308Santhony.gutierrez@amd.com // change brk addr to first arg 11011308Santhony.gutierrez@amd.com Addr new_brk = xc->getSyscallArg(0); 11111308Santhony.gutierrez@amd.com if (new_brk != 0) { 11211308Santhony.gutierrez@amd.com for (ChunkGenerator gen(p->brk_point, new_brk - p->brk_point, 11311308Santhony.gutierrez@amd.com VMPageSize); !gen.done(); gen.next()) { 11411308Santhony.gutierrez@amd.com if (!p->pTable->translate(gen.addr(), junk)) 11511308Santhony.gutierrez@amd.com p->pTable->allocate(roundDown(gen.addr(), VMPageSize), 11611308Santhony.gutierrez@amd.com VMPageSize); 11711308Santhony.gutierrez@amd.com } 11811308Santhony.gutierrez@amd.com p->brk_point = new_brk; 11911308Santhony.gutierrez@amd.com } 12011308Santhony.gutierrez@amd.com DPRINTF(SyscallVerbose, "Break Point changed to: %#X\n", p->brk_point); 12111308Santhony.gutierrez@amd.com return p->brk_point; 12211308Santhony.gutierrez@amd.com} 12311308Santhony.gutierrez@amd.com 12411308Santhony.gutierrez@amd.com 12511308Santhony.gutierrez@amd.comSyscallReturn 12611308Santhony.gutierrez@amd.comcloseFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 12711308Santhony.gutierrez@amd.com{ 12811308Santhony.gutierrez@amd.com int target_fd = xc->getSyscallArg(0); 12911308Santhony.gutierrez@amd.com int status = close(p->sim_fd(target_fd)); 13011308Santhony.gutierrez@amd.com if (status >= 0) 13111308Santhony.gutierrez@amd.com p->free_fd(target_fd); 13211308Santhony.gutierrez@amd.com return status; 13311308Santhony.gutierrez@amd.com} 13411308Santhony.gutierrez@amd.com 13511308Santhony.gutierrez@amd.com 13611308Santhony.gutierrez@amd.comSyscallReturn 13711308Santhony.gutierrez@amd.comreadFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 13811308Santhony.gutierrez@amd.com{ 13911308Santhony.gutierrez@amd.com int fd = p->sim_fd(xc->getSyscallArg(0)); 14011308Santhony.gutierrez@amd.com int nbytes = xc->getSyscallArg(2); 14111308Santhony.gutierrez@amd.com BufferArg bufArg(xc->getSyscallArg(1), nbytes); 14211308Santhony.gutierrez@amd.com 14311308Santhony.gutierrez@amd.com int bytes_read = read(fd, bufArg.bufferPtr(), nbytes); 14411308Santhony.gutierrez@amd.com 14511308Santhony.gutierrez@amd.com if (bytes_read != -1) 14611308Santhony.gutierrez@amd.com bufArg.copyOut(xc->getMemPort()); 14711308Santhony.gutierrez@amd.com 14811308Santhony.gutierrez@amd.com return bytes_read; 14911308Santhony.gutierrez@amd.com} 15011308Santhony.gutierrez@amd.com 15111308Santhony.gutierrez@amd.comSyscallReturn 15211308Santhony.gutierrez@amd.comwriteFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 15311308Santhony.gutierrez@amd.com{ 15411308Santhony.gutierrez@amd.com int fd = p->sim_fd(xc->getSyscallArg(0)); 15511308Santhony.gutierrez@amd.com int nbytes = xc->getSyscallArg(2); 15611308Santhony.gutierrez@amd.com BufferArg bufArg(xc->getSyscallArg(1), nbytes); 15711308Santhony.gutierrez@amd.com 15811308Santhony.gutierrez@amd.com bufArg.copyIn(xc->getMemPort()); 15911308Santhony.gutierrez@amd.com 16011308Santhony.gutierrez@amd.com int bytes_written = write(fd, bufArg.bufferPtr(), nbytes); 16111308Santhony.gutierrez@amd.com 16211308Santhony.gutierrez@amd.com fsync(fd); 16311308Santhony.gutierrez@amd.com 16411308Santhony.gutierrez@amd.com return bytes_written; 16511308Santhony.gutierrez@amd.com} 16611308Santhony.gutierrez@amd.com 16711308Santhony.gutierrez@amd.com 16811308Santhony.gutierrez@amd.comSyscallReturn 16911308Santhony.gutierrez@amd.comlseekFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 17011308Santhony.gutierrez@amd.com{ 17111308Santhony.gutierrez@amd.com int fd = p->sim_fd(xc->getSyscallArg(0)); 17212065Snikos.nikoleris@arm.com uint64_t offs = xc->getSyscallArg(1); 17311308Santhony.gutierrez@amd.com int whence = xc->getSyscallArg(2); 17411308Santhony.gutierrez@amd.com 17511308Santhony.gutierrez@amd.com off_t result = lseek(fd, offs, whence); 17611308Santhony.gutierrez@amd.com 17712065Snikos.nikoleris@arm.com return (result == (off_t)-1) ? -errno : result; 17812065Snikos.nikoleris@arm.com} 17911308Santhony.gutierrez@amd.com 18011308Santhony.gutierrez@amd.com 18111308Santhony.gutierrez@amd.comSyscallReturn 18211308Santhony.gutierrez@amd.communmapFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 18311308Santhony.gutierrez@amd.com{ 18411308Santhony.gutierrez@amd.com // given that we don't really implement mmap, munmap is really easy 18511308Santhony.gutierrez@amd.com return 0; 18611308Santhony.gutierrez@amd.com} 18711308Santhony.gutierrez@amd.com 18811308Santhony.gutierrez@amd.com 18911308Santhony.gutierrez@amd.comconst char *hostname = "m5.eecs.umich.edu"; 19011308Santhony.gutierrez@amd.com 19111308Santhony.gutierrez@amd.comSyscallReturn 19211308Santhony.gutierrez@amd.comgethostnameFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 19311308Santhony.gutierrez@amd.com{ 19411308Santhony.gutierrez@amd.com int name_len = xc->getSyscallArg(1); 19511308Santhony.gutierrez@amd.com BufferArg name(xc->getSyscallArg(0), name_len); 19611308Santhony.gutierrez@amd.com 19711308Santhony.gutierrez@amd.com strncpy((char *)name.bufferPtr(), hostname, name_len); 19811308Santhony.gutierrez@amd.com 19911308Santhony.gutierrez@amd.com name.copyOut(xc->getMemPort()); 20011308Santhony.gutierrez@amd.com 20111308Santhony.gutierrez@amd.com return 0; 20211308Santhony.gutierrez@amd.com} 20311308Santhony.gutierrez@amd.com 20411308Santhony.gutierrez@amd.comSyscallReturn 20511308Santhony.gutierrez@amd.comunlinkFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 20611308Santhony.gutierrez@amd.com{ 20711308Santhony.gutierrez@amd.com string path; 20811308Santhony.gutierrez@amd.com 20911308Santhony.gutierrez@amd.com if (!xc->getMemPort()->tryReadString(path, xc->getSyscallArg(0))) 21011308Santhony.gutierrez@amd.com return (TheISA::IntReg)-EFAULT; 21111308Santhony.gutierrez@amd.com 21211308Santhony.gutierrez@amd.com int result = unlink(path.c_str()); 21311308Santhony.gutierrez@amd.com return (result == -1) ? -errno : result; 21412598Snikos.nikoleris@arm.com} 21512598Snikos.nikoleris@arm.com 21611308Santhony.gutierrez@amd.comSyscallReturn 21711308Santhony.gutierrez@amd.comrenameFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 21811308Santhony.gutierrez@amd.com{ 21911308Santhony.gutierrez@amd.com string old_name; 22011308Santhony.gutierrez@amd.com 22111308Santhony.gutierrez@amd.com if (!xc->getMemPort()->tryReadString(old_name, xc->getSyscallArg(0))) 22211308Santhony.gutierrez@amd.com return -EFAULT; 22311308Santhony.gutierrez@amd.com 22411308Santhony.gutierrez@amd.com string new_name; 22511308Santhony.gutierrez@amd.com 22611308Santhony.gutierrez@amd.com if (!xc->getMemPort()->tryReadString(new_name, xc->getSyscallArg(1))) 22711308Santhony.gutierrez@amd.com return -EFAULT; 22811308Santhony.gutierrez@amd.com 22911308Santhony.gutierrez@amd.com int64_t result = rename(old_name.c_str(), new_name.c_str()); 23011308Santhony.gutierrez@amd.com return (result == -1) ? -errno : result; 23111308Santhony.gutierrez@amd.com} 23211308Santhony.gutierrez@amd.com 23311308Santhony.gutierrez@amd.comSyscallReturn 23411308Santhony.gutierrez@amd.comtruncateFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 23511308Santhony.gutierrez@amd.com{ 23611308Santhony.gutierrez@amd.com string path; 23711308Santhony.gutierrez@amd.com 23811308Santhony.gutierrez@amd.com if (!xc->getMemPort()->tryReadString(path, xc->getSyscallArg(0))) 23911308Santhony.gutierrez@amd.com return -EFAULT; 24011308Santhony.gutierrez@amd.com 24112065Snikos.nikoleris@arm.com off_t length = xc->getSyscallArg(1); 24212065Snikos.nikoleris@arm.com 24312065Snikos.nikoleris@arm.com int result = truncate(path.c_str(), length); 24412065Snikos.nikoleris@arm.com return (result == -1) ? -errno : result; 24512065Snikos.nikoleris@arm.com} 24612065Snikos.nikoleris@arm.com 24712065Snikos.nikoleris@arm.comSyscallReturn 24812065Snikos.nikoleris@arm.comftruncateFunc(SyscallDesc *desc, int num, Process *process, ExecContext *xc) 24912065Snikos.nikoleris@arm.com{ 25012065Snikos.nikoleris@arm.com int fd = process->sim_fd(xc->getSyscallArg(0)); 25112065Snikos.nikoleris@arm.com 25213731Sandreas.sandberg@arm.com if (fd < 0) 25312065Snikos.nikoleris@arm.com return -EBADF; 25412065Snikos.nikoleris@arm.com 25512065Snikos.nikoleris@arm.com off_t length = xc->getSyscallArg(1); 25612065Snikos.nikoleris@arm.com 25712065Snikos.nikoleris@arm.com int result = ftruncate(fd, length); 25812065Snikos.nikoleris@arm.com return (result == -1) ? -errno : result; 25912065Snikos.nikoleris@arm.com} 26012065Snikos.nikoleris@arm.com 26111308Santhony.gutierrez@amd.comSyscallReturn 26211308Santhony.gutierrez@amd.comchownFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc) 26312065Snikos.nikoleris@arm.com{ 26411308Santhony.gutierrez@amd.com string path; 26511308Santhony.gutierrez@amd.com 26611308Santhony.gutierrez@amd.com if (!xc->getMemPort()->tryReadString(path, xc->getSyscallArg(0))) 26711308Santhony.gutierrez@amd.com return -EFAULT; 26811308Santhony.gutierrez@amd.com 26911308Santhony.gutierrez@amd.com /* XXX endianess */ 27011308Santhony.gutierrez@amd.com uint32_t owner = xc->getSyscallArg(1); 27111308Santhony.gutierrez@amd.com uid_t hostOwner = owner; 27211308Santhony.gutierrez@amd.com uint32_t group = xc->getSyscallArg(2); 27311308Santhony.gutierrez@amd.com gid_t hostGroup = group; 27411308Santhony.gutierrez@amd.com 27511308Santhony.gutierrez@amd.com int result = chown(path.c_str(), hostOwner, hostGroup); 27611308Santhony.gutierrez@amd.com return (result == -1) ? -errno : result; 27711308Santhony.gutierrez@amd.com} 27811308Santhony.gutierrez@amd.com 27911308Santhony.gutierrez@amd.comSyscallReturn 28011308Santhony.gutierrez@amd.comfchownFunc(SyscallDesc *desc, int num, Process *process, ExecContext *xc) 28111308Santhony.gutierrez@amd.com{ 28211308Santhony.gutierrez@amd.com int fd = process->sim_fd(xc->getSyscallArg(0)); 28311308Santhony.gutierrez@amd.com 28411308Santhony.gutierrez@amd.com if (fd < 0) 28511308Santhony.gutierrez@amd.com return -EBADF; 28611308Santhony.gutierrez@amd.com 28711308Santhony.gutierrez@amd.com /* XXX endianess */ 28811308Santhony.gutierrez@amd.com uint32_t owner = xc->getSyscallArg(1); 28911308Santhony.gutierrez@amd.com uid_t hostOwner = owner; 29011308Santhony.gutierrez@amd.com uint32_t group = xc->getSyscallArg(2); 29111308Santhony.gutierrez@amd.com gid_t hostGroup = group; 29211308Santhony.gutierrez@amd.com 29311308Santhony.gutierrez@amd.com int result = fchown(fd, hostOwner, hostGroup); 29411308Santhony.gutierrez@amd.com return (result == -1) ? -errno : result; 29511308Santhony.gutierrez@amd.com} 29611308Santhony.gutierrez@amd.com 29711308Santhony.gutierrez@amd.com 29813731Sandreas.sandberg@arm.comSyscallReturn 29911308Santhony.gutierrez@amd.comfcntlFunc(SyscallDesc *desc, int num, Process *process, 30011308Santhony.gutierrez@amd.com ExecContext *xc) 30111308Santhony.gutierrez@amd.com{ 30211308Santhony.gutierrez@amd.com int fd = xc->getSyscallArg(0); 30311308Santhony.gutierrez@amd.com 30411308Santhony.gutierrez@amd.com if (fd < 0 || process->sim_fd(fd) < 0) 30511308Santhony.gutierrez@amd.com return -EBADF; 30611308Santhony.gutierrez@amd.com 30711308Santhony.gutierrez@amd.com int cmd = xc->getSyscallArg(1); 30811308Santhony.gutierrez@amd.com switch (cmd) { 30911308Santhony.gutierrez@amd.com case 0: // F_DUPFD 31011308Santhony.gutierrez@amd.com // if we really wanted to support this, we'd need to do it 31111308Santhony.gutierrez@amd.com // in the target fd space. 31211308Santhony.gutierrez@amd.com warn("fcntl(%d, F_DUPFD) not supported, error returned\n", fd); 31311308Santhony.gutierrez@amd.com return -EMFILE; 31411308Santhony.gutierrez@amd.com 31511308Santhony.gutierrez@amd.com case 1: // F_GETFD (get close-on-exec flag) 31611308Santhony.gutierrez@amd.com case 2: // F_SETFD (set close-on-exec flag) 31711308Santhony.gutierrez@amd.com return 0; 31811308Santhony.gutierrez@amd.com 31911308Santhony.gutierrez@amd.com case 3: // F_GETFL (get file flags) 32011308Santhony.gutierrez@amd.com case 4: // F_SETFL (set file flags) 32111308Santhony.gutierrez@amd.com // not sure if this is totally valid, but we'll pass it through 32211308Santhony.gutierrez@amd.com // to the underlying OS 32311308Santhony.gutierrez@amd.com warn("fcntl(%d, %d) passed through to host\n", fd, cmd); 32411308Santhony.gutierrez@amd.com return fcntl(process->sim_fd(fd), cmd); 32511308Santhony.gutierrez@amd.com // return 0; 32611308Santhony.gutierrez@amd.com 32711308Santhony.gutierrez@amd.com case 7: // F_GETLK (get lock) 32811308Santhony.gutierrez@amd.com case 8: // F_SETLK (set lock) 32911308Santhony.gutierrez@amd.com case 9: // F_SETLKW (set lock and wait) 33013885Sdavid.hashe@amd.com // don't mess with file locking... just act like it's OK 33113885Sdavid.hashe@amd.com warn("File lock call (fcntl(%d, %d)) ignored.\n", fd, cmd); 33213885Sdavid.hashe@amd.com return 0; 33313885Sdavid.hashe@amd.com 33413885Sdavid.hashe@amd.com default: 33513885Sdavid.hashe@amd.com warn("Unknown fcntl command %d\n", cmd); 33613885Sdavid.hashe@amd.com return 0; 33713885Sdavid.hashe@amd.com } 33813885Sdavid.hashe@amd.com} 33913885Sdavid.hashe@amd.com 34013885Sdavid.hashe@amd.comSyscallReturn 34113885Sdavid.hashe@amd.compipePseudoFunc(SyscallDesc *desc, int callnum, Process *process, 34213885Sdavid.hashe@amd.com ExecContext *xc) 34313885Sdavid.hashe@amd.com{ 34413885Sdavid.hashe@amd.com int fds[2], sim_fds[2]; 34513885Sdavid.hashe@amd.com int pipe_retval = pipe(fds); 34613885Sdavid.hashe@amd.com 34713885Sdavid.hashe@amd.com if (pipe_retval < 0) { 34813885Sdavid.hashe@amd.com // error 34913885Sdavid.hashe@amd.com return pipe_retval; 35013885Sdavid.hashe@amd.com } 35113885Sdavid.hashe@amd.com 35213885Sdavid.hashe@amd.com sim_fds[0] = process->alloc_fd(fds[0]); 35313885Sdavid.hashe@amd.com sim_fds[1] = process->alloc_fd(fds[1]); 35413885Sdavid.hashe@amd.com 35513885Sdavid.hashe@amd.com // Alpha Linux convention for pipe() is that fd[0] is returned as 35613885Sdavid.hashe@amd.com // the return value of the function, and fd[1] is returned in r20. 35713885Sdavid.hashe@amd.com xc->setIntReg(SyscallPseudoReturnReg, sim_fds[1]); 35813885Sdavid.hashe@amd.com return sim_fds[0]; 35913885Sdavid.hashe@amd.com} 36013885Sdavid.hashe@amd.com 36113885Sdavid.hashe@amd.com 36213885Sdavid.hashe@amd.comSyscallReturn 36313885Sdavid.hashe@amd.comgetpidPseudoFunc(SyscallDesc *desc, int callnum, Process *process, 36413885Sdavid.hashe@amd.com ExecContext *xc) 36513885Sdavid.hashe@amd.com{ 36613885Sdavid.hashe@amd.com // Make up a PID. There's no interprocess communication in 36713885Sdavid.hashe@amd.com // fake_syscall mode, so there's no way for a process to know it's 36813885Sdavid.hashe@amd.com // not getting a unique value. 36913885Sdavid.hashe@amd.com 37013885Sdavid.hashe@amd.com xc->setIntReg(SyscallPseudoReturnReg, 99); 37113885Sdavid.hashe@amd.com return 100; 37213885Sdavid.hashe@amd.com} 37313885Sdavid.hashe@amd.com 37413885Sdavid.hashe@amd.com 37513885Sdavid.hashe@amd.comSyscallReturn 37613885Sdavid.hashe@amd.comgetuidPseudoFunc(SyscallDesc *desc, int callnum, Process *process, 37713885Sdavid.hashe@amd.com ExecContext *xc) 37813885Sdavid.hashe@amd.com{ 37913885Sdavid.hashe@amd.com // Make up a UID and EUID... it shouldn't matter, and we want the 38013885Sdavid.hashe@amd.com // simulation to be deterministic. 38113885Sdavid.hashe@amd.com 38213885Sdavid.hashe@amd.com // EUID goes in r20. 38311308Santhony.gutierrez@amd.com xc->setIntReg(SyscallPseudoReturnReg, 100); //EUID 38411308Santhony.gutierrez@amd.com return 100; // UID 38511308Santhony.gutierrez@amd.com} 38611308Santhony.gutierrez@amd.com 38711308Santhony.gutierrez@amd.com 38811308Santhony.gutierrez@amd.comSyscallReturn 38911308Santhony.gutierrez@amd.comgetgidPseudoFunc(SyscallDesc *desc, int callnum, Process *process, 39011308Santhony.gutierrez@amd.com ExecContext *xc) 39111308Santhony.gutierrez@amd.com{ 392 // Get current group ID. EGID goes in r20. 393 xc->setIntReg(SyscallPseudoReturnReg, 100); //EGID 394 return 100; 395} 396 397 398SyscallReturn 399setuidFunc(SyscallDesc *desc, int callnum, Process *process, 400 ExecContext *xc) 401{ 402 // can't fathom why a benchmark would call this. 403 warn("Ignoring call to setuid(%d)\n", xc->getSyscallArg(0)); 404 return 0; 405} 406 407SyscallReturn 408getpidFunc(SyscallDesc *desc, int callnum, Process *process, 409 ExecContext *xc) 410{ 411 // Make up a PID. There's no interprocess communication in 412 // fake_syscall mode, so there's no way for a process to know it's 413 // not getting a unique value. 414 415 xc->setIntReg(SyscallPseudoReturnReg, 99); //PID 416 return 100; 417} 418 419SyscallReturn 420getppidFunc(SyscallDesc *desc, int callnum, Process *process, 421 ExecContext *xc) 422{ 423 return 99; 424} 425 426SyscallReturn 427getuidFunc(SyscallDesc *desc, int callnum, Process *process, 428 ExecContext *xc) 429{ 430 return 100; // UID 431} 432 433SyscallReturn 434geteuidFunc(SyscallDesc *desc, int callnum, Process *process, 435 ExecContext *xc) 436{ 437 return 100; // UID 438} 439 440SyscallReturn 441getgidFunc(SyscallDesc *desc, int callnum, Process *process, 442 ExecContext *xc) 443{ 444 return 100; 445} 446 447SyscallReturn 448getegidFunc(SyscallDesc *desc, int callnum, Process *process, 449 ExecContext *xc) 450{ 451 return 100; 452} 453 454 455