Custom linux headers

This commit is contained in:
flysand7 2023-08-04 05:36:03 +11:00
parent 14c36e203e
commit a812a18033
12 changed files with 693 additions and 427 deletions

View File

@ -86,6 +86,9 @@ else: # 'debug'
if target != 'windows': if target != 'windows':
cc_flags.append('-fpic') cc_flags.append('-fpic')
if target == 'linux':
includes.append('src/include/linux')
# Check dependencies # Check dependencies
print_step('Checking dependencies... ') print_step('Checking dependencies... ')
for dependency in dependencies: for dependency in dependencies:

164
src/include/errno.h Normal file
View File

@ -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

17
src/include/linux/fcntl.h Normal file
View File

@ -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

View File

@ -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

View File

@ -0,0 +1,418 @@
#pragma once
#include <cia-def.h>
// 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<number of params>(<params>)`
#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);
}

View File

@ -32,8 +32,10 @@ platforms: [
name: "linux", name: "linux",
path: "linux", path: "linux",
includes: [ includes: [
"syscall.c", "entry.c",
"entry.c" "errno.h",
"mman.h",
"fcntl.h"
], ],
tinyrt: [ tinyrt: [
"tinyrt.c" "tinyrt.c"

View File

@ -1,4 +1,5 @@
#include <syscall.h>
static char stack_chk_fail_msg[] = static char stack_chk_fail_msg[] =
"Stack check failed. " "Stack check failed. "
@ -6,8 +7,8 @@ static char stack_chk_fail_msg[] =
"Sorry these guys didn't tell me where\n"; "Sorry these guys didn't tell me where\n";
void __stack_chk_fail(void) { void __stack_chk_fail(void) {
_syscall_write(STDERR_FILENO, stack_chk_fail_msg, sizeof stack_chk_fail_msg); sys_write(STDERR_FILENO, stack_chk_fail_msg, sizeof stack_chk_fail_msg);
_syscall_exit(1); sys_exit(1);
} }
static void _fileapi_init(); static void _fileapi_init();
@ -28,5 +29,5 @@ void __libc_start_main(
fini(); fini();
// glibc bug // glibc bug
// dl_fini(); // dl_fini();
_syscall_exit(0); sys_exit(0);
} }

View File

@ -1,197 +0,0 @@
#include <asm/unistd.h>
#include <asm/signal.h>
#include <asm/ioctls.h>
#include <asm/mman.h>
#include <linux/fs.h>
#include <linux/loop.h>
#include <linux/time.h>
#include <errno.h>
#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);
}

View File

@ -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_CREATE) flags |= O_CREAT;
if(_rt_flags & _RT_FILE_EXCLUSIVE) flags |= O_EXCL; if(_rt_flags & _RT_FILE_EXCLUSIVE) flags |= O_EXCL;
if(_rt_flags & _RT_FILE_TRUNCATE) flags |= O_TRUNC; 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 == EACCES) return _RT_STATUS_FILE_ACCESS;
if(-fd == EEXIST) return _RT_STATUS_FILE_EXISTS; if(-fd == EEXIST) return _RT_STATUS_FILE_EXISTS;
if(-fd == ENOENT) return _RT_STATUS_FILE_NOT_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) { 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) { if(bytes_read == 0) {
return _RT_STATUS_FILE_EOF; 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) { 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 == EBADF) return _RT_ERROR_BAD_PARAM;
if(-status == EIO) return _RT_STATUS_FILE_IO_ERROR; if(-status == EIO) return _RT_STATUS_FILE_IO_ERROR;
if(-status > 0) 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) { static _RT_Status _rt_file_close(_RT_File *file) {
i64 result = _syscall_close(file->fd); i64 result = sys_close(file->fd);
if(result < 0) { if(result < 0) {
return _RT_STATUS_FILE_IO_ERROR; 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) { _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) { 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) { if(addr == NULL) {
return _RT_ERROR_GENERIC; 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) { 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) { if(result == -1) {
return _RT_ERROR_GENERIC; return _RT_ERROR_GENERIC;
} }

View File

@ -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 <cia-def.h> #include <cia-def.h>
#include <stdarg.h>
#include <bin/elf.h> #include <bin/elf.h>
#include "syscall.c" #include <sys/syscall.h>
#define AUX_CNT 32 #define AUX_CNT 32
#define DYN_CNT 37 #define DYN_CNT 37
struct Elf_Image typedef Elf_Image; #include <stdarg.h>
struct Elf_Image {
u8 *base;
u8 *phdr;
u64 ph_num;
u64 ph_ent;
char *name;
};
#define laddr(elf, off) (void *)((elf)->base + off)
static void _dbg_print_char(char c) { 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) { static void _dbg_print_string(char *str) {
@ -27,11 +30,11 @@ static void _dbg_print_string(char *str) {
while(str[str_len] != 0) { while(str[str_len] != 0) {
str_len += 1; 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) { 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) { 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"); _dbg_printf("Self-relocation finished. Entering the loader\n");
loader_entry(sp, dyn, aux); loader_entry(sp, dyn, aux);
_syscall_exit(0); sys_exit(0);
} }

View File

@ -1,10 +1,19 @@
#include <cia-def.h> #include <cia-def.h>
#include <bin/elf.h> #include <bin/elf.h>
#include "syscall.c" #include <sys/syscall.h>
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) { void loader_entry(u64 *sp, u64 *dynv, u64 *aux) {
char str[] = "Hello world??\n"; char str[] = "Hello world??\n";
_syscall_write(STDOUT_FILENO, str, sizeof str); sys_write(STDOUT_FILENO, str, sizeof str);
_syscall_exit(0); sys_exit(0);
} }

View File

@ -1,198 +0,0 @@
#include <asm/unistd.h>
#include <asm/signal.h>
#include <asm/ioctls.h>
#include <asm/mman.h>
#include <fcntl.h>
#include <linux/fs.h>
#include <linux/loop.h>
#include <linux/time.h>
#include <errno.h>
#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);
}