os::print("Err code: {}.\n", err_code);
while (true) { os::hlt(); }
}
-extern "C" os::paging::PML4T PML4T;
extern "C" void int_page_fault(std::uint32_t err_code, std::uint64_t vaddr) {
if (
(0xFFFF'C000'0000'0000 <= vaddr && vaddr < 0xFFFF'C000'1000'0000) // process/port info
) { // Kernel memory
os::print("Allocating (Ring 0): {}\n", (void*)vaddr);
- os::paging::setup_page(PML4T, (void*)vaddr, true, false);
+ os::paging::setup_page(os::paging::global_PML4T, (void*)vaddr, true, false);
return;
} else if (
(0x0000'7FFF'FFFF'0000 <= vaddr && vaddr < 0x0000'8000'0000'0000) // stack
os::idt<32> idt;
extern "C" os::tss TSS;
extern "C" char interrupt_stack_top;
-extern "C" os::paging::PML4T PML4T;
+extern "C" os::paging::PML4T old_PML4T;
os::paging::page<0> bootstrap_pages_for_memory[32]; // 32 pages = 128 KiB
extern "C" void kmain(unsigned long magic, os::phys_ptr<const multiboot2::info_start> info) {
os::assert(magic == 0x36D76289, "Incorrect magic number: wasn't booted with multiboot2.");
os::assert(os::cpu_has_msr(), "MSRs aren't supported.");
+ // TODO: Initialise new PML4T
+ os::paging::global_PML4T = old_PML4T;
+ // /TODO
+ os::print("a\n");
+ os::paging::load_pml4t(os::phys_ptr<os::paging::PML4T>{std::uintptr_t(&os::paging::global_PML4T) - 0xFFFF'FFFF'8000'0000});
+ os::print("b\n");
if (!os::init_serial_port()) {
while (true) {
static_assert(sizeof(os::processes) <= 1024 * 1024 * 1024, "Error: processes array too big.");
{
const auto index = os::paging::calc_page_table_indices(&os::processes).pml4e;
- PML4T.contents[index] = {.non_page = {.P = 1, .R_W = 1, .U_S = 0, .PWT = 0, .PCD = 0, .base_address = 0, .NX = 0}};
+ os::paging::global_PML4T.contents[index] = {.non_page = {.P = 1, .R_W = 1, .U_S = 0, .PWT = 0, .PCD = 0, .base_address = 0, .NX = 0}};
const auto PDPT_alloc = os::paging::page_allocator.allocate(1);
os::memset((void*)PDPT_alloc.ptr, 0, 0x1000);
- set_base_address(PML4T.contents[index], os::phys_ptr<os::paging::PDPT>(PDPT_alloc.ptr.get_phys_addr()));
+ set_base_address(os::paging::global_PML4T.contents[index], os::phys_ptr<os::paging::PDPT>(PDPT_alloc.ptr.get_phys_addr()));
}
{
);
break;
case multiboot2::info::type_t::memory_map:
+ os::print("RAM:\n");
for (std::size_t i = 0; i < multiboot2::memory_map_number_of_entries(it); i++) {
if (multiboot2::memory_map_type(it, i) == 1) {
// Rounded up, to avoid including non-ram.
if (s <= e) { // In the case where no full page is included in the ram section, don't add it.
os::assert(available_ram_length < 50, "Too much available RAM sections to initialise correctly. Will fix eventually, probably.");
available_ram[available_ram_length++] = {.start_address = s, .end_address = e};
+ os::print("{} -> {} ({})\n", s, e + 1, (unsigned long)(e + 1 - s));
}
}
}
+ os::print("RAM END\n");
break;
case multiboot2::info::type_t::modules:
os::print("{}->{}: {}\n", multiboot2::modules_mod_start(it), multiboot2::modules_mod_end(it), multiboot2::modules_string(it));
os::elf::load_elf(os::get_process(os::processes.create()),
(std::byte*)multiboot2::modules_mod_start(it),
multiboot2::modules_mod_end(it) - multiboot2::modules_mod_start(it),
- PML4T);
+ os::paging::global_PML4T);
break;
default: break;
}
os::paging::page_allocator.print_all();
os::print("RAM END\n");
- // Unmap low RAM, and free corresponding page.
- PML4T.contents[0].non_page.P = false;
- os::paging::page_allocator.deallocate({.ptr = os::phys_ptr<os::paging::page<0>>(get_base_address(PML4T.contents[0]).get_phys_addr()), .size = 1});
- os::invlpg((void*)0x0);
-
os::print("Loading ring 3 interrupts stack.\n");
os::set_ring0_stack(TSS, std::uint64_t(&interrupt_stack_top));
os::print("Loading TSS.\n");