From ef4943053475cd8bf341c42dd0b538bc630b92a3 Mon Sep 17 00:00:00 2001 From: Miguel Date: Thu, 6 Sep 2018 01:58:10 +0200 Subject: working on smp --- kernel/acpi.c | 20 +++++--- kernel/interrupts.c | 130 +++++++++++++++++++++++++++++++++------------------- kernel/kernel.c | 1 - kernel/kernel.h | 1 + kernel/log.c | 6 +++ kernel/smp.c | 28 +++++++---- kernel/spinlock.c | 13 +----- kernel/spinlock.h | 12 ++++- 8 files changed, 135 insertions(+), 76 deletions(-) (limited to 'kernel') diff --git a/kernel/acpi.c b/kernel/acpi.c index 084c193..f5c18ca 100644 --- a/kernel/acpi.c +++ b/kernel/acpi.c @@ -62,7 +62,7 @@ uint8_t *apci_get_next_entry(uint8_t *addr,smp_processors *procdata) if(*addr==0) { - klog("MADT Entry: LocalAPIC ()"); + klog("Type 0: LocalAPIC (enabled=%d)",addr[4]&1); // usable if(addr[4]&1) { @@ -78,10 +78,18 @@ uint8_t *apci_get_next_entry(uint8_t *addr,smp_processors *procdata) } else if(*addr==1) { - klog("MADT Entry: IO APIC 0x%08X",addr[4]); + klog("Type 1: IO APIC (id=%d) (addr=0x%08X) (base=%d)",addr[2], *((uint32_t*)&addr[4]),*((uint32_t*)&addr[8])); } - else if(*addr==2)klog("MADT Entry: Interrupt Source Override"); - else klog("MADT Entry: type:0x%X",*addr); + else if(*addr==2){ + klog("Type 2: Interrupt Source Override (bus src=%d) (irq src=%d) (global=%d) (flags=%d)",addr[2],addr[3],*((uint32_t*)&addr[4]),*((uint16_t*)&addr[8])); + + } + else if(*addr==4){ + klog("Type 4: Non-maskable interrupts (proc id=%d) (flags=%d) (LINT#=%d)",addr[2],*((uint16_t*)&addr[3]),addr[5]); + + } + else if(*addr==5){kpanic("Entry Type 5 : Local APIC Address Override. 64-bit address??");} + else kpanic("MADT Entry: type:0x%X",*addr); return addr+addr[1]; } @@ -102,14 +110,14 @@ void acpi_check_madt(uint32_t *madt,smp_processors *procdata) entry+=sizeof(acpi_madt); procdata->local_apic_address=table->apic_local; + klog("Local Apic Address: 0x%08X",table->apic_local); procdata->flags=table->flags; + klog("Flags (Dual 8259): %d",table->flags); while(entry - #include "kernel/kernel.h" #include "kernel/mem.h" diff --git a/kernel/kernel.h b/kernel/kernel.h index f73c116..4c480e5 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -18,6 +18,7 @@ #define KMALLOC_MEM_SIZE 1024*1024*8 // 8MB for in kernel-memory #define NUMBER_SPINLOCKS 16 +#define SPINLOCK_LOG 0 #define S1(x) #x #define S2(x) S1(x) diff --git a/kernel/log.c b/kernel/log.c index c7c1bb7..b0eeab5 100644 --- a/kernel/log.c +++ b/kernel/log.c @@ -1,8 +1,12 @@ #include "log.h" +#include "kernel.h" + #include #include +#include "spinlock.h" + #include "kernel/kernel.h" #include "kernel/fifo.h" #include "driver/serial.h" @@ -43,7 +47,9 @@ void log(char *module_name, int prio, char *format_string, ...) tfp_sprintf(buf_log,"\033[36;40m%s\033[31;40m %s:\033[37;40m %s\n",buf_time,module_name,buf_info); + spinlock_spin(SPINLOCK_LOG); log_string(buf_log); + spinlock_release(SPINLOCK_LOG); } /* diff --git a/kernel/smp.c b/kernel/smp.c index 4aff013..ea926ca 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -20,29 +20,40 @@ volatile uint8_t proc; uint32_t cpu_counter[SMP_MAX_PROC]; uint32_t local_apic_addr; +extern uint32_t LLOCK; void smp_main() { + uint32_t ebp=kballoc(1); + asm volatile("mov %0, %%ebp"::"r"(ebp)); + asm volatile("mov %ebp, %esp"); + asm volatile("jmp kernel_ap"); +} -// klog("local apic_addr:0x%08X",local_apic_addr); +void kernel_ap() +{ + LLOCK=0; - // // uint32_t *reg=local_apic_addr+FOOLOS_APIC_ID; - //klog("local apic id: 0x%08X",(*reg)); + uint32_t *reg; + reg=local_apic_addr+FOOLOS_APIC_ID; + klog("smp local apic id: %d",(*reg)); // // // *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(); - + x86_sti(); - - - while(1)__asm__("hlt"); + while(1){ + klog("%d",*reg); + for(int i=0;i<1000000000;i++); + } // switch_to_user_mode(); // int x=1/0; + /* while(1); @@ -54,10 +65,11 @@ void smp_main() proc=c1=c2=c3=0; for(int i=0;i -void lock_spin(spinlock); -void lock_release(spinlock); +void spinlock_spin(uint32_t num); +void spinlock_release(uint32_t num); #endif -- cgit v1.2.3