diff options
| -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 | ||||
| -rw-r--r-- | userspace/init.c | 29 | ||||
| -rw-r--r-- | userspace/pain1.c | 49 | ||||
| -rw-r--r-- | userspace/pain2.c | 4 | ||||
| -rw-r--r-- | userspace/pain3.c | 49 | ||||
| -rw-r--r-- | video/compositor.c | 3 |
10 files changed, 169 insertions, 39 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{ diff --git a/userspace/init.c b/userspace/init.c index d130bc8..7237fdc 100644 --- a/userspace/init.c +++ b/userspace/init.c @@ -5,18 +5,35 @@ int main(int argc, char **argv) { - // int x=10/0; // provoke divide by zero + // loop forever and spawn shells if the top-shell exits + + int pid=_fork(); - uint8_t *mem=0xf6000000; - *mem='a'; - while(1); + if(pid==0) + { + _execve("/bin/pain1",NULL,NULL); + } + else + { + int pid=_fork(); + if(pid==0) + { + _execve("/bin/pain2",NULL,NULL); + } + else + { + _execve("/bin/pain3",NULL,NULL); + } + } + + + return 0; + // char *argv1[]={"/bin/fsh",0}; char *env1[]={"HOME=/home/miguel","PS1=\033[34m$\033[37m","PWD=/home/miguel","PATH=/bin","TERM=fool-term",0}; - - // loop forever and spawn shells if the top-shell exits while(1) { diff --git a/userspace/pain1.c b/userspace/pain1.c new file mode 100644 index 0000000..c486636 --- /dev/null +++ b/userspace/pain1.c @@ -0,0 +1,49 @@ +#include "put_pixel.h" +#include "newcalls.h" + +#include <stdlib.h> +#include <stdio.h> + +#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<atoi(argv[1]);i++) + for(int i=0;i<2000;i++) { for(int i=0;i<380;i+=40) { @@ -44,6 +44,6 @@ int main(int argc,char **argv) } } - return EXIT_SUCCESS; + return EXIT_SUCCESS; } diff --git a/userspace/pain3.c b/userspace/pain3.c new file mode 100644 index 0000000..2633c73 --- /dev/null +++ b/userspace/pain3.c @@ -0,0 +1,49 @@ +#include "put_pixel.h" +#include "newcalls.h" + +#include <stdlib.h> +#include <stdio.h> + +#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]; |
