diff --git a/core/src/main.zig b/core/src/main.zig index d3a30ac..da2de2e 100644 --- a/core/src/main.zig +++ b/core/src/main.zig @@ -99,6 +99,11 @@ export fn _start(magic: u32, info: MultibootInfo) callconv(.C) noreturn { }; thread.arch.setStack(&init.regs, stack); + pmm.setGlobalAllocator(&allocator) catch |err| { + debug.print("Error while setting up global frame allocator: {}\n", .{err}); + while (true) {} + }; + platform.platformEndInit(); thread.enterTask(init); diff --git a/core/src/pmm.zig b/core/src/pmm.zig index 3a195b9..e605d0f 100644 --- a/core/src/pmm.zig +++ b/core/src/pmm.zig @@ -1,8 +1,10 @@ const std = @import("std"); const easyboot = @cImport(@cInclude("easyboot.h")); const platform = @import("arch/platform.zig").arch; +const vmm = @import("arch/vmm.zig").arch; const mmap = @import("mmap.zig"); const bmap = @import("lib/bitmap.zig"); +const locking = @import("lib/spinlock.zig"); const FrameAllocatorError = error{ InvalidMemoryMap, @@ -104,3 +106,28 @@ pub fn initializeFrameAllocator(tag: *easyboot.multiboot_tag_mmap_t) !FrameAlloc return allocator; } + +var lock: locking.SpinLock = .{}; +var global_allocator: *FrameAllocator = undefined; + +pub fn setGlobalAllocator(allocator: *FrameAllocator) !void { + const frame = try allocFrame(allocator); + const virt = frame.virtualAddress(vmm.PHYSICAL_MAPPING_BASE); + + global_allocator = @ptrFromInt(virt); + global_allocator.* = allocator.*; +} + +pub fn lockGlobalAllocator() *FrameAllocator { + lock.lock(); + return global_allocator; +} + +pub fn tryLockGlobalAllocator() ?*FrameAllocator { + if (!lock.tryLock()) return null; + return global_allocator; +} + +pub fn unlockGlobalAllocator() void { + lock.unlock(); +}