aboutsummaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorLoic Guegan <manzerbredes@mailbox.org>2021-04-29 15:01:54 +0200
committerLoic Guegan <manzerbredes@mailbox.org>2021-04-29 15:01:54 +0200
commitf37f5d86b74870e878f69bd41a3c70a59c4ce1c1 (patch)
tree65620f0504fea111ba870457f32bc072dc27fe7a /src/drivers
parentfde8a1ab65d5e33d90123a3aaa9b5c15e249689f (diff)
Debug memory
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/acpi.cc4
-rw-r--r--src/drivers/framebuffer.cc38
-rw-r--r--src/drivers/memtext.cc5
-rw-r--r--src/drivers/memtext.hpp2
-rw-r--r--src/drivers/psftext.cc8
-rw-r--r--src/drivers/vgatext.cc6
6 files changed, 47 insertions, 16 deletions
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;y<fb_cfg.height;y++){
+ if(npixel<fb_cfg.height){
+ for(u32 x=0;x<fb_cfg.width;x++){
+ u32 *pixel_dst=(u32*)(fb_cfg.location+x*(fb_cfg.depth/8)+y*fb_cfg.pitch);
+ u32 *pixel_src=(u32*)(fb_cfg.location+x*(fb_cfg.depth/8)+npixel*fb_cfg.pitch);
+ *pixel_dst=*pixel_src; // Faster than writing pixel by pixel
+ }
+ }
+ else{
+ for(u32 x=0;x<fb_cfg.width;x++){
+ u8 *pixel_dst=(u8*)(fb_cfg.location+x*(fb_cfg.depth/8)+y*fb_cfg.pitch);
+ *pixel_dst=0;// Faster than writing pixel by pixel
+ }
+ }
+ npixel++;
+ }
}
void framebuffer_clear(){
- memset((void*)fb_cfg.location, 0, fb_cfg.pitch*fb_cfg.height);
+ // memset((void*)fb_cfg.location, 0, fb_cfg.pitch*fb_cfg.height-1000);
} \ No newline at end of file
diff --git a/src/drivers/memtext.cc b/src/drivers/memtext.cc
index b5371b1..f010271 100644
--- a/src/drivers/memtext.cc
+++ b/src/drivers/memtext.cc
@@ -4,13 +4,12 @@
#include "libs/string.hpp"
-
char memtext_buffer[MEMTEXT_BUFFER_SIZE];
u64 memtext_x=0;
void memtext_init(){
- PAGING_MAP2_RANGE(MEMTEXT_ADDR_LOCATION,0x0,8);
- u64* p_addr=(u64*)MEMTEXT_ADDR_LOCATION;
+ PAGE_RMAP(MEMTEXT_ADDR_LOCATION,8);
+ u64* p_addr=(u64*)VIRT(MEMTEXT_ADDR_LOCATION);
*p_addr=(u64)memtext_buffer;
// Cleaning buffer
diff --git a/src/drivers/memtext.hpp b/src/drivers/memtext.hpp
index 18b3014..c61c93d 100644
--- a/src/drivers/memtext.hpp
+++ b/src/drivers/memtext.hpp
@@ -2,7 +2,7 @@
#include "boucane.hpp"
-#define MEMTEXT_BUFFER_SIZE 1024
+#define MEMTEXT_BUFFER_SIZE 4096
#define MEMTEXT_ADDR_LOCATION 0x0
diff --git a/src/drivers/psftext.cc b/src/drivers/psftext.cc
index da7e8c9..1df4dd3 100644
--- a/src/drivers/psftext.cc
+++ b/src/drivers/psftext.cc
@@ -30,8 +30,10 @@ void psftext_putchar(char c){
if(c=='\n'){
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--;
+ }
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){