diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2022-01-12 12:49:48 +0000 |
|---|---|---|
| committer | Aleksandr Nogikh <wp32pw@gmail.com> | 2022-01-13 17:03:14 +0100 |
| commit | a1cd6a69c49732b1b24bad2fab34857aaa399a60 (patch) | |
| tree | fb7c61d5dde3047a1ba83eac88997bb68385051a /sys/syz-sysgen | |
| parent | 44d1319aab39b23be41fbf75d9d37ef9aaa665f2 (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.go | 25 |
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}} |
