Compare commits
2 Commits
e36cfdc07d
...
5ff6f6d0d8
| Author | SHA1 | Date | |
|---|---|---|---|
|
5ff6f6d0d8
|
|||
|
6c7351b3d1
|
@ -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;
|
||||||
|
|||||||
150
scripts/menu.pl
150
scripts/menu.pl
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user