diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/interrupts.c | 27 | ||||
| -rw-r--r-- | kernel/kernel.c | 21 | ||||
| -rw-r--r-- | kernel/mem.c | 14 | ||||
| -rw-r--r-- | kernel/scheduler.c | 14 | ||||
| -rw-r--r-- | kernel/smp.c | 27 | ||||
| -rw-r--r-- | kernel/smp.h | 2 | ||||
| -rw-r--r-- | kernel/vmem.c | 5 |
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); |
