diff options
Diffstat (limited to 'kernel/syscalls.c')
| -rw-r--r-- | kernel/syscalls.c | 138 |
1 files changed, 72 insertions, 66 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 7a0dc50..2a31a81 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -20,6 +20,7 @@ static fd fds[MAX_FD]; static uint32_t next_fd=0; static fifo fifos[MAX_FIFOS]; +static uint32_t fifo_data_len[MAX_FIFOS]; static uint32_t next_fifo=0; extern uint32_t fb_addr; @@ -69,30 +70,32 @@ int syscall_write(int file, char *buf, int len) for(int i=0;i<len;i++) { fd_write(&fds[file],buf[i]); + fifo_data_len[file]++; } return len; } +int chk_syscall_read(int file, char *buf, int len) +{ + if(len> fifo_data_len[file])return 0; + return 1; +} + int syscall_read(int file, char *buf, int len) { //file 0 = stdin , file 1 = stdout , file 2 = stderr - char c; int l=0; - while(1) - { - while(!fd_has(&fds[file])); c=fd_read(&fds[file]); - + fifo_data_len[file]--; *buf=c; buf++; l++; if(l==len)return l; if(c=='\n')return l; - } } //TODO: replace with dirent! @@ -192,11 +195,14 @@ int syscall_execve(char *name, char **argv, char **env,int pid) if(!entry_global) { - kpanic("error loading %s",name); return -1; // errror loading } - task_reset(pid,entry_global,0x08fff000); + uint32_t *stack=0x08fff000; + *++stack=argv1; + *++stack=arg_count; + *++stack=env1; + task_reset(pid,entry_global,stack); return 0; /* try to move this to asm */ @@ -230,9 +236,9 @@ int get_max_fd() // TODO: allow opening existing files/named pipes int syscall_open(char *name, int flags, int mode) { - if( next_fifo>=MAX_FIFOS || next_fd>=MAX_FD)kpanic("we ran out of fd's or fifo's"); + if(0!=strcmp(name,"term")) { fifos[next_fifo]=fifo_create_buffered(1); @@ -243,18 +249,17 @@ int syscall_open(char *name, int flags, int mode) // HERE WE SEE THE GENIUS OF OUR ABSTRACTIONS (I HOPE...) - if (fb_addr<0x100000) + if (fb_addr<0x100000) // text-mode { - screen.put_char=console_put_char; - screen.update_cursor=update_cursor; + screen.put_char=console_put_char; + screen.update_cursor=update_cursor; } - else + else // framebuffer mode { - screen.put_char=vesa_console_put_char; - screen.update_cursor=vesa_update_cursor; + screen.put_char=vesa_console_put_char; + screen.update_cursor=vesa_update_cursor; } - tty1=terminal_init(&screen,NULL); fifos[next_fifo].data=&tty1; @@ -263,6 +268,8 @@ int syscall_open(char *name, int flags, int mode) fds[next_fd]=fd_from_fifo(&fifos[next_fifo]); } + fifo_data_len[next_fifo]=0; + next_fifo++; next_fd++; @@ -314,56 +321,55 @@ int syscall_stat(const char *path, struct stat *st,int none) uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid) { - switch(nr){ - case SYSCALL_EXIT : - return task_exit(p1,p2,p3); - case SYSCALL_CLOSE : - return syscall_close(p1,p2,p3); - case SYSCALL_EXECVE : - return syscall_execve(p1,p2,p3,pid); - case SYSCALL_FORK : - return task_fork(pid); - case SYSCALL_GETPID : -// return syscall_getpid(p1,p2,p3); - return -1; - case SYSCALL_ISATTY : - return syscall_isatty(p1,p2,p3); - case SYSCALL_LINK : -// return syscall_link(p1,p2,p3); - return -1; - case SYSCALL_LSEEK : - return syscall_lseek(p1,p2,p3); - case SYSCALL_OPEN : - return syscall_open(p1,p2,p3); - case SYSCALL_READ : - return syscall_read(p1,p2,p3); - case SYSCALL_SBRK : - return syscall_sbrk(p1,p2,p3); - case SYSCALL_STAT : - return syscall_stat(p1,p2,p3); - case SYSCALL_FSTAT : - return syscall_stat(p1,p2,p3); - case SYSCALL_LSTAT : - return syscall_stat(p1,p2,p3); - case SYSCALL_TIMES : -// return syscall_times(p1,p2,p3); - return -1; - case SYSCALL_UNLINK : -// return syscall_unlink(p1,p2,p3); - return -1; - case SYSCALL_WAIT : - return task_wait(p1,p2,p3); - case SYSCALL_WRITE : - return syscall_write(p1,p2,p3); - case SYSCALL_GETTIMEOFDAY: - return syscall_gettimeofday(p1,p2); - case SYSCALL_READDIR : - return syscall_readdir(p1,p2,p3); - case SYSCALL_KILL : -// return task_kill(p1,p2,p3); - return -1; - case SYSCALL_POLL : - return syscall_poll(p1); + case SYSCALL_EXIT : + return task_exit(pid); + case SYSCALL_CLOSE : + return syscall_close(p1,p2,p3); + case SYSCALL_EXECVE : + return syscall_execve(p1,p2,p3,pid); + case SYSCALL_FORK : + return task_fork(pid); + case SYSCALL_GETPID : + // return syscall_getpid(p1,p2,p3); + return -1; + case SYSCALL_ISATTY : + return syscall_isatty(p1,p2,p3); + case SYSCALL_LINK : + // return syscall_link(p1,p2,p3); + return -1; + case SYSCALL_LSEEK : + return syscall_lseek(p1,p2,p3); + case SYSCALL_OPEN : + return syscall_open(p1,p2,p3); + case SYSCALL_READ : + return syscall_read(p1,p2,p3); + case SYSCALL_SBRK : + return syscall_sbrk(p1,p2,p3); + case SYSCALL_STAT : + return syscall_stat(p1,p2,p3); + case SYSCALL_FSTAT : + return syscall_stat(p1,p2,p3); + case SYSCALL_LSTAT : + return syscall_stat(p1,p2,p3); + case SYSCALL_TIMES : + // return syscall_times(p1,p2,p3); + return -1; + case SYSCALL_UNLINK : + // return syscall_unlink(p1,p2,p3); + return -1; + case SYSCALL_WAIT : + return task_wait(pid); + case SYSCALL_WRITE : + return syscall_write(p1,p2,p3); + case SYSCALL_GETTIMEOFDAY: + return syscall_gettimeofday(p1,p2); + case SYSCALL_READDIR : + return syscall_readdir(p1,p2,p3); + case SYSCALL_KILL : + // return task_kill(p1,p2,p3); + return -1; + case SYSCALL_POLL : + return syscall_poll(p1); } } |
