feature. See also
. The project being documented here (as the example) is the Zig library itself.
pool_allocator.UefiPoolAllocator
const UefiPoolAllocator = struct
File
Code
const UefiPoolAllocator = struct {
fn getHeader(ptr: [*]u8) *[*]align(8) u8 {
return @as(*[*]align(8) u8, @ptrFromInt(@intFromPtr(ptr) - @sizeOf(usize)));
}
fn alloc(
_: *anyopaque,
len: usize,
alignment: mem.Alignment,
ret_addr: usize,
) ?[*]u8 {
_ = ret_addr;
assert(len > 0);
const ptr_align = alignment.toByteUnits();
const metadata_len = mem.alignForward(usize, @sizeOf(usize), ptr_align);
const full_len = metadata_len + len;
const unaligned_slice = uefi.system_table.boot_services.?.allocatePool(
uefi.efi_pool_memory_type,
full_len,
) catch return null;
const unaligned_addr = @intFromPtr(unaligned_slice.ptr);
const aligned_addr = mem.alignForward(usize, unaligned_addr + @sizeOf(usize), ptr_align);
const aligned_ptr = unaligned_slice.ptr + (aligned_addr - unaligned_addr);
getHeader(aligned_ptr).* = unaligned_slice.ptr;
return aligned_ptr;
}
fn resize(
_: *anyopaque,
buf: []u8,
alignment: mem.Alignment,
new_len: usize,
ret_addr: usize,
) bool {
_ = ret_addr;
_ = alignment;
if (new_len > buf.len) return false;
return true;
}
fn remap(
_: *anyopaque,
buf: []u8,
alignment: mem.Alignment,
new_len: usize,
ret_addr: usize,
) ?[*]u8 {
_ = alignment;
_ = ret_addr;
if (new_len > buf.len) return null;
return buf.ptr;
}
fn free(
_: *anyopaque,
buf: []u8,
alignment: mem.Alignment,
ret_addr: usize,
) void {
_ = alignment;
_ = ret_addr;
uefi.system_table.boot_services.?.freePool(getHeader(buf.ptr).*) catch unreachable;
}
}