store hashes globally
This commit is contained in:
parent
48e08ce3e7
commit
1c3bc85d48
@ -33,6 +33,8 @@ use log;
|
|||||||
use rand::RngCore;
|
use rand::RngCore;
|
||||||
use crate::templates;
|
use crate::templates;
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
|
use crate::systemstate::target_os::freertos::GlobalFreeRTOSTraceMetadata;
|
||||||
|
use crate::systemstate::target_os::GlobalSystemTraceData;
|
||||||
|
|
||||||
// Constants ================================================================================
|
// Constants ================================================================================
|
||||||
|
|
||||||
@ -102,8 +104,9 @@ macro_rules! do_dump_stg {
|
|||||||
if $cli.dump_graph {
|
if $cli.dump_graph {
|
||||||
let dump_path = $cli.dump_name.clone().unwrap().with_extension(if $c=="" {"dot"} else {$c});
|
let dump_path = $cli.dump_name.clone().unwrap().with_extension(if $c=="" {"dot"} else {$c});
|
||||||
println!("Dumping graph to {:?}", &dump_path);
|
println!("Dumping graph to {:?}", &dump_path);
|
||||||
|
let tcb_index = $state.metadata::<GlobalFreeRTOSTraceMetadata>().unwrap().tcb_index().clone();
|
||||||
if let Some(md) = $state.named_metadata_map_mut().get_mut::<STGFeedbackState<FreeRTOSSystem>>("stgfeedbackstate") {
|
if let Some(md) = $state.named_metadata_map_mut().get_mut::<STGFeedbackState<FreeRTOSSystem>>("stgfeedbackstate") {
|
||||||
let out = md.graph.map(|_i,x| x.color_print(&md.systemstate_index, &md.tcb_index), |_i,x| x.color_print());
|
let out = md.graph.map(|_i,x| x.color_print(&md.systemstate_index, &tcb_index), |_i,x| x.color_print());
|
||||||
let outs = Dot::with_config(&out, &[]).to_string();
|
let outs = Dot::with_config(&out, &[]).to_string();
|
||||||
let outs = outs.replace("\\\"","\"");
|
let outs = outs.replace("\\\"","\"");
|
||||||
let outs = outs.replace(';',"\\n");
|
let outs = outs.replace(';',"\\n");
|
||||||
|
@ -17,7 +17,7 @@ use super::target_os::TargetSystem;
|
|||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
use crate::systemstate::{stg::STGFeedbackState, target_os::*};
|
use crate::systemstate::{stg::STGFeedbackState, target_os::{freertos::GlobalFreeRTOSTraceMetadata, *}};
|
||||||
use libafl::prelude::StateInitializer;
|
use libafl::prelude::StateInitializer;
|
||||||
|
|
||||||
//=========================== Debugging Feedback
|
//=========================== Debugging Feedback
|
||||||
@ -80,9 +80,9 @@ where {
|
|||||||
.metadata::<SYS::TraceData>()
|
.metadata::<SYS::TraceData>()
|
||||||
.expect("TraceData not found").clone();
|
.expect("TraceData not found").clone();
|
||||||
let tcb_index = state
|
let tcb_index = state
|
||||||
.metadata::<STGFeedbackState<SYS>>()
|
.metadata::<SYS::GlobalTraceData>()
|
||||||
.expect("STGFeedbackState not found")
|
.expect("STGFeedbackState not found")
|
||||||
.tcb_index.clone();
|
.tcb_index().clone();
|
||||||
std::fs::write(
|
std::fs::write(
|
||||||
tracename,
|
tracename,
|
||||||
ron::to_string(&(trace, tcb_index))
|
ron::to_string(&(trace, tcb_index))
|
||||||
|
@ -162,7 +162,6 @@ where
|
|||||||
// aggregated traces as a graph
|
// aggregated traces as a graph
|
||||||
pub graph: DiGraph<STGNode<SYS>, STGEdge>,
|
pub graph: DiGraph<STGNode<SYS>, STGEdge>,
|
||||||
pub systemstate_index: HashMap<HashIndex, SYS::State>,
|
pub systemstate_index: HashMap<HashIndex, SYS::State>,
|
||||||
pub tcb_index: HashMap<HashIndex, SYS::TCB>,
|
|
||||||
pub state_abb_hash_index: HashMap<(u64, u64), NodeIndex>,
|
pub state_abb_hash_index: HashMap<(u64, u64), NodeIndex>,
|
||||||
stgnode_index: HashMap<u64, NodeIndex>,
|
stgnode_index: HashMap<u64, NodeIndex>,
|
||||||
entrypoint: NodeIndex,
|
entrypoint: NodeIndex,
|
||||||
@ -232,7 +231,6 @@ where
|
|||||||
wort_per_stg_path: HashMap::new(),
|
wort_per_stg_path: HashMap::new(),
|
||||||
worst_abb_exec_count: HashMap::new(),
|
worst_abb_exec_count: HashMap::new(),
|
||||||
systemstate_index,
|
systemstate_index,
|
||||||
tcb_index,
|
|
||||||
state_abb_hash_index,
|
state_abb_hash_index,
|
||||||
worst_task_jobs: HashMap::new(),
|
worst_task_jobs: HashMap::new(),
|
||||||
}
|
}
|
||||||
|
@ -119,12 +119,12 @@ impl FreeRTOSSystemStateModule {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S, I> EmulatorModule<I, S> for FreeRTOSSystemStateHelper
|
impl<I, S> EmulatorModule<I, S> for FreeRTOSSystemStateModule
|
||||||
where
|
where
|
||||||
S: Unpin + HasMetadata,
|
S: Unpin + HasMetadata,
|
||||||
I: Unpin,
|
I: Unpin,
|
||||||
{
|
{
|
||||||
fn first_exec<ET>(&mut self, _qemu: Qemu, emulator_modules: &mut EmulatorModules<ET, I, S>, _state: &mut S)
|
fn first_exec<ET>(&mut self, _qemu: Qemu, emulator_modules: &mut EmulatorModules<ET, I, S>, state: &mut S)
|
||||||
where
|
where
|
||||||
ET: EmulatorModuleTuple<I, S>,
|
ET: EmulatorModuleTuple<I, S>,
|
||||||
{
|
{
|
||||||
@ -150,6 +150,21 @@ where
|
|||||||
ReadExecHook::Empty,
|
ReadExecHook::Empty,
|
||||||
ReadExecNHook::Function(trace_reads::<ET, I, S>),
|
ReadExecNHook::Function(trace_reads::<ET, I, S>),
|
||||||
);
|
);
|
||||||
|
if !state.has_metadata::<GlobalFreeRTOSTraceMetadata>() {
|
||||||
|
let mut data = GlobalFreeRTOSTraceMetadata::default();
|
||||||
|
|
||||||
|
let mut start_tcb = RefinedTCB::default();
|
||||||
|
*start_tcb.task_name_mut()="Start".to_string();
|
||||||
|
let h_start_tcb = compute_hash(&start_tcb);
|
||||||
|
data.tcb_index_mut().insert(h_start_tcb, start_tcb);
|
||||||
|
|
||||||
|
let mut end_tcb = RefinedTCB::default();
|
||||||
|
*end_tcb.task_name_mut()="End".to_string();
|
||||||
|
let h_end_tcb = compute_hash(&end_tcb);
|
||||||
|
data.tcb_index_mut().insert(h_end_tcb, end_tcb);
|
||||||
|
|
||||||
|
state.add_metadata(data);
|
||||||
|
}
|
||||||
unsafe { INPUT_MEM = self.input_mem.clone() };
|
unsafe { INPUT_MEM = self.input_mem.clone() };
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,9 +294,9 @@ where
|
|||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
jobs
|
jobs
|
||||||
};
|
};
|
||||||
_state.metadata_mut::<STGFeedbackState<FreeRTOSSystem>>()
|
_state.metadata_mut::<GlobalFreeRTOSTraceMetadata>()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.tcb_index
|
.tcb_index_mut()
|
||||||
.extend(tcb_map.into_iter());
|
.extend(tcb_map.into_iter());
|
||||||
_state.add_metadata(FreeRTOSTraceMetadata::new(refined_states, intervals, mem_reads, jobs, need_to_debug));
|
_state.add_metadata(FreeRTOSTraceMetadata::new(refined_states, intervals, mem_reads, jobs, need_to_debug));
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ impl TargetSystem for FreeRTOSSystem {
|
|||||||
type State = FreeRTOSSystemState;
|
type State = FreeRTOSSystemState;
|
||||||
type TCB = RefinedTCB;
|
type TCB = RefinedTCB;
|
||||||
type TraceData = FreeRTOSTraceMetadata;
|
type TraceData = FreeRTOSTraceMetadata;
|
||||||
|
type GlobalTraceData = GlobalFreeRTOSTraceMetadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TaskControlBlock for RefinedTCB {
|
impl TaskControlBlock for RefinedTCB {
|
||||||
@ -279,6 +280,36 @@ pub(super)struct FreeRTOSSystemStateContext {
|
|||||||
pub mem_reads: Vec<(u32, u8)>,
|
pub mem_reads: Vec<(u32, u8)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
|
||||||
|
pub struct GlobalFreeRTOSTraceMetadata
|
||||||
|
{
|
||||||
|
pub tcb_index: HashMap<HashIndex, <<FreeRTOSTraceMetadata as SystemTraceData>::State as SystemState>::TCB>,
|
||||||
|
tcref: isize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GlobalSystemTraceData for GlobalFreeRTOSTraceMetadata
|
||||||
|
{
|
||||||
|
type State = FreeRTOSSystemState;
|
||||||
|
type TCB = RefinedTCB;
|
||||||
|
|
||||||
|
fn tcb_index(&self) -> &HashMap<HashIndex, Self::TCB> {
|
||||||
|
&self.tcb_index
|
||||||
|
}
|
||||||
|
fn tcb_index_mut(&mut self) -> &mut HashMap<HashIndex, Self::TCB> {
|
||||||
|
&mut self.tcb_index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HasRefCnt for GlobalFreeRTOSTraceMetadata
|
||||||
|
{
|
||||||
|
fn refcnt(&self) -> isize {
|
||||||
|
self.tcref
|
||||||
|
}
|
||||||
|
|
||||||
|
fn refcnt_mut(&mut self) -> &mut isize {
|
||||||
|
&mut self.tcref
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
|
||||||
pub struct FreeRTOSTraceMetadata
|
pub struct FreeRTOSTraceMetadata
|
||||||
@ -368,6 +399,7 @@ impl SystemTraceData for FreeRTOSTraceMetadata
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
libafl_bolts::impl_serdeany!(GlobalFreeRTOSTraceMetadata);
|
||||||
libafl_bolts::impl_serdeany!(FreeRTOSTraceMetadata);
|
libafl_bolts::impl_serdeany!(FreeRTOSTraceMetadata);
|
||||||
libafl_bolts::impl_serdeany!(RefinedTCB);
|
libafl_bolts::impl_serdeany!(RefinedTCB);
|
||||||
libafl_bolts::impl_serdeany!(FreeRTOSSystemState);
|
libafl_bolts::impl_serdeany!(FreeRTOSSystemState);
|
||||||
|
@ -29,6 +29,8 @@ pub trait TargetSystem: Serialize + Sized + for<'de> Deserialize<'de> + Default
|
|||||||
type TCB: TaskControlBlock;
|
type TCB: TaskControlBlock;
|
||||||
/// The type used to store trace data for the system.
|
/// The type used to store trace data for the system.
|
||||||
type TraceData: SystemTraceData<State = Self::State>;
|
type TraceData: SystemTraceData<State = Self::State>;
|
||||||
|
// The type used to store global trace data for the system.
|
||||||
|
type GlobalTraceData: GlobalSystemTraceData<State = Self::State, TCB = Self::TCB>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A trait representing the system state of a target system, which includes methods to access the current task.
|
/// A trait representing the system state of a target system, which includes methods to access the current task.
|
||||||
@ -43,6 +45,14 @@ pub trait SystemState: Serialize + Sized + for<'a> Deserialize<'a> + Default + D
|
|||||||
fn print_lists(&self, tcb_index: &HashMap<HashIndex, Self::TCB>) -> String;
|
fn print_lists(&self, tcb_index: &HashMap<HashIndex, Self::TCB>) -> String;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait GlobalSystemTraceData: Serialize + Sized + for<'a> Deserialize<'a> + Default + Debug + Clone + SerdeAny + HasRefCnt {
|
||||||
|
type State: SystemState;
|
||||||
|
type TCB: TaskControlBlock;
|
||||||
|
|
||||||
|
fn tcb_index(&self) -> &HashMap<HashIndex, Self::TCB>;
|
||||||
|
fn tcb_index_mut(&mut self) -> &mut HashMap<HashIndex, Self::TCB>;
|
||||||
|
}
|
||||||
|
|
||||||
pub trait SystemTraceData: Serialize + Sized + for<'a> Deserialize<'a> + Default + Debug + Clone + SerdeAny + HasRefCnt {
|
pub trait SystemTraceData: Serialize + Sized + for<'a> Deserialize<'a> + Default + Debug + Clone + SerdeAny + HasRefCnt {
|
||||||
type State: SystemState;
|
type State: SystemState;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user