diff options
| author | Michal Idziorek <m.i@gmx.at> | 2015-05-17 00:59:28 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2015-05-17 00:59:28 +0200 |
| commit | 819a4e871058f2dc4a2e255ecbe5a2c49cc8450c (patch) | |
| tree | 55849f4233682ab88bd9044575a6dbfbc244d51d /kernel | |
| parent | 3bac6dd02d640923646b8ad988f509f47adab57f (diff) | |
struggling with smp and APICs and started vt52 emulation
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/config.h | 2 | ||||
| -rw-r--r-- | kernel/console.c | 2 | ||||
| -rw-r--r-- | kernel/interrupts.c | 5 | ||||
| -rw-r--r-- | kernel/kernel.c | 4 | ||||
| -rw-r--r-- | kernel/smp.c | 49 | ||||
| -rw-r--r-- | kernel/task.c | 4 | ||||
| -rw-r--r-- | kernel/usermode.c | 7 |
7 files changed, 50 insertions, 23 deletions
diff --git a/kernel/config.h b/kernel/config.h index 74304d8..8329457 100644 --- a/kernel/config.h +++ b/kernel/config.h @@ -8,7 +8,7 @@ #define FOOLOS_CONFIG_H #define FOOLOS_CONSOLE_AUTOBREAK // add newline automatically at end of line -#define FOOLOS_LOG_OFF // do not log anything +//#define FOOLOS_LOG_OFF // do not log anything #define FOOLOS_CONSOLE // otherwise VESA will be used! #define FOOLSOS_SHOW_VESAMODES #define MEM_PRINT_MEMORYMAP diff --git a/kernel/console.c b/kernel/console.c index c46737e..593801a 100644 --- a/kernel/console.c +++ b/kernel/console.c @@ -18,11 +18,13 @@ uint32_t console_init(){ scr_clear(); return 0; } + void console_del_char(){scr_backspace();} void console_put_char_gray(char c){scr_put_char(c,SCR_GRAY2);} void console_put_char_white(char c){scr_put_char(c,SCR_WHITE);} void console_put_char_green(char c){scr_put_char(c,SCR_GREEN);} void console_put_char_red(char c){scr_put_char(c,SCR_RED);} + void console_put_str_gray(char *s){scr_put_string(s,SCR_GRAY2);} void console_put_str_white(char *s){scr_put_string(s,SCR_WHITE);} void console_put_str_green(char *s){scr_put_string(s,SCR_GREEN);} diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 088c94e..d75ec4d 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -172,11 +172,10 @@ void int_init(uint16_t sel) //system calls int_install_ir(0x80, 0b11101110, 0x08,&int_syscall_handler); - - int_install(); + int_install(); // now we can enable interrupts back again - x86_int_enable(); + //x86_int_enable(); } diff --git a/kernel/kernel.c b/kernel/kernel.c index df3a573..a3df0b3 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -43,6 +43,7 @@ void kernel_main(uint32_t eax,uint32_t ebx) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%s - compiled on %s at %s",KERNEL_VERSION,__DATE__,__TIME__); + // // Configuring the PIT timer. // @@ -92,10 +93,11 @@ void kernel_main(uint32_t eax,uint32_t ebx) // // Start the other Processors (before paging because apic addr etc..?) // - // smp_log_procdata(&procdata); //TODO: !!! Check commented out sleep ()!!! + smp_log_procdata(&procdata); smp_start_aps(&procdata,"/boot/mp.bin"); //will be copied over mbr + // // Activate Virtual Memory (paging) // diff --git a/kernel/smp.c b/kernel/smp.c index f776c72..76a8b1c 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -1,3 +1,8 @@ +// http://www.intel.com/content/dam/doc/specification-update/64-architecture-x2apic-specification.pdf +// http://download.intel.com/design/chipsets/datashts/29056601.pdf +// http://www.scs.stanford.edu/05au-cs240c/lab/ia32/IA32-3.pdf + + #define FOOLOS_MODULE_NAME "smp" #include "lib/logger/log.h" @@ -10,20 +15,35 @@ #define FOOLOS_APIC_SPUR_INT 0x00f0 #define FOOLOS_APIC_INT_COMMAND_LOW 0x0300 #define FOOLOS_APIC_INT_COMMAND_HIGH 0x0310 +#define FOOLOS_APIC_ID 0x020 // some multiprocessor shit that should move away TODO uint32_t c1,c2,c3; volatile uint8_t proc; uint32_t cpu_counter[SMP_MAX_PROC]; -extern +uint32_t local_apic_addr; void smp_main() { - // int_install(); - // x86_int_enable(); + while(1); + + // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"local apic_addr:0x%08X",local_apic_addr); + uint32_t *reg=local_apic_addr+FOOLOS_APIC_ID; + // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"local apic id: 0x%08X",(*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_int_enable(); + + while(1); + switch_to_user_mode(); +// int x=1/0; while(1); @@ -64,7 +84,9 @@ void smp_log_procdata(smp_processors *procdata) // this will start all our application processors! void smp_start_aps(smp_processors *pros,char *path) -{ +{ + local_apic_addr=pros->local_apic_address; + //lets copy the binary into mbr fs_content(path,0x7000,0x100); // copy 0x100 bytes to 0x7000 @@ -73,8 +95,12 @@ void smp_start_aps(smp_processors *pros,char *path) *entry=smp_main; //bsp (boot processor) enables its local apic - uint32_t *reg=pros->local_apic_address+FOOLOS_APIC_SPUR_INT; -// *reg=0xffffffff; // all bits 1 and interrupt 255 +// uint32_t *reg=local_apic_addr+FOOLOS_APIC_SPUR_INT; +// *reg=0xffffffff; // all bits 1 and interrupt 255 (is this not set anyway?) +// *reg=0; + + uint32_t *reg=local_apic_addr+FOOLOS_APIC_ID; + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"local apic id: 0x%08X",(*reg)); for(int i=0;i<pros->processors;i++) { @@ -84,10 +110,10 @@ void smp_start_aps(smp_processors *pros,char *path) uint8_t dest=pros->local_apic_id[i]; - reg=pros->local_apic_address+FOOLOS_APIC_INT_COMMAND_HIGH; + reg=local_apic_addr+FOOLOS_APIC_INT_COMMAND_HIGH; *reg=dest<<24; // destination apic. - reg=pros->local_apic_address+FOOLOS_APIC_INT_COMMAND_LOW; + reg=local_apic_addr+FOOLOS_APIC_INT_COMMAND_LOW; *reg=(5<<8)|(1<<14); // 101 INIT // do we really neet this? @@ -97,14 +123,11 @@ void smp_start_aps(smp_processors *pros,char *path) // start proc 0x7 = 0x7000; etc.. *reg=(6<<8)|(1<<14)|0x7; // 110 SIPI - - //bsp (boot processor) enables its local apic - uint32_t *reg=pros->local_apic_address+FOOLOS_APIC_SPUR_INT; - // *reg=0xffffffff; // all bits 1 and interrupt 255 - } + } + diff --git a/kernel/task.c b/kernel/task.c index 54381fa..495817c 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -83,7 +83,7 @@ volatile uint32_t my_scheduler(uint32_t oldesp) volatile uint32_t task_switch_next(uint32_t oldesp) { - //syscall_write(1,"\n\n*tick*\n\n",10); +// syscall_write(1,"*tick*",10); timer_tick(); @@ -161,7 +161,7 @@ volatile void task_init(pdirectory *dir) task_list[0].esp = 0; // will be set by next task_switch_next() call. current_task=0; - while(1); +// while(1); switch_to_user_mode(); //syscall_execve("/bin/foolshell",argv_init,env_init); diff --git a/kernel/usermode.c b/kernel/usermode.c index ff16156..e4d22d3 100644 --- a/kernel/usermode.c +++ b/kernel/usermode.c @@ -55,12 +55,13 @@ void install_tss(int cpu_no){ void switch_to_user_mode() { - char text[]="[internal] "; +// char text[]="[internal] "; - //asm_usermode(); - write(1,text,11); + asm_usermode(); +// write(1,text,11); while(1); // will not be reached? +// write(1,text,11); } char *argv_init[]={"/bin/init",NULL}; |
