aboutsummaryrefslogtreecommitdiffstats
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
parentb181c36d588da8d6007a23c0ad7305893758cec5 (diff)
pkg: use kernelDir instead of 3 parameters
It allows to reduce parameters count for some functions.
-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
-rw-r--r--pkg/mgrconfig/load.go14
-rw-r--r--pkg/report/bsd.go6
-rw-r--r--pkg/report/bsd_test.go7
-rw-r--r--pkg/report/fuchsia.go4
-rw-r--r--pkg/report/linux.go10
-rw-r--r--pkg/report/linux_test.go4
-rw-r--r--pkg/report/report.go24
13 files changed, 75 insertions, 66 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
}
diff --git a/pkg/mgrconfig/load.go b/pkg/mgrconfig/load.go
index 81ff2871a..51aaa0657 100644
--- a/pkg/mgrconfig/load.go
+++ b/pkg/mgrconfig/load.go
@@ -285,6 +285,20 @@ func (cfg *Config) CompleteKernelDirs() {
cfg.KernelBuildSrc = osutil.Abs(cfg.KernelBuildSrc)
}
+type KernelDirs struct {
+ Src string
+ Obj string
+ BuildSrc string
+}
+
+func (cfg *Config) KernelDirs() *KernelDirs {
+ return &KernelDirs{
+ Src: cfg.KernelSrc,
+ Obj: cfg.KernelObj,
+ BuildSrc: cfg.KernelBuildSrc,
+ }
+}
+
func (cfg *Config) checkSSHParams() error {
if cfg.SSHKey == "" {
return nil
diff --git a/pkg/report/bsd.go b/pkg/report/bsd.go
index 05ae5a4cf..ae5715567 100644
--- a/pkg/report/bsd.go
+++ b/pkg/report/bsd.go
@@ -25,8 +25,8 @@ type bsd struct {
func ctorBSD(cfg *config, oopses []*oops, symbolizeRes []*regexp.Regexp) (reporterImpl, error) {
var symbols map[string][]symbolizer.Symbol
kernelObject := ""
- if cfg.kernelObj != "" {
- kernelObject = filepath.Join(cfg.kernelObj, cfg.target.KernelObject)
+ if cfg.kernelDirs.Obj != "" {
+ kernelObject = filepath.Join(cfg.kernelDirs.Obj, cfg.target.KernelObject)
var err error
symbols, err = symbolizer.ReadTextSymbols(kernelObject)
if err != nil {
@@ -106,7 +106,7 @@ func (ctx *bsd) symbolizeLine(symbFunc func(string, ...uint64) ([]symbolizer.Fra
// Go through each of the frames and add the corresponding file names and line numbers.
for _, frame := range frames {
file := frame.File
- file = strings.TrimPrefix(file, ctx.kernelBuildSrc)
+ file = strings.TrimPrefix(file, ctx.kernelDirs.BuildSrc)
file = strings.TrimPrefix(file, "/")
info := fmt.Sprintf(" %v:%v", file, frame.Line)
modified := append([]byte{}, line...)
diff --git a/pkg/report/bsd_test.go b/pkg/report/bsd_test.go
index f3a1bf31d..21e9618d8 100644
--- a/pkg/report/bsd_test.go
+++ b/pkg/report/bsd_test.go
@@ -7,6 +7,7 @@ import (
"fmt"
"testing"
+ "github.com/google/syzkaller/pkg/mgrconfig"
"github.com/google/syzkaller/pkg/symbolizer"
)
@@ -59,8 +60,10 @@ func testSymbolizeLine(t *testing.T, ctor fn, tests []symbolizeLineTest) {
return res, nil
}
reporter, _, err := ctor(&config{
- kernelSrc: "/bsd/src2",
- kernelBuildSrc: "/bsd/src",
+ kernelDirs: mgrconfig.KernelDirs{
+ Src: "/bsd/src2",
+ BuildSrc: "/bsd/src",
+ },
})
if err != nil {
t.Fatal(err)
diff --git a/pkg/report/fuchsia.go b/pkg/report/fuchsia.go
index 8d66365f7..4165e00c0 100644
--- a/pkg/report/fuchsia.go
+++ b/pkg/report/fuchsia.go
@@ -50,8 +50,8 @@ func ctorFuchsia(cfg *config) (reporterImpl, []string, error) {
config: cfg,
}
ctx.ignores = append(ctx.ignores, fuchsiaIgnores...)
- if ctx.kernelObj != "" {
- ctx.obj = filepath.Join(ctx.kernelObj, ctx.target.KernelObject)
+ if ctx.kernelDirs.Obj != "" {
+ ctx.obj = filepath.Join(ctx.kernelDirs.Obj, ctx.target.KernelObject)
}
suppressions := []string{
"fatal exception: process /tmp/syz-executor", // OOM presumably
diff --git a/pkg/report/linux.go b/pkg/report/linux.go
index a275236e0..598543e6b 100644
--- a/pkg/report/linux.go
+++ b/pkg/report/linux.go
@@ -39,8 +39,8 @@ type linux struct {
func ctorLinux(cfg *config) (reporterImpl, []string, error) {
symbols := make(map[string]map[string][]symbolizer.Symbol)
vmlinux := ""
- if cfg.kernelObj != "" {
- vmlinux = filepath.Join(cfg.kernelObj, cfg.target.KernelObject)
+ if cfg.kernelDirs.Obj != "" {
+ vmlinux = filepath.Join(cfg.kernelDirs.Obj, cfg.target.KernelObject)
var err error
symbols[""], err = symbolizer.ReadTextSymbols(vmlinux)
if err != nil {
@@ -487,7 +487,7 @@ func symbolizeLine(symbFunc func(bin string, pc uint64) ([]symbolizer.Frame, err
}
var symbolized []byte
for _, frame := range frames {
- path, _ := backend.CleanPath(frame.File, ctx.kernelObj, ctx.kernelSrc, ctx.kernelBuildSrc, nil)
+ path, _ := backend.CleanPath(frame.File, &ctx.kernelDirs, nil)
info := fmt.Sprintf(" %v:%v", path, frame.Line)
modified := append([]byte{}, line...)
if buildID != "" {
@@ -808,10 +808,10 @@ func (ctx *linux) extractGuiltyFileImpl(report []byte) string {
}
func (ctx *linux) getMaintainers(file string) (vcs.Recipients, error) {
- if ctx.kernelSrc == "" {
+ if ctx.kernelDirs.Src == "" {
return nil, nil
}
- return GetLinuxMaintainers(ctx.kernelSrc, file)
+ return GetLinuxMaintainers(ctx.kernelDirs.Src, file)
}
func GetLinuxMaintainers(kernelSrc, file string) (vcs.Recipients, error) {
diff --git a/pkg/report/linux_test.go b/pkg/report/linux_test.go
index 7e5c028ef..f10fe0058 100644
--- a/pkg/report/linux_test.go
+++ b/pkg/report/linux_test.go
@@ -287,7 +287,9 @@ func TestLinuxSymbolizeLine(t *testing.T) {
}
cfg := &config{
- kernelObj: "/linux",
+ kernelDirs: mgrconfig.KernelDirs{
+ Obj: "/linux",
+ },
kernelModules: modules,
}
ctx := &linux{
diff --git a/pkg/report/report.go b/pkg/report/report.go
index 0006cb92b..d91bf35aa 100644
--- a/pkg/report/report.go
+++ b/pkg/report/report.go
@@ -117,13 +117,11 @@ func NewReporter(cfg *mgrconfig.Config) (*Reporter, error) {
return nil, err
}
config := &config{
- target: cfg.SysTarget,
- vmType: cfg.Type,
- kernelSrc: cfg.KernelSrc,
- kernelBuildSrc: cfg.KernelBuildSrc,
- kernelObj: cfg.KernelObj,
- ignores: ignores,
- kernelModules: localModules,
+ target: cfg.SysTarget,
+ vmType: cfg.Type,
+ kernelDirs: *cfg.KernelDirs(),
+ ignores: ignores,
+ kernelModules: localModules,
}
rep, suppressions, err := ctor(config)
if err != nil {
@@ -169,13 +167,11 @@ var ctors = map[string]fn{
}
type config struct {
- target *targets.Target
- vmType string
- kernelSrc string
- kernelBuildSrc string
- kernelObj string
- ignores []*regexp.Regexp
- kernelModules []*vminfo.KernelModule
+ target *targets.Target
+ vmType string
+ kernelDirs mgrconfig.KernelDirs
+ ignores []*regexp.Regexp
+ kernelModules []*vminfo.KernelModule
}
type fn func(cfg *config) (reporterImpl, []string, error)