/*
 * Copyright (c) 2005 The Regents of The University of Michigan
 * Copyright (c) 2007 MIPS Technologies, Inc.
 * Copyright (c) 2016 The University of Virginia
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Authors: Gabe Black
 *          Korey Sewell
 *          Alec Roelke
 */

#include "arch/riscv/linux/process.hh"

#include <map>

#include "arch/riscv/isa_traits.hh"
#include "arch/riscv/linux/linux.hh"
#include "base/trace.hh"
#include "cpu/thread_context.hh"
#include "debug/SyscallVerbose.hh"
#include "kern/linux/linux.hh"
#include "sim/eventq.hh"
#include "sim/process.hh"
#include "sim/syscall_desc.hh"
#include "sim/syscall_emul.hh"
#include "sim/system.hh"

using namespace std;
using namespace RiscvISA;

/// Target uname() handler.
static SyscallReturn
unameFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
          ThreadContext *tc)
{
    int index = 0;
    TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, index));

    strcpy(name->sysname, "Linux");
    strcpy(name->nodename,"sim.gem5.org");
    strcpy(name->release, "3.0.0");
    strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
    strcpy(name->machine, "riscv");

    name.copyOut(tc->getMemProxy());
    return 0;
}

std::map<int, SyscallDesc> RiscvLinuxProcess::syscallDescs = {
    {17, SyscallDesc("getcwd", getcwdFunc)},
    {23, SyscallDesc("dup", dupFunc)},
    {25, SyscallDesc("fcntl", fcntl64Func)},
    {29, SyscallDesc("ioctl", ioctlFunc<RiscvLinux>)},
    {34, SyscallDesc("mkdirat", unimplementedFunc)},
    {35, SyscallDesc("unlinkat", unlinkatFunc<RiscvLinux>)},
    {37, SyscallDesc("linkat", unimplementedFunc)},
    {38, SyscallDesc("renameat", renameatFunc<RiscvLinux>)},
    {46, SyscallDesc("ftruncate", ftruncate64Func)},
    {48, SyscallDesc("faccessat", faccessatFunc<RiscvLinux>)},
    {49, SyscallDesc("chdir", unimplementedFunc)},
    {56, SyscallDesc("openat", openatFunc<RiscvLinux>)},
    {57, SyscallDesc("close", closeFunc)},
    {61, SyscallDesc("getdents", unimplementedFunc)},
    {62, SyscallDesc("lseek", lseekFunc)},
    {63, SyscallDesc("read", readFunc)},
    {64, SyscallDesc("write", writeFunc)},
    {66, SyscallDesc("writev", writevFunc<RiscvLinux>)},
    {67, SyscallDesc("pread", unimplementedFunc)},
    {68, SyscallDesc("pwrite", pwrite64Func<RiscvLinux>)},
    {78, SyscallDesc("readlinkat", readlinkatFunc<RiscvLinux>)},
    {79, SyscallDesc("fstatat", fstatat64Func<RiscvLinux>)},
    {80, SyscallDesc("fstat", fstat64Func<RiscvLinux>)},
    {93, SyscallDesc("exit", exitFunc)},
    {94, SyscallDesc("exit_group", exitGroupFunc)},
    {113, SyscallDesc("clock_gettime", clock_gettimeFunc<RiscvLinux>)},
    {129, SyscallDesc("kill", unimplementedFunc)},
    {134, SyscallDesc("rt_sigaction", ignoreFunc, SyscallDesc::WarnOnce)},
    {135, SyscallDesc("rt_sigprocmask", ignoreFunc, SyscallDesc::WarnOnce)},
    {153, SyscallDesc("times", timesFunc<RiscvLinux>)},
    {160, SyscallDesc("uname", unameFunc)},
    {163, SyscallDesc("getrlimit", getrlimitFunc<RiscvLinux>)},
    {164, SyscallDesc("setrlimit", ignoreFunc)},
    {165, SyscallDesc("getrusage", getrusageFunc<RiscvLinux>)},
    {169, SyscallDesc("gettimeofday", gettimeofdayFunc<RiscvLinux>)},
    {172, SyscallDesc("getpid", getpidFunc)},
    {174, SyscallDesc("getuid", getuidFunc)},
    {175, SyscallDesc("geteuid", geteuidFunc)},
    {176, SyscallDesc("getgid", getgidFunc)},
    {177, SyscallDesc("getegid", getegidFunc)},
    {214, SyscallDesc("brk", brkFunc)},
    {215, SyscallDesc("munmap", munmapFunc)},
    {216, SyscallDesc("mremap", mremapFunc<RiscvLinux>)},
    {222, SyscallDesc("mmap", mmapFunc<RiscvLinux>)},
    {226, SyscallDesc("mprotect", ignoreFunc)},
    {1024, SyscallDesc("open", openFunc<RiscvLinux>)},
    {1025, SyscallDesc("link", unimplementedFunc)},
    {1026, SyscallDesc("unlink", unlinkFunc)},
    {1030, SyscallDesc("mkdir", mkdirFunc)},
    {1033, SyscallDesc("access", accessFunc)},
    {1038, SyscallDesc("stat", stat64Func<RiscvLinux>)},
    {1039, SyscallDesc("lstat", lstat64Func<RiscvLinux>)},
    {1062, SyscallDesc("time", timeFunc<RiscvLinux>)},
    {2011, SyscallDesc("getmainvars", unimplementedFunc)},
};

RiscvLinuxProcess::RiscvLinuxProcess(LiveProcessParams * params,
    ObjectFile *objFile) : RiscvLiveProcess(params, objFile)
{}

SyscallDesc*
RiscvLinuxProcess::getDesc(int callnum)
{
    return syscallDescs.find(callnum) != syscallDescs.end() ?
        &syscallDescs.at(callnum) : nullptr;
}
