diff options
| author | Miguel <m.i@gmx.at> | 2018-10-01 14:37:18 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-10-01 14:37:18 +0200 |
| commit | b518f39803eaaf0b25b95baf951b12ef4d5a727e (patch) | |
| tree | d595877fd1869b280ba33bc2256a3b3da8eb8c95 | |
| parent | 75433d155c152b809e9f25b1099fc06d6106308b (diff) | |
struggling with interrupts and scheduler
| -rw-r--r-- | Makefile | 2 | ||||
| -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 | ||||
| -rw-r--r-- | video/compositor.c | 1 |
9 files changed, 34 insertions, 21 deletions
@@ -206,7 +206,7 @@ qemu-debug: all -net nic,model=e1000 \ -net tap,ifname=tap0,script=no,downscript=no \ -vga virtio \ - -m 1024 + -m 1024 -s #-S # qemu -enable-kvm -s -S ~/temp/FoolOs/disk.img # qemu -enable-kvm -s -singlestep disk.img # qemu-system-i386 -enable-kvm -s -S -kernel foolos.img -smp 4 -initrd userspace/ext2.img 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; diff --git a/video/compositor.c b/video/compositor.c index e5aa325..0997978 100644 --- a/video/compositor.c +++ b/video/compositor.c @@ -211,6 +211,7 @@ void compositor_swap_buffers() static bool first=true; // if(!first)return; // klog("swap"); +// background memcpy(backbuffer,bgimage,vesa_height*vesa_width*4);// TODO optimize? rects only too? for(int i=next_window-1;i>=0;i--) |
