Remove x86_64 crate
This commit is contained in:
parent
6892387217
commit
33ffd9882a
3 changed files with 40 additions and 35 deletions
26
loader/Cargo.lock
generated
26
loader/Cargo.lock
generated
|
@ -14,6 +14,12 @@ version = "0.10.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
|
checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitfield"
|
||||||
|
version = "0.15.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c821a6e124197eb56d907ccc2188eab1038fb919c914f47976e64dd8dbc855d1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "1.3.2"
|
version = "1.3.2"
|
||||||
|
@ -51,12 +57,12 @@ checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b"
|
||||||
name = "loader"
|
name = "loader"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"bitfield",
|
||||||
"com_logger",
|
"com_logger",
|
||||||
"elf",
|
"elf",
|
||||||
"log",
|
"log",
|
||||||
"static-alloc",
|
"static-alloc",
|
||||||
"uefi",
|
"uefi",
|
||||||
"x86_64",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -219,12 +225,6 @@ version = "1.0.12"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
|
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "volatile"
|
|
||||||
version = "0.4.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "442887c63f2c839b346c192d047a7c87e73d0689c9157b00b53dcc27dd5ea793"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "x86"
|
name = "x86"
|
||||||
version = "0.52.0"
|
version = "0.52.0"
|
||||||
|
@ -235,15 +235,3 @@ dependencies = [
|
||||||
"bitflags 1.3.2",
|
"bitflags 1.3.2",
|
||||||
"raw-cpuid",
|
"raw-cpuid",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "x86_64"
|
|
||||||
version = "0.15.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "4bc79523af8abf92fb1a970c3e086c5a343f6bcc1a0eb890f575cbb3b45743df"
|
|
||||||
dependencies = [
|
|
||||||
"bit_field",
|
|
||||||
"bitflags 2.6.0",
|
|
||||||
"rustversion",
|
|
||||||
"volatile",
|
|
||||||
]
|
|
||||||
|
|
|
@ -4,9 +4,9 @@ version = "0.0.1"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
bitfield = "0.15.0"
|
||||||
com_logger = { git = "https://git.strypsteen.com/mathieu/com_logger", version = "0.1.1" }
|
com_logger = { git = "https://git.strypsteen.com/mathieu/com_logger", version = "0.1.1" }
|
||||||
elf = {version = "0.7.4", default-features = false}
|
elf = {version = "0.7.4", default-features = false}
|
||||||
log = "0.4.22"
|
log = "0.4.22"
|
||||||
static-alloc = "0.2.5"
|
static-alloc = "0.2.5"
|
||||||
uefi = {version = "0.28.0"}
|
uefi = {version = "0.28.0"}
|
||||||
x86_64 = {version = "0.15.1", default-features = false, features = ["instructions"]}
|
|
||||||
|
|
|
@ -1,26 +1,44 @@
|
||||||
use core::alloc::Layout;
|
use core::{alloc::Layout, arch::asm};
|
||||||
|
|
||||||
use alloc::alloc::alloc_zeroed;
|
use alloc::alloc::alloc_zeroed;
|
||||||
|
use bitfield::bitfield;
|
||||||
use uefi::table::boot::{MemoryMap, MemoryType};
|
use uefi::table::boot::{MemoryMap, MemoryType};
|
||||||
use x86_64::{
|
|
||||||
registers::control::{Cr3, Cr3Flags},
|
|
||||||
structures::paging::{PageTable, PageTableFlags, PhysFrame},
|
|
||||||
PhysAddr,
|
|
||||||
};
|
|
||||||
|
|
||||||
use crate::elf;
|
use crate::elf;
|
||||||
|
|
||||||
|
bitfield! {
|
||||||
|
struct PageEntry(u64);
|
||||||
|
present, set_present: 1, 0;
|
||||||
|
write, set_write: 2, 1;
|
||||||
|
user, set_user: 3, 2;
|
||||||
|
write_through, set_write_through: 4, 3;
|
||||||
|
cache_disable, set_cache_disable: 5, 4;
|
||||||
|
accessed, set_accessed: 6, 5;
|
||||||
|
dirty, set_dirty: 7, 6;
|
||||||
|
page_size, set_page_size: 8, 7;
|
||||||
|
global, set_global: 9, 8;
|
||||||
|
available, set_available: 11, 9;
|
||||||
|
address, set_address: 63, 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
#[repr(align(0x1000))]
|
||||||
|
struct PageTable {
|
||||||
|
entries: [PageEntry; 512],
|
||||||
|
}
|
||||||
|
|
||||||
fn get_table_entry(table: &mut PageTable, i: usize) -> &mut PageTable {
|
fn get_table_entry(table: &mut PageTable, i: usize) -> &mut PageTable {
|
||||||
if table[i].is_unused() {
|
if table.entries[i].present() == 0 {
|
||||||
let layout = Layout::new::<PageTable>().align_to(0x1000).unwrap();
|
let layout = Layout::new::<PageTable>().align_to(0x1000).unwrap();
|
||||||
let new_table;
|
let new_table;
|
||||||
unsafe {
|
unsafe {
|
||||||
new_table = alloc_zeroed(layout);
|
new_table = alloc_zeroed(layout);
|
||||||
}
|
}
|
||||||
let addr = PhysAddr::new(new_table as u64);
|
table.entries[i].set_address(new_table as u64 / 0x1000);
|
||||||
table[i].set_addr(addr, PageTableFlags::PRESENT | PageTableFlags::WRITABLE);
|
table.entries[i].set_present(1);
|
||||||
|
table.entries[i].set_write(1);
|
||||||
}
|
}
|
||||||
let ptr = table[i].addr().as_u64() as *mut PageTable;
|
let ptr = (table.entries[i].address() * 0x1000) as *mut PageTable;
|
||||||
unsafe {
|
unsafe {
|
||||||
return ptr.as_mut().unwrap();
|
return ptr.as_mut().unwrap();
|
||||||
}
|
}
|
||||||
|
@ -34,8 +52,9 @@ fn map(pml4: &mut PageTable, mut virt: usize, phys: usize) {
|
||||||
let pdpt = get_table_entry(pml4, pml4_i);
|
let pdpt = get_table_entry(pml4, pml4_i);
|
||||||
let directory = get_table_entry(pdpt, pdpt_i);
|
let directory = get_table_entry(pdpt, pdpt_i);
|
||||||
let table = get_table_entry(directory, directory_i);
|
let table = get_table_entry(directory, directory_i);
|
||||||
let phys_addr = PhysAddr::new(phys as u64);
|
table.entries[table_i].set_address(phys as u64 / 0x1000);
|
||||||
table[table_i].set_addr(phys_addr, PageTableFlags::PRESENT | PageTableFlags::WRITABLE)
|
table.entries[table_i].set_present(1);
|
||||||
|
table.entries[table_i].set_write(1);
|
||||||
}
|
}
|
||||||
pub fn setup_paging(memory_map: &MemoryMap, kernel_start: u64, kernel_size: usize) {
|
pub fn setup_paging(memory_map: &MemoryMap, kernel_start: u64, kernel_size: usize) {
|
||||||
let pml4;
|
let pml4;
|
||||||
|
@ -62,9 +81,7 @@ pub fn setup_paging(memory_map: &MemoryMap, kernel_start: u64, kernel_size: usiz
|
||||||
let phys = kernel_start as usize + i * 0x1000;
|
let phys = kernel_start as usize + i * 0x1000;
|
||||||
map(pml4, virt, phys);
|
map(pml4, virt, phys);
|
||||||
}
|
}
|
||||||
let pml4_addr = PhysAddr::new(pml4 as *const PageTable as u64);
|
|
||||||
let frame = PhysFrame::from_start_address(pml4_addr).unwrap();
|
|
||||||
unsafe {
|
unsafe {
|
||||||
Cr3::write(frame, Cr3Flags::empty());
|
asm!("mov cr3, {}", in(reg) pml4 as *const PageTable as u64);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue