From bf7ecb7cfe9145d8e169454ff6538a307124f82c Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Fri, 3 May 2024 14:16:11 +0200 Subject: pkg/cover: move KernelModule from pkg/host In preparation for pkg/host removal. Nothing in pkg/host uses KernelModule, and pkg/cover is effectively the only user of KernelModule. --- pkg/cover/backend/backend.go | 3 +-- pkg/cover/backend/dwarf.go | 3 +-- pkg/cover/backend/elf.go | 3 +-- pkg/cover/backend/gvisor.go | 3 +-- pkg/cover/backend/mach-o.go | 3 +-- pkg/cover/backend/modules.go | 12 ++++++++---- pkg/cover/canonicalizer.go | 11 +++++------ pkg/cover/canonicalizer_test.go | 10 ++++------ pkg/cover/report.go | 5 +++-- pkg/host/machine_info.go | 6 ------ pkg/vminfo/linux.go | 8 ++++---- pkg/vminfo/vminfo.go | 7 ++++--- syz-manager/cover.go | 3 +-- syz-manager/covfilter.go | 4 ++-- syz-manager/rpc.go | 2 +- tools/syz-cover/syz-cover.go | 7 +++---- 16 files changed, 40 insertions(+), 50 deletions(-) diff --git a/pkg/cover/backend/backend.go b/pkg/cover/backend/backend.go index 7ac0e8140..78e90b6c0 100644 --- a/pkg/cover/backend/backend.go +++ b/pkg/cover/backend/backend.go @@ -6,7 +6,6 @@ package backend import ( "fmt" - "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/sys/targets" ) @@ -68,7 +67,7 @@ type Range struct { const LineEnd = 1 << 30 func Make(target *targets.Target, vm, objDir, srcDir, buildDir string, splitBuild bool, - moduleObj []string, modules []host.KernelModule) (*Impl, error) { + moduleObj []string, modules []KernelModule) (*Impl, error) { if objDir == "" { return nil, fmt.Errorf("kernel obj directory is not specified") } diff --git a/pkg/cover/backend/dwarf.go b/pkg/cover/backend/dwarf.go index c99bd3265..9cad576be 100644 --- a/pkg/cover/backend/dwarf.go +++ b/pkg/cover/backend/dwarf.go @@ -18,7 +18,6 @@ import ( "strconv" "strings" - "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/pkg/osutil" "github.com/google/syzkaller/pkg/symbolizer" "github.com/google/syzkaller/sys/targets" @@ -31,7 +30,7 @@ type dwarfParams struct { buildDir string splitBuildDelimiters []string moduleObj []string - hostModules []host.KernelModule + hostModules []KernelModule readSymbols func(*Module, *symbolInfo) ([]*Symbol, error) readTextData func(*Module) ([]byte, error) readModuleCoverPoints func(*targets.Target, *Module, *symbolInfo) ([2][]uint64, error) diff --git a/pkg/cover/backend/elf.go b/pkg/cover/backend/elf.go index cb2c7d706..a2e7f3747 100644 --- a/pkg/cover/backend/elf.go +++ b/pkg/cover/backend/elf.go @@ -10,13 +10,12 @@ import ( "io" "strings" - "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/pkg/log" "github.com/google/syzkaller/sys/targets" ) func makeELF(target *targets.Target, objDir, srcDir, buildDir string, splitBuildDelimiters, moduleObj []string, - hostModules []host.KernelModule) (*Impl, error) { + hostModules []KernelModule) (*Impl, error) { return makeDWARF(&dwarfParams{ target: target, objDir: objDir, diff --git a/pkg/cover/backend/gvisor.go b/pkg/cover/backend/gvisor.go index 8e2a32d48..2e662f4bd 100644 --- a/pkg/cover/backend/gvisor.go +++ b/pkg/cover/backend/gvisor.go @@ -10,12 +10,11 @@ import ( "regexp" "strconv" - "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/pkg/osutil" "github.com/google/syzkaller/sys/targets" ) -func makeGvisor(target *targets.Target, objDir, srcDir, buildDir string, modules []host.KernelModule) (*Impl, error) { +func makeGvisor(target *targets.Target, objDir, srcDir, buildDir string, modules []KernelModule) (*Impl, error) { if len(modules) != 0 { return nil, fmt.Errorf("gvisor coverage does not support modules") } diff --git a/pkg/cover/backend/mach-o.go b/pkg/cover/backend/mach-o.go index cfc56c431..0d3546cec 100644 --- a/pkg/cover/backend/mach-o.go +++ b/pkg/cover/backend/mach-o.go @@ -10,12 +10,11 @@ import ( "sort" "strings" - "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/sys/targets" ) func makeMachO(target *targets.Target, objDir, srcDir, buildDir string, - moduleObj []string, hostModules []host.KernelModule) (*Impl, error) { + moduleObj []string, hostModules []KernelModule) (*Impl, error) { return makeDWARF(&dwarfParams{ target: target, objDir: objDir, diff --git a/pkg/cover/backend/modules.go b/pkg/cover/backend/modules.go index 1d9b0a0f6..2d0e3c330 100644 --- a/pkg/cover/backend/modules.go +++ b/pkg/cover/backend/modules.go @@ -11,13 +11,18 @@ import ( "path/filepath" "strings" - "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/pkg/log" "github.com/google/syzkaller/sys/targets" ) +type KernelModule struct { + Name string + Addr uint64 + Size uint64 +} + func discoverModules(target *targets.Target, objDir string, moduleObj []string, - hostModules []host.KernelModule) ( + hostModules []KernelModule) ( []*Module, error) { modules := []*Module{ // A dummy module representing the kernel itself. @@ -36,8 +41,7 @@ func discoverModules(target *targets.Target, objDir string, moduleObj []string, return modules, nil } -func discoverModulesLinux(dirs []string, hostModules []host.KernelModule, -) ([]*Module, error) { +func discoverModulesLinux(dirs []string, hostModules []KernelModule) ([]*Module, error) { paths, err := locateModules(dirs) if err != nil { return nil, err diff --git a/pkg/cover/canonicalizer.go b/pkg/cover/canonicalizer.go index d3b014af8..3c21c0947 100644 --- a/pkg/cover/canonicalizer.go +++ b/pkg/cover/canonicalizer.go @@ -7,13 +7,12 @@ import ( "fmt" "sort" - "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/pkg/log" ) type Canonicalizer struct { // Map of modules stored as module name:kernel module. - modules map[string]host.KernelModule + modules map[string]KernelModule // Contains a sorted list of the canonical module addresses. moduleKeys []uint32 @@ -48,13 +47,13 @@ type canonicalizerModule struct { discard bool } -func NewCanonicalizer(modules []host.KernelModule, flagSignal bool) *Canonicalizer { +func NewCanonicalizer(modules []KernelModule, flagSignal bool) *Canonicalizer { // Return if not using canonicalization. if len(modules) == 0 || !flagSignal { return &Canonicalizer{} } // Create a map of canonical module offsets by name. - canonicalModules := make(map[string]host.KernelModule) + canonicalModules := make(map[string]KernelModule) for _, module := range modules { canonicalModules[module.Name] = module } @@ -68,7 +67,7 @@ func NewCanonicalizer(modules []host.KernelModule, flagSignal bool) *Canonicaliz } } -func (can *Canonicalizer) NewInstance(modules []host.KernelModule) *CanonicalizerInstance { +func (can *Canonicalizer) NewInstance(modules []KernelModule) *CanonicalizerInstance { if can.moduleKeys == nil { return &CanonicalizerInstance{} } @@ -154,7 +153,7 @@ func (ci *CanonicalizerInstance) DecanonicalizeFilter(bitmap map[uint32]uint32) } // Store sorted list of addresses. Used to binary search when converting PCs. -func setModuleKeys(moduleKeys []uint32, modules []host.KernelModule) { +func setModuleKeys(moduleKeys []uint32, modules []KernelModule) { for idx, module := range modules { // Truncate PCs to uint32, assuming that they fit into 32 bits. // True for x86_64 and arm64 without KASLR. diff --git a/pkg/cover/canonicalizer_test.go b/pkg/cover/canonicalizer_test.go index f438af335..b826008be 100644 --- a/pkg/cover/canonicalizer_test.go +++ b/pkg/cover/canonicalizer_test.go @@ -10,8 +10,6 @@ import ( "reflect" "strconv" "testing" - - "github.com/google/syzkaller/pkg/host" ) type RPCServer struct { @@ -246,7 +244,7 @@ func (serv *RPCServer) runTest(val canonicalizeValue) string { return "" } -func (serv *RPCServer) connect(name string, modules []host.KernelModule, flagSignal bool) { +func (serv *RPCServer) connect(name string, modules []KernelModule, flagSignal bool) { if !serv.modulesInitialized { serv.canonicalModules = NewCanonicalizer(modules, flagSignal) serv.modulesInitialized = true @@ -257,10 +255,10 @@ func (serv *RPCServer) connect(name string, modules []host.KernelModule, flagSig } } -func initModules(addrs, sizes []uint64) []host.KernelModule { - var modules []host.KernelModule +func initModules(addrs, sizes []uint64) []KernelModule { + var modules []KernelModule for idx, addr := range addrs { - modules = append(modules, host.KernelModule{ + modules = append(modules, KernelModule{ Name: strconv.FormatInt(int64(idx), 10), Addr: addr, Size: sizes[idx], diff --git a/pkg/cover/report.go b/pkg/cover/report.go index 5ccd499c5..b0113ca14 100644 --- a/pkg/cover/report.go +++ b/pkg/cover/report.go @@ -8,7 +8,6 @@ import ( "sort" "github.com/google/syzkaller/pkg/cover/backend" - "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/pkg/mgrconfig" "github.com/google/syzkaller/sys/targets" "golang.org/x/exp/maps" @@ -29,10 +28,12 @@ type Prog struct { PCs []uint64 } +type KernelModule = backend.KernelModule + var RestorePC = backend.RestorePC func MakeReportGenerator(cfg *mgrconfig.Config, subsystem []mgrconfig.Subsystem, - modules []host.KernelModule, rawCover bool) (*ReportGenerator, error) { + modules []KernelModule, rawCover bool) (*ReportGenerator, error) { impl, err := backend.Make(cfg.SysTarget, cfg.Type, cfg.KernelObj, cfg.KernelSrc, cfg.KernelBuildSrc, cfg.AndroidSplitBuild, cfg.ModuleObj, modules) if err != nil { diff --git a/pkg/host/machine_info.go b/pkg/host/machine_info.go index 698a575a1..ee344dd0b 100644 --- a/pkg/host/machine_info.go +++ b/pkg/host/machine_info.go @@ -9,12 +9,6 @@ import ( "strings" ) -type KernelModule struct { - Name string `json:"Name"` - Addr uint64 `json:"Addr"` - Size uint64 `json:"Size"` -} - type FileInfo struct { Name string Exists bool diff --git a/pkg/vminfo/linux.go b/pkg/vminfo/linux.go index d5e84254f..2735ad0ef 100644 --- a/pkg/vminfo/linux.go +++ b/pkg/vminfo/linux.go @@ -13,7 +13,7 @@ import ( "strconv" "strings" - "github.com/google/syzkaller/pkg/host" + "github.com/google/syzkaller/pkg/cover" ) type linux int @@ -43,8 +43,8 @@ func (linux) machineInfos() []machineInfoFunc { } } -func (linux) parseModules(files filesystem) ([]host.KernelModule, error) { - var modules []host.KernelModule +func (linux) parseModules(files filesystem) ([]cover.KernelModule, error) { + var modules []cover.KernelModule re := regexp.MustCompile(`(\w+) ([0-9]+) .*(0[x|X][a-fA-F0-9]+)[^\n]*`) modulesText, _ := files.ReadFile("/proc/modules") for _, match := range re.FindAllSubmatch(modulesText, -1) { @@ -65,7 +65,7 @@ func (linux) parseModules(files filesystem) ([]host.KernelModule, error) { return nil, fmt.Errorf("module %v size parsing error: %w", name, err) } offset := modAddr - textAddr - modules = append(modules, host.KernelModule{ + modules = append(modules, cover.KernelModule{ Name: name, Addr: textAddr, Size: modSize - offset, diff --git a/pkg/vminfo/vminfo.go b/pkg/vminfo/vminfo.go index ee2541ad3..eae8ae4a3 100644 --- a/pkg/vminfo/vminfo.go +++ b/pkg/vminfo/vminfo.go @@ -21,6 +21,7 @@ import ( "os" "strings" + "github.com/google/syzkaller/pkg/cover" "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/pkg/mgrconfig" "github.com/google/syzkaller/pkg/rpctype" @@ -47,7 +48,7 @@ func New(cfg *mgrconfig.Config) *Checker { } } -func (checker *Checker) MachineInfo(fileInfos []host.FileInfo) ([]host.KernelModule, []byte, error) { +func (checker *Checker) MachineInfo(fileInfos []host.FileInfo) ([]cover.KernelModule, []byte, error) { files := createVirtualFilesystem(fileInfos) modules, err := checker.parseModules(files) if err != nil { @@ -88,7 +89,7 @@ type machineInfoFunc func(files filesystem, w io.Writer) (string, error) type checker interface { RequiredFiles() []string checkFiles() []string - parseModules(files filesystem) ([]host.KernelModule, error) + parseModules(files filesystem) ([]cover.KernelModule, error) machineInfos() []machineInfoFunc syscallCheck(*checkContext, *prog.Syscall) string } @@ -148,7 +149,7 @@ func (stub) checkFiles() []string { return nil } -func (stub) parseModules(files filesystem) ([]host.KernelModule, error) { +func (stub) parseModules(files filesystem) ([]cover.KernelModule, error) { return nil, nil } diff --git a/syz-manager/cover.go b/syz-manager/cover.go index 31fabeca9..d97f01358 100644 --- a/syz-manager/cover.go +++ b/syz-manager/cover.go @@ -7,7 +7,6 @@ import ( "sync" "github.com/google/syzkaller/pkg/cover" - "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/pkg/log" "github.com/google/syzkaller/pkg/mgrconfig" ) @@ -17,7 +16,7 @@ var ( cachedRepGen *cover.ReportGenerator ) -func getReportGenerator(cfg *mgrconfig.Config, modules []host.KernelModule) (*cover.ReportGenerator, error) { +func getReportGenerator(cfg *mgrconfig.Config, modules []cover.KernelModule) (*cover.ReportGenerator, error) { cachedRepGenMu.Lock() defer cachedRepGenMu.Unlock() if cachedRepGen == nil { diff --git a/syz-manager/covfilter.go b/syz-manager/covfilter.go index 3e3a30647..2acb06a5b 100644 --- a/syz-manager/covfilter.go +++ b/syz-manager/covfilter.go @@ -12,14 +12,14 @@ import ( "sort" "strconv" + "github.com/google/syzkaller/pkg/cover" "github.com/google/syzkaller/pkg/cover/backend" - "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/pkg/log" "github.com/google/syzkaller/pkg/mgrconfig" "github.com/google/syzkaller/sys/targets" ) -func createCoverageFilter(cfg *mgrconfig.Config, modules []host.KernelModule) ( +func createCoverageFilter(cfg *mgrconfig.Config, modules []cover.KernelModule) ( map[uint32]uint32, map[uint32]uint32, error) { if !cfg.HasCovFilter() { return nil, nil, nil diff --git a/syz-manager/rpc.go b/syz-manager/rpc.go index fab496d26..e777e67f8 100644 --- a/syz-manager/rpc.go +++ b/syz-manager/rpc.go @@ -42,7 +42,7 @@ type RPCServer struct { needCheckResults int checkFailures int checkFeatures *host.Features - modules []host.KernelModule + modules []cover.KernelModule canonicalModules *cover.Canonicalizer execCoverFilter map[uint32]uint32 coverFilter map[uint32]uint32 diff --git a/tools/syz-cover/syz-cover.go b/tools/syz-cover/syz-cover.go index b277d39c2..325bd4157 100644 --- a/tools/syz-cover/syz-cover.go +++ b/tools/syz-cover/syz-cover.go @@ -31,7 +31,6 @@ import ( "strings" "github.com/google/syzkaller/pkg/cover" - "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/pkg/mgrconfig" "github.com/google/syzkaller/pkg/osutil" "github.com/google/syzkaller/pkg/tool" @@ -53,7 +52,7 @@ func main() { if err != nil { tool.Fail(err) } - var modules []host.KernelModule + var modules []cover.KernelModule if *flagModules != "" { m, err := loadModules(*flagModules) if err != nil { @@ -155,12 +154,12 @@ func readPCs(files []string) ([]uint64, error) { return pcs, nil } -func loadModules(fname string) ([]host.KernelModule, error) { +func loadModules(fname string) ([]cover.KernelModule, error) { data, err := os.ReadFile(fname) if err != nil { return nil, err } - var modules []host.KernelModule + var modules []cover.KernelModule err = json.Unmarshal(data, &modules) if err != nil { return nil, err -- cgit mrf-deployment