#![no_std]
#![no_main]
use core::mem::size_of;
use et_abi::{CACHE_LINE, CacheTestArgs, DeviceArgs, MINIONS_PER_SHIRE};
use et_kernel::{
cache::{CacheDest, cache_writeback_to},
fence, hart_id, kernel_entry, shire_id,
};
kernel_entry!();
#[unsafe(no_mangle)]
pub extern "C" fn entry_point(args_ptr: usize) -> i64 {
let args: &CacheTestArgs = unsafe { CacheTestArgs::from_ptr(args_ptr as *const u8) };
let h = hart_id();
if h & 1 != 0 {
return 0;
}
let shire = shire_id();
let hart_in_shire = h & 63; let minion_in_shire = hart_in_shire >> 1;
let my_minion = shire * MINIONS_PER_SHIRE + minion_in_shire;
let total_minions = args.n_shires as u32 * MINIONS_PER_SHIRE;
if my_minion >= total_minions {
return 0;
}
let cell_addr = args.output as usize + my_minion as usize * CACHE_LINE;
unsafe {
core::ptr::write_volatile(cell_addr as *mut u32, my_minion);
}
fence();
let dest = match args.dest {
1 => CacheDest::L2,
2 => CacheDest::L3,
_ => CacheDest::Mem,
};
unsafe {
cache_writeback_to(dest, cell_addr, size_of::<u32>());
}
fence();
0
}
#[panic_handler]
fn panic(_: &core::panic::PanicInfo) -> ! {
loop {
unsafe { core::arch::asm!("wfi") };
}
}