forked from AbleOS/ableos
64 lines
1.6 KiB
Rust
64 lines
1.6 KiB
Rust
//! Security? Multiple address spaces? What are you talking about
|
|
//! young adventurer. In this temple, we know no such words.
|
|
//!
|
|
//! Want your program to override other program's data or even the
|
|
//! data of the kernel itself? Sure. This right shall not be infringed.
|
|
|
|
use hbvm::mem::Address;
|
|
|
|
fn calc_start_of_page(ptr: u64) -> u64 {
|
|
let mut page_aligned = false;
|
|
if ptr % 4096 == 0 {
|
|
// page_aligned = true;
|
|
return ptr / 4096;
|
|
}
|
|
panic!("unaligned");
|
|
}
|
|
|
|
pub struct Memory {
|
|
// TODO: map page aligned segments of memory into a table or some sort here
|
|
}
|
|
|
|
impl Memory {
|
|
#[cfg(target_arch = "x86_64")]
|
|
fn read_device(addr: Address) {
|
|
unsafe {
|
|
//
|
|
// x86_64::instructions::port::Port::new(addr.get()).read()
|
|
}
|
|
}
|
|
}
|
|
|
|
impl hbvm::mem::Memory for Memory {
|
|
#[inline]
|
|
unsafe fn load(
|
|
&mut self,
|
|
addr: Address,
|
|
target: *mut u8,
|
|
count: usize,
|
|
) -> Result<(), hbvm::mem::LoadError> {
|
|
use log::{error, info};
|
|
if addr.get() % 4096 == 0 {}
|
|
core::ptr::copy(addr.get() as *const u8, target, count);
|
|
Ok(())
|
|
}
|
|
|
|
#[inline]
|
|
unsafe fn store(
|
|
&mut self,
|
|
addr: Address,
|
|
source: *const u8,
|
|
count: usize,
|
|
) -> Result<(), hbvm::mem::StoreError> {
|
|
// log::info!("Storing memory");
|
|
|
|
core::ptr::copy(source, addr.get() as *mut u8, count);
|
|
Ok(())
|
|
}
|
|
|
|
#[inline]
|
|
unsafe fn prog_read<T: Copy>(&mut self, addr: Address) -> T {
|
|
(addr.get() as *const T).read_unaligned()
|
|
}
|
|
}
|