aboutsummaryrefslogtreecommitdiffstats
path: root/csource/csource.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-08-28 16:33:32 +0200
committerDmitry Vyukov <dvyukov@google.com>2016-08-28 16:33:32 +0200
commit8278953eb4abb4fb147f6f06cd9bdcf1eff7e84d (patch)
tree171e6ee53a3ed08660df8ba7a6fbff5373fd1464 /csource/csource.go
parent58b2762fed21612145a1e21051adf13d55a79d98 (diff)
csource: teach how to execute pseudo syz_ syscalls
Update #59
Diffstat (limited to 'csource/csource.go')
-rw-r--r--csource/csource.go30
1 files changed, 17 insertions, 13 deletions
diff --git a/csource/csource.go b/csource/csource.go
index 214483c5d..28be9e22a 100644
--- a/csource/csource.go
+++ b/csource/csource.go
@@ -1,7 +1,7 @@
// Copyright 2015 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
-//go:generate bash -c "echo -e '// AUTOGENERATED FROM executor/common.h\npackage csource\nvar commonHeader = `' > common.go; cat ../executor/common.h | grep -v // >> common.go; echo '`' >> common.go"
+//go:generate bash -c "echo -e '// AUTOGENERATED FROM executor/common.h\npackage csource\nvar commonHeader = `' > common.go; cat ../executor/common.h | egrep -v '^[ ]*//' | sed 's#[ ]*//.*##g' >> common.go; echo '`' >> common.go"
package csource
@@ -27,23 +27,27 @@ func Write(p *prog.Prog, opts Options) []byte {
exec := p.SerializeForExec()
w := new(bytes.Buffer)
- fmt.Fprint(w, "// autogenerated by syzkaller (http://github.com/google/syzkaller)\n")
- fmt.Fprint(w, commonHeader)
- fmt.Fprint(w, "\n")
+ fmt.Fprint(w, "// autogenerated by syzkaller (http://github.com/google/syzkaller)\n\n")
- handled := make(map[string]bool)
+ handled := make(map[string]int)
for _, c := range p.Calls {
- name := c.Meta.CallName
- if handled[name] {
- continue
+ handled[c.Meta.CallName] = c.Meta.NR
+ }
+ for _, c := range sys.Calls {
+ if strings.HasPrefix(c.CallName, "syz_") {
+ handled[c.CallName] = c.NR
}
- handled[name] = true
- fmt.Fprintf(w, "#ifndef SYS_%v\n", name)
- fmt.Fprintf(w, "#define SYS_%v %v\n", name, c.Meta.NR)
+ }
+ for name, nr := range handled {
+ fmt.Fprintf(w, "#ifndef __NR_%v\n", name)
+ fmt.Fprintf(w, "#define __NR_%v %v\n", name, nr)
fmt.Fprintf(w, "#endif\n")
}
fmt.Fprintf(w, "\n")
+ fmt.Fprint(w, commonHeader)
+ fmt.Fprint(w, "\n")
+
calls, nvar := generateCalls(exec)
fmt.Fprintf(w, "long r[%v];\n", nvar)
@@ -166,7 +170,7 @@ loop:
// Normal syscall.
newCall()
meta := sys.Calls[instr]
- fmt.Fprintf(w, "\tr[%v] = syscall(SYS_%v", n, meta.CallName)
+ fmt.Fprintf(w, "\tr[%v] = execute_syscall(__NR_%v", n, meta.CallName)
nargs := read()
for i := uintptr(0); i < nargs; i++ {
typ := read()
@@ -181,7 +185,7 @@ loop:
panic("unknown arg type")
}
}
- for i := nargs; i < 6; i++ {
+ for i := nargs; i < 9; i++ {
fmt.Fprintf(w, ", 0")
}
fmt.Fprintf(w, ");\n")