//! 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()
    }
}