aboutsummaryrefslogtreecommitdiffstats
path: root/sys/syz-sysgen
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-08-27 15:08:11 +0200
committerDmitry Vyukov <dvyukov@google.com>2017-08-27 15:28:49 +0200
commite2ffb4fc9111e28f1d8e0e987cb06172cbbd4e84 (patch)
tree8dc4d76063e3430321622cd81763a95a972f2e3a /sys/syz-sysgen
parente71c87fbf52c83d8e514e4685d40da4d4d0f1a1c (diff)
pkg/compiler: move more const-processing code to compiler
Diffstat (limited to 'sys/syz-sysgen')
-rw-r--r--sys/syz-sysgen/syscallnr.go62
-rw-r--r--sys/syz-sysgen/sysgen.go53
2 files changed, 26 insertions, 89 deletions
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: ")