From c459fab7662eaf45df9994c828065b9fc8d4a8ac Mon Sep 17 00:00:00 2001 From: Miguel Date: Sun, 2 Sep 2018 01:44:40 +0200 Subject: syscalls fine --- kernel/interrupts.c | 12 +++-- kernel/kernel.c | 2 +- kernel/scheduler.c | 89 +++++++++++++++++---------------- kernel/syscalls.c | 138 +++++++++++++++++++++++++++------------------------- 4 files changed, 126 insertions(+), 115 deletions(-) (limited to 'kernel') diff --git a/kernel/interrupts.c b/kernel/interrupts.c index cf75798..3ce33c4 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -58,8 +58,13 @@ static void int_install() uint32_t interrupt_handler(uint32_t esp, uint32_t irq) { if(irq==0)asm_pit_tick(); - if(irq==1)asm_kb_handler(); // TODO: put in ringbuff - if(irq==12)asm_mouse_handler();// TODO: put in ringbuff + + // mouse and kb + if(irq==1 || irq==12 ){ + uint32_t in=x86_inb(0x60); + if(irq=1)keyboard_handle(in); // do this in separate thread! +// klog("0x60 in %d",in); + } // 0x80 - a syscall is coming in if(irq==128){ @@ -73,9 +78,10 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq) // klog("syscall: %d (ebx=0x%08X,ecx=0x%08X,edx=0x%08X)",eax,ebx,ecx,edx); task_syscall(eax,ebx,ecx,edx); + esp=my_scheduler(esp,2); // force scheduling of pid=2 (kernel worker) } - if(irq==0 || irq==129 || irq==128)esp=my_scheduler(esp); + if(irq==0 || irq==129)esp=my_scheduler(esp,-1); // autoschedule if(irq==255)kpanic("Unhandled Interrupt!"); diff --git a/kernel/kernel.c b/kernel/kernel.c index 43c986c..4406ea0 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -59,7 +59,7 @@ void kernel_main(uint32_t eax,uint32_t ebx) // https://wiki.osdev.org/Symmetric_Multiprocessing klog("Symmetric Multi Processing (SMP) start ... "); smp_log_procdata(&procdata); - smp_start_aps(&procdata); + //smp_start_aps(&procdata); klog("Vritual Memory / Paging init ... "); pdirectory *dir=vmem_init(kernel_blocks,(uint32_t)info->framebuffer_addr); diff --git a/kernel/scheduler.c b/kernel/scheduler.c index ee1cea2..a16dd02 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -92,6 +92,7 @@ void task_syscall_worker() { //klog("checking if any pending syscalls."); + bool nowork=true; for(int i=0;i-1) + { + int pid=force_pid; + current_task=pid; + install_tss(task_list[pid].esp0); + + x86_set_page_directory(task_list[pid].vmem); + return task_list[pid].esp; + } for(int i=0;i 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); } } -- cgit v1.2.3