From a812a180337c6ec3f4063081af2e3838500f2700 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Fri, 4 Aug 2023 05:36:03 +1100 Subject: [PATCH] Custom linux headers --- build.py | 3 + src/include/errno.h | 164 +++++++++++++ src/include/linux/fcntl.h | 17 ++ src/include/linux/sys/mman.h | 44 ++++ src/include/linux/sys/syscall.h | 418 ++++++++++++++++++++++++++++++++ src/library.json | 6 +- src/linux/entry.c | 7 +- src/linux/syscall.c | 197 --------------- src/linux/tinyrt.c | 14 +- src/loader/loader-self-reloc.c | 37 +-- src/loader/loader.c | 15 +- src/loader/syscall.c | 198 --------------- 12 files changed, 693 insertions(+), 427 deletions(-) create mode 100644 src/include/errno.h create mode 100644 src/include/linux/fcntl.h create mode 100644 src/include/linux/sys/mman.h create mode 100644 src/include/linux/sys/syscall.h delete mode 100644 src/linux/syscall.c delete mode 100644 src/loader/syscall.c diff --git a/build.py b/build.py index 330c012..58f0ed7 100755 --- a/build.py +++ b/build.py @@ -86,6 +86,9 @@ else: # 'debug' if target != 'windows': cc_flags.append('-fpic') +if target == 'linux': + includes.append('src/include/linux') + # Check dependencies print_step('Checking dependencies... ') for dependency in dependencies: diff --git a/src/include/errno.h b/src/include/errno.h new file mode 100644 index 0000000..9d99853 --- /dev/null +++ b/src/include/errno.h @@ -0,0 +1,164 @@ + +#pragma once + +// errno-base.h +#define EPERM 1 +#define ENOENT 2 +#define ESRCH 3 +#define EINTR 4 +#define EIO 5 +#define ENXIO 6 +#define E2BIG 7 +#define ENOEXEC 8 +#define EBADF 9 +#define ECHILD 10 +#define EAGAIN 11 +#define ENOMEM 12 +#define EACCES 13 +#define EFAULT 14 +#define ENOTBLK 15 +#define EBUSY 16 +#define EEXIST 17 +#define EXDEV 18 +#define ENODEV 19 +#define ENOTDIR 20 +#define EISDIR 21 +#define EINVAL 22 +#define ENFILE 23 +#define EMFILE 24 +#define ENOTTY 25 +#define ETXTBSY 26 +#define EFBIG 27 +#define ENOSPC 28 +#define ESPIPE 29 +#define EROFS 30 +#define EMLINK 31 +#define EPIPE 32 +#define EDOM 33 +#define ERANGE 34 + +// linux/errno.h +#define EDEADLK 35 +#define ENAMETOOLONG 36 +#define ENOLCK 37 +#define ENOSYS 38 +#define ENOTEMPTY 39 +#define ELOOP 40 +#define EWOULDBLOCK EAGAIN +#define ENOMSG 42 +#define EIDRM 43 +#define ECHRNG 44 +#define EL2NSYNC 45 +#define EL3HLT 46 +#define EL3RST 47 +#define ELNRNG 48 +#define EUNATCH 49 +#define ENOCSI 50 +#define EL2HLT 51 +#define EBADE 52 +#define EBADR 53 +#define EXFULL 54 +#define ENOANO 55 +#define EBADRQC 56 +#define EBADSLT 57 +#define EDEADLOCK EDEADLK +#define EBFONT 59 +#define ENOSTR 60 +#define ENODATA 61 +#define ETIME 62 +#define ENOSR 63 +#define ENONET 64 +#define ENOPKG 65 +#define EREMOTE 66 +#define ENOLINK 67 +#define EADV 68 +#define ESRMNT 69 +#define ECOMM 70 +#define EPROTO 71 +#define EMULTIHOP 72 +#define EDOTDOT 73 +#define EBADMSG 74 +#define EOVERFLOW 75 +#define ENOTUNIQ 76 +#define EBADFD 77 +#define EREMCHG 78 +#define ELIBACC 79 +#define ELIBBAD 80 +#define ELIBSCN 81 +#define ELIBMAX 82 +#define ELIBEXEC 83 +#define EILSEQ 84 +#define ERESTART 85 +#define ESTRPIPE 86 +#define EUSERS 87 +#define ENOTSOCK 88 +#define EDESTADDRREQ 89 +#define EMSGSIZE 90 +#define EPROTOTYPE 91 +#define ENOPROTOOPT 92 +#define EPROTONOSUPPORT 93 +#define ESOCKTNOSUPPORT 94 +#define EOPNOTSUPP 95 +#define EPFNOSUPPORT 96 +#define EAFNOSUPPORT 97 +#define EADDRINUSE 98 +#define EADDRNOTAVAIL 99 +#define ENETDOWN 100 +#define ENETUNREACH 101 +#define ENETRESET 102 +#define ECONNABORTED 103 +#define ECONNRESET 104 +#define ENOBUFS 105 +#define EISCONN 106 +#define ENOTCONN 107 +#define ESHUTDOWN 108 +#define ETOOMANYREFS 109 +#define ETIMEDOUT 110 +#define ECONNREFUSED 111 +#define EHOSTDOWN 112 +#define EHOSTUNREACH 113 +#define EALREADY 114 +#define EINPROGRESS 115 +#define ESTALE 116 +#define EUCLEAN 117 +#define ENOTNAM 118 +#define ENAVAIL 119 +#define EISNAM 120 +#define EREMOTEIO 121 +#define EDQUOT 122 +#define ENOMEDIUM 123 +#define EMEDIUMTYPE 124 +#define ECANCELED 125 +#define ENOKEY 126 +#define EKEYEXPIRED 127 +#define EKEYREVOKED 128 +#define EKEYREJECTED 129 +#define EOWNERDEAD 130 +#define ENOTRECOVERABLE 131 +#define ERFKILL 132 +#define EHWPOISON 133 + +// other stuff +#ifndef ENOTSUP + #define ENOTSUP EOPNOTSUPP +#endif + +#ifndef ECANCELED + #define ECANCELED 125 +#endif + +#ifndef EOWNERDEAD + #define EOWNERDEAD 130 +#endif + +#ifndef ENOTRECOVERABLE + #define ENOTRECOVERABLE 131 +#endif + +#ifndef ERFKILL + #define ERFKILL 132 +#endif + +#ifndef EHWPOISON + #define EHWPOISON 133 +#endif diff --git a/src/include/linux/fcntl.h b/src/include/linux/fcntl.h new file mode 100644 index 0000000..5360a61 --- /dev/null +++ b/src/include/linux/fcntl.h @@ -0,0 +1,17 @@ + +#pragma once + +#define O_ACCMODE 03 +#define O_RDONLY 00 +#define O_WRONLY 01 +#define O_RDWR 02 +#define O_CREAT 0100 +#define O_EXCL 0200 +#define O_NOCTTY 0400 +#define O_TRUNC 01000 +#define O_APPEND 02000 +#define O_NONBLOCK 04000 +#define O_NDELAY O_NONBLOCK +#define O_SYNC 04010000 +#define O_FSYNC O_SYNC +#define O_ASYNC 020000 diff --git a/src/include/linux/sys/mman.h b/src/include/linux/sys/mman.h new file mode 100644 index 0000000..ebd47a9 --- /dev/null +++ b/src/include/linux/sys/mman.h @@ -0,0 +1,44 @@ + +#pragma once + +#define MAP_32BIT 0x40 + +#define PROT_READ 0x1 +#define PROT_WRITE 0x2 +#define PROT_EXEC 0x4 +#define PROT_NONE 0x0 +#define PROT_GROWSDOWN 0x01000000 +#define PROT_GROWSUP 0x02000000 + +#define MAP_SHARED 0x01 +#define MAP_PRIVATE 0x02 +#define MAP_SHARED_VALIDATE 0x03 +#define MAP_TYPE 0x0f + +#define MAP_FIXED 0x10 +#define MAP_FILE 0 +#define MAP_ANONYMOUS +#define MAP_ANONYMOUS 0x20 +#define MAP_ANON MAP_ANONYMOUS +#define MAP_HUGE_SHIFT 26 +#define MAP_HUGE_MASK 0x3f + +#define MS_ASYNC 1 +#define MS_SYNC 4 +#define MS_INVALIDATE 2 + +#define MAP_FAILED ((void *) -1) + +#define MAP_GROWSDOWN 0x00100 +#define MAP_DENYWRITE 0x00800 +#define MAP_EXECUTABLE 0x01000 +#define MAP_LOCKED 0x02000 +#define MAP_NORESERVE 0x04000 +#define MAP_POPULATE 0x08000 +#define MAP_NONBLOCK 0x10000 +#define MAP_STACK 0x20000 +#define MAP_HUGETLB 0x40000 +#define MAP_SYNC 0x80000 +#define MAP_FIXED_NOREPLACE 0x100000 + + diff --git a/src/include/linux/sys/syscall.h b/src/include/linux/sys/syscall.h new file mode 100644 index 0000000..09dc612 --- /dev/null +++ b/src/include/linux/sys/syscall.h @@ -0,0 +1,418 @@ + +#pragma once + +#include + +// For now these definitions will live here +#if !defined(STDIN_FILENO) + #define STDIN_FILENO 0 + #define STDOUT_FILENO 1 + #define STDERR_FILENO 2 +#endif + +#define _SYSCALL0(n) _syscall0(n) +#define _SYSCALL1(n,p1) _syscall1(n, (i64)p1) +#define _SYSCALL2(n,p1,p2) _syscall2(n, (i64)p1, (i64)p2) +#define _SYSCALL3(n,p1,p2,p3) _syscall3(n, (i64)p1, (i64)p2, (i64)p3) +#define _SYSCALL4(n,p1,p2,p3,p4) _syscall4(n, (i64)p1, (i64)p2, (i64)p3, (i64)p4) +#define _SYSCALL5(n,p1,p2,p3,p4,p5) _syscall5(n, (i64)p1, (i64)p2, (i64)p3, (i64)p4, (i64)p5) +#define _SYSCALL6(n,p1,p2,p3,p4,p5,p6) _syscall6(n, (i64)p1, (i64)p2, (i64)p3, (i64)p4, (i64)p5, (i64)p6) + +#define _SYSCALL_NARGS(...) _SYSCALL_NARGS_(0, ## __VA_ARGS__, 6, 5, 4, 3, 2, 1, 0) +#define _SYSCALL_NARGS_(_0, _1_, _2_, _3_, _4_, _5_, _6_, count, ...) count +#define _SYSCALL_CONCAT(a, b) _SYSCALL_CONCAT_(a,b) +#define _SYSCALL_CONCAT_(a,b) a ## b + +// Creates an expression of the sort `_SYSCALL()` +#define syscall(n, ...) _SYSCALL_CONCAT(_SYSCALL, _SYSCALL_NARGS(__VA_ARGS__))(n, __VA_ARGS__) + +static inline i64 _syscall0(i64 n) { + i64 ret; + asm volatile("syscall" : "=a"(ret) : "a"(n) : "rcx", "r11", "memory"); + return ret; +} + +static inline i64 _syscall1(i64 n, i64 a1) { + i64 ret; + asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1) : "rcx", "r11", "memory"); + return ret; +} + +static inline i64 _syscall2(i64 n, i64 a1, i64 a2) { + i64 ret; + asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2) + : "rcx", "r11", "memory"); + return ret; +} + +static inline i64 _syscall3(i64 n, i64 a1, i64 a2, i64 a3) { + i64 ret; + asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), + "d"(a3) : "rcx", "r11", "memory"); + return ret; +} + +static inline i64 _syscall4(i64 n, i64 a1, i64 a2, i64 a3, i64 a4) { + i64 ret; + register i64 r10 asm("r10") = a4; + asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), + "d"(a3), "r"(r10): "rcx", "r11", "memory"); + return ret; +} + +static inline i64 _syscall5(i64 n, i64 a1, i64 a2, i64 a3, i64 a4, i64 a5) { + i64 ret; + register i64 r10 asm("r10") = a4; + register i64 r8 asm("r8") = a5; + asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), + "d"(a3), "r"(r10), "r"(r8) : "rcx", "r11", "memory"); + return ret; +} + +static inline i64 _syscall6(i64 n, i64 a1, i64 a2, i64 a3, i64 a4, i64 a5, i64 a6) { + i64 ret; + register i64 r10 asm("r10") = a4; + register i64 r8 asm("r8") = a5; + register i64 r9 asm("r9") = a6; + asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), + "d"(a3), "r"(r10), "r"(r8), "r"(r9) : "rcx", "r11", "memory"); + return ret; +} + +// Syscall numbers +#define SYS_read 0 +#define SYS_write 1 +#define SYS_open 2 +#define SYS_close 3 +#define SYS_stat 4 +#define SYS_fstat 5 +#define SYS_lstat 6 +#define SYS_poll 7 +#define SYS_lseek 8 +#define SYS_mmap 9 +#define SYS_mprotect 10 +#define SYS_munmap 11 +#define SYS_brk 12 +#define SYS_rt_sigaction 13 +#define SYS_rt_sigprocmask 14 +#define SYS_rt_sigreturn 15 +#define SYS_ioctl 16 +#define SYS_pread64 17 +#define SYS_pwrite64 18 +#define SYS_readv 19 +#define SYS_writev 20 +#define SYS_access 21 +#define SYS_pipe 22 +#define SYS_select 23 +#define SYS_sched_yield 24 +#define SYS_mremap 25 +#define SYS_msync 26 +#define SYS_mincore 27 +#define SYS_madvise 28 +#define SYS_shmget 29 +#define SYS_shmat 30 +#define SYS_shmctl 31 +#define SYS_dup 32 +#define SYS_dup2 33 +#define SYS_pause 34 +#define SYS_nanosleep 35 +#define SYS_getitimer 36 +#define SYS_alarm 37 +#define SYS_setitimer 38 +#define SYS_getpid 39 +#define SYS_sendfile 40 +#define SYS_socket 41 +#define SYS_connect 42 +#define SYS_accept 43 +#define SYS_sendto 44 +#define SYS_recvfrom 45 +#define SYS_sendmsg 46 +#define SYS_recvmsg 47 +#define SYS_shutdown 48 +#define SYS_bind 49 +#define SYS_listen 50 +#define SYS_getsockname 51 +#define SYS_getpeername 52 +#define SYS_socketpair 53 +#define SYS_setsockopt 54 +#define SYS_getsockopt 55 +#define SYS_clone 56 +#define SYS_fork 57 +#define SYS_vfork 58 +#define SYS_execve 59 +#define SYS_exit 60 +#define SYS_wait4 61 +#define SYS_kill 62 +#define SYS_uname 63 +#define SYS_semget 64 +#define SYS_semop 65 +#define SYS_semctl 66 +#define SYS_shmdt 67 +#define SYS_msgget 68 +#define SYS_msgsnd 69 +#define SYS_msgrcv 70 +#define SYS_msgctl 71 +#define SYS_fcntl 72 +#define SYS_flock 73 +#define SYS_fsync 74 +#define SYS_fdatasync 75 +#define SYS_truncate 76 +#define SYS_ftruncate 77 +#define SYS_getdents 78 +#define SYS_getcwd 79 +#define SYS_chdir 80 +#define SYS_fchdir 81 +#define SYS_rename 82 +#define SYS_mkdir 83 +#define SYS_rmdir 84 +#define SYS_creat 85 +#define SYS_link 86 +#define SYS_unlink 87 +#define SYS_symlink 88 +#define SYS_readlink 89 +#define SYS_chmod 90 +#define SYS_fchmod 91 +#define SYS_chown 92 +#define SYS_fchown 93 +#define SYS_lchown 94 +#define SYS_umask 95 +#define SYS_gettimeofday 96 +#define SYS_getrlimit 97 +#define SYS_getrusage 98 +#define SYS_sysinfo 99 +#define SYS_times 100 +#define SYS_ptrace 101 +#define SYS_getuid 102 +#define SYS_syslog 103 +#define SYS_getgid 104 +#define SYS_setuid 105 +#define SYS_setgid 106 +#define SYS_geteuid 107 +#define SYS_getegid 108 +#define SYS_setpgid 109 +#define SYS_getppid 110 +#define SYS_getpgrp 111 +#define SYS_setsid 112 +#define SYS_setreuid 113 +#define SYS_setregid 114 +#define SYS_getgroups 115 +#define SYS_setgroups 116 +#define SYS_setresuid 117 +#define SYS_getresuid 118 +#define SYS_setresgid 119 +#define SYS_getresgid 120 +#define SYS_getpgid 121 +#define SYS_setfsuid 122 +#define SYS_setfsgid 123 +#define SYS_getsid 124 +#define SYS_capget 125 +#define SYS_capset 126 +#define SYS_rt_sigpending 127 +#define SYS_rt_sigtimedwait 128 +#define SYS_rt_sigqueueinfo 129 +#define SYS_rt_sigsuspend 130 +#define SYS_sigaltstack 131 +#define SYS_utime 132 +#define SYS_mknod 133 +#define SYS_uselib 134 +#define SYS_personality 135 +#define SYS_ustat 136 +#define SYS_statfs 137 +#define SYS_fstatfs 138 +#define SYS_sysfs 139 +#define SYS_getpriority 140 +#define SYS_setpriority 141 +#define SYS_sched_setparam 142 +#define SYS_sched_getparam 143 +#define SYS_sched_setscheduler 144 +#define SYS_sched_getscheduler 145 +#define SYS_sched_get_priority_max 146 +#define SYS_sched_get_priority_min 147 +#define SYS_sched_rr_get_interval 148 +#define SYS_mlock 149 +#define SYS_munlock 150 +#define SYS_mlockall 151 +#define SYS_munlockall 152 +#define SYS_vhangup 153 +#define SYS_modify_ldt 154 +#define SYS_pivot_root 155 +#define SYS__sysctl 156 +#define SYS_prctl 157 +#define SYS_arch_prctl 158 +#define SYS_adjtimex 159 +#define SYS_setrlimit 160 +#define SYS_chroot 161 +#define SYS_sync 162 +#define SYS_acct 163 +#define SYS_settimeofday 164 +#define SYS_mount 165 +#define SYS_umount2 166 +#define SYS_swapon 167 +#define SYS_swapoff 168 +#define SYS_reboot 169 +#define SYS_sethostname 170 +#define SYS_setdomainname 171 +#define SYS_iopl 172 +#define SYS_ioperm 173 +#define SYS_create_module 174 +#define SYS_init_module 175 +#define SYS_delete_module 176 +#define SYS_get_kernel_syms 177 +#define SYS_query_module 178 +#define SYS_quotactl 179 +#define SYS_nfsservctl 180 +#define SYS_getpmsg 181 +#define SYS_putpmsg 182 +#define SYS_afs_syscall 183 +#define SYS_tuxcall 184 +#define SYS_security 185 +#define SYS_gettid 186 +#define SYS_readahead 187 +#define SYS_setxattr 188 +#define SYS_lsetxattr 189 +#define SYS_fsetxattr 190 +#define SYS_getxattr 191 +#define SYS_lgetxattr 192 +#define SYS_fgetxattr 193 +#define SYS_listxattr 194 +#define SYS_llistxattr 195 +#define SYS_flistxattr 196 +#define SYS_removexattr 197 +#define SYS_lremovexattr 198 +#define SYS_fremovexattr 199 +#define SYS_tkill 200 +#define SYS_time 201 +#define SYS_futex 202 +#define SYS_sched_setaffinity 203 +#define SYS_sched_getaffinity 204 +#define SYS_set_thread_area 205 +#define SYS_io_setup 206 +#define SYS_io_destroy 207 +#define SYS_io_getevents 208 +#define SYS_io_submit 209 +#define SYS_io_cancel 210 +#define SYS_get_thread_area 211 +#define SYS_lookup_dcookie 212 +#define SYS_epoll_create 213 +#define SYS_epoll_ctl_old 214 +#define SYS_epoll_wait_old 215 +#define SYS_remap_file_pages 216 +#define SYS_getdents64 217 +#define SYS_set_tid_address 218 +#define SYS_restart_syscall 219 +#define SYS_semtimedop 220 +#define SYS_fadvise64 221 +#define SYS_timer_create 222 +#define SYS_timer_settime 223 +#define SYS_timer_gettime 224 +#define SYS_timer_getoverrun 225 +#define SYS_timer_delete 226 +#define SYS_clock_settime 227 +#define SYS_clock_gettime 228 +#define SYS_clock_getres 229 +#define SYS_clock_nanosleep 230 +#define SYS_exit_group 231 +#define SYS_epoll_wait 232 +#define SYS_epoll_ctl 233 +#define SYS_tgkill 234 +#define SYS_utimes 235 +#define SYS_vserver 236 +#define SYS_mbind 237 +#define SYS_set_mempolicy 238 +#define SYS_get_mempolicy 239 +#define SYS_mq_open 240 +#define SYS_mq_unlink 241 +#define SYS_mq_timedsend 242 +#define SYS_mq_timedreceive 243 +#define SYS_mq_notify 244 +#define SYS_mq_getsetattr 245 +#define SYS_kexec_load 246 +#define SYS_waitid 247 +#define SYS_add_key 248 +#define SYS_request_key 249 +#define SYS_keyctl 250 +#define SYS_ioprio_set 251 +#define SYS_ioprio_get 252 +#define SYS_inotify_init 253 +#define SYS_inotify_add_watch 254 +#define SYS_inotify_rm_watch 255 +#define SYS_migrate_pages 256 +#define SYS_openat 257 +#define SYS_mkdirat 258 +#define SYS_mknodat 259 +#define SYS_fchownat 260 +#define SYS_futimesat 261 +#define SYS_newfstatat 262 +#define SYS_unlinkat 263 +#define SYS_renameat 264 +#define SYS_linkat 265 +#define SYS_symlinkat 266 +#define SYS_readlinkat 267 +#define SYS_fchmodat 268 +#define SYS_faccessat 269 +#define SYS_pselect6 270 +#define SYS_ppoll 271 +#define SYS_unshare 272 +#define SYS_set_robust_list 273 +#define SYS_get_robust_list 274 +#define SYS_splice 275 +#define SYS_tee 276 +#define SYS_sync_file_range 277 +#define SYS_vmsplice 278 +#define SYS_move_pages 279 +#define SYS_utimensat 280 +#define SYS_epoll_pwait 281 +#define SYS_signalfd 282 +#define SYS_timerfd_create 283 +#define SYS_eventfd 284 +#define SYS_fallocate 285 +#define SYS_timerfd_settime 286 +#define SYS_timerfd_gettime 287 +#define SYS_accept4 288 +#define SYS_signalfd4 289 +#define SYS_eventfd2 290 +#define SYS_epoll_create1 291 +#define SYS_dup3 292 +#define SYS_pipe2 293 +#define SYS_inotify_init1 294 +#define SYS_preadv 295 +#define SYS_pwritev 296 +#define SYS_rt_tgsigqueueinfo 297 +#define SYS_perf_event_open 298 + +static inline i64 sys_read(u32 fd, char *buf, u64 count) { + return syscall(SYS_read, fd, buf, count); +} + +static inline i64 sys_write(u32 fd, char const *buf, u64 count) { + return syscall(SYS_write, fd, buf, count); +} + +static inline i64 sys_open(char const *filename, int flags, int mode) { + return syscall(SYS_open, filename, flags, mode); +} + +static inline i64 sys_close(u32 fd) { + return syscall(SYS_close, fd); +} + +static inline void *sys_mmap(u64 addr, u64 len, u64 prot, u64 flags, u64 fd, u64 offset) { + return (void *)syscall(SYS_mmap, addr, len, prot, flags, fd, offset); +} + +static inline i64 sys_munmap(void *addr, u64 len) { + return syscall(SYS_munmap, addr, len); +} + +_Noreturn static inline void sys_exit(int code) { + syscall(SYS_exit, code); + __builtin_unreachable(); +} + +static inline i64 sys_arch_prctl_set(int code, u64 value) { + return syscall(SYS_arch_prctl, code, value); +} + +static inline i64 sys_arch_prctl_get(int code, u64 *value) { + return syscall(SYS_arch_prctl, code, value); +} diff --git a/src/library.json b/src/library.json index 07fcd56..0aa9a3c 100644 --- a/src/library.json +++ b/src/library.json @@ -32,8 +32,10 @@ platforms: [ name: "linux", path: "linux", includes: [ - "syscall.c", - "entry.c" + "entry.c", + "errno.h", + "mman.h", + "fcntl.h" ], tinyrt: [ "tinyrt.c" diff --git a/src/linux/entry.c b/src/linux/entry.c index 319db57..1adbdcf 100644 --- a/src/linux/entry.c +++ b/src/linux/entry.c @@ -1,4 +1,5 @@ +#include static char stack_chk_fail_msg[] = "Stack check failed. " @@ -6,8 +7,8 @@ static char stack_chk_fail_msg[] = "Sorry these guys didn't tell me where\n"; void __stack_chk_fail(void) { - _syscall_write(STDERR_FILENO, stack_chk_fail_msg, sizeof stack_chk_fail_msg); - _syscall_exit(1); + sys_write(STDERR_FILENO, stack_chk_fail_msg, sizeof stack_chk_fail_msg); + sys_exit(1); } static void _fileapi_init(); @@ -28,5 +29,5 @@ void __libc_start_main( fini(); // glibc bug // dl_fini(); - _syscall_exit(0); + sys_exit(0); } diff --git a/src/linux/syscall.c b/src/linux/syscall.c deleted file mode 100644 index 89923ae..0000000 --- a/src/linux/syscall.c +++ /dev/null @@ -1,197 +0,0 @@ - -#include -#include -#include -#include -#include -#include -#include -#include - -#if !defined(STDIN_FILENO) - #define STDIN_FILENO 0 - #define STDOUT_FILENO 1 - #define STDERR_FILENO 2 -#endif - -#if !defined(MAP_SHARED) - #define MAP_SHARED 0x01 - #define MAP_PRIVATE 0x02 - #define MAP_SHARED_VALIDATE 0x03 -#endif - -#if !defined(MAP_FAILED) - #define MAP_FAILED ((void *)-1) -#endif - -// NOTE(bumbread): These are architecture-specific -#if !defined(O_RDONLY) - #define O_RDONLY 0 - #define O_WRONLY 1 - #define O_RDWR 2 - #define O_CREAT 0x40 - #define O_EXCL 0x80 - #define O_NOCTTY 0x100 - #define O_TRUNC 0x200 - #define O_APPEND 0x400 - #define O_NONBLOCK 0x800 - #define O_DIRECTORY 0x10000 -#endif - -#define _SYSCALL_read 0 -#define _SYSCALL_write 1 -#define _SYSCALL_open 2 -#define _SYSCALL_close 3 -#define _SYSCALL_stat 4 -#define _SYSCALL_fstat 5 -#define _SYSCALL_lstat 6 -#define _SYSCALL_poll 7 -#define _SYSCALL_lseek 8 -#define _SYSCALL_mmap 9 -#define _SYSCALL_mprotect 10 -#define _SYSCALL_munmap 11 -#define _SYSCALL_brk 12 -#define _SYSCALL_rt_sigaction 13 -#define _SYSCALL_rt_sigprocmask 14 -#define _SYSCALL_rt_sigreturn 15 -#define _SYSCALL_ioctl 16 -#define _SYSCALL_pread64 17 -#define _SYSCALL_pwrite64 18 -#define _SYSCALL_readv 19 -#define _SYSCALL_writev 20 -#define _SYSCALL_access 21 -#define _SYSCALL_pipe 22 -#define _SYSCALL_select 23 -#define _SYSCALL_sched_yield 24 -#define _SYSCALL_mremap 25 -#define _SYSCALL_msync 26 -#define _SYSCALL_mincore 27 -#define _SYSCALL_madvise 28 -#define _SYSCALL_shmget 29 -#define _SYSCALL_shmat 30 -#define _SYSCALL_shmctl 31 -#define _SYSCALL_dup 32 -#define _SYSCALL_dup2 33 -#define _SYSCALL_pause 34 -#define _SYSCALL_nanosleep 35 -#define _SYSCALL_getitimer 36 -#define _SYSCALL_alarm 37 -#define _SYSCALL_setitimer 38 -#define _SYSCALL_getpid 39 -#define _SYSCALL_sendfile 40 -#define _SYSCALL_socket 41 -#define _SYSCALL_connect 42 -#define _SYSCALL_accept 43 -#define _SYSCALL_sendto 44 -#define _SYSCALL_recvfrom 45 -#define _SYSCALL_sendmsg 46 -#define _SYSCALL_recvmsg 47 -#define _SYSCALL_shutdown 48 -#define _SYSCALL_bind 49 -#define _SYSCALL_listen 50 -#define _SYSCALL_getsockname 51 -#define _SYSCALL_getpeername 52 -#define _SYSCALL_socketpair 53 -#define _SYSCALL_setsockopt 54 -#define _SYSCALL_getsockopt 55 -#define _SYSCALL_clone 56 -#define _SYSCALL_fork 57 -#define _SYSCALL_vfork 58 -#define _SYSCALL_execve 59 -#define _SYSCALL_exit 60 - -#define _SYSCALL_arch_prctl 158 - -// Syscall stubs - -static inline i64 _syscall0(i64 n) { - i64 ret; - asm volatile("syscall" : "=a"(ret) : "a"(n) : "rcx", "r11", "memory"); - return ret; -} - -static inline i64 _syscall1(i64 n, i64 a1) { - i64 ret; - asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1) : "rcx", "r11", "memory"); - return ret; -} - -static inline i64 _syscall2(i64 n, i64 a1, i64 a2) { - i64 ret; - asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2) - : "rcx", "r11", "memory"); - return ret; -} - -static inline i64 _syscall3(i64 n, i64 a1, i64 a2, i64 a3) { - i64 ret; - asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3) : "rcx", "r11", "memory"); - return ret; -} - -static inline i64 _syscall4(i64 n, i64 a1, i64 a2, i64 a3, i64 a4) { - i64 ret; - register i64 r10 asm("r10") = a4; - asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3), "r"(r10): "rcx", "r11", "memory"); - return ret; -} - -static inline i64 _syscall5(i64 n, i64 a1, i64 a2, i64 a3, i64 a4, i64 a5) { - i64 ret; - register i64 r10 asm("r10") = a4; - register i64 r8 asm("r8") = a5; - asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3), "r"(r10), "r"(r8) : "rcx", "r11", "memory"); - return ret; -} - -static inline i64 _syscall6(i64 n, i64 a1, i64 a2, i64 a3, i64 a4, i64 a5, i64 a6) { - i64 ret; - register i64 r10 asm("r10") = a4; - register i64 r8 asm("r8") = a5; - register i64 r9 asm("r9") = a6; - asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3), "r"(r10), "r"(r8), "r"(r9) : "rcx", "r11", "memory"); - return ret; -} - -// Syscall wrappers - -static inline i64 _syscall_read(u32 fd, char *buf, u64 count) { - return _syscall3(_SYSCALL_read, (i64)fd, (i64)buf, (i64)count); -} - -static inline i64 _syscall_write(u32 fd, char const *buf, u64 count) { - return _syscall3(_SYSCALL_write, (i64)fd, (i64)buf, (u64)count); -} - -static inline i64 _syscall_open(char const *filename, int flags, int mode) { - return _syscall3(_SYSCALL_open, (i64)filename, (i64)flags, (i64)mode); -} - -static inline i64 _syscall_close(u32 fd) { - return _syscall1(_SYSCALL_close, fd); -} - -static inline void *_syscall_mmap(u64 addr, u64 len, u64 prot, u64 flags, u64 fd, u64 offset) { - return (void *)_syscall6(_SYSCALL_mmap, addr, len, prot, flags, fd, offset); -} - -static inline i64 _syscall_munmap(void *addr, u64 len) { - return _syscall2(_SYSCALL_munmap, (u64)addr, len); -} - -_Noreturn static inline void _syscall_exit(int code) { - _syscall1(_SYSCALL_exit, (i64)code); - __builtin_unreachable(); -} - -static inline i64 _syscall_arch_prctl_set(int code, u64 value) { - return _syscall2(_SYSCALL_arch_prctl, code, (i64)value); -} - -static inline i64 _syscall_arch_prctl_get(int code, u64 *value) { - return _syscall2(_SYSCALL_arch_prctl, code, (i64)value); -} diff --git a/src/linux/tinyrt.c b/src/linux/tinyrt.c index 8bc83ae..2aabcd4 100644 --- a/src/linux/tinyrt.c +++ b/src/linux/tinyrt.c @@ -23,7 +23,7 @@ static _RT_Status _rt_file_open(_RT_File *file, char const *name, int _rt_flags) if(_rt_flags & _RT_FILE_CREATE) flags |= O_CREAT; if(_rt_flags & _RT_FILE_EXCLUSIVE) flags |= O_EXCL; if(_rt_flags & _RT_FILE_TRUNCATE) flags |= O_TRUNC; - i64 fd = _syscall_open(name, flags, mode); + i64 fd = sys_open(name, flags, mode); if(-fd == EACCES) return _RT_STATUS_FILE_ACCESS; if(-fd == EEXIST) return _RT_STATUS_FILE_EXISTS; if(-fd == ENOENT) return _RT_STATUS_FILE_NOT_EXISTS; @@ -37,7 +37,7 @@ static _RT_Status _rt_file_open(_RT_File *file, char const *name, int _rt_flags) } static _RT_Status _rt_file_read(u64 size, void *buffer, _RT_File *from, u64 *out_bytes_read) { - i64 bytes_read = _syscall_read(from->fd, buffer, size); + i64 bytes_read = sys_read(from->fd, buffer, size); if(bytes_read == 0) { return _RT_STATUS_FILE_EOF; } @@ -49,7 +49,7 @@ static _RT_Status _rt_file_read(u64 size, void *buffer, _RT_File *from, u64 *out } static _RT_Status _rt_file_write(_RT_File *to, u64 size, void *buffer, u64 *out_bytes_written) { - i64 status = _syscall_write(to->fd, buffer, size); + i64 status = sys_write(to->fd, buffer, size); if(-status == EBADF) return _RT_ERROR_BAD_PARAM; if(-status == EIO) return _RT_STATUS_FILE_IO_ERROR; if(-status > 0) return _RT_STATUS_FILE_IO_ERROR; @@ -58,7 +58,7 @@ static _RT_Status _rt_file_write(_RT_File *to, u64 size, void *buffer, u64 *out_ } static _RT_Status _rt_file_close(_RT_File *file) { - i64 result = _syscall_close(file->fd); + i64 result = sys_close(file->fd); if(result < 0) { return _RT_STATUS_FILE_IO_ERROR; } @@ -66,11 +66,11 @@ static _RT_Status _rt_file_close(_RT_File *file) { } _Noreturn static void _rt_program_exit(int code) { - _syscall_exit(code); + sys_exit(code); } static _RT_Status _rt_mem_alloc(void *optional_desired_addr, u64 size, void **out_addr) { - void *addr = _syscall_mmap((u64)optional_desired_addr, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + void *addr = sys_mmap((u64)optional_desired_addr, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); if(addr == NULL) { return _RT_ERROR_GENERIC; } @@ -79,7 +79,7 @@ static _RT_Status _rt_mem_alloc(void *optional_desired_addr, u64 size, void **ou } static _RT_Status _rt_mem_free(void *ptr, u64 len) { - i64 result = _syscall_munmap(ptr, len); + i64 result = sys_munmap(ptr, len); if(result == -1) { return _RT_ERROR_GENERIC; } diff --git a/src/loader/loader-self-reloc.c b/src/loader/loader-self-reloc.c index 25f5576..cff616d 100644 --- a/src/loader/loader-self-reloc.c +++ b/src/loader/loader-self-reloc.c @@ -1,25 +1,28 @@ +// Stage 2 of the dynamic loader +// the purpose of this module is to relocate itself +// and jump to the main body of the loader. + +// Note that loader-entry.asm doesn't "jump" into +// the entry point of this module, but rather +// "falls-through". Which means the sections +// of this module and the module above must be +// contiguous, which we do by doing linker magic + +// This also means that this module CANNOT have +// any externally-defined functions (static functions +// are fine with gcc and clang (I think)) + #include -#include #include -#include "syscall.c" +#include #define AUX_CNT 32 #define DYN_CNT 37 -struct Elf_Image typedef Elf_Image; -struct Elf_Image { - u8 *base; - u8 *phdr; - u64 ph_num; - u64 ph_ent; - char *name; -}; - -#define laddr(elf, off) (void *)((elf)->base + off) - +#include static void _dbg_print_char(char c) { - _syscall_write(STDOUT_FILENO, &c, 1); + sys_write(STDOUT_FILENO, &c, 1); } static void _dbg_print_string(char *str) { @@ -27,11 +30,11 @@ static void _dbg_print_string(char *str) { while(str[str_len] != 0) { str_len += 1; } - _syscall_write(STDOUT_FILENO, str, str_len); + sys_write(STDOUT_FILENO, str, str_len); } static void _dbg_print_string_n(char *str, u64 len) { - _syscall_write(STDOUT_FILENO, str, len); + sys_write(STDOUT_FILENO, str, len); } static void _dbg_print_int(i64 number) { @@ -267,6 +270,6 @@ void _dlstart_reloc_c(u64 *sp, Elf64_Dyn *dynv) { } _dbg_printf("Self-relocation finished. Entering the loader\n"); loader_entry(sp, dyn, aux); - _syscall_exit(0); + sys_exit(0); } diff --git a/src/loader/loader.c b/src/loader/loader.c index 7d784f9..2b94eb9 100644 --- a/src/loader/loader.c +++ b/src/loader/loader.c @@ -1,10 +1,19 @@ #include #include -#include "syscall.c" +#include + +struct Elf_Image typedef Elf_Image; +struct Elf_Image { + u8 *base; + u8 *phdr; + u64 ph_num; + u64 ph_ent; + char *name; +}; void loader_entry(u64 *sp, u64 *dynv, u64 *aux) { char str[] = "Hello world??\n"; - _syscall_write(STDOUT_FILENO, str, sizeof str); - _syscall_exit(0); + sys_write(STDOUT_FILENO, str, sizeof str); + sys_exit(0); } diff --git a/src/loader/syscall.c b/src/loader/syscall.c deleted file mode 100644 index a374b82..0000000 --- a/src/loader/syscall.c +++ /dev/null @@ -1,198 +0,0 @@ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if !defined(STDIN_FILENO) - #define STDIN_FILENO 0 - #define STDOUT_FILENO 1 - #define STDERR_FILENO 2 -#endif - -#if !defined(MAP_SHARED) - #define MAP_SHARED 0x01 - #define MAP_PRIVATE 0x02 - #define MAP_SHARED_VALIDATE 0x03 -#endif - -#if !defined(MAP_FAILED) - #define MAP_FAILED ((void *)-1) -#endif - -// NOTE(bumbread): These are architecture-specific -#if !defined(O_RDONLY) - #define O_RDONLY 0 - #define O_WRONLY 1 - #define O_RDWR 2 - #define O_CREAT 0x40 - #define O_EXCL 0x80 - #define O_NOCTTY 0x100 - #define O_TRUNC 0x200 - #define O_APPEND 0x400 - #define O_NONBLOCK 0x800 - #define O_DIRECTORY 0x10000 -#endif - -#define _SYSCALL_read 0 -#define _SYSCALL_write 1 -#define _SYSCALL_open 2 -#define _SYSCALL_close 3 -#define _SYSCALL_stat 4 -#define _SYSCALL_fstat 5 -#define _SYSCALL_lstat 6 -#define _SYSCALL_poll 7 -#define _SYSCALL_lseek 8 -#define _SYSCALL_mmap 9 -#define _SYSCALL_mprotect 10 -#define _SYSCALL_munmap 11 -#define _SYSCALL_brk 12 -#define _SYSCALL_rt_sigaction 13 -#define _SYSCALL_rt_sigprocmask 14 -#define _SYSCALL_rt_sigreturn 15 -#define _SYSCALL_ioctl 16 -#define _SYSCALL_pread64 17 -#define _SYSCALL_pwrite64 18 -#define _SYSCALL_readv 19 -#define _SYSCALL_writev 20 -#define _SYSCALL_access 21 -#define _SYSCALL_pipe 22 -#define _SYSCALL_select 23 -#define _SYSCALL_sched_yield 24 -#define _SYSCALL_mremap 25 -#define _SYSCALL_msync 26 -#define _SYSCALL_mincore 27 -#define _SYSCALL_madvise 28 -#define _SYSCALL_shmget 29 -#define _SYSCALL_shmat 30 -#define _SYSCALL_shmctl 31 -#define _SYSCALL_dup 32 -#define _SYSCALL_dup2 33 -#define _SYSCALL_pause 34 -#define _SYSCALL_nanosleep 35 -#define _SYSCALL_getitimer 36 -#define _SYSCALL_alarm 37 -#define _SYSCALL_setitimer 38 -#define _SYSCALL_getpid 39 -#define _SYSCALL_sendfile 40 -#define _SYSCALL_socket 41 -#define _SYSCALL_connect 42 -#define _SYSCALL_accept 43 -#define _SYSCALL_sendto 44 -#define _SYSCALL_recvfrom 45 -#define _SYSCALL_sendmsg 46 -#define _SYSCALL_recvmsg 47 -#define _SYSCALL_shutdown 48 -#define _SYSCALL_bind 49 -#define _SYSCALL_listen 50 -#define _SYSCALL_getsockname 51 -#define _SYSCALL_getpeername 52 -#define _SYSCALL_socketpair 53 -#define _SYSCALL_setsockopt 54 -#define _SYSCALL_getsockopt 55 -#define _SYSCALL_clone 56 -#define _SYSCALL_fork 57 -#define _SYSCALL_vfork 58 -#define _SYSCALL_execve 59 -#define _SYSCALL_exit 60 - -#define _SYSCALL_arch_prctl 158 - -// Syscall stubs - -static inline i64 _syscall0(i64 n) { - i64 ret; - asm volatile("syscall" : "=a"(ret) : "a"(n) : "rcx", "r11", "memory"); - return ret; -} - -static inline i64 _syscall1(i64 n, i64 a1) { - i64 ret; - asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1) : "rcx", "r11", "memory"); - return ret; -} - -static inline i64 _syscall2(i64 n, i64 a1, i64 a2) { - i64 ret; - asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2) - : "rcx", "r11", "memory"); - return ret; -} - -static inline i64 _syscall3(i64 n, i64 a1, i64 a2, i64 a3) { - i64 ret; - asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3) : "rcx", "r11", "memory"); - return ret; -} - -static inline i64 _syscall4(i64 n, i64 a1, i64 a2, i64 a3, i64 a4) { - i64 ret; - register i64 r10 asm("r10") = a4; - asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3), "r"(r10): "rcx", "r11", "memory"); - return ret; -} - -static inline i64 _syscall5(i64 n, i64 a1, i64 a2, i64 a3, i64 a4, i64 a5) { - i64 ret; - register i64 r10 asm("r10") = a4; - register i64 r8 asm("r8") = a5; - asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3), "r"(r10), "r"(r8) : "rcx", "r11", "memory"); - return ret; -} - -static inline i64 _syscall6(i64 n, i64 a1, i64 a2, i64 a3, i64 a4, i64 a5, i64 a6) { - i64 ret; - register i64 r10 asm("r10") = a4; - register i64 r8 asm("r8") = a5; - register i64 r9 asm("r9") = a6; - asm volatile("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3), "r"(r10), "r"(r8), "r"(r9) : "rcx", "r11", "memory"); - return ret; -} - -// Syscall wrappers - -static inline i64 _syscall_read(u32 fd, char *buf, u64 count) { - return _syscall3(_SYSCALL_read, (i64)fd, (i64)buf, (i64)count); -} - -static inline i64 _syscall_write(u32 fd, char const *buf, u64 count) { - return _syscall3(_SYSCALL_write, (i64)fd, (i64)buf, (u64)count); -} - -static inline i64 _syscall_open(char const *filename, int flags, int mode) { - return _syscall3(_SYSCALL_open, (i64)filename, (i64)flags, (i64)mode); -} - -static inline i64 _syscall_close(u32 fd) { - return _syscall1(_SYSCALL_close, fd); -} - -static inline void *_syscall_mmap(u64 addr, u64 len, u64 prot, u64 flags, u64 fd, u64 offset) { - return (void *)_syscall6(_SYSCALL_mmap, addr, len, prot, flags, fd, offset); -} - -static inline i64 _syscall_munmap(void *addr, u64 len) { - return _syscall2(_SYSCALL_munmap, (u64)addr, len); -} - -_Noreturn static inline void _syscall_exit(int code) { - _syscall1(_SYSCALL_exit, (i64)code); - __builtin_unreachable(); -} - -static inline i64 _syscall_arch_prctl_set(int code, u64 value) { - return _syscall2(_SYSCALL_arch_prctl, code, (i64)value); -} - -static inline i64 _syscall_arch_prctl_get(int code, u64 *value) { - return _syscall2(_SYSCALL_arch_prctl, code, (i64)value); -}