[vm] when marking boot physical pages used, make sure the address range is inclusive

This commit is contained in:
Travis Geiselbrecht
2014-08-14 13:18:26 -07:00
parent ca20aac213
commit e72c8bfede
2 changed files with 20 additions and 8 deletions

View File

@@ -319,13 +319,25 @@ retry:
return 0;
}
static void dump_arena(const pmm_arena_t *arena)
static void dump_page(const vm_page_t *page)
{
printf("page %p: address 0x%lx flags 0x%x\n", page, page_to_address(page), page->flags);
}
static void dump_arena(const pmm_arena_t *arena, bool dump_pages)
{
printf("arena %p: name '%s' base 0x%lx size 0x%x priority %u flags 0x%x\n",
arena, arena->name, arena->base, arena->size, arena->priority, arena->flags);
printf("\tpage_array %p, free_count %zu\n",
arena->page_array, arena->free_count);
/* dump all of the pages */
if (dump_pages) {
for (size_t i = 0; i < arena->size / PAGE_SIZE; i++) {
dump_page(&arena->page_array[i]);
}
}
/* dump the free pages */
printf("\tfree ranges:\n");
ssize_t last = -1;
@@ -347,11 +359,6 @@ static void dump_arena(const pmm_arena_t *arena)
}
}
static void dump_page(const vm_page_t *page)
{
printf("page %p: address 0x%lx flags 0x%x\n", page, page_to_address(page), page->flags);
}
static int cmd_pmm(int argc, const cmd_args *argv)
{
if (argc < 2) {
@@ -374,7 +381,7 @@ usage:
if (!strcmp(argv[1].str, "arenas")) {
pmm_arena_t *a;
list_for_every_entry(&arena_list, a, pmm_arena_t, node) {
dump_arena(a);
dump_arena(a, false);
}
} else if (!strcmp(argv[1].str, "alloc")) {
if (argc < 3) goto notenoughargs;

View File

@@ -44,6 +44,12 @@ static void mark_pages_in_use(vaddr_t va, size_t len)
struct list_node list;
list_initialize(&list);
/* make sure we are inclusive of all of the pages in the address range */
len = PAGE_ALIGN(len + (va & (PAGE_SIZE - 1)));
va = ROUNDDOWN(va, PAGE_SIZE);
LTRACEF("aligned va 0x%lx, len 0x%zx\n", va, len);
for (size_t offset = 0; offset < len; offset += PAGE_SIZE) {
uint flags;
paddr_t pa;
@@ -70,7 +76,6 @@ static void vm_init_preheap(uint level)
if (boot_alloc_end != boot_alloc_start) {
LTRACEF("marking boot alloc used from 0x%lx to 0x%lx\n", boot_alloc_start, boot_alloc_end);
// XXX handle last partial page?
mark_pages_in_use(boot_alloc_start, boot_alloc_end - boot_alloc_start);
}
}