diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/interrupts.c | 7 | ||||
| -rw-r--r-- | kernel/scheduler.c | 10 | ||||
| -rw-r--r-- | kernel/syscalls.c | 46 | ||||
| -rw-r--r-- | kernel/syscalls.h | 4 |
4 files changed, 45 insertions, 22 deletions
diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 94ed54a..ce1d7c7 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -74,6 +74,11 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq) return esp; } + if(irq==INTERRUPT_APIC_TIMER) + { + compositor_wake(); + } + if(irq==INTERRUPT_APIC_TIMER || irq==INTERRUPT_IPI) { esp=scheduler_run(esp,-1); @@ -93,8 +98,6 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq) kpanic("unhandled interrupt %d",irq); - - /* if(handlers[irq]!=0) { diff --git a/kernel/scheduler.c b/kernel/scheduler.c index 678b418..6ee4416 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -101,7 +101,7 @@ volatile void scheduler_init(uint32_t cpu, void *dir) task_list[cpu][1].esp = VMEM_USER_STACK_TOP-0x200-8; task_list[cpu][1].esp0 = kballoc(4)+4*4096; // esp0 needed by user space tasks strcpy(task_list[cpu][1].name,"userspace init"); - //fd_init_std_streams(task_list[cpu][1].pid,0); + fd_init_std_streams(task_list[cpu][1].pid); // sleeper task_list[cpu][2].parent=0; @@ -333,14 +333,14 @@ void task_syscall_worker() bool wake_mouse=false; //TODO: would be enough only to lock during ringbuffer acces!? + //TODO: no locking should be required at all!!! //x86_cli(); // disable temporarily mouse/kb/timer interrupts. - //wake|=keyboard_worker(); + wake|=keyboard_worker(); wake_mouse|=mouse_worker(); //x86_sti(); if(wake_mouse)compositor_swap_buffers(); - - //if(wake)scheduler_wake_all(); + if(wake)scheduler_wake_all(); //if(cpu==0)compositor_swap_buffers(); @@ -484,7 +484,7 @@ volatile int task_add_win(uint32_t pid) struct pdirectory *vmem=x86_get_page_directory();//task_list[cpu][idx].vmem; vmem_add_framebuffer(vmem); klog("add win to compositor"); - compositor_add_window(vmem); + compositor_add_window(vmem,pid); return 0; } diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 4bf63fc..130e6dd 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -31,36 +31,46 @@ static fd fds[MAX_PID][MAX_FD]; static bool open_fd[MAX_PID][MAX_FD]; -void fd_init_std_streams(uint32_t pid,bool fb) +fd *get_fd(uint32_t pid,uint32_t file) { + return &(fds[pid][file]); +} + +void fd_init_std_streams(uint32_t pid) +{ + // fds[pid][0]=fd_from_ringbuffer(); + // open_fd[pid][0]=true; + return; + static bool first=true; if(pid==0&&first) { first=false; //stdin / stdout /stderr fds[0][0]=fd_from_ringbuffer(); - if(!fb) // ega text mode + +// if(!fb) // ega text mode { - fds[0][1]=fd_from_term(); - fds[0][2]=fd_from_term(); + // fds[0][1]=fd_from_term(); + // fds[0][2]=fd_from_term(); } - else +// else { - fds[0][1]=fd_from_fb_term(); - fds[0][2]=fd_from_fb_term(); + //fds[0][1]=fd_from_fb_term(); + //fds[0][2]=fd_from_fb_term(); } open_fd[0][0]=true; - open_fd[0][1]=true; - open_fd[0][2]=true; +// open_fd[0][1]=true; +// open_fd[0][2]=true; } else { fds[pid][0]=fds[0][0]; - fds[pid][1]=fds[0][1]; - fds[pid][2]=fds[0][2]; +// fds[pid][1]=fds[0][1]; +// fds[pid][2]=fds[0][2]; open_fd[pid][0]=true; - open_fd[pid][1]=true; - open_fd[pid][2]=true; +// open_fd[pid][1]=true; +// open_fd[pid][2]=true; } } // @@ -178,6 +188,7 @@ int syscall_lseek(int file,int ptr,int dir,uint32_t pid) // TODO: /dev/console or /dev/tty1 - /dev/ttyN int syscall_write(int file, char *buf, int len,uint32_t pid) { + if(!open_fd[pid][file])kpanic("writing to closed file descriptor"); for(int i=0;i<len;i++) { fd_write(&fds[pid][file],buf[i]); @@ -191,6 +202,7 @@ int syscall_write(int file, char *buf, int len,uint32_t pid) */ int syscall_read(int file, char *buf, int len,uint32_t pid) { + if(!open_fd[pid][file])kpanic("reading from closed file descriptor"); if(fd_eof(&fds[pid][file]))return 0; *buf=fd_read(&fds[pid][file]); return 1; @@ -276,14 +288,16 @@ int syscall_execve(const char *name, char *const argv[], char *const env[], int int nextfd(int pid) { for(int i=0;i<MAX_FD;i++) + { if(!open_fd[pid][i]) { open_fd[pid][i]=true; return i; } - + } return -1; } + int syscall_open(char *name, int flags, int mode,uint32_t pid) { uint32_t fdn=nextfd(pid); @@ -303,6 +317,8 @@ uint32_t syscall_fork(int none1, int none2, int none3, int pid) fds[newpid][i]=fd_dupl(&fds[pid][i]); open_fd[newpid][i]=true; } +// fds[newpid][0]=fd_from_ringbuffer(); // TODO fix + open_fd[newpid][0]=true; return newpid; } @@ -390,6 +406,8 @@ uint32_t syscall_pipe(uint32_t *addr,int none1, int none2, uint32_t pid) int fd1=nextfd(pid); int fd2=nextfd(pid); + klog("new pipe read=%d, write=%d",fd1,fd2 ); + fds[pid][fd1]=pipfds[0] ; *addr=fd1; addr++; diff --git a/kernel/syscalls.h b/kernel/syscalls.h index f77aea5..b79e6b3 100644 --- a/kernel/syscalls.h +++ b/kernel/syscalls.h @@ -14,6 +14,7 @@ #include <stdint.h> #include <stdbool.h> +#include "fd.h" #define SYSCALL_EXIT 60 #define SYSCALL_EXECVE 64 @@ -46,7 +47,8 @@ #define SYSCALL_GUI_WIN 88 /** Todo move somewhere else and init per process , think how to make thread safe */ -void fd_init_std_streams(uint32_t pid, bool use_framebuffer); +void fd_init_std_streams(uint32_t pid); +fd *get_fd(uint32_t pid,uint32_t file); /** returns string representation of the syscall from its number */ char* syscall_get_name(uint32_t num); |
