From e2ffb4fc9111e28f1d8e0e987cb06172cbbd4e84 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Sun, 27 Aug 2017 15:08:11 +0200 Subject: pkg/compiler: move more const-processing code to compiler --- sys/syz-sysgen/syscallnr.go | 62 +++++++++++++++------------------------------ sys/syz-sysgen/sysgen.go | 53 ++++---------------------------------- 2 files changed, 26 insertions(+), 89 deletions(-) (limited to 'sys/syz-sysgen') diff --git a/sys/syz-sysgen/syscallnr.go b/sys/syz-sysgen/syscallnr.go index 8a04719b3..d98192a03 100644 --- a/sys/syz-sysgen/syscallnr.go +++ b/sys/syz-sysgen/syscallnr.go @@ -6,6 +6,7 @@ package main import ( "bytes" "sort" + "strings" "text/template" ) @@ -22,25 +23,22 @@ var archs = []*Arch{ {"ppc64le", []string{"__ppc64__", "__PPC64__", "__powerpc64__"}}, } -var syzkalls = map[string]uint64{ - "syz_test": 1000001, - "syz_open_dev": 1000002, - "syz_open_pts": 1000003, - "syz_fuse_mount": 1000004, - "syz_fuseblk_mount": 1000005, - "syz_emit_ethernet": 1000006, - "syz_kvm_setup_cpu": 1000007, - "syz_extract_tcp_res": 1000008, -} - func generateExecutorSyscalls(arch *Arch, syscalls []Syscall) []byte { data := ArchData{ CARCH: arch.CARCH, } + fake := make(map[string]uint64) for _, c := range syscalls { data.Calls = append(data.Calls, SyscallData{c.Name, c.NR}) + if strings.HasPrefix(c.CallName, "syz_") { + fake[c.CallName] = c.NR + } + } + for name, nr := range fake { + data.Fake = append(data.Fake, SyscallData{name, nr}) } sort.Sort(SyscallArray(data.Calls)) + sort.Sort(SyscallArray(data.Fake)) buf := new(bytes.Buffer) if err := archTempl.Execute(buf, data); err != nil { failf("failed to execute arch template: %v", err) @@ -49,31 +47,18 @@ func generateExecutorSyscalls(arch *Arch, syscalls []Syscall) []byte { } func writeExecutorSyscalls(archs [][]byte) { - data := SyscallsData{ - Archs: archs, - } - for name, nr := range syzkalls { - data.FakeCalls = append(data.FakeCalls, SyscallData{name, nr}) - } - sort.Sort(SyscallArray(data.FakeCalls)) - - hdrcode := "executor/syscalls.h" - logf(1, "Generate header with syscall numbers in %v", hdrcode) buf := new(bytes.Buffer) - if err := syscallsTempl.Execute(buf, data); err != nil { - failf("failed to execute syscalls template: %v", err) + buf.WriteString(syscallsTempl) + for _, arch := range archs { + buf.Write(arch) } - writeFile(hdrcode, buf.Bytes()) -} - -type SyscallsData struct { - FakeCalls []SyscallData - Archs [][]byte + writeFile("executor/syscalls.h", buf.Bytes()) } type ArchData struct { CARCH []string Calls []SyscallData + Fake []SyscallData } type SyscallData struct { @@ -87,26 +72,21 @@ func (a SyscallArray) Len() int { return len(a) } func (a SyscallArray) Less(i, j int) bool { return a[i].Name < a[j].Name } func (a SyscallArray) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -var syscallsTempl = template.Must(template.New("").Parse( - `// AUTOGENERATED FILE - -{{range $c := $.FakeCalls}}#define __NR_{{$c.Name}} {{$c.NR}} -{{end}} +var syscallsTempl = `// AUTOGENERATED FILE struct call_t { const char* name; int sys_nr; }; +` -{{range $arch := $.Archs}} -{{printf "%s" $arch}} +var archTempl = template.Must(template.New("").Parse(` +#if {{range $cdef := $.CARCH}}defined({{$cdef}}) || {{end}}0 +{{range $c := $.Fake}}#define __NR_{{$c.Name}} {{$c.NR}} {{end}} -`)) - -var archTempl = template.Must(template.New("").Parse( - `#if {{range $cdef := $.CARCH}}defined({{$cdef}}) || {{end}}0 static call_t syscalls[] = { {{range $c := $.Calls}} {"{{$c.Name}}", {{$c.NR}}}, {{end}} }; -#endif`)) +#endif +`)) diff --git a/sys/syz-sysgen/sysgen.go b/sys/syz-sysgen/sysgen.go index fa386220b..984a5b4e8 100644 --- a/sys/syz-sysgen/sysgen.go +++ b/sys/syz-sysgen/sysgen.go @@ -4,7 +4,6 @@ package main import ( - "bufio" "bytes" "flag" "fmt" @@ -47,8 +46,11 @@ func main() { unsupported := make(map[string]int) for _, arch := range archs { logf(0, "generating %v...", arch.Name) - consts := readConsts(arch.Name) + consts := compiler.DeserializeConstsGlob("sys/*_"+arch.Name+"\\.const", nil) + if consts == nil { + os.Exit(1) + } prog := compiler.Compile(top, consts, nil) if prog == nil { os.Exit(1) @@ -288,48 +290,6 @@ func astTypeToStr(n *ast.Type) string { return res } -func readConsts(arch string) map[string]uint64 { - constFiles, err := filepath.Glob("sys/*_" + arch + ".const") - if err != nil { - failf("failed to find const files: %v", err) - } - consts := make(map[string]uint64) - for _, fname := range constFiles { - f, err := os.Open(fname) - if err != nil { - failf("failed to open const file: %v", err) - } - defer f.Close() - s := bufio.NewScanner(f) - for s.Scan() { - line := s.Text() - if line == "" || line[0] == '#' { - continue - } - eq := strings.IndexByte(line, '=') - if eq == -1 { - failf("malformed const file %v: no '=' in '%v'", fname, line) - } - name := strings.TrimSpace(line[:eq]) - val, err := strconv.ParseUint(strings.TrimSpace(line[eq+1:]), 0, 64) - if err != nil { - failf("malformed const file %v: bad value in '%v'", fname, line) - } - if old, ok := consts[name]; ok && old != val { - failf("const %v has different values for %v: %v vs %v", name, arch, old, val) - } - consts[name] = val - } - if err := s.Err(); err != nil { - failf("failed to read const file: %v", err) - } - } - for name, nr := range syzkalls { - consts["__NR_"+name] = nr - } - return consts -} - func generate(arch string, desc *Description, consts map[string]uint64, out io.Writer) { fmt.Fprintf(out, "// AUTOGENERATED FILE\n") fmt.Fprintf(out, "package sys\n\n") @@ -340,10 +300,7 @@ func generate(arch string, desc *Description, consts map[string]uint64, out io.W fmt.Fprintf(out, "var Calls = []*Call{\n") for _, s := range desc.Syscalls { logf(4, " generate population code for %v", s.Name) - native := true - if _, ok := syzkalls[s.CallName]; ok { - native = false - } + native := !strings.HasPrefix(s.CallName, "syz_") fmt.Fprintf(out, "&Call{Name: \"%v\", CallName: \"%v\", Native: %v", s.Name, s.CallName, native) if len(s.Ret) != 0 { fmt.Fprintf(out, ", Ret: ") -- cgit mrf-deployment