diff options
Diffstat (limited to 'sys/generated/generated.go')
| -rw-r--r-- | sys/generated/generated.go | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/sys/generated/generated.go b/sys/generated/generated.go new file mode 100644 index 000000000..320902931 --- /dev/null +++ b/sys/generated/generated.go @@ -0,0 +1,105 @@ +// Copyright 2025 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package generated + +import ( + "bytes" + "compress/flate" + "embed" + "encoding/gob" + "fmt" + "path/filepath" + + "github.com/google/syzkaller/prog" + "github.com/google/syzkaller/sys/targets" +) + +type Desc struct { + Syscalls []*prog.Syscall + Resources []*prog.ResourceDesc + Consts []prog.ConstValue + Flags []prog.FlagDesc + Types []prog.Type +} + +func Register(os, arch, revision string, init func(*prog.Target), files embed.FS) { + sysTarget := targets.Get(os, arch) + target := &prog.Target{ + OS: os, + Arch: arch, + Revision: revision, + PtrSize: sysTarget.PtrSize, + PageSize: sysTarget.PageSize, + NumPages: sysTarget.NumPages, + DataOffset: sysTarget.DataOffset, + BigEndian: sysTarget.BigEndian, + } + filler := func(target *prog.Target) { + fill(target, files) + } + prog.RegisterTarget(target, filler, init) +} + +func fill(target *prog.Target, files embed.FS) { + data, err := files.ReadFile(FileName(target.OS, target.Arch)) + if err != nil { + panic(err) + } + desc := new(Desc) + if err := gob.NewDecoder(flate.NewReader(bytes.NewReader(data))).Decode(desc); err != nil { + panic(err) + } + target.Syscalls = desc.Syscalls + target.Resources = desc.Resources + target.Consts = desc.Consts + target.Flags = desc.Flags + target.Types = desc.Types +} + +func Serialize(desc *Desc) ([]byte, error) { + out := new(bytes.Buffer) + compressor, err := flate.NewWriter(out, flate.DefaultCompression) + if err != nil { + return nil, err + } + enc := gob.NewEncoder(compressor) + if err := enc.Encode(desc); err != nil { + return nil, err + } + if err := compressor.Close(); err != nil { + return nil, err + } + return out.Bytes(), nil +} + +func FileName(os, arch string) string { + return fileName(fmt.Sprintf("%v_%v", os, arch)) +} + +func Glob() string { + return fileName("*") +} + +func fileName(name string) string { + return filepath.Join("gen", fmt.Sprintf("%v.gob.flate", name)) +} + +func init() { + gob.Register(prog.Ref(0)) + gob.Register(&prog.ResourceType{}) + gob.Register(&prog.ConstType{}) + gob.Register(&prog.IntType{}) + gob.Register(&prog.FlagsType{}) + gob.Register(&prog.LenType{}) + gob.Register(&prog.ProcType{}) + gob.Register(&prog.CsumType{}) + gob.Register(&prog.VmaType{}) + gob.Register(&prog.BufferType{}) + gob.Register(&prog.ArrayType{}) + gob.Register(&prog.PtrType{}) + gob.Register(&prog.StructType{}) + gob.Register(&prog.UnionType{}) + gob.Register(&prog.BinaryExpression{}) + gob.Register(&prog.Value{}) +} |
