add delay list overflow

This commit is contained in:
Alwin Berger 2023-10-02 15:35:18 +02:00
parent 61ff3e3196
commit d179343a63
4 changed files with 18 additions and 1 deletions

View File

@ -130,6 +130,9 @@ pub fn fuzz() {
let task_delay_addr = elf let task_delay_addr = elf
.resolve_symbol("pxDelayedTaskList", 0) .resolve_symbol("pxDelayedTaskList", 0)
.expect("Symbol pxDelayedTaskList not found"); .expect("Symbol pxDelayedTaskList not found");
let task_delay_overflow_addr = elf
.resolve_symbol("pxOverflowDelayedTaskList", 0)
.expect("Symbol pxOverflowDelayedTaskList not found");
// let task_queue_addr = virt2phys(task_queue_addr,&elf.goblin()); // let task_queue_addr = virt2phys(task_queue_addr,&elf.goblin());
#[cfg(feature = "systemstate")] #[cfg(feature = "systemstate")]
println!("Task Queue at {:#x}", task_queue_addr); println!("Task Queue at {:#x}", task_queue_addr);
@ -345,7 +348,7 @@ pub fn fuzz() {
let qhelpers = tuple_list!( let qhelpers = tuple_list!(
QemuEdgeCoverageHelper::default(), QemuEdgeCoverageHelper::default(),
QemuStateRestoreHelper::new(), QemuStateRestoreHelper::new(),
QemuSystemStateHelper::new(svh,curr_tcb_pointer,task_queue_addr,task_delay_addr,input_counter_ptr,app_range.clone()) QemuSystemStateHelper::new(svh,curr_tcb_pointer,task_queue_addr,task_delay_addr,task_delay_overflow_addr,input_counter_ptr,app_range.clone())
); );
let mut hooks = QemuHooks::new(&emu,qhelpers); let mut hooks = QemuHooks::new(&emu,qhelpers);

View File

@ -114,6 +114,10 @@ impl SysGraphNode {
let mut ret = String::new(); let mut ret = String::new();
ret.push_str(&format!("{}#{}",&self.base.current_task.0.task_name,&self.base.current_task.1)); ret.push_str(&format!("{}#{}",&self.base.current_task.0.task_name,&self.base.current_task.1));
ret.push_str("\nRl:"); ret.push_str("\nRl:");
for i in &self.base.ready_list_after {
ret.push_str(&format!("\n{}#{}",i.0.task_name,i.1));
}
ret.push_str("\nDl:");
for i in &self.base.delay_list_after { for i in &self.base.delay_list_after {
ret.push_str(&format!("\n{}#{}",i.0.task_name,i.1)); ret.push_str(&format!("\n{}#{}",i.0.task_name,i.1));
} }

View File

@ -39,6 +39,7 @@ pub struct QemuSystemStateHelper {
tcb_addr: u32, tcb_addr: u32,
ready_queues: u32, ready_queues: u32,
delay_queue: u32, delay_queue: u32,
delay_queue_overflow: u32,
input_counter: Option<u64>, input_counter: Option<u64>,
app_range: Range<u32>, app_range: Range<u32>,
} }
@ -50,6 +51,7 @@ impl QemuSystemStateHelper {
tcb_addr: u32, tcb_addr: u32,
ready_queues: u32, ready_queues: u32,
delay_queue: u32, delay_queue: u32,
delay_queue_overflow: u32,
input_counter: Option<u64>, input_counter: Option<u64>,
app_range: Range<u32>, app_range: Range<u32>,
) -> Self { ) -> Self {
@ -58,6 +60,7 @@ impl QemuSystemStateHelper {
tcb_addr: tcb_addr, tcb_addr: tcb_addr,
ready_queues: ready_queues, ready_queues: ready_queues,
delay_queue, delay_queue,
delay_queue_overflow,
input_counter: input_counter, input_counter: input_counter,
app_range, app_range,
} }
@ -164,6 +167,11 @@ fn trigger_collection(emulator: &Emulator, h: &QemuSystemStateHelper) {
target = freertos::emu_lookup::lookup(emulator, target); target = freertos::emu_lookup::lookup(emulator, target);
systemstate.delay_list = read_freertos_list(&mut systemstate, emulator, target); systemstate.delay_list = read_freertos_list(&mut systemstate, emulator, target);
// Extract delay list overflow
let mut target : u32 = h.delay_queue_overflow;
target = freertos::emu_lookup::lookup(emulator, target);
systemstate.delay_list_overflow = read_freertos_list(&mut systemstate, emulator, target);
// Extract priority lists // Extract priority lists
for i in 0..NUM_PRIOS { for i in 0..NUM_PRIOS {
let target : u32 = listbytes*u32::try_from(i).unwrap()+h.ready_queues; let target : u32 = listbytes*u32::try_from(i).unwrap()+h.ready_queues;

View File

@ -125,6 +125,8 @@ fn refine_system_states(input: &mut Vec<RawFreeRTOSSystemState>) -> Vec<RefinedF
} }
// collect delay list // collect delay list
let mut delay_list : Vec::<RefinedTCB> = tcb_list_to_vec_cached(i.delay_list, &mut i.dumping_ground).iter().map(|x| RefinedTCB::from_tcb(x)).collect(); let mut delay_list : Vec::<RefinedTCB> = tcb_list_to_vec_cached(i.delay_list, &mut i.dumping_ground).iter().map(|x| RefinedTCB::from_tcb(x)).collect();
let mut delay_list_overflow : Vec::<RefinedTCB> = tcb_list_to_vec_cached(i.delay_list_overflow, &mut i.dumping_ground).iter().map(|x| RefinedTCB::from_tcb(x)).collect();
delay_list.append(&mut delay_list_overflow);
delay_list.sort_by(|a,b| a.task_name.cmp(&b.task_name)); delay_list.sort_by(|a,b| a.task_name.cmp(&b.task_name));
// keep counts for all tasks // keep counts for all tasks