summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-17 14:56:01 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-17 14:56:01 +0100
commit54d36998da2e98039b960a3a9e6fb82e09717991 (patch)
tree49ab40cafbd33fb3a91df9a4157895e2059f6f55
parente1b3206c11baa396edaf49bfb45a2a443717eaa4 (diff)
trying to reactivate multitasking.
-rw-r--r--bochs/bochsrc4
-rw-r--r--kernel/config.h3
-rw-r--r--kernel/kernel.c31
-rw-r--r--kernel/mem.c11
-rw-r--r--kernel/task.c27
-rw-r--r--kernel/task.h1
-rw-r--r--lib/logger/log.c7
-rw-r--r--video/console.c7
8 files changed, 54 insertions, 37 deletions
diff --git a/bochs/bochsrc b/bochs/bochsrc
index 4e278cc..870e59c 100644
--- a/bochs/bochsrc
+++ b/bochs/bochsrc
@@ -53,11 +53,11 @@
#display_library: nogui
#display_library: rfb, options="timeout=60" # time to wait for client
#display_library: sdl #, options="fullscreen" # startup in fullscreen mode
-display_library: term
+#display_library: term
#display_library: wx
#display_library: x, options="hideIPS" # disable IPS output in status bar
#display_library: x, options="gui_debug" # use GTK debugger gui
-#display_library: x
+display_library: x
#=======================================================================
diff --git a/kernel/config.h b/kernel/config.h
index 39b7b90..14a6eee 100644
--- a/kernel/config.h
+++ b/kernel/config.h
@@ -5,7 +5,8 @@
********************************************/
//#define FOOLOS_COMPILE_FLOPPY // compile floppy drivers
-//#define FOOLOS_CONSOLE_AUTOBREAK // add newline automatically at end of line
+#define FOOLOS_CONSOLE_AUTOBREAK // add newline automatically at end of line
//#define FOOLOS_LOG_OFF // do not log anything
#define FOOLOS_CONSOLE // otherwise VESA will be used!
+#define MEM_PRINT_MEMORYMAP
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 6cc4500..5628e84 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -22,6 +22,8 @@
#include "fs/fs.h"
#include "fs/ext2.h"
+#include "task.h"
+
#ifdef FOOLOS_COMPILE_FLOPPY
#include "floppy.h"
@@ -77,6 +79,11 @@ void kernel_main(uint32_t initial_stack, int mp)
/////////////////// BULLSHIT ABOVE THIS LINE: TODO: CLEANUP
+ //
+ // init system log ringbugger
+ //
+ log_init();
+
//
// The System Time
//
@@ -94,16 +101,11 @@ void kernel_main(uint32_t initial_stack, int mp)
mem_init(0x7c00+1,*((uint16_t *)(0x7c00)));
//
- // init system log ringbugger
- //
- log_init();
-
- //
// init output to screen
//
console_init();
- // self-log message of logger :P
+ // log buffered messages to console
log_log();
//
@@ -135,11 +137,15 @@ void kernel_main(uint32_t initial_stack, int mp)
// Gather Info about other processors. (APs)
// ACPI or MP
//
+ //
+
+ /*
smp_processors procdata;
if(!acpi_find(&procdata))
if(!mp_find(&procdata))
panic(FOOLOS_MODULE_NAME,"ACPI and MP search failed! I do not want to continue!");
+ */
// init spinlocks
init_spinlocks();
@@ -153,14 +159,14 @@ void kernel_main(uint32_t initial_stack, int mp)
//smp_log_procdata(&procdata);
//smp_start_aps(&procdata,0x80000); // starts at 0x80000
// but it will be copied over mbr
-
+
//
// Activate Virtual Memory (paging)
//
// paging (pass the vesa physbase address for identity mapping)
// TODO: we will work on this later (not needed so urgently yet)
//
- // vmem_init(vesa_physbase);
+ //vmem_init(vesa_physbase);
//
// Scan the PCI Bus
@@ -184,20 +190,15 @@ void kernel_main(uint32_t initial_stack, int mp)
// For now this starts three "tasks" which are scheduled
// round robin style.
//
- //task_init();
+ task_init();
//
//vesa_init_doublebuff();
- ext2_check(EXT2_RAM_ADDRESS);
- syscall_execve(15,0,0);
// Just hang around here, if its reached.
// we do our tasks anyway. on the next clock tick.
- while(1)
- {
-
- }
+ while(1);
}
diff --git a/kernel/mem.c b/kernel/mem.c
index 00b6a90..d89ecc7 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -1,22 +1,21 @@
#define FOOLOS_MODULE_NAME "mem"
-#define MEM_PRINT_MEMORYMAP
+#include "config.h"
#include "lib/int/stdint.h"
#include "lib/logger/log.h" // logger facilities
-
//! 8 blocks per byte
#define PMMNGR_BLOCKS_PER_BYTE 8
//! block size (4k)
#define PMMNGR_BLOCK_SIZE 4096
-//! block alignment
+//! block alignment ??? TODO: what is this!?
#define PMMNGR_BLOCK_ALIGN PMMNGR_BLOCK_SIZE
-
//memory map bit array. Each bit represents a 4KB memory block
static uint32_t *_mmngr_memory_map;
+
static uint32_t mem_free_blocks;
static uint32_t mem_array_size;
@@ -224,8 +223,8 @@ void mem_init(uint16_t *memmap,uint16_t entries)
memmap+=12;
}
- // here is somewhere our kernel stuff ;) // todo!! better.
- pmmngr_deinit_region(0x0,0x300000);
+ // here is somewhere our kernel stuff ;) // TODO!! better.
+ pmmngr_deinit_region(0x0,0x1000000);
// and here is the memory map that we JUST created!
pmmngr_deinit_region(_mmngr_memory_map,mem_array_size*4);
diff --git a/kernel/task.c b/kernel/task.c
index 1e94b26..094c74d 100644
--- a/kernel/task.c
+++ b/kernel/task.c
@@ -5,16 +5,21 @@
#include "lib/logger/log.h" // logger facilities
#include "lib/int/stdint.h"
#include "mem.h"
+
+#include "syscalls.h"
+#include "fs/fs.h"
+#include "fs/ext2.h"
#define FOOLOS_MODULE_NAME "task"
int started;
uint64_t task_system_clock;
-uint32_t c1,c2,c3;
+static uint32_t c1,c2,c3;
void task_test1()
{
-
+ // ext2_check(EXT2_RAM_ADDRESS);
+ // syscall_execve(15,0,0);
while(1)
{
c1++;
@@ -24,8 +29,6 @@ void task_test1()
void task_test2()
{
- uint32_t c;
-
while(1)
{
c2++;
@@ -36,8 +39,6 @@ void task_test2()
void task_test3()
{
- uint32_t c;
-
while(1)
{
c3++;
@@ -63,7 +64,7 @@ void task_create(int pid,void(*thread)())
Threads[pid].esp0 = pmmngr_alloc_block();
stack = (unsigned int*)Threads[pid].esp0+4095; //This makes a pointer to the stack for us
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"new task : stack: 0x%08X ", stack);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"new task : stack: 0x%08X thread: 0x%08X", stack, thread);
//First, this stuff is pushed by the processor
*--stack = 0x0202; //This is EFLAGS
@@ -81,7 +82,6 @@ void task_create(int pid,void(*thread)())
*--stack = 0; //EAX
//Now these are the data segments pushed by the IRQ handler
-
/*
*--stack = 0x10; //DS
*--stack = 0x10; //ES
@@ -90,6 +90,7 @@ void task_create(int pid,void(*thread)())
*/
+log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"new task : stack: 0x%08X ", stack);
Threads[pid].esp0 = (uint32_t)stack; //Update the stack pointer
@@ -97,8 +98,8 @@ void task_create(int pid,void(*thread)())
uint32_t task_switch_next(uint32_t oldesp)
{
- task_system_clock++;
+ task_system_clock++;
if(started!=0xabcde) return oldesp;
if(CurrentTask!=-1)Threads[CurrentTask].esp0=oldesp;
@@ -106,7 +107,13 @@ uint32_t task_switch_next(uint32_t oldesp)
CurrentTask++;
if(CurrentTask>2)CurrentTask=0;
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"oldesp: 0x%08X saved / next task: %d (esp: 0x%08X) ",oldesp, CurrentTask,Threads[CurrentTask].esp0);
+ log(
+ FOOLOS_MODULE_NAME,
+ FOOLOS_LOG_INFO,
+ "oldesp: 0x%08X saved / next task: %d (esp: 0x%08X) ",
+ oldesp,
+ CurrentTask,
+ Threads[CurrentTask].esp0);
return Threads[CurrentTask].esp0; //Return new stack pointer to ASM
}
diff --git a/kernel/task.h b/kernel/task.h
new file mode 100644
index 0000000..27e0484
--- /dev/null
+++ b/kernel/task.h
@@ -0,0 +1 @@
+void task_init();
diff --git a/lib/logger/log.c b/lib/logger/log.c
index f2b9834..a9b2165 100644
--- a/lib/logger/log.c
+++ b/lib/logger/log.c
@@ -72,10 +72,15 @@ void panic(char *module_name, char *message)
void log_init()
{
first=last=0;
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init buffer at: 0x%08X, first=%08X, last=%08X",buffer,&first,&last);
}
void log_log()
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init buffer at: 0x%08X, first=%08X, last=%08X",buffer,&first,&last);
+ for(int i=first;i!=last;i++)
+ {
+ console_put_char(buffer[i]);
+
+ }
}
diff --git a/video/console.c b/video/console.c
index 856c313..e23a2c8 100644
--- a/video/console.c
+++ b/video/console.c
@@ -108,8 +108,11 @@ void scr_put_char(char ch,char col)
{
if(ch=='\n')scr_nextline();
- else if(posx<SCR_WIDTH)print_char_col(posx,posy,ch,SCR_WHITE);
- posx++;
+ else if(posx<SCR_WIDTH)
+ {
+ print_char_col(posx,posy,ch,SCR_WHITE);
+ posx++;
+ }
#ifdef FOOLOS_CONSOLE_AUTOBREAK
if(posx>=SCR_WIDTH)scr_nextline();