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