summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-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
7 files changed, 55 insertions, 37 deletions
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;