aboutsummaryrefslogtreecommitdiffstats
path: root/sys/syz-sysgen
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2022-01-12 12:49:48 +0000
committerAleksandr Nogikh <wp32pw@gmail.com>2022-01-13 17:03:14 +0100
commita1cd6a69c49732b1b24bad2fab34857aaa399a60 (patch)
treefb7c61d5dde3047a1ba83eac88997bb68385051a /sys/syz-sysgen
parent44d1319aab39b23be41fbf75d9d37ef9aaa665f2 (diff)
sys/syz-sysgen: generate possibly missing __NR/SYS defines
As the comiling machine may have a kernel version different from the tested one, not all definitions might be present. Generate sequences of ifndef in defs.h to avoid potential issues. Restrict __NR-related style checking rules to only checking common*.h files.
Diffstat (limited to 'sys/syz-sysgen')
-rw-r--r--sys/syz-sysgen/sysgen.go25
1 files changed, 25 insertions, 0 deletions
diff --git a/sys/syz-sysgen/sysgen.go b/sys/syz-sysgen/sysgen.go
index 4099bfb51..9ebaac382 100644
--- a/sys/syz-sysgen/sysgen.go
+++ b/sys/syz-sysgen/sysgen.go
@@ -35,6 +35,11 @@ type SyscallData struct {
Attrs []uint64
}
+type Define struct {
+ Name string
+ Value string
+}
+
type ArchData struct {
Revision string
ForkServer int
@@ -44,6 +49,7 @@ type ArchData struct {
NumPages uint64
DataOffset uint64
Calls []SyscallData
+ Defines []Define
}
type OSData struct {
@@ -277,6 +283,7 @@ func generateExecutorSyscalls(target *targets.Target, syscalls []*prog.Syscall,
if target.ExecutorUsesShmem {
data.Shmem = 1
}
+ defines := make(map[string]string)
for _, c := range syscalls {
var attrVals []uint64
attrs := reflect.ValueOf(c.Attrs)
@@ -300,10 +307,25 @@ func generateExecutorSyscalls(target *targets.Target, syscalls []*prog.Syscall,
}
}
data.Calls = append(data.Calls, newSyscallData(target, c, attrVals[:last+1]))
+ // Some syscalls might not be present on the compiling machine, so we
+ // generate definitions for them.
+ if target.SyscallNumbers && !strings.HasPrefix(c.CallName, "syz_") &&
+ target.NeedSyscallDefine(c.NR) {
+ defines[target.SyscallPrefix+c.CallName] = fmt.Sprintf("%d", c.NR)
+ }
}
sort.Slice(data.Calls, func(i, j int) bool {
return data.Calls[i].Name < data.Calls[j].Name
})
+ // Get a sorted list of definitions.
+ defineNames := []string{}
+ for key := range defines {
+ defineNames = append(defineNames, key)
+ }
+ sort.Strings(defineNames)
+ for _, key := range defineNames {
+ data.Defines = append(data.Defines, Define{key, defines[key]})
+ }
return data
}
@@ -380,7 +402,10 @@ struct call_props_t { {{range $attr := $.CallProps}}
#define SYZ_PAGE_SIZE {{.PageSize}}
#define SYZ_NUM_PAGES {{.NumPages}}
#define SYZ_DATA_OFFSET {{.DataOffset}}
+{{range $c := $arch.Defines}}#ifndef {{$c.Name}}
+#define {{$c.Name}} {{$c.Value}}
#endif
+{{end}}#endif
{{end}}
#endif
{{end}}