diff --git a/lib/mammoth/src/init.cpp b/lib/mammoth/src/init.cpp index 66ca38a..3417a54 100644 --- a/lib/mammoth/src/init.cpp +++ b/lib/mammoth/src/init.cpp @@ -14,6 +14,7 @@ uint64_t gInitEndpointCap = 0; uint64_t gBootDenaliVmmoCap = 0; uint64_t gBootVictoriaFallsVmmoCap = 0; uint64_t gBootPciVmmoCap = 0; +uint64_t gBootFramebufferVmmoCap = 0; z_err_t ParseInitPort(uint64_t init_port_cap) { PortServer port = PortServer::AdoptCap(init_port_cap); @@ -40,6 +41,8 @@ z_err_t ParseInitPort(uint64_t init_port_cap) { case Z_BOOT_PCI_VMMO: gBootPciVmmoCap = init_cap; break; + case Z_BOOT_FRAMEBUFFER_INFO_VMMO: + gBootFramebufferVmmoCap = init_cap; default: dbgln("Unexpected init type {}, continuing.", init_sig); } diff --git a/sys/yellowstone/yellowstone.cpp b/sys/yellowstone/yellowstone.cpp index 05284b5..92ce448 100644 --- a/sys/yellowstone/yellowstone.cpp +++ b/sys/yellowstone/yellowstone.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "hw/gpt.h" #include "hw/pcie.h" @@ -48,6 +49,13 @@ uint64_t main(uint64_t port_cap) { dbgln("Test: '{}'", file.cstr()); + MappedMemoryRegion region = + MappedMemoryRegion::FromCapability(gBootFramebufferVmmoCap); + + ZFramebufferInfo* fb = reinterpret_cast(region.vaddr()); + + dbgln("FB Addr: {x}", fb->address_phys); + check(server_thread.Join()); dbgln("Yellowstone Finished Successfully."); return 0; diff --git a/zion/boot/boot_info.cpp b/zion/boot/boot_info.cpp index 04bfbac..cc95502 100644 --- a/zion/boot/boot_info.cpp +++ b/zion/boot/boot_info.cpp @@ -47,4 +47,19 @@ void* GetRsdpAddr() { return gRsdpRequest.response->address; } +static volatile struct limine_framebuffer_request gFramebufferRequest { + .id = LIMINE_FRAMEBUFFER_REQUEST, .revision = 0, .response = 0, +}; + +const limine_framebuffer& GetFramebuffer() { + if (!gFramebufferRequest.response) { + panic("No framebuffer response from limine"); + } + if (gFramebufferRequest.response->framebuffer_count < 1) { + panic("No framebuffers in response from limine."); + } + + return *gFramebufferRequest.response->framebuffers[0]; +} + } // namespace boot diff --git a/zion/boot/boot_info.h b/zion/boot/boot_info.h index 814b79a..12bd2c8 100644 --- a/zion/boot/boot_info.h +++ b/zion/boot/boot_info.h @@ -11,4 +11,6 @@ const limine_module_response& GetModules(); void* GetRsdpAddr(); +const limine_framebuffer& GetFramebuffer(); + } // namespace boot diff --git a/zion/include/zglobal.h b/zion/include/zglobal.h index d7b2f61..d5168df 100644 --- a/zion/include/zglobal.h +++ b/zion/include/zglobal.h @@ -10,3 +10,4 @@ extern uint64_t gInitEndpointCap; extern uint64_t gBootDenaliVmmoCap; extern uint64_t gBootVictoriaFallsVmmoCap; extern uint64_t gBootPciVmmoCap; +extern uint64_t gBootFramebufferVmmoCap; diff --git a/zion/include/ztypes.h b/zion/include/ztypes.h index a6eda52..c5970b5 100644 --- a/zion/include/ztypes.h +++ b/zion/include/ztypes.h @@ -109,3 +109,19 @@ const z_perm_t kZionPerm_All = -1; #define Z_BOOT_DENALI_VMMO 0x4200'0000 #define Z_BOOT_VICTORIA_FALLS_VMMO 0x4200'0001 #define Z_BOOT_PCI_VMMO 0x4200'0002 +#define Z_BOOT_FRAMEBUFFER_INFO_VMMO 0x4200'0003 + +struct ZFramebufferInfo { + uint64_t address_phys; + uint64_t width; + uint64_t height; + uint64_t pitch; + uint16_t bpp; + uint8_t memory_model; + uint8_t red_mask_size; + uint8_t red_mask_shift; + uint8_t green_mask_size; + uint8_t green_mask_shift; + uint8_t blue_mask_size; + uint8_t blue_mask_shift; +}; diff --git a/zion/loader/init_loader.cpp b/zion/loader/init_loader.cpp index d22c29c..9ff695f 100644 --- a/zion/loader/init_loader.cpp +++ b/zion/loader/init_loader.cpp @@ -137,6 +137,30 @@ glcr::ErrorCode WritePciVmmo(glcr::RefPtr port, uint64_t id) { return glcr::OK; } +void WriteFramebufferVmmo(glcr::RefPtr port) { + const limine_framebuffer& buf = boot::GetFramebuffer(); + ZFramebufferInfo ubuf{ + .address_phys = reinterpret_cast(buf.address) - + boot::GetHigherHalfDirectMap(), + .width = buf.width, + .height = buf.height, + .pitch = buf.pitch, + .bpp = buf.bpp, + .memory_model = buf.memory_model, + .red_mask_size = buf.red_mask_size, + .red_mask_shift = buf.red_mask_shift, + .green_mask_size = buf.green_mask_size, + .green_mask_shift = buf.green_mask_shift, + .blue_mask_size = buf.blue_mask_size, + .blue_mask_shift = buf.blue_mask_shift, + }; + glcr::RefPtr ubuf_vmmo = + glcr::MakeRefCounted(sizeof(ubuf)); + ubuf_vmmo->CopyBytesToObject(reinterpret_cast(&ubuf), sizeof(ubuf)); + port->WriteKernel(Z_BOOT_FRAMEBUFFER_INFO_VMMO, + MakeRefCounted(ubuf_vmmo)); +} + } // namespace void LoadInitProgram() { @@ -154,6 +178,8 @@ void LoadInitProgram() { WriteInitProgram(port, "/sys/denali", Z_BOOT_DENALI_VMMO); WriteInitProgram(port, "/sys/victoriafalls", Z_BOOT_VICTORIA_FALLS_VMMO); + WriteFramebufferVmmo(port); + if (WritePciVmmo(port, Z_BOOT_PCI_VMMO) != glcr::OK) { panic("Failed to provide PCI info to init."); }