diff --git a/src/arch/aarch64.rs b/src/arch/aarch64.rs index db3d894b08..9974f72413 100644 --- a/src/arch/aarch64.rs +++ b/src/arch/aarch64.rs @@ -36,6 +36,8 @@ impl Arch for AArch64Arch { //TODO: Separate the two? const ENTRY_FLAG_NO_EXEC: usize = 0b11 << 53; const ENTRY_FLAG_EXEC: usize = 0; + const ENTRY_FLAG_GLOBAL: usize = 0; + const ENTRY_FLAG_NO_GLOBAL: usize = 1 << 11; const PHYS_OFFSET: usize = 0xFFFF_8000_0000_0000; diff --git a/src/arch/mod.rs b/src/arch/mod.rs index e483899c94..f22eaae406 100644 --- a/src/arch/mod.rs +++ b/src/arch/mod.rs @@ -49,6 +49,8 @@ pub trait Arch: Clone + Copy { const ENTRY_FLAG_USER: usize; const ENTRY_FLAG_NO_EXEC: usize; const ENTRY_FLAG_EXEC: usize; + const ENTRY_FLAG_GLOBAL: usize; + const ENTRY_FLAG_NO_GLOBAL: usize; const PHYS_OFFSET: usize; diff --git a/src/arch/riscv64/sv39.rs b/src/arch/riscv64/sv39.rs index e3f1926b06..ced66efa3b 100644 --- a/src/arch/riscv64/sv39.rs +++ b/src/arch/riscv64/sv39.rs @@ -31,6 +31,8 @@ impl Arch for RiscV64Sv39Arch { const ENTRY_FLAG_USER: usize = 1 << 4; const ENTRY_FLAG_NO_EXEC: usize = 0; const ENTRY_FLAG_EXEC: usize = 1 << 3; + const ENTRY_FLAG_GLOBAL: usize = 1 << 5; + const ENTRY_FLAG_NO_GLOBAL: usize = 0; const PHYS_OFFSET: usize = 0xFFFF_8000_0000_0000; diff --git a/src/arch/riscv64/sv48.rs b/src/arch/riscv64/sv48.rs index cea0a537ba..1246842bfd 100644 --- a/src/arch/riscv64/sv48.rs +++ b/src/arch/riscv64/sv48.rs @@ -31,6 +31,8 @@ impl Arch for RiscV64Sv48Arch { const ENTRY_FLAG_USER: usize = 1 << 4; const ENTRY_FLAG_NO_EXEC: usize = 0; const ENTRY_FLAG_EXEC: usize = 1 << 3; + const ENTRY_FLAG_GLOBAL: usize = 1 << 5; + const ENTRY_FLAG_NO_GLOBAL: usize = 0; const PHYS_OFFSET: usize = 0xFFFF_8000_0000_0000; diff --git a/src/arch/x86.rs b/src/arch/x86.rs index dcf0600941..424a1332b0 100644 --- a/src/arch/x86.rs +++ b/src/arch/x86.rs @@ -25,7 +25,8 @@ impl Arch for X86Arch { const ENTRY_FLAG_READWRITE: usize = 1 << 1; const ENTRY_FLAG_USER: usize = 1 << 2; // Not used: const ENTRY_FLAG_HUGE: usize = 1 << 7; - // Not used: const ENTRY_FLAG_GLOBAL: usize = 1 << 8; + const ENTRY_FLAG_GLOBAL: usize = 1 << 8; + const ENTRY_FLAG_NO_GLOBAL: usize = 0; const ENTRY_FLAG_NO_EXEC: usize = 0; // NOT AVAILABLE UNLESS PAE IS USED! const ENTRY_FLAG_EXEC: usize = 0; diff --git a/src/arch/x86_64.rs b/src/arch/x86_64.rs index 0256e3b81e..29e8d14002 100644 --- a/src/arch/x86_64.rs +++ b/src/arch/x86_64.rs @@ -24,7 +24,8 @@ impl Arch for X8664Arch { const ENTRY_FLAG_READWRITE: usize = 1 << 1; const ENTRY_FLAG_USER: usize = 1 << 2; // Not used: const ENTRY_FLAG_HUGE: usize = 1 << 7; - // Not used: const ENTRY_FLAG_GLOBAL: usize = 1 << 8; + const ENTRY_FLAG_GLOBAL: usize = 1 << 8; + const ENTRY_FLAG_NO_GLOBAL: usize = 0; const ENTRY_FLAG_NO_EXEC: usize = 1 << 63; const ENTRY_FLAG_EXEC: usize = 0; diff --git a/src/lib.rs b/src/lib.rs index 51c6f938b5..0c58fd1a8d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,10 +12,10 @@ mod arch; mod page; pub const KILOBYTE: usize = 1024; -pub const MEGABYTE: usize = KILOBYTE * KILOBYTE; -pub const GIGABYTE: usize = KILOBYTE * MEGABYTE; +pub const MEGABYTE: usize = KILOBYTE * 1024; +pub const GIGABYTE: usize = MEGABYTE * 1024; #[cfg(target_pointer_width = "64")] -pub const TERABYTE: usize = KILOBYTE * GIGABYTE; +pub const TERABYTE: usize = GIGABYTE * 1024; /// Specific table to be used, needed on some architectures //TODO: Use this throughout the code diff --git a/src/main.rs b/src/main.rs index 621a1df9e5..a501837db4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,10 +20,6 @@ use rmm::{ VirtualAddress, }; -use core::{ - marker::PhantomData, -}; - pub fn format_size(size: usize) -> String { if size >= 2 * TERABYTE { format!("{} TB", size / TERABYTE) diff --git a/src/page/flags.rs b/src/page/flags.rs index 22b8780caf..3339d2cd2b 100644 --- a/src/page/flags.rs +++ b/src/page/flags.rs @@ -1,14 +1,11 @@ -use core::{ - fmt, - marker::PhantomData -}; +use core::{fmt, marker::PhantomData}; use crate::Arch; #[derive(Clone, Copy)] pub struct PageFlags { data: usize, - phantom: PhantomData, + arch: PhantomData, } impl PageFlags { @@ -19,7 +16,8 @@ impl PageFlags { // Flags set to present, kernel space, read-only, no-execute by default A::ENTRY_FLAG_DEFAULT_PAGE | A::ENTRY_FLAG_READONLY | - A::ENTRY_FLAG_NO_EXEC + A::ENTRY_FLAG_NO_EXEC | + A::ENTRY_FLAG_NO_GLOBAL, ) } } @@ -31,14 +29,18 @@ impl PageFlags { // Flags set to present, kernel space, read-only, no-execute by default A::ENTRY_FLAG_DEFAULT_TABLE | A::ENTRY_FLAG_READONLY | - A::ENTRY_FLAG_NO_EXEC + A::ENTRY_FLAG_NO_EXEC | + A::ENTRY_FLAG_NO_GLOBAL, ) } } #[inline(always)] pub unsafe fn from_data(data: usize) -> Self { - Self { data, phantom: PhantomData } + Self { + data, + arch: PhantomData, + } } #[inline(always)] @@ -106,6 +108,20 @@ impl PageFlags { // Architecture may use no exec or exec, support either self.data & (A::ENTRY_FLAG_NO_EXEC | A::ENTRY_FLAG_EXEC) == A::ENTRY_FLAG_EXEC } + + #[must_use] + #[inline(always)] + pub fn global(self, value: bool) -> Self { + // Architecture may use global or non global, support either + self.custom_flag(A::ENTRY_FLAG_NO_GLOBAL, !value) + .custom_flag(A::ENTRY_FLAG_GLOBAL, value) + } + + #[inline(always)] + pub fn is_global(&self) -> bool { + // Architecture may use global or non global, support either + self.data & (A::ENTRY_FLAG_NO_GLOBAL | A::ENTRY_FLAG_NO_GLOBAL) == A::ENTRY_FLAG_GLOBAL + } } impl fmt::Debug for PageFlags {