summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/int_clock_handler.asm3
-rw-r--r--kernel/kernel.c56
-rw-r--r--kernel/shell.c4
-rw-r--r--kernel/smp.c2
-rw-r--r--kernel/task.c3
-rw-r--r--kernel/time.h3
-rw-r--r--kernel/vesa.c2
-rw-r--r--kernel/x86.c22
-rw-r--r--lib/logger/log.c15
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
-
-
}