diff options
author | Andrew Waterman <andrew@sifive.com> | 2021-05-18 00:57:48 -0700 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2021-05-18 00:57:48 -0700 |
commit | e8e6b3aaee44d43b48164fbd377864c3a682dbd3 (patch) | |
tree | 8fc20215b1a778e7af967211576238219df3fca3 /pk/mmap.c | |
parent | c72467e151ac258ba1b8ed24ad8abea7151ffebf (diff) | |
download | pk-e8e6b3aaee44d43b48164fbd377864c3a682dbd3.zip pk-e8e6b3aaee44d43b48164fbd377864c3a682dbd3.tar.gz pk-e8e6b3aaee44d43b48164fbd377864c3a682dbd3.tar.bz2 |
Add __early_pgalloc_align; refactor __early_alloc to use it
Diffstat (limited to 'pk/mmap.c')
-rw-r--r-- | pk/mmap.c | 14 |
1 files changed, 11 insertions, 3 deletions
@@ -50,17 +50,25 @@ static uintptr_t free_page_addr(size_t idx) return first_free_page + idx * RISCV_PGSIZE; } -static uintptr_t __early_alloc(size_t size) +static uintptr_t __early_pgalloc_align(size_t num_pages, size_t align) { - size_t num_pages = ROUNDUP(size, RISCV_PGSIZE) / RISCV_PGSIZE; + size_t skip_pages = (align - 1) & -(free_page_addr(next_free_page) / RISCV_PGSIZE); + num_pages += skip_pages; + if (num_pages + next_free_page < num_pages || num_pages + next_free_page > free_pages) return 0; - uintptr_t addr = free_page_addr(next_free_page); + uintptr_t addr = free_page_addr(next_free_page + skip_pages); next_free_page += num_pages; return addr; } +static uintptr_t __early_alloc(size_t size) +{ + size_t num_pages = ROUNDUP(size, RISCV_PGSIZE) / RISCV_PGSIZE; + return __early_pgalloc_align(num_pages, 1); +} + static void __maybe_fuzz_page_freelist(); static void __page_freelist_insert(freelist_node_t node) |