aboutsummaryrefslogtreecommitdiffstats
path: root/sys/generated/generated.go
diff options
context:
space:
mode:
Diffstat (limited to 'sys/generated/generated.go')
-rw-r--r--sys/generated/generated.go105
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{})
+}