aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/cover
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2025-03-27 10:34:07 +0100
committerTaras Madan <tarasmadan@google.com>2025-03-27 10:07:16 +0000
commitc66ac62e1284de84775ccf0edf94f224db8b4509 (patch)
tree885bf4ba80bcd8b722ea76c2dd530a48b380c985 /pkg/cover
parentb181c36d588da8d6007a23c0ad7305893758cec5 (diff)
pkg: use kernelDir instead of 3 parameters
It allows to reduce parameters count for some functions.
Diffstat (limited to 'pkg/cover')
-rw-r--r--pkg/cover/backend/backend.go10
-rw-r--r--pkg/cover/backend/dwarf.go39
-rw-r--r--pkg/cover/backend/elf.go6
-rw-r--r--pkg/cover/backend/gvisor.go7
-rw-r--r--pkg/cover/backend/mach-o.go7
-rw-r--r--pkg/cover/report.go3
6 files changed, 33 insertions, 39 deletions
diff --git a/pkg/cover/backend/backend.go b/pkg/cover/backend/backend.go
index 7e8e7f8b8..119c8f369 100644
--- a/pkg/cover/backend/backend.go
+++ b/pkg/cover/backend/backend.go
@@ -66,16 +66,16 @@ type SecRange struct {
const LineEnd = 1 << 30
-func Make(target *targets.Target, vm, objDir, srcDir, buildDir string, splitBuild bool,
+func Make(target *targets.Target, vm string, kernelDirs *mgrconfig.KernelDirs, splitBuild bool,
moduleObj []string, modules []*vminfo.KernelModule) (*Impl, error) {
- if objDir == "" {
+ if kernelDirs.Obj == "" {
return nil, fmt.Errorf("kernel obj directory is not specified")
}
if target.OS == targets.Darwin {
- return makeMachO(target, objDir, srcDir, buildDir, moduleObj, modules)
+ return makeMachO(target, kernelDirs, moduleObj, modules)
}
if vm == targets.GVisor {
- return makeGvisor(target, objDir, srcDir, buildDir, modules)
+ return makeGvisor(target, kernelDirs, modules)
}
var delimiters []string
if splitBuild {
@@ -84,7 +84,7 @@ func Make(target *targets.Target, vm, objDir, srcDir, buildDir string, splitBuil
// details.
delimiters = []string{"/aosp/", "/private/"}
}
- return makeELF(target, objDir, srcDir, buildDir, delimiters, moduleObj, modules)
+ return makeELF(target, kernelDirs, delimiters, moduleObj, modules)
}
func GetPCBase(cfg *mgrconfig.Config) (uint64, error) {
diff --git a/pkg/cover/backend/dwarf.go b/pkg/cover/backend/dwarf.go
index 7be2832d3..2ace50ce6 100644
--- a/pkg/cover/backend/dwarf.go
+++ b/pkg/cover/backend/dwarf.go
@@ -19,6 +19,7 @@ import (
"strings"
"github.com/google/syzkaller/pkg/log"
+ "github.com/google/syzkaller/pkg/mgrconfig"
"github.com/google/syzkaller/pkg/osutil"
"github.com/google/syzkaller/pkg/symbolizer"
"github.com/google/syzkaller/pkg/vminfo"
@@ -27,9 +28,7 @@ import (
type dwarfParams struct {
target *targets.Target
- objDir string
- srcDir string
- buildDir string
+ kernelDirs *mgrconfig.KernelDirs
splitBuildDelimiters []string
moduleObj []string
hostModules []*vminfo.KernelModule
@@ -139,9 +138,7 @@ func processModule(params *dwarfParams, module *vminfo.KernelModule, info *symbo
func makeDWARFUnsafe(params *dwarfParams) (*Impl, error) {
target := params.target
- objDir := params.objDir
- srcDir := params.srcDir
- buildDir := params.buildDir
+ kernelDirs := params.kernelDirs
splitBuildDelimiters := params.splitBuildDelimiters
modules := params.hostModules
@@ -231,7 +228,7 @@ func makeDWARFUnsafe(params *dwarfParams) (*Impl, error) {
continue // drop the unit
}
// TODO: objDir won't work for out-of-tree modules.
- unit.Name, unit.Path = CleanPath(unit.Name, objDir, srcDir, buildDir, splitBuildDelimiters)
+ unit.Name, unit.Path = CleanPath(unit.Name, kernelDirs, splitBuildDelimiters)
allUnits[nunit] = unit
nunit++
}
@@ -244,7 +241,7 @@ func makeDWARFUnsafe(params *dwarfParams) (*Impl, error) {
Units: allUnits,
Symbols: allSymbols,
Symbolize: func(pcs map[*vminfo.KernelModule][]uint64) ([]*Frame, error) {
- return symbolize(target, &interner, objDir, srcDir, buildDir, splitBuildDelimiters, pcs)
+ return symbolize(target, &interner, kernelDirs, splitBuildDelimiters, pcs)
},
CallbackPoints: allCoverPoints[0],
PreciseCoverage: preciseCoverage,
@@ -401,7 +398,7 @@ func readTextRanges(debugInfo *dwarf.Data, module *vminfo.KernelModule, pcFix pc
return ranges, units, nil
}
-func symbolizeModule(target *targets.Target, interner *symbolizer.Interner, objDir, srcDir, buildDir string,
+func symbolizeModule(target *targets.Target, interner *symbolizer.Interner, kernelDirs *mgrconfig.KernelDirs,
splitBuildDelimiters []string, mod *vminfo.KernelModule, pcs []uint64) ([]*Frame, error) {
procs := min(runtime.GOMAXPROCS(0)/2, len(pcs)/1000)
const (
@@ -453,7 +450,7 @@ func symbolizeModule(target *targets.Target, interner *symbolizer.Interner, objD
err0 = res.err
}
for _, frame := range res.frames {
- name, path := CleanPath(frame.File, objDir, srcDir, buildDir, splitBuildDelimiters)
+ name, path := CleanPath(frame.File, kernelDirs, splitBuildDelimiters)
pc := frame.PC
if mod.Name != "" {
pc = frame.PC + mod.Addr
@@ -480,7 +477,7 @@ func symbolizeModule(target *targets.Target, interner *symbolizer.Interner, objD
return frames, nil
}
-func symbolize(target *targets.Target, interner *symbolizer.Interner, objDir, srcDir, buildDir string,
+func symbolize(target *targets.Target, interner *symbolizer.Interner, kernelDirs *mgrconfig.KernelDirs,
splitBuildDelimiters []string, pcs map[*vminfo.KernelModule][]uint64) ([]*Frame, error) {
var frames []*Frame
type frameResult struct {
@@ -490,7 +487,7 @@ func symbolize(target *targets.Target, interner *symbolizer.Interner, objDir, sr
frameC := make(chan frameResult, len(pcs))
for mod, pcs1 := range pcs {
go func(mod *vminfo.KernelModule, pcs []uint64) {
- frames, err := symbolizeModule(target, interner, objDir, srcDir, buildDir, splitBuildDelimiters, mod, pcs)
+ frames, err := symbolizeModule(target, interner, kernelDirs, splitBuildDelimiters, mod, pcs)
frameC <- frameResult{frames: frames, err: err}
}(mod, pcs1)
}
@@ -585,27 +582,27 @@ func cleanPathAndroid(path, srcDir string, delimiters []string, existFn func(str
return "", ""
}
-func CleanPath(path, objDir, srcDir, buildDir string, splitBuildDelimiters []string) (string, string) {
+func CleanPath(path string, kernelDirs *mgrconfig.KernelDirs, splitBuildDelimiters []string) (string, string) {
filename := ""
path = filepath.Clean(path)
- aname, apath := cleanPathAndroid(path, srcDir, splitBuildDelimiters, osutil.IsExist)
+ aname, apath := cleanPathAndroid(path, kernelDirs.Src, splitBuildDelimiters, osutil.IsExist)
if aname != "" {
return aname, apath
}
absPath := osutil.Abs(path)
switch {
- case strings.HasPrefix(absPath, objDir):
+ case strings.HasPrefix(absPath, kernelDirs.Obj):
// Assume the file was built there.
- path = strings.TrimPrefix(absPath, objDir)
- filename = filepath.Join(objDir, path)
- case strings.HasPrefix(absPath, buildDir):
+ path = strings.TrimPrefix(absPath, kernelDirs.Obj)
+ filename = filepath.Join(kernelDirs.Obj, path)
+ case strings.HasPrefix(absPath, kernelDirs.BuildSrc):
// Assume the file was moved from buildDir to srcDir.
- path = strings.TrimPrefix(absPath, buildDir)
- filename = filepath.Join(srcDir, path)
+ path = strings.TrimPrefix(absPath, kernelDirs.BuildSrc)
+ filename = filepath.Join(kernelDirs.Src, path)
default:
// Assume this is relative path.
- filename = filepath.Join(srcDir, path)
+ filename = filepath.Join(kernelDirs.Src, path)
}
return strings.TrimLeft(filepath.Clean(path), "/\\"), filename
}
diff --git a/pkg/cover/backend/elf.go b/pkg/cover/backend/elf.go
index 5073c5603..88b8302c4 100644
--- a/pkg/cover/backend/elf.go
+++ b/pkg/cover/backend/elf.go
@@ -17,13 +17,11 @@ import (
"github.com/google/syzkaller/sys/targets"
)
-func makeELF(target *targets.Target, objDir, srcDir, buildDir string, splitBuildDelimiters, moduleObj []string,
+func makeELF(target *targets.Target, kernelDirs *mgrconfig.KernelDirs, splitBuildDelimiters, moduleObj []string,
hostModules []*vminfo.KernelModule) (*Impl, error) {
return makeDWARF(&dwarfParams{
target: target,
- objDir: objDir,
- srcDir: srcDir,
- buildDir: buildDir,
+ kernelDirs: kernelDirs,
splitBuildDelimiters: splitBuildDelimiters,
moduleObj: moduleObj,
hostModules: hostModules,
diff --git a/pkg/cover/backend/gvisor.go b/pkg/cover/backend/gvisor.go
index fb188e784..bb404d0cc 100644
--- a/pkg/cover/backend/gvisor.go
+++ b/pkg/cover/backend/gvisor.go
@@ -10,22 +10,23 @@ import (
"regexp"
"strconv"
+ "github.com/google/syzkaller/pkg/mgrconfig"
"github.com/google/syzkaller/pkg/osutil"
"github.com/google/syzkaller/pkg/vminfo"
"github.com/google/syzkaller/sys/targets"
)
-func makeGvisor(target *targets.Target, objDir, srcDir, buildDir string, modules []*vminfo.KernelModule) (*Impl,
+func makeGvisor(target *targets.Target, kernelDirs *mgrconfig.KernelDirs, modules []*vminfo.KernelModule) (*Impl,
error) {
if len(modules) != 0 {
return nil, fmt.Errorf("gvisor coverage does not support modules")
}
- bin := filepath.Join(objDir, target.KernelObject)
+ bin := filepath.Join(kernelDirs.Obj, target.KernelObject)
// pkg/build stores runsc as 'vmlinux' (we pretent to be linux), but a local build will have it as 'runsc'.
if !osutil.IsExist(bin) {
bin = filepath.Join(filepath.Dir(bin), "runsc")
}
- frames, err := gvisorSymbolize(bin, srcDir)
+ frames, err := gvisorSymbolize(bin, kernelDirs.Src)
if err != nil {
return nil, err
}
diff --git a/pkg/cover/backend/mach-o.go b/pkg/cover/backend/mach-o.go
index b2cde9a66..37031cfde 100644
--- a/pkg/cover/backend/mach-o.go
+++ b/pkg/cover/backend/mach-o.go
@@ -10,17 +10,16 @@ import (
"sort"
"strings"
+ "github.com/google/syzkaller/pkg/mgrconfig"
"github.com/google/syzkaller/pkg/vminfo"
"github.com/google/syzkaller/sys/targets"
)
-func makeMachO(target *targets.Target, objDir, srcDir, buildDir string,
+func makeMachO(target *targets.Target, kernelDirs *mgrconfig.KernelDirs,
moduleObj []string, hostModules []*vminfo.KernelModule) (*Impl, error) {
return makeDWARF(&dwarfParams{
target: target,
- objDir: objDir,
- srcDir: srcDir,
- buildDir: buildDir,
+ kernelDirs: kernelDirs,
moduleObj: moduleObj,
hostModules: hostModules,
readSymbols: machoReadSymbols,
diff --git a/pkg/cover/report.go b/pkg/cover/report.go
index 056021739..2db00df6d 100644
--- a/pkg/cover/report.go
+++ b/pkg/cover/report.go
@@ -34,8 +34,7 @@ func GetPCBase(cfg *mgrconfig.Config) (uint64, error) {
}
func MakeReportGenerator(cfg *mgrconfig.Config, modules []*vminfo.KernelModule) (*ReportGenerator, error) {
- impl, err := backend.Make(cfg.SysTarget, cfg.Type, cfg.KernelObj,
- cfg.KernelSrc, cfg.KernelBuildSrc, cfg.AndroidSplitBuild, cfg.ModuleObj, modules)
+ impl, err := backend.Make(cfg.SysTarget, cfg.Type, cfg.KernelDirs(), cfg.AndroidSplitBuild, cfg.ModuleObj, modules)
if err != nil {
return nil, err
}