From 45ce8728224caa44d31dca3117992b193fa3cd98 Mon Sep 17 00:00:00 2001 From: Miguel Date: Fri, 19 Oct 2018 02:41:53 +0200 Subject: window manager continued --- kernel/interrupts.c | 2 +- kernel/kernel.c | 5 ++--- kernel/scheduler.c | 13 ++++++++++--- kernel/scheduler.h | 1 + kernel/smp.c | 1 - kernel/syscalls.c | 39 +++++++++++++++------------------------ 6 files changed, 29 insertions(+), 32 deletions(-) (limited to 'kernel') diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 702112c..9ff9cd3 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -111,7 +111,7 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq) if(cpu==0) // thi { // limit compositor to APIC_TIMER freq.(60hz?) - if(irq==INTERRUPT_APIC_TIMER)compositor_wake2(); + if(irq==INTERRUPT_APIC_TIMER)compositor_wake(); } esp=scheduler_run(esp,-1); // just schedule to next task diff --git a/kernel/kernel.c b/kernel/kernel.c index a630f94..a259446 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -38,7 +38,6 @@ #include "fs/elf.h" #include "kmalloc.h" -#include "driver/vesa.h" #include "asm_pit.h" /** F00L 0S Entry point (called directly from asm/multiboot.asm) @@ -147,8 +146,8 @@ void kernel_main(uint32_t eax,uint32_t ebx) // -- COMPOSITOR (TODO: text-mode fallback) -- // klog("Compositor init ..."); compositor_init(cfg_multiboot->framebuffer_width,cfg_multiboot->framebuffer_height, - cfg_multiboot->framebuffer_bpp,cfg_multiboot->framebuffer_pitch); - compositor_set_background("/home/miguel/icons.ppm"); + cfg_multiboot->framebuffer_bpp,cfg_multiboot->framebuffer_pitch, + VMEM_FRAMEBUFFER); // -- KB DRIVER -- // klog("Keyboard init ..."); diff --git a/kernel/scheduler.c b/kernel/scheduler.c index 9fe4f74..e5c279b 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -319,7 +319,7 @@ void task_syscall_worker() { keyboard_worker(); mouse_worker(); - compositor_swap_buffers(); + compositor_paint(); } __asm__("int $0x81"); // we are ready! force reschedule @@ -498,6 +498,7 @@ volatile uint32_t task_get_parent(uint32_t pid) return task_list[cpu][idx].parent; } +/* volatile int task_add_win(uint32_t pid,ringbuffer *r) { uint32_t cpu=smp_get(SMP_APIC_ID); @@ -506,9 +507,10 @@ volatile int task_add_win(uint32_t pid,ringbuffer *r) 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,pid,r); + compositor_create_window(pid,0,0,640,400,0); return 0; } +*/ int task_set_esp(uint32_t pid, uint32_t esp) { @@ -566,7 +568,12 @@ void task_exit(uint32_t pid) task_list[cpu][i].active=false; } - compositor_del_window(task_list[cpu][idx].vmem); vmem_free_space_dir(task_list[cpu][idx].vmem,task_list[cpu][idx].thread); } +uint32_t scheduler_get_vmem(uint32_t pid) +{ + uint32_t cpu=smp_get(SMP_APIC_ID); + uint32_t idx=task_runs(pid); + return task_list[cpu][idx].vmem; +} diff --git a/kernel/scheduler.h b/kernel/scheduler.h index 7650f01..7761bb4 100644 --- a/kernel/scheduler.h +++ b/kernel/scheduler.h @@ -23,3 +23,4 @@ void task_exit(uint32_t pid); void task_set_name(uint32_t pid, char *name); volatile int task_add_win(uint32_t pid,ringbuffer *); int task_set_esp(uint32_t pid, uint32_t esp); +uint32_t scheduler_get_vmem(uint32_t pid); diff --git a/kernel/smp.c b/kernel/smp.c index a57b4b9..02b0263 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -13,7 +13,6 @@ #include "asm_pit.h" #include "asm_smp.h" #include "apic.h" -#include "vesa.h" #include "syscalls.h" // set cpu private value diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 083fbf1..ccda5f0 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -4,7 +4,6 @@ #include "lib/printf/printf.h" #include "fs/ext2.h" #include "kernel.h" -#include "driver/vesa.h" #include "fifo.h" #include "fd.h" #include "fs/elf.h" @@ -27,9 +26,13 @@ #include "stdstreams.h" #include "sys/unistd.h" + +// TODO oh maan, dyamically allocate some nice structures and think about reentrancy +// and smp !! +//TODO move to process.c or somehting..and implement per process // + #define MAX_PID 200 -//TODO move to process.c and implement per process // static fd fds[MAX_PID][MAX_FD]; static ringbuffer invl[MAX_PID]; //static uint32_t opendir_pos[MAX_PID][MAX_FD]; @@ -69,7 +72,7 @@ int nextfd(int pid) return i; } } - return -1; + kpanic("ran out of filedescirptors for pid : %d",pid); } /** errno helper */ void set_errno(int no) @@ -405,7 +408,6 @@ int syscall_execve(const char *name, char *const argv[], char *const env[], int if(!entry_global) { - kpanic("no entry point!"); // TODO: rem set_errno(ENOENT); return -1; } @@ -488,6 +490,7 @@ uint32_t syscall_exit(int status, uint32_t none1, uint32_t none2,int pid) } } + compositor_destroy_window(pid); task_exit(pid); __asm__("int $0x81"); // please schedule us away once and for all return 0; @@ -597,32 +600,20 @@ uint32_t syscall_tcsetattr(int fd, struct termios *termios_p, uint32_t none, uin return 0; } -uint32_t syscall_gui_rect(uint32_t xy, uint32_t wh, uint32_t none, uint32_t pid) +uint32_t syscall_gui_rect(uint32_t xy, uint32_t wh, uint32_t fb, uint32_t pid) { -// klog("pid %d x y %d %d w h %d %d",pid,xy>>16,xy&0xffff,wh>>16,wh&0xffff); - - ringbuffer_put(&invl[pid],xy&0x000000ff); - ringbuffer_put(&invl[pid],(xy&0x0000ff00)>>8); - ringbuffer_put(&invl[pid],(xy&0x00ff0000)>>16); - ringbuffer_put(&invl[pid],(xy&0xff000000)>>24); - - ringbuffer_put(&invl[pid],wh&0x000000ff); - ringbuffer_put(&invl[pid],(wh&0x0000ff00)>>8); - ringbuffer_put(&invl[pid],(wh&0x00ff0000)>>16); - ringbuffer_put(&invl[pid],(wh&0xff000000)>>24); - - compositor_wake(); - - return 1; + compositor_invalidate(pid,xy>>16,xy&0xffff,wh>>16,wh&0xffff,fb); + return 0; // can not fail } -uint32_t syscall_gui_win(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid) + +uint32_t syscall_gui_win(uint32_t xy, uint32_t wh, uint32_t flags, uint32_t pid) { + //create a ringbuffer for virtual per process /dev/tty (for fool-terms and similar)// uint32_t fdn=nextfd(pid); fds[pid][fdn]=fd_from_ringbuffer(); tty[pid]=fdn; - invl[pid]=ringbuffer_init(1); - task_add_win(pid,&invl[pid]); - return 1; + + return compositor_create_window(pid,xy>>16,xy&0xffff,wh>>16,wh&0xffff,flags); } /** Generics . prep before we reenable interrupts*/ -- cgit v1.2.3