diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/interrupts.c | 18 | ||||
| -rw-r--r-- | kernel/kernel.c | 7 | ||||
| -rw-r--r-- | kernel/scheduler.c | 33 | ||||
| -rw-r--r-- | kernel/syscalls.c | 5 | ||||
| -rw-r--r-- | kernel/vmem.c | 11 |
5 files changed, 43 insertions, 31 deletions
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<MAX_TASKS;i++) { int idx=(current_task[cpu]+1+i)%MAX_TASKS; // schedule round robin style -// if(idx==2)continue;// skip sleeper here + if(idx==2)continue;// skip sleeper here uint32_t esp=scheduler_schedule(idx); if(esp)return esp; } - kpanic("nothing left to schedule"); // force the sleeper task here ... return scheduler_schedule(2); @@ -190,13 +189,13 @@ void scheduler_func() // we need enable here again (since the pushed eflags have it disabled)? TODO: why they disabled it!??? x86_sti(); - uint32_t cpu=smp_get(SMP_APIC_ID); fixme("this will dadlock on context switch during log if never switched back before finish"); if(current_task[cpu]==0) { + /* while(1) { uint64_t t0=x86_rdtscp(); @@ -204,8 +203,12 @@ void scheduler_func() uint64_t t1=x86_rdtscp(); klog("task 0 / slept cycles: l:%d h:%d",(t1-t0)); } + */ -// task_syscall_worker(); + while(1) + { + task_syscall_worker(); + } //task_list[cpu][0].syscall=true; // sleep //__asm__("int $0x81"); // wake scheduler! with IPI @@ -248,8 +251,6 @@ void scheduler_func() volatile int add_task(uint32_t parent_pid,uint32_t vmem, bool thread, char *name) { - static bool first=true; - uint32_t parent=task_runs(parent_pid); uint32_t cpu=smp_get(SMP_APIC_ID); @@ -286,12 +287,6 @@ volatile int add_task(uint32_t parent_pid,uint32_t vmem, bool thread, char *name stack[12]=0x1; stack[13]=0; // this task returns pid=0 to the caller - if(!thread&&first) - { - compositor_add_window(vmem); - first=false; - } - strcpy(task_list[cpu][i].name,name); return task_list[cpu][i].pid; @@ -327,23 +322,22 @@ void scheduler_wake_all() void task_syscall_worker() { uint32_t cpu=smp_get(SMP_APIC_ID); - task_list[cpu][0].syscall=true; // sleep (syscall misused) - return; + //task_list[cpu][0].syscall=true; // sleep (syscall misused) + //return; /// TODO: cross check all cpus! while(1) { bool wake=false; bool wake_mouse=false; - //TODO: would be enough only to lock during ringbuffer acces!? //x86_cli(); // disable temporarily mouse/kb/timer interrupts. //wake|=keyboard_worker(); - //wake_mouse|=mouse_worker(); + wake_mouse|=mouse_worker(); //x86_sti(); - //if(wake_mouse)compositor_swap_buffers(); + if(wake_mouse)compositor_swap_buffers(); //if(wake)scheduler_wake_all(); @@ -355,7 +349,7 @@ void task_syscall_worker() { uint32_t syscall=task_list[cpu][i].eax; -// klog("task pid=%d waiting on syscall %d/%s on cpu %d slot %d.",task_list[cpu][i].pid,syscall,syscall_get_name(syscall),cpu,i); + //klog("task pid=%d waiting on syscall %d/%s on cpu %d slot %d.",task_list[cpu][i].pid,syscall,syscall_get_name(syscall),cpu,i); task_list[cpu][0].vmem=task_list[cpu][i].vmem; // switch syscall worker to pagedir of calling userprog x86_set_page_directory(task_list[cpu][0].vmem); @@ -486,8 +480,9 @@ volatile int task_add_win(uint32_t pid) uint32_t cpu=smp_get(SMP_APIC_ID); uint32_t idx=task_idx(pid); - struct pdirectory *vmem=task_list[cpu][idx].vmem; + 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); return 0; } diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 3b97917..4bf63fc 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -125,6 +125,10 @@ char* syscall_get_name(uint32_t num) return "SYSCALL_PIPE"; case 86: return "SYSCALL_DUP2"; + case 87: + return "SYSCALL_GUI_RECT"; + case 88: + return "SYSCALL_GUI_WIN"; } kpanic("UNKNOWN SYSCALL NUM"); } @@ -238,7 +242,6 @@ int copy_args(char **in, char **out) int syscall_execve(const char *name, char *const argv[], char *const env[], int pid) { - fixme("not overwrite yourself?"); int arg_count=0; while(argv[arg_count]!=NULL)arg_count++; diff --git a/kernel/vmem.c b/kernel/vmem.c index a388535..704b45e 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -332,7 +332,7 @@ static void vmem_add_identity(pdirectory* dir,uint32_t addr,uint32_t pages, bool vmem_add_generic(dir,addr,addr,pages, false,user); } -pdirectory* vmem_kernel_dir() +pdirectory* vmem_kernel_dir() // we create thie once for each cpu { fixme("remove user flags where appropriate"); fixme("do not waste soo many pages/page tables!"); @@ -346,7 +346,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); @@ -359,14 +359,14 @@ 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 + //vmem_add_alloc(dir,VMEM_USER_FRAMEBUFFER,VMEM_USER_FRAMEBUFFER_PAGES,true); /// each new process gets a 640x480x32 area return dir; } void vmem_add_framebuffer(pdirectory *dir) { - //vmem_del_generic(dir,VMEM_USER_FRAMEBUFFER,VMEM_USER_FRAMEBUFFER_PAGES,false, true); +// vmem_del_generic(dir,VMEM_USER_FRAMEBUFFER,VMEM_USER_FRAMEBUFFER_PAGES,false, true); vmem_add_alloc(dir, VMEM_USER_FRAMEBUFFER,VMEM_USER_FRAMEBUFFER_PAGES,true); /// each new process gets a 640x480x32 area } @@ -481,7 +481,8 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only) 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); + // or not! + //vmem_add_remap(dir,src_phys,virt,1,true); } else{ |
