aboutsummaryrefslogtreecommitdiffstats
path: root/sysgen
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2015-12-23 19:04:23 +0100
committerDmitry Vyukov <dvyukov@google.com>2015-12-23 19:05:15 +0100
commitb4e2d91732f95688f492679496dc98ded41f97f8 (patch)
tree4ad9d12cddd1462d1b815417050da3fd7475c4f3 /sysgen
parent1f580dac3d82075b93cc18044501fd01024d5f9a (diff)
sys: expose new syscall numbers programmatically
This will be required for reproduction tool.
Diffstat (limited to 'sysgen')
-rw-r--r--sysgen/sysgen.go96
1 files changed, 67 insertions, 29 deletions
diff --git a/sysgen/sysgen.go b/sysgen/sysgen.go
index b3496d004..82e31f349 100644
--- a/sysgen/sysgen.go
+++ b/sysgen/sysgen.go
@@ -15,6 +15,7 @@ import (
"sort"
"strconv"
"strings"
+ "text/template"
)
func main() {
@@ -453,47 +454,84 @@ func generateConsts(flags map[string]string, out io.Writer) {
fmt.Fprintf(out, " %v = %v\n", f.name, f.val)
}
fmt.Fprintf(out, ")\n")
+ fmt.Fprintf(out, "\n")
+
+ fmt.Fprintf(out, "var NewSyscalls = map[string]int {\n")
+ for call, nr := range NewSyscalls {
+ fmt.Fprintf(out, " \"%v\": %v,\n", call, nr)
+ }
+ fmt.Fprintf(out, "}\n")
}
-func generateHeader(syscalls []Syscall, out io.Writer) {
- fmt.Fprint(out, `// AUTOGENERATED FILE
+// Note: this is x86_64 numbers
+var NewSyscalls = map[string]int{
+ "getrandom": 318,
+ "memfd_create": 319,
+ "bpf": 321,
+ "userfaultfd": 323,
+ "membarrier": 324,
+ "mlock2": 325,
+
+ "syz_openpts": 1000001,
+ "syz_dri_open": 1000002,
+ "syz_fuse_mount": 1000003,
+ "syz_fuseblk_mount": 1000004,
+}
+
+var syscallsTempl = template.Must(template.New("").Parse(
+ `// AUTOGENERATED FILE
+
+// Note: this is x86_64 numbers
+{{range $c := $.Defines}}
+#ifndef __NR_{{$c.Name}}
+#define __NR_{{$c.Name}} {{$c.Val}}
+#endif
+{{end}}
struct call_t {
const char* name;
int sys_nr;
};
-// Note: this is x86_64 number
-#ifndef __NR_getrandom
-#define __NR_getrandom 318
-#endif
-#ifndef __NR_memfd_create
-#define __NR_memfd_create 319
-#endif
-#ifndef __NR_bpf
-#define __NR_bpf 321
-#endif
-#ifndef __NR_userfaultfd
-#define __NR_userfaultfd 323
-#endif
-#ifndef __NR_membarrier
-#define __NR_membarrier 324
-#endif
-#ifndef __NR_mlock2
-#define __NR_mlock2 325
-#endif
+call_t syscalls[] = {
+{{range $c := $.Syscalls}}
+ {"{{$c.Name}}", __NR_{{$c.CallName}}},{{end}}
+};
+`))
-#define __NR_syz_openpts 1000001
-#define __NR_syz_dri_open 1000002
-#define __NR_syz_fuse_mount 1000003
-#define __NR_syz_fuseblk_mount 1000004
+type TemplData struct {
+ Syscalls []SyscallData
+ Defines []DefineData
+}
-call_t syscalls[] = {
-`)
+type SyscallData struct {
+ Name string
+ CallName string
+}
+
+type DefineData struct {
+ Name string
+ Val int
+}
+
+func generateHeader(syscalls []Syscall, out io.Writer) {
+ var data TemplData
+ present := make(map[string]bool)
for _, s := range syscalls {
- fmt.Fprintf(out, "\t{\"%v\", __NR_%v},\n", s.Name, s.CallName)
+ data.Syscalls = append(data.Syscalls, SyscallData{Name: s.Name, CallName: s.CallName})
+ if !present[s.CallName] {
+ present[s.CallName] = true
+ nr, ok := NewSyscalls[s.CallName]
+ if !ok {
+ nr = -1
+ }
+ data.Defines = append(data.Defines, DefineData{Name: s.CallName, Val: nr})
+ }
+ }
+
+ if err := syscallsTempl.Execute(out, data); err != nil {
+ panic(err)
}
- fmt.Fprintf(out, "};\n")
}
func compileFlags(includes []string, defines map[string]string, flags map[string][]string) (map[string][]string, map[string]string) {