From f37f5d86b74870e878f69bd41a3c70a59c4ce1c1 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Thu, 29 Apr 2021 15:01:54 +0200 Subject: Debug memory --- src/drivers/acpi.cc | 4 ++-- src/drivers/framebuffer.cc | 38 +++++++++++++++++++++++++++++++++----- src/drivers/memtext.cc | 5 ++--- src/drivers/memtext.hpp | 2 +- src/drivers/psftext.cc | 8 ++++++-- src/drivers/vgatext.cc | 6 +++--- 6 files changed, 47 insertions(+), 16 deletions(-) (limited to 'src/drivers') diff --git a/src/drivers/acpi.cc b/src/drivers/acpi.cc index 9c25202..ec7a2ff 100644 --- a/src/drivers/acpi.cc +++ b/src/drivers/acpi.cc @@ -32,7 +32,7 @@ char acpi_init(void* rsdp_p){ } char acpi_load_rsdt(){ - PAGING_MAP(rsdp.rsdt_addr); // Ensure page is accessible + PAGE_ID_MAP(rsdp.rsdt_addr); // Ensure page is accessible memcpy((void*)rsdp.rsdt_addr, &rsdt, sizeof(rsdt)); rsdt.first_entry_addr_ptr=rsdp.rsdt_addr+36; if(rsdt.header.signature !=ACPI_RSDT_SIGNATURE){ @@ -54,7 +54,7 @@ char acpi_load_madt(){ u32 *addr=(u32*)(rsdt.first_entry_addr_ptr+i*4); // Load header ACPI_TABLE_HEADER header; - PAGING_MAP(*addr); + PAGE_ID_MAP(*addr); memcpy((void*)*addr, &header, sizeof(header)); // Check if it is MADT if(header.signature==ACPI_MADT_SIGNATURE){ diff --git a/src/drivers/framebuffer.cc b/src/drivers/framebuffer.cc index 9f90d84..f5b537b 100644 --- a/src/drivers/framebuffer.cc +++ b/src/drivers/framebuffer.cc @@ -7,10 +7,25 @@ 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); + // Map buffer to the end of the memory + // indeed fb_cfg.location could be to big and + // thus leading to cross u64 size limit while summing it with + // kvar_kernel_vma in paging.cc/hpp + u64 start=0xFFFFFFFFFFFFFFFF - fb_cfg.pitch*fb_cfg.height; + // Ensure we start writing at the begining of the page since + // start is not necessarly 4096 bytes aligned + start=PAGE(start); + PAGE_RMAP_PHY(start-kvar_kernel_vma,fb_cfg.location, fb_cfg.pitch*fb_cfg.height); + fb_cfg.location=start; } void framebuffer_draw(FB_PIXEL p){ + // Check overflow + p.x=p.x>(fb_cfg.width)?fb_cfg.width:p.x; + p.y=p.y>(fb_cfg.width)?fb_cfg.width:p.y; + p.x=p.x<0?0:p.x; + p.y=p.y<0?0:p.y; + u8 *pixel=(u8*)(fb_cfg.location+p.x*(fb_cfg.depth/8)+p.y*fb_cfg.pitch); pixel[0]=p.r; pixel[1]=p.g; @@ -20,11 +35,24 @@ void framebuffer_draw(FB_PIXEL p){ } void framebuffer_scrollup(u32 npixel){ - u64 start=fb_cfg.location+npixel*fb_cfg.pitch; - u64 amount=fb_cfg.pitch*(fb_cfg.height-npixel); - memcpy((void*)start,(void*)fb_cfg.location,amount); // TODO change because page fault can occurs + for(u32 y=0;ypsf_status.nline) + if(psf_status.y>=psf_status.nline){ framebuffer_scrollup(psf_status.header.glyph_height); + psf_status.y--; + } return; } @@ -60,7 +62,9 @@ void psftext_putchar(char c){ if(psf_status.x>psf_status.nchar){ psf_status.y++; psf_status.x=0; - if(psf_status.y>psf_status.nline) + if(psf_status.y>=psf_status.nline){ framebuffer_scrollup(psf_status.header.glyph_height); + psf_status.y--; + } } } \ No newline at end of file diff --git a/src/drivers/vgatext.cc b/src/drivers/vgatext.cc index be01f0e..6a5a1b2 100644 --- a/src/drivers/vgatext.cc +++ b/src/drivers/vgatext.cc @@ -6,7 +6,7 @@ #define MAX_LINE 25 VIDEO_STATE VS={ - (u8 *)0xB8000, + (u8 *)0, 0, 0, BLACK, @@ -14,8 +14,8 @@ VIDEO_STATE VS={ }; void vgatext_init(){ - PAGING_MAP(0xB8000); - PAGING_MAP(0xB8000+4096); + PAGE_RMAP(0xB8000,4096*2); + VS.mem=(u8*)VIRT(0xB8000); } void vgatext_putchar(char c){ -- cgit v1.2.3