1/*
2 * Copyright 2016, Data61
3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
4 * ABN 41 687 119 230.
5 *
6 * This software may be distributed and modified according to the terms of
7 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
8 * See "LICENSE_BSD2.txt" for details.
9 *
10 * @TAG(D61_BSD)
11 */
12
13#include <bits/syscall.h>
14#include <syscall.h>
15#include <stdio.h>
16#include <stdlib.h>
17#include <assert.h>
18#include <sel4/sel4.h>
19#include <refos-util/init.h>
20#include <refos-util/cspace.h>
21#include <refos-util/walloc.h>
22#include <refos-util/dprintf.h>
23#include <refos/refos.h>
24#include <refos/vmlayout.h>
25#include <autoconf.h>
26#include "stdio_copy.h"
27
28/*! @file
29    @brief RefOS client environment initialisation helper functions. */
30
31/* Forward declarations to avoid spectacular circular library dependency header soup. */
32extern void refosio_init_morecore(struct sl_procinfo_s *procInfo);
33extern void refos_init_timer(char *dspacePath);
34extern void filetable_init_default(void);
35
36/* Static buffer for the cspace allocator, to avoid malloc() circular dependency disaster. */
37#define REFOS_UTIL_CSPACE_STATIC_SIZE 0x8000
38static char _refosUtilCSpaceStatic[REFOS_UTIL_CSPACE_STATIC_SIZE];
39static char *_refosEnv[1];
40extern char **__environ; /*! < POSIX standard, from MUSLC lib. */
41
42/* Provide default weak links to dprintf. */
43const char* dprintfServerName __attribute__((weak)) = "????????";
44int dprintfServerColour __attribute__((weak)) = 33;
45
46/* Future Work 3:
47   How the selfloader bootstraps user processes needs to be modified further. Changes were
48   made to accomodate the new way that muslc expects process's stacks to be set up when
49   processes start, but the one part of this that still needs to changed is how user processes
50   find their system call table. Currently the selfloader sets up user processes so that
51   the selfloader's system call table is used by user processes by passing the address of the
52   selfloader's system call table to the user processes via the user process's environment
53   variables. Ideally, user processes would use their own system call table.
54*/
55
56typedef long (*syscall_t)(va_list);
57
58long sys_restart_syscall(va_list ap);
59long sys_exit(va_list ap);
60long sys_fork(va_list ap);
61long sys_read(va_list ap);
62long sys_write(va_list ap);
63long sys_open(va_list ap);
64long sys_close(va_list ap);
65long sys_creat(va_list ap);
66long sys_link(va_list ap);
67long sys_unlink(va_list ap);
68long sys_execve(va_list ap);
69long sys_chdir(va_list ap);
70long sys_mknod(va_list ap);
71long sys_chmod(va_list ap);
72long sys_lchown(va_list ap);
73long sys_lseek(va_list ap);
74long sys_getpid(va_list ap);
75long sys_mount(va_list ap);
76long sys_setuid(va_list ap);
77long sys_getuid(va_list ap);
78long sys_ptrace(va_list ap);
79long sys_pause(va_list ap);
80long sys_access(va_list ap);
81long sys_nice(va_list ap);
82long sys_sync(va_list ap);
83long sys_kill(va_list ap);
84long sys_rename(va_list ap);
85long sys_mkdir(va_list ap);
86long sys_rmdir(va_list ap);
87long sys_dup(va_list ap);
88long sys_pipe(va_list ap);
89long sys_times(va_list ap);
90long sys_brk(va_list ap);
91long sys_setgid(va_list ap);
92long sys_getgid(va_list ap);
93long sys_geteuid(va_list ap);
94long sys_getegid(va_list ap);
95long sys_acct(va_list ap);
96long sys_umount2(va_list ap);
97long sys_ioctl(va_list ap);
98long sys_fcntl(va_list ap);
99long sys_setpgid(va_list ap);
100long sys_umask(va_list ap);
101long sys_chroot(va_list ap);
102long sys_ustat(va_list ap);
103long sys_dup2(va_list ap);
104long sys_getppid(va_list ap);
105long sys_getpgrp(va_list ap);
106long sys_setsid(va_list ap);
107long sys_sigaction(va_list ap);
108long sys_setreuid(va_list ap);
109long sys_setregid(va_list ap);
110long sys_sigsuspend(va_list ap);
111long sys_sigpending(va_list ap);
112long sys_sethostname(va_list ap);
113long sys_setrlimit(va_list ap);
114long sys_getrusage(va_list ap);
115long sys_gettimeofday(va_list ap);
116long sys_settimeofday(va_list ap);
117long sys_getgroups(va_list ap);
118long sys_setgroups(va_list ap);
119long sys_symlink(va_list ap);
120long sys_readlink(va_list ap);
121long sys_uselib(va_list ap);
122long sys_swapon(va_list ap);
123long sys_reboot(va_list ap);
124long sys_munmap(va_list ap);
125long sys_truncate(va_list ap);
126long sys_ftruncate(va_list ap);
127long sys_fchmod(va_list ap);
128long sys_fchown(va_list ap);
129long sys_getpriority(va_list ap);
130long sys_setpriority(va_list ap);
131long sys_statfs(va_list ap);
132long sys_fstatfs(va_list ap);
133long sys_syslog(va_list ap);
134long sys_setitimer(va_list ap);
135long sys_getitimer(va_list ap);
136long sys_stat(va_list ap);
137long sys_lstat(va_list ap);
138long sys_fstat(va_list ap);
139long sys_vhangup(va_list ap);
140long sys_wait4(va_list ap);
141long sys_swapoff(va_list ap);
142long sys_sysinfo(va_list ap);
143long sys_fsync(va_list ap);
144long sys_sigreturn(va_list ap);
145long sys_clone(va_list ap);
146long sys_setdomainname(va_list ap);
147long sys_uname(va_list ap);
148long sys_adjtimex(va_list ap);
149long sys_mprotect(va_list ap);
150long sys_sigprocmask(va_list ap);
151long sys_init_module(va_list ap);
152long sys_delete_module(va_list ap);
153long sys_quotactl(va_list ap);
154long sys_getpgid(va_list ap);
155long sys_fchdir(va_list ap);
156long sys_bdflush(va_list ap);
157long sys_sysfs(va_list ap);
158long sys_personality(va_list ap);
159long sys_setfsuid(va_list ap);
160long sys_setfsgid(va_list ap);
161long sys_getdents(va_list ap);
162long sys__newselect(va_list ap);
163long sys_flock(va_list ap);
164long sys_msync(va_list ap);
165long sys_readv(va_list ap);
166long sys_writev(va_list ap);
167long sys_getsid(va_list ap);
168long sys_fdatasync(va_list ap);
169long sys__sysctl(va_list ap);
170long sys_mlock(va_list ap);
171long sys_munlock(va_list ap);
172long sys_mlockall(va_list ap);
173long sys_munlockall(va_list ap);
174long sys_sched_setparam(va_list ap);
175long sys_sched_getparam(va_list ap);
176long sys_sched_setscheduler(va_list ap);
177long sys_sched_getscheduler(va_list ap);
178long sys_sched_yield(va_list ap);
179long sys_sched_get_priority_max(va_list ap);
180long sys_sched_get_priority_min(va_list ap);
181long sys_sched_rr_get_interval(va_list ap);
182long sys_nanosleep(va_list ap);
183long sys_mremap(va_list ap);
184long sys_setresuid(va_list ap);
185long sys_getresuid(va_list ap);
186long sys_poll(va_list ap);
187long sys_nfsservctl(va_list ap);
188long sys_setresgid(va_list ap);
189long sys_getresgid(va_list ap);
190long sys_prctl(va_list ap);
191long sys_rt_sigreturn(va_list ap);
192long sys_rt_sigaction(va_list ap);
193long sys_rt_sigprocmask(va_list ap);
194long sys_rt_sigpending(va_list ap);
195long sys_rt_sigtimedwait(va_list ap);
196long sys_rt_sigqueueinfo(va_list ap);
197long sys_rt_sigsuspend(va_list ap);
198long sys_pread64(va_list ap);
199long sys_pwrite64(va_list ap);
200long sys_chown(va_list ap);
201long sys_getcwd(va_list ap);
202long sys_capget(va_list ap);
203long sys_capset(va_list ap);
204long sys_sigaltstack(va_list ap);
205long sys_sendfile(va_list ap);
206long sys_vfork(va_list ap);
207long sys_ugetrlimit(va_list ap);
208long sys_mmap2(va_list ap);
209long sys_truncate64(va_list ap);
210long sys_ftruncate64(va_list ap);
211long sys_stat64(va_list ap);
212long sys_lstat64(va_list ap);
213long sys_fstat64(va_list ap);
214long sys_lchown32(va_list ap);
215long sys_getuid32(va_list ap);
216long sys_getgid32(va_list ap);
217long sys_geteuid32(va_list ap);
218long sys_getegid32(va_list ap);
219long sys_setreuid32(va_list ap);
220long sys_setregid32(va_list ap);
221long sys_getgroups32(va_list ap);
222long sys_setgroups32(va_list ap);
223long sys_fchown32(va_list ap);
224long sys_setresuid32(va_list ap);
225long sys_getresuid32(va_list ap);
226long sys_setresgid32(va_list ap);
227long sys_getresgid32(va_list ap);
228long sys_chown32(va_list ap);
229long sys_setuid32(va_list ap);
230long sys_setgid32(va_list ap);
231long sys_setfsuid32(va_list ap);
232long sys_setfsgid32(va_list ap);
233long sys_getdents64(va_list ap);
234long sys_pivot_root(va_list ap);
235long sys_mincore(va_list ap);
236long sys_madvise(va_list ap);
237long sys_fcntl64(va_list ap);
238long sys_gettid(va_list ap);
239long sys_readahead(va_list ap);
240long sys_setxattr(va_list ap);
241long sys_lsetxattr(va_list ap);
242long sys_fsetxattr(va_list ap);
243long sys_getxattr(va_list ap);
244long sys_lgetxattr(va_list ap);
245long sys_fgetxattr(va_list ap);
246long sys_listxattr(va_list ap);
247long sys_llistxattr(va_list ap);
248long sys_flistxattr(va_list ap);
249long sys_removexattr(va_list ap);
250long sys_lremovexattr(va_list ap);
251long sys_fremovexattr(va_list ap);
252long sys_tkill(va_list ap);
253long sys_sendfile64(va_list ap);
254long sys_futex(va_list ap);
255long sys_sched_setaffinity(va_list ap);
256long sys_sched_getaffinity(va_list ap);
257long sys_io_setup(va_list ap);
258long sys_io_destroy(va_list ap);
259long sys_io_getevents(va_list ap);
260long sys_io_submit(va_list ap);
261long sys_io_cancel(va_list ap);
262long sys_exit_group(va_list ap);
263long sys_lookup_dcookie(va_list ap);
264long sys_epoll_create(va_list ap);
265long sys_epoll_ctl(va_list ap);
266long sys_epoll_wait(va_list ap);
267long sys_remap_file_pages(va_list ap);
268long sys_set_tid_address(va_list ap);
269long sys_timer_create(va_list ap);
270long sys_timer_settime(va_list ap);
271long sys_timer_gettime(va_list ap);
272long sys_timer_getoverrun(va_list ap);
273long sys_timer_delete(va_list ap);
274long sys_clock_settime(va_list ap);
275long sys_clock_gettime(va_list ap);
276long sys_clock_getres(va_list ap);
277long sys_clock_nanosleep(va_list ap);
278long sys_statfs64(va_list ap);
279long sys_fstatfs64(va_list ap);
280long sys_tgkill(va_list ap);
281long sys_utimes(va_list ap);
282long sys_fadvise64_64(va_list ap);
283long sys_mq_open(va_list ap);
284long sys_mq_unlink(va_list ap);
285long sys_mq_timedsend(va_list ap);
286long sys_mq_timedreceive(va_list ap);
287long sys_mq_notify(va_list ap);
288long sys_mq_getsetattr(va_list ap);
289long sys_waitid(va_list ap);
290long sys_add_key(va_list ap);
291long sys_request_key(va_list ap);
292long sys_keyctl(va_list ap);
293long sys_vserver(va_list ap);
294long sys_ioprio_set(va_list ap);
295long sys_ioprio_get(va_list ap);
296long sys_inotify_init(va_list ap);
297long sys_inotify_add_watch(va_list ap);
298long sys_inotify_rm_watch(va_list ap);
299long sys_mbind(va_list ap);
300long sys_get_mempolicy(va_list ap);
301long sys_set_mempolicy(va_list ap);
302long sys_openat(va_list ap);
303long sys_mkdirat(va_list ap);
304long sys_mknodat(va_list ap);
305long sys_fchownat(va_list ap);
306long sys_futimesat(va_list ap);
307long sys_fstatat64(va_list ap);
308long sys_unlinkat(va_list ap);
309long sys_renameat(va_list ap);
310long sys_linkat(va_list ap);
311long sys_symlinkat(va_list ap);
312long sys_readlinkat(va_list ap);
313long sys_fchmodat(va_list ap);
314long sys_faccessat(va_list ap);
315long sys_pselect6(va_list ap);
316long sys_ppoll(va_list ap);
317long sys_unshare(va_list ap);
318long sys_set_robust_list(va_list ap);
319long sys_get_robust_list(va_list ap);
320long sys_splice(va_list ap);
321long sys_tee(va_list ap);
322long sys_vmsplice(va_list ap);
323long sys_move_pages(va_list ap);
324long sys_getcpu(va_list ap);
325long sys_epoll_pwait(va_list ap);
326long sys_kexec_load(va_list ap);
327long sys_utimensat(va_list ap);
328long sys_signalfd(va_list ap);
329long sys_timerfd_create(va_list ap);
330long sys_eventfd(va_list ap);
331long sys_fallocate(va_list ap);
332long sys_timerfd_settime(va_list ap);
333long sys_timerfd_gettime(va_list ap);
334long sys_signalfd4(va_list ap);
335long sys_eventfd2(va_list ap);
336long sys_epoll_create1(va_list ap);
337long sys_dup3(va_list ap);
338long sys_pipe2(va_list ap);
339long sys_inotify_init1(va_list ap);
340long sys_preadv(va_list ap);
341long sys_pwritev(va_list ap);
342long sys_prlimit64(va_list ap);
343long sys_name_to_handle_at(va_list ap);
344long sys_open_by_handle_at(va_list ap);
345long sys_clock_adjtime(va_list ap);
346long sys_syncfs(va_list ap);
347long sys_sendmmsg(va_list ap);
348long sys_setns(va_list ap);
349long sys_process_vm_readv(va_list ap);
350long sys_process_vm_writev(va_list ap);
351#ifdef CONFIG_ARCH_ARM
352long sys_pciconfig_iobase(va_list ap);
353long sys_pciconfig_read(va_list ap);
354long sys_pciconfig_write(va_list ap);
355long sys_socket(va_list ap);
356long sys_bind(va_list ap);
357long sys_connect(va_list ap);
358long sys_listen(va_list ap);
359long sys_accept(va_list ap);
360long sys_getsockname(va_list ap);
361long sys_getpeername(va_list ap);
362long sys_socketpair(va_list ap);
363long sys_send(va_list ap);
364long sys_sendto(va_list ap);
365long sys_recv(va_list ap);
366long sys_recvfrom(va_list ap);
367long sys_shutdown(va_list ap);
368long sys_setsockopt(va_list ap);
369long sys_getsockopt(va_list ap);
370long sys_sendmsg(va_list ap);
371long sys_recvmsg(va_list ap);
372long sys_semop(va_list ap);
373long sys_semget(va_list ap);
374long sys_semctl(va_list ap);
375long sys_msgsnd(va_list ap);
376long sys_msgrcv(va_list ap);
377long sys_msgget(va_list ap);
378long sys_msgctl(va_list ap);
379long sys_shmat(va_list ap);
380long sys_shmdt(va_list ap);
381long sys_shmget(va_list ap);
382long sys_shmctl(va_list ap);
383long sys_semtimedop(va_list ap);
384long sys_sync_file_range2(va_list ap);
385long sys_accept4(va_list ap);
386long sys_rt_tgsigqueueinfo(va_list ap);
387long sys_perf_event_open(va_list ap);
388long sys_recvmmsg(va_list ap);
389long sys_fanotify_init(va_list ap);
390long sys_fanotify_mark(va_list ap);
391#endif /* CONFIG_ARCH_ARM */
392
393void
394refos_init_selfload_child(uintptr_t parent_syscall_table_address)
395{
396    /* Point the selfloaded process to the parent's system call table. */
397    syscall_t *syscall_table = (syscall_t *) parent_syscall_table_address;
398
399    syscall_table[__NR_restart_syscall] = sys_restart_syscall;
400    syscall_table[__NR_exit] = sys_exit;
401    syscall_table[__NR_fork] = sys_fork;
402    syscall_table[__NR_read] = sys_read;
403    syscall_table[__NR_write] = sys_write;
404    syscall_table[__NR_open] = sys_open;
405    syscall_table[__NR_close] = sys_close;
406    syscall_table[__NR_creat] = sys_creat;
407    syscall_table[__NR_link] = sys_link;
408    syscall_table[__NR_unlink] = sys_unlink;
409    syscall_table[__NR_execve] = sys_execve;
410    syscall_table[__NR_chdir] = sys_chdir;
411    syscall_table[__NR_mknod] = sys_mknod;
412    syscall_table[__NR_chmod] = sys_chmod;
413    syscall_table[__NR_lchown] = sys_lchown;
414    syscall_table[__NR_lseek] = sys_lseek;
415    syscall_table[__NR_getpid] = sys_getpid;
416    syscall_table[__NR_mount] = sys_mount;
417    syscall_table[__NR_setuid] = sys_setuid;
418    syscall_table[__NR_getuid] = sys_getuid;
419    syscall_table[__NR_ptrace] = sys_ptrace;
420    syscall_table[__NR_pause] = sys_pause;
421    syscall_table[__NR_access] = sys_access;
422    syscall_table[__NR_nice] = sys_nice;
423    syscall_table[__NR_sync] = sys_sync;
424    syscall_table[__NR_kill] = sys_kill;
425    syscall_table[__NR_rename] = sys_rename;
426    syscall_table[__NR_mkdir] = sys_mkdir;
427    syscall_table[__NR_rmdir] = sys_rmdir;
428    syscall_table[__NR_dup] = sys_dup;
429    syscall_table[__NR_pipe] = sys_pipe;
430    syscall_table[__NR_times] = sys_times;
431    syscall_table[__NR_brk] = sys_brk;
432    syscall_table[__NR_setgid] = sys_setgid;
433    syscall_table[__NR_getgid] = sys_getgid;
434    syscall_table[__NR_geteuid] = sys_geteuid;
435    syscall_table[__NR_getegid] = sys_getegid;
436    syscall_table[__NR_acct] = sys_acct;
437    syscall_table[__NR_umount2] = sys_umount2;
438    syscall_table[__NR_ioctl] = sys_ioctl;
439    syscall_table[__NR_fcntl] = sys_fcntl;
440    syscall_table[__NR_setpgid] = sys_setpgid;
441    syscall_table[__NR_umask] = sys_umask;
442    syscall_table[__NR_chroot] = sys_chroot;
443    syscall_table[__NR_ustat] = sys_ustat;
444    syscall_table[__NR_dup2] = sys_dup2;
445    syscall_table[__NR_getppid] = sys_getppid;
446    syscall_table[__NR_getpgrp] = sys_getpgrp;
447    syscall_table[__NR_setsid] = sys_setsid;
448    syscall_table[__NR_sigaction] = sys_sigaction;
449    syscall_table[__NR_setreuid] = sys_setreuid;
450    syscall_table[__NR_setregid] = sys_setregid;
451    syscall_table[__NR_sigsuspend] = sys_sigsuspend;
452    syscall_table[__NR_sigpending] = sys_sigpending;
453    syscall_table[__NR_sethostname] = sys_sethostname;
454    syscall_table[__NR_setrlimit] = sys_setrlimit;
455    syscall_table[__NR_getrusage] = sys_getrusage;
456    syscall_table[__NR_gettimeofday] = sys_gettimeofday;
457    syscall_table[__NR_settimeofday] = sys_settimeofday;
458    syscall_table[__NR_getgroups] = sys_getgroups;
459    syscall_table[__NR_setgroups] = sys_setgroups;
460    syscall_table[__NR_symlink] = sys_symlink;
461    syscall_table[__NR_readlink] = sys_readlink;
462    syscall_table[__NR_uselib] = sys_uselib;
463    syscall_table[__NR_swapon] = sys_swapon;
464    syscall_table[__NR_reboot] = sys_reboot;
465    syscall_table[__NR_munmap] = sys_munmap;
466    syscall_table[__NR_truncate] = sys_truncate;
467    syscall_table[__NR_ftruncate] = sys_ftruncate;
468    syscall_table[__NR_fchmod] = sys_fchmod;
469    syscall_table[__NR_fchown] = sys_fchown;
470    syscall_table[__NR_getpriority] = sys_getpriority;
471    syscall_table[__NR_setpriority] = sys_setpriority;
472    syscall_table[__NR_statfs] = sys_statfs;
473    syscall_table[__NR_fstatfs] = sys_fstatfs;
474    syscall_table[__NR_syslog] = sys_syslog;
475    syscall_table[__NR_setitimer] = sys_setitimer;
476    syscall_table[__NR_getitimer] = sys_getitimer;
477    syscall_table[__NR_stat] = sys_stat;
478    syscall_table[__NR_lstat] = sys_lstat;
479    syscall_table[__NR_fstat] = sys_fstat;
480    syscall_table[__NR_vhangup] = sys_vhangup;
481    syscall_table[__NR_wait4] = sys_wait4;
482    syscall_table[__NR_swapoff] = sys_swapoff;
483    syscall_table[__NR_sysinfo] = sys_sysinfo;
484    syscall_table[__NR_fsync] = sys_fsync;
485    syscall_table[__NR_sigreturn] = sys_sigreturn;
486    syscall_table[__NR_clone] = sys_clone;
487    syscall_table[__NR_setdomainname] = sys_setdomainname;
488    syscall_table[__NR_uname] = sys_uname;
489    syscall_table[__NR_adjtimex] = sys_adjtimex;
490    syscall_table[__NR_mprotect] = sys_mprotect;
491    syscall_table[__NR_sigprocmask] = sys_sigprocmask;
492    syscall_table[__NR_init_module] = sys_init_module;
493    syscall_table[__NR_delete_module] = sys_delete_module;
494    syscall_table[__NR_quotactl] = sys_quotactl;
495    syscall_table[__NR_getpgid] = sys_getpgid;
496    syscall_table[__NR_fchdir] = sys_fchdir;
497    syscall_table[__NR_bdflush] = sys_bdflush;
498    syscall_table[__NR_sysfs] = sys_sysfs;
499    syscall_table[__NR_personality] = sys_personality;
500    syscall_table[__NR_setfsuid] = sys_setfsuid;
501    syscall_table[__NR_setfsgid] = sys_setfsgid;
502    syscall_table[__NR_getdents] = sys_getdents;
503    syscall_table[__NR__newselect] = sys__newselect;
504    syscall_table[__NR_flock] = sys_flock;
505    syscall_table[__NR_msync] = sys_msync;
506    syscall_table[__NR_readv] = sys_readv;
507    syscall_table[__NR_writev] = sys_writev;
508    syscall_table[__NR_getsid] = sys_getsid;
509    syscall_table[__NR_fdatasync] = sys_fdatasync;
510    syscall_table[__NR__sysctl] = sys__sysctl;
511    syscall_table[__NR_mlock] = sys_mlock;
512    syscall_table[__NR_munlock] = sys_munlock;
513    syscall_table[__NR_mlockall] = sys_mlockall;
514    syscall_table[__NR_munlockall] = sys_munlockall;
515    syscall_table[__NR_sched_setparam] = sys_sched_setparam;
516    syscall_table[__NR_sched_getparam] = sys_sched_getparam;
517    syscall_table[__NR_sched_setscheduler] = sys_sched_setscheduler;
518    syscall_table[__NR_sched_getscheduler] = sys_sched_getscheduler;
519    syscall_table[__NR_sched_yield] = sys_sched_yield;
520    syscall_table[__NR_sched_get_priority_max] = sys_sched_get_priority_max;
521    syscall_table[__NR_sched_get_priority_min] = sys_sched_get_priority_min;
522    syscall_table[__NR_sched_rr_get_interval] = sys_sched_rr_get_interval;
523    syscall_table[__NR_nanosleep] = sys_nanosleep;
524    syscall_table[__NR_mremap] = sys_mremap;
525    syscall_table[__NR_setresuid] = sys_setresuid;
526    syscall_table[__NR_getresuid] = sys_getresuid;
527    syscall_table[__NR_poll] = sys_poll;
528    syscall_table[__NR_nfsservctl] = sys_nfsservctl;
529    syscall_table[__NR_setresgid] = sys_setresgid;
530    syscall_table[__NR_getresgid] = sys_getresgid;
531    syscall_table[__NR_prctl] = sys_prctl;
532    syscall_table[__NR_rt_sigreturn] = sys_rt_sigreturn;
533    syscall_table[__NR_rt_sigaction] = sys_rt_sigaction;
534    syscall_table[__NR_rt_sigprocmask] = sys_rt_sigprocmask;
535    syscall_table[__NR_rt_sigpending] = sys_rt_sigpending;
536    syscall_table[__NR_rt_sigtimedwait] = sys_rt_sigtimedwait;
537    syscall_table[__NR_rt_sigqueueinfo] = sys_rt_sigqueueinfo;
538    syscall_table[__NR_rt_sigsuspend] = sys_rt_sigsuspend;
539    syscall_table[__NR_pread64] = sys_pread64;
540    syscall_table[__NR_pwrite64] = sys_pwrite64;
541    syscall_table[__NR_chown] = sys_chown;
542    syscall_table[__NR_getcwd] = sys_getcwd;
543    syscall_table[__NR_capget] = sys_capget;
544    syscall_table[__NR_capset] = sys_capset;
545    syscall_table[__NR_sigaltstack] = sys_sigaltstack;
546    syscall_table[__NR_sendfile] = sys_sendfile;
547    syscall_table[__NR_vfork] = sys_vfork;
548    syscall_table[__NR_ugetrlimit] = sys_ugetrlimit;
549    syscall_table[__NR_mmap2] = sys_mmap2;
550    syscall_table[__NR_truncate64] = sys_truncate64;
551    syscall_table[__NR_ftruncate64] = sys_ftruncate64;
552    syscall_table[__NR_stat64] = sys_stat64;
553    syscall_table[__NR_lstat64] = sys_lstat64;
554    syscall_table[__NR_fstat64] = sys_fstat64;
555    syscall_table[__NR_lchown32] = sys_lchown32;
556    syscall_table[__NR_getuid32] = sys_getuid32;
557    syscall_table[__NR_getgid32] = sys_getgid32;
558    syscall_table[__NR_geteuid32] = sys_geteuid32;
559    syscall_table[__NR_getegid32] = sys_getegid32;
560    syscall_table[__NR_setreuid32] = sys_setreuid32;
561    syscall_table[__NR_setregid32] = sys_setregid32;
562    syscall_table[__NR_getgroups32] = sys_getgroups32;
563    syscall_table[__NR_setgroups32] = sys_setgroups32;
564    syscall_table[__NR_fchown32] = sys_fchown32;
565    syscall_table[__NR_setresuid32] = sys_setresuid32;
566    syscall_table[__NR_getresuid32] = sys_getresuid32;
567    syscall_table[__NR_setresgid32] = sys_setresgid32;
568    syscall_table[__NR_getresgid32] = sys_getresgid32;
569    syscall_table[__NR_chown32] = sys_chown32;
570    syscall_table[__NR_setuid32] = sys_setuid32;
571    syscall_table[__NR_setgid32] = sys_setgid32;
572    syscall_table[__NR_setfsuid32] = sys_setfsuid32;
573    syscall_table[__NR_setfsgid32] = sys_setfsgid32;
574    syscall_table[__NR_getdents64] = sys_getdents64;
575    syscall_table[__NR_pivot_root] = sys_pivot_root;
576    syscall_table[__NR_mincore] = sys_mincore;
577    syscall_table[__NR_madvise] = sys_madvise;
578    syscall_table[__NR_fcntl64] = sys_fcntl64;
579    syscall_table[__NR_gettid] = sys_gettid;
580    syscall_table[__NR_readahead] = sys_readahead;
581    syscall_table[__NR_setxattr] = sys_setxattr;
582    syscall_table[__NR_lsetxattr] = sys_lsetxattr;
583    syscall_table[__NR_fsetxattr] = sys_fsetxattr;
584    syscall_table[__NR_getxattr] = sys_getxattr;
585    syscall_table[__NR_lgetxattr] = sys_lgetxattr;
586    syscall_table[__NR_fgetxattr] = sys_fgetxattr;
587    syscall_table[__NR_listxattr] = sys_listxattr;
588    syscall_table[__NR_llistxattr] = sys_llistxattr;
589    syscall_table[__NR_flistxattr] = sys_flistxattr;
590    syscall_table[__NR_removexattr] = sys_removexattr;
591    syscall_table[__NR_lremovexattr] = sys_lremovexattr;
592    syscall_table[__NR_fremovexattr] = sys_fremovexattr;
593    syscall_table[__NR_tkill] = sys_tkill;
594    syscall_table[__NR_sendfile64] = sys_sendfile64;
595    syscall_table[__NR_futex] = sys_futex;
596    syscall_table[__NR_sched_setaffinity] = sys_sched_setaffinity;
597    syscall_table[__NR_sched_getaffinity] = sys_sched_getaffinity;
598    syscall_table[__NR_io_setup] = sys_io_setup;
599    syscall_table[__NR_io_destroy] = sys_io_destroy;
600    syscall_table[__NR_io_getevents] = sys_io_getevents;
601    syscall_table[__NR_io_submit] = sys_io_submit;
602    syscall_table[__NR_io_cancel] = sys_io_cancel;
603    syscall_table[__NR_exit_group] = sys_exit_group;
604    syscall_table[__NR_lookup_dcookie] = sys_lookup_dcookie;
605    syscall_table[__NR_epoll_create] = sys_epoll_create;
606    syscall_table[__NR_epoll_ctl] = sys_epoll_ctl;
607    syscall_table[__NR_epoll_wait] = sys_epoll_wait;
608    syscall_table[__NR_remap_file_pages] = sys_remap_file_pages;
609    syscall_table[__NR_set_tid_address] = sys_set_tid_address;
610    syscall_table[__NR_timer_create] = sys_timer_create;
611    syscall_table[__NR_timer_settime] = sys_timer_settime;
612    syscall_table[__NR_timer_gettime] = sys_timer_gettime;
613    syscall_table[__NR_timer_getoverrun] = sys_timer_getoverrun;
614    syscall_table[__NR_timer_delete] = sys_timer_delete;
615    syscall_table[__NR_clock_settime] = sys_clock_settime;
616    syscall_table[__NR_clock_gettime] = sys_clock_gettime;
617    syscall_table[__NR_clock_getres] = sys_clock_getres;
618    syscall_table[__NR_clock_nanosleep] = sys_clock_nanosleep;
619    syscall_table[__NR_statfs64] = sys_statfs64;
620    syscall_table[__NR_fstatfs64] = sys_fstatfs64;
621    syscall_table[__NR_tgkill] = sys_tgkill;
622    syscall_table[__NR_utimes] = sys_utimes;
623    syscall_table[__NR_fadvise64_64] = sys_fadvise64_64;
624    syscall_table[__NR_mq_open] = sys_mq_open;
625    syscall_table[__NR_mq_unlink] = sys_mq_unlink;
626    syscall_table[__NR_mq_timedsend] = sys_mq_timedsend;
627    syscall_table[__NR_mq_timedreceive] = sys_mq_timedreceive;
628    syscall_table[__NR_mq_notify] = sys_mq_notify;
629    syscall_table[__NR_mq_getsetattr] = sys_mq_getsetattr;
630    syscall_table[__NR_waitid] = sys_waitid;
631    syscall_table[__NR_add_key] = sys_add_key;
632    syscall_table[__NR_request_key] = sys_request_key;
633    syscall_table[__NR_keyctl] = sys_keyctl;
634    syscall_table[__NR_vserver] = sys_vserver;
635    syscall_table[__NR_ioprio_set] = sys_ioprio_set;
636    syscall_table[__NR_ioprio_get] = sys_ioprio_get;
637    syscall_table[__NR_inotify_init] = sys_inotify_init;
638    syscall_table[__NR_inotify_add_watch] = sys_inotify_add_watch;
639    syscall_table[__NR_inotify_rm_watch] = sys_inotify_rm_watch;
640    syscall_table[__NR_mbind] = sys_mbind;
641    syscall_table[__NR_get_mempolicy] = sys_get_mempolicy;
642    syscall_table[__NR_set_mempolicy] = sys_set_mempolicy;
643    syscall_table[__NR_openat] = sys_openat;
644    syscall_table[__NR_mkdirat] = sys_mkdirat;
645    syscall_table[__NR_mknodat] = sys_mknodat;
646    syscall_table[__NR_fchownat] = sys_fchownat;
647    syscall_table[__NR_futimesat] = sys_futimesat;
648    syscall_table[__NR_fstatat64] = sys_fstatat64;
649    syscall_table[__NR_unlinkat] = sys_unlinkat;
650    syscall_table[__NR_renameat] = sys_renameat;
651    syscall_table[__NR_linkat] = sys_linkat;
652    syscall_table[__NR_symlinkat] = sys_symlinkat;
653    syscall_table[__NR_readlinkat] = sys_readlinkat;
654    syscall_table[__NR_fchmodat] = sys_fchmodat;
655    syscall_table[__NR_faccessat] = sys_faccessat;
656    syscall_table[__NR_pselect6] = sys_pselect6;
657    syscall_table[__NR_ppoll] = sys_ppoll;
658    syscall_table[__NR_unshare] = sys_unshare;
659    syscall_table[__NR_set_robust_list] = sys_set_robust_list;
660    syscall_table[__NR_get_robust_list] = sys_get_robust_list;
661    syscall_table[__NR_splice] = sys_splice;
662    syscall_table[__NR_tee] = sys_tee;
663    syscall_table[__NR_vmsplice] = sys_vmsplice;
664    syscall_table[__NR_move_pages] = sys_move_pages;
665    syscall_table[__NR_getcpu] = sys_getcpu;
666    syscall_table[__NR_epoll_pwait] = sys_epoll_pwait;
667    syscall_table[__NR_kexec_load] = sys_kexec_load;
668    syscall_table[__NR_utimensat] = sys_utimensat;
669    syscall_table[__NR_signalfd] = sys_signalfd;
670    syscall_table[__NR_timerfd_create] = sys_timerfd_create;
671    syscall_table[__NR_eventfd] = sys_eventfd;
672    syscall_table[__NR_fallocate] = sys_fallocate;
673    syscall_table[__NR_timerfd_settime] = sys_timerfd_settime;
674    syscall_table[__NR_timerfd_gettime] = sys_timerfd_gettime;
675    syscall_table[__NR_signalfd4] = sys_signalfd4;
676    syscall_table[__NR_eventfd2] = sys_eventfd2;
677    syscall_table[__NR_epoll_create1] = sys_epoll_create1;
678    syscall_table[__NR_dup3] = sys_dup3;
679    syscall_table[__NR_pipe2] = sys_pipe2;
680    syscall_table[__NR_inotify_init1] = sys_inotify_init1;
681    syscall_table[__NR_preadv] = sys_preadv;
682    syscall_table[__NR_pwritev] = sys_pwritev;
683    syscall_table[__NR_prlimit64] = sys_prlimit64;
684    syscall_table[__NR_name_to_handle_at] = sys_name_to_handle_at;
685    syscall_table[__NR_open_by_handle_at] = sys_open_by_handle_at;
686    syscall_table[__NR_clock_adjtime] = sys_clock_adjtime;
687    syscall_table[__NR_syncfs] = sys_syncfs;
688    syscall_table[__NR_sendmmsg] = sys_sendmmsg;
689    syscall_table[__NR_setns] = sys_setns;
690    syscall_table[__NR_process_vm_readv] = sys_process_vm_readv;
691    syscall_table[__NR_process_vm_writev] = sys_process_vm_writev;
692#ifdef CONFIG_ARCH_ARM
693    syscall_table[__NR_pciconfig_iobase] = sys_pciconfig_iobase;
694    syscall_table[__NR_pciconfig_read] = sys_pciconfig_read;
695    syscall_table[__NR_pciconfig_write] = sys_pciconfig_write;
696    syscall_table[__NR_socket] = sys_socket;
697    syscall_table[__NR_bind] = sys_bind;
698    syscall_table[__NR_connect] = sys_connect;
699    syscall_table[__NR_listen] = sys_listen;
700    syscall_table[__NR_accept] = sys_accept;
701    syscall_table[__NR_getsockname] = sys_getsockname;
702    syscall_table[__NR_getpeername] = sys_getpeername;
703    syscall_table[__NR_socketpair] = sys_socketpair;
704    syscall_table[__NR_send] = sys_send;
705    syscall_table[__NR_sendto] = sys_sendto;
706    syscall_table[__NR_recv] = sys_recv;
707    syscall_table[__NR_recvfrom] = sys_recvfrom;
708    syscall_table[__NR_shutdown] = sys_shutdown;
709    syscall_table[__NR_setsockopt] = sys_setsockopt;
710    syscall_table[__NR_getsockopt] = sys_getsockopt;
711    syscall_table[__NR_sendmsg] = sys_sendmsg;
712    syscall_table[__NR_recvmsg] = sys_recvmsg;
713    syscall_table[__NR_semop] = sys_semop;
714    syscall_table[__NR_semget] = sys_semget;
715    syscall_table[__NR_semctl] = sys_semctl;
716    syscall_table[__NR_msgsnd] = sys_msgsnd;
717    syscall_table[__NR_msgrcv] = sys_msgrcv;
718    syscall_table[__NR_msgget] = sys_msgget;
719    syscall_table[__NR_msgctl] = sys_msgctl;
720    syscall_table[__NR_shmat] = sys_shmat;
721    syscall_table[__NR_shmdt] = sys_shmdt;
722    syscall_table[__NR_shmget] = sys_shmget;
723    syscall_table[__NR_shmctl] = sys_shmctl;
724    syscall_table[__NR_semtimedop] = sys_semtimedop;
725    syscall_table[__NR_sync_file_range2] = sys_sync_file_range2;
726    syscall_table[__NR_accept4] = sys_accept4;
727    syscall_table[__NR_rt_tgsigqueueinfo] = sys_rt_tgsigqueueinfo;
728    syscall_table[__NR_perf_event_open] = sys_perf_event_open;
729    syscall_table[__NR_recvmmsg] = sys_recvmmsg;
730    syscall_table[__NR_fanotify_init] = sys_fanotify_init;
731    syscall_table[__NR_fanotify_mark] = sys_fanotify_mark;
732#endif /* CONFIG_ARCH_ARM */
733}
734
735void
736refos_initialise_os_minimal(void)
737{
738    /* Initialise userspace allocator helper libraries. */
739    csalloc_init(PROCCSPACE_ALLOC_REGION_START, PROCCSPACE_ALLOC_REGION_END);
740    walloc_init(PROCESS_WALLOC_START, PROCESS_WALLOC_END);
741}
742
743void refos_initialise_selfloader(void)
744{
745    /* Initialise userspace allocator helper libraries. */
746    csalloc_init(PROCCSPACE_SELFLOADER_CSPACE_START, PROCCSPACE_SELFLOADER_CSPACE_END);
747    walloc_init(PROCESS_SELFLOADER_RESERVED_READELF,
748        PROCESS_SELFLOADER_RESERVED_READELF + PROCESS_SELFLOADER_RESERVED_READELF_SIZE);
749}
750
751void
752refos_initialise_timer(void)
753{
754    /* Temporarily use seL4_DebugPutChar before printf is set up. On release kernel this will
755       do nothing. */
756    refos_seL4_debug_override_stdout();
757
758    /* We first initialise the cspace allocator statically, as MMap and heap (which malloc
759       depend on) needs this. */
760    csalloc_init_static(PROCCSPACE_ALLOC_REGION_START, PROCCSPACE_ALLOC_REGION_END,
761            _refosUtilCSpaceStatic, REFOS_UTIL_CSPACE_STATIC_SIZE);
762
763    /* Initialise dynamic MMap and heap. */
764    refosio_init_morecore(refos_static_param_procinfo());
765
766    /* Initialise userspace allocator helper libraries. */
767    walloc_init(PROCESS_WALLOC_START, PROCESS_WALLOC_END);
768
769    /* Write to the STDIO output device. */
770    refos_override_stdio(NULL, NULL);
771    refos_setup_dataspace_stdio(REFOS_DEFAULT_STDIO_DSPACE);
772
773    /* Initialise file descriptor table. */
774    filetable_init_default();
775
776    /* Initialise default environment variables. */
777    _refosEnv[0] = NULL;
778    __environ = _refosEnv;
779    setenv("SHELL", "/fileserv/terminal", true);
780    setenv("PWD", "/", true);
781    #ifdef CONFIG_REFOS_TIMEZONE
782        setenv("TZ", CONFIG_REFOS_TIMEZONE, true);
783    #endif
784}
785
786void
787refos_initialise(void)
788{
789    /* Temporarily use seL4_DebugPutChar before printf is set up. On release kernel this will
790       do nothing. */
791    refos_seL4_debug_override_stdout();
792
793    /* We first initialise the cspace allocator statically, as MMap and heap (which malloc
794       depend on) needs this. */
795    csalloc_init_static(PROCCSPACE_ALLOC_REGION_START, PROCCSPACE_ALLOC_REGION_END,
796            _refosUtilCSpaceStatic, REFOS_UTIL_CSPACE_STATIC_SIZE);
797
798    /* Initialise dynamic MMap and heap. */
799    refosio_init_morecore(refos_static_param_procinfo());
800
801    /* Initialise userspace allocator helper libraries. */
802    walloc_init(PROCESS_WALLOC_START, PROCESS_WALLOC_END);
803
804    /* Write to the STDIO output device. */
805    refos_override_stdio(NULL, NULL);
806    refos_setup_dataspace_stdio(REFOS_DEFAULT_STDIO_DSPACE);
807
808    /* Initialise file descriptor table. */
809    filetable_init_default();
810
811    /* Initialise timer so we can sleep. */
812    refos_init_timer(REFOS_DEFAULT_TIMER_DSPACE);
813
814    /* Initialise default environment variables. */
815    _refosEnv[0] = NULL;
816    __environ = _refosEnv;
817    setenv("SHELL", "/fileserv/terminal", true);
818    setenv("PWD", "/", true);
819    #ifdef CONFIG_REFOS_TIMEZONE
820        setenv("TZ", CONFIG_REFOS_TIMEZONE, true);
821    #endif
822}
823
824char *
825refos_static_param(void)
826{
827    return (char*)(PROCESS_STATICPARAM_ADDR);
828}
829
830struct sl_procinfo_s *
831refos_static_param_procinfo(void)
832{
833    return (struct sl_procinfo_s *)(PROCESS_STATICPARAM_PROCINFO_ADDR);
834}
835