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;