From d5b8902d8f5467f1b3dea6c905fd52606a6ead4b Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Mon, 3 Sep 2018 15:15:19 -0700 Subject: [PATCH] Moving the rest (except ACPI tables) to high mem Also the debug messaging to verify it. --- src/boot/memory.c | 1 + src/kernel/main.cpp | 13 +++++++++++++ src/kernel/page_manager.cpp | 19 ++++++++++--------- src/kernel/page_manager.h | 10 ++++++---- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/boot/memory.c b/src/boot/memory.c index f48f241..eb1538e 100644 --- a/src/boot/memory.c +++ b/src/boot/memory.c @@ -191,6 +191,7 @@ memory_virtualize(EFI_RUNTIME_SERVICES *runsvc, struct memory_map *map) case KERNEL_FONT_MEMTYPE: case KERNEL_DATA_MEMTYPE: d->Attribute |= EFI_MEMORY_RUNTIME; + d->VirtualStart = d->PhysicalStart + KERNEL_VIRT_ADDRESS; default: if (d->Attribute & EFI_MEMORY_RUNTIME) { diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 58c07b0..ed99d38 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -85,6 +85,19 @@ kernel_main(popcorn_data *header) init_console(header); + log::debug(logs::boot, " Popcorn header is at: %016lx", header); + log::debug(logs::boot, " Framebuffer is at: %016lx", header->frame_buffer); + log::debug(logs::boot, " Font data is at: %016lx", header->font); + log::debug(logs::boot, " Kernel data is at: %016lx", header->data); + log::debug(logs::boot, " Memory map is at: %016lx", header->memory_map); + log::debug(logs::boot, "ACPI root table is at: %016lx", header->acpi_table); + log::debug(logs::boot, "Runtime service is at: %016lx", header->runtime); + + /* + pager->dump_pml4(nullptr, 0); + pager->dump_blocks(true); + */ + device_manager *devices = new (&device_manager::get()) device_manager(header->acpi_table); diff --git a/src/kernel/page_manager.cpp b/src/kernel/page_manager.cpp index d0f4ffb..968cc30 100644 --- a/src/kernel/page_manager.cpp +++ b/src/kernel/page_manager.cpp @@ -141,7 +141,7 @@ page_block::dump(page_block *list, const char *name, bool show_unmapped) if (cur->virtual_address) { page_table_indices start{cur->virtual_address}; - log::info(logs::memory, " %lx %x [%6d] %lx (%d,%d,%d,%d)", + log::info(logs::memory, " %016lx %08x [%6d] %016lx (%d,%d,%d,%d)", cur->physical_address, cur->flags, cur->count, @@ -149,7 +149,7 @@ page_block::dump(page_block *list, const char *name, bool show_unmapped) start[0], start[1], start[2], start[3]); } else { page_table_indices start{cur->virtual_address}; - log::info(logs::memory, " %lx %x [%6d]", + log::info(logs::memory, " %016lx %08x [%6d]", cur->physical_address, cur->flags, cur->count); @@ -276,18 +276,19 @@ page_manager::map_offset_pointer(void **pointer, size_t length) } void -page_manager::dump_blocks() +page_manager::dump_blocks(bool used_only) { page_block::dump(m_used, "used", true); - page_block::dump(m_free, "free", true); + if (!used_only) + page_block::dump(m_free, "free", true); } void -page_manager::dump_pml4(page_table *pml4) +page_manager::dump_pml4(page_table *pml4, int max_index) { if (pml4 == nullptr) pml4 = get_pml4(); - pml4->dump(); + pml4->dump(4, max_index); } page_block * @@ -623,7 +624,7 @@ page_manager::pop_pages(size_t count, addr_t *address) void -page_table::dump(int level, uint64_t offset) +page_table::dump(int level, int max_index, uint64_t offset) { console *cons = console::get(); @@ -650,13 +651,13 @@ page_table::dump(int level, uint64_t offset) } if (--level > 0) { - for (int i=0; i<512; ++i) { + for (int i=0; i<=max_index; ++i) { uint64_t ent = entries[i]; if ((ent & 0x1) == 0) continue; if ((ent & 0x80)) continue; page_table *next = reinterpret_cast((ent & ~0xffful) + offset); - next->dump(level, offset); + next->dump(level, 511, offset); } } } diff --git a/src/kernel/page_manager.h b/src/kernel/page_manager.h index b103fdd..e31b23c 100644 --- a/src/kernel/page_manager.h +++ b/src/kernel/page_manager.h @@ -101,11 +101,13 @@ public: } /// Log the current free/used block lists. - void dump_blocks(); + /// \arg used_only If true, skip printing free list. Default false. + void dump_blocks(bool used_only = false); /// Dump the given or current PML4 to the console - /// \arg pml4 The page table to use, null for the current one - void dump_pml4(page_table *pml4 = nullptr); + /// \arg pml4 The page table to use, null for the current one + /// \arg max_index The max index of pml4 to print + void dump_pml4(page_table *pml4 = nullptr, int max_index = 511); /// Get the system page manager. /// \returns A pointer to the system page manager @@ -303,7 +305,7 @@ struct page_table entries[i] = (reinterpret_cast(p) - pm::page_offset) | (flags & 0xfff); } - void dump(int level = 4, uint64_t offset = page_manager::page_offset); + void dump(int level = 4, int max_index = 511, uint64_t offset = page_manager::page_offset); };