summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-04 01:39:10 +0200
committerMiguel <m.i@gmx.at>2018-09-04 01:39:10 +0200
commitf67ad595650954195ef064a8b91038dbd0e16842 (patch)
treef954239e0b9125df4ca44cdc6bb85090a1cfbe51
parent7eb87bf3f3fa6226657a7106eb255cbfa97758d2 (diff)
ioapic & lapic
-rw-r--r--asm/asm_mp.asm15
-rw-r--r--asm/asm_start.s1
-rw-r--r--kernel/acpi.c12
-rw-r--r--kernel/kernel.c11
-rw-r--r--kernel/smp.c16
-rw-r--r--kernel/smp.h2
-rw-r--r--kernel/vmem.h1
7 files changed, 28 insertions, 30 deletions
diff --git a/asm/asm_mp.asm b/asm/asm_mp.asm
index f0eb9c0..c4eb4a9 100644
--- a/asm/asm_mp.asm
+++ b/asm/asm_mp.asm
@@ -29,23 +29,18 @@ init_pm:
mov fs, ax
mov gs, ax
- mov ebp, 0x8000
+ mov ebp, 0x7000
mov esp, ebp
call boot_32_pm ;continue booting in 32-bit protected mode
boot_32_pm:
- hlt
- jmp boot_32_pm
- ;mov eax, 1 ; semaphore
- ;xchg eax, [LLOCK]
- ;cmp eax,1
- ;hlt
- ;je $
- ;jmp $ ; loop forever here
+ mov eax,1
+ xchg eax, [LLOCK]
+ cmp eax,1
+ je boot_32_pm
- ;call [0x8010] ;kernel_ap ;jump into our Kernel!
call smp_main
jmp $ ; should never be reached
diff --git a/asm/asm_start.s b/asm/asm_start.s
index ca99c20..e961ef6 100644
--- a/asm/asm_start.s
+++ b/asm/asm_start.s
@@ -22,7 +22,6 @@
_start_smp:
call smp_start # TODO: align later before going C
-
# Declare a header as in the Multiboot Standard. We put this into a special
# section so we can force the header to be in the start of the final program.
# You don't need to understand all these details as it is just magic values that
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
*