| ... | ... | @@ -12,68 +12,59 @@ const UefiPoolAllocator = struct { |
| 12 | 12 | return @intToPtr(*[*]align(8) u8, @ptrToInt(ptr) - @sizeOf(usize)); |
| 13 | 13 | } |
| 14 | 14 | |
| 15 | | fn alignedAlloc(len: usize, alignment: usize) ?[*]u8 { |
| 16 | | var unaligned_ptr: [*]align(8) u8 = undefined; |
| 17 | | |
| 18 | | if (uefi.system_table.boot_services.?.allocatePool(uefi.efi_pool_memory_type, len, &unaligned_ptr) != .Success) |
| 19 | | return null; |
| 20 | | |
| 21 | | const unaligned_addr = @ptrToInt(unaligned_ptr); |
| 22 | | const aligned_addr = mem.alignForward(unaligned_addr + @sizeOf(usize), alignment); |
| 23 | | |
| 24 | | var aligned_ptr = unaligned_ptr + (aligned_addr - unaligned_addr); |
| 25 | | getHeader(aligned_ptr).* = unaligned_ptr; |
| 26 | | |
| 27 | | return aligned_ptr; |
| 28 | | } |
| 29 | | |
| 30 | | fn alignedFree(ptr: [*]u8) void { |
| 31 | | _ = uefi.system_table.boot_services.?.freePool(getHeader(ptr).*); |
| 32 | | } |
| 33 | | |
| 34 | 15 | fn alloc( |
| 35 | 16 | _: *anyopaque, |
| 36 | 17 | len: usize, |
| 37 | | ptr_align: u29, |
| 38 | | len_align: u29, |
| 18 | log2_ptr_align: u8, |
| 39 | 19 | ret_addr: usize, |
| 40 | | ) Allocator.Error![]u8 { |
| 20 | ) ?[*]u8 { |
| 41 | 21 | _ = ret_addr; |
| 42 | 22 | |
| 43 | 23 | assert(len > 0); |
| 44 | | assert(std.math.isPowerOfTwo(ptr_align)); |
| 45 | 24 | |
| 46 | | var ptr = alignedAlloc(len, ptr_align) orelse return error.OutOfMemory; |
| 25 | const ptr_align = 1 << log2_ptr_align; |
| 26 | |
| 27 | const metadata_len = mem.alignForward(@sizeOf(usize), ptr_align); |
| 47 | 28 | |
| 48 | | if (len_align == 0) |
| 49 | | return ptr[0..len]; |
| 29 | const full_len = metadata_len + len; |
| 50 | 30 | |
| 51 | | return ptr[0..mem.alignBackwardAnyAlign(len, len_align)]; |
| 31 | var unaligned_ptr: [*]align(8) u8 = undefined; |
| 32 | if (uefi.system_table.boot_services.?.allocatePool(uefi.efi_pool_memory_type, full_len, &unaligned_ptr) != .Success) return null; |
| 33 | |
| 34 | const unaligned_addr = @ptrToInt(unaligned_ptr); |
| 35 | const aligned_addr = mem.alignForward(unaligned_addr + @sizeOf(usize), ptr_align); |
| 36 | |
| 37 | var aligned_ptr = unaligned_ptr + (aligned_addr - unaligned_addr); |
| 38 | getHeader(aligned_ptr).* = unaligned_ptr; |
| 39 | |
| 40 | return aligned_ptr; |
| 52 | 41 | } |
| 53 | 42 | |
| 54 | 43 | fn resize( |
| 55 | 44 | _: *anyopaque, |
| 56 | 45 | buf: []u8, |
| 57 | | buf_align: u29, |
| 46 | log2_old_ptr_align: u8, |
| 58 | 47 | new_len: usize, |
| 59 | | len_align: u29, |
| 60 | 48 | ret_addr: usize, |
| 61 | | ) ?usize { |
| 62 | | _ = buf_align; |
| 49 | ) bool { |
| 63 | 50 | _ = ret_addr; |
| 64 | 51 | |
| 65 | | return if (new_len <= buf.len) mem.alignAllocLen(buf.len, new_len, len_align) else null; |
| 52 | if (new_len > buf.len) return false; |
| 53 | |
| 54 | _ = mem.alignAllocLen(buf.len, new_len, log2_old_ptr_align); |
| 55 | |
| 56 | return true; |
| 66 | 57 | } |
| 67 | 58 | |
| 68 | 59 | fn free( |
| 69 | 60 | _: *anyopaque, |
| 70 | 61 | buf: []u8, |
| 71 | | buf_align: u29, |
| 62 | log2_old_ptr_align: u8, |
| 72 | 63 | ret_addr: usize, |
| 73 | 64 | ) void { |
| 74 | | _ = buf_align; |
| 65 | _ = log2_old_ptr_align; |
| 75 | 66 | _ = ret_addr; |
| 76 | | alignedFree(buf.ptr); |
| 67 | _ = uefi.system_table.boot_services.?.freePool(getHeader(buf.ptr).*); |
| 77 | 68 | } |
| 78 | 69 | }; |
| 79 | 70 | |
| ... | ... | @@ -105,49 +96,44 @@ const raw_pool_allocator_table = Allocator.VTable{ |
| 105 | 96 | fn uefi_alloc( |
| 106 | 97 | _: *anyopaque, |
| 107 | 98 | len: usize, |
| 108 | | ptr_align: u29, |
| 109 | | len_align: u29, |
| 99 | log2_ptr_align: u8, |
| 110 | 100 | ret_addr: usize, |
| 111 | | ) Allocator.Error![]u8 { |
| 112 | | _ = len_align; |
| 101 | ) ?[*]u8 { |
| 113 | 102 | _ = ret_addr; |
| 114 | 103 | |
| 115 | | std.debug.assert(ptr_align <= 8); |
| 104 | std.debug.assert(log2_ptr_align <= 3); |
| 116 | 105 | |
| 117 | 106 | var ptr: [*]align(8) u8 = undefined; |
| 107 | if (uefi.system_table.boot_services.?.allocatePool(uefi.efi_pool_memory_type, len, &ptr) != .Success) return null; |
| 118 | 108 | |
| 119 | | if (uefi.system_table.boot_services.?.allocatePool(uefi.efi_pool_memory_type, len, &ptr) != .Success) { |
| 120 | | return error.OutOfMemory; |
| 121 | | } |
| 122 | | |
| 123 | | return ptr[0..len]; |
| 109 | return ptr; |
| 124 | 110 | } |
| 125 | 111 | |
| 126 | 112 | fn uefi_resize( |
| 127 | 113 | _: *anyopaque, |
| 128 | 114 | buf: []u8, |
| 129 | | old_align: u29, |
| 115 | log2_old_ptr_align: u8, |
| 130 | 116 | new_len: usize, |
| 131 | | len_align: u29, |
| 132 | 117 | ret_addr: usize, |
| 133 | | ) ?usize { |
| 134 | | _ = old_align; |
| 118 | ) bool { |
| 135 | 119 | _ = ret_addr; |
| 136 | 120 | |
| 137 | | if (new_len <= buf.len) { |
| 138 | | return mem.alignAllocLen(buf.len, new_len, len_align); |
| 139 | | } |
| 121 | std.debug.assert(log2_old_ptr_align <= 3); |
| 122 | |
| 123 | if (new_len > buf.len) return false; |
| 124 | |
| 125 | _ = mem.alignAllocLen(buf.len, new_len, 8); |
| 140 | 126 | |
| 141 | | return null; |
| 127 | return true; |
| 142 | 128 | } |
| 143 | 129 | |
| 144 | 130 | fn uefi_free( |
| 145 | 131 | _: *anyopaque, |
| 146 | 132 | buf: []u8, |
| 147 | | buf_align: u29, |
| 133 | log2_old_ptr_align: u8, |
| 148 | 134 | ret_addr: usize, |
| 149 | 135 | ) void { |
| 150 | | _ = buf_align; |
| 136 | _ = log2_old_ptr_align; |
| 151 | 137 | _ = ret_addr; |
| 152 | 138 | _ = uefi.system_table.boot_services.?.freePool(@alignCast(8, buf.ptr)); |
| 153 | 139 | } |