#![no_std]
#![no_main]
use core::mem::size_of;
use et_abi::{CacheTestArgs, DeviceArgs, CACHE_LINE, MINIONS_PER_SHIRE};
use et_kernel::{
cache::cache_writeback,
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);
}
unsafe {
cache_writeback(cell_addr, size_of::<u32>());
}
fence();
0
}
#[panic_handler]
fn panic(_: &core::panic::PanicInfo) -> ! {
loop {
unsafe { core::arch::asm!("wfi") };
}
}