diff options
| author | Miguel <m.i@gmx.at> | 2018-09-04 01:39:10 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-09-04 01:39:10 +0200 |
| commit | f67ad595650954195ef064a8b91038dbd0e16842 (patch) | |
| tree | f954239e0b9125df4ca44cdc6bb85090a1cfbe51 /kernel | |
| parent | 7eb87bf3f3fa6226657a7106eb255cbfa97758d2 (diff) | |
ioapic & lapic
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/acpi.c | 12 | ||||
| -rw-r--r-- | kernel/kernel.c | 11 | ||||
| -rw-r--r-- | kernel/smp.c | 16 | ||||
| -rw-r--r-- | kernel/smp.h | 2 | ||||
| -rw-r--r-- | kernel/vmem.h | 1 |
5 files changed, 23 insertions, 19 deletions
diff --git a/kernel/acpi.c b/kernel/acpi.c index 6d1fbc8..084c193 100644 --- a/kernel/acpi.c +++ b/kernel/acpi.c @@ -1,7 +1,7 @@ #include "kernel/kernel.h" // Advanced Configuration and Power Interface // http://wiki.xomb.org/index.php?title=ACPI_Tables - +// https://wiki.osdev.org/MADT#Entry_Type_1_:_I.2FO_APIC #include <stdint.h> @@ -58,11 +58,11 @@ typedef struct uint8_t *apci_get_next_entry(uint8_t *addr,smp_processors *procdata) { - klog("Examining MADT Entry at 0x%08X",addr); + //klog("Examining MADT Entry at 0x%08X",addr); if(*addr==0) { - klog("MADT Entry: LocalAPIC"); + klog("MADT Entry: LocalAPIC ()"); // usable if(addr[4]&1) { @@ -78,7 +78,7 @@ uint8_t *apci_get_next_entry(uint8_t *addr,smp_processors *procdata) } else if(*addr==1) { - klog("MADT Entry: IO APIC"); + klog("MADT Entry: IO APIC 0x%08X",addr[4]); } else if(*addr==2)klog("MADT Entry: Interrupt Source Override"); else klog("MADT Entry: type:0x%X",*addr); @@ -91,7 +91,7 @@ void acpi_check_madt(uint32_t *madt,smp_processors *procdata) { acpi_madt *table=(acpi_madt *)*madt; - klog("Looking for MADT Table at %08X.",table); +// klog("Looking for MADT Table at %08X.",table); if(!strcmp_l("APIC",table->sig,4)) { klog("Found MADT Table at 0x%08X",table); @@ -102,6 +102,7 @@ void acpi_check_madt(uint32_t *madt,smp_processors *procdata) entry+=sizeof(acpi_madt); procdata->local_apic_address=table->apic_local; + procdata->flags=table->flags; while(entry<end) { @@ -142,6 +143,7 @@ bool acpi_find(smp_processors *procdata) { klog("Looking for RSDP Table"); char *search=(char *)0x9f000; //will be 16 bit aligned; + procdata->processors=0; procdata->boot=0; diff --git a/kernel/kernel.c b/kernel/kernel.c index 7058a8a..bf6910d 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -45,7 +45,8 @@ void kernel_main(uint32_t eax,uint32_t ebx) klog("Symmetrical Multi Processing (SMP) init ... "); smp_processors procdata; - if(!acpi_find(&procdata)&&!mp_find(&procdata))kpanic("No ACPI or MP found!"); +// if(!acpi_find(&procdata)&&!mp_find(&procdata))kpanic("No ACPI or MP found!"); + if(!acpi_find(&procdata))("No ACPI found!"); klog("Memory init ... "); uint32_t kernel_blocks=mem_init(info); @@ -53,12 +54,15 @@ void kernel_main(uint32_t eax,uint32_t ebx) klog("Ram Filesystem init ... "); fs_mount(info); + klog("Interrupt Vector Table (IVT) init ..."); + interrupts_init(0x08); + // Start the other Processors (before paging because apic addr etc..?) //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); + smp_start_aps(&procdata); klog("Vritual Memory / Paging init ... "); pdirectory *dir=vmem_init(kernel_blocks,(uint32_t)info->framebuffer_addr); @@ -76,9 +80,6 @@ void kernel_main(uint32_t eax,uint32_t ebx) uint32_t sstdout = syscall_open("term",0,0); // stdout 1 uint32_t sstderr = syscall_open("stderr",0,0); // stderr 2 - klog("Interrupt Vector Table (IVT) init ..."); - interrupts_init(0x08); - klog("Enable Interrupts & Start Scheduling ..."); scheduler_init(dir); } diff --git a/kernel/smp.c b/kernel/smp.c index 894dbe0..4aff013 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -26,17 +26,16 @@ void smp_main() // klog("local apic_addr:0x%08X",local_apic_addr); - - uint32_t *reg=local_apic_addr+FOOLOS_APIC_ID; + // // uint32_t *reg=local_apic_addr+FOOLOS_APIC_ID; //klog("local apic id: 0x%08X",(*reg)); - *reg=local_apic_addr+FOOLOS_APIC_SPUR_INT; - *reg|=0x100;//0xffffffff; // all bits 1 and interrupt 255 + // // // *reg=local_apic_addr+FOOLOS_APIC_SPUR_INT; + // // // *reg|=0x100;//0xffffffff; // all bits 1 and interrupt 255 // *reg=0;//xffffffff; // all bits 1 and interrupt 255 -// int_install(); + int_install(); -// x86_sti(); + x86_sti(); @@ -100,9 +99,8 @@ void smp_start_aps(smp_processors *pros,char *path) { if(pros->boot==i)continue; - klog("starting cpu %d",i); - uint8_t dest=pros->local_apic_id[i]; + klog("starting cpu %d (dest: %d) ",i,dest); reg=local_apic_addr+FOOLOS_APIC_INT_COMMAND_HIGH; *reg=dest<<24; // destination apic. @@ -115,7 +113,7 @@ void smp_start_aps(smp_processors *pros,char *path) // todo: use some real sleep (not implemented yet :( ) //sleep(30); - // start proc 0x7 = 0x7000; etc.. + // start proc 0x7 = 0x7000; *reg=(6<<8)|(1<<14)|0x7; // 110 SIPI } } diff --git a/kernel/smp.h b/kernel/smp.h index 8737ffc..256d451 100644 --- a/kernel/smp.h +++ b/kernel/smp.h @@ -14,6 +14,8 @@ typedef struct uint32_t local_apic_address;// same for every processor uint32_t local_apic_id[SMP_MAX_PROC]; // unique for every processor + + uint32_t flags; }smp_processors; diff --git a/kernel/vmem.h b/kernel/vmem.h index 3bbda2f..bfd758e 100644 --- a/kernel/vmem.h +++ b/kernel/vmem.h @@ -41,6 +41,7 @@ * 0x00100000 FoolOS Kernel (max ~14mb) * 0x00007BFF RESERVED * 0x00007000 16-bit SMP entry (max ~3kb) + * 0x00006fff smp entry stacks (growing down) * 0x00000500 * 0x00000000 RESERVED * |
