aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/cover/html.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/cover/html.go')
-rw-r--r--pkg/cover/html.go100
1 files changed, 95 insertions, 5 deletions
diff --git a/pkg/cover/html.go b/pkg/cover/html.go
index 63b1506c1..7afe8b54c 100644
--- a/pkg/cover/html.go
+++ b/pkg/cover/html.go
@@ -21,9 +21,43 @@ import (
"github.com/google/syzkaller/pkg/cover/backend"
"github.com/google/syzkaller/pkg/mgrconfig"
+ "github.com/google/syzkaller/sys/targets"
)
-func (rg *ReportGenerator) DoHTML(w io.Writer, progs []Prog) error {
+func fixUpPCs(target string, progs []Prog, coverFilter map[uint32]uint32) []Prog {
+ if coverFilter != nil {
+ for _, prog := range progs {
+ var nPCs []uint64
+ for _, pc := range prog.PCs {
+ if coverFilter[uint32(pc)] != 0 {
+ nPCs = append(nPCs, pc)
+ }
+ }
+ prog.PCs = nPCs
+ }
+ }
+
+ // On arm64 as PLT is enabled by default, .text section is loaded after .plt section,
+ // so there is 0x18 bytes offset from module load address for .text section
+ // we need to remove the 0x18 bytes offset in order to correct module symbol address
+ if target == targets.ARM64 {
+ for _, prog := range progs {
+ var nPCs []uint64
+ for _, pc := range prog.PCs {
+ // TODO: avoid to hardcode the address
+ if pc < 0xffffffd010000000 {
+ pc -= 0x18
+ }
+ nPCs = append(nPCs, pc)
+ }
+ prog.PCs = nPCs
+ }
+ }
+ return progs
+}
+
+func (rg *ReportGenerator) DoHTML(w io.Writer, progs []Prog, coverFilter map[uint32]uint32) error {
+ progs = fixUpPCs(rg.target.Arch, progs, coverFilter)
files, err := rg.prepareFileMap(progs)
if err != nil {
return err
@@ -106,7 +140,8 @@ func (rg *ReportGenerator) DoHTML(w io.Writer, progs []Prog) error {
return coverTemplate.Execute(w, d)
}
-func (rg *ReportGenerator) DoRawCoverFiles(w http.ResponseWriter, progs []Prog) error {
+func (rg *ReportGenerator) DoRawCoverFiles(w http.ResponseWriter, progs []Prog, coverFilter map[uint32]uint32) error {
+ progs = fixUpPCs(rg.target.Arch, progs, coverFilter)
if err := rg.lazySymbolize(progs); err != nil {
return err
}
@@ -125,6 +160,58 @@ func (rg *ReportGenerator) DoRawCoverFiles(w http.ResponseWriter, progs []Prog)
return nil
}
+func (rg *ReportGenerator) DoRawCover(w http.ResponseWriter, progs []Prog, coverFilter map[uint32]uint32) {
+ progs = fixUpPCs(rg.target.Arch, progs, coverFilter)
+ var pcs []uint64
+ uniquePCs := make(map[uint64]bool)
+ for _, prog := range progs {
+ for _, pc := range prog.PCs {
+ if uniquePCs[pc] {
+ continue
+ }
+ uniquePCs[pc] = true
+ pcs = append(pcs, pc)
+ }
+ }
+ sort.Slice(pcs, func(i, j int) bool {
+ return pcs[i] < pcs[j]
+ })
+
+ w.Header().Set("Content-Type", "text/plain; charset=utf-8")
+ buf := bufio.NewWriter(w)
+ for _, pc := range pcs {
+ fmt.Fprintf(buf, "0x%x\n", pc)
+ }
+ buf.Flush()
+}
+
+func (rg *ReportGenerator) DoFilterPCs(w http.ResponseWriter, progs []Prog, coverFilter map[uint32]uint32) {
+ progs = fixUpPCs(rg.target.Arch, progs, coverFilter)
+ var pcs []uint64
+ uniquePCs := make(map[uint64]bool)
+ for _, prog := range progs {
+ for _, pc := range prog.PCs {
+ if uniquePCs[pc] {
+ continue
+ }
+ uniquePCs[pc] = true
+ if coverFilter[uint32(pc)] != 0 {
+ pcs = append(pcs, pc)
+ }
+ }
+ }
+ sort.Slice(pcs, func(i, j int) bool {
+ return pcs[i] < pcs[j]
+ })
+
+ w.Header().Set("Content-Type", "text/plain; charset=utf-8")
+ buf := bufio.NewWriter(w)
+ for _, pc := range pcs {
+ fmt.Fprintf(buf, "0x%x\n", pc)
+ }
+ buf.Flush()
+}
+
type fileStats struct {
Name string
CoveredLines int
@@ -200,7 +287,8 @@ func (rg *ReportGenerator) convertToStats(progs []Prog) ([]fileStats, error) {
return data, nil
}
-func (rg *ReportGenerator) DoCSVFiles(w io.Writer, progs []Prog) error {
+func (rg *ReportGenerator) DoCSVFiles(w io.Writer, progs []Prog, coverFilter map[uint32]uint32) error {
+ progs = fixUpPCs(rg.target.Arch, progs, coverFilter)
data, err := rg.convertToStats(progs)
if err != nil {
return err
@@ -298,7 +386,8 @@ func groupCoverByFilePrefixes(datas []fileStats, subsystems []mgrconfig.Subsyste
return d
}
-func (rg *ReportGenerator) DoHTMLTable(w io.Writer, progs []Prog) error {
+func (rg *ReportGenerator) DoHTMLTable(w io.Writer, progs []Prog, coverFilter map[uint32]uint32) error {
+ progs = fixUpPCs(rg.target.Arch, progs, coverFilter)
data, err := rg.convertToStats(progs)
if err != nil {
return err
@@ -316,7 +405,8 @@ var csvHeader = []string{
"Total PCs",
}
-func (rg *ReportGenerator) DoCSV(w io.Writer, progs []Prog) error {
+func (rg *ReportGenerator) DoCSV(w io.Writer, progs []Prog, coverFilter map[uint32]uint32) error {
+ progs = fixUpPCs(rg.target.Arch, progs, coverFilter)
files, err := rg.prepareFileMap(progs)
if err != nil {
return err