diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-09-14 12:14:52 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-09-15 16:02:37 +0200 |
| commit | 75ddf7ab901e1ecef20d30f276b9360363b1fee6 (patch) | |
| tree | fdd54914bd7c12fc487d8d1b0c3d819d268e6246 /sys | |
| parent | 487aa0d5371e9b020c69d2f9e4a955ed8e5b2555 (diff) | |
sys/syz-extract: switch to consolidated target info in sys package
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/sys.go | 28 | ||||
| -rw-r--r-- | sys/syz-extract/extract.go | 28 | ||||
| -rw-r--r-- | sys/syz-extract/fetch.go | 15 | ||||
| -rw-r--r-- | sys/syz-sysgen/sysgen.go | 28 |
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") } |
