From a3f376c1d6e40893f9b4b3286641d513c88a7e34 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 24 Aug 2025 10:33:24 -0300 Subject: [PATCH] fb: map as WC --- kernel-src/include/kernel/term.h | 1 + kernel-src/include/x86-64/arch/mmu.h | 1 + kernel-src/io/fb.c | 6 ++++++ kernel-src/io/term.c | 6 +++++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/kernel-src/include/kernel/term.h b/kernel-src/include/kernel/term.h index 06cbd1ca..3d607b18 100644 --- a/kernel-src/include/kernel/term.h +++ b/kernel-src/include/kernel/term.h @@ -2,6 +2,7 @@ #define _TERM_H void term_init(); +void term_update_framebuffer(void *fb); void term_putchar(char c); void term_write(char *str, size_t count); void term_getsize(size_t *x, size_t *y, size_t *fbx, size_t *fby); diff --git a/kernel-src/include/x86-64/arch/mmu.h b/kernel-src/include/x86-64/arch/mmu.h index ff266a27..7243bca2 100644 --- a/kernel-src/include/x86-64/arch/mmu.h +++ b/kernel-src/include/x86-64/arch/mmu.h @@ -21,6 +21,7 @@ #define ARCH_MMU_FLAGS_WB 0 #define ARCH_MMU_FLAGS_WT (1 << 3) #define ARCH_MMU_FLAGS_UC (1 << 4) +#define ARCH_MMU_FLAGS_WC ((1 << 12) | (1 << 3)) // PAT5 (limine sets up the 5th PAT entry as WC) #define ARCH_MMU_REQUIRED_FLAGS ARCH_MMU_FLAGS_READ diff --git a/kernel-src/io/fb.c b/kernel-src/io/fb.c index 7f96be0e..0a408ee3 100644 --- a/kernel-src/io/fb.c +++ b/kernel-src/io/fb.c @@ -7,6 +7,7 @@ #include #include #include +#include #include typedef struct bitfield_t { @@ -256,6 +257,11 @@ void fb_init() { printf("%s: %dx%d %d bpp\n", name, fb->width, fb->height, fb->bpp); } + + + void *fb_map = vmm_map(NULL, fbs[0]->pitch * fbs[0]->height, VMM_FLAGS_PHYSICAL, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC | ARCH_MMU_FLAGS_WC, FROM_HHDM(fbs[0]->address)); + __assert(fb_map); + term_update_framebuffer(fb_map); } INIT_ROUTINE_DEFINE(fb, INIT_ROUTINE_FLAGS_NONE, fb_init, devfs); diff --git a/kernel-src/io/term.c b/kernel-src/io/term.c index 8a32ab41..c1186375 100644 --- a/kernel-src/io/term.c +++ b/kernel-src/io/term.c @@ -71,4 +71,8 @@ void term_init() { logging_sethook(term_putchar); } -INIT_ROUTINE_DEFINE(term, INIT_ROUTINE_FLAGS_NONE, term_init, pmm); +void term_update_framebuffer(void *fb) { + ((struct flanterm_fb_context *)fb)->framebuffer = fb; +} + +INIT_ROUTINE_DEFINE(term, INIT_ROUTINE_FLAGS_NONE, term_init, vmm);