WIP: fix isr_starter
This commit is contained in:
parent
b9d6f41ac6
commit
21c97c8484
@ -24,3 +24,4 @@ micro_int,main_int,FUZZ_INPUT,16,trigger_Qemu_break
|
|||||||
micro_longint,main_micro_longint,FUZZ_INPUT,16,trigger_Qemu_break
|
micro_longint,main_micro_longint,FUZZ_INPUT,16,trigger_Qemu_break
|
||||||
minimal,main_minimal,FUZZ_INPUT,4096,trigger_Qemu_break
|
minimal,main_minimal,FUZZ_INPUT,4096,trigger_Qemu_break
|
||||||
gen3,main_minimal,FUZZ_INPUT,4096,trigger_Qemu_break
|
gen3,main_minimal,FUZZ_INPUT,4096,trigger_Qemu_break
|
||||||
|
interact,main_interact,FUZZ_INPUT,4096,trigger_Qemu_break
|
||||||
|
|
@ -202,9 +202,9 @@ fn states2intervals(trace: Vec<ReducedFreeRTOSSystemState>, meta: Vec<(u64, Capt
|
|||||||
},
|
},
|
||||||
CaptureEvent::ISRStart => {
|
CaptureEvent::ISRStart => {
|
||||||
// special case for isrs which do not capture their end
|
// special case for isrs which do not capture their end
|
||||||
if meta[i].2 == "isr_starter" {
|
// if meta[i].2 == "isr_starter" {
|
||||||
&2
|
// &2
|
||||||
} else {
|
// } else {
|
||||||
// regular case
|
// regular case
|
||||||
if isr_stack.len() > 0 {
|
if isr_stack.len() > 0 {
|
||||||
let l = isr_stack.back().unwrap();
|
let l = isr_stack.back().unwrap();
|
||||||
@ -213,7 +213,8 @@ fn states2intervals(trace: Vec<ReducedFreeRTOSSystemState>, meta: Vec<(u64, Capt
|
|||||||
} else {
|
} else {
|
||||||
isr_stack.push_back(2);
|
isr_stack.push_back(2);
|
||||||
&2
|
&2
|
||||||
}}
|
}
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
_ => &100
|
_ => &100
|
||||||
};
|
};
|
||||||
@ -261,7 +262,7 @@ fn add_abb_info(trace: &mut Vec<ExecInterval>, table: &HashMap<u64, ReducedFreeR
|
|||||||
(CaptureEvent::APIStart, CaptureEvent::APIEnd ) => {assert_eq!(trace[i].level,1); assert_eq!(open_abb, None); wip_abb_trace.push(Rc::new(RefCell::new(AtomicBasicBlock{start: edges[i].0.unwrap(), ends: HashSet::from([edges[i].1.unwrap()]), level: if trace[i].level<2 {trace[i].level} else {2}})))},
|
(CaptureEvent::APIStart, CaptureEvent::APIEnd ) => {assert_eq!(trace[i].level,1); assert_eq!(open_abb, None); wip_abb_trace.push(Rc::new(RefCell::new(AtomicBasicBlock{start: edges[i].0.unwrap(), ends: HashSet::from([edges[i].1.unwrap()]), level: if trace[i].level<2 {trace[i].level} else {2}})))},
|
||||||
(CaptureEvent::APIStart , CaptureEvent::End ) => {assert_eq!(trace[i].level,1); assert_eq!(open_abb, None); wip_abb_trace.push(Rc::new(RefCell::new(AtomicBasicBlock{start: edges[i].0.unwrap(), ends: HashSet::from([edges[i].1.unwrap()]), level: if trace[i].level<2 {trace[i].level} else {2}})))},
|
(CaptureEvent::APIStart , CaptureEvent::End ) => {assert_eq!(trace[i].level,1); assert_eq!(open_abb, None); wip_abb_trace.push(Rc::new(RefCell::new(AtomicBasicBlock{start: edges[i].0.unwrap(), ends: HashSet::from([edges[i].1.unwrap()]), level: if trace[i].level<2 {trace[i].level} else {2}})))},
|
||||||
// ISR ABB
|
// ISR ABB
|
||||||
(CaptureEvent::ISRStart, CaptureEvent::ISREnd ) => {assert_eq!(open_abb, None); wip_abb_trace.push(Rc::new(RefCell::new(AtomicBasicBlock{start: edges[i].0.unwrap(), ends: HashSet::from([edges[i].1.unwrap()]), level: if trace[i].level<2 {trace[i].level} else {2}})))},
|
(CaptureEvent::ISRStart, CaptureEvent::ISREnd ) => {/*assert_eq!(open_abb, None);*/ wip_abb_trace.push(Rc::new(RefCell::new(AtomicBasicBlock{start: edges[i].0.unwrap(), ends: HashSet::from([edges[i].1.unwrap()]), level: if trace[i].level<2 {trace[i].level} else {2}})))},
|
||||||
(CaptureEvent::ISRStart , CaptureEvent::End ) => {assert_eq!(open_abb, None); wip_abb_trace.push(Rc::new(RefCell::new(AtomicBasicBlock{start: edges[i].0.unwrap(), ends: HashSet::from([edges[i].1.unwrap()]), level: if trace[i].level<2 {trace[i].level} else {2}})))},
|
(CaptureEvent::ISRStart , CaptureEvent::End ) => {assert_eq!(open_abb, None); wip_abb_trace.push(Rc::new(RefCell::new(AtomicBasicBlock{start: edges[i].0.unwrap(), ends: HashSet::from([edges[i].1.unwrap()]), level: if trace[i].level<2 {trace[i].level} else {2}})))},
|
||||||
//
|
//
|
||||||
(_, _) => {
|
(_, _) => {
|
||||||
@ -293,9 +294,17 @@ fn add_abb_info(trace: &mut Vec<ExecInterval>, table: &HashMap<u64, ReducedFreeR
|
|||||||
open_abb_at_this_task_or_level.insert( (trace[i].level, if trace[i].level<2 {&curr_name} else {trace[i].start_capture.1.as_str()}) , i);
|
open_abb_at_this_task_or_level.insert( (trace[i].level, if trace[i].level<2 {&curr_name} else {trace[i].start_capture.1.as_str()}) , i);
|
||||||
task_has_started.insert(curr_name.clone());
|
task_has_started.insert(curr_name.clone());
|
||||||
} else {
|
} else {
|
||||||
// generic case, continue a preempted block
|
if trace[i].start_capture.1 == "isr_starter" { // fix up case for isr starter, which does not always end
|
||||||
let last = open_abb_at_this_task_or_level.get(&(trace[i].level, if trace[i].level<2 {&curr_name} else {trace[i].start_capture.1.as_str()})).expect(&format!("Continued block with no start {} {} {}", trace[i].start_tick, task_has_started.contains(curr_name),trace[i].level));
|
if let Some(last) = open_abb_at_this_task_or_level.get(&(trace[i].level, if trace[i].level<2 {&curr_name} else {trace[i].start_capture.1.as_str()})) {
|
||||||
wip_abb_trace.push(wip_abb_trace[*last].clone());
|
wip_abb_trace.push(wip_abb_trace[*last].clone());
|
||||||
|
} else {
|
||||||
|
wip_abb_trace.push(Rc::new(RefCell::new(AtomicBasicBlock{start: edges[i].1.unwrap(), ends: HashSet::new(), level: if trace[i].level<2 {trace[i].level} else {2}})))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// generic case, continue a preempted block
|
||||||
|
let last = open_abb_at_this_task_or_level.get(&(trace[i].level, if trace[i].level<2 {&curr_name} else {trace[i].start_capture.1.as_str()})).expect(&format!("Continued block with no start {} {:?} {:?} {} {}", trace[i].start_tick, trace[i].start_capture, trace[i].end_capture, task_has_started.contains(curr_name),trace[i].level));
|
||||||
|
wip_abb_trace.push(wip_abb_trace[*last].clone());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
_ => panic!("Undefined block start")
|
_ => panic!("Undefined block start")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user