#!/usr/bin/env perl # # Load a code coverage report from SimH and a kernel assembly listing # from as7, and show which lines in the kernel were not executed. # # To capture the list of executed locations in SimH, run SimH but stop # before executing any code, e.g. dep pc 0100 but don't go. # # Run this command to log execution of locations 21-4545: # set br 21-4545[200000000] # # Eventually, ctrl-E to stop execution. Now dump the results: # show @brk.list break all # # which will output a BRK.LIST Then run this command: # ccov7 BRK.LIST a.lst | less # # # (c) 2016 Warren Toomey, GPL3 # use strict; use warnings; use Data::Dumper; die("Usage: $0 breaklist_file a.lst\n") if (@ARGV !=2); # Read in the breaklist file and work out which lines were not # used. We assume that [200000000] was used in SimH my @Unused; open(my $IN, "<", $ARGV[0]) || die("Can't open $ARGV[0]: $!\n"); while (<$IN>) { if (m{^(\d+):.*\[(\d+)\]}) { $Unused[$1]=1 if ($2 == 200000000); } } close($IN); # Now open the kernel listing file. Decorate those lines which # were not executed my $decoration= "\t NOT EXECUTED"; open($IN, "<", $ARGV[1]) || die("Can't open $ARGV[1]: $!\n"); while (<$IN>) { chomp; if (m{^(\d+):}) { # Find a line starting with digits, trim my $location= $1; # leading zeroes, append $decoration $location=~ s{^0+}{}; # if this is an unused location $_ .= $decoration if (defined($Unused[$location])); } print("$_\n"); } close($IN); exit(0);