use crate::arch::csr::Csrs;
use crate::arch::pmp::Pmp;
use crate::arch::regs::RegisterFile;
use crate::common::HartId;
use crate::isa::privileged::PrivilegeMode;
#[derive(Debug)]
pub struct Hart {
pub hart_id: HartId,
pub regs: RegisterFile,
pub pc: u64,
pub csrs: Csrs,
pub privilege: PrivilegeMode,
pub pmp: Pmp,
pub wfi_waiting: bool,
pub sw_seip: bool,
pub instructions_retired: u64,
}
#[derive(Debug)]
pub struct HartInit {
pub hart_id: HartId,
pub regs: RegisterFile,
pub pc: u64,
pub csrs: Csrs,
pub privilege: PrivilegeMode,
pub pmp: Pmp,
}
impl Hart {
pub fn new(init: HartInit) -> Self {
Self {
hart_id: init.hart_id,
regs: init.regs,
pc: init.pc,
csrs: init.csrs,
privilege: init.privilege,
pmp: init.pmp,
wfi_waiting: false,
sw_seip: false,
instructions_retired: 0,
}
}
}
impl std::fmt::Display for Hart {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
writeln!(f, "PC = {:#018x}", self.pc)?;
write!(f, "{}", self.regs.gpr())
}
}