| // 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{}) |
| } |