summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-08-19 03:15:50 +0200
committerMiguel <m.i@gmx.at>2018-08-19 03:15:50 +0200
commit9b13ca03dacb6a385461dccad319010537add5cf (patch)
tree4397fdff0d1566b7bec761031ce2077e88cd5379 /kernel
parenta2bd733e517364b6c9ddd26706d85fac09656854 (diff)
get vesa working in vmem.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kernel.c7
-rw-r--r--kernel/multiboot.c68
-rw-r--r--kernel/multiboot.h10
-rw-r--r--kernel/syscalls.h10
-rw-r--r--kernel/vmem.c55
-rw-r--r--kernel/vmem.h2
6 files changed, 139 insertions, 13 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c
index fcfb8d7..4ba76fa 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -53,6 +53,9 @@ void kernel_main(uint32_t eax,uint32_t ebx)
// MULTIBOOT HEADER
multiboot_information *info=get_multiboot(eax, ebx);
+
+ // INIT VESA
+ vesa_init(info->vbe_control_info,info->vbe_mode_info,0);
// Gather Info about other processors. (APs = application processors) // ACPI or MP
smp_processors procdata;
@@ -71,9 +74,9 @@ void kernel_main(uint32_t eax,uint32_t ebx)
//TODO: !!! Check commented out sleep ()!!!
smp_log_procdata(&procdata);
smp_start_aps(&procdata,"/boot/mp.bin"); //will be copied over mbr
-
+
// VIRTUAL MEMORY (paging)
- pdirectory *dir=vmem_init(kernel_blocks);
+ pdirectory *dir=vmem_init(kernel_blocks,(uint32_t)info->framebuffer_addr);
// PCI Bus
pci_init();
diff --git a/kernel/multiboot.c b/kernel/multiboot.c
index 3132717..0440b8e 100644
--- a/kernel/multiboot.c
+++ b/kernel/multiboot.c
@@ -1,5 +1,7 @@
+//https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Boot-information-format
#define FOOLOS_MODULE_NAME "multiboot"
#include "multiboot.h"
+#include "driver/vesa.h"
#include "lib/logger/log.h"
multiboot_information* get_multiboot(uint32_t eax, uint32_t ebx)
@@ -9,22 +11,74 @@ multiboot_information* get_multiboot(uint32_t eax, uint32_t ebx)
multiboot_information *info;
info=ebx;
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"multiboot flags: 0x%08X",info->flags);
+
+ if(info->flags&&1<<0)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[0] mem_lower: %d KB",info->mem_lower);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[0] mem_upper: %d KB",info->mem_upper);
+ }
+
+ if(info->flags&&1<<1)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[1] boot-device 0x%08X",info->boot_device);
+ }
+
+ if(info->flags&&1<<2)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[2] cmdline: \"%s\"",info->cmdline);
+ }
+
+ if(info->flags&&1<<3)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[3] loaded modules count: %d",info->mods_count);
+ }
+
+ if(info->flags&&1<<4)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[4/5] a.out kernel image symbols found");
+ }
+
+ if(info->flags&&1<<5)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[4/5] ELF table: %d entries (sized %d) at 0x%08X",info->syms[0],info->syms[1],info->syms[2]);
+ }
+
+ if(info->flags&&1<<6)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[6] Found memory map");
+ }
+
+ if(info->flags&&1<<7)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[7] Found Drives map");
+ }
+
+ if(info->flags&&1<<8)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[8] ROM Configuration Table at: 0x%08X",info->config_table);
+ }
+
if(info->flags&&1<<9)
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Loaded by: \"%s\"",info->boot_loader_name);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[9] Loaded by: \"%s\"",info->boot_loader_name);
}
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"multiboot flags: 0x%08X",info->flags);
+ if(info->flags&&1<<10)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[10] APM Table present.");
+ }
- if(info->flags&&1<<0)
+ if(info->flags&&1<<11)
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mem_lower: %d KB",info->mem_lower);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mem_upper: %d KB",info->mem_upper);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[11] VBE control info: 0x%08X",info->vbe_control_info);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[11] VBE mode info: 0x%08X",info->vbe_mode_info);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[11] VBE current mode (spec V3.0): 0x%08X",info->vbe_mode);
}
- if(info->flags&&1<<2)
+ if(info->flags&&1<<12)
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"cmdline: \"%s\"",info->cmdline);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[12] Framebuffer (w:%d h:%d bpp:%d) at addr=0x%08X",info->framebuffer_width,info->framebuffer_height,info->framebuffer_bpp,info->framebuffer_addr);
}
return info;
diff --git a/kernel/multiboot.h b/kernel/multiboot.h
index bb31a2e..560bae4 100644
--- a/kernel/multiboot.h
+++ b/kernel/multiboot.h
@@ -16,7 +16,7 @@ typedef struct multiboot_information_struct
uint32_t cmdline;
uint32_t mods_count;
uint32_t mods_addr;
- uint32_t mods_syms[4];
+ uint32_t syms[4];
uint32_t mmap_length;
uint32_t mmap_addr;
uint32_t drives_length;
@@ -30,7 +30,13 @@ typedef struct multiboot_information_struct
uint16_t vbe_interface_seg;
uint16_t vbe_interface_off;
uint16_t vbe_interface_len;
-
+ uint64_t framebuffer_addr;
+ uint32_t framebuffer_pitch;
+ uint32_t framebuffer_width;
+ uint32_t framebuffer_height;
+ uint8_t framebuffer_bpp;
+ uint8_t framebuffer_type;
+ //color_info;
}multiboot_information;
diff --git a/kernel/syscalls.h b/kernel/syscalls.h
index c8bc807..e88d8c3 100644
--- a/kernel/syscalls.h
+++ b/kernel/syscalls.h
@@ -20,3 +20,13 @@
#define SYSCALL_READDIR 63
#define SYSCALL_KILL 73
#define SYSCALL_POLL 80
+
+
+// new planned syscalls for graphx
+// TODO: split ncurses and our syscalls??
+
+// int syscall_create_win("title");
+// int syscall_kill_win(int descriptor);
+// int syscall_update_win(int descriptor, *mem, *rect);
+// int syscall_callback(*func, ON_MOUSE);
+// int syscall_sleep();
diff --git a/kernel/vmem.c b/kernel/vmem.c
index f49689f..3d3456b 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -10,6 +10,7 @@
#define FOOLOS_MODULE_NAME "vmem"
static uint32_t kernel_pages;
+static uint32_t fb_addr;
// TODO : why is the frame not 0xfffff??
enum PAGE_PTE_FLAGS
@@ -305,6 +306,57 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir)
virt_addr+=1024*4096;
}
+ // FRAMEBUFFER IDENTITY MAP (4pages enought? )
+ phys_addr=fb_addr;
+ virt_addr=fb_addr;
+
+ for(int j=0;j<4;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*) kballoc(1);
+ 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_add_attrib (&page, I86_PTE_USER);
+ 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);
+ pt_entry_add_attrib (entry, I86_PTE_USER);
+ 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;
+ }
// programm space
virt_addr=0x8000000;
@@ -442,8 +494,9 @@ void vmem_set_dir(pdirectory *dir)
x86_set_pdbr(dir);
}
-pdirectory* vmem_init(uint32_t kernel_blocks)
+pdirectory* vmem_init(uint32_t kernel_blocks, uint32_t frameb_addr)
{
+ fb_addr=frameb_addr;
kernel_pages=kernel_blocks/1024+1;
return vmem_new_space_dir(NULL);
}
diff --git a/kernel/vmem.h b/kernel/vmem.h
index d30c7cf..104e5ab 100644
--- a/kernel/vmem.h
+++ b/kernel/vmem.h
@@ -34,4 +34,4 @@ typedef struct pdirectory_struct {
pd_entry m_entries[PAGES_PER_DIR];
}pdirectory;
-pdirectory* vmem_init(uint32_t kernel_blocks);
+pdirectory* vmem_init(uint32_t kernel_blocks,uint32_t fb_addr);