Compare commits

..

2 Commits

3 changed files with 120 additions and 84 deletions

View File

@ -118,6 +118,8 @@ sub execute_query {
my $argsstring = $args->(); my $argsstring = $args->();
my $filenamestring = $filename->(); my $filenamestring = $filename->();
# TODO: Pass the values instead of rewriting db.conf.
# Can also use DBI's database handle directly.
my $result = my $result =
qx{mariadb --defaults-file=$db_conf $argsstring -e "$querystring"}; qx{mariadb --defaults-file=$db_conf $argsstring -e "$querystring"};
die "Query failed: $?" if $? != 0; die "Query failed: $?" if $? != 0;

View File

@ -10,6 +10,7 @@ use lib $FindBin::Bin;
use Util; use Util;
use Mars; use Mars;
use TUI; use TUI;
use Text::CSV_XS;
use feature 'say'; use feature 'say';
@ -246,44 +247,92 @@ my %handlers = (
"--port=$resultbrowser_port" ); "--port=$resultbrowser_port" );
}, },
'14. Run Build in GDB' => sub { '14. Compare Experiment Results' => sub {
my @builds = grep { /linux/ } Util::find_subdirs($local_builds_dir);
my @selected_builds =
TUI::select_from_list( "Select Build to Run in GDB", 0, @builds );
die "No experiment selected" unless @selected_builds;
my $selected_build = $selected_builds[0];
my $build_dir = "$local_builds_dir/$selected_build"; # TODO: To util function (select_experiments,
my $build_name = $selected_build =~ s/.*-.*-.*:.*:.*?_(.*)-.*-.*/$1/r; # could also include the file-existance filter)
my $module_source = "$local_root/build-$build_name"; my @experiments = Util::find_subdirs($local_archive_dir);
say "$build_name"; # Only include experiments with resultsdata.csv
my @viable_experiments;
foreach my $experiment (@experiments) {
push @viable_experiments, $experiment
if ( -f "$local_archive_dir/$experiment/resultsdata.csv" );
}
system( # Select experiments
'gdb', my @selected_experiments =
'--tui', TUI::select_from_list( "Select Experiments to Compare",
'-q', 1, @viable_experiments );
"$build_dir/system.elf", die "No experiments selected" unless @selected_experiments;
'-ex',
"set substitute-path '$module_source' '$build_dir'", # Read results
'-ex', my %all_results;
"set substitute-path '/build/source/core' '$local_wamr/core'", foreach my $experiment (@selected_experiments) {
'-ex',
'break main', # Schema: benchmark, resulttype, faults
'-ex', my $data = Text::CSV_XS::csv(
'break fail_start_trace', in => "$local_archive_dir/$experiment/resultsdata.csv",
'-ex', headers => 'auto'
'break fail_stop_trace', );
'-ex',
'break fail_marker_positive', foreach my $row (@$data) {
'-ex', $all_results{$experiment}{ $row->{benchmark} }
'break fail_marker_detected', { $row->{resulttype} } = $row->{faults};
'-ex', }
'break fail_marker_negative', }
# TODO: To util function
sub format_number_sep {
my ($number) = @_;
1 while $number =~ s/^(-?\d+)(\d{3})/$1.$2/;
return $number;
}
my @benchs = ( 'ip', 'mem', 'regs' );
my @markers = (
'OK_MARKER', 'FAIL_MARKER',
'DETECTED_MARKER', 'TIMEOUT',
'TRAP', 'WRITE_TEXTSEGMENT',
'ACCESS_OUTERSPACE'
); );
my $heading = sprintf( "%5s %20s ", "BENCH", "TYPE" );
foreach my $experiment (@selected_experiments) {
$heading .= sprintf( "%50s ", $experiment );
}
my @entries = ( $heading, "" );
foreach my $benchmark (@benchs) {
foreach my $marker (@markers) {
my $entry = sprintf( "%5s %20s ", $benchmark, $marker );
foreach my $experiment (@selected_experiments) {
if ( exists $all_results{$experiment}{$benchmark}{$marker} )
{
$entry .= sprintf(
"%50s ",
format_number_sep(
$all_results{$experiment}{$benchmark}{$marker}
)
);
}
else {
$entry .= sprintf( "%50s ", "" );
}
}
push @entries, $entry;
}
push @entries, "";
}
TUI::select_from_list(
"Comparing " . scalar(@selected_experiments) . " Experiments",
0, @entries );
}, },
'20. Plot Results' => sub { '15. Plot Results' => sub {
# Generate R ggplot2 charts # Generate R ggplot2 charts
my @experiments = Util::find_subdirs($local_archive_dir); my @experiments = Util::find_subdirs($local_archive_dir);
@ -320,6 +369,43 @@ my %handlers = (
} }
}, },
'16. Run Build in GDB' => sub {
my @builds = grep { /linux/ } Util::find_subdirs($local_builds_dir);
my @selected_builds =
TUI::select_from_list( "Select Build to Run in GDB", 0, @builds );
die "No experiment selected" unless @selected_builds;
my $selected_build = $selected_builds[0];
my $build_dir = "$local_builds_dir/$selected_build";
my $build_name = $selected_build =~ s/.*-.*-.*:.*:.*?_(.*)-.*-.*/$1/r;
my $module_source = "$local_root/build-$build_name";
say "$build_name";
system(
'gdb',
'--tui',
'-q',
"$build_dir/system.elf",
'-ex',
"set substitute-path '$module_source' '$build_dir'",
'-ex',
"set substitute-path '/build/source/core' '$local_wamr/core'",
'-ex',
'break main',
'-ex',
'break fail_start_trace',
'-ex',
'break fail_stop_trace',
'-ex',
'break fail_marker_positive',
'-ex',
'break fail_marker_detected',
'-ex',
'break fail_marker_negative',
);
},
'95. Delete Builds' => sub { '95. Delete Builds' => sub {
# Delete old build files # Delete old build files

View File

@ -18,28 +18,6 @@
.global os_stack .global os_stack
.size os_stack, 4096 .size os_stack, 4096
# NOTE: New Start
# .section .gdt
# gdt_start:
# .quad 0x0000000000000000 # null descriptor
# .quad 0x00cf9a000000ffff # code segment descriptor: base=0, limit=4GB, 32-bit code
# .quad 0x00cf92000000ffff # data segment descriptor: base=0, limit=4GB, 32-bit data
# gdt_end:
#
# gdt_descriptor:
# .word gdt_end - gdt_start - 1 # limit
# .long gdt_start # base
#
# .section .idt
# idt_table:
# .space 256*8 # 256 entries x 8 bytes each
# idt_descriptor:
# .word 256*8-1 # limit
# .long idt_table # base
# NOTE: New End
#.Lstack_bottom: #.Lstack_bottom:
os_stack: os_stack:
.byte 0 .byte 0
@ -57,8 +35,6 @@ os_stack:
.global _start .global _start
.type _start, @function .type _start, @function
_start: _start:
# NOTE: Old Start
# Welcome to kernel mode! # Welcome to kernel mode!
# To set up a stack, we simply set the esp register to point to the top of # To set up a stack, we simply set the esp register to point to the top of
# our stack (as it grows downwards). # our stack (as it grows downwards).
@ -77,34 +53,6 @@ _start:
.Lhang: .Lhang:
jmp .Lhang jmp .Lhang
# NOTE: Old End
# NOTE: New Start
# cli
#
# lgdt gdt_descriptor # GDT
# lidt idt_descriptor # IDT Stub
#
# # set up segment registers (flat 32-bit)
# movw $0x10, %ax
# movw %ax, %ds
# movw %ax, %es
# movw %ax, %fs
# movw %ax, %gs
# movw %ax, %ss
# movl $.Lstack_top, %esp # set stack
#
# # call main C function
# call os_main
#
# cli
# hlt
# .Lhang:
# jmp .Lhang
# NOTE: New End
# Set the size of the _start symbol to the current location '.' minus its start. # Set the size of the _start symbol to the current location '.' minus its start.
# This is useful when debugging or when you implement call tracing. # This is useful when debugging or when you implement call tracing.
.size _start, . - _start .size _start, . - _start