mirror of
https://github.com/rdmsr/zag.git
synced 2026-10-27 13:58:20 +00:00
102 lines
3.5 KiB
Zig
102 lines
3.5 KiB
Zig
const b = @import("root");
|
|
const ksyms = @import("ksyms");
|
|
const limine = @import("limine.zig");
|
|
|
|
const pl = b.pl;
|
|
const ke = b.ke;
|
|
const ki = ke.private;
|
|
|
|
pub const std_options = b.std_options;
|
|
pub const panic = b.panic;
|
|
|
|
const std = @import("std");
|
|
|
|
var boot_info: pl.BootInfo = undefined;
|
|
|
|
pub export var limine_base_revision: [3]u64 linksection(".limine_requests") = limine.base_revision(6);
|
|
|
|
pub export var framebuffer_request: limine.FramebufferRequest linksection(".limine_requests") = .{
|
|
.id = limine.framebuffer_request_id,
|
|
.revision = 0,
|
|
.response = null,
|
|
};
|
|
|
|
pub export var limine_requests_start_marker: [4]u64 linksection(".limine_requests_start") = limine.requests_start_marker;
|
|
pub export var limine_requests_end_marker: [2]u64 linksection(".limine_requests_end") = limine.requests_end_marker;
|
|
|
|
pub export var memmap_request: limine.MemmapRequest linksection(".limine_requests") = .{
|
|
.id = limine.memmap_request_id,
|
|
.revision = 0,
|
|
.response = null,
|
|
};
|
|
|
|
pub export var rsdp_request: limine.RsdpRequest linksection(".limine_requests") = .{
|
|
.id = limine.rsdp_request_id,
|
|
.revision = 0,
|
|
.response = null,
|
|
};
|
|
|
|
pub export var cmdline_request: limine.CmdlineRequest linksection(".limine_requests") = .{
|
|
.id = limine.cmdline_request_id,
|
|
.revision = 0,
|
|
.response = null,
|
|
};
|
|
|
|
pub export var kernel_address_request: limine.ExecutableAddressRequest linksection(".limine_requests") = .{
|
|
.id = limine.executable_address_request_id,
|
|
.revision = 0,
|
|
.response = null,
|
|
};
|
|
|
|
fn build_memory_map() void {
|
|
const memmap_response = memmap_request.response orelse {
|
|
@panic("Limine memmap request failed");
|
|
};
|
|
|
|
boot_info.memory_map.entry_count = memmap_response.entry_count;
|
|
const entries = memmap_response.entries orelse {
|
|
@panic("Limine memmap response has no entries");
|
|
};
|
|
|
|
for (0..memmap_response.entry_count) |i| {
|
|
const entry = entries[i];
|
|
boot_info.memory_map.entries[i] = .{
|
|
.base = entry.base,
|
|
.size = entry.length,
|
|
.type = switch (entry.type) {
|
|
.Usable => pl.BootInfo.MemMap.Entry.Type.Free,
|
|
.AcpiReclaimable => pl.BootInfo.MemMap.Entry.Type.AcpiReclaimable,
|
|
.AcpiNvs => pl.BootInfo.MemMap.Entry.Type.AcpiNvs,
|
|
.BootloaderReclaimable => pl.BootInfo.MemMap.Entry.Type.LoaderReclaimable,
|
|
.KernelAndModules => pl.BootInfo.MemMap.Entry.Type.Kernel,
|
|
else => pl.BootInfo.MemMap.Entry.Type.Reserved,
|
|
},
|
|
};
|
|
}
|
|
}
|
|
|
|
export fn kmain() callconv(.c) void {
|
|
boot_info.cmdline = if (cmdline_request.response) |cmdline_response| std.mem.span(cmdline_response.cmdline) else null;
|
|
|
|
boot_info.rsdp = if (rsdp_request.response) |rsdp_response| @intFromPtr(rsdp_response.rsdp) else null;
|
|
|
|
boot_info.kernel_address = if (kernel_address_request.response) |ka_response| .{
|
|
.physical_base = ka_response.physical_base,
|
|
.virtual_base = ka_response.virtual_base,
|
|
} else .{ .physical_base = 0, .virtual_base = 0 };
|
|
|
|
boot_info.framebuffer = if (framebuffer_request.response) |fb_response| .{
|
|
.address = @intFromPtr(fb_response.framebuffers[0].address),
|
|
.width = @intCast(fb_response.framebuffers[0].width),
|
|
.height = @intCast(fb_response.framebuffers[0].height),
|
|
.pitch = @intCast(fb_response.framebuffers[0].pitch),
|
|
.bpp = @intCast(fb_response.framebuffers[0].bpp),
|
|
} else null;
|
|
|
|
build_memory_map();
|
|
|
|
ke.ncpus = 1;
|
|
|
|
ki.init(&boot_info);
|
|
}
|