aboutsummaryrefslogtreecommitdiff
path: root/lib/sys
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sys')
-rw-r--r--lib/sys/brk.h10
-rw-r--r--lib/sys/execve.h11
-rw-r--r--lib/sys/mmap.h17
-rw-r--r--lib/sys/munmap.h9
-rw-r--r--lib/sys/read.h9
-rw-r--r--lib/sys/reboot.h21
-rw-r--r--lib/sys/sbrk.h10
-rw-r--r--lib/sys/sizes.h16
-rw-r--r--lib/sys/start.S6
-rw-r--r--lib/sys/stat.h62
-rw-r--r--lib/sys/syscalls.h336
-rw-r--r--lib/sys/time.h11
-rw-r--r--lib/sys/write.h10
13 files changed, 528 insertions, 0 deletions
diff --git a/lib/sys/brk.h b/lib/sys/brk.h
new file mode 100644
index 0000000..d2221a2
--- /dev/null
+++ b/lib/sys/brk.h
@@ -0,0 +1,10 @@
+#ifndef BRK_H
+#define BRK_H
+
+#include "syscalls.h"
+
+static unsigned long brk(void * addr) {
+ return syscall(BRK, addr);
+}
+
+#endif
diff --git a/lib/sys/execve.h b/lib/sys/execve.h
new file mode 100644
index 0000000..04d6dea
--- /dev/null
+++ b/lib/sys/execve.h
@@ -0,0 +1,11 @@
+#ifndef EXECVE_H
+#define EXECVE_H
+
+#include "syscalls.h"
+
+int execve(const char *pathname, char *const argv[], char *const envp[])
+{
+ return syscall(EXECVE, pathname, argv, envp);
+}
+
+#endif
diff --git a/lib/sys/mmap.h b/lib/sys/mmap.h
new file mode 100644
index 0000000..7e885c4
--- /dev/null
+++ b/lib/sys/mmap.h
@@ -0,0 +1,17 @@
+#ifndef MMAP_H
+#define MMAP_H
+#include "syscalls.h"
+
+#define PROT_READ 0x1
+#define PROT_WRITE 0x2
+#define PROT_EXEC 0x4
+#define PROT_NONE 0x0
+
+#define MAP_SHARED 0x1
+#define MAP_PRIVATE 0x2
+
+static void * mmap(void * addr, unsigned long size, int prot, int flags, int fd, int offset) {
+ return syscall(MMAP, size, prot, flags, fd, offset);
+}
+
+#endif
diff --git a/lib/sys/munmap.h b/lib/sys/munmap.h
new file mode 100644
index 0000000..4a876d6
--- /dev/null
+++ b/lib/sys/munmap.h
@@ -0,0 +1,9 @@
+#ifndef MUNMAP_H
+#define MUNMAP_H
+#include "syscall.h"
+
+static int munmap(void * addr, unsigned long size) {
+ return syscall(MUNMAP, addr, size);
+}
+
+#endif
diff --git a/lib/sys/read.h b/lib/sys/read.h
new file mode 100644
index 0000000..7dba6e7
--- /dev/null
+++ b/lib/sys/read.h
@@ -0,0 +1,9 @@
+#ifndef READ_H
+#define READ_H
+#include "syscalls.h"
+
+static int read(unsigned int fd, char * buf, unsigned long count) {
+ return syscall(READ, fd, buf, count, 0, 0);
+}
+
+#endif
diff --git a/lib/sys/reboot.h b/lib/sys/reboot.h
new file mode 100644
index 0000000..fd119c5
--- /dev/null
+++ b/lib/sys/reboot.h
@@ -0,0 +1,21 @@
+#ifndef SHUTDOWN_H
+#define SHUTDOWN_H
+
+#include "syscalls.h"
+
+#define REBOOT_HALT_SYSTEM 0xcdef0123
+#define REBOOT_HARD_RESET 0x01234567
+#define REBOOT_ENABLE_CAD 0x89abcdef
+#define REBOOT_DISABLE_CAD 0
+#define REBOOT_POWEROFF 0x4321fedc
+#define REBOOT_SUSPEND 0xd000fce2
+#define REBOOT_NEW_KERNEL 0x45584543
+
+static int reboot(int cmd) {
+ const int magic1 = 0xfee1dead;
+ const int magic2 = 537993216;
+
+ return syscall((void*)REBOOT, magic1, magic2, cmd, 0);
+}
+
+#endif
diff --git a/lib/sys/sbrk.h b/lib/sys/sbrk.h
new file mode 100644
index 0000000..25d9c6c
--- /dev/null
+++ b/lib/sys/sbrk.h
@@ -0,0 +1,10 @@
+#ifndef SBRK_H
+#define SBRK_H
+
+#include "syscalls.h"
+
+static int brk(void * addr) {
+ return syscall(BRK, addr);
+}
+
+#endif
diff --git a/lib/sys/sizes.h b/lib/sys/sizes.h
new file mode 100644
index 0000000..127d483
--- /dev/null
+++ b/lib/sys/sizes.h
@@ -0,0 +1,16 @@
+#ifndef SIZES_H
+#define SIZES_H
+
+typedef signed char i8;
+typedef unsigned char u8;
+
+typedef signed short int i16;
+typedef unsigned short int u16;
+
+typedef signed int i32;
+typedef unsigned int u32;
+
+typedef signed long int i64;
+typedef unsigned long int u64;
+
+#endif
diff --git a/lib/sys/start.S b/lib/sys/start.S
new file mode 100644
index 0000000..deafd67
--- /dev/null
+++ b/lib/sys/start.S
@@ -0,0 +1,6 @@
+.global _start
+_start:
+ call main
+ mov %rax, %rdi
+ mov $60, %rax
+ syscall
diff --git a/lib/sys/stat.h b/lib/sys/stat.h
new file mode 100644
index 0000000..02bdc48
--- /dev/null
+++ b/lib/sys/stat.h
@@ -0,0 +1,62 @@
+#ifndef STAT_H
+#define STAT_H
+
+#include "sizes.h"
+#include "time.h"
+#include "syscalls.h"
+
+#define S_IFMT 0170000
+#define S_IFSOCK 0140000
+#define S_IFLNK 0120000
+#define S_IFREG 0100000
+#define S_IFBLK 0060000
+#define S_IFDIR 0040000
+#define S_IFCHR 0020000
+#define S_IFIFO 0010000
+
+#define S_ISUID 04000
+#define S_ISGID 02000
+#define S_ISVTX 01000
+
+#define S_IRWXU 00700
+
+#define S_IRUSR 00400
+#define S_IWUSR 00200
+#define S_IXUSR 00100
+
+#define S_IRWXG 00070
+
+#define S_IRGRP 00040
+#define S_IWGRP 00020
+#define S_IXGRP 00010
+
+#define S_IRWXO 00007
+
+#define S_IROTH 00004
+#define S_IWOTH 00002
+#define S_IXOTH 00001
+
+struct stat {
+ i64 dev;
+ i64 ino;
+ u64 nlink;
+ u32 mode;
+ u32 uid;
+ u32 gid;
+ u64 rdev;
+ u64 size;
+ u64 blksize;
+ i64 blocks;
+
+ struct timespec atime;
+ struct timespec mtime;
+ struct timespec ctime;
+
+ u64 __[3];
+};
+
+static int stat(const char * filename, struct stat * statbuf) {
+ return syscall(STAT, filename, statbuf);
+}
+
+#endif
diff --git a/lib/sys/syscalls.h b/lib/sys/syscalls.h
new file mode 100644
index 0000000..03ce997
--- /dev/null
+++ b/lib/sys/syscalls.h
@@ -0,0 +1,336 @@
+#ifndef SYSCALLS_H
+#define SYSCALLS_H
+
+__asm__ (
+ "syscall:\n"
+ "endbr64\n"
+ "mov %rdi, %rax\n"
+ "mov %rsi, %rdi\n"
+ "mov %rdx, %rsi\n"
+ "mov %rcx, %rdx\n"
+ "mov %r8, %rcx\n"
+ "mov %r9, %r8\n"
+ "mov 8(%rsp), %r9\n"
+ "syscall\n"
+ "ret\n"
+);
+
+enum {
+ READ,
+ WRITE,
+ OPEN,
+ CLOSE,
+ STAT,
+ FSTAT,
+ LSTAT,
+ POLL,
+ LSEEK,
+ MMAP,
+ MPROTECT,
+ MUNMAP,
+ BRK,
+ RT_SIGACTION,
+ RT_SIGPROCMASK,
+ RT_SIGRETURN,
+ IOCTL,
+ PREAD64,
+ PWRITE64,
+ READV,
+ WRITEV,
+ ACCESS,
+ PIPE,
+ SELECT,
+ SCHED_YIELD,
+ MREMAP,
+ MSYNC,
+ MINCORE,
+ MADVISE,
+ SHMGET,
+ SHMAT,
+ SHMCTL,
+ DUP,
+ DUP2,
+ PAUSE,
+ NANOSLEEP,
+ GETITIMER,
+ ALARM,
+ SETITIMER,
+ GETPID,
+ SENDFILE,
+ SOCKET,
+ CONNECT,
+ ACCEPT,
+ SENDTO,
+ RECVFROM,
+ SENDMSG,
+ RECVMSG,
+ SHUTDOWN,
+ BIND,
+ LISTEN,
+ GETSOCKNAME,
+ GETPEERNAME,
+ SOCKETPAIR,
+ SETSOCKOPT,
+ GETSOCKOPT,
+ CLONE,
+ FORK,
+ VFORK,
+ EXECVE,
+ EXIT,
+ WAIT4,
+ KILL,
+ UNAME,
+ SEMGET,
+ SEMOP,
+ SEMCTL,
+ SHMDT,
+ MSGGET,
+ MSGSND,
+ MSGRCV,
+ MSGCTL,
+ FCNTL,
+ FLOCK,
+ FSYNC,
+ FDATASYNC,
+ TRUNCATE,
+ FTRUNCATE,
+ GETDENTS,
+ GETCWD,
+ CHDIR,
+ FCHDIR,
+ RENAME,
+ MKDIR,
+ RMDIR,
+ CREAT,
+ LINK,
+ UNLINK,
+ SYMLINK,
+ READLINK,
+ CHMOD,
+ FCHMOD,
+ CHOWN,
+ FCHOWN,
+ LCHOWN,
+ UMASK,
+ GETTIMEOFDAY,
+ GETRLIMIT,
+ GETRUSAGE,
+ SYSINFO,
+ TIMES,
+ PTRACE,
+ GETUID,
+ SYSLOG,
+ GETGID,
+ SETUID,
+ SETGID,
+ GETEUID,
+ GETEGID,
+ SETPGID,
+ GETPPID,
+ GETPGRP,
+ SETSID,
+ SETREUID,
+ SETREGID,
+ GETGROUPS,
+ SETGROUPS,
+ SETRESUID,
+ GETRESUID,
+ SETRESGID,
+ GETRESGID,
+ GETPGID,
+ SETFSUID,
+ SETFSGID,
+ GETSID,
+ CAPGET,
+ CAPSET,
+ RT_SIGPENDING,
+ RT_SIGTIMEDWAIT,
+ RT_SIGQUEUEINFO,
+ RT_SIGSUSPEND,
+ SIGALTSTACK,
+ UTIME,
+ MKNOD,
+ USELIB,
+ PERSONALITY,
+ USTAT,
+ STATFS,
+ FSTATFS,
+ SYSFS,
+ GETPRIORITY,
+ SETPRIORITY,
+ SCHED_SETPARAM,
+ SCHED_GETPARAM,
+ SCHED_SETSCHEDULER,
+ SCHED_GETSCHEDULER,
+ SCHED_GET_PRIORITY_MAX,
+ SCHED_GET_PRIORITY_MIN,
+ SCHED_RR_GET_INTERVAL,
+ MLOCK,
+ MUNLOCK,
+ MLOCKALL,
+ MUNLOCKALL,
+ VHANGUP,
+ MODIFY_LDT,
+ PIVOT_ROOT,
+ _SYSCTL,
+ PRCTL,
+ ARCH_PRCTL,
+ ADJTIMEX,
+ SETRLIMIT,
+ CHROOT,
+ SYNC,
+ ACCT,
+ SETTIMEOFDAY,
+ MOUNT,
+ UMOUNT2,
+ SWAPON,
+ SWAPOFF,
+ REBOOT,
+ SETHOSTNAME,
+ SETDOMAINNAME,
+ IOPL,
+ IOPERM,
+ CREATE_MODULE,
+ INIT_MODULE,
+ DELETE_MODULE,
+ GET_KERNEL_SYMS,
+ QUERY_MODULE,
+ QUOTACTL,
+ NFSSERVCTL,
+ GETPMSG,
+ PUTPMSG,
+ AFS_SYSCALL,
+ TUXCALL,
+ SECURITY,
+ GETTID,
+ READAHEAD,
+ SETXATTR,
+ LSETXATTR,
+ FSETXATTR,
+ GETXATTR,
+ LGETXATTR,
+ FGETXATTR,
+ LISTXATTR,
+ LLISTXATTR,
+ FLISTXATTR,
+ REMOVEXATTR,
+ LREMOVEXATTR,
+ FREMOVEXATTR,
+ TKILL,
+ TIME,
+ FUTEX,
+ SCHED_SETAFFINITY,
+ SCHED_GETAFFINITY,
+ SET_THREAD_AREA,
+ IO_SETUP,
+ IO_DESTROY,
+ IO_GETEVENTS,
+ IO_SUBMIT,
+ IO_CANCEL,
+ GET_THREAD_AREA,
+ LOOKUP_DCOOKIE,
+ EPOLL_CREATE,
+ EPOLL_CTL_OLD,
+ EPOLL_WAIT_OLD,
+ REMAP_FILE_PAGES,
+ GETDENTS64,
+ SET_TID_ADDRESS,
+ RESTART_SYSCALL,
+ SEMTIMEDOP,
+ FADVISE64,
+ TIMER_CREATE,
+ TIMER_SETTIME,
+ TIMER_GETTIME,
+ TIMER_GETOVERRUN,
+ TIMER_DELETE,
+ CLOCK_SETTIME,
+ CLOCK_GETTIME,
+ CLOCK_GETRES,
+ CLOCK_NANOSLEEP,
+ EXIT_GROUP,
+ EPOLL_WAIT,
+ EPOLL_CTL,
+ TGKILL,
+ UTIMES,
+ VSERVER,
+ MBIND,
+ SET_MEMPOLICY,
+ GET_MEMPOLICY,
+ MQ_OPEN,
+ MQ_UNLINK,
+ MQ_TIMEDSEND,
+ MQ_TIMEDRECEIVE,
+ MQ_NOTIFY,
+ MQ_GETSETATTR,
+ KEXEC_LOAD,
+ WAITID,
+ ADD_KEY,
+ REQUEST_KEY,
+ KEYCTL,
+ IOPRIO_SET,
+ IOPRIO_GET,
+ INOTIFY_INIT,
+ INOTIFY_ADD_WATCH,
+ INOTIFY_RM_WATCH,
+ MIGRATE_PAGES,
+ OPENAT,
+ MKDIRAT,
+ MKNODAT,
+ FCHOWNAT,
+ FUTIMESAT,
+ NEWFSTATAT,
+ UNLINKAT,
+ RENAMEAT,
+ LINKAT,
+ SYMLINKAT,
+ READLINKAT,
+ FCHMODAT,
+ FACCESSAT,
+ PSELECT6,
+ PPOLL,
+ UNSHARE,
+ SET_ROBUST_LIST,
+ GET_ROBUST_LIST,
+ SPLICE,
+ TEE,
+ SYNC_FILE_RANGE,
+ VMSPLICE,
+ MOVE_PAGES,
+ UTIMENSAT,
+ EPOLL_PWAIT,
+ SIGNALFD,
+ TIMERFD_CREATE,
+ EVENTFD,
+ FALLOCATE,
+ TIMERFD_SETTIME,
+ TIMERFD_GETTIME,
+ ACCEPT4,
+ SIGNALFD4,
+ EVENTFD2,
+ EPOLL_CREATE1,
+ DUP3,
+ PIPE2,
+ INOTIFY_INIT1,
+ PREADV,
+ PWRITEV,
+ RT_TGSIGQUEUEINFO,
+ PERF_EVENT_OPEN,
+ RECVMMSG,
+ FANOTIFY_INIT,
+ FANOTIFY_MARK,
+ PRLIMIT64,
+ NAME_TO_HANDLE_AT,
+ OPEN_BY_HANDLE_AT,
+ CLOCK_ADJTIME,
+ SYNCFS,
+ SENDMMSG,
+ SETNS,
+ GETCPU,
+ PROCESS_VM_READV,
+ PROCESS_VM_WRITEV,
+ KCMP,
+ FINIT_MODULE,
+};
+
+
+#endif
diff --git a/lib/sys/time.h b/lib/sys/time.h
new file mode 100644
index 0000000..920ee5c
--- /dev/null
+++ b/lib/sys/time.h
@@ -0,0 +1,11 @@
+#ifndef TIME_H
+#define TIME_H
+
+#include "sizes.h"
+
+struct timespec {
+ u64 tv_sec;
+ long tv_nsec;
+};
+
+#endif
diff --git a/lib/sys/write.h b/lib/sys/write.h
new file mode 100644
index 0000000..a705873
--- /dev/null
+++ b/lib/sys/write.h
@@ -0,0 +1,10 @@
+#ifndef WRITE_H
+#define WRITE_H
+
+#include "syscalls.h"
+
+static int write(unsigned int fd, const char * buf, unsigned long count) {
+ return syscall((void*)WRITE, (void*)fd, (void*)buf, (void*)count);
+}
+
+#endif