//printf needs following syscalls: sbrk write close fstat isatty lseek read // #include #include #include #include "../fs/fs.h" static int preread; static int alloc; easywrite(char *c); // init syscalls void syscalls_init() { // TODO dynamic! alloc=0x300000; } // generic syscall interface! int syscall(int call, int p1, int p2, int p3) { int ebx; // will hold return value; asm("pusha"); // select syscall asm("mov %0, %%eax"::"m"(call)); // pass params asm("mov %0,%%edx"::"m"(p1)); asm("mov %0,%%ecx"::"m"(p2)); asm("mov %0,%%ebx"::"m"(p3)); // interrrupt asm("int $0x80"); // get return value asm("mov %%ebx, %0": "=b" (ebx)); asm("popa"); return ebx; } // int close(int file) { return -1; } int fstat(int file, struct stat *st) { st->st_mode = S_IFCHR; return 0; } int isatty(int file) { return 1; } int lseek(int file, int ptr, int dir) { if(dir==0)preread=ptr; else{ puts("other modes unsupported sorry"); while(1);} return preread; } int read(int file, char *ptr, int len) { return syscall(62,file,ptr,len); } int readdir(const char *name,fs_dirent *dirs,int max) { return syscall(63,name,dirs,max); } int open(const char *name, int flags, int mode) { return name; } int write(int file, char *ptr, int len) { return syscall(61,file,ptr,len); } int execve(char *name, char **argv, char **env) { return syscall(64,name,argv,env); } caddr_t sbrk(int incr) { // easywrite("syscall: sbrk!!\n"); int oldalloc=alloc; alloc+=incr; return oldalloc; /* extern char end; // char _end; static char *heap_end; char *prev_heap_end; if (heap_end == 0) { heap_end = &end; } prev_heap_end = heap_end; if (heap_end + incr > stack_ptr) { write (1, "Heap and stack collision\n", 25); abort (); } heap_end += incr; return (caddr_t) prev_heap_end; */ } //