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 {