#include "kernel.h" #include "smp.h" #include #include "gdt.h" #include "mem.h" #include "vmem.h" #include "interrupts.h" #include "kmalloc.h" #include "spinlock.h" #include "asm_x86.h" #include "asm_pit.h" #include "asm_smp.h" #include "apic.h" #include "vesa.h" void smp_main() { // setup stack and jump to kernel_ap(); uint32_t ebp=kballoc(1); asm volatile("mov %0, %%ebp"::"r"(ebp)); asm volatile("mov %ebp, %esp"); asm volatile("jmp kernel_ap"); } void kernel_ap() { apic_enable(); klog("Install Interrupt Vector Table (IVT) on CPU with lapic_id=0x%x ...",apic_id()); interrupts_install(); klog("Install Global Descriptor Table (GDT) on CPU with lapic_id=0x%x ...",apic_id()); gdt_init(); klog("Setup Paging on CPU with lapic_id=0x%x ...",apic_id()); struct pdirectory_struct *dir=vmem_kernel_dir(); x86_set_page_directory(dir); x86_paging_enable(); uint32_t *cpu_mem=0x8000000; //1024 pages from here on are mapped per cpu for testing! TODO: dynamic! *cpu_mem=apic_id(); klog("Setup the LAPIC Timer on CPU with lapic_id=0x%x ...",apic_id()); apic_init_timer(1);// freq 1HZ klog("Enable Interrupts on CPU with lapic_id=0x%x ...",apic_id()); x86_sti(); asm_smp_unlock(); // cpu_mem[1]=0; while(1){ PutString("cpu cnt: %d",10,10+(*cpu_mem)*20,0xff0000,cpu_mem[1]++); asm("hlt"); } } // this will start all our application processors! void smp_start_aps(acpi_information *pros) { for(int i=0;iprocessors;i++) { if(pros->boot==i)continue; // skib bsp 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 } }