diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2020-12-12 08:45:06 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2020-12-13 18:56:36 +0100 |
| commit | d0d624444f8c925c99f29ff0deff2a2ce8c951d9 (patch) | |
| tree | 9606d07b815f7caecb9b3671745ffba5844c8b42 /pkg | |
| parent | 69bc3eaa35c92378b58e5785e092b66b4b17e586 (diff) | |
pkg/cover: provide ReportGenerator.RestorePC
Better encapsulate all of this logic instead of exposing
raw .text offset and a bunch of functions.
Also allows to support gvisor coverage where PCs don't
need to be rewound to previous instruction.
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/cover/backend/backend.go | 10 | ||||
| -rw-r--r-- | pkg/cover/backend/elf.go | 8 | ||||
| -rw-r--r-- | pkg/cover/backend/pc.go (renamed from pkg/cover/pc.go) | 6 | ||||
| -rw-r--r-- | pkg/cover/cover.go | 4 | ||||
| -rw-r--r-- | pkg/cover/report.go | 5 |
5 files changed, 20 insertions, 13 deletions
diff --git a/pkg/cover/backend/backend.go b/pkg/cover/backend/backend.go index 7da6abfc5..405cbaa3f 100644 --- a/pkg/cover/backend/backend.go +++ b/pkg/cover/backend/backend.go @@ -9,11 +9,11 @@ import ( ) type Impl struct { - Units []*CompileUnit - Symbols []*Symbol - Frames []symbolizer.Frame - TextOffset uint32 // high 32 bits of PCs - Symbolize func(pcs []uint64) ([]symbolizer.Frame, error) + Units []*CompileUnit + Symbols []*Symbol + Frames []symbolizer.Frame + Symbolize func(pcs []uint64) ([]symbolizer.Frame, error) + RestorePC func(pc uint32) uint64 } type CompileUnit struct { diff --git a/pkg/cover/backend/elf.go b/pkg/cover/backend/elf.go index 0821f331a..c8e0879b0 100644 --- a/pkg/cover/backend/elf.go +++ b/pkg/cover/backend/elf.go @@ -74,12 +74,14 @@ func makeELF(target *targets.Target, objDir string) (*Impl, error) { return nil, fmt.Errorf("failed to parse DWARF (set CONFIG_DEBUG_INFO=y?)") } impl := &Impl{ - Units: units, - Symbols: symbols, - TextOffset: uint32(textAddr >> 32), + Units: units, + Symbols: symbols, Symbolize: func(pcs []uint64) ([]symbolizer.Frame, error) { return symbolize(target, kernelObject, pcs) }, + RestorePC: func(pc uint32) uint64 { + return PreviousInstructionPC(target, RestorePC(pc, uint32(textAddr>>32))) + }, } return impl, nil } diff --git a/pkg/cover/pc.go b/pkg/cover/backend/pc.go index 5987e8846..ae92f9298 100644 --- a/pkg/cover/pc.go +++ b/pkg/cover/backend/pc.go @@ -1,7 +1,7 @@ // Copyright 2020 syzkaller project authors. All rights reserved. // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. -package cover +package backend import ( "fmt" @@ -9,6 +9,10 @@ import ( "github.com/google/syzkaller/sys/targets" ) +func RestorePC(pc, base uint32) uint64 { + return uint64(base)<<32 + uint64(pc) +} + func PreviousInstructionPC(target *targets.Target, pc uint64) uint64 { offset := instructionLen(target.Arch) pc -= offset diff --git a/pkg/cover/cover.go b/pkg/cover/cover.go index 40c806fd7..814ae4fb6 100644 --- a/pkg/cover/cover.go +++ b/pkg/cover/cover.go @@ -43,7 +43,3 @@ func (cov Cover) Serialize() []uint32 { } return res } - -func RestorePC(pc, base uint32) uint64 { - return uint64(base)<<32 + uint64(pc) -} diff --git a/pkg/cover/report.go b/pkg/cover/report.go index 9b515905f..14c0b7422 100644 --- a/pkg/cover/report.go +++ b/pkg/cover/report.go @@ -26,6 +26,11 @@ type Prog struct { PCs []uint64 } +var ( + RestorePC = backend.RestorePC + PreviousInstructionPC = backend.PreviousInstructionPC +) + func MakeReportGenerator(target *targets.Target, vm, objDir, srcDir, buildDir string) (*ReportGenerator, error) { impl, err := backend.Make(target, vm, objDir) if err != nil { |
