summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-10-01 14:37:18 +0200
committerMiguel <m.i@gmx.at>2018-10-01 14:37:18 +0200
commitb518f39803eaaf0b25b95baf951b12ef4d5a727e (patch)
treed595877fd1869b280ba33bc2256a3b3da8eb8c95 /kernel
parent75433d155c152b809e9f25b1099fc06d6106308b (diff)
struggling with interrupts and scheduler
Diffstat (limited to 'kernel')
-rw-r--r--kernel/interrupts.c14
-rw-r--r--kernel/kernel.c1
-rw-r--r--kernel/kernel.h2
-rw-r--r--kernel/log.c4
-rw-r--r--kernel/scheduler.c6
-rw-r--r--kernel/smp.c7
-rw-r--r--kernel/vmem.c18
7 files changed, 32 insertions, 20 deletions
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;