aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-09-14 12:14:52 +0200
committerDmitry Vyukov <dvyukov@google.com>2017-09-15 16:02:37 +0200
commit75ddf7ab901e1ecef20d30f276b9360363b1fee6 (patch)
treefdd54914bd7c12fc487d8d1b0c3d819d268e6246
parent487aa0d5371e9b020c69d2f9e4a955ed8e5b2555 (diff)
sys/syz-extract: switch to consolidated target info in sys package
-rw-r--r--sys/sys.go28
-rw-r--r--sys/syz-extract/extract.go28
-rw-r--r--sys/syz-extract/fetch.go15
-rw-r--r--sys/syz-sysgen/sysgen.go28
4 files changed, 49 insertions, 50 deletions
diff --git a/sys/sys.go b/sys/sys.go
index d5ddd6028..796837325 100644
--- a/sys/sys.go
+++ b/sys/sys.go
@@ -8,10 +8,13 @@ import (
)
type Target struct {
+ OS string
+ Arch string
PtrSize uint64
CArch []string
CFlags []string
- CCompiler string
+ CrossCFlags []string
+ CCompilerPrefix string
KernelArch string
KernelHeaderArch string
KernelCrossCompile string
@@ -23,7 +26,7 @@ var Targets = map[string]map[string]*Target{
PtrSize: 8,
CArch: []string{"__x86_64__"},
CFlags: []string{"-m64"},
- CCompiler: "x86_64-linux-gnu-",
+ CCompilerPrefix: "x86_64-linux-gnu-",
KernelArch: "x86_64",
KernelHeaderArch: "x86",
},
@@ -31,23 +34,23 @@ var Targets = map[string]map[string]*Target{
PtrSize: 4,
CArch: []string{"__i386__"},
CFlags: []string{"-m32"},
- CCompiler: "x86_64-linux-gnu-",
+ CCompilerPrefix: "x86_64-linux-gnu-",
KernelArch: "i386",
KernelHeaderArch: "x86",
},
"arm64": {
PtrSize: 8,
CArch: []string{"__aarch64__"},
- CFlags: []string{},
- CCompiler: "aarch64-linux-gnu-",
+ CCompilerPrefix: "aarch64-linux-gnu-",
KernelArch: "arm64",
KernelHeaderArch: "arm64",
},
"arm": {
PtrSize: 4,
CArch: []string{"__arm__"},
- CFlags: []string{"-D__LINUX_ARM_ARCH__=6", "-march=armv6t2", "-m32"},
- CCompiler: "arm-linux-gnueabihf-",
+ CFlags: []string{"-D__LINUX_ARM_ARCH__=6", "-m32"},
+ CrossCFlags: []string{"-march=armv6t2"},
+ CCompilerPrefix: "arm-linux-gnueabihf-",
KernelArch: "arm",
KernelHeaderArch: "arm",
},
@@ -55,9 +58,18 @@ var Targets = map[string]map[string]*Target{
PtrSize: 8,
CArch: []string{"__ppc64__", "__PPC64__", "__powerpc64__"},
CFlags: []string{"-D__powerpc64__"},
- CCompiler: "powerpc64le-linux-gnu-",
+ CCompilerPrefix: "powerpc64le-linux-gnu-",
KernelArch: "powerpc",
KernelHeaderArch: "powerpc",
},
},
}
+
+func init() {
+ for OS, archs := range Targets {
+ for arch, target := range archs {
+ target.OS = OS
+ target.Arch = arch
+ }
+ }
+}
diff --git a/sys/syz-extract/extract.go b/sys/syz-extract/extract.go
index 781f445d2..d7a2efb94 100644
--- a/sys/syz-extract/extract.go
+++ b/sys/syz-extract/extract.go
@@ -17,6 +17,7 @@ import (
"github.com/google/syzkaller/pkg/ast"
"github.com/google/syzkaller/pkg/compiler"
"github.com/google/syzkaller/pkg/osutil"
+ "github.com/google/syzkaller/sys"
)
var (
@@ -25,20 +26,6 @@ var (
flagArch = flag.String("arch", "", "arch to generate")
)
-type Arch struct {
- CARCH []string
- KernelHeaderArch string
- CFlags []string
-}
-
-var archs = map[string]*Arch{
- "amd64": {[]string{"__x86_64__"}, "x86", []string{"-m64"}},
- "386": {[]string{"__i386__"}, "x86", []string{"-m32"}},
- "arm64": {[]string{"__aarch64__"}, "arm64", []string{}},
- "arm": {[]string{"__arm__"}, "arm", []string{"-D__LINUX_ARM_ARCH__=6", "-m32"}},
- "ppc64le": {[]string{"__ppc64__", "__PPC64__", "__powerpc64__"}, "powerpc", []string{"-D__powerpc64__"}},
-}
-
type File struct {
name string
undeclared map[string]bool
@@ -61,7 +48,8 @@ func main() {
if *flagArch == "" {
failf("-arch flag is required")
}
- if archs[*flagArch] == nil {
+ target := sys.Targets["linux"][*flagArch]
+ if target == nil {
failf("unknown arch %v", *flagArch)
}
n := len(flag.Args())
@@ -84,7 +72,7 @@ func main() {
go func() {
defer wg.Done()
for f := range inc {
- f.undeclared, f.err = processFile(f.name)
+ f.undeclared, f.err = processFile(target, f.name)
}
}()
}
@@ -100,8 +88,8 @@ func main() {
}
}
-func processFile(inname string) (map[string]bool, error) {
- outname := strings.TrimSuffix(inname, ".txt") + "_" + *flagArch + ".const"
+func processFile(target *sys.Target, inname string) (map[string]bool, error) {
+ outname := strings.TrimSuffix(inname, ".txt") + "_" + target.Arch + ".const"
indata, err := ioutil.ReadFile(inname)
if err != nil {
return nil, fmt.Errorf("failed to read input file: %v", err)
@@ -121,10 +109,8 @@ func processFile(inname string) (map[string]bool, error) {
if len(info.Consts) == 0 {
return nil, nil
}
- arch := archs[*flagArch]
includes := append(info.Includes, "asm/unistd.h")
- consts, undeclared, err := fetchValues(arch.KernelHeaderArch, info.Consts,
- includes, info.Incdirs, arch.CFlags, info.Defines)
+ consts, undeclared, err := fetchValues(target, info.Consts, includes, info.Incdirs, info.Defines)
if err != nil {
return nil, err
}
diff --git a/sys/syz-extract/fetch.go b/sys/syz-extract/fetch.go
index 604ef2639..25f3f2f47 100644
--- a/sys/syz-extract/fetch.go
+++ b/sys/syz-extract/fetch.go
@@ -11,14 +11,16 @@ import (
"regexp"
"strconv"
"strings"
+
+ "github.com/google/syzkaller/sys"
)
// fetchValues converts literal constants (e.g. O_APPEND) or any other C expressions
// into their respective numeric values. It does so by builting and executing a C program
// that prints values of the provided expressions.
-func fetchValues(arch string, vals, includes, incdirs, cflags []string,
+func fetchValues(target *sys.Target, vals, includes, incdirs []string,
defines map[string]string) (map[string]uint64, map[string]bool, error) {
- bin, out, err := runCompiler(arch, nil, includes, incdirs, cflags, nil, nil)
+ bin, out, err := runCompiler(target, nil, includes, incdirs, nil, nil)
if err != nil {
return nil, nil, fmt.Errorf("failed to run gcc: %v\n%v", err, string(out))
}
@@ -30,7 +32,7 @@ func fetchValues(arch string, vals, includes, incdirs, cflags []string,
}
undeclared := make(map[string]bool)
- bin, out, err = runCompiler(arch, vals, includes, incdirs, cflags, defines, undeclared)
+ bin, out, err = runCompiler(target, vals, includes, incdirs, defines, undeclared)
if err != nil {
for _, errMsg := range []string{
"error: ‘([a-zA-Z0-9_]+)’ undeclared",
@@ -45,7 +47,7 @@ func fetchValues(arch string, vals, includes, incdirs, cflags []string,
}
}
}
- bin, out, err = runCompiler(arch, vals, includes, incdirs, cflags, defines, undeclared)
+ bin, out, err = runCompiler(target, vals, includes, incdirs, defines, undeclared)
if err != nil {
return nil, nil, fmt.Errorf("failed to run gcc: %v\n%v", err, string(out))
}
@@ -84,7 +86,7 @@ func fetchValues(arch string, vals, includes, incdirs, cflags []string,
return res, undeclared, nil
}
-func runCompiler(arch string, vals, includes, incdirs, cflags []string, defines map[string]string, undeclared map[string]bool) (bin string, out []byte, err error) {
+func runCompiler(target *sys.Target, vals, includes, incdirs []string, defines map[string]string, undeclared map[string]bool) (bin string, out []byte, err error) {
includeText := ""
for _, inc := range includes {
includeText += fmt.Sprintf("#include <%v>\n", inc)
@@ -112,8 +114,9 @@ func runCompiler(arch string, vals, includes, incdirs, cflags []string, defines
}
binFile.Close()
+ arch := target.KernelHeaderArch
args := []string{"-x", "c", "-", "-o", binFile.Name(), "-fmessage-length=0"}
- args = append(args, cflags...)
+ args = append(args, target.CFlags...)
args = append(args, []string{
// This would be useful to ensure that we don't include any host headers,
// but kernel includes at least <stdarg.h>
diff --git a/sys/syz-sysgen/sysgen.go b/sys/syz-sysgen/sysgen.go
index 920547297..ce88cb539 100644
--- a/sys/syz-sysgen/sysgen.go
+++ b/sys/syz-sysgen/sysgen.go
@@ -41,7 +41,6 @@ func main() {
}
type Job struct {
- Arch string
Target *sys.Target
OK bool
Errors []string
@@ -49,14 +48,13 @@ func main() {
ArchData []byte
}
var jobs []*Job
- for arch, target := range archs {
+ for _, target := range archs {
jobs = append(jobs, &Job{
- Arch: arch,
Target: target,
})
}
sort.Slice(jobs, func(i, j int) bool {
- return jobs[i].Arch < jobs[j].Arch
+ return jobs[i].Target.Arch < jobs[j].Target.Arch
})
var wg sync.WaitGroup
wg.Add(len(jobs))
@@ -68,7 +66,7 @@ func main() {
eh := func(pos ast.Pos, msg string) {
job.Errors = append(job.Errors, fmt.Sprintf("%v: %v\n", pos, msg))
}
- consts := compiler.DeserializeConstsGlob(filepath.Join("sys", OS, "*_"+job.Arch+"\\.const"), eh)
+ consts := compiler.DeserializeConstsGlob(filepath.Join("sys", OS, "*_"+job.Target.Arch+"\\.const"), eh)
if consts == nil {
return
}
@@ -78,9 +76,9 @@ func main() {
}
job.Unsupported = prog.Unsupported
- sysFile := filepath.Join("sys", OS, job.Arch+".go")
+ sysFile := filepath.Join("sys", OS, job.Target.Arch+".go")
out := new(bytes.Buffer)
- generate(OS, job.Arch, job.Target, prog, consts, out)
+ generate(job.Target, prog, consts, out)
writeSource(sysFile, out.Bytes())
job.ArchData = generateExecutorSyscalls(job.Target, prog.Syscalls)
@@ -92,7 +90,7 @@ func main() {
var syscallArchs [][]byte
unsupported := make(map[string]int)
for _, job := range jobs {
- fmt.Printf("generating %v/%v...\n", OS, job.Arch)
+ fmt.Printf("generating %v/%v...\n", job.Target.OS, job.Target.Arch)
for _, msg := range job.Errors {
fmt.Print(msg)
}
@@ -128,25 +126,25 @@ func main() {
}
}
-func generate(OS, arch string, target *sys.Target, prg *compiler.Prog, consts map[string]uint64, out io.Writer) {
+func generate(target *sys.Target, prg *compiler.Prog, consts map[string]uint64, out io.Writer) {
fmt.Fprintf(out, "// AUTOGENERATED FILE\n")
- fmt.Fprintf(out, "package %v\n\n", OS)
+ fmt.Fprintf(out, "package %v\n\n", target.OS)
fmt.Fprintf(out, "import . \"github.com/google/syzkaller/prog\"\n\n")
fmt.Fprintf(out, "func init() {\n")
fmt.Fprintf(out, "\tinitArch(syscalls_%v, resources_%v, structDescs_%v, consts_%v, %q, %v)\n",
- arch, arch, arch, arch, arch, target.PtrSize)
+ target.Arch, target.Arch, target.Arch, target.Arch, target.Arch, target.PtrSize)
fmt.Fprintf(out, "}\n\n")
- fmt.Fprintf(out, "var resources_%v = ", arch)
+ fmt.Fprintf(out, "var resources_%v = ", target.Arch)
serializer.Write(out, prg.Resources)
fmt.Fprintf(out, "\n\n")
- fmt.Fprintf(out, "var structDescs_%v = ", arch)
+ fmt.Fprintf(out, "var structDescs_%v = ", target.Arch)
serializer.Write(out, prg.StructDescs)
fmt.Fprintf(out, "\n\n")
- fmt.Fprintf(out, "var syscalls_%v = ", arch)
+ fmt.Fprintf(out, "var syscalls_%v = ", target.Arch)
serializer.Write(out, prg.Syscalls)
fmt.Fprintf(out, "\n\n")
@@ -157,7 +155,7 @@ func generate(OS, arch string, target *sys.Target, prg *compiler.Prog, consts ma
sort.Slice(constArr, func(i, j int) bool {
return constArr[i].Name < constArr[j].Name
})
- fmt.Fprintf(out, "var consts_%v = ", arch)
+ fmt.Fprintf(out, "var consts_%v = ", target.Arch)
serializer.Write(out, constArr)
fmt.Fprintf(out, "\n")
}