blob: 6f3f03741e1bf631cf8ae42adf868c35a0e365c0 [file] [log] [blame]
/*
* 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/loader/object_file.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;
namespace
{
class RiscvLinuxObjectFileLoader : public Process::Loader
{
public:
Process *
load(ProcessParams *params, ObjectFile *obj_file) override
{
auto arch = obj_file->getArch();
auto opsys = obj_file->getOpSys();
if (arch != ObjectFile::Riscv64 && arch != ObjectFile::Riscv32)
return nullptr;
if (opsys == ObjectFile::UnknownOpSys) {
warn("Unknown operating system; assuming Linux.");
opsys = ObjectFile::Linux;
}
if (opsys != ObjectFile::Linux)
return nullptr;
if (arch == ObjectFile::Riscv64)
return new RiscvLinuxProcess64(params, obj_file);
else
return new RiscvLinuxProcess32(params, obj_file);
}
};
RiscvLinuxObjectFileLoader loader;
} // anonymous namespace
/// Target uname() handler.
static SyscallReturn
unameFunc64(SyscallDesc *desc, int callnum, ThreadContext *tc)
{
int index = 0;
auto process = tc->getProcessPtr();
TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, index));
strcpy(name->sysname, "Linux");
strcpy(name->nodename,"sim.gem5.org");
strcpy(name->release, process->release.c_str());
strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
strcpy(name->machine, "riscv64");
name.copyOut(tc->getVirtProxy());
return 0;
}
/// Target uname() handler.
static SyscallReturn
unameFunc32(SyscallDesc *desc, int callnum, ThreadContext *tc)
{
int index = 0;
auto process = tc->getProcessPtr();
TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, index));
strcpy(name->sysname, "Linux");
strcpy(name->nodename,"sim.gem5.org");
strcpy(name->release, process->release.c_str());
strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
strcpy(name->machine, "riscv32");
name.copyOut(tc->getVirtProxy());
return 0;
}
std::map<int, SyscallDescABI<DefaultSyscallABI>>
RiscvLinuxProcess64::syscallDescs = {
{0, { "io_setup" }},
{1, { "io_destroy" }},
{2, { "io_submit" }},
{3, { "io_cancel" }},
{4, { "io_getevents" }},
{5, { "setxattr" }},
{6, { "lsetxattr" }},
{7, { "fsetxattr" }},
{8, { "getxattr" }},
{9, { "lgetxattr" }},
{10, { "fgetxattr" }},
{11, { "listxattr" }},
{12, { "llistxattr" }},
{13, { "flistxattr" }},
{14, { "removexattr" }},
{15, { "lremovexattr" }},
{16, { "fremovexattr" }},
{17, { "getcwd", getcwdFunc }},
{18, { "lookup_dcookie" }},
{19, { "eventfd2" }},
{20, { "epoll_create1" }},
{21, { "epoll_ctl" }},
{22, { "epoll_pwait" }},
{23, { "dup", dupFunc }},
{24, { "dup3" }},
{25, { "fcntl", fcntl64Func }},
{26, { "inotify_init1" }},
{27, { "inotify_add_watch" }},
{28, { "inotify_rm_watch" }},
{29, { "ioctl", ioctlFunc<RiscvLinux64> }},
{30, { "ioprio_get" }},
{31, { "ioprio_set" }},
{32, { "flock" }},
{33, { "mknodat" }},
{34, { "mkdirat" }},
{35, { "unlinkat", unlinkatFunc<RiscvLinux64> }},
{36, { "symlinkat" }},
{37, { "linkat" }},
{38, { "renameat", renameatFunc<RiscvLinux64> }},
{39, { "umount2" }},
{40, { "mount" }},
{41, { "pivot_root" }},
{42, { "nfsservctl" }},
{43, { "statfs", statfsFunc<RiscvLinux64> }},
{44, { "fstatfs", fstatfsFunc<RiscvLinux64> }},
{45, { "truncate", truncateFunc }},
{46, { "ftruncate", ftruncate64Func }},
{47, { "fallocate", fallocateFunc }},
{48, { "faccessat", faccessatFunc<RiscvLinux64> }},
{49, { "chdir" }},
{50, { "fchdir" }},
{51, { "chroot" }},
{52, { "fchmod", fchmodFunc<RiscvLinux64> }},
{53, { "fchmodat" }},
{54, { "fchownat" }},
{55, { "fchown", fchownFunc }},
{56, { "openat", openatFunc<RiscvLinux64> }},
{57, { "close", closeFunc }},
{58, { "vhangup" }},
{59, { "pipe2" }},
{60, { "quotactl" }},
{61, { "getdents64" }},
{62, { "lseek", lseekFunc }},
{63, { "read", readFunc<RiscvLinux64> }},
{64, { "write", writeFunc<RiscvLinux64> }},
{66, { "writev", writevFunc<RiscvLinux64> }},
{67, { "pread64" }},
{68, { "pwrite64", pwrite64Func<RiscvLinux64> }},
{69, { "preadv" }},
{70, { "pwritev" }},
{71, { "sendfile" }},
{72, { "pselect6" }},
{73, { "ppoll" }},
{74, { "signalfd64" }},
{75, { "vmsplice" }},
{76, { "splice" }},
{77, { "tee" }},
{78, { "readlinkat", readlinkatFunc<RiscvLinux64> }},
{79, { "fstatat", fstatat64Func<RiscvLinux64> }},
{80, { "fstat", fstat64Func<RiscvLinux64> }},
{81, { "sync" }},
{82, { "fsync" }},
{83, { "fdatasync" }},
{84, { "sync_file_range2" }},
{85, { "timerfd_create" }},
{86, { "timerfd_settime" }},
{87, { "timerfd_gettime" }},
{88, { "utimensat" }},
{89, { "acct" }},
{90, { "capget" }},
{91, { "capset" }},
{92, { "personality" }},
{93, { "exit", exitFunc }},
{94, { "exit_group", exitGroupFunc }},
{95, { "waitid" }},
{96, { "set_tid_address", setTidAddressFunc }},
{97, { "unshare" }},
{98, { "futex", futexFunc<RiscvLinux64> }},
{99, { "set_robust_list", ignoreWarnOnceFunc }},
{100, { "get_robust_list", ignoreWarnOnceFunc }},
{101, { "nanosleep", ignoreWarnOnceFunc }},
{102, { "getitimer" }},
{103, { "setitimer" }},
{104, { "kexec_load" }},
{105, { "init_module" }},
{106, { "delete_module" }},
{107, { "timer_create" }},
{108, { "timer_gettime" }},
{109, { "timer_getoverrun" }},
{110, { "timer_settime" }},
{111, { "timer_delete" }},
{112, { "clock_settime" }},
{113, { "clock_gettime", clock_gettimeFunc<RiscvLinux64> }},
{114, { "clock_getres", clock_getresFunc<RiscvLinux64> }},
{115, { "clock_nanosleep" }},
{116, { "syslog" }},
{117, { "ptrace" }},
{118, { "sched_setparam" }},
{119, { "sched_setscheduler" }},
{120, { "sched_getscheduler" }},
{121, { "sched_getparam" }},
{122, { "sched_setaffinity" }},
{123, { "sched_getaffinity" }},
{124, { "sched_yield", ignoreWarnOnceFunc }},
{125, { "sched_get_priority_max" }},
{126, { "sched_get_priority_min" }},
{127, { "scheD_rr_get_interval" }},
{128, { "restart_syscall" }},
{129, { "kill" }},
{130, { "tkill" }},
{131, { "tgkill", tgkillFunc<RiscvLinux64> }},
{132, { "sigaltstack" }},
{133, { "rt_sigsuspend", ignoreWarnOnceFunc }},
{134, { "rt_sigaction", ignoreWarnOnceFunc }},
{135, { "rt_sigprocmask", ignoreWarnOnceFunc }},
{136, { "rt_sigpending", ignoreWarnOnceFunc }},
{137, { "rt_sigtimedwait", ignoreWarnOnceFunc }},
{138, { "rt_sigqueueinfo", ignoreWarnOnceFunc }},
{139, { "rt_sigreturn", ignoreWarnOnceFunc }},
{140, { "setpriority" }},
{141, { "getpriority" }},
{142, { "reboot" }},
{143, { "setregid" }},
{144, { "setgid" }},
{145, { "setreuid" }},
{146, { "setuid", ignoreFunc }},
{147, { "setresuid" }},
{148, { "getresuid" }},
{149, { "getresgid" }},
{150, { "getresgid" }},
{151, { "setfsuid" }},
{152, { "setfsgid" }},
{153, { "times", timesFunc<RiscvLinux64> }},
{154, { "setpgid", setpgidFunc }},
{155, { "getpgid" }},
{156, { "getsid" }},
{157, { "setsid" }},
{158, { "getgroups" }},
{159, { "setgroups" }},
{160, { "uname", unameFunc64 }},
{161, { "sethostname" }},
{162, { "setdomainname" }},
{163, { "getrlimit", getrlimitFunc<RiscvLinux64> }},
{164, { "setrlimit", ignoreFunc }},
{165, { "getrusage", getrusageFunc<RiscvLinux64> }},
{166, { "umask", umaskFunc }},
{167, { "prctl" }},
{168, { "getcpu" }},
{169, { "gettimeofday", gettimeofdayFunc<RiscvLinux64> }},
{170, { "settimeofday" }},
{171, { "adjtimex" }},
{172, { "getpid", getpidFunc }},
{173, { "getppid", getppidFunc }},
{174, { "getuid", getuidFunc }},
{175, { "geteuid", geteuidFunc }},
{176, { "getgid", getgidFunc }},
{177, { "getegid", getegidFunc }},
{178, { "gettid", gettidFunc }},
{179, { "sysinfo", sysinfoFunc<RiscvLinux64> }},
{180, { "mq_open" }},
{181, { "mq_unlink" }},
{182, { "mq_timedsend" }},
{183, { "mq_timedrecieve" }},
{184, { "mq_notify" }},
{185, { "mq_getsetattr" }},
{186, { "msgget" }},
{187, { "msgctl" }},
{188, { "msgrcv" }},
{189, { "msgsnd" }},
{190, { "semget" }},
{191, { "semctl" }},
{192, { "semtimedop" }},
{193, { "semop" }},
{194, { "shmget" }},
{195, { "shmctl" }},
{196, { "shmat" }},
{197, { "shmdt" }},
{198, { "socket" }},
{199, { "socketpair" }},
{200, { "bind" }},
{201, { "listen" }},
{202, { "accept" }},
{203, { "connect" }},
{204, { "getsockname" }},
{205, { "getpeername" }},
{206, { "sendo" }},
{207, { "recvfrom" }},
{208, { "setsockopt" }},
{209, { "getsockopt" }},
{210, { "shutdown" }},
{211, { "sendmsg" }},
{212, { "recvmsg" }},
{213, { "readahead" }},
{214, { "brk", brkFunc }},
{215, { "munmap", munmapFunc }},
{216, { "mremap", mremapFunc<RiscvLinux64> }},
{217, { "add_key" }},
{218, { "request_key" }},
{219, { "keyctl" }},
{220, { "clone", cloneFunc<RiscvLinux64> }},
{221, { "execve", execveFunc<RiscvLinux64> }},
{222, { "mmap", mmapFunc<RiscvLinux64> }},
{223, { "fadvise64" }},
{224, { "swapon" }},
{225, { "swapoff" }},
{226, { "mprotect", ignoreFunc }},
{227, { "msync", ignoreFunc }},
{228, { "mlock", ignoreFunc }},
{229, { "munlock", ignoreFunc }},
{230, { "mlockall", ignoreFunc }},
{231, { "munlockall", ignoreFunc }},
{232, { "mincore", ignoreFunc }},
{233, { "madvise", ignoreFunc }},
{234, { "remap_file_pages" }},
{235, { "mbind", ignoreFunc }},
{236, { "get_mempolicy" }},
{237, { "set_mempolicy" }},
{238, { "migrate_pages" }},
{239, { "move_pages" }},
{240, { "tgsigqueueinfo" }},
{241, { "perf_event_open" }},
{242, { "accept4" }},
{243, { "recvmmsg" }},
{260, { "wait4" }},
{261, { "prlimit64", prlimitFunc<RiscvLinux64> }},
{262, { "fanotify_init" }},
{263, { "fanotify_mark" }},
{264, { "name_to_handle_at" }},
{265, { "open_by_handle_at" }},
{266, { "clock_adjtime" }},
{267, { "syncfs" }},
{268, { "setns" }},
{269, { "sendmmsg" }},
{270, { "process_vm_ready" }},
{271, { "process_vm_writev" }},
{272, { "kcmp" }},
{273, { "finit_module" }},
{274, { "sched_setattr" }},
{275, { "sched_getattr" }},
{276, { "renameat2" }},
{277, { "seccomp" }},
{278, { "getrandom" }},
{279, { "memfd_create" }},
{280, { "bpf" }},
{281, { "execveat" }},
{282, { "userfaultid" }},
{283, { "membarrier" }},
{284, { "mlock2" }},
{285, { "copy_file_range" }},
{286, { "preadv2" }},
{287, { "pwritev2" }},
{1024, { "open", openFunc<RiscvLinux64> }},
{1025, { "link" }},
{1026, { "unlink", unlinkFunc }},
{1027, { "mknod" }},
{1028, { "chmod", chmodFunc<RiscvLinux64> }},
{1029, { "chown", chownFunc }},
{1030, { "mkdir", mkdirFunc }},
{1031, { "rmdir" }},
{1032, { "lchown" }},
{1033, { "access", accessFunc }},
{1034, { "rename", renameFunc }},
{1035, { "readlink", readlinkFunc }},
{1036, { "symlink" }},
{1037, { "utimes", utimesFunc<RiscvLinux64> }},
{1038, { "stat", stat64Func<RiscvLinux64> }},
{1039, { "lstat", lstat64Func<RiscvLinux64> }},
{1040, { "pipe", pipeFunc }},
{1041, { "dup2", dup2Func }},
{1042, { "epoll_create" }},
{1043, { "inotifiy_init" }},
{1044, { "eventfd" }},
{1045, { "signalfd" }},
{1046, { "sendfile" }},
{1047, { "ftruncate", ftruncate64Func }},
{1048, { "truncate", truncate64Func }},
{1049, { "stat", stat64Func<RiscvLinux64> }},
{1050, { "lstat", lstat64Func<RiscvLinux64> }},
{1051, { "fstat", fstat64Func<RiscvLinux64> }},
{1052, { "fcntl", fcntl64Func }},
{1053, { "fadvise64" }},
{1054, { "newfstatat" }},
{1055, { "fstatfs", fstatfsFunc<RiscvLinux64> }},
{1056, { "statfs", statfsFunc<RiscvLinux64> }},
{1057, { "lseek", lseekFunc }},
{1058, { "mmap", mmapFunc<RiscvLinux64> }},
{1059, { "alarm" }},
{1060, { "getpgrp" }},
{1061, { "pause" }},
{1062, { "time", timeFunc<RiscvLinux64> }},
{1063, { "utime" }},
{1064, { "creat" }},
{1065, { "getdents" }},
{1066, { "futimesat" }},
{1067, { "select" }},
{1068, { "poll" }},
{1069, { "epoll_wait" }},
{1070, { "ustat" }},
{1071, { "vfork" }},
{1072, { "oldwait4" }},
{1073, { "recv" }},
{1074, { "send" }},
{1075, { "bdflush" }},
{1076, { "umount" }},
{1077, { "uselib" }},
{1078, { "sysctl" }},
{1079, { "fork" }},
{2011, { "getmainvars" }}
};
std::map<int, SyscallDescABI<DefaultSyscallABI>>
RiscvLinuxProcess32::syscallDescs = {
{0, { "io_setup" }},
{1, { "io_destroy" }},
{2, { "io_submit" }},
{3, { "io_cancel" }},
{4, { "io_getevents" }},
{5, { "setxattr" }},
{6, { "lsetxattr" }},
{7, { "fsetxattr" }},
{8, { "getxattr" }},
{9, { "lgetxattr" }},
{10, { "fgetxattr" }},
{11, { "listxattr" }},
{12, { "llistxattr" }},
{13, { "flistxattr" }},
{14, { "removexattr" }},
{15, { "lremovexattr" }},
{16, { "fremovexattr" }},
{17, { "getcwd", getcwdFunc }},
{18, { "lookup_dcookie" }},
{19, { "eventfd2" }},
{20, { "epoll_create1" }},
{21, { "epoll_ctl" }},
{22, { "epoll_pwait" }},
{23, { "dup", dupFunc }},
{24, { "dup3" }},
{25, { "fcntl", fcntlFunc }},
{26, { "inotify_init1" }},
{27, { "inotify_add_watch" }},
{28, { "inotify_rm_watch" }},
{29, { "ioctl", ioctlFunc<RiscvLinux32> }},
{30, { "ioprio_get" }},
{31, { "ioprio_set" }},
{32, { "flock" }},
{33, { "mknodat" }},
{34, { "mkdirat" }},
{35, { "unlinkat", unlinkatFunc<RiscvLinux32> }},
{36, { "symlinkat" }},
{37, { "linkat" }},
{38, { "renameat", renameatFunc<RiscvLinux32> }},
{39, { "umount2" }},
{40, { "mount" }},
{41, { "pivot_root" }},
{42, { "nfsservctl" }},
{43, { "statfs", statfsFunc<RiscvLinux32> }},
{44, { "fstatfs", fstatfsFunc<RiscvLinux32> }},
{45, { "truncate", truncateFunc }},
{46, { "ftruncate", ftruncateFunc }},
{47, { "fallocate", fallocateFunc }},
{48, { "faccessat", faccessatFunc<RiscvLinux32> }},
{49, { "chdir" }},
{50, { "fchdir" }},
{51, { "chroot" }},
{52, { "fchmod", fchmodFunc<RiscvLinux32> }},
{53, { "fchmodat" }},
{54, { "fchownat" }},
{55, { "fchown", fchownFunc }},
{56, { "openat", openatFunc<RiscvLinux32> }},
{57, { "close", closeFunc }},
{58, { "vhangup" }},
{59, { "pipe2" }},
{60, { "quotactl" }},
{61, { "getdents64" }},
{62, { "lseek", lseekFunc }},
{63, { "read", readFunc<RiscvLinux32> }},
{64, { "write", writeFunc<RiscvLinux32> }},
{66, { "writev", writevFunc<RiscvLinux32> }},
{67, { "pread64" }},
{68, { "pwrite64", pwrite64Func<RiscvLinux32> }},
{69, { "preadv" }},
{70, { "pwritev" }},
{71, { "sendfile" }},
{72, { "pselect6" }},
{73, { "ppoll" }},
{74, { "signalfd64" }},
{75, { "vmsplice" }},
{76, { "splice" }},
{77, { "tee" }},
{78, { "readlinkat", readlinkatFunc<RiscvLinux32> }},
{79, { "fstatat" }},
{80, { "fstat", fstatFunc<RiscvLinux32> }},
{81, { "sync" }},
{82, { "fsync" }},
{83, { "fdatasync" }},
{84, { "sync_file_range2" }},
{85, { "timerfd_create" }},
{86, { "timerfd_settime" }},
{87, { "timerfd_gettime" }},
{88, { "utimensat" }},
{89, { "acct" }},
{90, { "capget" }},
{91, { "capset" }},
{92, { "personality" }},
{93, { "exit", exitFunc }},
{94, { "exit_group", exitGroupFunc }},
{95, { "waitid" }},
{96, { "set_tid_address", setTidAddressFunc }},
{97, { "unshare" }},
{98, { "futex", futexFunc<RiscvLinux32> }},
{99, { "set_robust_list", ignoreWarnOnceFunc }},
{100, { "get_robust_list", ignoreWarnOnceFunc }},
{101, { "nanosleep" }},
{102, { "getitimer" }},
{103, { "setitimer" }},
{104, { "kexec_load" }},
{105, { "init_module" }},
{106, { "delete_module" }},
{107, { "timer_create" }},
{108, { "timer_gettime" }},
{109, { "timer_getoverrun" }},
{110, { "timer_settime" }},
{111, { "timer_delete" }},
{112, { "clock_settime" }},
{113, { "clock_gettime", clock_gettimeFunc<RiscvLinux32> }},
{114, { "clock_getres", clock_getresFunc<RiscvLinux32> }},
{115, { "clock_nanosleep" }},
{116, { "syslog" }},
{117, { "ptrace" }},
{118, { "sched_setparam" }},
{119, { "sched_setscheduler" }},
{120, { "sched_getscheduler" }},
{121, { "sched_getparam" }},
{122, { "sched_setaffinity" }},
{123, { "sched_getaffinity" }},
{124, { "sched_yield", ignoreWarnOnceFunc }},
{125, { "sched_get_priority_max" }},
{126, { "sched_get_priority_min" }},
{127, { "scheD_rr_get_interval" }},
{128, { "restart_syscall" }},
{129, { "kill" }},
{130, { "tkill" }},
{131, { "tgkill", tgkillFunc<RiscvLinux32> }},
{132, { "sigaltstack" }},
{133, { "rt_sigsuspend", ignoreWarnOnceFunc }},
{134, { "rt_sigaction", ignoreWarnOnceFunc }},
{135, { "rt_sigprocmask", ignoreWarnOnceFunc }},
{136, { "rt_sigpending", ignoreWarnOnceFunc }},
{137, { "rt_sigtimedwait", ignoreWarnOnceFunc }},
{138, { "rt_sigqueueinfo", ignoreWarnOnceFunc }},
{139, { "rt_sigreturn", ignoreWarnOnceFunc }},
{140, { "setpriority" }},
{141, { "getpriority" }},
{142, { "reboot" }},
{143, { "setregid" }},
{144, { "setgid" }},
{145, { "setreuid" }},
{146, { "setuid", ignoreFunc }},
{147, { "setresuid" }},
{148, { "getresuid" }},
{149, { "getresgid" }},
{150, { "getresgid" }},
{151, { "setfsuid" }},
{152, { "setfsgid" }},
{153, { "times", timesFunc<RiscvLinux32> }},
{154, { "setpgid", setpgidFunc }},
{155, { "getpgid" }},
{156, { "getsid" }},
{157, { "setsid" }},
{158, { "getgroups" }},
{159, { "setgroups" }},
{160, { "uname", unameFunc32 }},
{161, { "sethostname" }},
{162, { "setdomainname" }},
{163, { "getrlimit", getrlimitFunc<RiscvLinux32> }},
{164, { "setrlimit", ignoreFunc }},
{165, { "getrusage", getrusageFunc<RiscvLinux32> }},
{166, { "umask", umaskFunc }},
{167, { "prctl" }},
{168, { "getcpu" }},
{169, { "gettimeofday", gettimeofdayFunc<RiscvLinux32> }},
{170, { "settimeofday" }},
{171, { "adjtimex" }},
{172, { "getpid", getpidFunc }},
{173, { "getppid", getppidFunc }},
{174, { "getuid", getuidFunc }},
{175, { "geteuid", geteuidFunc }},
{176, { "getgid", getgidFunc }},
{177, { "getegid", getegidFunc }},
{178, { "gettid", gettidFunc }},
{179, { "sysinfo", sysinfoFunc<RiscvLinux32> }},
{180, { "mq_open" }},
{181, { "mq_unlink" }},
{182, { "mq_timedsend" }},
{183, { "mq_timedrecieve" }},
{184, { "mq_notify" }},
{185, { "mq_getsetattr" }},
{186, { "msgget" }},
{187, { "msgctl" }},
{188, { "msgrcv" }},
{189, { "msgsnd" }},
{190, { "semget" }},
{191, { "semctl" }},
{192, { "semtimedop" }},
{193, { "semop" }},
{194, { "shmget" }},
{195, { "shmctl" }},
{196, { "shmat" }},
{197, { "shmdt" }},
{198, { "socket" }},
{199, { "socketpair" }},
{200, { "bind" }},
{201, { "listen" }},
{202, { "accept" }},
{203, { "connect" }},
{204, { "getsockname" }},
{205, { "getpeername" }},
{206, { "sendo" }},
{207, { "recvfrom" }},
{208, { "setsockopt" }},
{209, { "getsockopt" }},
{210, { "shutdown" }},
{211, { "sendmsg" }},
{212, { "recvmsg" }},
{213, { "readahead" }},
{214, { "brk", brkFunc }},
{215, { "munmap", munmapFunc }},
{216, { "mremap", mremapFunc<RiscvLinux32> }},
{217, { "add_key" }},
{218, { "request_key" }},
{219, { "keyctl" }},
{220, { "clone", cloneFunc<RiscvLinux32> }},
{221, { "execve", execveFunc<RiscvLinux32> }},
{222, { "mmap", mmapFunc<RiscvLinux32> }},
{223, { "fadvise64" }},
{224, { "swapon" }},
{225, { "swapoff" }},
{226, { "mprotect", ignoreFunc }},
{227, { "msync", ignoreFunc }},
{228, { "mlock", ignoreFunc }},
{229, { "munlock", ignoreFunc }},
{230, { "mlockall", ignoreFunc }},
{231, { "munlockall", ignoreFunc }},
{232, { "mincore", ignoreFunc }},
{233, { "madvise", ignoreFunc }},
{234, { "remap_file_pages" }},
{235, { "mbind", ignoreFunc }},
{236, { "get_mempolicy" }},
{237, { "set_mempolicy" }},
{238, { "migrate_pages" }},
{239, { "move_pages" }},
{240, { "tgsigqueueinfo" }},
{241, { "perf_event_open" }},
{242, { "accept4" }},
{243, { "recvmmsg" }},
{260, { "wait4" }},
{261, { "prlimit64", prlimitFunc<RiscvLinux32> }},
{262, { "fanotify_init" }},
{263, { "fanotify_mark" }},
{264, { "name_to_handle_at" }},
{265, { "open_by_handle_at" }},
{266, { "clock_adjtime" }},
{267, { "syncfs" }},
{268, { "setns" }},
{269, { "sendmmsg" }},
{270, { "process_vm_ready" }},
{271, { "process_vm_writev" }},
{272, { "kcmp" }},
{273, { "finit_module" }},
{274, { "sched_setattr" }},
{275, { "sched_getattr" }},
{276, { "renameat2" }},
{277, { "seccomp" }},
{278, { "getrandom" }},
{279, { "memfd_create" }},
{280, { "bpf" }},
{281, { "execveat" }},
{282, { "userfaultid" }},
{283, { "membarrier" }},
{284, { "mlock2" }},
{285, { "copy_file_range" }},
{286, { "preadv2" }},
{287, { "pwritev2" }},
{1024, { "open", openFunc<RiscvLinux32> }},
{1025, { "link" }},
{1026, { "unlink", unlinkFunc }},
{1027, { "mknod" }},
{1028, { "chmod", chmodFunc<RiscvLinux32> }},
{1029, { "chown", chownFunc }},
{1030, { "mkdir", mkdirFunc }},
{1031, { "rmdir" }},
{1032, { "lchown" }},
{1033, { "access", accessFunc }},
{1034, { "rename", renameFunc }},
{1035, { "readlink", readlinkFunc }},
{1036, { "symlink" }},
{1037, { "utimes", utimesFunc<RiscvLinux32> }},
{1038, { "stat", statFunc<RiscvLinux32> }},
{1039, { "lstat", lstatFunc<RiscvLinux32> }},
{1040, { "pipe", pipeFunc }},
{1041, { "dup2", dup2Func }},
{1042, { "epoll_create" }},
{1043, { "inotifiy_init" }},
{1044, { "eventfd" }},
{1045, { "signalfd" }},
{1046, { "sendfile" }},
{1047, { "ftruncate", ftruncateFunc }},
{1048, { "truncate", truncateFunc }},
{1049, { "stat", statFunc<RiscvLinux32> }},
{1050, { "lstat", lstatFunc<RiscvLinux32> }},
{1051, { "fstat", fstatFunc<RiscvLinux32> }},
{1052, { "fcntl", fcntlFunc }},
{1053, { "fadvise64" }},
{1054, { "newfstatat" }},
{1055, { "fstatfs", fstatfsFunc<RiscvLinux32> }},
{1056, { "statfs", statfsFunc<RiscvLinux32> }},
{1057, { "lseek", lseekFunc }},
{1058, { "mmap", mmapFunc<RiscvLinux32> }},
{1059, { "alarm" }},
{1060, { "getpgrp" }},
{1061, { "pause" }},
{1062, { "time", timeFunc<RiscvLinux32> }},
{1063, { "utime" }},
{1064, { "creat" }},
{1065, { "getdents" }},
{1066, { "futimesat" }},
{1067, { "select" }},
{1068, { "poll" }},
{1069, { "epoll_wait" }},
{1070, { "ustat" }},
{1071, { "vfork" }},
{1072, { "oldwait4" }},
{1073, { "recv" }},
{1074, { "send" }},
{1075, { "bdflush" }},
{1076, { "umount" }},
{1077, { "uselib" }},
{1078, { "sysctl" }},
{1079, { "fork" }},
{2011, { "getmainvars" }}
};
RiscvLinuxProcess64::RiscvLinuxProcess64(ProcessParams * params,
ObjectFile *objFile) : RiscvProcess64(params, objFile)
{}
SyscallDesc*
RiscvLinuxProcess64::getDesc(int callnum)
{
return syscallDescs.find(callnum) != syscallDescs.end() ?
&syscallDescs.at(callnum) : nullptr;
}
void
RiscvLinuxProcess64::syscall(ThreadContext *tc, Fault *fault)
{
doSyscall(tc->readIntReg(SyscallNumReg), tc, fault);
}
RiscvLinuxProcess32::RiscvLinuxProcess32(ProcessParams * params,
ObjectFile *objFile) : RiscvProcess32(params, objFile)
{}
SyscallDesc*
RiscvLinuxProcess32::getDesc(int callnum)
{
return syscallDescs.find(callnum) != syscallDescs.end() ?
&syscallDescs.at(callnum) : nullptr;
}
void
RiscvLinuxProcess32::syscall(ThreadContext *tc, Fault *fault)
{
doSyscall(tc->readIntReg(SyscallNumReg), tc, fault);
}