summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kernel.c49
-rw-r--r--kernel/kernel.h8
-rw-r--r--kernel/mp.c140
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;
+
+}
+