summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/console.c3
-rw-r--r--kernel/interrupts.c4
-rw-r--r--kernel/kernel.c29
-rw-r--r--kernel/keyboard.c7
-rw-r--r--kernel/mem.c40
-rw-r--r--kernel/pci.c8
-rw-r--r--kernel/shell.c11
-rw-r--r--kernel/vesa.c5
-rw-r--r--kernel/vmem.c146
-rw-r--r--kernel/x86.c14
-rw-r--r--kernel/x86.h2
11 files changed, 228 insertions, 41 deletions
diff --git a/kernel/console.c b/kernel/console.c
index b1a9125..72ad066 100644
--- a/kernel/console.c
+++ b/kernel/console.c
@@ -1,6 +1,7 @@
#include "console.h"
-#define FOOLOS_CONSOLE
+//#define FOOLOS_CONSOLE
+//#undef FOOLOS_CONSOLE
static int posx=0;
static int posy=0;
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index 167f0ad..348972e 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -51,8 +51,6 @@ void int_def_handler()
int_unhandled++;
X86_IRQ_END
-
-
}
//set a handler for a specific interrupt
@@ -79,7 +77,7 @@ void int_init(uint16_t sel)
int_install_ir(i, 0b10001110, sel,&int_def_handler);
}
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initializing...");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initializing. IDT: 0x%08x, IDTD: 0x%08X",&idt,&idtd);
}
void int_install()
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 7d9b848..2dd57fd 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -25,13 +25,14 @@ void int_test_handler_worker()
{
// this can not be called directly from interrupt handler
// due to optional parameters (...) probably!
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"irq 88");
+ panic(FOOLOS_MODULE_NAME,"unhandled EXCEPTION!");
}
void int_test_handler()
{
X86_IRQ_BEGIN
int_test_handler_worker();
sleep(30);
+ while(1); // hang!
X86_IRQ_END
}
@@ -55,17 +56,23 @@ void kernel_main()
// while the last one is set in the Makefile. The font binary
// is integrated in the kernel image.
//
- vesa_init(0x8300,0x8400,0x7200);
+ // this function returns the physical base address of
+ // our video memory
+ //
+ uint32_t vesa_physbase=vesa_init(0x8300,0x8400,0x7200);
//
// PIT config (timer)
timer_init();
+
// we know that here, the bootloader placed the mamory map!
mem_init(0x7c00+0x400,*((uint16_t *)(0x7c00+0x600)));
- // paging (Todo)
- vmem_init();
+ // paging (pass the vesa physbase address for identity mapping)
+ vmem_init(vesa_physbase);
+
+ //
// init and interrupt decriptor table
int_init(0x08);
@@ -90,10 +97,15 @@ void kernel_main()
// install test software interrupt handler
int_install_ir(88, 0b10001110, 0x08,&int_test_handler);
+
+ for(int i=0;i<19;i++)
+ int_install_ir(i, 0b10001110, 0x08,&int_test_handler);
// now we can enable interrupts back again
int_enable();
+// int x=10/0;
+
// pci
pci_init();
@@ -116,6 +128,15 @@ void kernel_main()
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test mem %x",*(memtest2+1));
*/
+ /* stack pointer test?
+ uint32_t *esp=0x90000;
+ for(int i=0;i<10;i++)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"esp: %x",*esp);
+ esp--;
+ }
+ */
+
while(1); // never ending loop
diff --git a/kernel/keyboard.c b/kernel/keyboard.c
index ede71a2..7b08098 100644
--- a/kernel/keyboard.c
+++ b/kernel/keyboard.c
@@ -1,18 +1,15 @@
#include "kernel.h"
#include "x86.h"
#include "console.h"
+
#include "../lib/logger/log.h" // logger facilities
#define FOOLOS_MODULE_NAME "keyboard"
/// keyboard driver ////
-
-//static int cursor=0;
-//static char last_code=0;
-
void keyboard_handle(uint8_t in)
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"scancode 0x%x",in);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"scancode 0x%x",in);
int i=0;
//
diff --git a/kernel/mem.c b/kernel/mem.c
index b761c8c..4896272 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -38,6 +38,39 @@ int mmap_test(int bit)
return _mmngr_memory_map[bit / 32] & (1 << (bit % 32));
}
+void mmap_show_free ()
+{
+
+ int last_pos=0;
+ uint32_t last=_mmngr_memory_map[0];
+
+ for (int i=1; i< MEM_BITMAP_SIZE ; i++)
+ {
+ if (_mmngr_memory_map[i] != last||i==MEM_BITMAP_SIZE-1)
+ {
+
+ if(last==0)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d -%d free",last_pos*32,i*32);
+ }
+ else if(last==0xffffffff)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d -%d full",last_pos*32,i*32);
+ }
+ else
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d -%d some free",last_pos*32,i*32);
+ }
+
+ last_pos=i;
+ last=_mmngr_memory_map[i];
+
+
+ }
+ }
+
+}
+
//
int mmap_first_free ()
{
@@ -61,6 +94,7 @@ int mmap_first_free ()
}
+
void pmmngr_init ()
{
//! By default, all of memory is in use
@@ -107,7 +141,7 @@ void* pmmngr_alloc_block ()
if (frame == -1)
{
- scr_put_string_nl("OUT OF MEM!");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"OUT OF MEMORY");
return 0; //out of memory
}
@@ -231,7 +265,7 @@ void mem_init(uint16_t *memmap,uint16_t entries)
#ifdef MEM_PRINT_MEMORYMAP
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%x : 0x%08x - 0x%08x",
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"type: %02d / range: 0x%08x - 0x%08x",
memmap[8],
(((uint32_t)memmap[1])<<16)+memmap[0],
(((uint32_t)memmap[1])<<16)+memmap[0]
@@ -249,7 +283,7 @@ void mem_init(uint16_t *memmap,uint16_t entries)
}
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Available Mem: %d bytes.",avail_mem);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Available Mem: %d bytes. (~%d MB)",avail_mem,avail_mem/1024/1024);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Available 4K blocks: %d blocks.",mem_free_blocks);
}
diff --git a/kernel/pci.c b/kernel/pci.c
index c8bd95d..c1e6753 100644
--- a/kernel/pci.c
+++ b/kernel/pci.c
@@ -85,11 +85,11 @@ uint16_t pciCheck(uint8_t bus, uint8_t slot)
{
// uint16_t irq=pciConfigReadWord(bus,slot,0,0x3C);
// uint16_t irq2=pciConfigReadWord(bus,slot,0,0x3E);
- init_e1000();
+// init_e1000();
- test_bar(bus,slot,0x10);
- test_bar(bus,slot,0x14);
- test_bar(bus,slot,0x18);
+// test_bar(bus,slot,0x10);
+// test_bar(bus,slot,0x14);
+// test_bar(bus,slot,0x18);
// scr_put_hex(irq);
// scr_put_hex(irq2);
diff --git a/kernel/shell.c b/kernel/shell.c
index 45e8620..aff2dc4 100644
--- a/kernel/shell.c
+++ b/kernel/shell.c
@@ -20,7 +20,7 @@ void shell_init()
void shell_put(char x)
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"char:%c",x);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"char:%c",x);
if(pos<COMMAND_LENGTH-2);
@@ -65,6 +65,15 @@ void shell_execute()
{
int_generate88();
}
+ else if(1==strcmp(command,"MEM"))
+ {
+ mmap_show_free();
+ }
+ else if(1==strcmp(command,"ALLOC"))
+ {
+ uint32_t *malloc= pmmngr_alloc_block();
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"allocated 4KB block at: %08x.",malloc);
+ }
else if(1==strcmp(command,"READ"))
{
uint8_t *read= flpydsk_read_sector (10);
diff --git a/kernel/vesa.c b/kernel/vesa.c
index 048dbf1..b7b4615 100644
--- a/kernel/vesa.c
+++ b/kernel/vesa.c
@@ -57,7 +57,7 @@ static console_y;
static console_lines;
static console_cols;
-void vesa_init(vbeinfo *info,vbemodeinfo *mode,foolfont *rawfont)
+uint32_t vesa_init(vbeinfo *info,vbemodeinfo *mode,foolfont *rawfont)
{
//the only functionallu important init lines! (rest is log)
VbeModeInfoBlock=mode;
@@ -90,10 +90,13 @@ void vesa_init(vbeinfo *info,vbemodeinfo *mode,foolfont *rawfont)
while(*modeptr!=0xffff&&*modeptr!=0)
{
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"mode supported : 0x%x", (*modeptr));
+ scr_put_hex(*modeptr);
modeptr++;
}
#endif
+ return VbeModeInfoBlock->physbase;
+
}
void PutPixel(int x,int y, int color){
diff --git a/kernel/vmem.c b/kernel/vmem.c
index 9d34810..b1ecfa1 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -1,5 +1,12 @@
+// http://www.brokenthorn.com/Resources/OSDev18.html
+
#include "kernel.h"
+#include "x86.h"
+#include "../lib/logger/log.h" // logger facilities
+#define FOOLOS_MODULE_NAME "vmem"
+
+// TODO : why is the frame not 0xfffff??
enum PAGE_PTE_FLAGS {
I86_PTE_PRESENT = 1, //0000000000000000000000000000001
@@ -12,7 +19,7 @@ enum PAGE_PTE_FLAGS {
I86_PTE_PAT = 0x80, //0000000000000000000000010000000
I86_PTE_CPU_GLOBAL = 0x100, //0000000000000000000000100000000
I86_PTE_LV4_GLOBAL = 0x200, //0000000000000000000001000000000
- I86_PTE_FRAME = 0x7FFFF000 //1111111111111111111000000000000
+ I86_PTE_FRAME = 0xFFFFF000 //1111111111111111111000000000000
};
enum PAGE_PDE_FLAGS {
@@ -27,7 +34,7 @@ enum PAGE_PDE_FLAGS {
I86_PDE_4MB = 0x80, //0000000000000000000000010000000
I86_PDE_CPU_GLOBAL = 0x100, //0000000000000000000000100000000
I86_PDE_LV4_GLOBAL = 0x200, //0000000000000000000001000000000
- I86_PDE_FRAME = 0x7FFFF000 //1111111111111111111000000000000
+ I86_PDE_FRAME = 0xFFFFF000 //1111111111111111111000000000000
};
//! page table entry
@@ -62,53 +69,65 @@ typedef uint8_t bool;
#define PAGE_SIZE 4096
//! page table
-struct ptable {
+typedef struct ptable_struct {
pt_entry m_entries[PAGES_PER_TABLE];
-};
+}ptable ;
//! page directory
-struct pdirectory {
+typedef struct pdirectory_struct {
pd_entry m_entries[PAGES_PER_DIR];
-};
+}pdirectory;
-void pt_entry_add_attrib (pt_entry* e, uint32_t attrib)
+void pt_entry_add_attrib (pt_entry* e, uint32_t attrib)
{
+ *e|=attrib;
}
-void pt_entry_del_attrib (pt_entry* e, uint32_t attrib)
+void pt_entry_del_attrib (pt_entry* e, uint32_t attrib)
{
+ *e&=~attrib;
}
-void pt_entry_set_frame (pt_entry* e , physical_addr addr)
+void pt_entry_set_frame (pt_entry* e , physical_addr addr)
{
+ // *e = (*e & ~I86_PTE_FRAME) | addr;
+
+ *e|=I86_PTE_FRAME&addr;
+
}
-bool pt_entry_is_present (pt_entry e)
+bool pt_entry_is_present (pt_entry e)
{
- return 1;
+ return e&I86_PTE_PRESENT;
}
-bool pt_entry_is_writable (pt_entry e)
+
+bool pt_entry_is_writable (pt_entry e)
{
- return 1;
+ return e&I86_PTE_WRITABLE;
}
-physical_addr pt_entry_pfn (pt_entry e)
+
+physical_addr pt_entry_pfn (pt_entry e)
{
- return 1;
+ return e&I86_PTE_FRAME;
}
void pd_entry_add_attrib (pd_entry* e, uint32_t attrib)
{
+ *e|=attrib;
}
void pd_entry_del_attrib (pd_entry* e, uint32_t attrib)
{
+ *e&=~attrib;
}
void pd_entry_set_frame (pd_entry* e, physical_addr add)
{
+ *e|=I86_PDE_FRAME&add;
}
bool pd_entry_is_present (pd_entry e)
{
- return 1;
+ return e&I86_PDE_PRESENT;
}
+/*
bool pd_entry_is_user (pd_entry e)
{
return 1;
@@ -118,20 +137,23 @@ bool pd_entry_is_4mb (pd_entry e)
{
return 1;
}
+*/
bool pd_entry_is_writable (pd_entry e)
{
- return 1;
+ return e&I86_PDE_WRITABLE;
}
physical_addr pd_entry_pfn (pd_entry e)
{
- return 1;
+ return e&I86_PDE_FRAME;
}
+/*
void pd_entry_enable_global (pd_entry e)
{
}
+*/
uint8_t vmmngr_alloc_page (pt_entry* e)
{
@@ -148,8 +170,94 @@ uint8_t vmmngr_alloc_page (pt_entry* e)
return 1;
}
-void vmem_init()
+void vmmngr_free_page (pt_entry* e)
+{
+ void* p = (void*)pt_entry_pfn (*e);
+ if (p)
+ pmmngr_free_block (p);
+
+ pt_entry_del_attrib (e, I86_PTE_PRESENT);
+}
+
+pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr)
+{
+
+ if (p)
+ return &p->m_entries[ PAGE_TABLE_INDEX (addr) ];
+
+ return 0;
+}
+
+// TODO !? http://www.brokenthorn.com/Resources/OSDev18.html
+void vmmngr_map_page (void* phys, void* virt)
+{
+
+}
+
+void vmem_init(uint32_t vesa_physbase)
{
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase);
+
+ ptable* table1 = (ptable*) pmmngr_alloc_block ();
+
+ if (!table1)panic(FOOLOS_MODULE_NAME,"unable to alloc table1");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table1: 0x%X",table1);
+
+ ptable* table2 = (ptable*) pmmngr_alloc_block ();
+
+ if (!table1)panic(FOOLOS_MODULE_NAME,"unable to alloc table2");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table2: 0x%X",table2);
+
+ // TODO: 3blocks?
+ pdirectory* dir = (pdirectory*) pmmngr_alloc_block ();
+ if (!dir)panic(FOOLOS_MODULE_NAME,"unable to alloc pdirectory");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"pdirectory: 0x%X",dir);
+
+ //! map 1mb to 3gb (where we are at)
+ for (int i=0, frame=vesa_physbase, virt=vesa_physbase; 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_set_frame (&page, frame);
+
+ //! ...and add it to the page table
+ table1->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
+ }
+
+ //! 1st 4mb are idenitity mapped
+ for (int i=0, frame=0x0, virt=0x00000000; 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_set_frame (&page, frame);
+
+ //! ...and add it to the page table
+ table2->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
+ }
+
+
+ pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (vesa_physbase) ];
+ *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)table1);
+
+
+ pd_entry* entry2 = &dir->m_entries [PAGE_DIRECTORY_INDEX (0x00000000) ];
+ *entry2=0;
+ pd_entry_add_attrib (entry2, I86_PDE_PRESENT);
+ pd_entry_add_attrib (entry2, I86_PDE_WRITABLE);
+ pd_entry_set_frame (entry2, (physical_addr)table2);
+
+
+ x86_set_pdbr(dir);
+
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"enabling paging...");
+ x86_paging_enable();
+
}
diff --git a/kernel/x86.c b/kernel/x86.c
index ee38599..cc7c303 100644
--- a/kernel/x86.c
+++ b/kernel/x86.c
@@ -36,3 +36,17 @@ uint32_t x86_inl(int port)
return data;
}
+
+void x86_set_pdbr(uint32_t addr)
+{
+ asm volatile("mov %0, %%cr3":: "b"(addr));
+
+}
+
+void x86_paging_enable()
+{
+ unsigned int cr0;
+ asm volatile("mov %%cr0, %0": "=b"(cr0));
+ cr0 |= 0x80000000;
+ asm volatile("mov %0, %%cr0":: "b"(cr0));
+}
diff --git a/kernel/x86.h b/kernel/x86.h
index 2b7572c..3233124 100644
--- a/kernel/x86.h
+++ b/kernel/x86.h
@@ -16,5 +16,7 @@ void x86_outw(int port, uint16_t data);
uint16_t x86_inw(int port);
void x86_outl(int port, uint32_t data);
uint32_t x86_inl(int port);
+void x86_set_pdbr(uint32_t addr);
+void x86_paging_enable();
#endif