summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/interrupts.c18
-rw-r--r--kernel/kernel.c7
-rw-r--r--kernel/scheduler.c33
-rw-r--r--kernel/syscalls.c5
-rw-r--r--kernel/vmem.c11
-rw-r--r--userspace/init.c29
-rw-r--r--userspace/pain1.c49
-rw-r--r--userspace/pain2.c4
-rw-r--r--userspace/pain3.c49
-rw-r--r--video/compositor.c3
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];