summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-29 19:57:52 +0200
committerMiguel <m.i@gmx.at>2018-09-29 19:57:52 +0200
commit75433d155c152b809e9f25b1099fc06d6106308b (patch)
treef4f84309e6cf2aa9bc0d9df5ae532b94a60fea0f /kernel
parent73e80bf4b6c69b92a04b525f114a072a1c4b0d3a (diff)
improving window compositor
Diffstat (limited to 'kernel')
-rw-r--r--kernel/interrupts.c27
-rw-r--r--kernel/kernel.c21
-rw-r--r--kernel/mem.c14
-rw-r--r--kernel/scheduler.c14
-rw-r--r--kernel/smp.c27
-rw-r--r--kernel/smp.h2
-rw-r--r--kernel/vmem.c5
7 files changed, 56 insertions, 54 deletions
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index e91d3ae..8bff84b 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -64,8 +64,9 @@ 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)
{
@@ -73,29 +74,38 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq)
esp=f(esp);
apic_eoi();
}
+
else if(irq!=INTERRUPT_SYSCALL&&irq!=INTERRUPT_IPI&&irq!=INTERRUPT_APIC_TIMER)
{
kpanic("unhandled interrupt %d",irq);
}
-
// process IRQ
switch(irq)
{
case INTERRUPT_SYSCALL:
stack=esp;
task_syscall(stack[11],stack[8],stack[10],stack[9]); //eax,ebx,ecx,edx
- esp=scheduler_wake_worker(esp);
break;
- case INTERRUPT_APIC_TIMER: // frequency is configured in smp.c
- compositor_swap_buffers();
- esp=scheduler_run(esp,-1);
+
+ 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;
+ }
+ }
+
apic_eoi();
break;
case INTERRUPT_IPI: // inter process interrupt
- esp=scheduler_run(esp,0);
+ esp=scheduler_run(esp,-1);
apic_eoi();
break;
@@ -107,7 +117,8 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq)
// reschedule to kernel worker on these
if(irq==INTERRUPT_SYSCALL||irq==INTERRUPT_KEYBOARD||irq==INTERRUPT_MOUSE)
{
- esp=scheduler_wake_worker(esp);
+ scheduler_wake_worker(esp);
+ esp=scheduler_run(esp,-1);
}
// Ack all to LAPIC, except software syscalls
diff --git a/kernel/kernel.c b/kernel/kernel.c
index c6618ce..03dae1f 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -13,6 +13,7 @@
#include "vmem.h"
//-- clean below headers --//
+#include "asm_start.h"
#include "compositor.h"
#include "sysfs.h"
#include "pci.h"
@@ -40,12 +41,6 @@
#include "driver/vesa.h"
#include "asm_pit.h"
-//ugly?
-extern uint32_t kernel_end[];
-extern uint32_t kernel_start[];
-
-//TODO: we fear overrun of the initial buffer!
-//
/* F00L 0S Entry point (called directly from asm/multiboot.asm */
void kernel_main(uint32_t eax,uint32_t ebx)
{
@@ -62,9 +57,10 @@ void kernel_main(uint32_t eax,uint32_t ebx)
klog("======================================");
uint32_t *top_kernel_vmem=VMEM_KERNEL+VMEM_KERNEL_PAGES*4096;
- klog("The Kernel was loaded at: 0x%08X - 0x%08X",kernel_start,kernel_end);
+ klog("The Kernel was loaded at: 0x%08X - 0x%08X",get_kernel_start(),get_kernel_end());
klog("0x00000000 - 0x%08X will get identity mapped", VMEM_KERNEL_PAGES*4096);
if(kernel_end>=top_kernel_vmem)kpanic("kernel to big. increase VMEM_KERNEL_PAGES");
+ fixme("fear overrun of the initial buffer!");
// -- DISABLE LEGACY PIC -- //
klog("Remapping & Disabling Programmable Interrupt Controller (PIC) ...");
@@ -106,7 +102,6 @@ void kernel_main(uint32_t eax,uint32_t ebx)
fixme("do not disable anymore on context switching!");
fixme("write convenneint management funcs as: mapCPU, mapKErnel, map USerspace..");
fixme("move stack and guard with empty pages!");
-
vmem_init(cfg_multiboot,&cfg_acpi,e1000_addr);
struct pdirectory_struct *dir=vmem_kernel_dir();
@@ -157,10 +152,12 @@ void kernel_main(uint32_t eax,uint32_t ebx)
klog("Unix Time = %u seconds",unixtime);
// -- E1000 INIT (TODO: only if present!) --/
- klog("E1000 init ...");
- fixme("do not hardcode address and allow paging somehwere else");
- e1000_init(e1000_addr);
+ if(e1000_addr)
+ {
+ klog("E1000 init ...");
+ e1000_init(e1000_addr);
+ }
klog("Symmetric Multi Processing (SMP) start ... ");
- smp_start_aps(&cfg_acpi);
+ smp_bsp();
}
diff --git a/kernel/mem.c b/kernel/mem.c
index d8ac66a..2d5d9f9 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -3,19 +3,14 @@
#include "mem.h"
#include <stdint.h>
#include "multiboot.h"
+#include "asm_start.h"
#define PMMNGR_BLOCKS_PER_BYTE 8
#define PMMNGR_BLOCK_SIZE 4096
#define PMMNGR_MAX_BLOCKS 1048576 // 4096*1048576 = 2^32 bytes (maxium addressable memory ~4GB)
#define PMMNGR_MAP_SIZE PMMNGR_MAX_BLOCKS/PMMNGR_BLOCKS_PER_BYTE/4
-// defined in linker.ld and asm_start.s
-extern uint32_t kernel_start[];
-extern uint32_t kernel_end[];
-extern uint32_t stack_top[];
-extern uint32_t stack_bottom[];
-
-// sysfs inpue
+// sysfs input test!
uint32_t sysfs_in=128;
//memory map bit array. Each bit represents a 4KB memory block,
@@ -155,8 +150,11 @@ uint32_t mem_get_free_blocks_count()
uint32_t mem_init(multiboot_information *info)
{
klog("markers in kernel binary:");
+
+ uint32_t kernel_start=get_kernel_start();
+ uint32_t kernel_end=get_kernel_end();
+
klog("kernel loaded at: 0x%08X- 0x%08X",kernel_start,kernel_end);
- klog("initial stack at: 0x%08X- 0x%08X",stack_top,stack_bottom);
fixme("check if kernel/ramimage size/pos does not exceed first 32mb (better vmem dynamically) limits!");
fixme("communicate pages to vmmem to identity map in kernel!");
diff --git a/kernel/scheduler.c b/kernel/scheduler.c
index e5cdec7..ff46889 100644
--- a/kernel/scheduler.c
+++ b/kernel/scheduler.c
@@ -176,7 +176,7 @@ volatile uint32_t scheduler_run(uint32_t oldesp,uint32_t preference)
for(int i=0;i<MAX_TASKS;i++)
{
int idx=(last_task[cpu]+1+i)%MAX_TASKS; // schedule round robin style
- if(preference==-1&&idx==0)continue;
+// if(preference==-1&&idx==0)continue;
if(idx==preference||idx==2)continue;// skip sleeper and preferred tasks here.
@@ -229,6 +229,8 @@ void scheduler_func()
volatile int add_task(uint32_t parent_pid,uint32_t vmem, bool thread)
{
+ static bool first=true;
+
uint32_t parent=task_runs(parent_pid);
uint32_t cpu=smp_get(SMP_APIC_ID);
@@ -265,7 +267,11 @@ volatile int add_task(uint32_t parent_pid,uint32_t vmem, bool thread)
stack[12]=0x1;
stack[13]=0; // this task returns pid=0 to the caller
- if(!thread)compositor_add_window(vmem);
+ if(!thread&&first)
+ {
+ compositor_add_window(vmem);
+ //first=false;
+ }
return task_list[cpu][i].pid;
}
@@ -277,7 +283,8 @@ uint32_t scheduler_wake_worker(uint32_t oldesp)
{
uint32_t cpu=smp_get(SMP_APIC_ID);
task_list[cpu][0].syscall=false; // wake (syscall misused)
- return scheduler_run(oldesp,0);
+ return 0;
+// return scheduler_run(oldesp,0);
}
void scheduler_wake_all()
@@ -484,5 +491,6 @@ void task_exit(uint32_t pid)
task_list[cpu][i].active=false;
}
+ compositor_del_window(task_list[cpu][idx].vmem);
vmem_free_space_dir(task_list[cpu][idx].vmem,task_list[cpu][idx].thread);
}
diff --git a/kernel/smp.c b/kernel/smp.c
index cf58b88..1b06352 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -16,8 +16,6 @@
#include "vesa.h"
#include "syscalls.h"
-void run_smp();
-
// set cpu private value
void smp_set(uint32_t offset, uint32_t value)
{
@@ -55,17 +53,12 @@ void smp_main_generic(bool bsp)
asm volatile("jmp run_smp");
}
-void smp_main()
-{
- smp_main_generic(false);
-}
-
void run_smp()
{
apic_enable();
klog("Setup the LAPIC Timer on CPU with lapic_id=0x%x ...",apic_id());
- apic_init_timer(5);// freq x HZ
+ apic_init_timer(100);// freq x HZ
klog("Enable Interrupts on CPU with lapic_id=0x%x ...",apic_id());
asm_smp_unlock();
@@ -79,18 +72,12 @@ void run_smp()
while(1)asm("hlt"); // wait for scheduler to kick in
}
-// this will start all our application processors!
-void smp_start_aps(acpi_information *pros)
+void smp_main()
{
- /*
- for(int i=0;i<pros->processors;i++)
- {
- if(pros->boot==i)continue; // skib bsp
+ smp_main_generic(false);
+}
- uint8_t dest=pros->local_apic_id[i];
- klog("starting cpu %d (destination apic id: 0x%x) ",i,dest);
- apic_sipi(dest,0x7); // start on 0x7000
- }
-*/
- smp_main_generic(true);
+void smp_bsp()
+{
+ smp_main_generic(true);
}
diff --git a/kernel/smp.h b/kernel/smp.h
index 862c903..eb247b4 100644
--- a/kernel/smp.h
+++ b/kernel/smp.h
@@ -17,7 +17,7 @@
#include "acpi.h"
-void smp_start_aps(acpi_information *);
+void smp_bsp();
void smp_set(uint32_t offset, uint32_t value);
uint32_t smp_get(uint32_t offset);
diff --git a/kernel/vmem.c b/kernel/vmem.c
index 883d56d..f6592b3 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -26,7 +26,7 @@
//! page sizes are 4kb
#define PAGE_SIZE 4096
-uint32_t e1000_addr;
+static uint32_t e1000_addr;
//! page table entry
typedef uint32_t pt_entry;
@@ -44,10 +44,10 @@ typedef struct pdirectory_struct {
pd_entry m_entries[PAGES_PER_DIR];
}pdirectory;
-static uint32_t kernel_pages;
static uint32_t fb_addr;
static uint32_t local_apic_addr;
static uint32_t io_apic_addr;
+
static uint32_t mod_start;
static uint32_t mod_end;
@@ -319,6 +319,7 @@ pdirectory* vmem_kernel_dir()
void vmem_free_space_dir(pdirectory *dir,bool stack_only)
{
+
fixme("free kmalloc too!");
fixme("stack_only version too!");
klog("free page directory at: 0x%X",dir);