Add GLOBAL flag and prettify some stuff

This commit is contained in:
uuuvn
2023-06-12 10:11:01 +00:00
parent 7aeb9f0ac8
commit d89e6008e8
9 changed files with 39 additions and 17 deletions
+2
View File
@@ -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;
+2
View File
@@ -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;
+2
View File
@@ -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;
+2
View File
@@ -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;
+2 -1
View File
@@ -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;
+2 -1
View File
@@ -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;
+3 -3
View File
@@ -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
-4
View File
@@ -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)
+24 -8
View File
@@ -1,14 +1,11 @@
use core::{
fmt,
marker::PhantomData
};
use core::{fmt, marker::PhantomData};
use crate::Arch;
#[derive(Clone, Copy)]
pub struct PageFlags<A> {
data: usize,
phantom: PhantomData<A>,
arch: PhantomData<A>,
}
impl<A: Arch> PageFlags<A> {
@@ -19,7 +16,8 @@ impl<A: Arch> PageFlags<A> {
// 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<A: Arch> PageFlags<A> {
// 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<A: Arch> PageFlags<A> {
// 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<A: Arch> fmt::Debug for PageFlags<A> {