#include #include #include #include "../kernel/syscalls.h" /* char *__env1[]={0}; char *__env2[]={"dupa","test"}; char **environ={__env1,__env2}; */ void _exit(int ret) { while(1); } // 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 syscall(SYSCALL_CLOSE,file,0,0); } int fstat(int file, struct stat *st) { return syscall(SYSCALL_FSTAT,file,st,0); } int isatty(int file) { return syscall(SYSCALL_ISATTY,file,0,0); } int lseek(int file, int ptr, int dir) { return syscall(SYSCALL_LSEEK,file,ptr,dir); } int read(int file, char *ptr, int len) { return syscall(SYSCALL_READ,file,ptr,len); } int readdir(const char *name,fs_dirent *dirs,int max) { return syscall(SYSCALL_READDIR,name,dirs,max); } int open(const char *name, int flags, int mode) { return syscall(SYSCALL_OPEN,name,flags,mode); } int write(int file, char *ptr, int len) { return syscall(SYSCALL_WRITE,file,ptr,len); } int execve(char *name, char **argv, char **env) { return syscall(SYSCALL_EXECVE,name,argv,env); } caddr_t sbrk(int incr) { static int alloc=0x300000; // TODO: implement properly sbrk!!! int oldalloc=alloc; alloc+=incr; return oldalloc; return syscall(SYSCALL_SBRK,incr,0,0); }