memblock: add alignment parameter to alloc functions
This commit is contained in:
@@ -14,7 +14,7 @@ kern_status_t vm_bootstrap(const vm_zone_descriptor_t *zones, size_t nr_zones)
|
||||
int numa_count = 1;
|
||||
|
||||
/* we're only worrying about UMA systems for now */
|
||||
node_data = memblock_alloc(sizeof(vm_pg_data_t) * numa_count);
|
||||
node_data = memblock_alloc(sizeof(vm_pg_data_t) * numa_count, 8);
|
||||
|
||||
vm_page_init_array();
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
static memblock_region_t init_memory_regions[MEMBLOCK_INIT_MEMORY_REGION_COUNT];
|
||||
static memblock_region_t init_reserved_regions[MEMBLOCK_INIT_RESERVED_REGION_COUNT];
|
||||
|
||||
static phys_addr_t do_alloc(size_t size);
|
||||
static phys_addr_t do_alloc(size_t size, phys_addr_t align);
|
||||
|
||||
memblock_t memblock = {
|
||||
.memory.regions = init_memory_regions,
|
||||
@@ -59,7 +59,7 @@ static void memblock_double_capacity(memblock_type_t *type)
|
||||
{
|
||||
size_t new_max = type->max * 2;
|
||||
|
||||
phys_addr_t new_regions_p = do_alloc(new_max * sizeof(memblock_region_t));
|
||||
phys_addr_t new_regions_p = do_alloc(new_max * sizeof(memblock_region_t), 8);
|
||||
|
||||
void *new_regions = (void *)(new_regions_p + memblock.m_voffset);
|
||||
memcpy(new_regions, type->regions, type->count * sizeof(memblock_region_t));
|
||||
@@ -228,8 +228,13 @@ int memblock_reserve(uintptr_t base, size_t size)
|
||||
return memblock_add_range(&memblock.reserved, base, size, MEMBLOCK_RESERVED);
|
||||
}
|
||||
|
||||
static phys_addr_t do_alloc(size_t size)
|
||||
static phys_addr_t do_alloc(size_t size, phys_addr_t align)
|
||||
{
|
||||
if (!align) {
|
||||
/* align to 8-byte boundary by default */
|
||||
align = 0x8;
|
||||
}
|
||||
|
||||
phys_addr_t allocated_base = ADDR_MAX;
|
||||
|
||||
phys_addr_t region_start = memblock.m_alloc_start - memblock.m_voffset;
|
||||
@@ -237,9 +242,9 @@ static phys_addr_t do_alloc(size_t size)
|
||||
|
||||
memblock_iter_t it;
|
||||
for_each_free_mem_range (&it, region_start, region_end) {
|
||||
if (it.it_base & 0xF) {
|
||||
it.it_base &= ~0xF;
|
||||
it.it_base += 0x10;
|
||||
if (it.it_base & (align - 1)) {
|
||||
it.it_base &= ~(align - 1);
|
||||
it.it_base += align;
|
||||
}
|
||||
|
||||
size_t region_size = it.it_limit - it.it_base + 1;
|
||||
@@ -261,13 +266,13 @@ static phys_addr_t do_alloc(size_t size)
|
||||
return allocated_base;
|
||||
}
|
||||
|
||||
void *memblock_alloc(size_t size)
|
||||
void *memblock_alloc(size_t size, phys_addr_t align)
|
||||
{
|
||||
if (memblock.reserved.count >= memblock.reserved.max - 2) {
|
||||
memblock_double_capacity(&memblock.reserved);
|
||||
}
|
||||
|
||||
phys_addr_t p = do_alloc(size);
|
||||
phys_addr_t p = do_alloc(size, align);
|
||||
if (p) {
|
||||
p += memblock.m_voffset;
|
||||
}
|
||||
@@ -275,13 +280,13 @@ void *memblock_alloc(size_t size)
|
||||
return (void *)p;
|
||||
}
|
||||
|
||||
phys_addr_t memblock_alloc_phys(size_t size)
|
||||
phys_addr_t memblock_alloc_phys(size_t size, phys_addr_t align)
|
||||
{
|
||||
if (memblock.reserved.count >= memblock.reserved.max - 2) {
|
||||
memblock_double_capacity(&memblock.reserved);
|
||||
}
|
||||
|
||||
return do_alloc(size);
|
||||
return do_alloc(size, align);
|
||||
}
|
||||
|
||||
int memblock_free(void *p, size_t size)
|
||||
|
||||
Reference in New Issue
Block a user