process.cc revision 13645:f9cd6956b57b
1/*
2 * Copyright (c) 2005 The Regents of The University of Michigan
3 * Copyright (c) 2007 MIPS Technologies, Inc.
4 * Copyright (c) 2016 The University of Virginia
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met: redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer;
11 * redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution;
14 * neither the name of the copyright holders nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * Authors: Gabe Black
31 *          Korey Sewell
32 *          Alec Roelke
33 */
34
35#include "arch/riscv/linux/process.hh"
36
37#include <map>
38
39#include "arch/riscv/isa_traits.hh"
40#include "arch/riscv/linux/linux.hh"
41#include "base/trace.hh"
42#include "cpu/thread_context.hh"
43#include "debug/SyscallVerbose.hh"
44#include "kern/linux/linux.hh"
45#include "sim/eventq.hh"
46#include "sim/process.hh"
47#include "sim/syscall_desc.hh"
48#include "sim/syscall_emul.hh"
49#include "sim/system.hh"
50
51using namespace std;
52using namespace RiscvISA;
53
54/// Target uname() handler.
55static SyscallReturn
56unameFunc64(SyscallDesc *desc, int callnum, Process *process,
57          ThreadContext *tc)
58{
59    int index = 0;
60    TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, index));
61
62    strcpy(name->sysname, "Linux");
63    strcpy(name->nodename,"sim.gem5.org");
64    strcpy(name->release, "3.0.0");
65    strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
66    strcpy(name->machine, "riscv64");
67
68    name.copyOut(tc->getMemProxy());
69    return 0;
70}
71
72/// Target uname() handler.
73static SyscallReturn
74unameFunc32(SyscallDesc *desc, int callnum, Process *process,
75            ThreadContext *tc)
76{
77    int index = 0;
78    TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, index));
79
80    strcpy(name->sysname, "Linux");
81    strcpy(name->nodename,"sim.gem5.org");
82    strcpy(name->release, "3.0.0");
83    strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
84    strcpy(name->machine, "riscv32");
85
86    name.copyOut(tc->getMemProxy());
87    return 0;
88}
89
90std::map<int, SyscallDesc> RiscvLinuxProcess64::syscallDescs = {
91    {0,    SyscallDesc("io_setup")},
92    {1,    SyscallDesc("io_destroy")},
93    {2,    SyscallDesc("io_submit")},
94    {3,    SyscallDesc("io_cancel")},
95    {4,    SyscallDesc("io_getevents")},
96    {5,    SyscallDesc("setxattr")},
97    {6,    SyscallDesc("lsetxattr")},
98    {7,    SyscallDesc("fsetxattr")},
99    {8,    SyscallDesc("getxattr")},
100    {9,    SyscallDesc("lgetxattr")},
101    {10,   SyscallDesc("fgetxattr")},
102    {11,   SyscallDesc("listxattr")},
103    {12,   SyscallDesc("llistxattr")},
104    {13,   SyscallDesc("flistxattr")},
105    {14,   SyscallDesc("removexattr")},
106    {15,   SyscallDesc("lremovexattr")},
107    {16,   SyscallDesc("fremovexattr")},
108    {17,   SyscallDesc("getcwd", getcwdFunc)},
109    {18,   SyscallDesc("lookup_dcookie")},
110    {19,   SyscallDesc("eventfd2")},
111    {20,   SyscallDesc("epoll_create1")},
112    {21,   SyscallDesc("epoll_ctl")},
113    {22,   SyscallDesc("epoll_pwait")},
114    {23,   SyscallDesc("dup", dupFunc)},
115    {24,   SyscallDesc("dup3")},
116    {25,   SyscallDesc("fcntl", fcntl64Func)},
117    {26,   SyscallDesc("inotify_init1")},
118    {27,   SyscallDesc("inotify_add_watch")},
119    {28,   SyscallDesc("inotify_rm_watch")},
120    {29,   SyscallDesc("ioctl", ioctlFunc<RiscvLinux64>)},
121    {30,   SyscallDesc("ioprio_get")},
122    {31,   SyscallDesc("ioprio_set")},
123    {32,   SyscallDesc("flock")},
124    {33,   SyscallDesc("mknodat")},
125    {34,   SyscallDesc("mkdirat")},
126    {35,   SyscallDesc("unlinkat", unlinkatFunc<RiscvLinux64>)},
127    {36,   SyscallDesc("symlinkat")},
128    {37,   SyscallDesc("linkat")},
129    {38,   SyscallDesc("renameat", renameatFunc<RiscvLinux64>)},
130    {39,   SyscallDesc("umount2")},
131    {40,   SyscallDesc("mount")},
132    {41,   SyscallDesc("pivot_root")},
133    {42,   SyscallDesc("nfsservctl")},
134    {43,   SyscallDesc("statfs", statfsFunc<RiscvLinux64>)},
135    {44,   SyscallDesc("fstatfs", fstatfsFunc<RiscvLinux64>)},
136    {45,   SyscallDesc("truncate", truncateFunc)},
137    {46,   SyscallDesc("ftruncate", ftruncate64Func)},
138    {47,   SyscallDesc("fallocate", fallocateFunc)},
139    {48,   SyscallDesc("faccessat", faccessatFunc<RiscvLinux64>)},
140    {49,   SyscallDesc("chdir")},
141    {50,   SyscallDesc("fchdir")},
142    {51,   SyscallDesc("chroot")},
143    {52,   SyscallDesc("fchmod", fchmodFunc<RiscvLinux64>)},
144    {53,   SyscallDesc("fchmodat")},
145    {54,   SyscallDesc("fchownat")},
146    {55,   SyscallDesc("fchown", fchownFunc)},
147    {56,   SyscallDesc("openat", openatFunc<RiscvLinux64>)},
148    {57,   SyscallDesc("close", closeFunc)},
149    {58,   SyscallDesc("vhangup")},
150    {59,   SyscallDesc("pipe2")},
151    {60,   SyscallDesc("quotactl")},
152    {61,   SyscallDesc("getdents64")},
153    {62,   SyscallDesc("lseek", lseekFunc)},
154    {63,   SyscallDesc("read", readFunc<RiscvLinux64>)},
155    {64,   SyscallDesc("write", writeFunc<RiscvLinux64>)},
156    {66,   SyscallDesc("writev", writevFunc<RiscvLinux64>)},
157    {67,   SyscallDesc("pread64")},
158    {68,   SyscallDesc("pwrite64", pwrite64Func<RiscvLinux64>)},
159    {69,   SyscallDesc("preadv")},
160    {70,   SyscallDesc("pwritev")},
161    {71,   SyscallDesc("sendfile")},
162    {72,   SyscallDesc("pselect6")},
163    {73,   SyscallDesc("ppoll")},
164    {74,   SyscallDesc("signalfd64")},
165    {75,   SyscallDesc("vmsplice")},
166    {76,   SyscallDesc("splice")},
167    {77,   SyscallDesc("tee")},
168    {78,   SyscallDesc("readlinkat", readlinkatFunc<RiscvLinux64>)},
169    {79,   SyscallDesc("fstatat", fstatat64Func<RiscvLinux64>)},
170    {80,   SyscallDesc("fstat", fstat64Func<RiscvLinux64>)},
171    {81,   SyscallDesc("sync")},
172    {82,   SyscallDesc("fsync")},
173    {83,   SyscallDesc("fdatasync")},
174    {84,   SyscallDesc("sync_file_range2")},
175    {85,   SyscallDesc("timerfd_create")},
176    {86,   SyscallDesc("timerfd_settime")},
177    {87,   SyscallDesc("timerfd_gettime")},
178    {88,   SyscallDesc("utimensat")},
179    {89,   SyscallDesc("acct")},
180    {90,   SyscallDesc("capget")},
181    {91,   SyscallDesc("capset")},
182    {92,   SyscallDesc("personality")},
183    {93,   SyscallDesc("exit", exitFunc)},
184    {94,   SyscallDesc("exit_group", exitGroupFunc)},
185    {95,   SyscallDesc("waitid")},
186    {96,   SyscallDesc("set_tid_address", setTidAddressFunc)},
187    {97,   SyscallDesc("unshare")},
188    {98,   SyscallDesc("futex", futexFunc<RiscvLinux64>)},
189    {99,   SyscallDesc("set_robust_list", ignoreFunc, SyscallDesc::WarnOnce)},
190    {100,  SyscallDesc("get_robust_list", ignoreFunc, SyscallDesc::WarnOnce)},
191    {101,  SyscallDesc("nanosleep", ignoreFunc, SyscallDesc::WarnOnce)},
192    {102,  SyscallDesc("getitimer")},
193    {103,  SyscallDesc("setitimer")},
194    {104,  SyscallDesc("kexec_load")},
195    {105,  SyscallDesc("init_module")},
196    {106,  SyscallDesc("delete_module")},
197    {107,  SyscallDesc("timer_create")},
198    {108,  SyscallDesc("timer_gettime")},
199    {109,  SyscallDesc("timer_getoverrun")},
200    {110,  SyscallDesc("timer_settime")},
201    {111,  SyscallDesc("timer_delete")},
202    {112,  SyscallDesc("clock_settime")},
203    {113,  SyscallDesc("clock_gettime", clock_gettimeFunc<RiscvLinux64>)},
204    {114,  SyscallDesc("clock_getres", clock_getresFunc<RiscvLinux64>)},
205    {115,  SyscallDesc("clock_nanosleep")},
206    {116,  SyscallDesc("syslog")},
207    {117,  SyscallDesc("ptrace")},
208    {118,  SyscallDesc("sched_setparam")},
209    {119,  SyscallDesc("sched_setscheduler")},
210    {120,  SyscallDesc("sched_getscheduler")},
211    {121,  SyscallDesc("sched_getparam")},
212    {122,  SyscallDesc("sched_setaffinity")},
213    {123,  SyscallDesc("sched_getaffinity")},
214    {124,  SyscallDesc("sched_yield", ignoreFunc, SyscallDesc::WarnOnce)},
215    {125,  SyscallDesc("sched_get_priority_max")},
216    {126,  SyscallDesc("sched_get_priority_min")},
217    {127,  SyscallDesc("scheD_rr_get_interval")},
218    {128,  SyscallDesc("restart_syscall")},
219    {129,  SyscallDesc("kill")},
220    {130,  SyscallDesc("tkill")},
221    {131,  SyscallDesc("tgkill", tgkillFunc<RiscvLinux64>)},
222    {132,  SyscallDesc("sigaltstack")},
223    {133,  SyscallDesc("rt_sigsuspend", ignoreFunc, SyscallDesc::WarnOnce)},
224    {134,  SyscallDesc("rt_sigaction", ignoreFunc, SyscallDesc::WarnOnce)},
225    {135,  SyscallDesc("rt_sigprocmask", ignoreFunc, SyscallDesc::WarnOnce)},
226    {136,  SyscallDesc("rt_sigpending", ignoreFunc, SyscallDesc::WarnOnce)},
227    {137,  SyscallDesc("rt_sigtimedwait", ignoreFunc,SyscallDesc::WarnOnce)},
228    {138,  SyscallDesc("rt_sigqueueinfo", ignoreFunc,SyscallDesc::WarnOnce)},
229    {139,  SyscallDesc("rt_sigreturn", ignoreFunc, SyscallDesc::WarnOnce)},
230    {140,  SyscallDesc("setpriority")},
231    {141,  SyscallDesc("getpriority")},
232    {142,  SyscallDesc("reboot")},
233    {143,  SyscallDesc("setregid")},
234    {144,  SyscallDesc("setgid")},
235    {145,  SyscallDesc("setreuid")},
236    {146,  SyscallDesc("setuid", setuidFunc)},
237    {147,  SyscallDesc("setresuid")},
238    {148,  SyscallDesc("getresuid")},
239    {149,  SyscallDesc("getresgid")},
240    {150,  SyscallDesc("getresgid")},
241    {151,  SyscallDesc("setfsuid")},
242    {152,  SyscallDesc("setfsgid")},
243    {153,  SyscallDesc("times", timesFunc<RiscvLinux64>)},
244    {154,  SyscallDesc("setpgid", setpgidFunc)},
245    {155,  SyscallDesc("getpgid")},
246    {156,  SyscallDesc("getsid")},
247    {157,  SyscallDesc("setsid")},
248    {158,  SyscallDesc("getgroups")},
249    {159,  SyscallDesc("setgroups")},
250    {160,  SyscallDesc("uname", unameFunc64)},
251    {161,  SyscallDesc("sethostname")},
252    {162,  SyscallDesc("setdomainname")},
253    {163,  SyscallDesc("getrlimit", getrlimitFunc<RiscvLinux64>)},
254    {164,  SyscallDesc("setrlimit", ignoreFunc)},
255    {165,  SyscallDesc("getrusage", getrusageFunc<RiscvLinux64>)},
256    {166,  SyscallDesc("umask", umaskFunc)},
257    {167,  SyscallDesc("prctl")},
258    {168,  SyscallDesc("getcpu")},
259    {169,  SyscallDesc("gettimeofday", gettimeofdayFunc<RiscvLinux64>)},
260    {170,  SyscallDesc("settimeofday")},
261    {171,  SyscallDesc("adjtimex")},
262    {172,  SyscallDesc("getpid", getpidFunc)},
263    {173,  SyscallDesc("getppid", getppidFunc)},
264    {174,  SyscallDesc("getuid", getuidFunc)},
265    {175,  SyscallDesc("geteuid", geteuidFunc)},
266    {176,  SyscallDesc("getgid", getgidFunc)},
267    {177,  SyscallDesc("getegid", getegidFunc)},
268    {178,  SyscallDesc("gettid", gettidFunc)},
269    {179,  SyscallDesc("sysinfo", sysinfoFunc<RiscvLinux64>)},
270    {180,  SyscallDesc("mq_open")},
271    {181,  SyscallDesc("mq_unlink")},
272    {182,  SyscallDesc("mq_timedsend")},
273    {183,  SyscallDesc("mq_timedrecieve")},
274    {184,  SyscallDesc("mq_notify")},
275    {185,  SyscallDesc("mq_getsetattr")},
276    {186,  SyscallDesc("msgget")},
277    {187,  SyscallDesc("msgctl")},
278    {188,  SyscallDesc("msgrcv")},
279    {189,  SyscallDesc("msgsnd")},
280    {190,  SyscallDesc("semget")},
281    {191,  SyscallDesc("semctl")},
282    {192,  SyscallDesc("semtimedop")},
283    {193,  SyscallDesc("semop")},
284    {194,  SyscallDesc("shmget")},
285    {195,  SyscallDesc("shmctl")},
286    {196,  SyscallDesc("shmat")},
287    {197,  SyscallDesc("shmdt")},
288    {198,  SyscallDesc("socket")},
289    {199,  SyscallDesc("socketpair")},
290    {200,  SyscallDesc("bind")},
291    {201,  SyscallDesc("listen")},
292    {202,  SyscallDesc("accept")},
293    {203,  SyscallDesc("connect")},
294    {204,  SyscallDesc("getsockname")},
295    {205,  SyscallDesc("getpeername")},
296    {206,  SyscallDesc("sendo")},
297    {207,  SyscallDesc("recvfrom")},
298    {208,  SyscallDesc("setsockopt")},
299    {209,  SyscallDesc("getsockopt")},
300    {210,  SyscallDesc("shutdown")},
301    {211,  SyscallDesc("sendmsg")},
302    {212,  SyscallDesc("recvmsg")},
303    {213,  SyscallDesc("readahead")},
304    {214,  SyscallDesc("brk", brkFunc)},
305    {215,  SyscallDesc("munmap", munmapFunc)},
306    {216,  SyscallDesc("mremap", mremapFunc<RiscvLinux64>)},
307    {217,  SyscallDesc("add_key")},
308    {218,  SyscallDesc("request_key")},
309    {219,  SyscallDesc("keyctl")},
310    {220,  SyscallDesc("clone", cloneFunc<RiscvLinux64>)},
311    {221,  SyscallDesc("execve", execveFunc<RiscvLinux64>)},
312    {222,  SyscallDesc("mmap", mmapFunc<RiscvLinux64>)},
313    {223,  SyscallDesc("fadvise64")},
314    {224,  SyscallDesc("swapon")},
315    {225,  SyscallDesc("swapoff")},
316    {226,  SyscallDesc("mprotect", ignoreFunc)},
317    {227,  SyscallDesc("msync", ignoreFunc)},
318    {228,  SyscallDesc("mlock", ignoreFunc)},
319    {229,  SyscallDesc("munlock", ignoreFunc)},
320    {230,  SyscallDesc("mlockall", ignoreFunc)},
321    {231,  SyscallDesc("munlockall", ignoreFunc)},
322    {232,  SyscallDesc("mincore", ignoreFunc)},
323    {233,  SyscallDesc("madvise", ignoreFunc)},
324    {234,  SyscallDesc("remap_file_pages")},
325    {235,  SyscallDesc("mbind", ignoreFunc)},
326    {236,  SyscallDesc("get_mempolicy")},
327    {237,  SyscallDesc("set_mempolicy")},
328    {238,  SyscallDesc("migrate_pages")},
329    {239,  SyscallDesc("move_pages")},
330    {240,  SyscallDesc("tgsigqueueinfo")},
331    {241,  SyscallDesc("perf_event_open")},
332    {242,  SyscallDesc("accept4")},
333    {243,  SyscallDesc("recvmmsg")},
334    {260,  SyscallDesc("wait4")},
335    {261,  SyscallDesc("prlimit64", prlimitFunc<RiscvLinux64>)},
336    {262,  SyscallDesc("fanotify_init")},
337    {263,  SyscallDesc("fanotify_mark")},
338    {264,  SyscallDesc("name_to_handle_at")},
339    {265,  SyscallDesc("open_by_handle_at")},
340    {266,  SyscallDesc("clock_adjtime")},
341    {267,  SyscallDesc("syncfs")},
342    {268,  SyscallDesc("setns")},
343    {269,  SyscallDesc("sendmmsg")},
344    {270,  SyscallDesc("process_vm_ready")},
345    {271,  SyscallDesc("process_vm_writev")},
346    {272,  SyscallDesc("kcmp")},
347    {273,  SyscallDesc("finit_module")},
348    {274,  SyscallDesc("sched_setattr")},
349    {275,  SyscallDesc("sched_getattr")},
350    {276,  SyscallDesc("renameat2")},
351    {277,  SyscallDesc("seccomp")},
352    {278,  SyscallDesc("getrandom")},
353    {279,  SyscallDesc("memfd_create")},
354    {280,  SyscallDesc("bpf")},
355    {281,  SyscallDesc("execveat")},
356    {282,  SyscallDesc("userfaultid")},
357    {283,  SyscallDesc("membarrier")},
358    {284,  SyscallDesc("mlock2")},
359    {285,  SyscallDesc("copy_file_range")},
360    {286,  SyscallDesc("preadv2")},
361    {287,  SyscallDesc("pwritev2")},
362    {1024, SyscallDesc("open", openFunc<RiscvLinux64>)},
363    {1025, SyscallDesc("link")},
364    {1026, SyscallDesc("unlink", unlinkFunc)},
365    {1027, SyscallDesc("mknod")},
366    {1028, SyscallDesc("chmod", chmodFunc<RiscvLinux64>)},
367    {1029, SyscallDesc("chown", chownFunc)},
368    {1030, SyscallDesc("mkdir", mkdirFunc)},
369    {1031, SyscallDesc("rmdir")},
370    {1032, SyscallDesc("lchown")},
371    {1033, SyscallDesc("access", accessFunc)},
372    {1034, SyscallDesc("rename", renameFunc)},
373    {1035, SyscallDesc("readlink", readlinkFunc)},
374    {1036, SyscallDesc("symlink")},
375    {1037, SyscallDesc("utimes", utimesFunc<RiscvLinux64>)},
376    {1038, SyscallDesc("stat", stat64Func<RiscvLinux64>)},
377    {1039, SyscallDesc("lstat", lstat64Func<RiscvLinux64>)},
378    {1040, SyscallDesc("pipe", pipeFunc)},
379    {1041, SyscallDesc("dup2", dup2Func)},
380    {1042, SyscallDesc("epoll_create")},
381    {1043, SyscallDesc("inotifiy_init")},
382    {1044, SyscallDesc("eventfd")},
383    {1045, SyscallDesc("signalfd")},
384    {1046, SyscallDesc("sendfile")},
385    {1047, SyscallDesc("ftruncate", ftruncate64Func)},
386    {1048, SyscallDesc("truncate", truncate64Func)},
387    {1049, SyscallDesc("stat", stat64Func<RiscvLinux64>)},
388    {1050, SyscallDesc("lstat", lstat64Func<RiscvLinux64>)},
389    {1051, SyscallDesc("fstat", fstat64Func<RiscvLinux64>)},
390    {1052, SyscallDesc("fcntl", fcntl64Func)},
391    {1053, SyscallDesc("fadvise64")},
392    {1054, SyscallDesc("newfstatat")},
393    {1055, SyscallDesc("fstatfs", fstatfsFunc<RiscvLinux64>)},
394    {1056, SyscallDesc("statfs", statfsFunc<RiscvLinux64>)},
395    {1057, SyscallDesc("lseek", lseekFunc)},
396    {1058, SyscallDesc("mmap", mmapFunc<RiscvLinux64>)},
397    {1059, SyscallDesc("alarm")},
398    {1060, SyscallDesc("getpgrp")},
399    {1061, SyscallDesc("pause")},
400    {1062, SyscallDesc("time", timeFunc<RiscvLinux64>)},
401    {1063, SyscallDesc("utime")},
402    {1064, SyscallDesc("creat")},
403    {1065, SyscallDesc("getdents")},
404    {1066, SyscallDesc("futimesat")},
405    {1067, SyscallDesc("select")},
406    {1068, SyscallDesc("poll")},
407    {1069, SyscallDesc("epoll_wait")},
408    {1070, SyscallDesc("ustat")},
409    {1071, SyscallDesc("vfork")},
410    {1072, SyscallDesc("oldwait4")},
411    {1073, SyscallDesc("recv")},
412    {1074, SyscallDesc("send")},
413    {1075, SyscallDesc("bdflush")},
414    {1076, SyscallDesc("umount")},
415    {1077, SyscallDesc("uselib")},
416    {1078, SyscallDesc("sysctl")},
417    {1079, SyscallDesc("fork")},
418    {2011, SyscallDesc("getmainvars")}
419};
420
421std::map<int, SyscallDesc> RiscvLinuxProcess32::syscallDescs = {
422    {0,    SyscallDesc("io_setup")},
423    {1,    SyscallDesc("io_destroy")},
424    {2,    SyscallDesc("io_submit")},
425    {3,    SyscallDesc("io_cancel")},
426    {4,    SyscallDesc("io_getevents")},
427    {5,    SyscallDesc("setxattr")},
428    {6,    SyscallDesc("lsetxattr")},
429    {7,    SyscallDesc("fsetxattr")},
430    {8,    SyscallDesc("getxattr")},
431    {9,    SyscallDesc("lgetxattr")},
432    {10,   SyscallDesc("fgetxattr")},
433    {11,   SyscallDesc("listxattr")},
434    {12,   SyscallDesc("llistxattr")},
435    {13,   SyscallDesc("flistxattr")},
436    {14,   SyscallDesc("removexattr")},
437    {15,   SyscallDesc("lremovexattr")},
438    {16,   SyscallDesc("fremovexattr")},
439    {17,   SyscallDesc("getcwd", getcwdFunc)},
440    {18,   SyscallDesc("lookup_dcookie")},
441    {19,   SyscallDesc("eventfd2")},
442    {20,   SyscallDesc("epoll_create1")},
443    {21,   SyscallDesc("epoll_ctl")},
444    {22,   SyscallDesc("epoll_pwait")},
445    {23,   SyscallDesc("dup", dupFunc)},
446    {24,   SyscallDesc("dup3")},
447    {25,   SyscallDesc("fcntl", fcntlFunc)},
448    {26,   SyscallDesc("inotify_init1")},
449    {27,   SyscallDesc("inotify_add_watch")},
450    {28,   SyscallDesc("inotify_rm_watch")},
451    {29,   SyscallDesc("ioctl", ioctlFunc<RiscvLinux32>)},
452    {30,   SyscallDesc("ioprio_get")},
453    {31,   SyscallDesc("ioprio_set")},
454    {32,   SyscallDesc("flock")},
455    {33,   SyscallDesc("mknodat")},
456    {34,   SyscallDesc("mkdirat")},
457    {35,   SyscallDesc("unlinkat", unlinkatFunc<RiscvLinux32>)},
458    {36,   SyscallDesc("symlinkat")},
459    {37,   SyscallDesc("linkat")},
460    {38,   SyscallDesc("renameat", renameatFunc<RiscvLinux32>)},
461    {39,   SyscallDesc("umount2")},
462    {40,   SyscallDesc("mount")},
463    {41,   SyscallDesc("pivot_root")},
464    {42,   SyscallDesc("nfsservctl")},
465    {43,   SyscallDesc("statfs", statfsFunc<RiscvLinux32>)},
466    {44,   SyscallDesc("fstatfs", fstatfsFunc<RiscvLinux32>)},
467    {45,   SyscallDesc("truncate", truncateFunc)},
468    {46,   SyscallDesc("ftruncate", ftruncateFunc)},
469    {47,   SyscallDesc("fallocate", fallocateFunc)},
470    {48,   SyscallDesc("faccessat", faccessatFunc<RiscvLinux32>)},
471    {49,   SyscallDesc("chdir")},
472    {50,   SyscallDesc("fchdir")},
473    {51,   SyscallDesc("chroot")},
474    {52,   SyscallDesc("fchmod", fchmodFunc<RiscvLinux32>)},
475    {53,   SyscallDesc("fchmodat")},
476    {54,   SyscallDesc("fchownat")},
477    {55,   SyscallDesc("fchown", fchownFunc)},
478    {56,   SyscallDesc("openat", openatFunc<RiscvLinux32>)},
479    {57,   SyscallDesc("close", closeFunc)},
480    {58,   SyscallDesc("vhangup")},
481    {59,   SyscallDesc("pipe2")},
482    {60,   SyscallDesc("quotactl")},
483    {61,   SyscallDesc("getdents64")},
484    {62,   SyscallDesc("lseek", lseekFunc)},
485    {63,   SyscallDesc("read", readFunc<RiscvLinux32>)},
486    {64,   SyscallDesc("write", writeFunc<RiscvLinux32>)},
487    {66,   SyscallDesc("writev", writevFunc<RiscvLinux32>)},
488    {67,   SyscallDesc("pread64")},
489    {68,   SyscallDesc("pwrite64", pwrite64Func<RiscvLinux32>)},
490    {69,   SyscallDesc("preadv")},
491    {70,   SyscallDesc("pwritev")},
492    {71,   SyscallDesc("sendfile")},
493    {72,   SyscallDesc("pselect6")},
494    {73,   SyscallDesc("ppoll")},
495    {74,   SyscallDesc("signalfd64")},
496    {75,   SyscallDesc("vmsplice")},
497    {76,   SyscallDesc("splice")},
498    {77,   SyscallDesc("tee")},
499    {78,   SyscallDesc("readlinkat", readlinkatFunc<RiscvLinux32>)},
500    {79,   SyscallDesc("fstatat")},
501    {80,   SyscallDesc("fstat", fstatFunc<RiscvLinux32>)},
502    {81,   SyscallDesc("sync")},
503    {82,   SyscallDesc("fsync")},
504    {83,   SyscallDesc("fdatasync")},
505    {84,   SyscallDesc("sync_file_range2")},
506    {85,   SyscallDesc("timerfd_create")},
507    {86,   SyscallDesc("timerfd_settime")},
508    {87,   SyscallDesc("timerfd_gettime")},
509    {88,   SyscallDesc("utimensat")},
510    {89,   SyscallDesc("acct")},
511    {90,   SyscallDesc("capget")},
512    {91,   SyscallDesc("capset")},
513    {92,   SyscallDesc("personality")},
514    {93,   SyscallDesc("exit", exitFunc)},
515    {94,   SyscallDesc("exit_group", exitGroupFunc)},
516    {95,   SyscallDesc("waitid")},
517    {96,   SyscallDesc("set_tid_address", setTidAddressFunc)},
518    {97,   SyscallDesc("unshare")},
519    {98,   SyscallDesc("futex", futexFunc<RiscvLinux32>)},
520    {99,   SyscallDesc("set_robust_list", ignoreFunc, SyscallDesc::WarnOnce)},
521    {100,  SyscallDesc("get_robust_list", ignoreFunc, SyscallDesc::WarnOnce)},
522    {101,  SyscallDesc("nanosleep")},
523    {102,  SyscallDesc("getitimer")},
524    {103,  SyscallDesc("setitimer")},
525    {104,  SyscallDesc("kexec_load")},
526    {105,  SyscallDesc("init_module")},
527    {106,  SyscallDesc("delete_module")},
528    {107,  SyscallDesc("timer_create")},
529    {108,  SyscallDesc("timer_gettime")},
530    {109,  SyscallDesc("timer_getoverrun")},
531    {110,  SyscallDesc("timer_settime")},
532    {111,  SyscallDesc("timer_delete")},
533    {112,  SyscallDesc("clock_settime")},
534    {113,  SyscallDesc("clock_gettime", clock_gettimeFunc<RiscvLinux32>)},
535    {114,  SyscallDesc("clock_getres", clock_getresFunc<RiscvLinux32>)},
536    {115,  SyscallDesc("clock_nanosleep")},
537    {116,  SyscallDesc("syslog")},
538    {117,  SyscallDesc("ptrace")},
539    {118,  SyscallDesc("sched_setparam")},
540    {119,  SyscallDesc("sched_setscheduler")},
541    {120,  SyscallDesc("sched_getscheduler")},
542    {121,  SyscallDesc("sched_getparam")},
543    {122,  SyscallDesc("sched_setaffinity")},
544    {123,  SyscallDesc("sched_getaffinity")},
545    {124,  SyscallDesc("sched_yield", ignoreFunc, SyscallDesc::WarnOnce)},
546    {125,  SyscallDesc("sched_get_priority_max")},
547    {126,  SyscallDesc("sched_get_priority_min")},
548    {127,  SyscallDesc("scheD_rr_get_interval")},
549    {128,  SyscallDesc("restart_syscall")},
550    {129,  SyscallDesc("kill")},
551    {130,  SyscallDesc("tkill")},
552    {131,  SyscallDesc("tgkill", tgkillFunc<RiscvLinux32>)},
553    {132,  SyscallDesc("sigaltstack")},
554    {133,  SyscallDesc("rt_sigsuspend", ignoreFunc, SyscallDesc::WarnOnce)},
555    {134,  SyscallDesc("rt_sigaction", ignoreFunc, SyscallDesc::WarnOnce)},
556    {135,  SyscallDesc("rt_sigprocmask", ignoreFunc, SyscallDesc::WarnOnce)},
557    {136,  SyscallDesc("rt_sigpending", ignoreFunc, SyscallDesc::WarnOnce)},
558    {137,  SyscallDesc("rt_sigtimedwait", ignoreFunc,SyscallDesc::WarnOnce)},
559    {138,  SyscallDesc("rt_sigqueueinfo", ignoreFunc,SyscallDesc::WarnOnce)},
560    {139,  SyscallDesc("rt_sigreturn", ignoreFunc, SyscallDesc::WarnOnce)},
561    {140,  SyscallDesc("setpriority")},
562    {141,  SyscallDesc("getpriority")},
563    {142,  SyscallDesc("reboot")},
564    {143,  SyscallDesc("setregid")},
565    {144,  SyscallDesc("setgid")},
566    {145,  SyscallDesc("setreuid")},
567    {146,  SyscallDesc("setuid", setuidFunc)},
568    {147,  SyscallDesc("setresuid")},
569    {148,  SyscallDesc("getresuid")},
570    {149,  SyscallDesc("getresgid")},
571    {150,  SyscallDesc("getresgid")},
572    {151,  SyscallDesc("setfsuid")},
573    {152,  SyscallDesc("setfsgid")},
574    {153,  SyscallDesc("times", timesFunc<RiscvLinux32>)},
575    {154,  SyscallDesc("setpgid", setpgidFunc)},
576    {155,  SyscallDesc("getpgid")},
577    {156,  SyscallDesc("getsid")},
578    {157,  SyscallDesc("setsid")},
579    {158,  SyscallDesc("getgroups")},
580    {159,  SyscallDesc("setgroups")},
581    {160,  SyscallDesc("uname", unameFunc32)},
582    {161,  SyscallDesc("sethostname")},
583    {162,  SyscallDesc("setdomainname")},
584    {163,  SyscallDesc("getrlimit", getrlimitFunc<RiscvLinux32>)},
585    {164,  SyscallDesc("setrlimit", ignoreFunc)},
586    {165,  SyscallDesc("getrusage", getrusageFunc<RiscvLinux32>)},
587    {166,  SyscallDesc("umask", umaskFunc)},
588    {167,  SyscallDesc("prctl")},
589    {168,  SyscallDesc("getcpu")},
590    {169,  SyscallDesc("gettimeofday", gettimeofdayFunc<RiscvLinux32>)},
591    {170,  SyscallDesc("settimeofday")},
592    {171,  SyscallDesc("adjtimex")},
593    {172,  SyscallDesc("getpid", getpidFunc)},
594    {173,  SyscallDesc("getppid", getppidFunc)},
595    {174,  SyscallDesc("getuid", getuidFunc)},
596    {175,  SyscallDesc("geteuid", geteuidFunc)},
597    {176,  SyscallDesc("getgid", getgidFunc)},
598    {177,  SyscallDesc("getegid", getegidFunc)},
599    {178,  SyscallDesc("gettid", gettidFunc)},
600    {179,  SyscallDesc("sysinfo", sysinfoFunc<RiscvLinux32>)},
601    {180,  SyscallDesc("mq_open")},
602    {181,  SyscallDesc("mq_unlink")},
603    {182,  SyscallDesc("mq_timedsend")},
604    {183,  SyscallDesc("mq_timedrecieve")},
605    {184,  SyscallDesc("mq_notify")},
606    {185,  SyscallDesc("mq_getsetattr")},
607    {186,  SyscallDesc("msgget")},
608    {187,  SyscallDesc("msgctl")},
609    {188,  SyscallDesc("msgrcv")},
610    {189,  SyscallDesc("msgsnd")},
611    {190,  SyscallDesc("semget")},
612    {191,  SyscallDesc("semctl")},
613    {192,  SyscallDesc("semtimedop")},
614    {193,  SyscallDesc("semop")},
615    {194,  SyscallDesc("shmget")},
616    {195,  SyscallDesc("shmctl")},
617    {196,  SyscallDesc("shmat")},
618    {197,  SyscallDesc("shmdt")},
619    {198,  SyscallDesc("socket")},
620    {199,  SyscallDesc("socketpair")},
621    {200,  SyscallDesc("bind")},
622    {201,  SyscallDesc("listen")},
623    {202,  SyscallDesc("accept")},
624    {203,  SyscallDesc("connect")},
625    {204,  SyscallDesc("getsockname")},
626    {205,  SyscallDesc("getpeername")},
627    {206,  SyscallDesc("sendo")},
628    {207,  SyscallDesc("recvfrom")},
629    {208,  SyscallDesc("setsockopt")},
630    {209,  SyscallDesc("getsockopt")},
631    {210,  SyscallDesc("shutdown")},
632    {211,  SyscallDesc("sendmsg")},
633    {212,  SyscallDesc("recvmsg")},
634    {213,  SyscallDesc("readahead")},
635    {214,  SyscallDesc("brk", brkFunc)},
636    {215,  SyscallDesc("munmap", munmapFunc)},
637    {216,  SyscallDesc("mremap", mremapFunc<RiscvLinux32>)},
638    {217,  SyscallDesc("add_key")},
639    {218,  SyscallDesc("request_key")},
640    {219,  SyscallDesc("keyctl")},
641    {220,  SyscallDesc("clone", cloneFunc<RiscvLinux32>)},
642    {221,  SyscallDesc("execve", execveFunc<RiscvLinux32>)},
643    {222,  SyscallDesc("mmap", mmapFunc<RiscvLinux32>)},
644    {223,  SyscallDesc("fadvise64")},
645    {224,  SyscallDesc("swapon")},
646    {225,  SyscallDesc("swapoff")},
647    {226,  SyscallDesc("mprotect", ignoreFunc)},
648    {227,  SyscallDesc("msync", ignoreFunc)},
649    {228,  SyscallDesc("mlock", ignoreFunc)},
650    {229,  SyscallDesc("munlock", ignoreFunc)},
651    {230,  SyscallDesc("mlockall", ignoreFunc)},
652    {231,  SyscallDesc("munlockall", ignoreFunc)},
653    {232,  SyscallDesc("mincore", ignoreFunc)},
654    {233,  SyscallDesc("madvise", ignoreFunc)},
655    {234,  SyscallDesc("remap_file_pages")},
656    {235,  SyscallDesc("mbind", ignoreFunc)},
657    {236,  SyscallDesc("get_mempolicy")},
658    {237,  SyscallDesc("set_mempolicy")},
659    {238,  SyscallDesc("migrate_pages")},
660    {239,  SyscallDesc("move_pages")},
661    {240,  SyscallDesc("tgsigqueueinfo")},
662    {241,  SyscallDesc("perf_event_open")},
663    {242,  SyscallDesc("accept4")},
664    {243,  SyscallDesc("recvmmsg")},
665    {260,  SyscallDesc("wait4")},
666    {261,  SyscallDesc("prlimit64", prlimitFunc<RiscvLinux32>)},
667    {262,  SyscallDesc("fanotify_init")},
668    {263,  SyscallDesc("fanotify_mark")},
669    {264,  SyscallDesc("name_to_handle_at")},
670    {265,  SyscallDesc("open_by_handle_at")},
671    {266,  SyscallDesc("clock_adjtime")},
672    {267,  SyscallDesc("syncfs")},
673    {268,  SyscallDesc("setns")},
674    {269,  SyscallDesc("sendmmsg")},
675    {270,  SyscallDesc("process_vm_ready")},
676    {271,  SyscallDesc("process_vm_writev")},
677    {272,  SyscallDesc("kcmp")},
678    {273,  SyscallDesc("finit_module")},
679    {274,  SyscallDesc("sched_setattr")},
680    {275,  SyscallDesc("sched_getattr")},
681    {276,  SyscallDesc("renameat2")},
682    {277,  SyscallDesc("seccomp")},
683    {278,  SyscallDesc("getrandom")},
684    {279,  SyscallDesc("memfd_create")},
685    {280,  SyscallDesc("bpf")},
686    {281,  SyscallDesc("execveat")},
687    {282,  SyscallDesc("userfaultid")},
688    {283,  SyscallDesc("membarrier")},
689    {284,  SyscallDesc("mlock2")},
690    {285,  SyscallDesc("copy_file_range")},
691    {286,  SyscallDesc("preadv2")},
692    {287,  SyscallDesc("pwritev2")},
693    {1024, SyscallDesc("open", openFunc<RiscvLinux32>)},
694    {1025, SyscallDesc("link")},
695    {1026, SyscallDesc("unlink", unlinkFunc)},
696    {1027, SyscallDesc("mknod")},
697    {1028, SyscallDesc("chmod", chmodFunc<RiscvLinux32>)},
698    {1029, SyscallDesc("chown", chownFunc)},
699    {1030, SyscallDesc("mkdir", mkdirFunc)},
700    {1031, SyscallDesc("rmdir")},
701    {1032, SyscallDesc("lchown")},
702    {1033, SyscallDesc("access", accessFunc)},
703    {1034, SyscallDesc("rename", renameFunc)},
704    {1035, SyscallDesc("readlink", readlinkFunc)},
705    {1036, SyscallDesc("symlink")},
706    {1037, SyscallDesc("utimes", utimesFunc<RiscvLinux32>)},
707    {1038, SyscallDesc("stat", statFunc<RiscvLinux32>)},
708    {1039, SyscallDesc("lstat", lstatFunc<RiscvLinux32>)},
709    {1040, SyscallDesc("pipe", pipeFunc)},
710    {1041, SyscallDesc("dup2", dup2Func)},
711    {1042, SyscallDesc("epoll_create")},
712    {1043, SyscallDesc("inotifiy_init")},
713    {1044, SyscallDesc("eventfd")},
714    {1045, SyscallDesc("signalfd")},
715    {1046, SyscallDesc("sendfile")},
716    {1047, SyscallDesc("ftruncate", ftruncateFunc)},
717    {1048, SyscallDesc("truncate", truncateFunc)},
718    {1049, SyscallDesc("stat", statFunc<RiscvLinux32>)},
719    {1050, SyscallDesc("lstat", lstatFunc<RiscvLinux32>)},
720    {1051, SyscallDesc("fstat", fstatFunc<RiscvLinux32>)},
721    {1052, SyscallDesc("fcntl", fcntlFunc)},
722    {1053, SyscallDesc("fadvise64")},
723    {1054, SyscallDesc("newfstatat")},
724    {1055, SyscallDesc("fstatfs", fstatfsFunc<RiscvLinux32>)},
725    {1056, SyscallDesc("statfs", statfsFunc<RiscvLinux32>)},
726    {1057, SyscallDesc("lseek", lseekFunc)},
727    {1058, SyscallDesc("mmap", mmapFunc<RiscvLinux32>)},
728    {1059, SyscallDesc("alarm")},
729    {1060, SyscallDesc("getpgrp")},
730    {1061, SyscallDesc("pause")},
731    {1062, SyscallDesc("time", timeFunc<RiscvLinux32>)},
732    {1063, SyscallDesc("utime")},
733    {1064, SyscallDesc("creat")},
734    {1065, SyscallDesc("getdents")},
735    {1066, SyscallDesc("futimesat")},
736    {1067, SyscallDesc("select")},
737    {1068, SyscallDesc("poll")},
738    {1069, SyscallDesc("epoll_wait")},
739    {1070, SyscallDesc("ustat")},
740    {1071, SyscallDesc("vfork")},
741    {1072, SyscallDesc("oldwait4")},
742    {1073, SyscallDesc("recv")},
743    {1074, SyscallDesc("send")},
744    {1075, SyscallDesc("bdflush")},
745    {1076, SyscallDesc("umount")},
746    {1077, SyscallDesc("uselib")},
747    {1078, SyscallDesc("sysctl")},
748    {1079, SyscallDesc("fork")},
749    {2011, SyscallDesc("getmainvars")}
750};
751
752RiscvLinuxProcess64::RiscvLinuxProcess64(ProcessParams * params,
753    ObjectFile *objFile) : RiscvProcess64(params, objFile)
754{}
755
756SyscallDesc*
757RiscvLinuxProcess64::getDesc(int callnum)
758{
759    return syscallDescs.find(callnum) != syscallDescs.end() ?
760        &syscallDescs.at(callnum) : nullptr;
761}
762
763RiscvLinuxProcess32::RiscvLinuxProcess32(ProcessParams * params,
764    ObjectFile *objFile) : RiscvProcess32(params, objFile)
765{}
766
767SyscallDesc*
768RiscvLinuxProcess32::getDesc(int callnum)
769{
770    return syscallDescs.find(callnum) != syscallDescs.end() ?
771        &syscallDescs.at(callnum) : nullptr;
772}
773