new: 初步完成了mmio地址空间自动分配(未测试)

bugfix: mmio虚拟地址分配的bug
This commit is contained in:
fslongjin
2022-08-20 01:05:15 +08:00
parent 05477932de
commit 0223232f3f
14 changed files with 317 additions and 56 deletions

View File

@ -45,16 +45,6 @@ static __always_inline struct __mmio_buddy_addr_region *__mmio_buddy_create_regi
return region;
}
/**
* @brief 释放address region结构体
*
* @param region 待释放的结构体
*/
static __always_inline void __release_addr_region(struct __mmio_buddy_addr_region *region)
{
kfree(region);
}
/**
* @brief 将给定大小为(2^exp)的地址空间一分为二,并插入下一级的链表中
*
@ -84,9 +74,10 @@ static __always_inline int __buddy_merge_blocks(struct __mmio_buddy_addr_region
return -EINVAL;
// === 是一对伙伴,将他们合并
// __mmio_pool.free_regions[__exp2index(exp)].num_free -=2;
// 减少计数的工作应在该函数外完成
// 释放y
__release_addr_region(y);
__mmio_buddy_release_addr_region(y);
// 插入x
__buddy_add_region_obj(__exp2index(exp + 1), x);
@ -101,7 +92,7 @@ static __always_inline int __buddy_merge_blocks(struct __mmio_buddy_addr_region
*/
static __always_inline struct __mmio_buddy_addr_region *__buddy_pop_region(int exp)
{
if (unlikely(&__mmio_pool.free_regions[__exp2index(exp)].list_head))
if (unlikely(list_empty(&__mmio_pool.free_regions[__exp2index(exp)].list_head)))
return NULL;
struct __mmio_buddy_addr_region *r = container_of(list_next(&__mmio_pool.free_regions[__exp2index(exp)].list_head), struct __mmio_buddy_addr_region, list);
list_del(&r->list);
@ -176,7 +167,7 @@ static void __buddy_merge(int exp)
* @param exp 内存区域的大小(2^exp)
* @return struct __mmio_buddy_addr_region* 符合要求的内存区域。没有满足要求的时候返回NULL
*/
static struct __mmio_buddy_addr_region *__buddy_query_addr_region(int exp)
struct __mmio_buddy_addr_region *mmio_buddy_query_addr_region(int exp)
{
if (exp >= MMIO_BUDDY_MAX_EXP)
return NULL;
@ -223,7 +214,7 @@ has_block:; // 有可用的内存块,分配
* @param exp 内存空间的大小2^exp
* @return int 返回码
*/
static __always_inline int __buddy_give_back(uint64_t vaddr, int exp)
int __mmio_buddy_give_back(uint64_t vaddr, int exp)
{
// 确保内存对齐低位都要为0
if (vaddr & ((1UL << exp) - 1))
@ -255,6 +246,5 @@ void mmio_buddy_init()
uint32_t cnt_1g_blocks = (MMIO_TOP - MMIO_BASE) / PAGE_1G_SIZE;
uint64_t vaddr_base = MMIO_BASE;
for (uint32_t i = 0; i < cnt_1g_blocks; ++i, vaddr_base += PAGE_1G_SIZE)
__buddy_give_back(vaddr_base, PAGE_1G_SHIFT);
__mmio_buddy_give_back(vaddr_base, PAGE_1G_SHIFT);
}