diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/interrupts.c | 14 | ||||
| -rw-r--r-- | kernel/kernel.c | 1 | ||||
| -rw-r--r-- | kernel/kernel.h | 2 | ||||
| -rw-r--r-- | kernel/log.c | 4 | ||||
| -rw-r--r-- | kernel/scheduler.c | 6 | ||||
| -rw-r--r-- | kernel/smp.c | 7 | ||||
| -rw-r--r-- | kernel/vmem.c | 18 |
7 files changed, 32 insertions, 20 deletions
diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 8bff84b..49c0191 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -64,9 +64,7 @@ void interrupt_register(uint32_t irq, uint32_t func_addr) */ uint32_t interrupt_handler(uint32_t esp, uint32_t irq) { - uint32_t cpu=smp_get(SMP_APIC_ID); uint32_t *stack; - static uint32_t timer=0; if(handlers[irq]!=0) { @@ -90,17 +88,7 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq) case INTERRUPT_APIC_TIMER: // frequency is configured in smp.c (100hz) - - if(cpu==0) - { - timer++; - if(timer==10){ - compositor_swap_buffers(); - esp=scheduler_run(esp,-1); - timer=0; - } - } - + esp=scheduler_run(esp,-1); apic_eoi(); break; diff --git a/kernel/kernel.c b/kernel/kernel.c index 03dae1f..f55b948 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -159,5 +159,6 @@ void kernel_main(uint32_t eax,uint32_t ebx) } klog("Symmetric Multi Processing (SMP) start ... "); +// for(int i=1;i<cfg_acpi.processors;i++)apic_sipi(i,0x7); smp_bsp(); } diff --git a/kernel/kernel.h b/kernel/kernel.h index 8baa57a..1973d52 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -41,7 +41,7 @@ REFERENCES #define MAX_TASKS 100 #define MEM_PRINT_MEMORYMAP -#define KMALLOC_MEM_SIZE (1024*1024*1) // 8MB for in kernel-memory +#define KMALLOC_MEM_SIZE (1024*1024*8) // 8MB for in kernel-memory #define KMALLOC_BLOCK_SIZE (1024*4) // 4096 per block #define NUMBER_SPINLOCKS 16 diff --git a/kernel/log.c b/kernel/log.c index 2e14dff..af6ebac 100644 --- a/kernel/log.c +++ b/kernel/log.c @@ -47,7 +47,7 @@ void log(bool color,char *module_name, int prio, char *format_string, ...) if(color) tfp_sprintf(buf_log,"\033[36;40m%s\033[31;40m %s:\033[37;40m %s\n",buf_time,module_name,buf_info); else tfp_sprintf(buf_log,"%s %s: %s\n",buf_time,module_name,buf_info); - spinlock_spin(SPINLOCK_LOG); +// spinlock_spin(SPINLOCK_LOG); log_string(buf_log); - spinlock_release(SPINLOCK_LOG); +// spinlock_release(SPINLOCK_LOG); } diff --git a/kernel/scheduler.c b/kernel/scheduler.c index ff46889..fa32ebc 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -123,6 +123,7 @@ static uint32_t scheduler_schedule(uint32_t idx) if(current_task[cpu]!=0)last_task[cpu]=current_task[cpu]; current_task[cpu]=idx; + klog("%d",idx); // klog("%d idx %d",last_task[cpu],current_task[cpu]); install_tss(cpu,task_list[cpu][idx].esp0); @@ -227,7 +228,7 @@ void scheduler_func() } } -volatile int add_task(uint32_t parent_pid,uint32_t vmem, bool thread) +volatile int add_task(uint32_t parent_pid,uint32_t vmem, bool thread, char *name) { static bool first=true; @@ -270,7 +271,7 @@ volatile int add_task(uint32_t parent_pid,uint32_t vmem, bool thread) if(!thread&&first) { compositor_add_window(vmem); - //first=false; + first=false; } return task_list[cpu][i].pid; @@ -320,6 +321,7 @@ void task_syscall_worker() x86_sti(); if(wake)scheduler_wake_all(); + if(cpu==0)compositor_swap_buffers(); for(int i=0;i<MAX_TASKS;i++) { diff --git a/kernel/smp.c b/kernel/smp.c index 1b06352..0438db8 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -67,6 +67,13 @@ void run_smp() smp_set(1000,'a'+apic_id()); smp_set(SMP_SCHEDULER_INIT,1); + if(apic_id()==0) + { +// apic_sipi(1,0x7); +// apic_sipi(2,0x7); +// apic_sipi(3,0x7); + } + x86_sti(); while(1)asm("hlt"); // wait for scheduler to kick in diff --git a/kernel/vmem.c b/kernel/vmem.c index f6592b3..a1ee0e2 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -343,7 +343,13 @@ void vmem_free_space_dir(pdirectory *dir,bool stack_only) if(src_pd) { + if(virt>=VMEM_USER_FRAMEBUFFER&&virt<VMEM_USER_FRAMEBUFFER+VMEM_USER_FRAMEBUFFER_PAGES*4096) + { + } + else + { mem_free_block(src_phys); + } } virt+=4096; @@ -368,7 +374,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 + // temp disable // 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); } @@ -405,7 +411,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool 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) +// ||(virt>=VMEM_USER_FRAMEBUFFER&&virt<VMEM_USER_FRAMEBUFFER+VMEM_USER_FRAMEBUFFER_PAGES*4096) ) ) { @@ -414,6 +420,13 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only) } else { + if(virt>=VMEM_USER_FRAMEBUFFER&&virt<VMEM_USER_FRAMEBUFFER+VMEM_USER_FRAMEBUFFER_PAGES*4096) + { + // and for now we all share this! // + vmem_add_remap(dir,src_phys,virt,1,true); + } + else{ + //klog("copy virt: %x / phys: %x -> %x",virt,src_phys,dst_phys); @@ -427,6 +440,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only) x86_invlpg(VMEM_COPY_PAGE+4096); // refresh TLB memcpy(VMEM_COPY_PAGE+4096,VMEM_COPY_PAGE,4096); + } } } virt+=4096; |
