From e5e674724ec527c45efaa1622d0e9a1618757ca3 Mon Sep 17 00:00:00 2001 From: Michal Idziorek Date: Wed, 3 Sep 2014 15:26:19 +0200 Subject: system clock --- asm/int_clock_handler.asm | 3 +++ kernel/kernel.c | 56 ++++++++++++++++++++++++----------------------- kernel/shell.c | 4 +++- kernel/smp.c | 2 +- kernel/task.c | 3 +++ kernel/time.h | 3 +++ kernel/vesa.c | 2 +- kernel/x86.c | 22 +++++++++++++------ lib/logger/log.c | 15 ++++++++++--- 9 files changed, 70 insertions(+), 40 deletions(-) create mode 100644 kernel/time.h 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; @@ -108,6 +111,32 @@ void kernel_main(uint32_t initial_stack, int mp) timer_init(); + // + // 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 +#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