Loader seem to work, be seem we have a problem with jalr
This commit is contained in:
parent
7dff3bcdd9
commit
703c8e5448
@ -207,20 +207,25 @@ mod test {
|
|||||||
fn test_thread_context() {
|
fn test_thread_context() {
|
||||||
let mut machine = Machine::init_machine();
|
let mut machine = Machine::init_machine();
|
||||||
loader::load("./test/riscv_instructions/simple_arithmetics/unsigned_addition", &mut machine, 0).expect("IO Error");
|
loader::load("./test/riscv_instructions/simple_arithmetics/unsigned_addition", &mut machine, 0).expect("IO Error");
|
||||||
let start_pc = 0x4000;
|
let start_pc = 0x1000;
|
||||||
let system = &mut System::default();
|
let system = &mut System::default();
|
||||||
|
|
||||||
let thread1 = Thread::new("th1");
|
let thread1 = Thread::new("th1");
|
||||||
let thread1 = Rc::new(RefCell::new(thread1));
|
let thread1 = Rc::new(RefCell::new(thread1));
|
||||||
system.get_thread_manager().get_g_alive().push(Rc::clone(&thread1));
|
system.get_thread_manager().get_g_alive().push(Rc::clone(&thread1));
|
||||||
|
|
||||||
let owner = Process { num_thread: 0 };
|
let owner = Process { num_thread: 0 };
|
||||||
system.get_thread_manager().start_thread(Rc::clone(&thread1), owner, start_pc, 0);
|
system.get_thread_manager().start_thread(Rc::clone(&thread1), owner, start_pc, -1);
|
||||||
debug_assert_eq!(thread1.borrow_mut().thread_context.pc, start_pc);
|
debug_assert_eq!(thread1.borrow_mut().thread_context.pc, start_pc);
|
||||||
|
|
||||||
let to_run = system.get_thread_manager().find_next_to_run().unwrap();
|
let to_run = system.get_thread_manager().find_next_to_run().unwrap();
|
||||||
debug_assert_eq!(to_run, Rc::clone(&thread1));
|
debug_assert_eq!(to_run, Rc::clone(&thread1));
|
||||||
debug_assert!(system.get_thread_manager().get_g_alive().contains(&Rc::clone(&thread1)));
|
debug_assert!(system.get_thread_manager().get_g_alive().contains(&Rc::clone(&thread1)));
|
||||||
|
|
||||||
system.get_thread_manager().switch_to(&mut machine, Rc::clone(&to_run));
|
system.get_thread_manager().switch_to(&mut machine, Rc::clone(&to_run));
|
||||||
debug_assert_eq!(system.get_thread_manager().g_current_thread, Option::Some(Rc::clone(&thread1)));
|
debug_assert_eq!(system.get_thread_manager().g_current_thread, Option::Some(Rc::clone(&thread1)));
|
||||||
debug_assert_eq!(machine.pc, start_pc);
|
debug_assert_eq!(machine.pc, start_pc);
|
||||||
|
|
||||||
machine.run();
|
machine.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ pub fn load(path: &str, machine: &mut Machine, start_index: usize) -> Result<(),
|
|||||||
for i in 0..instructions.len() {
|
for i in 0..instructions.len() {
|
||||||
machine.write_memory(4, 4 * i + start_index, instructions[i] as u64);
|
machine.write_memory(4, 4 * i + start_index, instructions[i] as u64);
|
||||||
}
|
}
|
||||||
#[cfg(debug_assertions)]
|
// #[cfg(debug_assertions)]
|
||||||
println!("{:04x?}", instructions); // only print loaded program in debug build
|
// println!("{:04x?}", instructions); // only print loaded program in debug build
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
@ -240,7 +240,7 @@ impl Machine {
|
|||||||
let val = u32::from_be_bytes(val) as u64;
|
let val = u32::from_be_bytes(val) as u64;
|
||||||
let inst : Instruction = decode(val);
|
let inst : Instruction = decode(val);
|
||||||
self.print_status();
|
self.print_status();
|
||||||
println!("executing instruction : {:016x} at pc {:x}", val, self.pc);
|
println!("executing instruction : {:016x} at pc 0x{:x}", val, self.pc);
|
||||||
println!("{}", print::print(decode(val), self.pc as i32));
|
println!("{}", print::print(decode(val), self.pc as i32));
|
||||||
let trace = Self::string_registers(self);
|
let trace = Self::string_registers(self);
|
||||||
self.registers_trace.push_str(format!("{}\n", trace).as_str());
|
self.registers_trace.push_str(format!("{}\n", trace).as_str());
|
||||||
|
Loading…
Reference in New Issue
Block a user