diff --git a/src/Makefile b/src/Makefile index e4b2a82..486b8f2 100644 --- a/src/Makefile +++ b/src/Makefile @@ -25,6 +25,9 @@ $(EXEC): boot/boot.o $(BOOT_OBJ) $(DRIVERS_OBJ) $(LIBS_OBJ) $(CORE_OBJ) $(RES_OB %.o: %.psf objcopy -I binary -O elf64-x86-64 --prefix-symbol res $^ $@ +%.o: %.bmp + objcopy -I binary -O elf64-x86-64 --prefix-symbol res $^ $@ + clean: rm -f $(EXEC) find ./ -name "*.o" -delete diff --git a/src/boot/multiboot2.cc b/src/boot/multiboot2.cc index da247ad..0cc8a25 100644 --- a/src/boot/multiboot2.cc +++ b/src/boot/multiboot2.cc @@ -69,4 +69,13 @@ char mb2_find_framebuffer(u32* mb2_info_addr, FRAMEBUFFER *fb){ return 1; } return 0; +} + +char mb2_find_mem(u32* mb2_info_addr, MEM_INFO *mem){ + u32* addr=mb2_find_tag(mb2_info_addr,4); + if(addr){ + memcpy(addr, mem, sizeof(MEM_INFO)); + return 1; + } + return 0; } \ No newline at end of file diff --git a/src/boot/multiboot2.hpp b/src/boot/multiboot2.hpp index f340269..f86c894 100644 --- a/src/boot/multiboot2.hpp +++ b/src/boot/multiboot2.hpp @@ -19,8 +19,16 @@ typedef struct FRAMEBUFFER { u8 reserved; } __attribute__((packed)) FRAMEBUFFER; +typedef struct { + TAG_HEADER header; + u32 mem_lower; + u32 mem_upper; +} __attribute__((packed)) MEM_INFO; + + u32* mb2_find_tag(u32 *mb2_info_addr, char type); char mb2_find_bootloader_name(u32* mb2_info_addr, char *return_name); char mb2_find_new_rsdp(u32* mb2_info_addr, u64 *return_addr, u32 *return_size); char mb2_find_old_rsdp(u32* mb2_info_addr, u64 *return_addr, u32 *return_size); -char mb2_find_framebuffer(u32* mb2_info_addr, FRAMEBUFFER *fb); \ No newline at end of file +char mb2_find_framebuffer(u32* mb2_info_addr, FRAMEBUFFER *fb); +char mb2_find_mem(u32* mb2_info_addr, MEM_INFO *mem); \ No newline at end of file diff --git a/src/boucane.cc b/src/boucane.cc index 5f8c851..060f9cd 100644 --- a/src/boucane.cc +++ b/src/boucane.cc @@ -8,6 +8,7 @@ #include "drivers/vgatext.hpp" #include "libs/stdio.hpp" #include "libs/string.hpp" +#include "drivers/bmp.hpp" u64 kvar_kernel_vma; u64 kvar_stack_pma; @@ -16,6 +17,8 @@ u64 kvar_bss_start; u64 kvar_bss_end; u64 kvar_terminus_psf_start; u64 kvar_terminus_psf_end; +u64 kvar_logo_bmp_start; +u64 kvar_logo_bmp_end; void (*printk)(char *str,...)=printf; @@ -28,6 +31,8 @@ extern "C" void boucane(u64 mb_info){ 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)); + asm volatile ("movq $res_binary_res_logo_bmp_start, %0":"=m"(kvar_logo_bmp_start)); + asm volatile ("movq $res_binary_res_logo_bmp_end, %0":"=m"(kvar_logo_bmp_end)); // Init data structures asm volatile ("call load_gdt"); @@ -54,9 +59,20 @@ extern "C" void boucane(u64 mb_info){ __putchar=vgatext_putchar; } } - + // Booting! printk("Booting Boucane v%d.%d.%d\n",VERSION_MAJOR,VERSION_MINOR, VERSION_PATH); + char bootloader[20]; + if(mb2_find_bootloader_name((u32*)mb_info,bootloader)){ + printk("System informations -- BOOT:%s ", bootloader); + } + + MEM_INFO mem_infos; + if(mb2_find_mem((u32*)mb_info,&mem_infos)){ + u64 mem=mem_infos.mem_upper-mem_infos.mem_lower; + mem/=1024; + printk("RAM:%dMB\n", mem); + } while(1); } \ No newline at end of file diff --git a/src/boucane.hpp b/src/boucane.hpp index 20145c5..125b192 100644 --- a/src/boucane.hpp +++ b/src/boucane.hpp @@ -20,6 +20,8 @@ extern u64 kvar_bss_end; /// @brief Binary references extern u64 kvar_terminus_psf_start; extern u64 kvar_terminus_psf_end; +extern u64 kvar_logo_bmp_start; +extern u64 kvar_logo_bmp_end; // ---- Debug #define DUMP(var) asm volatile("push $0xABC; push %0; push $0xABC; _%=:; jmp _%="::"r"(var)) diff --git a/src/core/idt.cc b/src/core/idt.cc index 25264b6..d2b7ccc 100644 --- a/src/core/idt.cc +++ b/src/core/idt.cc @@ -1,4 +1,5 @@ #include "idt.hpp" +#include "boucane.hpp" #include "core/paging.hpp" #include "libs/string.hpp" diff --git a/src/core/int.S b/src/core/int.S index daf0224..861d5cc 100644 --- a/src/core/int.S +++ b/src/core/int.S @@ -6,7 +6,8 @@ .macro call_printk msg mov \msg, %rdi mov $0, %eax # Required for variadic functions - call printk + mov $printk,%rcx + call *(%rcx) .endm .globl INT_DEFAULT diff --git a/src/core/paging.cc b/src/core/paging.cc index b21e660..b12fb4c 100644 --- a/src/core/paging.cc +++ b/src/core/paging.cc @@ -36,7 +36,10 @@ void paging_enable() { // Setting up new kernel address space for(u64 i=0;i<=0x10000000;i+=4096){ + // Higher half mapping PAGE_MAP(i); + // Allow access to RAM: + paging_allocate_addr(kpages[0], i, i, PAGING_OPT_P|PAGING_OPT_RW, 1); } // 4096 bytes stack @@ -145,32 +148,35 @@ void paging_allocate_addr(u64* pml4_table, u64 virt, u64 phy, u16 options, char // Solve pdp if(pml4_table[pml4] == 0){ - pml4_table[pml4]=(u64)(useKernelTables ? paging_allocate_table() : VIRT(PAGE_ALLOCATE())); + pml4_table[pml4]=(u64)(useKernelTables ? paging_allocate_table() : PAGE_ALLOCATE()); pml4_table[pml4]|=options; paging_allocate_addr(pml4_table,virt,phy,options,useKernelTables); return; } // Solve pd - u64* pdp_table=(u64*)(VIRT(PAGE(pml4_table[pml4]))); + u64* pdp_table=(u64*)(PAGE(pml4_table[pml4])); + pdp_table=useKernelTables ? VIRT(pdp_table) : pdp_table; if(pdp_table[pdp] == 0){ - pdp_table[pdp]=(u64)(useKernelTables ? paging_allocate_table() : VIRT(PAGE_ALLOCATE())); + pdp_table[pdp]=(u64)(useKernelTables ? paging_allocate_table() : PAGE_ALLOCATE()); pdp_table[pdp]|=options; paging_allocate_addr(pml4_table,virt,phy,options,useKernelTables); return; } // Solve pt - u64* pd_table=(u64*)(VIRT(PAGE(pdp_table[pdp]))); + u64* pd_table=(u64*)(PAGE(pdp_table[pdp])); + pd_table=useKernelTables ? VIRT(pd_table) : pd_table; if(pd_table[pd] == 0){ - pd_table[pd]=(u64)(useKernelTables ? paging_allocate_table() : VIRT(PAGE_ALLOCATE())); + pd_table[pd]=(u64)(useKernelTables ? paging_allocate_table() : PAGE_ALLOCATE()); pd_table[pd]|=options; paging_allocate_addr(pml4_table,virt,phy,options,useKernelTables); return; } // Solve address - u64* pt_table=(u64*)(VIRT(PAGE(pd_table[pd]))); + u64* pt_table=(u64*)(PAGE(pd_table[pd])); + pt_table=useKernelTables ? VIRT(pt_table) : pt_table; if(pt_table[pt] == 0){ pt_table[pt]=PAGE(phy); pt_table[pt]|=options; @@ -180,8 +186,7 @@ void paging_allocate_addr(u64* pml4_table, u64 virt, u64 phy, u16 options, char } u64* paging_create_task(int npages){ - u64 *pml4=VIRT(PAGE_ALLOCATE()); - u64 sum=(u64)pml4+kvar_kernel_vma; - paging_allocate_addr(pml4, 0, (u64)PAGE_ALLOCATE(), PAGING_OPT_P|PAGING_OPT_RW, 0); + u64 *pml4=PAGE_ALLOCATE(); + // paging_allocate_addr(pml4, 0, (u64)PAGE_ALLOCATE(), PAGING_OPT_P|PAGING_OPT_RW, 0); return pml4; } \ No newline at end of file diff --git a/src/drivers/bmp.cc b/src/drivers/bmp.cc new file mode 100644 index 0000000..6f9dad6 --- /dev/null +++ b/src/drivers/bmp.cc @@ -0,0 +1,39 @@ +#include "bmp.hpp" +#include "libs/string.hpp" + +#include "drivers/framebuffer.hpp" + +void bmp_draw(u8* bmp_data, int posx, int posy){ + BMP_HEADER header; + memcpy(bmp_data, &header, sizeof(BMP_HEADER)); + if(header.signature!=0x4d42){ + printk("Invalid BMP data\n"); + return; + } + + // Do not forget, each row is 32bits aligned + u32 Bpp=header.bpp/8; + u32 lineW=header.width*Bpp; + while((lineW&0x3)!=0){ + lineW++; + } + + for(u32 y=0;y<header.height;y++){ + for(u32 x=0;x<header.width;x++){ + u32 pos=x*Bpp+y*lineW; + u8 *pixel=((u8*)bmp_data)+header.data_offset+pos; + FB_PIXEL p; + p.x=posx+x; + p.y=posy+(header.height-y); + p.r=pixel[0]; + p.g=pixel[1]; + p.b=pixel[2]; + //printk("R%d G%d B%d\n",p.r,p.g,p.b); + p.a=0; + framebuffer_draw(p); + + } + + } + +} \ No newline at end of file diff --git a/src/drivers/bmp.hpp b/src/drivers/bmp.hpp new file mode 100644 index 0000000..e31d4b3 --- /dev/null +++ b/src/drivers/bmp.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "boucane.hpp" + +typedef struct { + u16 signature; + u32 filesize; + u32 reserved; + u32 data_offset; + u32 info_header_size; + u32 width; + u32 height; + u16 planes; + u16 bpp; + u32 compression; +} __attribute__((packed)) BMP_HEADER; + +void bmp_draw(u8* bmp_data, int x, int y); \ No newline at end of file diff --git a/src/res/logo.bmp b/src/res/logo.bmp new file mode 100644 index 0000000..894f020 Binary files /dev/null and b/src/res/logo.bmp differ diff --git a/tools/logo.svg b/tools/logo.svg new file mode 100644 index 0000000..ee133ab --- /dev/null +++ b/tools/logo.svg @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="80mm" + height="80mm" + viewBox="0 0 80 80" + version="1.1" + id="svg8" + inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)" + sodipodi:docname="logo.svg" + inkscape:export-filename="/home/loic/Documents/Git/boucane/src/res/logo.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + <defs + id="defs2"> + <linearGradient + inkscape:collect="always" + id="linearGradient843"> + <stop + style="stop-color:#b3b3b3;stop-opacity:1;" + offset="0" + id="stop839" /> + <stop + style="stop-color:#b3b3b3;stop-opacity:0;" + offset="1" + id="stop841" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient843" + id="linearGradient845" + x1="0" + y1="40" + x2="80" + y2="40" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.2512358" + inkscape:cx="148.75224" + inkscape:cy="239.43042" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + inkscape:document-rotation="0" + showgrid="false" + inkscape:window-width="1892" + inkscape:window-height="1014" + inkscape:window-x="10" + inkscape:window-y="48" + inkscape:window-maximized="0" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <rect + style="fill:url(#linearGradient845);stroke:none;stroke-width:2;stop-color:#000000;fill-opacity:1" + id="rect835" + width="80" + height="80" + x="7.1054274e-15" + y="7.2164497e-15" /> + <ellipse + style="fill:#ffaaaa;stroke:#808080;stroke-width:2;stop-color:#000000" + id="path833" + cx="40" + cy="40" + rx="15.068277" + ry="14.545761" /> + </g> +</svg>