From f93484bf811aa34284acc3d3e85a432bb172d069 Mon Sep 17 00:00:00 2001 From: juls0730 <62722391+juls0730@users.noreply.github.com> Date: Mon, 26 Aug 2024 23:13:48 -0500 Subject: [PATCH] a working vmm --- .vscode/launch.json | 12 ++++- src/mem/allocator.rs | 3 +- src/mem/mod.rs | 7 +-- src/mem/vmm.rs | 110 ++++++++++--------------------------------- 4 files changed, 40 insertions(+), 92 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index e46201d..f60aa9a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,13 +4,23 @@ { "type": "gdb", "request": "attach", - "name": "Attach to QEMU", + "name": "Build and Attach to QEMU", "preLaunchTask": "(Debug) Build the kernel and run qemu", "executable": "${workspaceFolder}/target/x86_64-unknown-none/debug/CappuccinOS.elf", "target": ":1234", "remote": true, "cwd": "${workspaceRoot}", // "gdbpath": "${workspaceRoot}/target/x86_64-unknown-none/debug/CappuccinOS.elf" + }, + { + "type": "gdb", + "request": "attach", + "name": "Attach to QEMU", + "executable": "${workspaceFolder}/target/x86_64-unknown-none/debug/CappuccinOS.elf", + "target": ":1234", + "remote": true, + "cwd": "${workspaceRoot}", + // "gdbpath": "${workspaceRoot}/target/x86_64-unknown-none/debug/CappuccinOS.elf" } ] } \ No newline at end of file diff --git a/src/mem/allocator.rs b/src/mem/allocator.rs index 133c8b7..bfccad3 100644 --- a/src/mem/allocator.rs +++ b/src/mem/allocator.rs @@ -46,7 +46,8 @@ impl LinkedListAllocator { pub fn init(&mut self, pages: usize) { unsafe { - self.add_free_region(pmm_alloc(1).to_higher_half(), PAGE_SIZE * pages); + // fucking kill me + self.add_free_region(pmm_alloc(pages).to_higher_half(), PAGE_SIZE * pages); } } diff --git a/src/mem/mod.rs b/src/mem/mod.rs index 03491a7..a66694c 100755 --- a/src/mem/mod.rs +++ b/src/mem/mod.rs @@ -278,12 +278,7 @@ pub static ALLOCATOR: Mutex = Mutex::new(LinkedListAllocato // TODO: Limine-rs 0.2.0 does NOT have debug implemented for a lot of it's types, so until that is fixed, either go without Type, or hack limine-rs locally (tracking https://github.com/limine-bootloader/limine-rs/pull/30) // pub fn log_memory_map() { -// let memmap_request = unsafe { MEMMAP_REQUEST.get_response_mut() }; -// if memmap_request.is_none() { -// panic!("Memory map was None!"); -// } - -// let memmap = memmap_request.unwrap().entries(); +// let memmap = get_memmap(); // crate::log!(LogLevel::Trace, "====== MEMORY MAP ======"); // for entry in memmap.iter() { diff --git a/src/mem/vmm.rs b/src/mem/vmm.rs index 528cd7b..f9c7718 100644 --- a/src/mem/vmm.rs +++ b/src/mem/vmm.rs @@ -2,12 +2,9 @@ use core::arch::x86_64::__cpuid; use limine::memory_map::EntryType; -use crate::{ - hcf, - libs::{ - cell::OnceCell, - limine::{get_hhdm_offset, get_kernel_address, get_memmap, get_paging_level}, - }, +use crate::libs::{ + cell::OnceCell, + limine::{get_hhdm_offset, get_kernel_address, get_memmap, get_paging_level}, }; use super::{align_down, align_up, pmm::pmm_alloc, PhysicalPtr}; @@ -17,7 +14,7 @@ const PT_FLAG_WRITE: u64 = 1 << 1; const PT_FLAG_USER: u64 = 1 << 2; const PT_FLAG_LARGE: u64 = 1 << 7; const PT_FLAG_NX: u64 = 1 << 63; -const PT_PADDR_MASK: u64 = 0x000F_FFFF_FFFF_FFFF; +const PT_PADDR_MASK: u64 = 0x0000_FFFF_FFFF_F000; const PT_TABLE_FLAGS: u64 = PT_FLAG_VALID | PT_FLAG_WRITE | PT_FLAG_USER; @@ -137,7 +134,19 @@ pub fn vmm_init() { unsafe { KENREL_PAGE_DIRECTORY = page_directory as *mut PageDirectory }; - let mut i = 0; + let mut i = 0_usize; + while i < 0x100000000 { + vmm_map( + page_directory, + i + get_hhdm_offset(), + i, + PT_FLAG_WRITE, + PageSize::Size1GiB, + ); + + i += 0x40000000; + } + for entry in get_memmap() { if entry.entry_type != EntryType::KERNEL_AND_MODULES { continue; @@ -145,47 +154,24 @@ pub fn vmm_init() { let kernel_addr = get_kernel_address(); - let base = kernel_addr.physical_base(); - let length = entry.length; - let top = base + length; + let base = kernel_addr.physical_base() as usize; + let length = entry.length as usize; - let aligned_base = align_down(base as usize, 0x40000000); - let aligned_top = align_up(top as usize, 0x40000000); - let aligned_length = aligned_top - aligned_base; - - while i <= aligned_length { - let page = aligned_base + i; - - crate::println!( - "Mapping the kernel from {:X} to {:X}", - page, - kernel_addr.virtual_base() - ); + crate::println!("{length:X} {base:X} {:X}", entry.base); + i = 0; + while i < length { vmm_map( page_directory, - page + kernel_addr.virtual_base() as usize, - page as usize, + kernel_addr.virtual_base() as usize + i, + base + i, 0x02, - PageSize::Size1GiB, + PageSize::Size4KiB, ); - i += 0x40000000 + i += 0x1000; } } - while i <= 0x100000000 { - // vmm_map(page_directory, i, i, 0x03, PageSize::Size4KiB); - vmm_map( - page_directory, - i + get_hhdm_offset(), - i, - 0x02, - PageSize::Size1GiB, - ); - - i += 0x40000000; - } - for entry in get_memmap() { if entry.entry_type == EntryType::RESERVED || entry.entry_type == EntryType::BAD_MEMORY { continue; @@ -230,33 +216,6 @@ pub fn vmm_init() { } } - for entry in get_memmap() { - if entry.entry_type != EntryType::FRAMEBUFFER { - continue; - } - - let base = entry.base; - let length = entry.length; - let top = base + length; - - let aligned_base = align_down(base as usize, 0x1000); - let aligned_top = align_up(top as usize, 0x1000); - let aligned_length = aligned_top - aligned_base; - - while i < aligned_length { - let page = aligned_base + i; - vmm_map( - page_directory, - page + get_hhdm_offset(), - page, - 0x02 | 1 << 3, - PageSize::Size4KiB, - ); - - i += 0x1000; - } - } - unsafe { va_space_switch(page_directory) }; } @@ -382,8 +341,6 @@ fn get_next_level( let old_page_size = PAGE_SIZES[level]; let new_page_size = PAGE_SIZES[desired_size as usize]; - crate::println!("OLD {old_page_size:X} NEW {new_page_size:X}"); - // ((x) & (PT_FLAG_WRITE | PT_FLAG_NX)) let old_flags = page_directory.entries[entry].vmm_flags(); let old_phys = page_directory.entries[entry].addr(); @@ -467,22 +424,7 @@ unsafe fn va_space_switch(page_directory: &mut PageDirectory) { "Page directory pointer is not aligned" ); - let mut cr3 = 0; - unsafe { core::arch::asm!("mov rax, cr3", out("rax") cr3) }; - - crate::println!("{cr3:X}"); - - // hcf(); - unsafe { core::arch::asm!("mov cr3, {0:r}", in(reg) pd_ptr) }; - // test(pd_ptr); crate::println!("waa"); } - -#[naked] -pub extern "C" fn test(ptr: *mut u8) { - unsafe { - core::arch::asm!("mov cr3, rdi", "ret", options(noreturn)); - } -}