process.cc revision 11851
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"
4711794Sbrandon.potter@amd.com#include "sim/syscall_desc.hh"
4811723Sar4jc@virginia.edu#include "sim/syscall_emul.hh"
4911723Sar4jc@virginia.edu#include "sim/system.hh"
5011723Sar4jc@virginia.edu
5111723Sar4jc@virginia.eduusing namespace std;
5211723Sar4jc@virginia.eduusing namespace RiscvISA;
5311723Sar4jc@virginia.edu
5411723Sar4jc@virginia.edu/// Target uname() handler.
5511723Sar4jc@virginia.edustatic SyscallReturn
5611851Sbrandon.potter@amd.comunameFunc(SyscallDesc *desc, int callnum, Process *process,
5711723Sar4jc@virginia.edu          ThreadContext *tc)
5811723Sar4jc@virginia.edu{
5911723Sar4jc@virginia.edu    int index = 0;
6011723Sar4jc@virginia.edu    TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, index));
6111723Sar4jc@virginia.edu
6211723Sar4jc@virginia.edu    strcpy(name->sysname, "Linux");
6311723Sar4jc@virginia.edu    strcpy(name->nodename,"sim.gem5.org");
6411723Sar4jc@virginia.edu    strcpy(name->release, "3.0.0");
6511723Sar4jc@virginia.edu    strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
6611723Sar4jc@virginia.edu    strcpy(name->machine, "riscv");
6711723Sar4jc@virginia.edu
6811723Sar4jc@virginia.edu    name.copyOut(tc->getMemProxy());
6911723Sar4jc@virginia.edu    return 0;
7011723Sar4jc@virginia.edu}
7111723Sar4jc@virginia.edu
7211723Sar4jc@virginia.edustd::map<int, SyscallDesc> RiscvLinuxProcess::syscallDescs = {
7311723Sar4jc@virginia.edu    {17, SyscallDesc("getcwd", getcwdFunc)},
7411723Sar4jc@virginia.edu    {23, SyscallDesc("dup", dupFunc)},
7511728Sar4jc@virginia.edu    {25, SyscallDesc("fcntl", fcntl64Func)},
7611723Sar4jc@virginia.edu    {29, SyscallDesc("ioctl", ioctlFunc<RiscvLinux>)},
7711723Sar4jc@virginia.edu    {34, SyscallDesc("mkdirat", unimplementedFunc)},
7811723Sar4jc@virginia.edu    {35, SyscallDesc("unlinkat", unlinkatFunc<RiscvLinux>)},
7911723Sar4jc@virginia.edu    {37, SyscallDesc("linkat", unimplementedFunc)},
8011723Sar4jc@virginia.edu    {38, SyscallDesc("renameat", renameatFunc<RiscvLinux>)},
8111728Sar4jc@virginia.edu    {46, SyscallDesc("ftruncate", ftruncate64Func)},
8211723Sar4jc@virginia.edu    {48, SyscallDesc("faccessat", faccessatFunc<RiscvLinux>)},
8311723Sar4jc@virginia.edu    {49, SyscallDesc("chdir", unimplementedFunc)},
8411723Sar4jc@virginia.edu    {56, SyscallDesc("openat", openatFunc<RiscvLinux>)},
8511723Sar4jc@virginia.edu    {57, SyscallDesc("close", closeFunc)},
8611723Sar4jc@virginia.edu    {61, SyscallDesc("getdents", unimplementedFunc)},
8711723Sar4jc@virginia.edu    {62, SyscallDesc("lseek", lseekFunc)},
8811723Sar4jc@virginia.edu    {63, SyscallDesc("read", readFunc)},
8911723Sar4jc@virginia.edu    {64, SyscallDesc("write", writeFunc)},
9011723Sar4jc@virginia.edu    {66, SyscallDesc("writev", writevFunc<RiscvLinux>)},
9111723Sar4jc@virginia.edu    {67, SyscallDesc("pread", unimplementedFunc)},
9211728Sar4jc@virginia.edu    {68, SyscallDesc("pwrite", pwrite64Func<RiscvLinux>)},
9311723Sar4jc@virginia.edu    {78, SyscallDesc("readlinkat", readlinkatFunc<RiscvLinux>)},
9411728Sar4jc@virginia.edu    {79, SyscallDesc("fstatat", fstatat64Func<RiscvLinux>)},
9511728Sar4jc@virginia.edu    {80, SyscallDesc("fstat", fstat64Func<RiscvLinux>)},
9611723Sar4jc@virginia.edu    {93, SyscallDesc("exit", exitFunc)},
9711723Sar4jc@virginia.edu    {94, SyscallDesc("exit_group", exitGroupFunc)},
9811723Sar4jc@virginia.edu    {113, SyscallDesc("clock_gettime", clock_gettimeFunc<RiscvLinux>)},
9911723Sar4jc@virginia.edu    {129, SyscallDesc("kill", unimplementedFunc)},
10011723Sar4jc@virginia.edu    {134, SyscallDesc("rt_sigaction", ignoreFunc, SyscallDesc::WarnOnce)},
10111723Sar4jc@virginia.edu    {135, SyscallDesc("rt_sigprocmask", ignoreFunc, SyscallDesc::WarnOnce)},
10211723Sar4jc@virginia.edu    {153, SyscallDesc("times", timesFunc<RiscvLinux>)},
10311723Sar4jc@virginia.edu    {160, SyscallDesc("uname", unameFunc)},
10411723Sar4jc@virginia.edu    {163, SyscallDesc("getrlimit", getrlimitFunc<RiscvLinux>)},
10511723Sar4jc@virginia.edu    {164, SyscallDesc("setrlimit", ignoreFunc)},
10611723Sar4jc@virginia.edu    {165, SyscallDesc("getrusage", getrusageFunc<RiscvLinux>)},
10711723Sar4jc@virginia.edu    {169, SyscallDesc("gettimeofday", gettimeofdayFunc<RiscvLinux>)},
10811723Sar4jc@virginia.edu    {172, SyscallDesc("getpid", getpidFunc)},
10911723Sar4jc@virginia.edu    {174, SyscallDesc("getuid", getuidFunc)},
11011723Sar4jc@virginia.edu    {175, SyscallDesc("geteuid", geteuidFunc)},
11111723Sar4jc@virginia.edu    {176, SyscallDesc("getgid", getgidFunc)},
11211723Sar4jc@virginia.edu    {177, SyscallDesc("getegid", getegidFunc)},
11311723Sar4jc@virginia.edu    {214, SyscallDesc("brk", brkFunc)},
11411723Sar4jc@virginia.edu    {215, SyscallDesc("munmap", munmapFunc)},
11511723Sar4jc@virginia.edu    {216, SyscallDesc("mremap", mremapFunc<RiscvLinux>)},
11611723Sar4jc@virginia.edu    {222, SyscallDesc("mmap", mmapFunc<RiscvLinux>)},
11711723Sar4jc@virginia.edu    {226, SyscallDesc("mprotect", ignoreFunc)},
11811723Sar4jc@virginia.edu    {1024, SyscallDesc("open", openFunc<RiscvLinux>)},
11911723Sar4jc@virginia.edu    {1025, SyscallDesc("link", unimplementedFunc)},
12011723Sar4jc@virginia.edu    {1026, SyscallDesc("unlink", unlinkFunc)},
12111723Sar4jc@virginia.edu    {1030, SyscallDesc("mkdir", mkdirFunc)},
12211723Sar4jc@virginia.edu    {1033, SyscallDesc("access", accessFunc)},
12311728Sar4jc@virginia.edu    {1038, SyscallDesc("stat", stat64Func<RiscvLinux>)},
12411728Sar4jc@virginia.edu    {1039, SyscallDesc("lstat", lstat64Func<RiscvLinux>)},
12511723Sar4jc@virginia.edu    {1062, SyscallDesc("time", timeFunc<RiscvLinux>)},
12611723Sar4jc@virginia.edu    {2011, SyscallDesc("getmainvars", unimplementedFunc)},
12711723Sar4jc@virginia.edu};
12811723Sar4jc@virginia.edu
12911851Sbrandon.potter@amd.comRiscvLinuxProcess::RiscvLinuxProcess(ProcessParams * params,
13011851Sbrandon.potter@amd.com    ObjectFile *objFile) : RiscvProcess(params, objFile)
13111723Sar4jc@virginia.edu{}
13211723Sar4jc@virginia.edu
13311723Sar4jc@virginia.eduSyscallDesc*
13411723Sar4jc@virginia.eduRiscvLinuxProcess::getDesc(int callnum)
13511723Sar4jc@virginia.edu{
13611723Sar4jc@virginia.edu    return syscallDescs.find(callnum) != syscallDescs.end() ?
13711723Sar4jc@virginia.edu        &syscallDescs.at(callnum) : nullptr;
13811723Sar4jc@virginia.edu}
139