summaryrefslogtreecommitdiff
path: root/kernel/syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/syscalls.c')
-rw-r--r--kernel/syscalls.c138
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);
}
}