From c40f278e4d854c3b6341ec272dd3eb9b84fcff54 Mon Sep 17 00:00:00 2001 From: Florent Revest Date: Wed, 5 Jul 2023 14:26:23 +0200 Subject: sys/syz-sysgen: save flags's possible values This extends Target to contain a map of possible values for each int flag. --- prog/target.go | 7 +++++++ prog/types.go | 5 +++++ sys/syz-sysgen/sysgen.go | 28 +++++++++++++++++++++++----- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/prog/target.go b/prog/target.go index 2889b8bf0..be2db51c5 100644 --- a/prog/target.go +++ b/prog/target.go @@ -26,6 +26,7 @@ type Target struct { Syscalls []*Syscall Resources []*ResourceDesc Consts []ConstValue + Flags []FlagDesc // MakeDataMmap creates calls that mmaps target data memory range. MakeDataMmap func() []*Call @@ -63,6 +64,7 @@ type Target struct { // Filled by prog package: SyscallMap map[string]*Syscall ConstMap map[string]uint64 + FlagsMap map[string][]string init sync.Once initArch func(target *Target) @@ -167,6 +169,11 @@ func (target *Target) initTarget() { target.SyscallMap[c.Name] = c } + target.FlagsMap = make(map[string][]string) + for _, c := range target.Flags { + target.FlagsMap[c.Name] = c.Values + } + target.populateResourceCtors() target.resourceCtors = make(map[string][]ResourceCtor) for _, res := range target.Resources { diff --git a/prog/types.go b/prog/types.go index 51f5e0cbe..ce02d2d21 100644 --- a/prog/types.go +++ b/prog/types.go @@ -241,6 +241,11 @@ func (t *TypeCommon) Alignment() uint64 { return t.TypeAlign } +type FlagDesc struct { + Name string + Values []string +} + type ResourceDesc struct { Name string Kind []string diff --git a/sys/syz-sysgen/sysgen.go b/sys/syz-sysgen/sysgen.go index 2ab6cdbab..313cb60d8 100644 --- a/sys/syz-sysgen/sysgen.go +++ b/sys/syz-sysgen/sysgen.go @@ -179,6 +179,19 @@ type Job struct { } func processJob(job *Job, descriptions *ast.Description, constFile *compiler.ConstFile) { + var flags []prog.FlagDesc + for _, decl := range descriptions.Nodes { + switch n := decl.(type) { + case *ast.IntFlags: + var flag prog.FlagDesc + flag.Name = n.Name.Name + for _, val := range n.Values { + flag.Values = append(flag.Values, val.Ident) + } + flags = append(flags, flag) + } + } + eh := func(pos ast.Pos, msg string) { job.Errors = append(job.Errors, fmt.Sprintf("%v: %v\n", pos, msg)) } @@ -193,7 +206,7 @@ func processJob(job *Job, descriptions *ast.Description, constFile *compiler.Con sysFile := filepath.Join(*outDir, "sys", job.Target.OS, "gen", job.Target.Arch+".go") out := new(bytes.Buffer) - generate(job.Target, prog, consts, out) + generate(job.Target, prog, consts, flags, out) rev := hash.String(out.Bytes()) fmt.Fprintf(out, "const revision_%v = %q\n", job.Target.Arch, rev) writeSource(sysFile, out.Bytes()) @@ -210,7 +223,8 @@ func processJob(job *Job, descriptions *ast.Description, constFile *compiler.Con job.OK = len(job.Errors) == 0 } -func generate(target *targets.Target, prg *compiler.Prog, consts map[string]uint64, out io.Writer) { +func generate(target *targets.Target, prg *compiler.Prog, consts map[string]uint64, flags []prog.FlagDesc, + out io.Writer) { tag := fmt.Sprintf("syz_target,syz_os_%v,syz_arch_%v", target.OS, target.Arch) if target.VMArch != "" { tag += fmt.Sprintf(" syz_target,syz_os_%v,syz_arch_%v", target.OS, target.VMArch) @@ -226,11 +240,11 @@ func generate(target *targets.Target, prg *compiler.Prog, consts map[string]uint fmt.Fprintf(out, "\tRegisterTarget(&Target{"+ "OS: %q, Arch: %q, Revision: revision_%v, PtrSize: %v, PageSize: %v, "+ "NumPages: %v, DataOffset: %v, LittleEndian: %v, ExecutorUsesShmem: %v, "+ - "Syscalls: syscalls_%v, Resources: resources_%v, Consts: consts_%v}, "+ - "types_%v, InitTarget)\n}\n\n", + "Syscalls: syscalls_%v, Resources: resources_%v, Consts: consts_%v,"+ + "Flags: flags_%v}, types_%v, InitTarget)\n}\n\n", target.OS, target.Arch, target.Arch, target.PtrSize, target.PageSize, target.NumPages, target.DataOffset, target.LittleEndian, target.ExecutorUsesShmem, - target.Arch, target.Arch, target.Arch, target.Arch) + target.Arch, target.Arch, target.Arch, target.Arch, target.Arch) fmt.Fprintf(out, "var resources_%v = ", target.Arch) serializer.Write(out, prg.Resources) @@ -244,6 +258,10 @@ func generate(target *targets.Target, prg *compiler.Prog, consts map[string]uint serializer.Write(out, prg.Types) fmt.Fprintf(out, "\n\n") + fmt.Fprintf(out, "var flags_%v = ", target.Arch) + serializer.Write(out, flags) + fmt.Fprintf(out, "\n\n") + constArr := make([]prog.ConstValue, 0, len(consts)) for name, val := range consts { constArr = append(constArr, prog.ConstValue{Name: name, Value: val}) -- cgit mrf-deployment