Untitled
unknown
plain_text
20 days ago
5.5 kB
4
Indexable
#include <stdint.h> #include <stdlib.h> #include <syscall.h> #include "../syscall-nr.h" /* Invokes syscall NUMBER, passing no arguments, and returns the return value as an `int'. */ #define syscall0(NUMBER) \ ({ \ int retval; \ asm volatile("pushl %[number]; int $0x30; addl $4, %%esp" \ : "=a"(retval) \ : [number] "i"(NUMBER) \ : "memory"); \ retval; \ }) /* Invokes syscall NUMBER, passing argument ARG0, and returns the return value as an `int'. */ #define syscall1(NUMBER, ARG0) \ ({ \ int retval; \ asm volatile("pushl %[arg0]; pushl %[number]; int $0x30; addl $8, %%esp" \ : "=a"(retval) \ : [number] "i"(NUMBER), [arg0] "g"(ARG0) \ : "memory"); \ retval; \ }) /* Invokes syscall NUMBER, passing arguments ARG0 and ARG1, and returns the return value as an `int'. */ #define syscall2(NUMBER, ARG0, ARG1) \ ({ \ int retval; \ asm volatile("pushl %[arg1]; pushl %[arg0]; " \ "pushl %[number]; int $0x30; addl $12, %%esp" \ : "=a"(retval) \ : [number] "i"(NUMBER), [arg0] "r"(ARG0), [arg1] "r"(ARG1) \ : "memory"); \ retval; \ }) /* Invokes syscall NUMBER, passing arguments ARG0, ARG1, and ARG2, and returns the return value as an `int'. */ #define syscall3(NUMBER, ARG0, ARG1, ARG2) \ ({ \ int retval; \ asm volatile("pushl %[arg2]; pushl %[arg1]; pushl %[arg0]; " \ "pushl %[number]; int $0x30; addl $16, %%esp" \ : "=a"(retval) \ : [number] "i"(NUMBER), [arg0] "r"(ARG0), [arg1] "r"(ARG1), [arg2] "r"(ARG2) \ : "memory"); \ retval; \ }) int practice(int i) { return syscall1(SYS_PRACTICE, i); } void halt(void) { syscall0(SYS_HALT); NOT_REACHED(); } void exit(int status) { syscall1(SYS_EXIT, status); NOT_REACHED(); } pid_t exec(const char* file) { return (pid_t)syscall1(SYS_EXEC, file); } int wait(pid_t pid) { return syscall1(SYS_WAIT, pid); } bool create(const char* file, unsigned initial_size) { return syscall2(SYS_CREATE, file, initial_size); } bool remove(const char* file) { return syscall1(SYS_REMOVE, file); } int open(const char* file) { return syscall1(SYS_OPEN, file); } int filesize(int fd) { return syscall1(SYS_FILESIZE, fd); } int read(int fd, void* buffer, unsigned size) { return syscall3(SYS_READ, fd, buffer, size); } int write(int fd, const void* buffer, unsigned size) { return syscall3(SYS_WRITE, fd, buffer, size); } void seek(int fd, unsigned position) { syscall2(SYS_SEEK, fd, position); } unsigned tell(int fd) { return syscall1(SYS_TELL, fd); } void close(int fd) { syscall1(SYS_CLOSE, fd); } mapid_t mmap(int fd, void* addr) { return syscall2(SYS_MMAP, fd, addr); } void munmap(mapid_t mapid) { syscall1(SYS_MUNMAP, mapid); } bool chdir(const char* dir) { return syscall1(SYS_CHDIR, dir); } bool mkdir(const char* dir) { return syscall1(SYS_MKDIR, dir); } bool readdir(int fd, char name[READDIR_MAX_LEN + 1]) { return syscall2(SYS_READDIR, fd, name); } bool isdir(int fd) { return syscall1(SYS_ISDIR, fd); } int inumber(int fd) { return syscall1(SYS_INUMBER, fd); } void* sbrk(intptr_t increment) { return (void*)syscall1(SYS_SBRK, increment); }
Editor is loading...
Leave a Comment