From fe8180d88540bfa96595dcc58290de5425e534e3 Mon Sep 17 00:00:00 2001 From: Miguel Date: Fri, 5 Oct 2018 23:41:51 +0200 Subject: drunken proggin --- kernel/interrupts.c | 7 +++++-- kernel/scheduler.c | 10 +++++----- kernel/syscalls.c | 46 ++++++++++++++++++++++++++++++++-------------- kernel/syscalls.h | 4 +++- 4 files changed, 45 insertions(+), 22 deletions(-) (limited to 'kernel') 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 #include +#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); -- cgit v1.2.3