use crate::SecurityLevel;
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum ThreadState {
Inactive,
Running,
Ready,
Blocked,
Restart,
IdleThread,
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum IPCBlockReason {
SendBlocked(u64),
RecvBlocked(u64),
ReplyBlocked,
NotificationBlocked(u64),
CallBlocked(u64),
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum FaultType {
VmFault {
addr: u64,
is_write: bool,
},
CapFault(u64),
UnknownSyscall(u64),
UserException {
num: u64,
err_code: u64,
},
DebugException,
NullFault,
}
pub struct Registers {
pub gpr: Vec<u64>,
pub pc: u64,
pub sp: u64,
pub flags: u64,
}
pub struct TCB {
pub id: u64,
pub thread_state: ThreadState,
pub priority: u64,
pub mcp: u64,
pub timeslice: u64,
pub domain: u64,
pub bound_cspace: Option<u64>,
pub bound_vspace: Option<u64>,
pub ipc_buffer: Option<u64>,
pub reply_slot: Option<u64>,
pub fault_endpoint: Option<u64>,
pub blocked: Option<IPCBlockReason>,
pub fault: Option<FaultType>,
pub registers: Registers,
pub security_level: SecurityLevel,
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct DomainScheduleEntry {
pub domain: u64,
pub duration: u64,
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum SchedulerAction {
ResumeCurrentThread,
ChooseNewThread,
SwitchToThread(u64),
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum KernelEntryReason {
Syscall,
Interrupt,
VmFault,
Exception,
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct ReadyQueueEntry {
pub domain: u64,
pub priority: u64,
pub thread_id: u64,
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct ReleaseQueueEntry {
pub thread_id: u64,
pub wake_time: u64,
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct IdleThreadEntry {
pub domain: u64,
pub idle_thread_id: u64,
}
pub struct SchedulerState {
pub current_thread: Option<u64>,
pub current_domain: u64,
pub domain_ticks_left: u64,
pub domain_schedule: Vec<DomainScheduleEntry>,
pub domain_schedule_idx: u64,
pub ready_queues: Vec<ReadyQueueEntry>,
pub release_queue: Vec<ReleaseQueueEntry>,
pub scheduler_action: SchedulerAction,
pub idle_threads: Vec<IdleThreadEntry>,
pub preemption_pending: bool,
pub kernel_entry_reason: Option<KernelEntryReason>,
}
pub struct ThreadTableEntry {
pub thread_id: u64,
pub tcb: TCB,
}
pub struct ThreadTable {
pub entries: Vec<ThreadTableEntry>,
}