From c9a1266d219a83882735a3a8304f3824e0219cdb Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Mon, 15 Jan 2024 15:44:20 -0500 Subject: redo application paging and system calls, rename mercury to hilbert --- kernel/framebuffer.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 6 deletions(-) (limited to 'kernel/framebuffer.cpp') diff --git a/kernel/framebuffer.cpp b/kernel/framebuffer.cpp index a115e0b..dbd735f 100644 --- a/kernel/framebuffer.cpp +++ b/kernel/framebuffer.cpp @@ -1,20 +1,60 @@ -#include +#include +#include +#include -namespace mercury::kernel::framebuffer { +namespace hilbert::kernel::framebuffer { - uint32_t *vaddr; + static uint64_t paddr; + static uint32_t *vaddr; int width; int height; - int dword_pitch; + static int dword_pitch; - void init_framebuffer( - uint64_t vaddr, uint64_t width, uint64_t height, uint64_t pitch + void encode_color_syscall( + uint64_t &rax, uint64_t &rdi, uint64_t &rsi, uint64_t &rdx ) { + rax = (uint64_t)encode_color( + rdi & 0xff, (rdi >> 8) & 0xff, (rdi >> 16) & 0xff); + rdi = 0; + rsi = 0; + rdx = 0; + } + + void get_framebuffer_syscall( + uint64_t &rax, uint64_t &rdi, uint64_t &rsi, uint64_t &rdx + ) { + + auto *app = application::running_app; + if (app->framebuffer_vaddr == 0) { + uint64_t pages_needed = (dword_pitch * height * 4 - 1) / 4096 + 1; + uint64_t vaddr = app->get_free_vaddr_pages(pages_needed); + for (uint64_t i = 0; i < pages_needed; ++i) + app->map_page(vaddr + i * 4096, paddr + i * 4096, true, false, false); + app->framebuffer_vaddr = vaddr; + } + + rax = app->framebuffer_vaddr; + rdi = (uint64_t)(uint32_t)width | ((uint64_t)(uint32_t)height << 32); + rsi = (uint32_t)dword_pitch; + rdx = 0; + + } + + void init_framebuffer(uint64_t paddr, uint64_t vaddr, + uint64_t width, uint64_t height, uint64_t pitch + ) { + //TODO: assumes 32-bpp rgb + + framebuffer::paddr = paddr; framebuffer::vaddr = (uint32_t *)vaddr; framebuffer::width = width; framebuffer::height = height; dword_pitch = pitch / 4; + + syscall::add_syscall(0, &encode_color_syscall); + syscall::add_syscall(1, &get_framebuffer_syscall); + } color encode_color(uint8_t r, uint8_t g, uint8_t b) { -- cgit v1.2.3