1
0
mirror of https://github.com/sgmarz/osblog.git synced 2024-11-27 20:03:32 +04:00
osblog/risc_v/src/sched.rs
2020-03-15 20:18:46 -04:00

42 lines
980 B
Rust
Executable File

// sched.rs
// Simple process scheduler
// Stephen Marz
// 27 Dec 2019
use crate::process::{ProcessState, PROCESS_LIST};
pub fn schedule() -> usize {
unsafe {
if let Some(mut pl) = PROCESS_LIST.take() {
pl.rotate_left(1);
let mut frame_addr: usize = 0;
// let mut mepc: usize = 0;
// let mut satp: usize = 0;
// let mut pid: usize = 0;
if let Some(prc) = pl.front() {
match prc.get_state() {
ProcessState::Running => {
frame_addr =
prc.get_frame_address();
// satp = prc.get_table_address();
// pid = prc.get_pid() as usize;
},
ProcessState::Sleeping => {},
_ => {},
}
}
// println!("Scheduling {}", pid);
PROCESS_LIST.replace(pl);
if frame_addr != 0 {
// MODE 8 is 39-bit virtual address MMU
// I'm using the PID as the address space
// identifier to hopefully help with (not?)
// flushing the TLB whenever we switch
// processes.
return frame_addr;
}
}
}
0
}