diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/interrupts.c | 2 | ||||
| -rw-r--r-- | kernel/kernel.c | 1 | ||||
| -rw-r--r-- | kernel/kernel.h | 3 | ||||
| -rw-r--r-- | kernel/scheduler.c | 3 | ||||
| -rw-r--r-- | kernel/smp.c | 2 | ||||
| -rw-r--r-- | kernel/vmem.c | 17 |
6 files changed, 20 insertions, 8 deletions
diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 387b822..e91d3ae 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -12,6 +12,7 @@ #include "smp.h" #include "apic.h" #include "ringbuffer.h" +#include "compositor.h" /** The size of our interrupts table */ #define INT_MAX 256 // 0-255 @@ -88,6 +89,7 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq) break; case INTERRUPT_APIC_TIMER: // frequency is configured in smp.c + compositor_swap_buffers(); esp=scheduler_run(esp,-1); apic_eoi(); break; diff --git a/kernel/kernel.c b/kernel/kernel.c index e37f76f..c6618ce 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -136,6 +136,7 @@ void kernel_main(uint32_t eax,uint32_t ebx) 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 ..."); diff --git a/kernel/kernel.h b/kernel/kernel.h index 1dcfb60..8baa57a 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -87,4 +87,7 @@ REFERENCES #define VMEM_FRAMEBUFFER_PAGES (1024*8) #define VMEM_EXT2_RAMIMAGE 0xF8000000 // 8192 pages (32megs) / identity mapped +#define VMEM_USER_FRAMEBUFFER 0xFA000000 +#define VMEM_USER_FRAMEBUFFER_PAGES 300// 4*320*480 bytes per app (one extra?) + #endif diff --git a/kernel/scheduler.c b/kernel/scheduler.c index 23ed7b2..e5cdec7 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -2,6 +2,7 @@ #include "kernel.h" #include "gdt.h" #include "log.h" +#include "compositor.h" #include "smp.h" #include "mem.h" @@ -263,6 +264,8 @@ volatile int add_task(uint32_t parent_pid,uint32_t vmem, bool thread) uint32_t *stack=task_list[cpu][i].esp; stack[12]=0x1; stack[13]=0; // this task returns pid=0 to the caller + + if(!thread)compositor_add_window(vmem); return task_list[cpu][i].pid; } diff --git a/kernel/smp.c b/kernel/smp.c index f23d15a..cf58b88 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -65,7 +65,7 @@ void run_smp() apic_enable(); klog("Setup the LAPIC Timer on CPU with lapic_id=0x%x ...",apic_id()); - apic_init_timer(1);// freq x HZ + apic_init_timer(5);// freq x HZ klog("Enable Interrupts on CPU with lapic_id=0x%x ...",apic_id()); asm_smp_unlock(); diff --git a/kernel/vmem.c b/kernel/vmem.c index 1eaf291..883d56d 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -299,7 +299,7 @@ pdirectory* vmem_kernel_dir() vmem_add_identity(dir,VMEM_KERNEL,VMEM_KERNEL_PAGES,false);//identity map first 32 megs... vmem_add_identity(dir,e1000_addr,32,false);//identity map 32 pages for e1000 - vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,VMEM_FRAMEBUFFER_PAGES,true);//32megs should be enough for 4k (think about pitch) + vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,VMEM_FRAMEBUFFER_PAGES,false);//32megs should be enough for 4k (think about pitch) vmem_add_remap(dir,local_apic_addr,VMEM_LAPIC,1,false); //apic addr should be at pagestart, right? TODO: check. vmem_add_remap(dir,io_apic_addr,VMEM_IOAPIC,1,false); @@ -312,6 +312,7 @@ pdirectory* vmem_kernel_dir() vmem_add_alloc(dir,VMEM_USER_ENV,1,true); vmem_add_alloc(dir,VMEM_USER_NEWLIB,1,true); vmem_add_alloc(dir,VMEM_USER_STACK_TOP-4096*VMEM_USER_STACK_PAGES,VMEM_USER_STACK_PAGES,true); + vmem_add_alloc(dir,VMEM_USER_FRAMEBUFFER,VMEM_USER_FRAMEBUFFER_PAGES,true); /// each new process gets a 640x480x32 area return dir; } @@ -336,7 +337,6 @@ void vmem_free_space_dir(pdirectory *dir,bool stack_only) for(int j=0;j<1024;j++) { - if(virt>=VMEM_FRAMEBUFFER&&virt<VMEM_FRAMEBUFFER+VMEM_FRAMEBUFFER_PAGES*4096)continue; // skip framebuffer pls uint32_t src_pd=src_table->m_entries[j]; uint32_t src_phys=pd_entry_get_frame(&src_pd); @@ -367,6 +367,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only) if(!stack_only) { + vmem_add_alloc(dir,VMEM_USER_FRAMEBUFFER,VMEM_USER_FRAMEBUFFER_PAGES,true); /// each new process gets a 640x480x32 area vmem_add_alloc(dir,VMEM_USER_PROG,VMEM_USER_PROG_PAGES,true); vmem_add_alloc(dir,VMEM_USER_ENV,1,true); } @@ -391,8 +392,6 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only) for(int j=0;j<1024;j++) { - if(virt>=VMEM_FRAMEBUFFER&&virt<VMEM_FRAMEBUFFER+VMEM_FRAMEBUFFER_PAGES*4096)continue; // skip framebuffer pls - uint32_t src_pd=src_table->m_entries[j]; uint32_t dst_pd=dst_table->m_entries[j]; @@ -401,7 +400,13 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only) if(src_pd) { - if(stack_only&&(virt==VMEM_USER_ENV||(virt>=VMEM_USER_PROG&&virt<VMEM_USER_PROG+VMEM_USER_PROG_PAGES*4096))) + if(stack_only&& + ( + virt==VMEM_USER_ENV + ||(virt>=VMEM_USER_PROG&&virt<VMEM_USER_PROG+VMEM_USER_PROG_PAGES*4096) + ||(virt>=VMEM_USER_FRAMEBUFFER&&virt<VMEM_USER_FRAMEBUFFER+VMEM_USER_FRAMEBUFFER_PAGES*4096) + ) + ) { // threads share this // vmem_add_remap(dir,src_phys,virt,1,true); @@ -429,8 +434,6 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only) else virt+=4096*1024; } - vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,VMEM_FRAMEBUFFER_PAGES,true);//32megs should be enough for 4k (think about pitch) - return dir; } |
