From 47d7e8e4527c663dd1a0c04a4ea5624589464895 Mon Sep 17 00:00:00 2001 From: Miguel Date: Fri, 31 Aug 2018 11:49:07 +0200 Subject: various improvmenets * added debugging symbols to nasm output * started implementing an unified interrupt interface * moved smp entry point to kernel image! --- kernel/interrupts.c | 43 +++++++++++++++++++++++-------------------- kernel/kernel.c | 4 ++-- kernel/smp.c | 7 ------- 3 files changed, 25 insertions(+), 29 deletions(-) (limited to 'kernel') diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 51682b4..74377ad 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -1,4 +1,5 @@ #include "kernel/kernel.h" +#include "asm/int.h" #include "asm/asm.h" #include "asm/pit.h" #include "driver/mouse.h" @@ -7,6 +8,13 @@ #define INT_MAX 255 // size of our interrupts table + +uint32_t interrupt_handler(uint32_t num, uint32_t esp) +{ + if(num!=990)klog("int: %d %d",num,esp); + return esp; +} + void errlog(uint32_t error_code) { klog("error_code: 0x%08X",error_code); @@ -129,16 +137,16 @@ void interrupts_init(uint16_t sel) } // exceptions - int_install_ir(0, 0b10001110, 0x08,&int_irq0); - int_install_ir(1, 0b10001110, 0x08,&int_irq1); - int_install_ir(2, 0b10001110, 0x08,&int_irq2); - int_install_ir(3, 0b10001110, 0x08,&int_irq3); - int_install_ir(4, 0b10001110, 0x08,&int_irq4); - int_install_ir(5, 0b10001110, 0x08,&int_irq5); - int_install_ir(6, 0b10001110, 0x08,&int_irq6); - int_install_ir(7, 0b10001110, 0x08,&int_irq7); - int_install_ir(8, 0b10001110, 0x08,&int_irq8); - int_install_ir(9, 0b10001110, 0x08,&int_irq9); + int_install_ir(0, 0b10001110, 0x08,&int_irq0); + int_install_ir(1, 0b10001110, 0x08,&int_irq1); + int_install_ir(2, 0b10001110, 0x08,&int_irq2); + int_install_ir(3, 0b10001110, 0x08,&int_irq3); + int_install_ir(4, 0b10001110, 0x08,&int_irq4); + int_install_ir(5, 0b10001110, 0x08,&int_irq5); + int_install_ir(6, 0b10001110, 0x08,&int_irq6); + int_install_ir(7, 0b10001110, 0x08,&int_irq7); + int_install_ir(8, 0b10001110, 0x08,&int_irq8); + int_install_ir(9, 0b10001110, 0x08,&int_irq9); int_install_ir(10, 0b10001110, 0x08,&int_irq10); int_install_ir(11, 0b10001110, 0x08,&int_irq11); int_install_ir(12, 0b10001110, 0x08,&int_irq12); @@ -153,27 +161,22 @@ void interrupts_init(uint16_t sel) // remember that we shifted all interrupts with the pic by 32 // install PIT interrupt handler (irq 0 => 32) - int_install_ir(32, 0b10001110, 0x08,&pit_interrupt_handler); + int_install_ir(32, 0b10001110, 0x08,&int0); // install keyboard interrupt handler (irq 1 => 33) - int_install_ir(33, 0b10001110, 0x08,&int_kb_handler); + int_install_ir(33, 0b10001110, 0x08,&int1); //mouse interrupt handler (irq 12 => 34) - int_install_ir(44, 0b10001110, 0x08,&int_mouse_handler); + int_install_ir(44, 0b10001110, 0x08,&int12); - //system calls - int_install_ir(0x80, 0b11101110, 0x08,&int_syscall_handler); + //system calls (can be called from ring3 (0b11)) + int_install_ir(0x80, 0b11101110, 0x08,&int128); int_install(); - - // now we can enable interrupts back again - // x86_sti(); - //x86_cli(); } void int_install() { - idtd.size=sizeof(struct int_desc)*INT_MAX; uint32_t addr=(uint32_t)&idt[0]; diff --git a/kernel/kernel.c b/kernel/kernel.c index 97aef77..9392a1e 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -56,11 +56,11 @@ void kernel_main(uint32_t eax,uint32_t ebx) fs_mount(info); // Start the other Processors (before paging because apic addr etc..?) - //TODO: !!! Check commented out sleep ()!!! + //TODO: remap apic !!! Check commented out sleep ()!!! // https://wiki.osdev.org/Symmetric_Multiprocessing klog("Symmetric Multi Processing (SMP) start ... "); smp_log_procdata(&procdata); - //smp_start_aps(&procdata,"/boot/mp.bin"); //will be copied over mbr + smp_start_aps(&procdata); klog("Vritual Memory / Paging init ... "); pdirectory *dir=vmem_init(kernel_blocks,(uint32_t)info->framebuffer_addr); diff --git a/kernel/smp.c b/kernel/smp.c index 4fe0705..e2de6fe 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -86,13 +86,6 @@ void smp_start_aps(smp_processors *pros,char *path) { local_apic_addr=pros->local_apic_address; - //lets copy the binary into mbr - fs_content(path,0x7000,0x100); // copy 0x100 bytes to 0x7000 - - // tell them where to enter (agreed adress at 0x8010) - uint32_t *entry=0x8010; - *entry=smp_main; - //bsp (boot processor) enables its local apic // uint32_t *reg=local_apic_addr+FOOLOS_APIC_SPUR_INT; // *reg=0xffffffff; // all bits 1 and interrupt 255 (is this not set anyway?) -- cgit v1.2.3