summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-12-08 21:59:14 +0100
committerMichal Idziorek <m.i@gmx.at>2014-12-08 21:59:14 +0100
commite285e7cab2fe62e91cb726c429f872b2475fdf0a (patch)
treedfc0e78b81dc2ca9dd77641cca9be5527b2bc5de /kernel
parentddba680892e4dc8973d6c1d59f92affb987ca13b (diff)
fixed vesa fb mode!
Diffstat (limited to 'kernel')
-rw-r--r--kernel/config.h3
-rw-r--r--kernel/console.c28
-rw-r--r--kernel/kernel.c1
-rw-r--r--kernel/mem.c3
-rw-r--r--kernel/vmem.c50
5 files changed, 79 insertions, 6 deletions
diff --git a/kernel/config.h b/kernel/config.h
index a741c4a..867c693 100644
--- a/kernel/config.h
+++ b/kernel/config.h
@@ -9,7 +9,8 @@
#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 FOOLOS_CONSOLE // otherwise VESA will be used!
+#define FOOLSOS_SHOW_VESAMODES
#define MEM_PRINT_MEMORYMAP
#define LOG_BUF_SIZE 4069
#define LOG_SYSCALLS
diff --git a/kernel/console.c b/kernel/console.c
index cdd2fc1..e0e70a3 100644
--- a/kernel/console.c
+++ b/kernel/console.c
@@ -4,12 +4,21 @@
#include "kernel/config.h"
+#include "lib/logger/log.h"
+#include "fs/ext2.h"
+
+#define FOOLOS_MODULE_NAME "console"
#ifdef FOOLOS_CONSOLE
#include "video/console.h"
-void console_init(){scr_clear();}
+void console_init(){
+ scr_clear();
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init console");
+ int inode_nr=ext2_filename_to_inode(EXT2_RAM_ADDRESS,"/binfont.bin");
+ if(inode_nr!=-1)ext2_inode_content(EXT2_RAM_ADDRESS,inode_nr,0x8000000,0xffff); // load font;
+}
void console_del_char(){scr_backspace();}
void console_put_char_gray(char c){scr_put_char(c,SCR_GRAY2);}
void console_put_char_white(char c){scr_put_char(c,SCR_WHITE);}
@@ -24,8 +33,23 @@ void console_put_str_red(char *s){scr_put_string(s,SCR_RED);}
#include "video/vesa.h"
-void console_init(){uint32_t vesa_physbase=vesa_init(0x9300,0x9400,0x168000+512);}
+void console_init(){
+
+ int inode_nr=ext2_filename_to_inode(EXT2_RAM_ADDRESS,"/binfont.bin");
+ if(inode_nr!=-1)ext2_inode_content(EXT2_RAM_ADDRESS,inode_nr,0x1300000,0xffff); // load font;
+ uint32_t vesa_physbase=vesa_init(0xb000,0xc000,0x1300000);
+}
+
+void console_del_char(char c){PutConsoleChar('*',0xffffff);}
void console_put_char(char c){PutConsoleChar(c,0xffffff);}
+void console_put_char_gray(char c){PutConsoleChar(c,0xffffff);}
+void console_put_char_white(char c){PutConsoleChar(c,0xffffff);}
+void console_put_char_green(char c){PutConsoleChar(c,0xffffff);}
+void console_put_char_red(char c){PutConsoleChar(c,0xffffff);}
void console_put_str(char *s){PutConsole(s,0xffffff);}
+void console_put_str_gray(char *s){PutConsole(s,0xffffff);}
+void console_put_str_white(char *s){PutConsole(s,0xffffff);}
+void console_put_str_green(char *s){PutConsole(s,0xffffff);}
+void console_put_str_red(char *s){PutConsole(s,0xffffff);}
#endif
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 82136c0..3bf238e 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -91,7 +91,6 @@ void kernel_main(uint32_t initial_stack, int mp)
//
// Initialize Multitasking
//
-
task_init(dir); //; this will never return!
}
diff --git a/kernel/mem.c b/kernel/mem.c
index 62851c9..4e7d392 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -239,7 +239,8 @@ void mem_init(uint16_t *memmap,uint16_t entries)
// here is somewhere our kernel stuff.
// reserve 4Mb (0x100000-0x500000) for kernel and ext2 img
- pmmngr_deinit_region(0x0,0x500000);
+ // even more!
+ pmmngr_deinit_region(0x0,0x1400000);
// and here is the memory map that we JUST created!
pmmngr_deinit_region(0x500000,mem_array_size*4+PMMNGR_BLOCK_SIZE);
diff --git a/kernel/vmem.c b/kernel/vmem.c
index a909b1a..24a2f92 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -248,7 +248,55 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir)
uint32_t virt_addr=0;
// first pages are identity mapped
- for(int j=0;j<3;j++)
+ for(int j=0;j<5;j++)
+ {
+
+ // this is the table for our page directory. It maps 1024*4096 bytes
+ ptable* table;
+
+ // create new tables on init
+ if(copy_dir==NULL)
+ {
+ // alloc space for our new table
+ table = (ptable*) pmmngr_alloc_block ();
+ if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table");
+
+ //! idenitity mapping
+ for (int i=0, frame=phys_addr, virt=virt_addr; i<1024; i++, frame+=4096, virt+=4096)
+ {
+ //! create a new page
+ pt_entry page=0;
+ pt_entry_add_attrib (&page, I86_PTE_PRESENT);
+ pt_entry_add_attrib (&page, I86_PTE_WRITABLE);
+ pt_entry_set_frame (&page, frame);
+
+ //! ...and add it to the page table
+ table->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
+ }
+
+ pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
+ *entry=0;
+ pd_entry_add_attrib (entry, I86_PDE_PRESENT);
+ pd_entry_add_attrib (entry, I86_PDE_WRITABLE);
+ pd_entry_set_frame (entry, (physical_addr)table);
+
+ }
+ // otherwise simply take existing stuff from pdir 0
+ else
+ {
+ dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]=
+ copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)];
+
+ }
+
+ phys_addr+=1024*4096;
+ virt_addr+=1024*4096;
+ }
+
+ phys_addr=0xFc000000;
+ virt_addr=0xFc000000;
+ // vesa
+ for(int j=0;j<5;j++)
{
// this is the table for our page directory. It maps 1024*4096 bytes