diff options
Diffstat (limited to 'lib/sys')
| -rw-r--r-- | lib/sys/brk.h | 10 | ||||
| -rw-r--r-- | lib/sys/execve.h | 11 | ||||
| -rw-r--r-- | lib/sys/mmap.h | 17 | ||||
| -rw-r--r-- | lib/sys/munmap.h | 9 | ||||
| -rw-r--r-- | lib/sys/read.h | 9 | ||||
| -rw-r--r-- | lib/sys/reboot.h | 21 | ||||
| -rw-r--r-- | lib/sys/sbrk.h | 10 | ||||
| -rw-r--r-- | lib/sys/sizes.h | 16 | ||||
| -rw-r--r-- | lib/sys/start.S | 6 | ||||
| -rw-r--r-- | lib/sys/stat.h | 62 | ||||
| -rw-r--r-- | lib/sys/syscalls.h | 336 | ||||
| -rw-r--r-- | lib/sys/time.h | 11 | ||||
| -rw-r--r-- | lib/sys/write.h | 10 |
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 |