aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/boot/multiboot2.cc3
-rw-r--r--src/boot/trampoline.cc4
-rw-r--r--src/boucane.cc32
-rw-r--r--src/core/paging.cc10
-rw-r--r--src/core/paging.hpp13
-rw-r--r--src/drivers/framebuffer.cc2
-rw-r--r--src/drivers/psf.cc1
-rw-r--r--src/include/boucane.hpp14
-rw-r--r--src/libs/string.cc3
9 files changed, 45 insertions, 37 deletions
diff --git a/src/boot/multiboot2.cc b/src/boot/multiboot2.cc
index 532012e..bac1adb 100644
--- a/src/boot/multiboot2.cc
+++ b/src/boot/multiboot2.cc
@@ -5,7 +5,7 @@
u32* mb2_find_tag(u32 *mb2_info_addr, char type){
PAGING_MAP(mb2_info_addr);
- u32 size=(u32)mb2_info_addr[0];
+ u32 size=(u32)mb2_info_addr[0]; // Todo: check for size
for(u64 i=0;i<size/8;i++)
PAGING_MAP(mb2_info_addr+i*4096);
@@ -38,6 +38,7 @@ char mb2_find_bootloader_name(u32* mb2_info_addr, char *return_name){
}
return 0;
}
+
char mb2_find_new_rsdp(u32* mb2_info_addr, u64 *return_addr, u32 *return_size){
u32* addr=mb2_find_tag(mb2_info_addr,15);
if(addr){
diff --git a/src/boot/trampoline.cc b/src/boot/trampoline.cc
index a75b472..68bc349 100644
--- a/src/boot/trampoline.cc
+++ b/src/boot/trampoline.cc
@@ -90,10 +90,6 @@ extern "C" u8* trampoline(u8* mb_infos_addr){
for(u64 i=0;i<=0x1000000;i+=4096){
trampoline_paging_allocate_addr(pml4,i,i,0x3);
}
- // Test
- for(u64 i=0xe0000000;i<=0xef000000;i+=4096){
- trampoline_paging_allocate_addr(pml4,i,i,0x3);
- }
// Load new pml4
asm volatile(
diff --git a/src/boucane.cc b/src/boucane.cc
index 1e58d65..b298e8a 100644
--- a/src/boucane.cc
+++ b/src/boucane.cc
@@ -1,24 +1,30 @@
#include "boucane.hpp"
#include "core/idt.hpp"
#include "boot/multiboot2.hpp"
-#include "core/paging.hpp"
-#include "core/apic.hpp"
-#include "drivers/acpi.hpp"
-#include "drivers/psf.hpp"
#include "drivers/framebuffer.hpp"
-#include "libs/stdio.hpp"
-#include "core/asm.hpp"
+#include "drivers/psf.hpp"
+#include "libs/string.hpp"
-u64 kernel_vma,stack_pma,userspace_pma;
+u64 kvar_kernel_vma;
+u64 kvar_stack_pma;
+u64 kvar_userspace_pma;
+u64 kvar_bss_start;
+u64 kvar_bss_end;
+u64 kvar_terminus_psf_start;
+u64 kvar_terminus_psf_end;
extern "C" void boucane(u64 mb_info){
// Init linker variables
- asm volatile ("movq $__kernel_vma, %0":"=m"(kernel_vma));
- asm volatile ("movq $__userspace_pma, %0":"=m"(userspace_pma));
- asm volatile ("movq $__stack_pma, %0":"=m"(stack_pma));
- asm volatile ("call load_gdt");
+ asm volatile ("movq $__kernel_vma, %0":"=m"(kvar_kernel_vma));
+ asm volatile ("movq $__userspace_pma, %0":"=m"(kvar_userspace_pma));
+ asm volatile ("movq $__stack_pma, %0":"=m"(kvar_stack_pma));
+ asm volatile ("movq $__bss_start, %0":"=m"(kvar_bss_start));
+ asm volatile ("movq $__bss_end, %0":"=m"(kvar_bss_end));
+ asm volatile ("movq $res_binary_res_terminus_psf_start, %0":"=m"(kvar_terminus_psf_start));
+ asm volatile ("movq $res_binary_res_terminus_psf_end, %0":"=m"(kvar_terminus_psf_end));
// Init data structures
+ asm volatile ("call load_gdt");
paging_enable();
idt_enable_interrupt();
@@ -26,7 +32,6 @@ extern "C" void boucane(u64 mb_info){
vga_t_init();
vga_t_clear();
FRAMEBUFFER fb_info;
-
if(mb2_find_framebuffer((u32*)mb_info, &fb_info)){
if(fb_info.bpp>16){
FB_CFG conf;
@@ -36,7 +41,7 @@ extern "C" void boucane(u64 mb_info){
conf.width=fb_info.width;
conf.height=fb_info.height;
framebuffer_init(conf);
- psf_init((void*)&res_binary_res_terminus_psf_start);
+ psf_init((void*)kvar_terminus_psf_start);
__putchar=psf_putchar;
}
}
@@ -44,6 +49,5 @@ extern "C" void boucane(u64 mb_info){
// Booting!
printk("Booting Boucane v%d.%d.%d\n",VERSION_MAJOR,VERSION_MINOR, VERSION_PATH);
-
while(1);
} \ No newline at end of file
diff --git a/src/core/paging.cc b/src/core/paging.cc
index da442bf..ae390ff 100644
--- a/src/core/paging.cc
+++ b/src/core/paging.cc
@@ -9,7 +9,7 @@ int kpages_next=1; // First page is for the pml4
u64* paging_allocate_table(){
u64 addr=(u64)kpages[kpages_next];
- u64* allocated=(u64*)(addr-kernel_vma);
+ u64* allocated=(u64*)(addr-kvar_kernel_vma);
kpages_next++;
return allocated;
}
@@ -29,17 +29,17 @@ void paging_enable() {
// Allocate paging for the kernel (to not override the source
// code during the next paging_allocate_table() calls)
- paging_allocate_contiguous(userspace_pma/4096);
+ paging_allocate_contiguous(kvar_userspace_pma/4096);
// Setting up new kernel address space
for(u64 i=0;i<=0x10000000;i+=4096){
- paging_allocate_addr(kpages[0],kernel_vma+i,i, 0x3,0); // Identity map
+ paging_allocate_addr(kpages[0],kvar_kernel_vma+i,i, 0x3,0); // Identity map
}
// 4096 bytes stack
- paging_allocate_addr(kpages[0],kernel_vma-4096,stack_pma,0x3,0);
+ paging_allocate_addr(kpages[0],kvar_kernel_vma-4096,kvar_stack_pma,0x3,0);
// Load new pml4
- u64 kpage_phy=((u64)kpages[0]-kernel_vma);
+ u64 kpage_phy=((u64)kpages[0]-kvar_kernel_vma);
asm volatile(
"mov %0, %%rax \n\t"
"mov %%rax, %%cr3 \n\t"
diff --git a/src/core/paging.hpp b/src/core/paging.hpp
index 01e45a7..5817765 100644
--- a/src/core/paging.hpp
+++ b/src/core/paging.hpp
@@ -2,6 +2,7 @@
#include "core/types.hpp"
+#define MAX_TABLES 280
#define PAGING_MAX_PAGE (20*512)
/**
* Current number of page (from the beginning of the ram) used by the kernel that
@@ -18,15 +19,17 @@
/// @brief Get page address that contain addr
#define PAGE(addr) (addr&(~(0xFFF)))
-#define PAGING_MAP(addr) paging_allocate_addr(kpages[0],(u64)(addr),(u64)(addr),PAGING_OPT_P|PAGING_OPT_RW,kernel_vma)
-#define MAX_TABLES 280
+#define PAGING_MAP(addr) paging_allocate_addr(kpages[0],(u64)(addr),(u64)(addr),PAGING_OPT_P|PAGING_OPT_RW,kvar_kernel_vma)
+#define PAGING_MAP_RANGE(addr, n) { \
+ for(u64 i=0;i<(n);i++){ \
+ paging_allocate_addr(kpages[0],((u64)(addr))+i,((u64)(addr))+i,PAGING_OPT_P|PAGING_OPT_RW,kvar_kernel_vma); \
+}}
/// @brief All PAE table structures are allocated here
extern u64 kpages[MAX_TABLES][512];
-/// cf boucane.hpp
-extern u64 kernel_vma,stack_pma,userspace_pma;
-
+/// CF boucane.hpp
+extern u64 kvar_kernel_vma,kvar_stack_pma,kvar_userspace_pma;
/**
* Setup and enable PAE paging
diff --git a/src/drivers/framebuffer.cc b/src/drivers/framebuffer.cc
index 2ac47db..4d5389c 100644
--- a/src/drivers/framebuffer.cc
+++ b/src/drivers/framebuffer.cc
@@ -7,11 +7,11 @@ FB_CFG fb_cfg;
void framebuffer_init(FB_CFG config){
fb_cfg=config;
+ PAGING_MAP_RANGE(fb_cfg.location, fb_cfg.pitch*fb_cfg.height);
}
void framebuffer_draw(FB_PIXEL p){
u8 *pixel=(u8*)(fb_cfg.location+p.x*(fb_cfg.depth/8)+p.y*fb_cfg.pitch);
- PAGING_MAP(pixel);
pixel[0]=p.r;
pixel[1]=p.g;
pixel[2]=p.b;
diff --git a/src/drivers/psf.cc b/src/drivers/psf.cc
index 187d711..ce838e8 100644
--- a/src/drivers/psf.cc
+++ b/src/drivers/psf.cc
@@ -38,7 +38,6 @@ void psf_putchar(char c){
u8* glyph=(psf_status.psf_addr+psf_status.header.header_length+c*psf_status.header.glyph_size);
FB_PIXEL pixel;
for(int i=0;i<psf_status.header.glyph_height;i++){
- PAGING_MAP(glyph);
for(int k=0;k<(psf_status.header.glyph_width/8);k++){
u8 mask=1<<7;
u8 row=*(glyph+k);
diff --git a/src/include/boucane.hpp b/src/include/boucane.hpp
index 79975a3..fd75216 100644
--- a/src/include/boucane.hpp
+++ b/src/include/boucane.hpp
@@ -11,8 +11,16 @@
#include "libs/string.hpp"
/// @brief Various variables from the linker
-extern u64 kernel_vma,stack_pma,userspace_pma;
+extern u64 kvar_kernel_vma;
+extern u64 kvar_stack_pma;
+extern u64 kvar_userspace_pma;
+extern u64 kvar_bss_start;
+extern u64 kvar_bss_end;
/// @brief Binary references
-extern u64 res_binary_res_terminus_psf_start;
-extern u64 res_binary_res_terminus_psf_end;
+extern u64 kvar_terminus_psf_start;
+extern u64 kvar_terminus_psf_end;
+
+// ---- Debug
+#define DUMP(var) asm volatile("push $0xABC; push %0; push $0xABC; _%=:; jmp _%="::"r"(var))
+#define DUMP2(var1,var2) asm volatile("push $0xABC; push %0; push %1; push $0xABC; _%=:; jmp _%="::"a"(var1),"b"(var2))
diff --git a/src/libs/string.cc b/src/libs/string.cc
index 379a128..1ded406 100644
--- a/src/libs/string.cc
+++ b/src/libs/string.cc
@@ -1,13 +1,10 @@
#include "string.hpp"
-#include "core/paging.hpp"
#include "math.hpp"
void memcpy(void* src, void* dst, u64 size){
u8 *c_src=(u8*)src;
u8 *c_dst=(u8*)dst;
for(u64 i=0;i<size;i++){
- PAGING_MAP((c_dst+i));
- PAGING_MAP((c_src+i));
*(c_dst+i)=*(c_src+i);
}
}