diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-08-31 20:39:16 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-08-31 20:39:16 +0200 |
| commit | 6e543445fc2d7a4e820d8f58c6a1df9635e2a2be (patch) | |
| tree | 4f1853f2a121eeeb81f6fe25df501035f1e0ed33 | |
| parent | 5c89be3b8485669faa8c4b488b6ba4659ff7bff9 (diff) | |
Started adding APIC/multiprocessor support.
| -rw-r--r-- | kernel/kernel.c | 49 | ||||
| -rw-r--r-- | kernel/kernel.h | 8 | ||||
| -rw-r--r-- | kernel/mp.c | 140 |
3 files changed, 153 insertions, 44 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c index ce22b84..69da50a 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -57,19 +57,6 @@ void int_irq16(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Coprocessor error"); void int_irq17(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Alignment Check"); X86_IRQ_END } void int_irq18(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Machine Check"); X86_IRQ_END } -// enable A20 -// http://www.brokenthorn.com/Resources/OSDev9.html -// Method 3.1: Enables A20 through keyboard controller -/* -void enable_a20() -{ -// Not all keyboard controllers support this - asm("mov $0xdd, %al");// ; command 0xdd: enable a20 -// asm("mov $0xdf, %al");// ; command 0xdd: disable a20 - asm("outb %al, $0x64");// ; send command to controller -} -*/ - /* void test_a20() { @@ -79,10 +66,8 @@ void test_a20() // test=0x8abcd; log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"A20 test: 0x%02X ",*test); - } */ - ////////// KERNEL MAIN///// ///// // this is the very heart of our operating system! void kernel_main(uint32_t initial_stack) @@ -113,7 +98,11 @@ void kernel_main(uint32_t initial_stack) // initial stack log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initial esp: 0x%08X",initial_stack); + // multiprocessing / apic stuff + if(!find_mp()) + panic(FOOLOS_MODULE_NAME,"Can not Find _MP_"); + // pic log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"setup PIC"); pic_setup(); @@ -126,14 +115,13 @@ void kernel_main(uint32_t initial_stack) // paging (pass the vesa physbase address for identity mapping) vmem_init(vesa_physbase); - // - // init and interrupt decriptor table int_init(0x08); + // set default interrupts int_install(); - // setup custom interrupts + // setup some custom interrupts // remember that we shifted all interrupts with the pic by 32 // so clock = 32 (irq 0) // keyboard = 33 (irq 1) @@ -148,7 +136,6 @@ void kernel_main(uint32_t initial_stack) // install floppy interrupt handler int_install_ir(38, 0b10001110, 0x08,&int_floppy_handler); - // exceptions int_install_ir(0, 0b10001110, 0x08,&int_irq0); @@ -174,8 +161,6 @@ void kernel_main(uint32_t initial_stack) // now we can enable interrupts back again int_enable(); -// int x=10/0; - // pci pci_init(); @@ -188,28 +173,6 @@ void kernel_main(uint32_t initial_stack) // multitasking task_init(); - /* - - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test mem"); - - // test a20 disabled / wrap - uint8_t *memtest=0x0; - uint8_t *memtest2=0b10000000000000000000; - - *memtest=0xaf; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test mem %x",*(memtest2-1)); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test mem %x",*memtest2); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test mem %x",*(memtest2+1)); - */ - - /* stack pointer test? - uint32_t *esp=0x90000; - for(int i=0;i<10;i++) - { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"esp: %x",*esp); - esp--; - } - */ while(1) { diff --git a/kernel/kernel.h b/kernel/kernel.h index 9f42fdf..e2dda98 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -3,7 +3,13 @@ #include <stdint.h> //needed for uint16_t -#define KERNEL_HELLO_MESSAGE "Welcome to FoolOs 0.0.6" +#define KERNEL_VERSION "Welcome to FoolOs 0.0.7" + +#define false 0 +#define true !false +#define bool uint8_t + + // #define DEBUG diff --git a/kernel/mp.c b/kernel/mp.c new file mode 100644 index 0000000..213340b --- /dev/null +++ b/kernel/mp.c @@ -0,0 +1,140 @@ +#define FOOLOS_MODULE_NAME "mp" + +#include "x86.h" +#include "../lib/logger/log.h" // logger facilities + + +typedef struct mp_fps_struct +{ + uint32_t sig; //signature "_MP_" + uint32_t conf; //pointer to config struct + uint8_t length; //should be 1 + uint8_t version; // 1=1.1, 4=1.4 + + uint8_t checksum; + + uint8_t features1; + uint8_t features2; + + uint8_t res1; //reserved + uint8_t res2; + uint8_t res3; + +}mp_fps; + +typedef struct mp_config_struct +{ + uint32_t sig; //signature "PCMP" + uint16_t length; //base table length + uint8_t version; //revision 1=1.1 4=1.4 + uint8_t checksum; + + uint32_t oemid1; //OEM id (ascii) + uint32_t oemid2; + + uint32_t prodid1; //Product id (ascii) + uint32_t prodid2; + uint32_t prodid3; + + uint32_t oem_table; //pointer (optional) + uint16_t oem_size; //size of this table + uint16_t entries; //entry count (following the header) + uint32_t local_apic; //local apic address (same for every cpu) + uint16_t length_ext; //extended table length (optional) + uint8_t check_ext; //checksum for ext. table + +}mp_config; + + + + +//entries are sorted, but we do not care. +uint8_t *walk_mp_table(uint8_t *start_addr) +{ + + if(*start_addr==0x0||*start_addr==0x2) + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"entry type: %d",*start_addr); + + if(*start_addr==0x00)return start_addr+20; + return start_addr+8; +} + +void show_mp_conf(mp_config *addr) +{ + char buf[]="XXXX"; + uint32_t *buf_addr=buf; + *buf_addr=addr->sig; + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mp_config tabel addr: %08X",addr); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mp_config signature: %s",buf); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mp_config version: %02X",addr->version); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mp_config # of entries: %d",addr->entries); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mp_config local apic addr: 0x%08X",addr->local_apic); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mp_config tabel length: %d",addr->length); + + uint8_t *start_addr=addr; + start_addr+=44; + for(int i=0;i<addr->entries;i++) + { +// log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"go 0x%08X",start_addr); + start_addr=walk_mp_table(start_addr); + + } + + +} +void show_mp_fps(mp_fps *addr) +{ + + if(addr->length!=1)return; + if(addr->version!=1&&addr->version!=4)return; + + char buf[]="XXXX"; + uint32_t *buf_addr=buf; + *buf_addr=addr->sig; + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"signature: %s",buf); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"conf: %08X",addr->conf); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"ver: %02X",addr->version); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"f1: %02X",addr->features1); + + if(addr->features1!=0)panic(FOOLOS_MODULE_NAME,"Intel default config not supported yet!"); + show_mp_conf(addr->conf); +} + +bool check_mp(uint8_t *addr) +{ + char test[]="_MP_"; + + for(int i=0;i<4;i++) + { + if(test[i]!=*(addr+i))return false; + + } + + return true; + +} + + +// todo: check checksum,version etc. and narrow down search +bool find_mp() +{ + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Looking for Mp Floating Ponter Struct..."); + uint8_t *addr=0x80000; + while(addr<=0xfffff) + { + if(check_mp(addr)) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Found at 0x%04X",addr); + show_mp_fps(addr); + } + addr++; + } + + + return true; + +} + |
