From b3861decc3ed1d8e2b339659fc5393111e868c3f Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Thu, 4 Feb 2021 19:52:59 -0800 Subject: [PATCH] [kernel] Pass the fb phys addr to userspace Instead of always mapping the framebuffer at an arbitrary location, and so reporting that to userspace, send the physical address so drivers can call system_map_mmio(). --- src/include/j6/init.h | 2 +- src/kernel/main.cpp | 9 ++++++-- src/kernel/memory_bootstrap.cpp | 41 ++++++++++++++++++--------------- src/kernel/scheduler.cpp | 2 -- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/include/j6/init.h b/src/include/j6/init.h index b0dcfcd..1729bd3 100644 --- a/src/include/j6/init.h +++ b/src/include/j6/init.h @@ -28,7 +28,7 @@ struct j6_init_value { /// `flags` has the following bits: /// 0-3: Pixel layout. 0000: rgb8, 0001: bgr8 struct j6_init_framebuffer { - void* addr; + uintptr_t addr; size_t size; uint32_t vertical; uint32_t horizontal; diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 2347afe..1bc4285 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -85,8 +85,13 @@ kernel_main(args::header *header) fb = memory::to_virtual(reinterpret_cast(&header->video)); const args::framebuffer &video = header->video; - log::debug(logs::boot, "Framebuffer: %dx%d[%d] type %s @ %016llx", - video.horizontal, video.vertical, video.scanline, video.type, video.phys_addr); + log::debug(logs::boot, "Framebuffer: %dx%d[%d] type %d @ %llx size %llx", + video.horizontal, + video.vertical, + video.scanline, + video.type, + video.phys_addr, + video.size); logger_clear_immediate(); } diff --git a/src/kernel/memory_bootstrap.cpp b/src/kernel/memory_bootstrap.cpp index 78d7f6d..5668dc8 100644 --- a/src/kernel/memory_bootstrap.cpp +++ b/src/kernel/memory_bootstrap.cpp @@ -254,21 +254,31 @@ initialize_main_user_stack() char *message_arg = push(tcb->rsp3, sizeof(message)); kutil::memcpy(message_arg, message, sizeof(message)); - extern args::framebuffer *fb; - j6_init_framebuffer *fb_desc = push(tcb->rsp3); - fb_desc->addr = fb ? reinterpret_cast(0x100000000) : nullptr; - fb_desc->size = fb ? fb->size : 0; - fb_desc->vertical = fb ? fb->vertical : 0; - fb_desc->horizontal = fb ? fb->horizontal : 0; - fb_desc->scanline = fb ? fb->scanline : 0; - fb_desc->flags = 0; - - if (fb && fb->type == kernel::args::fb_type::bgr8) - fb_desc->flags |= 1; - + j6_init_value *initv = nullptr; unsigned n = 0; - j6_init_value *initv = push(tcb->rsp3); + extern args::framebuffer *fb; + if (fb) { + j6_init_framebuffer *fb_desc = push(tcb->rsp3); + kutil::memset(fb_desc, 0, sizeof(j6_init_framebuffer)); + + fb_desc->addr = fb->phys_addr; + fb_desc->size = fb->size; + fb_desc->vertical = fb->vertical; + fb_desc->horizontal = fb->horizontal; + fb_desc->scanline = fb->scanline; + + if (fb->type == kernel::args::fb_type::bgr8) + fb_desc->flags |= 1; + + initv = push(tcb->rsp3); + initv->type = j6_init_desc_framebuffer; + initv->data = fb_desc; + ++n; + } + + + initv = push(tcb->rsp3); initv->type = j6_init_handle_other; initv->handle.type = j6_object_type_system; initv->handle.handle = proc.add_handle(&system::get()); @@ -286,11 +296,6 @@ initialize_main_user_stack() initv->handle.handle = th.self_handle(); ++n; - initv = push(tcb->rsp3); - initv->type = j6_init_desc_framebuffer; - initv->data = fb_desc; - ++n; - uint64_t *initc = push(tcb->rsp3); *initc = n; diff --git a/src/kernel/scheduler.cpp b/src/kernel/scheduler.cpp index 3b09d39..fa015f2 100644 --- a/src/kernel/scheduler.cpp +++ b/src/kernel/scheduler.cpp @@ -28,8 +28,6 @@ scheduler *scheduler::s_instance = nullptr; -extern kernel::args::framebuffer *fb; - const uint64_t rflags_noint = 0x002; const uint64_t rflags_int = 0x202;