From 81a8252db679351f5ba388b420519724c9c2c2be Mon Sep 17 00:00:00 2001 From: Miguel Date: Thu, 4 Oct 2018 02:17:13 +0200 Subject: reverting userspace idea --- kernel/interrupts.c | 18 +++++++++++++++--- kernel/kernel.c | 7 ++++--- kernel/scheduler.c | 33 ++++++++++++++------------------- kernel/syscalls.c | 5 ++++- kernel/vmem.c | 11 ++++++----- userspace/init.c | 29 +++++++++++++++++++++++------ userspace/pain1.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ userspace/pain2.c | 4 ++-- userspace/pain3.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ video/compositor.c | 3 +++ 10 files changed, 169 insertions(+), 39 deletions(-) create mode 100644 userspace/pain1.c create mode 100644 userspace/pain3.c diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 4aa9db3..94ed54a 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -68,23 +68,34 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq) { uint32_t (*f)(uint32_t esp)=handlers[irq]; esp=f(esp); + scheduler_wake_worker(esp); apic_eoi(); + esp=scheduler_run(esp,-1); return esp; } - if(irq==INTERRUPT_APIC_TIMER) + if(irq==INTERRUPT_APIC_TIMER || irq==INTERRUPT_IPI) { - klog ("tick"); esp=scheduler_run(esp,-1); apic_eoi(); return esp; } + if(irq==INTERRUPT_SYSCALL) // do not EOI + { + uint32_t *stack; + stack=esp; + task_syscall(stack[11],stack[8],stack[10],stack[9]); //eax,ebx,ecx,edx + scheduler_wake_worker(esp); + esp=scheduler_run(esp,-1); + return esp; + } + kpanic("unhandled interrupt %d",irq); - uint32_t *stack; + /* if(handlers[irq]!=0) { //uint32_t (*f)(uint32_t esp)=handlers[irq]; @@ -132,6 +143,7 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq) return esp; + */ } /** diff --git a/kernel/kernel.c b/kernel/kernel.c index 3e07fde..66021e2 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -155,15 +155,16 @@ void kernel_main(uint32_t eax,uint32_t ebx) uint32_t addr= ext2_inode_blockstart( VMEM_EXT2_RAMIMAGE,inode,0); vesa_init(cfg_multiboot,addr); // this only sets some internal static variables - klog("Compositor init ..."); - compositor_init(cfg_multiboot->framebuffer_width,cfg_multiboot->framebuffer_height,cfg_multiboot->framebuffer_pitch); - compositor_set_background("/home/miguel/bg.ppm"); // -- STD STREAMS -- // klog("Standard Streams init ..."); fd_init_std_streams(0,cfg_multiboot->framebuffer_type!=2); */ + klog("Compositor init ..."); + compositor_init(cfg_multiboot->framebuffer_width,cfg_multiboot->framebuffer_height,cfg_multiboot->framebuffer_pitch); + compositor_set_background("/home/miguel/bg.ppm"); + // -- KB -- // klog("Keyboard init ..."); keyboard_init(); diff --git a/kernel/scheduler.c b/kernel/scheduler.c index 9fdff7d..8d7b025 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -174,11 +174,10 @@ volatile uint32_t scheduler_run(uint32_t oldesp,uint32_t preference) for(int i=0;i=VMEM_USER_FRAMEBUFFER&&virt +#include + +#define dimx 640 +#define dimy 480 + +/* +void doscolor(int color,int color2) +{ + int i=0; + + for (int y = 0; y < dimy; y++) + for (int x = 0; x < dimx; x++) + { + { + if(x%2&&y%2)put_pixel(x,y,color); + else put_pixel(x,y,color2); + } + } +} +*/ + +int main(int argc,char **argv) +{ + _gui_win(); + + for(int i=0;i<2000;i++) + { + for(int i=0;i<380;i+=40) + { + put_rect(0,0,640,480,0x0000ff); + put_rect(640-i,i,100,100,0xff00ff); + _gui_rect(); + } + + for(int i=380;i>0;i-=80) + { + put_rect(0,0,640,480,0x0000ff); + put_rect(640-i,i,100,100,0x00ffff); + _gui_rect(); + } + } + + return EXIT_SUCCESS; +} + diff --git a/userspace/pain2.c b/userspace/pain2.c index 69784ce..259f00e 100644 --- a/userspace/pain2.c +++ b/userspace/pain2.c @@ -27,7 +27,7 @@ int main(int argc,char **argv) { _gui_win(); - for(int i=0;i +#include + +#define dimx 640 +#define dimy 480 + +/* +void doscolor(int color,int color2) +{ + int i=0; + + for (int y = 0; y < dimy; y++) + for (int x = 0; x < dimx; x++) + { + { + if(x%2&&y%2)put_pixel(x,y,color); + else put_pixel(x,y,color2); + } + } +} +*/ + +int main(int argc,char **argv) +{ + _gui_win(); + + for(int i=0;i<2000;i++) + { + for(int i=0;i<380;i+=40) + { + put_rect(0,0,640,480,0xffff00); + put_rect(i,i,100,100,0x00ffff); + _gui_rect(); + } + + for(int i=380;i>0;i-=80) + { + put_rect(0,0,640,480,0xffff00); + put_rect(i,i,100,100,0xffffff); + _gui_rect(); + } + } + + return EXIT_SUCCESS; +} + diff --git a/video/compositor.c b/video/compositor.c index f6fcc6e..d0d5bfa 100644 --- a/video/compositor.c +++ b/video/compositor.c @@ -53,6 +53,7 @@ static void put_win(struct window *win) if(win->vmem) { + x86_cli();// do not reschedule us til ready! x86_set_page_directory(win->vmem); } @@ -128,6 +129,7 @@ static void put_win(struct window *win) { x86_set_page_directory(mydir); + x86_sti(); } //draw boundaries @@ -179,6 +181,7 @@ void compositor_del_window(uint32_t addr) void compositor_add_window(uint32_t addr) { + klog("window added"); if (next_window>=MAX_WINDOWS)kpanic("max number of windows reached. increase MAX_WINDOWS"); windows[next_window]=windows[0]; -- cgit v1.2.3