process.cc revision 11723
111723Sar4jc@virginia.edu/*
211723Sar4jc@virginia.edu * Copyright (c) 2005 The Regents of The University of Michigan
311723Sar4jc@virginia.edu * Copyright (c) 2007 MIPS Technologies, Inc.
411723Sar4jc@virginia.edu * Copyright (c) 2016 The University of Virginia
511723Sar4jc@virginia.edu * All rights reserved.
611723Sar4jc@virginia.edu *
711723Sar4jc@virginia.edu * Redistribution and use in source and binary forms, with or without
811723Sar4jc@virginia.edu * modification, are permitted provided that the following conditions are
911723Sar4jc@virginia.edu * met: redistributions of source code must retain the above copyright
1011723Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer;
1111723Sar4jc@virginia.edu * redistributions in binary form must reproduce the above copyright
1211723Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer in the
1311723Sar4jc@virginia.edu * documentation and/or other materials provided with the distribution;
1411723Sar4jc@virginia.edu * neither the name of the copyright holders nor the names of its
1511723Sar4jc@virginia.edu * contributors may be used to endorse or promote products derived from
1611723Sar4jc@virginia.edu * this software without specific prior written permission.
1711723Sar4jc@virginia.edu *
1811723Sar4jc@virginia.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1911723Sar4jc@virginia.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2011723Sar4jc@virginia.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2111723Sar4jc@virginia.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2211723Sar4jc@virginia.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2311723Sar4jc@virginia.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2411723Sar4jc@virginia.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2511723Sar4jc@virginia.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2611723Sar4jc@virginia.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2711723Sar4jc@virginia.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2811723Sar4jc@virginia.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2911723Sar4jc@virginia.edu *
3011723Sar4jc@virginia.edu * Authors: Gabe Black
3111723Sar4jc@virginia.edu *          Korey Sewell
3211723Sar4jc@virginia.edu *          Alec Roelke
3311723Sar4jc@virginia.edu */
3411723Sar4jc@virginia.edu
3511723Sar4jc@virginia.edu#include "arch/riscv/linux/process.hh"
3611723Sar4jc@virginia.edu
3711723Sar4jc@virginia.edu#include <map>
3811723Sar4jc@virginia.edu
3911723Sar4jc@virginia.edu#include "arch/riscv/isa_traits.hh"
4011723Sar4jc@virginia.edu#include "arch/riscv/linux/linux.hh"
4111723Sar4jc@virginia.edu#include "base/trace.hh"
4211723Sar4jc@virginia.edu#include "cpu/thread_context.hh"
4311723Sar4jc@virginia.edu#include "debug/SyscallVerbose.hh"
4411723Sar4jc@virginia.edu#include "kern/linux/linux.hh"
4511723Sar4jc@virginia.edu#include "sim/eventq.hh"
4611723Sar4jc@virginia.edu#include "sim/process.hh"
4711723Sar4jc@virginia.edu#include "sim/syscall_emul.hh"
4811723Sar4jc@virginia.edu#include "sim/system.hh"
4911723Sar4jc@virginia.edu
5011723Sar4jc@virginia.eduusing namespace std;
5111723Sar4jc@virginia.eduusing namespace RiscvISA;
5211723Sar4jc@virginia.edu
5311723Sar4jc@virginia.edu/// Target uname() handler.
5411723Sar4jc@virginia.edustatic SyscallReturn
5511723Sar4jc@virginia.eduunameFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
5611723Sar4jc@virginia.edu          ThreadContext *tc)
5711723Sar4jc@virginia.edu{
5811723Sar4jc@virginia.edu    int index = 0;
5911723Sar4jc@virginia.edu    TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, index));
6011723Sar4jc@virginia.edu
6111723Sar4jc@virginia.edu    strcpy(name->sysname, "Linux");
6211723Sar4jc@virginia.edu    strcpy(name->nodename,"sim.gem5.org");
6311723Sar4jc@virginia.edu    strcpy(name->release, "3.0.0");
6411723Sar4jc@virginia.edu    strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
6511723Sar4jc@virginia.edu    strcpy(name->machine, "riscv");
6611723Sar4jc@virginia.edu
6711723Sar4jc@virginia.edu    name.copyOut(tc->getMemProxy());
6811723Sar4jc@virginia.edu    return 0;
6911723Sar4jc@virginia.edu}
7011723Sar4jc@virginia.edu
7111723Sar4jc@virginia.edustd::map<int, SyscallDesc> RiscvLinuxProcess::syscallDescs = {
7211723Sar4jc@virginia.edu    {17, SyscallDesc("getcwd", getcwdFunc)},
7311723Sar4jc@virginia.edu    {23, SyscallDesc("dup", dupFunc)},
7411723Sar4jc@virginia.edu    {25, SyscallDesc("fcntl", fcntlFunc)},
7511723Sar4jc@virginia.edu    {29, SyscallDesc("ioctl", ioctlFunc<RiscvLinux>)},
7611723Sar4jc@virginia.edu    {34, SyscallDesc("mkdirat", unimplementedFunc)},
7711723Sar4jc@virginia.edu    {35, SyscallDesc("unlinkat", unlinkatFunc<RiscvLinux>)},
7811723Sar4jc@virginia.edu    {37, SyscallDesc("linkat", unimplementedFunc)},
7911723Sar4jc@virginia.edu    {38, SyscallDesc("renameat", renameatFunc<RiscvLinux>)},
8011723Sar4jc@virginia.edu    {46, SyscallDesc("ftruncate", ftruncateFunc)},
8111723Sar4jc@virginia.edu    {48, SyscallDesc("faccessat", faccessatFunc<RiscvLinux>)},
8211723Sar4jc@virginia.edu    {49, SyscallDesc("chdir", unimplementedFunc)},
8311723Sar4jc@virginia.edu    {56, SyscallDesc("openat", openatFunc<RiscvLinux>)},
8411723Sar4jc@virginia.edu    {57, SyscallDesc("close", closeFunc)},
8511723Sar4jc@virginia.edu    {61, SyscallDesc("getdents", unimplementedFunc)},
8611723Sar4jc@virginia.edu    {62, SyscallDesc("lseek", lseekFunc)},
8711723Sar4jc@virginia.edu    {63, SyscallDesc("read", readFunc)},
8811723Sar4jc@virginia.edu    {64, SyscallDesc("write", writeFunc)},
8911723Sar4jc@virginia.edu    {66, SyscallDesc("writev", writevFunc<RiscvLinux>)},
9011723Sar4jc@virginia.edu    {67, SyscallDesc("pread", unimplementedFunc)},
9111723Sar4jc@virginia.edu    {68, SyscallDesc("pwrite", unimplementedFunc)},
9211723Sar4jc@virginia.edu    {78, SyscallDesc("readlinkat", readlinkatFunc<RiscvLinux>)},
9311723Sar4jc@virginia.edu    {79, SyscallDesc("fstatat", unimplementedFunc)},
9411723Sar4jc@virginia.edu    {80, SyscallDesc("fstat", fstatFunc<RiscvLinux>)},
9511723Sar4jc@virginia.edu    {93, SyscallDesc("exit", exitFunc)},
9611723Sar4jc@virginia.edu    {94, SyscallDesc("exit_group", exitGroupFunc)},
9711723Sar4jc@virginia.edu    {113, SyscallDesc("clock_gettime", clock_gettimeFunc<RiscvLinux>)},
9811723Sar4jc@virginia.edu    {129, SyscallDesc("kill", unimplementedFunc)},
9911723Sar4jc@virginia.edu    {134, SyscallDesc("rt_sigaction", ignoreFunc, SyscallDesc::WarnOnce)},
10011723Sar4jc@virginia.edu    {135, SyscallDesc("rt_sigprocmask", ignoreFunc, SyscallDesc::WarnOnce)},
10111723Sar4jc@virginia.edu    {153, SyscallDesc("times", timesFunc<RiscvLinux>)},
10211723Sar4jc@virginia.edu    {160, SyscallDesc("uname", unameFunc)},
10311723Sar4jc@virginia.edu    {163, SyscallDesc("getrlimit", getrlimitFunc<RiscvLinux>)},
10411723Sar4jc@virginia.edu    {164, SyscallDesc("setrlimit", ignoreFunc)},
10511723Sar4jc@virginia.edu    {165, SyscallDesc("getrusage", getrusageFunc<RiscvLinux>)},
10611723Sar4jc@virginia.edu    {169, SyscallDesc("gettimeofday", gettimeofdayFunc<RiscvLinux>)},
10711723Sar4jc@virginia.edu    {172, SyscallDesc("getpid", getpidFunc)},
10811723Sar4jc@virginia.edu    {174, SyscallDesc("getuid", getuidFunc)},
10911723Sar4jc@virginia.edu    {175, SyscallDesc("geteuid", geteuidFunc)},
11011723Sar4jc@virginia.edu    {176, SyscallDesc("getgid", getgidFunc)},
11111723Sar4jc@virginia.edu    {177, SyscallDesc("getegid", getegidFunc)},
11211723Sar4jc@virginia.edu    {214, SyscallDesc("brk", brkFunc)},
11311723Sar4jc@virginia.edu    {215, SyscallDesc("munmap", munmapFunc)},
11411723Sar4jc@virginia.edu    {216, SyscallDesc("mremap", mremapFunc<RiscvLinux>)},
11511723Sar4jc@virginia.edu    {222, SyscallDesc("mmap", mmapFunc<RiscvLinux>)},
11611723Sar4jc@virginia.edu    {226, SyscallDesc("mprotect", ignoreFunc)},
11711723Sar4jc@virginia.edu    {1024, SyscallDesc("open", openFunc<RiscvLinux>)},
11811723Sar4jc@virginia.edu    {1025, SyscallDesc("link", unimplementedFunc)},
11911723Sar4jc@virginia.edu    {1026, SyscallDesc("unlink", unlinkFunc)},
12011723Sar4jc@virginia.edu    {1030, SyscallDesc("mkdir", mkdirFunc)},
12111723Sar4jc@virginia.edu    {1033, SyscallDesc("access", accessFunc)},
12211723Sar4jc@virginia.edu    {1038, SyscallDesc("stat", statFunc<RiscvLinux>)},
12311723Sar4jc@virginia.edu    {1039, SyscallDesc("lstat", lstatFunc<RiscvLinux>)},
12411723Sar4jc@virginia.edu    {1062, SyscallDesc("time", timeFunc<RiscvLinux>)},
12511723Sar4jc@virginia.edu    {2011, SyscallDesc("getmainvars", unimplementedFunc)},
12611723Sar4jc@virginia.edu};
12711723Sar4jc@virginia.edu
12811723Sar4jc@virginia.eduRiscvLinuxProcess::RiscvLinuxProcess(LiveProcessParams * params,
12911723Sar4jc@virginia.edu    ObjectFile *objFile) : RiscvLiveProcess(params, objFile)
13011723Sar4jc@virginia.edu{}
13111723Sar4jc@virginia.edu
13211723Sar4jc@virginia.eduSyscallDesc*
13311723Sar4jc@virginia.eduRiscvLinuxProcess::getDesc(int callnum)
13411723Sar4jc@virginia.edu{
13511723Sar4jc@virginia.edu    return syscallDescs.find(callnum) != syscallDescs.end() ?
13611723Sar4jc@virginia.edu        &syscallDescs.at(callnum) : nullptr;
13711723Sar4jc@virginia.edu}
138