diff options
| author | Taras Madan <tarasmadan@google.com> | 2025-03-27 10:34:07 +0100 |
|---|---|---|
| committer | Taras Madan <tarasmadan@google.com> | 2025-03-27 10:07:16 +0000 |
| commit | c66ac62e1284de84775ccf0edf94f224db8b4509 (patch) | |
| tree | 885bf4ba80bcd8b722ea76c2dd530a48b380c985 | |
| parent | b181c36d588da8d6007a23c0ad7305893758cec5 (diff) | |
pkg: use kernelDir instead of 3 parameters
It allows to reduce parameters count for some functions.
| -rw-r--r-- | pkg/cover/backend/backend.go | 10 | ||||
| -rw-r--r-- | pkg/cover/backend/dwarf.go | 39 | ||||
| -rw-r--r-- | pkg/cover/backend/elf.go | 6 | ||||
| -rw-r--r-- | pkg/cover/backend/gvisor.go | 7 | ||||
| -rw-r--r-- | pkg/cover/backend/mach-o.go | 7 | ||||
| -rw-r--r-- | pkg/cover/report.go | 3 | ||||
| -rw-r--r-- | pkg/mgrconfig/load.go | 14 | ||||
| -rw-r--r-- | pkg/report/bsd.go | 6 | ||||
| -rw-r--r-- | pkg/report/bsd_test.go | 7 | ||||
| -rw-r--r-- | pkg/report/fuchsia.go | 4 | ||||
| -rw-r--r-- | pkg/report/linux.go | 10 | ||||
| -rw-r--r-- | pkg/report/linux_test.go | 4 | ||||
| -rw-r--r-- | pkg/report/report.go | 24 |
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) |
