diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2024-12-02 10:57:36 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2024-12-11 15:22:17 +0000 |
| commit | c756ba4e975097bf74b952367e2cd1a8db466c69 (patch) | |
| tree | 7cf501f6dec263b38066b485c118e4cb372d3625 /pkg | |
| parent | 13dbd03bf7ca0a245cfdfd2d8c8b73e486bbaa7b (diff) | |
tools/syz-declextract: extract file_operations descriptions
Extend the clang tool to locate file_operations variables and arrays
and dump open/read/write/mmap/ioctl callbacks for each.
It also tries to extract set of ioctl commands and argument types
for them in a simple best-effort way (for now). It just locates switch
in the ioctl callback and extracts each case as a command.
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/declextract/entity.go | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/pkg/declextract/entity.go b/pkg/declextract/entity.go index 6e9ddac85..5b7fe8813 100644 --- a/pkg/declextract/entity.go +++ b/pkg/declextract/entity.go @@ -15,6 +15,7 @@ type Output struct { Enums []*Enum `json:"enums,omitempty"` Structs []*Struct `json:"structs,omitempty"` Syscalls []*Syscall `json:"syscalls,omitempty"` + FileOps []*FileOps `json:"file_ops,omitempty"` IouringOps []*IouringOp `json:"iouring_ops,omitempty"` NetlinkFamilies []*NetlinkFamily `json:"netlink_families,omitempty"` NetlinkPolicies []*NetlinkPolicy `json:"netlink_policies,omitempty"` @@ -41,6 +42,25 @@ type Syscall struct { SourceFile string `json:"source_file,omitempty"` } +// FileOps describes one file_operations variable. +type FileOps struct { + Name string `json:"name,omitempty"` + // Names of callback functions. + Open string `json:"open,omitempty"` + Read string `json:"read,omitempty"` + Write string `json:"write,omitempty"` + Mmap string `json:"mmap,omitempty"` + Ioctl string `json:"ioctl,omitempty"` + IoctlCmds []*IoctlCmd `json:"ioctl_cmds,omitempty"` + SourceFile string `json:"source_file,omitempty"` +} + +type IoctlCmd struct { + // Literal name of the command (e.g. KCOV_REMOTE_ENABLE). + Name string `json:"name,omitempty"` + Type *Type `json:"type,omitempty"` +} + type IouringOp struct { Name string `json:"name,omitempty"` Func string `json:"func,omitempty"` @@ -97,6 +117,9 @@ type Type struct { type IntType struct { ByteSize int `json:"byte_size,omitempty"` + MinValue int `json:"min_value,omitempty"` + MaxValue int `json:"max_value,omitempty"` + IsConst bool `json:"is_const,omitempty"` Name string `json:"name,omitempty"` Base string `json:"base,omitempty"` Enum string `json:"enum,omitempty"` @@ -128,6 +151,7 @@ func (out *Output) Merge(other *Output) { out.Enums = append(out.Enums, other.Enums...) out.Structs = append(out.Structs, other.Structs...) out.Syscalls = append(out.Syscalls, other.Syscalls...) + out.FileOps = append(out.FileOps, other.FileOps...) out.IouringOps = append(out.IouringOps, other.IouringOps...) out.NetlinkFamilies = append(out.NetlinkFamilies, other.NetlinkFamilies...) out.NetlinkPolicies = append(out.NetlinkPolicies, other.NetlinkPolicies...) @@ -139,6 +163,7 @@ func (out *Output) SortAndDedup() { out.Enums = sortAndDedupSlice(out.Enums) out.Structs = sortAndDedupSlice(out.Structs) out.Syscalls = sortAndDedupSlice(out.Syscalls) + out.FileOps = sortAndDedupSlice(out.FileOps) out.IouringOps = sortAndDedupSlice(out.IouringOps) out.NetlinkFamilies = sortAndDedupSlice(out.NetlinkFamilies) out.NetlinkPolicies = sortAndDedupSlice(out.NetlinkPolicies) @@ -150,6 +175,9 @@ func (out *Output) SetSourceFile(file string) { for _, call := range out.Syscalls { call.SourceFile = file } + for _, fops := range out.FileOps { + fops.SourceFile = file + } for _, fam := range out.NetlinkFamilies { fam.SourceFile = file } |
