summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-10-04 02:17:13 +0200
committerMiguel <m.i@gmx.at>2018-10-04 02:17:13 +0200
commit81a8252db679351f5ba388b420519724c9c2c2be (patch)
treed21bb88fb36f9492c0daf14d67c46f0b22b66def /kernel
parentce16fe524c14ccaae67fb634105da5aef08ead48 (diff)
reverting userspace idea
Diffstat (limited to 'kernel')
-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
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{