Lines Matching +full:merge +full:- +full:base
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
50 uint64_t base; member
58 e820_element_alloc(uint64_t base, uint64_t end, enum e820_memory_type type) in e820_element_alloc() argument
67 element->base = base; in e820_element_alloc()
68 element->end = end; in e820_element_alloc()
69 element->type = type; in e820_element_alloc()
102 element->base, element->end, in e820_dump_table()
103 e820_get_type_name(element->type)); in e820_dump_table()
131 fwcfg_item->size = count * sizeof(struct e820_entry); in e820_get_fwcfg_item()
132 fwcfg_item->data = calloc(count, sizeof(struct e820_entry)); in e820_get_fwcfg_item()
133 if (fwcfg_item->data == NULL) { in e820_get_fwcfg_item()
139 entries = (struct e820_entry *)fwcfg_item->data; in e820_get_fwcfg_item()
143 entry->base = element->base; in e820_get_fwcfg_item()
144 entry->length = element->end - element->base; in e820_get_fwcfg_item()
145 entry->type = element->type; in e820_get_fwcfg_item()
154 e820_add_entry(const uint64_t base, const uint64_t end, in e820_add_entry() argument
162 assert(end >= base); in e820_add_entry()
164 new_element = e820_element_alloc(base, end, type); in e820_add_entry()
171 * search for a range whose end is larger than the base parameter. in e820_add_entry()
174 if (element->end > base) { in e820_add_entry()
184 * base is larger than of any existing element. Add new system in e820_add_entry()
195 assert(end >= element->base); in e820_add_entry()
206 * tries to allocate another address. This is true for the GVT-d emulation in e820_add_entry()
210 if (element == NULL || element->type != E820_TYPE_MEMORY || in e820_add_entry()
211 (base < element->base || end > element->end)) in e820_add_entry()
214 if (base == element->base && end == element->end) { in e820_add_entry()
219 * [ 0x1000, 0x4000] RAM <-- element in e820_add_entry()
226 } else if (base == element->base) { in e820_add_entry()
228 * New element at system memory base boundary. Add new in e820_add_entry()
229 * element before current and adjust the base of the old in e820_add_entry()
233 * [ 0x1000, 0x4000] RAM <-- element in e820_add_entry()
236 * [ 0x2000, 0x4000] RAM <-- element in e820_add_entry()
239 element->base = end; in e820_add_entry()
240 } else if (end == element->end) { in e820_add_entry()
247 * [ 0x1000, 0x4000] RAM <-- element in e820_add_entry()
249 * [ 0x1000, 0x3000] RAM <-- element in e820_add_entry()
253 element->end = base; in e820_add_entry()
261 * [ 0x1000, 0x4000] RAM <-- element in e820_add_entry()
265 * [ 0x3000, 0x4000] RAM <-- element in e820_add_entry()
267 ram_element = e820_element_alloc(element->base, base, in e820_add_entry()
274 element->base = end; in e820_add_entry()
278 * If the previous element has the same type and ends at our base in e820_add_entry()
279 * boundary, we can merge both entries. in e820_add_entry()
283 sib_element->type == new_element->type && in e820_add_entry()
284 sib_element->end == new_element->base) { in e820_add_entry()
285 new_element->base = sib_element->base; in e820_add_entry()
292 * boundary, we can merge both entries. in e820_add_entry()
296 sib_element->type == new_element->type && in e820_add_entry()
297 sib_element->base == new_element->end) { in e820_add_entry()
298 /* Merge new element into subsequent one. */ in e820_add_entry()
299 new_element->end = sib_element->end; in e820_add_entry()
308 e820_add_memory_hole(const uint64_t base, const uint64_t end) in e820_add_memory_hole() argument
313 assert(end >= base); in e820_add_memory_hole()
317 * search for an element which end is larger than the base parameter. in e820_add_memory_hole()
320 if (element->end > base) { in e820_add_memory_hole()
325 if (element == NULL || end <= element->base) { in e820_add_memory_hole()
331 assert(element->type == E820_TYPE_MEMORY); in e820_add_memory_hole()
333 if (base == element->base) { in e820_add_memory_hole()
335 * New hole at system memory base boundary. in e820_add_memory_hole()
342 element->base = end; in e820_add_memory_hole()
343 } else if (end == element->end) { in e820_add_memory_hole()
352 element->end = base; in e820_add_memory_hole()
358 * [ 0x1000, 0x4000] RAM <-- element in e820_add_memory_hole()
361 * [ 0x3000, 0x4000] RAM <-- element in e820_add_memory_hole()
363 ram_element = e820_element_alloc(element->base, base, in e820_add_memory_hole()
369 element->base = end; in e820_add_memory_hole()
382 uint64_t address, base, end; in e820_alloc_highest() local
384 end = MIN(max_address, element->end); in e820_alloc_highest()
385 base = roundup2(element->base, alignment); in e820_alloc_highest()
388 * If end - length == 0, we would allocate memory at address 0. This in e820_alloc_highest()
392 if (element->type != E820_TYPE_MEMORY || end < base || in e820_alloc_highest()
393 end - base < length || end - length == 0) { in e820_alloc_highest()
397 address = rounddown2(end - length, alignment); in e820_alloc_highest()
416 uint64_t base, end; in e820_alloc_lowest() local
418 end = element->end; in e820_alloc_lowest()
419 base = MAX(min_address, roundup2(element->base, alignment)); in e820_alloc_lowest()
422 * If base == 0, we would allocate memory at address 0. This in e820_alloc_lowest()
426 if (element->type != E820_TYPE_MEMORY || end < base || in e820_alloc_lowest()
427 end - base < length || base == 0) { in e820_alloc_lowest()
431 if (e820_add_entry(base, base + length, type) != 0) { in e820_alloc_lowest()
435 return (base); in e820_alloc_lowest()
447 assert((address & (alignment - 1)) == 0); in e820_alloc()
523 e820_fwcfg_item->size, e820_fwcfg_item->data); in e820_finalize()
526 free(e820_fwcfg_item->data); in e820_finalize()