From b4e2d91732f95688f492679496dc98ded41f97f8 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Wed, 23 Dec 2015 19:04:23 +0100 Subject: sys: expose new syscall numbers programmatically This will be required for reproduction tool. --- sysgen/sysgen.go | 96 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 67 insertions(+), 29 deletions(-) (limited to 'sysgen') 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) { -- cgit mrf-deployment