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