diff options
| -rw-r--r-- | asm/int_clock_handler.asm | 3 | ||||
| -rw-r--r-- | kernel/kernel.c | 56 | ||||
| -rw-r--r-- | kernel/shell.c | 4 | ||||
| -rw-r--r-- | kernel/smp.c | 2 | ||||
| -rw-r--r-- | kernel/task.c | 3 | ||||
| -rw-r--r-- | kernel/time.h | 3 | ||||
| -rw-r--r-- | kernel/vesa.c | 2 | ||||
| -rw-r--r-- | kernel/x86.c | 22 | ||||
| -rw-r--r-- | lib/logger/log.c | 15 |
9 files changed, 70 insertions, 40 deletions
diff --git a/asm/int_clock_handler.asm b/asm/int_clock_handler.asm index 177492f..d1fbb03 100644 --- a/asm/int_clock_handler.asm +++ b/asm/int_clock_handler.asm @@ -6,6 +6,8 @@ global int_clock_handler [bits 32] int_clock_handler: + + cli ;Notice there is no IRQ number or error code - we don't need them @@ -33,5 +35,6 @@ int_clock_handler: out 0x20, al ;Acknowledge IRQ, so we keep getting interrupts ;We didn't push an error code or IRQ number, so we don't have to edit esp now + sti iret ;Interrupt-Return diff --git a/kernel/kernel.c b/kernel/kernel.c index fdb43ba..40c576a 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -4,6 +4,7 @@ #include "lib/int/stdint.h" #include "lib/bool/bool.h" #include "smp.h" +#include "time.h" /////// // interrupt handler prototypes @@ -45,6 +46,8 @@ void kernel_main(uint32_t initial_stack, int mp) proc=0; + task_system_clock=0; + // move the foolfont and aps code before it gets overwritten! uint8_t *source=0x16600; uint8_t *dest=0x80000; @@ -109,6 +112,32 @@ void kernel_main(uint32_t initial_stack, int mp) // + // Interrupts + // + + // init and interrupt decriptor table + int_init(0x08); + + // set default interrupts + int_install(); + + // setup some custom interrupts + // remember that we shifted all interrupts with the pic by 32 + + // install PIT interrupt handler (irq 0 => 32) + int_install_ir(32, 0b10001110, 0x08,&int_clock_handler); + + // install keyboard interrupt handler (irq 1 => 33) + int_install_ir(33, 0b10001110, 0x08,&int_kb_handler); + + // install floppy interrupt handler (irq 6 => 38) + //int_install_ir(38, 0b10001110, 0x08,&int_floppy_handler); + + // now we can enable interrupts back again + x86_int_enable(); + + + // // Memory Init // @@ -151,33 +180,6 @@ void kernel_main(uint32_t initial_stack, int mp) // paging (pass the vesa physbase address for identity mapping) vmem_init(vesa_physbase); - - - // - // Interrupts - // - - // init and interrupt decriptor table - int_init(0x08); - - // set default interrupts - int_install(); - - // setup some custom interrupts - // remember that we shifted all interrupts with the pic by 32 - - // install PIT interrupt handler (irq 0 => 32) - int_install_ir(32, 0b10001110, 0x08,&int_clock_handler); - - // install keyboard interrupt handler (irq 1 => 33) - int_install_ir(33, 0b10001110, 0x08,&int_kb_handler); - - // install floppy interrupt handler (irq 6 => 38) - //int_install_ir(38, 0b10001110, 0x08,&int_floppy_handler); - - // now we can enable interrupts back again - x86_int_enable(); - ////////////////////// // diff --git a/kernel/shell.c b/kernel/shell.c index 0dd9dc0..0925445 100644 --- a/kernel/shell.c +++ b/kernel/shell.c @@ -1,4 +1,5 @@ #include "interrupts.h" +#include "time.h" #include "lib/logger/log.h" // logger facilities #include "lib/bool/bool.h" #include "lib/int/stdint.h" @@ -51,7 +52,8 @@ void shell_execute() if(1==strcmp(command,"TIME",0)) { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d seconds passed since system start.",timer16); + uint32_t time=task_system_clock; + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d seconds passed since system start.",(time/25)); } else if(1==strcmp(command,"EIGHT",0)) { diff --git a/kernel/smp.c b/kernel/smp.c index 2002385..b1a4e3a 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -42,7 +42,7 @@ void smp_start_aps(smp_processors *pros) // do we really neet this? // todo: use some real sleep (not implemented yet :( ) - sleep(10); + sleep(3); // start proc at 0x7000; *reg=(6<<8)|(1<<14)|0x9; // 110 SIPI diff --git a/kernel/task.c b/kernel/task.c index ebfd4a7..9aad903 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -7,6 +7,7 @@ #define FOOLOS_MODULE_NAME "task" int started; +uint64_t task_system_clock; void task_test1() { @@ -98,6 +99,8 @@ void task_create(int pid,void(*thread)()) uint32_t task_switch_next(uint32_t oldesp) { + task_system_clock++; + if(started!=0xabcde) return oldesp; if(CurrentTask!=-1)Threads[CurrentTask].esp0=oldesp; diff --git a/kernel/time.h b/kernel/time.h new file mode 100644 index 0000000..1c581c1 --- /dev/null +++ b/kernel/time.h @@ -0,0 +1,3 @@ +#include "lib/int/stdint.h" +volatile uint64_t task_system_clock; // from task.c + diff --git a/kernel/vesa.c b/kernel/vesa.c index eaf4edc..55c400c 100644 --- a/kernel/vesa.c +++ b/kernel/vesa.c @@ -179,7 +179,7 @@ void PutConsole(char *str, int color, va_list va) PutFont(*str, console_x*10,console_y*12, color); str++; console_x++; - if(console_x>console_cols)PutConsoleNL(); + if(console_x>console_cols);//PutConsoleNL(); } } diff --git a/kernel/x86.c b/kernel/x86.c index 0b6a448..782baec 100644 --- a/kernel/x86.c +++ b/kernel/x86.c @@ -1,14 +1,23 @@ +#define FOOLOS_MODULE_NAME "x86" + #include "x86.h" +#include "lib/int/stdint.h" +#include "lib/logger/log.h" + +extern volatile uint64_t task_system_clock; // from task.c -//TODO!!! void sleep(int i) { - i*=1000000; - for(;i>0;i--) - { - - } + volatile uint64_t clock=task_system_clock; + +// while(clock+i>task_system_clock) +// { +// log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"It is %d but I will sleep until %d...",task_system_clock,clock+i); + for(int j=0;j<i;j++)asm("hlt"); + + // } } + // disable interrupts void x86_int_disable() { @@ -22,7 +31,6 @@ void x86_int_enable() } // get control registers (cr0-cr4) - uint32_t x86_get_cr0() { uint32_t cr; diff --git a/lib/logger/log.c b/lib/logger/log.c index fd226e5..c9bb652 100644 --- a/lib/logger/log.c +++ b/lib/logger/log.c @@ -1,13 +1,24 @@ #include "log.h" #include <stdarg.h> +#include "lib/int/stdint.h" void PutConsole(char *str, int color, va_list va); +volatile uint64_t task_system_clock; // in task.c + void log(char *module_name, int log_level, char *format_string, ...) { if(log_level<FOOLOS_LOG_INFO)return; + char buf[10]; + uint32_t t=task_system_clock; + uint32_t s=t/25; + uint32_t ms=t*1000/25-1000*s; + + tfp_sprintf(buf,"[%6d.%05d] ",s,ms); + + PutConsole(buf,0b0111101111101111,task_system_clock); PutConsole(module_name,0b1111100000000000,0); PutConsole(": ",0b0000011111100000,0); va_list va; @@ -19,6 +30,7 @@ void log(char *module_name, int log_level, char *format_string, ...) } + void panic(char *module_name, char *format_string) { @@ -27,9 +39,6 @@ void panic(char *module_name, char *format_string) PutConsole(" : ",0b0000011111100000,0); PutConsole(format_string,0b1111100000000000,0); - while(1); // halt - - } |
