aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorent Revest <revest@chromium.org>2023-07-05 14:26:23 +0200
committerAleksandr Nogikh <nogikh@google.com>2024-02-01 10:12:21 +0000
commitc40f278e4d854c3b6341ec272dd3eb9b84fcff54 (patch)
tree0bc92397d6480c0f5d15e60f6e861adc3cea7019
parent818c77dd7818d3c56513a0ef417fd61bb8bb5927 (diff)
sys/syz-sysgen: save flags's possible values
This extends Target to contain a map of possible values for each int flag.
-rw-r--r--prog/target.go7
-rw-r--r--prog/types.go5
-rw-r--r--sys/syz-sysgen/sysgen.go28
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})