aboutsummaryrefslogtreecommitdiffstats
path: root/sys/syz-sysgen
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-09-22 11:09:53 +0200
committerDmitry Vyukov <dvyukov@google.com>2017-09-22 13:10:55 +0200
commit913d592f973a0155647473eaa032711fe956f8a5 (patch)
tree29b1b2083c00d199cf4d9a30917411d923b49ef4 /sys/syz-sysgen
parentc26ea367cfa790e86800ac025638ad50f95b8287 (diff)
all: more assorted fuchsia support
Diffstat (limited to 'sys/syz-sysgen')
-rw-r--r--sys/syz-sysgen/sysgen.go39
1 files changed, 22 insertions, 17 deletions
diff --git a/sys/syz-sysgen/sysgen.go b/sys/syz-sysgen/sysgen.go
index 3aa98a16a..273bb7d04 100644
--- a/sys/syz-sysgen/sysgen.go
+++ b/sys/syz-sysgen/sysgen.go
@@ -71,7 +71,7 @@ func main() {
if consts == nil {
return
}
- prog := compiler.Compile(top, consts, job.Target.PtrSize, eh)
+ prog := compiler.Compile(top, consts, job.Target, eh)
if prog == nil {
return
}
@@ -168,8 +168,10 @@ func generate(target *targets.Target, prg *compiler.Prog, consts map[string]uint
func generateExecutorSyscalls(target *targets.Target, syscalls []*prog.Syscall, rev string) []byte {
type SyscallData struct {
- Name string
- NR int32
+ Name string
+ CallName string
+ NR int32
+ NeedCall bool
}
type ArchData struct {
Revision string
@@ -184,14 +186,24 @@ func generateExecutorSyscalls(target *targets.Target, syscalls []*prog.Syscall,
CARCH: target.CArch,
}
fake := make(map[string]uint64)
+ syscallNumbers := targets.OSList[target.OS].SyscallNumbers
for _, c := range syscalls {
- data.Calls = append(data.Calls, SyscallData{c.Name, int32(c.NR)})
- if strings.HasPrefix(c.CallName, "syz_") {
+ syz := strings.HasPrefix(c.CallName, "syz_")
+ if syz {
fake[c.CallName] = c.NR
}
+ data.Calls = append(data.Calls, SyscallData{
+ Name: c.Name,
+ CallName: c.CallName,
+ NR: int32(c.NR),
+ NeedCall: syz || !syscallNumbers,
+ })
}
for name, nr := range fake {
- data.Fake = append(data.Fake, SyscallData{name, int32(nr)})
+ data.Fake = append(data.Fake, SyscallData{
+ Name: name,
+ NR: int32(nr),
+ })
}
sort.Slice(data.Calls, func(i, j int) bool {
return data.Calls[i].Name < data.Calls[j].Name
@@ -208,7 +220,7 @@ func generateExecutorSyscalls(target *targets.Target, syscalls []*prog.Syscall,
func writeExecutorSyscalls(OS string, archs [][]byte) {
buf := new(bytes.Buffer)
- buf.WriteString(syscallsTempl)
+ buf.WriteString("// AUTOGENERATED FILE\n\n")
for _, arch := range archs {
buf.Write(arch)
}
@@ -247,22 +259,15 @@ func logf(v int, msg string, args ...interface{}) {
}
}
-var syscallsTempl = `// AUTOGENERATED FILE
-
-struct call_t {
- const char* name;
- int sys_nr;
-};
-`
-
var archTempl = template.Must(template.New("").Parse(`
#if {{range $cdef := $.CARCH}}defined({{$cdef}}) || {{end}}0
#define GOARCH "{{.GOARCH}}"
#define SYZ_REVISION "{{.Revision}}"
{{range $c := $.Fake}}#define __NR_{{$c.Name}} {{$c.NR}}
{{end}}
-static call_t syscalls[] = {
-{{range $c := $.Calls}} {"{{$c.Name}}", {{$c.NR}}},
+unsigned syscall_count = {{len $.Calls}};
+call_t syscalls[] = {
+{{range $c := $.Calls}} {"{{$c.Name}}", {{$c.NR}}{{if $c.NeedCall}}, (syscall_t){{$c.CallName}}{{end}}},
{{end}}
};
#endif