diff --git a/fuzzers/FRET/benchmark/plot_sqlite.r b/fuzzers/FRET/benchmark/plot_sqlite.r index 913c5d9a8f..fd6221b88b 100644 --- a/fuzzers/FRET/benchmark/plot_sqlite.r +++ b/fuzzers/FRET/benchmark/plot_sqlite.r @@ -8,16 +8,18 @@ args = commandArgs(trailingOnly=TRUE) if (length(args) > 0) { sqlite_file <- args[1] con <- dbConnect(RSQLite::SQLite(), sqlite_file) - } else { - stop("No sqlite file provided") + print("No sqlite file provided, assume defaults") + args = c("bench.sqlite", "remote") + sqlite_file <- args[1] + con <- dbConnect(RSQLite::SQLite(), sqlite_file) } combos <- dbGetQuery(con, "SELECT * FROM combos") casenames <- dbGetQuery(con, "SELECT casename FROM combos GROUP BY casename") toolnames <- dbGetQuery(con, "SELECT toolname FROM combos GROUP BY toolname") -ml2lines <- function(ml) { +ml2lines <- function(ml, casename) { lines = NULL last = 0 for (i in seq_len(dim(ml)[1])) { @@ -28,10 +30,22 @@ ml2lines <- function(ml) { return(lines) } -draw_plot <- function(data) { +draw_plot <- function(data, casename) { MY_COLORS <- c("green", "blue", "red", "magenta", "orange", "cyan", "pink", "gray", "orange", "black", "yellow","brown") LEGEND_POS="bottomright" + ISNS_PER_US = (10**3)/(2**5) + + # Convert timestamp from microseconds to hours + for (n in seq_len(length(data))) { + data[[n]]$timestamp <- data[[n]]$timestamp / 3600000 + data[[n]]$min <- data[[n]]$min / ISNS_PER_US + data[[n]]$max <- data[[n]]$max / ISNS_PER_US + data[[n]]$median <- data[[n]]$median / ISNS_PER_US + data[[n]]$mean <- data[[n]]$mean / ISNS_PER_US + data[[n]]$sdiv <- data[[n]]$sdiv / ISNS_PER_US + } + # draw limits max_x <- max(sapply(data, function(tbl) max(tbl$timestamp, na.rm = TRUE))) max_y <- max(sapply(data, function(tbl) max(tbl$max, na.rm = TRUE))) @@ -40,10 +54,10 @@ draw_plot <- function(data) { # plot setup h_ = 380 w_ = h_*4/3 - png(file=sprintf("test.png"), width=w_, height=h_) + png(file=sprintf("%s/sql_%s.png", args[2],casename), width=w_, height=h_) par(mar=c(4,4,1,1)) par(oma=c(0,0,0,0)) - plot(c(0,max_x),c(min_y,max_y), col='white', xlab="Time [h]", ylab="WCRT estimate [insn]", pch='.') + plot(c(0,max_x),c(min_y,max_y), col='white', xlab="Time [h]", ylab="WCRT estimate [us]", pch='.') # plot data for (n in seq_len(length(data))) { @@ -64,8 +78,9 @@ draw_plot <- function(data) { dev.off() } -for (c in casenames) { - tables <- dbGetQuery(con, sprintf("SELECT * FROM combos WHERE casename == '%s'", c)) +print(casenames[['casename']]) +for (cn in casenames[['casename']]) { + tables <- dbGetQuery(con, sprintf("SELECT * FROM combos WHERE casename == '%s'", cn[[1]])) table_list <- list() for (row in 1:nrow(tables)) { table_name <- tables[row, 'fullname'] @@ -73,7 +88,7 @@ for (c in casenames) { table_data <- dbGetQuery(con, sprintf("SELECT * FROM '%s'", table_name)) table_list[[tool_name]] <- table_data } - draw_plot(table_list) + draw_plot(table_list, cn[[1]]) } dbDisconnect(con) diff --git a/fuzzers/FRET/src/fuzzer.rs b/fuzzers/FRET/src/fuzzer.rs index b0dc07f92e..789b94619c 100644 --- a/fuzzers/FRET/src/fuzzer.rs +++ b/fuzzers/FRET/src/fuzzer.rs @@ -281,10 +281,11 @@ let run_client = |state: Option<_>, mut mgr, _core_id| { unsafe { #[cfg(feature = "fuzz_int")] { + libafl_interrupt_offsets=[[0;MAX_NUM_INTERRUPT];NUM_INTERRUPT_SOURCES]; for &c in &interrupt_config { let (i,_) = c; let name = format!("isr_{}_times",i); - let input_bytes = input.parts_by_name(&name).next().map(|x| x.1.bytes()).unwrap_or(&[0u8; MAX_NUM_INTERRUPT*4]); + let input_bytes = input.parts_by_name(&name).next().map(|x| x.1.bytes()).unwrap_or(&[]); let t = input_bytes_to_interrupt_times(input_bytes, c); for j in 0..t.len() {libafl_interrupt_offsets[i][j]=t[j];} libafl_num_interrupts[i]=t.len(); diff --git a/fuzzers/FRET/src/systemstate/helpers.rs b/fuzzers/FRET/src/systemstate/helpers.rs index 9a9afa87d9..f49bd0a39d 100644 --- a/fuzzers/FRET/src/systemstate/helpers.rs +++ b/fuzzers/FRET/src/systemstate/helpers.rs @@ -118,11 +118,12 @@ pub fn input_bytes_to_interrupt_times(buf: &[u8], config: (usize,u32)) -> Vec