From c785e0db86d49bc4915231df90274c3e971c6e3d Mon Sep 17 00:00:00 2001 From: Alwin Berger Date: Mon, 26 Aug 2024 15:14:10 +0200 Subject: [PATCH] fix jobs with response==release --- fuzzers/FRET/benchmark/target_symbols.csv | 49 +++++++++++------------ fuzzers/FRET/src/systemstate/observers.rs | 25 ++++++++++-- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/fuzzers/FRET/benchmark/target_symbols.csv b/fuzzers/FRET/benchmark/target_symbols.csv index 58198c7698..05fc8259dc 100644 --- a/fuzzers/FRET/benchmark/target_symbols.csv +++ b/fuzzers/FRET/benchmark/target_symbols.csv @@ -1,20 +1,20 @@ -kernel,main_function,input_symbol,input_size,return_function,target_task_name -mpeg2,mpeg2_main,mpeg2_oldorgframe,90112,mpeg2_return, -audiobeam,audiobeam_main,audiobeam_input,11520,audiobeam_return, -epic,epic_main,epic_image,4096,epic_return, -dijkstra,dijkstra_main,dijkstra_AdjMatrix,10000,dijkstra_return, -fft,fft_main,fft_twidtable,2046,fft_return, -bsort,bsort_main,bsort_Array,400,bsort_return, -insertsort,insertsort_main,insertsort_a,400,insertsort_return, -g723_enc,g723_enc_main,g723_enc_INPUT,1024,g723_enc_return, -rijndael_dec,rijndael_dec_main,rijndael_dec_data,32768,rijndael_dec_return, -rijndael_enc,rijndael_enc_main,rijndael_enc_data,31369,rijndael_enc_return, -huff_dec,huff_dec_main,huff_dec_encoded,419,huff_dec_return, -huff_enc,huff_enc_main,huff_enc_plaintext,600,huff_enc_return, -gsm_enc,gsm_enc_main,gsm_enc_pcmdata,6400,gsm_enc_return, -tmr,main,FUZZ_INPUT,32,trigger_Qemu_break, -tacle_rtos,prvStage0,FUZZ_INPUT,604,trigger_Qemu_break, -lift,main_lift,FUZZ_INPUT,100,trigger_Qemu_break, +kernel,main_function,input_symbol,input_size,return_function,select_task +mpeg2,mpeg2_main,mpeg2_oldorgframe,90112,mpeg2_return,NONE +audiobeam,audiobeam_main,audiobeam_input,11520,audiobeam_return,NONE +epic,epic_main,epic_image,4096,epic_return,NONE +dijkstra,dijkstra_main,dijkstra_AdjMatrix,10000,dijkstra_return,NONE +fft,fft_main,fft_twidtable,2046,fft_return,NONE +bsort,bsort_main,bsort_Array,400,bsort_return,NONE +insertsort,insertsort_main,insertsort_a,400,insertsort_return,NONE +g723_enc,g723_enc_main,g723_enc_INPUT,1024,g723_enc_return,NONE +rijndael_dec,rijndael_dec_main,rijndael_dec_data,32768,rijndael_dec_return,NONE +rijndael_enc,rijndael_enc_main,rijndael_enc_data,31369,rijndael_enc_return,NONE +huff_dec,huff_dec_main,huff_dec_encoded,419,huff_dec_return,NONE +huff_enc,huff_enc_main,huff_enc_plaintext,600,huff_enc_return,NONE +gsm_enc,gsm_enc_main,gsm_enc_pcmdata,6400,gsm_enc_return,NONE +tmr,main,FUZZ_INPUT,32,trigger_Qemu_break,NONE +tacle_rtos,prvStage0,FUZZ_INPUT,604,trigger_Qemu_break,NONE +lift,main_lift,FUZZ_INPUT,100,trigger_Qemu_break,NONE waters,main_waters,FUZZ_INPUT,4096,trigger_Qemu_break,1129 watersv2,main_waters,FUZZ_INPUT,4096,trigger_Qemu_break,1129 waterspart,main_waters,FUZZ_INPUT,4096,trigger_Qemu_break,1129 @@ -23,11 +23,10 @@ waters_int,main_waters,FUZZ_INPUT,4096,trigger_Qemu_break,1129 watersv2_int,main_waters,FUZZ_INPUT,4096,trigger_Qemu_break,1129 waterspart_int,main_waters,FUZZ_INPUT,4096,trigger_Qemu_break,1129 waterspartv2_int,main_waters,FUZZ_INPUT,4096,trigger_Qemu_break,1129 -micro_branchless,main_branchless,FUZZ_INPUT,4,trigger_Qemu_break, -micro_int,main_int,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, -gen3,main_minimal,FUZZ_INPUT,4096,trigger_Qemu_break, -interact,main_interact,FUZZ_INPUT,4096,trigger_Qemu_break, -interact_int,main_interact,FUZZ_INPUT,4096,trigger_Qemu_break, - +micro_branchless,main_branchless,FUZZ_INPUT,4,trigger_Qemu_break,NONE +micro_int,main_int,FUZZ_INPUT,16,trigger_Qemu_break,NONE +micro_longint,main_micro_longint,FUZZ_INPUT,16,trigger_Qemu_break,NONE +minimal,main_minimal,FUZZ_INPUT,4096,trigger_Qemu_break,NONE +gen3,main_minimal,FUZZ_INPUT,4096,trigger_Qemu_break,NONE +interact,main_interact,FUZZ_INPUT,4096,trigger_Qemu_break,NONE +interact_int,main_interact,FUZZ_INPUT,4096,trigger_Qemu_break,NONE diff --git a/fuzzers/FRET/src/systemstate/observers.rs b/fuzzers/FRET/src/systemstate/observers.rs index be7041d0dc..6de308abec 100644 --- a/fuzzers/FRET/src/systemstate/observers.rs +++ b/fuzzers/FRET/src/systemstate/observers.rs @@ -253,6 +253,7 @@ fn get_releases(tarce: &Vec, states: &HashMap, resp: &Vec<(u64, String)>) -> Vec<(u64, u64, String)> { let mut ret = Vec::new(); let mut ready : HashMap<&String, u64> = HashMap::new(); + let mut last_response : HashMap<&String, u64> = HashMap::new(); let mut r = rel.iter().peekable(); let mut d = resp.iter().peekable(); loop { @@ -262,9 +263,10 @@ fn get_release_response_pairs(rel: &Vec<(u64, String)>, resp: &Vec<(u64, String) r.next(); } else { if let Some(peek_resp) = d.peek() { - if peek_resp.0 > peek_rel.0 { // multiple releases before response, only use the latest release - eprintln!("Task {} released multiple times before response", peek_rel.1); - ready.insert(&peek_rel.1, peek_rel.0); + if peek_resp.0 > peek_rel.0 { // multiple releases before response + // It is unclear which release is real + eprintln!("Task {} released multiple times before response ({}ms and {}ms)", peek_rel.1, crate::time::clock::tick_to_time(ready[&peek_rel.1]).as_millis(), crate::time::clock::tick_to_time(peek_rel.0).as_millis()); + // ready.insert(&peek_rel.1, peek_rel.0); r.next(); } } @@ -274,14 +276,29 @@ fn get_release_response_pairs(rel: &Vec<(u64, String)>, resp: &Vec<(u64, String) if let Some(next_resp) = d.next() { if ready.contains_key(&next_resp.1) { if ready[&next_resp.1] >= next_resp.0 { + if let Some(lr) = last_response.get(&next_resp.1) { + // Sometimes a task is released immediately after a response. This might not be detected. + // Assume that the release occured with the last response + ret.push((*lr, next_resp.0, next_resp.1.clone())); + last_response.insert(&next_resp.1, next_resp.0); + } else { eprintln!("Task {} released after response", next_resp.1); + } } else { // assert!(peek_resp.0 >= ready[&peek_resp.1]); + last_response.insert(&next_resp.1, next_resp.0); ret.push((ready[&next_resp.1], next_resp.0, next_resp.1.clone())); ready.remove(&next_resp.1); } } else { - eprintln!("Task {} not found in ready list", next_resp.1); + if let Some(lr) = last_response.get(&next_resp.1) { + // Sometimes a task is released immediately after a response. This might not be detected. + // Assume that the release occured with the last response + ret.push((*lr, next_resp.0, next_resp.1.clone())); + last_response.insert(&next_resp.1, next_resp.0); + } else { + eprintln!("Task {} response at {}ms not found in ready list", next_resp.1, crate::time::clock::tick_to_time(next_resp.0).as_millis()); + } } } else { // TODO: should remaining released tasks be counted as finished?